diff --git a/.gitignore b/.gitignore index 3504937c..5bcdd98b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ dist/ !.env.example .playwright-cli/ +.idea/ .impeccable/ .codex-temp/ .codex-tmp/ diff --git a/AGENTS.md b/AGENTS.md index ef295bde..876c3a21 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -42,15 +42,16 @@ | 供应商、国内整柜 | `modules/suppliers/`、`modules/domestic-containers/` | Backend `warehouse/` 及对应 OpenAPI | | 平台仓库与仓储资源 | 仓库主档 `modules/warehouses/`,国内资源 `modules/warehouse-resources/` | 全部仓库 ID、类型、状态、地址和能力归国内 `warehouse/`;海外 `warehouse-overseas-service/` 只维护引用同一 warehouseId 的库位、托盘和锁 | | 平台用户、RBAC、导航 | `modules/iam/`、`core/access/`、`core/navigation/` | `auth/`、`iam/`、平台权限契约 | -| 海外 PDA 拣货员与实际收货仓绑定 | `modules/iam/pages/InternalUsersView.vue`、`modules/iam/api/platformIam.ts` | `WAREHOUSE_PICKER` 必须且只能绑定一个 `overseasWarehouseId`;候选来自国内 Warehouse 平台仓库 API 的公共 `OVERSEAS + ACTIVE + RECEIVING` 收货仓,服务端约束在 `iam/`,Claim 与实时校验联查 `common-security/`、`lastleg-service/security/` | +| 国内/海外 PDA 独立人员与海外仓绑定 | `modules/iam/pages/InternalUsersView.vue`、`modules/iam/api/platformIam.ts` | 国内 `CN_FIRSTLEG_PDA_OPERATOR` 与海外 `OVERSEAS_WAREHOUSE_PDA_OPERATOR` 互斥;只有海外角色必须且只能绑定一个 `overseasWarehouseId`,候选来自国内 Warehouse 平台仓库 API 的公共 `OVERSEAS + ACTIVE + RECEIVING` 收货仓 | | 消息中心 | `modules/notifications/` | Backend `iam/.../notification/`;仅顶部消息中心,不进入左侧菜单 | | 订单列表、详情、商品图片与入库费用 | `modules/unified-orders/`、`modules/first-leg-orders/`;平台商品图片由 `modules/unified-orders/api/unifiedOrders.ts` 按客户与 fileId 下载 | `order/`、`firstleg/`、Finance;图片读取归 `file/` 的 `PlatformProductImageController` | | 入库、测量与计价主数据 | `modules/inbounds/`、`modules/fba-pricing/`、`modules/dimension-config/`、`modules/fee-items/` | `firstleg/`、`order/`、`file/`、`integration-service/` | | 财务 | `modules/finance/`,继续读该目录 `AGENTS.md` | `finance/`、`firstleg/`、`file/`、`docs/财务管理/` | -| 货柜、排柜与装柜清单 | `modules/container-loading/`、`modules/loading-lists/`;详情 `pages/ContainerDetailView.vue`,资料/PDA 证据 `components/ContainerOverviewPanel.vue` | 详情承载四类当前资料、PDA 证据、异常历史与整柜国内出仓门禁;Backend `firstleg/loading/`、`firstleg/split/`、`outbound/dispatch/`、`warehouse/`、`file/` | +| 货柜、排柜、预装/装柜清单与整柜报关 | `modules/container-loading/`、`modules/loading-lists/`;预装详情 `pages/PreloadPlanDetailView.vue`,货柜详情 `pages/ContainerDetailView.vue`,资料/PDA 证据 `components/ContainerOverviewPanel.vue`,报关 `components/ContainerCustomsPanel.vue`、`api/platformContainerCustoms.ts` | 预装详情先调用 `/loading-plans/{planId}/lifecycle`,`COMPLETED` 时替换为正式装柜清单详情并关闭旧工作台标签,不按 A0404 或错误文案猜阶段。整柜报关按 `loadingPlanId` 展示,逐资料完成,全买单柜使用 `complete-all-buy`;Backend `LoadingListService`、`loading-lists-v1.yaml`、`firstleg/customs/container/`,文件归 `file/` | +| 合柜报关 / 同柜不可拆组 | `modules/unified-orders/api/coLoadGroups.ts`、`pages/UnifiedOrdersView.vue`;装柜消费 `modules/container-loading/pages/SmartLoadingWorkbenchView.vue` | 前端只提交订单 ID;Backend `firstleg/loading/coload/` 展开并冻结每票全部可用入仓片段。成员数是入仓片段数,不等于订单票数;只要求同国内仓、同渠道,允许跨客户及不同目的仓港;分配、移除、取消均整组处理 | | 智能装柜按入仓码候选与箱数分配 | `modules/container-loading/pages/SmartLoadingWorkbenchView.vue`、`api/platformContainerLoading.ts` | Backend `firstleg/` 的 `PlatformSmartLoadingController`、`SmartLoadingService`;`GlobalSmartLoadingView.vue` 当前未注册路由,不作为正式入口 | | 三期订舱、关联候选与出仓前船期 | `modules/ocean-bookings/`、`modules/container-loading/`、`modules/port-schedules/` | `platformOceanBookings.ts` 的 `/link-candidates` 只消费服务端分页;列表 `containerCount` 是柜型需求 `quantity` 总和,不是已关联柜数;Backend `firstleg/oceanbooking/`、`firstleg/portschedule/`,出仓后节点归四期 | -| 拖车、报关、国内出仓 | `modules/trucking/`、`modules/customs/`、`modules/outbound-dispatch/` | `firstleg/outbound/dispatch/`、`firstleg/customs/`、`file/` | +| 拖车、历史报关协同、国内出仓 | `modules/trucking/`、`modules/customs/`、`modules/outbound-dispatch/` | `modules/customs/` 是报关案件/清单/代理提交与回执入口;装柜完成后的整柜退税/买单资料改从货柜详情进入,不得在旧模块复制一套;Backend `firstleg/outbound/dispatch/`、`firstleg/customs/`、`file/` | | 主数据、下载、审计 | `modules/master-data/`、`modules/downloads/`、`modules/audit/` | `warehouse/`、`file/`、`audit-service/` | | 四期海外接柜、入库与库存 | `modules/overseas-warehouse/` | `gateway-overseas/`、`lastleg-service/`、`warehouse-overseas-service/`;不含出库和派送 | | 四期海外采购、卡车、散板 | `modules/overseas-business/` | `gateway-overseas/`、`lastleg-service/` | @@ -63,7 +64,7 @@ | 关键词 | 页面/路由入口 | API 与联查 | |---|---|---| -| 尾程订单 | `modules/overseas-warehouse/pages/LastMileOrdersView.vue`、`LastMileOrderDetailView.vue` | `modules/overseas-warehouse/api/lastMileOrders.ts`;Backend `lastleg-service/` | +| 尾程订单与柜级入仓计划进度 | `modules/overseas-warehouse/pages/LastMileOrdersView.vue`、`LastMileOrderDetailView.vue` | 按 `sourceContainerBookingId` 消费 `/orders/container-summaries` 的 `allPlansReady`、计划统计与冻结 `plannedArrivalAt`,详情由服务端返回全柜订单且不受列表分页截断;不得在浏览器拼柜或自行推导就绪。整柜生成调用 `/inbound-plans/convert-container`,每票返回独立计划且整批原子;转仓候选只取 `modules/iam/api/platformIam.ts` 的平台公共 `ACTIVE + FBA` 仓主档,并提交 ID/编码/名称快照。业务 API `modules/overseas-warehouse/api/lastMileOrders.ts`,Backend `lastleg-service/` | | 入仓单、入仓计划、FBA 预约 | `modules/overseas-warehouse/pages/InboundOrdersView.vue`、`InboundOrderDetailView.vue` | 列表/预约 `modules/overseas-warehouse/api/inboundOrders.ts`,计划列表/详情 `inboundPlans.ts`;Backend `lastleg-service/inboundplan/` | | 排车查询与智能预排 | `modules/overseas-warehouse/pages/DispatchesView.vue`、`DispatchDetailView.vue`、`components/SmartDispatchDialog.vue` | `modules/overseas-warehouse/api/dispatches.ts`;Backend `lastleg-service/dispatch/`;覆盖详情、候选、草稿柜、托盘即时锁/解锁/整草稿释放和 `pre-arrange`,不据此开放出库编辑、取消、发车、PDA 出库或派送 | | 海外出库、派送、异常与回访(范围外现存代码) | `pages/OutboundsView.vue`、`DeliveryOrdersView.vue`、`DeliveryOrderDetailView.vue`、`ExceptionOrdersView.vue`、`CustomerVisitsView.vue` 及对应 `api/outbounds.ts`、`deliveryOrders.ts`、`exceptionOrders.ts`、`customerVisits.ts`;当前路由和导航已有注册 | 当前四期契约仍排除海外仓出库、派送及其派生运营页面;不得因代码、菜单、权限或 API 存在而纳入正式范围、验收或继续扩展,只有用户当前明确确认新范围后才能启用其业务语义 | @@ -79,7 +80,7 @@ - 当前只有平台、客户两级;Admin 不显示“租户”。平台仓库是公共主数据,不与客户绑定;客户筛选不得缩小仓库候选。完整语义见平台客户层级与权限契约。 - 菜单、列表路由和详情只读统一使用 `*:list`,写操作使用独立权限;前端守卫不能替代服务端鉴权。供应商固定使用 `platform:supplier:list`。 -- 平台用户选择 `WAREHOUSE_PICKER` 时必须选择唯一实际海外收货仓,其他角色不得提交 `overseasWarehouseId`;编辑时保留已绑定仓库并按字符串透传长整型 ID,前端校验不能替代 IAM 服务端约束。 +- 平台用户选择 `OVERSEAS_WAREHOUSE_PDA_OPERATOR` 时必须选择唯一实际海外收货仓,其他角色不得提交 `overseasWarehouseId`;编辑时保留已绑定仓库并按字符串透传长整型 ID,前端校验不能替代 IAM 服务端约束。 - 国内出仓以真实货柜为原子边界:货柜详情只在装柜完成、全部入仓绑定门禁通过且有写权限时显示确认离仓;成功后由服务端同事务推进全部技术行并幂等创建船节点查询。前端不得逐入仓确认、把拖车状态当阻断门禁或重复追加实际船节点。 - `core/navigation/adminNavigation.ts`、`app/router/index.ts` 和模块 `routes.ts` 是共享装配文件;并行任务不得覆盖总控已确认语义,重叠时保留现有改动并回传总控。 - `core/routing/navigationRecovery.ts` 只处理已识别的动态 import/Chunk 资源过期;普通路由错误直接提示。自动恢复前保护未保存表单,同一目标 30 秒内不得重复刷新或形成重载循环。 diff --git a/Jenkinsfile b/Jenkinsfile index c80b947f..9a398fc0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -70,7 +70,7 @@ pipeline { docker build \ --build-arg NODE_IMAGE="$NODE_BASE_IMAGE" \ --build-arg NGINX_IMAGE="$NGINX_BASE_IMAGE" \ - --build-arg VITE_CLIENT_WEB_URL=http://8.163.49.32:9002 \ + --build-arg VITE_CLIENT_WEB_URL="${CLIENT_WEB_URL:-https://dev-app.buggoglobal.com/}" \ -t "$image" . export IMAGE_TAG="$SOURCE_TAG" docker compose -p "$DEVELOPMENT_COMPOSE_PROJECT" -f "$DEVELOPMENT_COMPOSE_FILE" up -d --remove-orphans --pull never diff --git a/README.md b/README.md index 0e8eca94..3cb6f085 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ VITE_CLIENT_WEB_URL=http://localhost:5174 切换开发或测试环境时,只修改未提交的 `.env.local` 中 `API_PROXY_TARGET`、`OVERSEAS_API_PROXY_TARGET` 和 `VITE_CLIENT_WEB_URL`,然后重启 `pnpm dev`;无需修改业务代码。真实环境地址不写入受版本控制的配置模板或说明。 -客户代登录打开的工作台地址是运行时配置,不需要为每个环境重新构建镜像。Docker 部署时设置容器环境变量 `CLIENT_WEB_URL`;容器启动时会生成 `/runtime-config.js`。本地 Vite 开发使用 `VITE_CLIENT_WEB_URL` 作为兜底。 +客户代登录打开的工作台地址是运行时配置,不需要为每个环境重新构建镜像。Docker 部署时为 Admin 容器设置当前环境的 `CLIENT_WEB_URL`;容器启动时会生成 `/runtime-config.js`。开发、测试和生产分别在各自部署任务中注入自己的 Client 根地址,禁止复用其他环境的域名。本地 Vite 开发使用 `VITE_CLIENT_WEB_URL` 作为兜底。部署后可读取 `/runtime-config.js` 核对最终生效值。 认证请求使用 `/api/auth/**`,平台 IAM 请求使用 `/api/platform/v1/iam/**`。登录后只从 JWT 读取平台身份,菜单和操作权限通过当前用户授权接口实时加载,不从 JWT 携带或解析角色权限。企业审核调用 `/reviews`,打开审核详情后按租户调用 `/tenants/{tenantId}/qualifications`;营业执照通过 `/api/platform/v1/files/qualifications/{tenantId}/{fileName}` 携带平台 Token 临时读取,关闭预览后释放本地对象地址。客户端自主注册企业审核通过后继续使用注册账号作为管理员,不展示新凭据;Admin 代建企业并由后端创建管理员时,页面必须展示不可通过遮罩、Esc 或关闭按钮跳过的一次性凭据弹窗,运营人员确认保存后才清除账号密码。平台角色查询、新增、编辑、启停、删除和权限全量保存均已按 `RbacController` 接入真实 `/roles` 契约,角色返回的 `permissionIds` 用于授权回显;系统内置角色及仍被成员使用的角色继续由服务端保护。权限资源查询和新增调用 `/permissions`,尚未提供的权限编辑、删除和启停不会模拟成功。一期真实权限资源只创建 `MENU` 与 `BUTTON`,不创建 `PAGE` 或 `API` 类型。其余业务页面需在对应服务契约确认后逐项替换,生产逻辑不得静默回退到模拟数据。 diff --git a/docker-compose.development.yml b/docker-compose.development.yml index f39efb2b..a677b495 100644 --- a/docker-compose.development.yml +++ b/docker-compose.development.yml @@ -6,7 +6,7 @@ services: ports: - "127.0.0.1:9001:80" environment: - CLIENT_WEB_URL: "http://8.163.49.32:9002" + CLIENT_WEB_URL: "${CLIENT_WEB_URL:-https://dev-app.buggoglobal.com/}" API_UPSTREAM: "http://firstleg-development-gateway:9000" OVERSEAS_API_UPSTREAM: "http://firstleg-development-gateway-overseas:9300" networks: diff --git a/docker-compose.test.yml b/docker-compose.test.yml index c76791f1..f522117c 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -11,12 +11,9 @@ services: restart: unless-stopped ports: - "${HOST_PORT:-9001}:80" - extra_hosts: - - "host.docker.internal:host-gateway" environment: - CLIENT_WEB_URL: "${CLIENT_WEB_URL:-http://8.163.30.128:9002}" - # Gateway 与前端容器在同一台测试服务器,通过宿主机内部地址访问。 - # 测试环境固定走 Docker 宿主机网关,避免 Jenkins 全局环境变量或 - # 工作区残留配置把上游覆盖成公网 IP,造成容器回连公网端口失败。 - API_UPSTREAM: "http://host.docker.internal:9000" - OVERSEAS_API_UPSTREAM: "http://host.docker.internal:9300" + # Runtime URL used by the secure customer-workbench handoff. Each + # environment may override it without rebuilding the Admin image. + CLIENT_WEB_URL: "${CLIENT_WEB_URL:-https://test-app.buggoglobal.com/}" + API_UPSTREAM: "http://test-api-cn.buggoglobal.com" + OVERSEAS_API_UPSTREAM: "http://test-api-global.buggoglobal.com" diff --git a/nginx/default.conf.template b/nginx/default.conf.template index 3ec922ae..3688b5f7 100644 --- a/nginx/default.conf.template +++ b/nginx/default.conf.template @@ -21,10 +21,10 @@ server { # 前端代码中的 API 前缀为 /api;保持原始路径转给 Gateway。 location /api/ { - client_max_body_size 12m; + client_max_body_size 55m; proxy_pass ${API_UPSTREAM}; proxy_http_version 1.1; - proxy_set_header Host $host; + proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; @@ -32,11 +32,11 @@ server { # 海外业务使用独立 Gateway;将浏览器前缀改写为 Gateway 的 /api 前缀。 location /overseas-api/ { - client_max_body_size 12m; + client_max_body_size 55m; rewrite ^/overseas-api/(.*)$ /api/$1 break; proxy_pass ${OVERSEAS_API_UPSTREAM}; proxy_http_version 1.1; - proxy_set_header Host $host; + proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; diff --git a/node_modules.corrupt/.bin/tsc b/node_modules.corrupt/.bin/tsc deleted file mode 100644 index 2184a0ac..00000000 --- a/node_modules.corrupt/.bin/tsc +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") -basedir_win="$basedir" -exe="" -msys="" - -case `uname -a` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir_win=`cygpath -w "$basedir"` - fi - exe=".exe" - msys="true" - ;; - *WSL2*) - if command -v wslpath > /dev/null 2>&1; then - basedir_win="$(wslpath -w "$basedir" 2> /dev/null)" - if [ $? -ne 0 ] || [ -z "$basedir_win" ]; then - basedir_win="$basedir" - else - exe=".exe" - fi - fi - ;; -esac - -if [ -z "$NODE_PATH" ]; then - export NODE_PATH="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/typescript@5.9.3/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules" -else - export NODE_PATH="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/typescript@5.9.3/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules:$NODE_PATH" -fi -if [ -n "$exe" ] && [ -x "$basedir/node.exe" ]; then - exec "$basedir/node.exe" "$basedir_win/../typescript/bin/tsc" "$@" -elif [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@" -elif command -v node >/dev/null 2>&1; then - exec node "$basedir/../typescript/bin/tsc" "$@" -elif [ -n "$exe" ] && command -v node.exe >/dev/null 2>&1; then - exec node.exe "$basedir_win/../typescript/bin/tsc" "$@" -else - exec node "$basedir/../typescript/bin/tsc" "$@" -fi -# cmd-shim-target=C:/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/typescript/bin/tsc diff --git a/node_modules.corrupt/.bin/tsc.CMD b/node_modules.corrupt/.bin/tsc.CMD deleted file mode 100644 index b75c712e..00000000 --- a/node_modules.corrupt/.bin/tsc.CMD +++ /dev/null @@ -1,12 +0,0 @@ -@SETLOCAL -@IF NOT DEFINED NODE_PATH ( - @SET "NODE_PATH=C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\typescript@5.9.3\node_modules\typescript\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\typescript@5.9.3\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules" -) ELSE ( - @SET "NODE_PATH=C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\typescript@5.9.3\node_modules\typescript\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\typescript@5.9.3\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules;%NODE_PATH%" -) -@IF EXIST "%~dp0\node.exe" ( - "%~dp0\node.exe" "%~dp0\..\typescript\bin\tsc" %* -) ELSE ( - @SET PATHEXT=%PATHEXT:;.JS;=;% - node "%~dp0\..\typescript\bin\tsc" %* -) diff --git a/node_modules.corrupt/.bin/tsc.ps1 b/node_modules.corrupt/.bin/tsc.ps1 deleted file mode 100644 index 39ded0f1..00000000 --- a/node_modules.corrupt/.bin/tsc.ps1 +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -$pathsep=":" -$env_node_path=$env:NODE_PATH -$new_node_path="C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\typescript@5.9.3\node_modules\typescript\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\typescript@5.9.3\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" - $pathsep=";" -} else { - $new_node_path="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/typescript@5.9.3/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules" -} -if ([string]::IsNullOrEmpty($env_node_path)) { - $env:NODE_PATH=$new_node_path -} else { - $env:NODE_PATH="$new_node_path$pathsep$env_node_path" -} - -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../typescript/bin/tsc" $args - } else { - & "$basedir/node$exe" "$basedir/../typescript/bin/tsc" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../typescript/bin/tsc" $args - } else { - & "node$exe" "$basedir/../typescript/bin/tsc" $args - } - $ret=$LASTEXITCODE -} -$env:NODE_PATH=$env_node_path -exit $ret diff --git a/node_modules.corrupt/.bin/tsserver b/node_modules.corrupt/.bin/tsserver deleted file mode 100644 index a2267b79..00000000 --- a/node_modules.corrupt/.bin/tsserver +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") -basedir_win="$basedir" -exe="" -msys="" - -case `uname -a` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir_win=`cygpath -w "$basedir"` - fi - exe=".exe" - msys="true" - ;; - *WSL2*) - if command -v wslpath > /dev/null 2>&1; then - basedir_win="$(wslpath -w "$basedir" 2> /dev/null)" - if [ $? -ne 0 ] || [ -z "$basedir_win" ]; then - basedir_win="$basedir" - else - exe=".exe" - fi - fi - ;; -esac - -if [ -z "$NODE_PATH" ]; then - export NODE_PATH="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/typescript@5.9.3/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules" -else - export NODE_PATH="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/typescript@5.9.3/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules:$NODE_PATH" -fi -if [ -n "$exe" ] && [ -x "$basedir/node.exe" ]; then - exec "$basedir/node.exe" "$basedir_win/../typescript/bin/tsserver" "$@" -elif [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@" -elif command -v node >/dev/null 2>&1; then - exec node "$basedir/../typescript/bin/tsserver" "$@" -elif [ -n "$exe" ] && command -v node.exe >/dev/null 2>&1; then - exec node.exe "$basedir_win/../typescript/bin/tsserver" "$@" -else - exec node "$basedir/../typescript/bin/tsserver" "$@" -fi -# cmd-shim-target=C:/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/typescript/bin/tsserver diff --git a/node_modules.corrupt/.bin/tsserver.CMD b/node_modules.corrupt/.bin/tsserver.CMD deleted file mode 100644 index ef44ee18..00000000 --- a/node_modules.corrupt/.bin/tsserver.CMD +++ /dev/null @@ -1,12 +0,0 @@ -@SETLOCAL -@IF NOT DEFINED NODE_PATH ( - @SET "NODE_PATH=C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\typescript@5.9.3\node_modules\typescript\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\typescript@5.9.3\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules" -) ELSE ( - @SET "NODE_PATH=C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\typescript@5.9.3\node_modules\typescript\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\typescript@5.9.3\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules;%NODE_PATH%" -) -@IF EXIST "%~dp0\node.exe" ( - "%~dp0\node.exe" "%~dp0\..\typescript\bin\tsserver" %* -) ELSE ( - @SET PATHEXT=%PATHEXT:;.JS;=;% - node "%~dp0\..\typescript\bin\tsserver" %* -) diff --git a/node_modules.corrupt/.bin/tsserver.ps1 b/node_modules.corrupt/.bin/tsserver.ps1 deleted file mode 100644 index 77b1c9a7..00000000 --- a/node_modules.corrupt/.bin/tsserver.ps1 +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -$pathsep=":" -$env_node_path=$env:NODE_PATH -$new_node_path="C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\typescript@5.9.3\node_modules\typescript\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\typescript@5.9.3\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" - $pathsep=";" -} else { - $new_node_path="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/typescript@5.9.3/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules" -} -if ([string]::IsNullOrEmpty($env_node_path)) { - $env:NODE_PATH=$new_node_path -} else { - $env:NODE_PATH="$new_node_path$pathsep$env_node_path" -} - -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../typescript/bin/tsserver" $args - } else { - & "$basedir/node$exe" "$basedir/../typescript/bin/tsserver" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../typescript/bin/tsserver" $args - } else { - & "node$exe" "$basedir/../typescript/bin/tsserver" $args - } - $ret=$LASTEXITCODE -} -$env:NODE_PATH=$env_node_path -exit $ret diff --git a/node_modules.corrupt/.bin/vite b/node_modules.corrupt/.bin/vite deleted file mode 100644 index 3ddb91f3..00000000 --- a/node_modules.corrupt/.bin/vite +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") -basedir_win="$basedir" -exe="" -msys="" - -case `uname -a` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir_win=`cygpath -w "$basedir"` - fi - exe=".exe" - msys="true" - ;; - *WSL2*) - if command -v wslpath > /dev/null 2>&1; then - basedir_win="$(wslpath -w "$basedir" 2> /dev/null)" - if [ $? -ne 0 ] || [ -z "$basedir_win" ]; then - basedir_win="$basedir" - else - exe=".exe" - fi - fi - ;; -esac - -if [ -z "$NODE_PATH" ]; then - export NODE_PATH="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vite@8.1.5_@types+node@24.13.3_yaml@2.9.0/node_modules/vite/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vite@8.1.5_@types+node@24.13.3_yaml@2.9.0/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules" -else - export NODE_PATH="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vite@8.1.5_@types+node@24.13.3_yaml@2.9.0/node_modules/vite/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vite@8.1.5_@types+node@24.13.3_yaml@2.9.0/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules:$NODE_PATH" -fi -if [ -n "$exe" ] && [ -x "$basedir/node.exe" ]; then - exec "$basedir/node.exe" "$basedir_win/../vite/bin/vite.js" "$@" -elif [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../vite/bin/vite.js" "$@" -elif command -v node >/dev/null 2>&1; then - exec node "$basedir/../vite/bin/vite.js" "$@" -elif [ -n "$exe" ] && command -v node.exe >/dev/null 2>&1; then - exec node.exe "$basedir_win/../vite/bin/vite.js" "$@" -else - exec node "$basedir/../vite/bin/vite.js" "$@" -fi -# cmd-shim-target=C:/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/vite/bin/vite.js diff --git a/node_modules.corrupt/.bin/vite.CMD b/node_modules.corrupt/.bin/vite.CMD deleted file mode 100644 index fcc8570e..00000000 --- a/node_modules.corrupt/.bin/vite.CMD +++ /dev/null @@ -1,12 +0,0 @@ -@SETLOCAL -@IF NOT DEFINED NODE_PATH ( - @SET "NODE_PATH=C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vite@8.1.5_@types+node@24.13.3_yaml@2.9.0\node_modules\vite\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vite@8.1.5_@types+node@24.13.3_yaml@2.9.0\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules" -) ELSE ( - @SET "NODE_PATH=C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vite@8.1.5_@types+node@24.13.3_yaml@2.9.0\node_modules\vite\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vite@8.1.5_@types+node@24.13.3_yaml@2.9.0\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules;%NODE_PATH%" -) -@IF EXIST "%~dp0\node.exe" ( - "%~dp0\node.exe" "%~dp0\..\vite\bin\vite.js" %* -) ELSE ( - @SET PATHEXT=%PATHEXT:;.JS;=;% - node "%~dp0\..\vite\bin\vite.js" %* -) diff --git a/node_modules.corrupt/.bin/vite.ps1 b/node_modules.corrupt/.bin/vite.ps1 deleted file mode 100644 index 7f321ffb..00000000 --- a/node_modules.corrupt/.bin/vite.ps1 +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -$pathsep=":" -$env_node_path=$env:NODE_PATH -$new_node_path="C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vite@8.1.5_@types+node@24.13.3_yaml@2.9.0\node_modules\vite\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vite@8.1.5_@types+node@24.13.3_yaml@2.9.0\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" - $pathsep=";" -} else { - $new_node_path="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vite@8.1.5_@types+node@24.13.3_yaml@2.9.0/node_modules/vite/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vite@8.1.5_@types+node@24.13.3_yaml@2.9.0/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules" -} -if ([string]::IsNullOrEmpty($env_node_path)) { - $env:NODE_PATH=$new_node_path -} else { - $env:NODE_PATH="$new_node_path$pathsep$env_node_path" -} - -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../vite/bin/vite.js" $args - } else { - & "$basedir/node$exe" "$basedir/../vite/bin/vite.js" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../vite/bin/vite.js" $args - } else { - & "node$exe" "$basedir/../vite/bin/vite.js" $args - } - $ret=$LASTEXITCODE -} -$env:NODE_PATH=$env_node_path -exit $ret diff --git a/node_modules.corrupt/.bin/vitest b/node_modules.corrupt/.bin/vitest deleted file mode 100644 index 8bc82916..00000000 --- a/node_modules.corrupt/.bin/vitest +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") -basedir_win="$basedir" -exe="" -msys="" - -case `uname -a` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir_win=`cygpath -w "$basedir"` - fi - exe=".exe" - msys="true" - ;; - *WSL2*) - if command -v wslpath > /dev/null 2>&1; then - basedir_win="$(wslpath -w "$basedir" 2> /dev/null)" - if [ $? -ne 0 ] || [ -z "$basedir_win" ]; then - basedir_win="$basedir" - else - exe=".exe" - fi - fi - ;; -esac - -if [ -z "$NODE_PATH" ]; then - export NODE_PATH="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e/node_modules/vitest/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules" -else - export NODE_PATH="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e/node_modules/vitest/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules:$NODE_PATH" -fi -if [ -n "$exe" ] && [ -x "$basedir/node.exe" ]; then - exec "$basedir/node.exe" "$basedir_win/../vitest/vitest.mjs" "$@" -elif [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../vitest/vitest.mjs" "$@" -elif command -v node >/dev/null 2>&1; then - exec node "$basedir/../vitest/vitest.mjs" "$@" -elif [ -n "$exe" ] && command -v node.exe >/dev/null 2>&1; then - exec node.exe "$basedir_win/../vitest/vitest.mjs" "$@" -else - exec node "$basedir/../vitest/vitest.mjs" "$@" -fi -# cmd-shim-target=C:/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/vitest/vitest.mjs diff --git a/node_modules.corrupt/.bin/vitest.CMD b/node_modules.corrupt/.bin/vitest.CMD deleted file mode 100644 index 9e89fdf5..00000000 --- a/node_modules.corrupt/.bin/vitest.CMD +++ /dev/null @@ -1,12 +0,0 @@ -@SETLOCAL -@IF NOT DEFINED NODE_PATH ( - @SET "NODE_PATH=C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e\node_modules\vitest\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules" -) ELSE ( - @SET "NODE_PATH=C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e\node_modules\vitest\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules;%NODE_PATH%" -) -@IF EXIST "%~dp0\node.exe" ( - "%~dp0\node.exe" "%~dp0\..\vitest\vitest.mjs" %* -) ELSE ( - @SET PATHEXT=%PATHEXT:;.JS;=;% - node "%~dp0\..\vitest\vitest.mjs" %* -) diff --git a/node_modules.corrupt/.bin/vitest.ps1 b/node_modules.corrupt/.bin/vitest.ps1 deleted file mode 100644 index 827286a5..00000000 --- a/node_modules.corrupt/.bin/vitest.ps1 +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -$pathsep=":" -$env_node_path=$env:NODE_PATH -$new_node_path="C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e\node_modules\vitest\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" - $pathsep=";" -} else { - $new_node_path="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e/node_modules/vitest/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules" -} -if ([string]::IsNullOrEmpty($env_node_path)) { - $env:NODE_PATH=$new_node_path -} else { - $env:NODE_PATH="$new_node_path$pathsep$env_node_path" -} - -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../vitest/vitest.mjs" $args - } else { - & "$basedir/node$exe" "$basedir/../vitest/vitest.mjs" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../vitest/vitest.mjs" $args - } else { - & "node$exe" "$basedir/../vitest/vitest.mjs" $args - } - $ret=$LASTEXITCODE -} -$env:NODE_PATH=$env_node_path -exit $ret diff --git a/node_modules.corrupt/.bin/vue-tsc b/node_modules.corrupt/.bin/vue-tsc deleted file mode 100644 index 07c182b7..00000000 --- a/node_modules.corrupt/.bin/vue-tsc +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") -basedir_win="$basedir" -exe="" -msys="" - -case `uname -a` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir_win=`cygpath -w "$basedir"` - fi - exe=".exe" - msys="true" - ;; - *WSL2*) - if command -v wslpath > /dev/null 2>&1; then - basedir_win="$(wslpath -w "$basedir" 2> /dev/null)" - if [ $? -ne 0 ] || [ -z "$basedir_win" ]; then - basedir_win="$basedir" - else - exe=".exe" - fi - fi - ;; -esac - -if [ -z "$NODE_PATH" ]; then - export NODE_PATH="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vue-tsc@3.3.8_typescript@5.9.3/node_modules/vue-tsc/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vue-tsc@3.3.8_typescript@5.9.3/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules" -else - export NODE_PATH="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vue-tsc@3.3.8_typescript@5.9.3/node_modules/vue-tsc/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vue-tsc@3.3.8_typescript@5.9.3/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules:$NODE_PATH" -fi -if [ -n "$exe" ] && [ -x "$basedir/node.exe" ]; then - exec "$basedir/node.exe" "$basedir_win/../vue-tsc/bin/vue-tsc.js" "$@" -elif [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../vue-tsc/bin/vue-tsc.js" "$@" -elif command -v node >/dev/null 2>&1; then - exec node "$basedir/../vue-tsc/bin/vue-tsc.js" "$@" -elif [ -n "$exe" ] && command -v node.exe >/dev/null 2>&1; then - exec node.exe "$basedir_win/../vue-tsc/bin/vue-tsc.js" "$@" -else - exec node "$basedir/../vue-tsc/bin/vue-tsc.js" "$@" -fi -# cmd-shim-target=C:/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/vue-tsc/bin/vue-tsc.js diff --git a/node_modules.corrupt/.bin/vue-tsc.CMD b/node_modules.corrupt/.bin/vue-tsc.CMD deleted file mode 100644 index b9797275..00000000 --- a/node_modules.corrupt/.bin/vue-tsc.CMD +++ /dev/null @@ -1,12 +0,0 @@ -@SETLOCAL -@IF NOT DEFINED NODE_PATH ( - @SET "NODE_PATH=C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vue-tsc@3.3.8_typescript@5.9.3\node_modules\vue-tsc\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vue-tsc@3.3.8_typescript@5.9.3\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules" -) ELSE ( - @SET "NODE_PATH=C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vue-tsc@3.3.8_typescript@5.9.3\node_modules\vue-tsc\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vue-tsc@3.3.8_typescript@5.9.3\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules;%NODE_PATH%" -) -@IF EXIST "%~dp0\node.exe" ( - "%~dp0\node.exe" "%~dp0\..\vue-tsc\bin\vue-tsc.js" %* -) ELSE ( - @SET PATHEXT=%PATHEXT:;.JS;=;% - node "%~dp0\..\vue-tsc\bin\vue-tsc.js" %* -) diff --git a/node_modules.corrupt/.bin/vue-tsc.ps1 b/node_modules.corrupt/.bin/vue-tsc.ps1 deleted file mode 100644 index 62a715cf..00000000 --- a/node_modules.corrupt/.bin/vue-tsc.ps1 +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -$pathsep=":" -$env_node_path=$env:NODE_PATH -$new_node_path="C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vue-tsc@3.3.8_typescript@5.9.3\node_modules\vue-tsc\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\vue-tsc@3.3.8_typescript@5.9.3\node_modules;C:\Users\BY-OY\Desktop\code\chongchong-global-dev\apps\admin-web\node_modules\.pnpm\node_modules" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" - $pathsep=";" -} else { - $new_node_path="/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vue-tsc@3.3.8_typescript@5.9.3/node_modules/vue-tsc/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/vue-tsc@3.3.8_typescript@5.9.3/node_modules:/mnt/c/Users/BY-OY/Desktop/code/chongchong-global-dev/apps/admin-web/node_modules/.pnpm/node_modules" -} -if ([string]::IsNullOrEmpty($env_node_path)) { - $env:NODE_PATH=$new_node_path -} else { - $env:NODE_PATH="$new_node_path$pathsep$env_node_path" -} - -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../vue-tsc/bin/vue-tsc.js" $args - } else { - & "$basedir/node$exe" "$basedir/../vue-tsc/bin/vue-tsc.js" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../vue-tsc/bin/vue-tsc.js" $args - } else { - & "node$exe" "$basedir/../vue-tsc/bin/vue-tsc.js" $args - } - $ret=$LASTEXITCODE -} -$env:NODE_PATH=$env_node_path -exit $ret diff --git a/node_modules.corrupt/.modules.yaml b/node_modules.corrupt/.modules.yaml deleted file mode 100644 index 17e72f22..00000000 --- a/node_modules.corrupt/.modules.yaml +++ /dev/null @@ -1,743 +0,0 @@ -{ - "hoistedDependencies": { - "undici-types@7.18.2": { - "undici-types": "private" - }, - "@rolldown/pluginutils@1.0.1": { - "@rolldown/pluginutils": "private" - }, - "@vue/compiler-dom@3.5.40": { - "@vue/compiler-dom": "private" - }, - "js-beautify@1.15.4": { - "js-beautify": "private" - }, - "vue-component-type-helpers@3.3.8": { - "vue-component-type-helpers": "private" - }, - "@vue/server-renderer@3.5.40": { - "@vue/server-renderer": "private" - }, - "follow-redirects@1.16.0(debug@4.4.3)": { - "follow-redirects": "private" - }, - "form-data@4.0.6": { - "form-data": "private" - }, - "https-proxy-agent@5.0.1": { - "https-proxy-agent": "private" - }, - "proxy-from-env@2.1.0": { - "proxy-from-env": "private" - }, - "@ctrl/tinycolor@4.2.0": { - "@ctrl/tinycolor": "private" - }, - "@element-plus/icons-vue@2.3.2(vue@3.5.40(typescript@5.9.3))": { - "@element-plus/icons-vue": "private" - }, - "@floating-ui/dom@1.8.0": { - "@floating-ui/dom": "private" - }, - "@sxzz/popperjs-es@2.11.8": { - "@popperjs/core": "private" - }, - "@types/lodash@4.17.24": { - "@types/lodash": "private" - }, - "@types/lodash-es@4.17.12": { - "@types/lodash-es": "private" - }, - "@vueuse/core@14.3.0(vue@3.5.40(typescript@5.9.3))": { - "@vueuse/core": "private" - }, - "async-validator@4.2.5": { - "async-validator": "private" - }, - "dayjs@1.11.21": { - "dayjs": "private" - }, - "lodash@4.18.1": { - "lodash": "private" - }, - "lodash-es@4.18.1": { - "lodash-es": "private" - }, - "lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1)": { - "lodash-unified": "private" - }, - "memoize-one@6.0.0": { - "memoize-one": "private" - }, - "normalize-wheel-es@1.2.0": { - "normalize-wheel-es": "private" - }, - "@asamuzakjp/css-color@5.1.11": { - "@asamuzakjp/css-color": "private" - }, - "@asamuzakjp/dom-selector@7.1.1": { - "@asamuzakjp/dom-selector": "private" - }, - "@bramus/specificity@2.4.2": { - "@bramus/specificity": "private" - }, - "@csstools/css-syntax-patches-for-csstree@1.1.7(css-tree@3.2.1)": { - "@csstools/css-syntax-patches-for-csstree": "private" - }, - "@exodus/bytes@1.15.1": { - "@exodus/bytes": "private" - }, - "css-tree@3.2.1": { - "css-tree": "private" - }, - "data-urls@7.0.0": { - "data-urls": "private" - }, - "decimal.js@10.6.0": { - "decimal.js": "private" - }, - "html-encoding-sniffer@6.0.0": { - "html-encoding-sniffer": "private" - }, - "is-potential-custom-element-name@1.0.1": { - "is-potential-custom-element-name": "private" - }, - "lru-cache@11.5.2": { - "lru-cache": "private" - }, - "parse5@8.0.1": { - "parse5": "private" - }, - "saxes@6.0.0": { - "saxes": "private" - }, - "symbol-tree@3.2.4": { - "symbol-tree": "private" - }, - "tough-cookie@6.0.2": { - "tough-cookie": "private" - }, - "undici@7.29.0": { - "undici": "private" - }, - "w3c-xmlserializer@5.0.0": { - "w3c-xmlserializer": "private" - }, - "webidl-conversions@8.0.1": { - "webidl-conversions": "private" - }, - "whatwg-mimetype@5.0.0": { - "whatwg-mimetype": "private" - }, - "whatwg-url@16.0.1": { - "whatwg-url": "private" - }, - "xml-name-validator@5.0.0": { - "xml-name-validator": "private" - }, - "@vue/devtools-api@8.2.1": { - "@vue/devtools-api": "private" - }, - "nostics@1.2.0": { - "nostics": "private" - }, - "local-pkg@1.2.1": { - "local-pkg": "private" - }, - "magic-string@0.30.21": { - "magic-string": "private" - }, - "picomatch@4.0.5": { - "picomatch": "private" - }, - "unimport@5.7.0": { - "unimport": "private" - }, - "unplugin@2.3.11": { - "unplugin": "private" - }, - "unplugin-utils@0.3.2": { - "unplugin-utils": "private" - }, - "chokidar@5.0.0": { - "chokidar": "private" - }, - "mlly@1.8.2": { - "mlly": "private" - }, - "obug@2.1.4": { - "obug": "private" - }, - "tinyglobby@0.2.17": { - "tinyglobby": "private" - }, - "lightningcss@1.33.0": { - "lightningcss": "private" - }, - "postcss@8.5.23": { - "postcss": "private" - }, - "rolldown@1.1.5": { - "rolldown": "private" - }, - "yaml@2.9.0": { - "yaml": "private" - }, - "@vitest/expect@4.1.10": { - "@vitest/expect": "private" - }, - "@vitest/mocker@4.1.10(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))": { - "@vitest/mocker": "private" - }, - "@vitest/pretty-format@4.1.10": { - "@vitest/pretty-format": "private" - }, - "@vitest/runner@4.1.10": { - "@vitest/runner": "private" - }, - "@vitest/snapshot@4.1.10": { - "@vitest/snapshot": "private" - }, - "@vitest/spy@4.1.10": { - "@vitest/spy": "private" - }, - "@vitest/utils@4.1.10": { - "@vitest/utils": "private" - }, - "es-module-lexer@2.3.1": { - "es-module-lexer": "private" - }, - "expect-type@1.4.0": { - "expect-type": "private" - }, - "pathe@2.0.3": { - "pathe": "private" - }, - "std-env@4.2.0": { - "std-env": "private" - }, - "tinybench@2.9.0": { - "tinybench": "private" - }, - "tinyexec@1.2.4": { - "tinyexec": "private" - }, - "tinyrainbow@3.1.0": { - "tinyrainbow": "private" - }, - "why-is-node-running@2.3.0": { - "why-is-node-running": "private" - }, - "@babel/generator@8.0.0": { - "@babel/generator": "private" - }, - "@vue-macros/common@3.1.4(vue@3.5.40(typescript@5.9.3))": { - "@vue-macros/common": "private" - }, - "ast-walker-scope@0.9.0": { - "ast-walker-scope": "private" - }, - "json5@2.2.3": { - "json5": "private" - }, - "muggle-string@0.4.1": { - "muggle-string": "private" - }, - "scule@1.3.0": { - "scule": "private" - }, - "@vue/compiler-sfc@3.5.40": { - "@vue/compiler-sfc": "private" - }, - "@volar/typescript@2.4.28": { - "@volar/typescript": "private" - }, - "@vue/language-core@3.3.8": { - "@vue/language-core": "private" - }, - "@vue/runtime-dom@3.5.40": { - "@vue/runtime-dom": "private" - }, - "@vue/shared@3.5.40": { - "@vue/shared": "private" - }, - "@asamuzakjp/generational-cache@1.0.1": { - "@asamuzakjp/generational-cache": "private" - }, - "@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)": { - "@csstools/css-calc": "private" - }, - "@csstools/css-color-parser@4.1.10(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)": { - "@csstools/css-color-parser": "private" - }, - "@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)": { - "@csstools/css-parser-algorithms": "private" - }, - "@csstools/css-tokenizer@4.0.0": { - "@csstools/css-tokenizer": "private" - }, - "@asamuzakjp/nwsapi@2.3.9": { - "@asamuzakjp/nwsapi": "private" - }, - "bidi-js@1.0.3": { - "bidi-js": "private" - }, - "@babel/parser@8.0.4": { - "@babel/parser": "private" - }, - "@babel/types@8.0.4": { - "@babel/types": "private" - }, - "@jridgewell/gen-mapping@0.3.13": { - "@jridgewell/gen-mapping": "private" - }, - "@jridgewell/trace-mapping@0.3.31": { - "@jridgewell/trace-mapping": "private" - }, - "@types/jsesc@2.5.1": { - "@types/jsesc": "private" - }, - "jsesc@3.1.0": { - "jsesc": "private" - }, - "@floating-ui/core@1.8.0": { - "@floating-ui/core": "private" - }, - "@floating-ui/utils@0.2.12": { - "@floating-ui/utils": "private" - }, - "@standard-schema/spec@1.1.0": { - "@standard-schema/spec": "private" - }, - "@types/chai@5.2.3": { - "@types/chai": "private" - }, - "chai@6.2.2": { - "chai": "private" - }, - "estree-walker@3.0.3": { - "estree-walker": "private" - }, - "convert-source-map@2.0.0": { - "convert-source-map": "private" - }, - "@volar/language-core@2.4.28": { - "@volar/language-core": "private" - }, - "path-browserify@1.0.1": { - "path-browserify": "private" - }, - "vscode-uri@3.1.0": { - "vscode-uri": "private" - }, - "@vue/compiler-core@3.5.40": { - "@vue/compiler-core": "private" - }, - "@vue/compiler-ssr@3.5.40": { - "@vue/compiler-ssr": "private" - }, - "source-map-js@1.2.1": { - "source-map-js": "private" - }, - "@vue/devtools-kit@8.2.1": { - "@vue/devtools-kit": "private" - }, - "alien-signals@3.2.1": { - "alien-signals": "private" - }, - "@vue/reactivity@3.5.40": { - "@vue/reactivity": "private" - }, - "@vue/runtime-core@3.5.40": { - "@vue/runtime-core": "private" - }, - "csstype@3.2.3": { - "csstype": "private" - }, - "ast-kit@2.2.0": { - "ast-kit": "private" - }, - "magic-string-ast@1.0.3": { - "magic-string-ast": "private" - }, - "@types/web-bluetooth@0.0.21": { - "@types/web-bluetooth": "private" - }, - "@vueuse/metadata@14.3.0": { - "@vueuse/metadata": "private" - }, - "@vueuse/shared@14.3.0(vue@3.5.40(typescript@5.9.3))": { - "@vueuse/shared": "private" - }, - "readdirp@5.0.0": { - "readdirp": "private" - }, - "mdn-data@2.27.1": { - "mdn-data": "private" - }, - "debug@4.4.3": { - "debug": "private" - }, - "asynckit@0.4.0": { - "asynckit": "private" - }, - "combined-stream@1.0.8": { - "combined-stream": "private" - }, - "es-set-tostringtag@2.1.0": { - "es-set-tostringtag": "private" - }, - "hasown@2.0.4": { - "hasown": "private" - }, - "mime-types@2.1.35": { - "mime-types": "private" - }, - "agent-base@6.0.2": { - "agent-base": "private" - }, - "config-chain@1.1.13": { - "config-chain": "private" - }, - "editorconfig@1.0.7": { - "editorconfig": "private" - }, - "glob@10.5.0": { - "glob": "private" - }, - "js-cookie@3.0.8": { - "js-cookie": "private" - }, - "nopt@7.2.1": { - "nopt": "private" - }, - "detect-libc@2.1.2": { - "detect-libc": "private" - }, - "lightningcss-win32-x64-msvc@1.33.0": { - "lightningcss-win32-x64-msvc": "private" - }, - "pkg-types@2.3.1": { - "pkg-types": "private" - }, - "quansync@0.2.11": { - "quansync": "private" - }, - "@jridgewell/sourcemap-codec@1.5.5": { - "@jridgewell/sourcemap-codec": "private" - }, - "acorn@8.17.0": { - "acorn": "private" - }, - "ufo@1.6.4": { - "ufo": "private" - }, - "entities@8.0.0": { - "entities": "private" - }, - "nanoid@3.3.16": { - "nanoid": "private" - }, - "picocolors@1.1.1": { - "picocolors": "private" - }, - "@oxc-project/types@0.139.0": { - "@oxc-project/types": "private" - }, - "@rolldown/binding-win32-x64-msvc@1.1.5": { - "@rolldown/binding-win32-x64-msvc": "private" - }, - "xmlchars@2.2.0": { - "xmlchars": "private" - }, - "fdir@6.5.0(picomatch@4.0.5)": { - "fdir": "private" - }, - "tldts@7.4.9": { - "tldts": "private" - }, - "escape-string-regexp@5.0.0": { - "escape-string-regexp": "private" - }, - "strip-literal@3.1.0": { - "strip-literal": "private" - }, - "@jridgewell/remapping@2.3.5": { - "@jridgewell/remapping": "private" - }, - "webpack-virtual-modules@0.6.2": { - "webpack-virtual-modules": "private" - }, - "tr46@6.0.0": { - "tr46": "private" - }, - "siginfo@2.0.0": { - "siginfo": "private" - }, - "stackback@0.0.2": { - "stackback": "private" - }, - "@babel/helper-string-parser@8.0.0": { - "@babel/helper-string-parser": "private" - }, - "@babel/helper-validator-identifier@8.0.4": { - "@babel/helper-validator-identifier": "private" - }, - "@csstools/color-helpers@6.1.0": { - "@csstools/color-helpers": "private" - }, - "@types/deep-eql@4.0.2": { - "@types/deep-eql": "private" - }, - "assertion-error@2.0.1": { - "assertion-error": "private" - }, - "@volar/source-map@2.4.28": { - "@volar/source-map": "private" - }, - "@vue/devtools-shared@8.2.1": { - "@vue/devtools-shared": "private" - }, - "birpc@2.9.0": { - "birpc": "private" - }, - "hookable@5.5.3": { - "hookable": "private" - }, - "perfect-debounce@2.1.0": { - "perfect-debounce": "private" - }, - "require-from-string@2.0.2": { - "require-from-string": "private" - }, - "delayed-stream@1.0.0": { - "delayed-stream": "private" - }, - "ini@1.3.8": { - "ini": "private" - }, - "proto-list@1.2.4": { - "proto-list": "private" - }, - "ms@2.1.3": { - "ms": "private" - }, - "@one-ini/wasm@0.1.1": { - "@one-ini/wasm": "private" - }, - "commander@10.0.1": { - "commander": "private" - }, - "minimatch@9.0.9": { - "minimatch": "private" - }, - "semver@7.8.5": { - "semver": "private" - }, - "es-errors@1.3.0": { - "es-errors": "private" - }, - "get-intrinsic@1.3.0": { - "get-intrinsic": "private" - }, - "has-tostringtag@1.0.2": { - "has-tostringtag": "private" - }, - "@types/estree@1.0.9": { - "@types/estree": "private" - }, - "foreground-child@3.3.1": { - "foreground-child": "private" - }, - "jackspeak@3.4.3": { - "jackspeak": "private" - }, - "minipass@7.1.3": { - "minipass": "private" - }, - "package-json-from-dist@1.0.1": { - "package-json-from-dist": "private" - }, - "path-scurry@1.11.1": { - "path-scurry": "private" - }, - "function-bind@1.1.2": { - "function-bind": "private" - }, - "mime-db@1.52.0": { - "mime-db": "private" - }, - "abbrev@2.0.0": { - "abbrev": "private" - }, - "confbox@0.1.8": { - "confbox": "private" - }, - "exsolve@1.1.0": { - "exsolve": "private" - }, - "js-tokens@9.0.1": { - "js-tokens": "private" - }, - "tldts-core@7.4.9": { - "tldts-core": "private" - }, - "punycode@2.3.1": { - "punycode": "private" - }, - "@jridgewell/resolve-uri@3.1.2": { - "@jridgewell/resolve-uri": "private" - }, - "cross-spawn@7.0.6": { - "cross-spawn": "private" - }, - "signal-exit@4.1.0": { - "signal-exit": "private" - }, - "call-bind-apply-helpers@1.0.2": { - "call-bind-apply-helpers": "private" - }, - "es-define-property@1.0.1": { - "es-define-property": "private" - }, - "es-object-atoms@1.1.2": { - "es-object-atoms": "private" - }, - "get-proto@1.0.1": { - "get-proto": "private" - }, - "gopd@1.2.0": { - "gopd": "private" - }, - "has-symbols@1.1.0": { - "has-symbols": "private" - }, - "math-intrinsics@1.1.0": { - "math-intrinsics": "private" - }, - "@isaacs/cliui@8.0.2": { - "@isaacs/cliui": "private" - }, - "@pkgjs/parseargs@0.11.0": { - "@pkgjs/parseargs": "private" - }, - "brace-expansion@2.1.2": { - "brace-expansion": "private" - }, - "string-width@5.1.2": { - "string-width": "private" - }, - "string-width@4.2.3": { - "string-width-cjs": "private" - }, - "strip-ansi@7.2.0": { - "strip-ansi": "private" - }, - "strip-ansi@6.0.1": { - "strip-ansi-cjs": "private" - }, - "wrap-ansi@8.1.0": { - "wrap-ansi": "private" - }, - "wrap-ansi@7.0.0": { - "wrap-ansi-cjs": "private" - }, - "balanced-match@1.0.2": { - "balanced-match": "private" - }, - "path-key@3.1.1": { - "path-key": "private" - }, - "shebang-command@2.0.0": { - "shebang-command": "private" - }, - "which@2.0.2": { - "which": "private" - }, - "dunder-proto@1.0.1": { - "dunder-proto": "private" - }, - "shebang-regex@3.0.0": { - "shebang-regex": "private" - }, - "emoji-regex@8.0.0": { - "emoji-regex": "private" - }, - "is-fullwidth-code-point@3.0.0": { - "is-fullwidth-code-point": "private" - }, - "eastasianwidth@0.2.0": { - "eastasianwidth": "private" - }, - "ansi-regex@5.0.1": { - "ansi-regex": "private" - }, - "isexe@2.0.0": { - "isexe": "private" - }, - "ansi-styles@4.3.0": { - "ansi-styles": "private" - }, - "color-convert@2.0.1": { - "color-convert": "private" - }, - "color-name@1.1.4": { - "color-name": "private" - } - }, - "hoistPattern": [ - "*" - ], - "included": { - "dependencies": true, - "devDependencies": true, - "optionalDependencies": true - }, - "injectedDeps": {}, - "layoutVersion": 5, - "nodeLinker": "isolated", - "packageManager": "pnpm@11.17.0", - "pendingBuilds": [], - "publicHoistPattern": [], - "prunedAt": "Thu, 20 Aug 2026 06:47:32 GMT", - "registries": { - "default": "https://registry.npmjs.org/", - "@jsr": "https://npm.jsr.io/" - }, - "skipped": [ - "@emnapi/core@1.11.1", - "@emnapi/runtime@1.11.1", - "@emnapi/wasi-threads@1.2.2", - "@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)", - "@rolldown/binding-android-arm64@1.1.5", - "@rolldown/binding-darwin-arm64@1.1.5", - "@rolldown/binding-darwin-x64@1.1.5", - "@rolldown/binding-freebsd-x64@1.1.5", - "@rolldown/binding-linux-arm-gnueabihf@1.1.5", - "@rolldown/binding-linux-arm64-gnu@1.1.5", - "@rolldown/binding-linux-arm64-musl@1.1.5", - "@rolldown/binding-linux-ppc64-gnu@1.1.5", - "@rolldown/binding-linux-s390x-gnu@1.1.5", - "@rolldown/binding-linux-x64-gnu@1.1.5", - "@rolldown/binding-linux-x64-musl@1.1.5", - "@rolldown/binding-openharmony-arm64@1.1.5", - "@rolldown/binding-wasm32-wasi@1.1.5", - "@rolldown/binding-win32-arm64-msvc@1.1.5", - "@tybys/wasm-util@0.10.3", - "fsevents@2.3.3", - "lightningcss-android-arm64@1.33.0", - "lightningcss-darwin-arm64@1.33.0", - "lightningcss-darwin-x64@1.33.0", - "lightningcss-freebsd-x64@1.33.0", - "lightningcss-linux-arm-gnueabihf@1.33.0", - "lightningcss-linux-arm64-gnu@1.33.0", - "lightningcss-linux-arm64-musl@1.33.0", - "lightningcss-linux-x64-gnu@1.33.0", - "lightningcss-linux-x64-musl@1.33.0", - "lightningcss-win32-arm64-msvc@1.33.0", - "tslib@2.8.1" - ], - "storeDir": "C:\\Users\\BY-OY\\AppData\\Local\\pnpm\\store\\v11", - "virtualStoreDir": "C:\\Users\\BY-OY\\Desktop\\code\\chongchong-global-dev\\apps\\admin-web\\node_modules\\.pnpm", - "virtualStoreDirMaxLength": 60 -} \ No newline at end of file diff --git a/node_modules.corrupt/.package-map.json b/node_modules.corrupt/.package-map.json deleted file mode 100644 index 55036b2d..00000000 --- a/node_modules.corrupt/.package-map.json +++ /dev/null @@ -1 +0,0 @@ -{"packages":{".":{"url":"..","dependencies":{"@chongchong/admin-web":".","@chongchong/shared":"shared","@lucide/vue":"@lucide/vue@1.27.0(vue@3.5.40(typescript@5.9.3))","@types/node":"@types/node@24.13.3","@types/sortablejs":"@types/sortablejs@1.15.9","@vitejs/plugin-vue":"@vitejs/plugin-vue@6.0.8(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))","@vue/test-utils":"@vue/test-utils@2.4.11(@vue/compiler-dom@3.5.40)(@vue/server-renderer@3.5.40)(vue@3.5.40(typescript@5.9.3))","axios":"axios@1.18.1(debug@4.4.3)","element-plus":"element-plus@2.14.3(vue@3.5.40(typescript@5.9.3))","jsdom":"jsdom@29.1.1","pinia":"pinia@4.0.2(@vue/devtools-api@8.2.1)(typescript@5.9.3)(vue@3.5.40(typescript@5.9.3))","sortablejs":"sortablejs@1.15.7","typescript":"typescript@5.9.3","unplugin-auto-import":"unplugin-auto-import@21.0.0(@vueuse/core@14.3.0(vue@3.5.40(typescript@5.9.3)))","unplugin-vue-components":"unplugin-vue-components@32.1.0(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))","vite":"vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)","vitest":"vitest@4.1.10(@types/node@24.13.3)(jsdom@29.1.1)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))","vue":"vue@3.5.40(typescript@5.9.3)","vue-router":"vue-router@5.2.0(@vue/compiler-sfc@3.5.40)(pinia@4.0.2(@vue/devtools-api@8.2.1)(typescript@5.9.3)(vue@3.5.40(typescript@5.9.3)))(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))","vue-tsc":"vue-tsc@3.3.8(typescript@5.9.3)"}},"@asamuzakjp/css-color@5.1.11":{"url":"./.pnpm/@asamuzakjp+css-color@5.1.11/node_modules/@asamuzakjp/css-color","dependencies":{"@asamuzakjp/css-color":"@asamuzakjp/css-color@5.1.11","@asamuzakjp/generational-cache":"@asamuzakjp/generational-cache@1.0.1","@csstools/css-calc":"@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)","@csstools/css-color-parser":"@csstools/css-color-parser@4.1.10(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)","@csstools/css-parser-algorithms":"@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)","@csstools/css-tokenizer":"@csstools/css-tokenizer@4.0.0"}},"@asamuzakjp/dom-selector@7.1.1":{"url":"./.pnpm/@asamuzakjp+dom-selector@7.1.1/node_modules/@asamuzakjp/dom-selector","dependencies":{"@asamuzakjp/dom-selector":"@asamuzakjp/dom-selector@7.1.1","@asamuzakjp/generational-cache":"@asamuzakjp/generational-cache@1.0.1","@asamuzakjp/nwsapi":"@asamuzakjp/nwsapi@2.3.9","bidi-js":"bidi-js@1.0.3","css-tree":"css-tree@3.2.1","is-potential-custom-element-name":"is-potential-custom-element-name@1.0.1"}},"@asamuzakjp/generational-cache@1.0.1":{"url":"./.pnpm/@asamuzakjp+generational-cache@1.0.1/node_modules/@asamuzakjp/generational-cache","dependencies":{"@asamuzakjp/generational-cache":"@asamuzakjp/generational-cache@1.0.1"}},"@asamuzakjp/nwsapi@2.3.9":{"url":"./.pnpm/@asamuzakjp+nwsapi@2.3.9/node_modules/@asamuzakjp/nwsapi","dependencies":{"@asamuzakjp/nwsapi":"@asamuzakjp/nwsapi@2.3.9"}},"@babel/generator@8.0.0":{"url":"./.pnpm/@babel+generator@8.0.0/node_modules/@babel/generator","dependencies":{"@babel/generator":"@babel/generator@8.0.0","@babel/parser":"@babel/parser@8.0.4","@babel/types":"@babel/types@8.0.4","@jridgewell/gen-mapping":"@jridgewell/gen-mapping@0.3.13","@jridgewell/trace-mapping":"@jridgewell/trace-mapping@0.3.31","@types/jsesc":"@types/jsesc@2.5.1","jsesc":"jsesc@3.1.0"}},"@babel/helper-string-parser@7.29.7":{"url":"./.pnpm/@babel+helper-string-parser@7.29.7/node_modules/@babel/helper-string-parser","dependencies":{"@babel/helper-string-parser":"@babel/helper-string-parser@7.29.7"}},"@babel/helper-string-parser@8.0.0":{"url":"./.pnpm/@babel+helper-string-parser@8.0.0/node_modules/@babel/helper-string-parser","dependencies":{"@babel/helper-string-parser":"@babel/helper-string-parser@8.0.0"}},"@babel/helper-validator-identifier@7.29.7":{"url":"./.pnpm/@babel+helper-validator-identifier@7.29.7/node_modules/@babel/helper-validator-identifier","dependencies":{"@babel/helper-validator-identifier":"@babel/helper-validator-identifier@7.29.7"}},"@babel/helper-validator-identifier@8.0.4":{"url":"./.pnpm/@babel+helper-validator-identifier@8.0.4/node_modules/@babel/helper-validator-identifier","dependencies":{"@babel/helper-validator-identifier":"@babel/helper-validator-identifier@8.0.4"}},"@babel/parser@7.29.7":{"url":"./.pnpm/@babel+parser@7.29.7/node_modules/@babel/parser","dependencies":{"@babel/parser":"@babel/parser@7.29.7","@babel/types":"@babel/types@7.29.7"}},"@babel/parser@8.0.4":{"url":"./.pnpm/@babel+parser@8.0.4/node_modules/@babel/parser","dependencies":{"@babel/parser":"@babel/parser@8.0.4","@babel/types":"@babel/types@8.0.4"}},"@babel/types@7.29.7":{"url":"./.pnpm/@babel+types@7.29.7/node_modules/@babel/types","dependencies":{"@babel/helper-string-parser":"@babel/helper-string-parser@7.29.7","@babel/helper-validator-identifier":"@babel/helper-validator-identifier@7.29.7","@babel/types":"@babel/types@7.29.7"}},"@babel/types@8.0.4":{"url":"./.pnpm/@babel+types@8.0.4/node_modules/@babel/types","dependencies":{"@babel/helper-string-parser":"@babel/helper-string-parser@8.0.0","@babel/helper-validator-identifier":"@babel/helper-validator-identifier@8.0.4","@babel/types":"@babel/types@8.0.4"}},"@bramus/specificity@2.4.2":{"url":"./.pnpm/@bramus+specificity@2.4.2/node_modules/@bramus/specificity","dependencies":{"@bramus/specificity":"@bramus/specificity@2.4.2","css-tree":"css-tree@3.2.1"}},"@csstools/color-helpers@6.1.0":{"url":"./.pnpm/@csstools+color-helpers@6.1.0/node_modules/@csstools/color-helpers","dependencies":{"@csstools/color-helpers":"@csstools/color-helpers@6.1.0"}},"@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)":{"url":"./.pnpm/@csstools+css-calc@3.3.0_@c_4dbc5b05e8dbfe1f32044d24572a798f/node_modules/@csstools/css-calc","dependencies":{"@csstools/css-calc":"@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)","@csstools/css-parser-algorithms":"@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)","@csstools/css-tokenizer":"@csstools/css-tokenizer@4.0.0"}},"@csstools/css-color-parser@4.1.10(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)":{"url":"./.pnpm/@csstools+css-color-parser@_effeb5cd45da44eb6c8c04960cd886da/node_modules/@csstools/css-color-parser","dependencies":{"@csstools/color-helpers":"@csstools/color-helpers@6.1.0","@csstools/css-calc":"@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)","@csstools/css-color-parser":"@csstools/css-color-parser@4.1.10(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)","@csstools/css-parser-algorithms":"@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)","@csstools/css-tokenizer":"@csstools/css-tokenizer@4.0.0"}},"@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)":{"url":"./.pnpm/@csstools+css-parser-algori_b9ad755ebdc6dc54abc499015fcb7df0/node_modules/@csstools/css-parser-algorithms","dependencies":{"@csstools/css-parser-algorithms":"@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)","@csstools/css-tokenizer":"@csstools/css-tokenizer@4.0.0"}},"@csstools/css-syntax-patches-for-csstree@1.1.7(css-tree@3.2.1)":{"url":"./.pnpm/@csstools+css-syntax-patche_bc9c53d3df72bff55db1794ca8fff262/node_modules/@csstools/css-syntax-patches-for-csstree","dependencies":{"@csstools/css-syntax-patches-for-csstree":"@csstools/css-syntax-patches-for-csstree@1.1.7(css-tree@3.2.1)","css-tree":"css-tree@3.2.1"}},"@csstools/css-tokenizer@4.0.0":{"url":"./.pnpm/@csstools+css-tokenizer@4.0.0/node_modules/@csstools/css-tokenizer","dependencies":{"@csstools/css-tokenizer":"@csstools/css-tokenizer@4.0.0"}},"@ctrl/tinycolor@4.2.0":{"url":"./.pnpm/@ctrl+tinycolor@4.2.0/node_modules/@ctrl/tinycolor","dependencies":{"@ctrl/tinycolor":"@ctrl/tinycolor@4.2.0"}},"@element-plus/icons-vue@2.3.2(vue@3.5.40(typescript@5.9.3))":{"url":"./.pnpm/@element-plus+icons-vue@2.3.2_vue@3.5.40_typescript@5.9.3_/node_modules/@element-plus/icons-vue","dependencies":{"@element-plus/icons-vue":"@element-plus/icons-vue@2.3.2(vue@3.5.40(typescript@5.9.3))","vue":"vue@3.5.40(typescript@5.9.3)"}},"@emnapi/core@1.11.1":{"url":"./.pnpm/@emnapi+core@1.11.1/node_modules/@emnapi/core","dependencies":{"@emnapi/core":"@emnapi/core@1.11.1","@emnapi/wasi-threads":"@emnapi/wasi-threads@1.2.2","tslib":"tslib@2.8.1"}},"@emnapi/runtime@1.11.1":{"url":"./.pnpm/@emnapi+runtime@1.11.1/node_modules/@emnapi/runtime","dependencies":{"@emnapi/runtime":"@emnapi/runtime@1.11.1","tslib":"tslib@2.8.1"}},"@emnapi/wasi-threads@1.2.2":{"url":"./.pnpm/@emnapi+wasi-threads@1.2.2/node_modules/@emnapi/wasi-threads","dependencies":{"@emnapi/wasi-threads":"@emnapi/wasi-threads@1.2.2","tslib":"tslib@2.8.1"}},"@exodus/bytes@1.15.1":{"url":"./.pnpm/@exodus+bytes@1.15.1/node_modules/@exodus/bytes","dependencies":{"@exodus/bytes":"@exodus/bytes@1.15.1"}},"@floating-ui/core@1.8.0":{"url":"./.pnpm/@floating-ui+core@1.8.0/node_modules/@floating-ui/core","dependencies":{"@floating-ui/core":"@floating-ui/core@1.8.0","@floating-ui/utils":"@floating-ui/utils@0.2.12"}},"@floating-ui/dom@1.8.0":{"url":"./.pnpm/@floating-ui+dom@1.8.0/node_modules/@floating-ui/dom","dependencies":{"@floating-ui/core":"@floating-ui/core@1.8.0","@floating-ui/dom":"@floating-ui/dom@1.8.0","@floating-ui/utils":"@floating-ui/utils@0.2.12"}},"@floating-ui/utils@0.2.12":{"url":"./.pnpm/@floating-ui+utils@0.2.12/node_modules/@floating-ui/utils","dependencies":{"@floating-ui/utils":"@floating-ui/utils@0.2.12"}},"@isaacs/cliui@8.0.2":{"url":"./.pnpm/@isaacs+cliui@8.0.2/node_modules/@isaacs/cliui","dependencies":{"@isaacs/cliui":"@isaacs/cliui@8.0.2","string-width":"string-width@5.1.2","string-width-cjs":"string-width@4.2.3","strip-ansi":"strip-ansi@7.2.0","strip-ansi-cjs":"strip-ansi@6.0.1","wrap-ansi":"wrap-ansi@8.1.0","wrap-ansi-cjs":"wrap-ansi@7.0.0"}},"@jridgewell/gen-mapping@0.3.13":{"url":"./.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/gen-mapping","dependencies":{"@jridgewell/gen-mapping":"@jridgewell/gen-mapping@0.3.13","@jridgewell/sourcemap-codec":"@jridgewell/sourcemap-codec@1.5.5","@jridgewell/trace-mapping":"@jridgewell/trace-mapping@0.3.31"}},"@jridgewell/remapping@2.3.5":{"url":"./.pnpm/@jridgewell+remapping@2.3.5/node_modules/@jridgewell/remapping","dependencies":{"@jridgewell/gen-mapping":"@jridgewell/gen-mapping@0.3.13","@jridgewell/remapping":"@jridgewell/remapping@2.3.5","@jridgewell/trace-mapping":"@jridgewell/trace-mapping@0.3.31"}},"@jridgewell/resolve-uri@3.1.2":{"url":"./.pnpm/@jridgewell+resolve-uri@3.1.2/node_modules/@jridgewell/resolve-uri","dependencies":{"@jridgewell/resolve-uri":"@jridgewell/resolve-uri@3.1.2"}},"@jridgewell/sourcemap-codec@1.5.5":{"url":"./.pnpm/@jridgewell+sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec","dependencies":{"@jridgewell/sourcemap-codec":"@jridgewell/sourcemap-codec@1.5.5"}},"@jridgewell/trace-mapping@0.3.31":{"url":"./.pnpm/@jridgewell+trace-mapping@0.3.31/node_modules/@jridgewell/trace-mapping","dependencies":{"@jridgewell/resolve-uri":"@jridgewell/resolve-uri@3.1.2","@jridgewell/sourcemap-codec":"@jridgewell/sourcemap-codec@1.5.5","@jridgewell/trace-mapping":"@jridgewell/trace-mapping@0.3.31"}},"@lucide/vue@1.27.0(vue@3.5.40(typescript@5.9.3))":{"url":"./.pnpm/@lucide+vue@1.27.0_vue@3.5.40_typescript@5.9.3_/node_modules/@lucide/vue","dependencies":{"@lucide/vue":"@lucide/vue@1.27.0(vue@3.5.40(typescript@5.9.3))","vue":"vue@3.5.40(typescript@5.9.3)"}},"@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)":{"url":"./.pnpm/@napi-rs+wasm-runtime@1.1.6_4cb1ecf19345c264451f9776fa68df68/node_modules/@napi-rs/wasm-runtime","dependencies":{"@emnapi/core":"@emnapi/core@1.11.1","@emnapi/runtime":"@emnapi/runtime@1.11.1","@napi-rs/wasm-runtime":"@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)","@tybys/wasm-util":"@tybys/wasm-util@0.10.3"}},"@one-ini/wasm@0.1.1":{"url":"./.pnpm/@one-ini+wasm@0.1.1/node_modules/@one-ini/wasm","dependencies":{"@one-ini/wasm":"@one-ini/wasm@0.1.1"}},"@oxc-project/types@0.139.0":{"url":"./.pnpm/@oxc-project+types@0.139.0/node_modules/@oxc-project/types","dependencies":{"@oxc-project/types":"@oxc-project/types@0.139.0"}},"@pkgjs/parseargs@0.11.0":{"url":"./.pnpm/@pkgjs+parseargs@0.11.0/node_modules/@pkgjs/parseargs","dependencies":{"@pkgjs/parseargs":"@pkgjs/parseargs@0.11.0"}},"@rolldown/binding-android-arm64@1.1.5":{"url":"./.pnpm/@rolldown+binding-android-arm64@1.1.5/node_modules/@rolldown/binding-android-arm64","dependencies":{"@rolldown/binding-android-arm64":"@rolldown/binding-android-arm64@1.1.5"}},"@rolldown/binding-darwin-arm64@1.1.5":{"url":"./.pnpm/@rolldown+binding-darwin-arm64@1.1.5/node_modules/@rolldown/binding-darwin-arm64","dependencies":{"@rolldown/binding-darwin-arm64":"@rolldown/binding-darwin-arm64@1.1.5"}},"@rolldown/binding-darwin-x64@1.1.5":{"url":"./.pnpm/@rolldown+binding-darwin-x64@1.1.5/node_modules/@rolldown/binding-darwin-x64","dependencies":{"@rolldown/binding-darwin-x64":"@rolldown/binding-darwin-x64@1.1.5"}},"@rolldown/binding-freebsd-x64@1.1.5":{"url":"./.pnpm/@rolldown+binding-freebsd-x64@1.1.5/node_modules/@rolldown/binding-freebsd-x64","dependencies":{"@rolldown/binding-freebsd-x64":"@rolldown/binding-freebsd-x64@1.1.5"}},"@rolldown/binding-linux-arm-gnueabihf@1.1.5":{"url":"./.pnpm/@rolldown+binding-linux-arm-gnueabihf@1.1.5/node_modules/@rolldown/binding-linux-arm-gnueabihf","dependencies":{"@rolldown/binding-linux-arm-gnueabihf":"@rolldown/binding-linux-arm-gnueabihf@1.1.5"}},"@rolldown/binding-linux-arm64-gnu@1.1.5":{"url":"./.pnpm/@rolldown+binding-linux-arm64-gnu@1.1.5/node_modules/@rolldown/binding-linux-arm64-gnu","dependencies":{"@rolldown/binding-linux-arm64-gnu":"@rolldown/binding-linux-arm64-gnu@1.1.5"}},"@rolldown/binding-linux-arm64-musl@1.1.5":{"url":"./.pnpm/@rolldown+binding-linux-arm64-musl@1.1.5/node_modules/@rolldown/binding-linux-arm64-musl","dependencies":{"@rolldown/binding-linux-arm64-musl":"@rolldown/binding-linux-arm64-musl@1.1.5"}},"@rolldown/binding-linux-ppc64-gnu@1.1.5":{"url":"./.pnpm/@rolldown+binding-linux-ppc64-gnu@1.1.5/node_modules/@rolldown/binding-linux-ppc64-gnu","dependencies":{"@rolldown/binding-linux-ppc64-gnu":"@rolldown/binding-linux-ppc64-gnu@1.1.5"}},"@rolldown/binding-linux-s390x-gnu@1.1.5":{"url":"./.pnpm/@rolldown+binding-linux-s390x-gnu@1.1.5/node_modules/@rolldown/binding-linux-s390x-gnu","dependencies":{"@rolldown/binding-linux-s390x-gnu":"@rolldown/binding-linux-s390x-gnu@1.1.5"}},"@rolldown/binding-linux-x64-gnu@1.1.5":{"url":"./.pnpm/@rolldown+binding-linux-x64-gnu@1.1.5/node_modules/@rolldown/binding-linux-x64-gnu","dependencies":{"@rolldown/binding-linux-x64-gnu":"@rolldown/binding-linux-x64-gnu@1.1.5"}},"@rolldown/binding-linux-x64-musl@1.1.5":{"url":"./.pnpm/@rolldown+binding-linux-x64-musl@1.1.5/node_modules/@rolldown/binding-linux-x64-musl","dependencies":{"@rolldown/binding-linux-x64-musl":"@rolldown/binding-linux-x64-musl@1.1.5"}},"@rolldown/binding-openharmony-arm64@1.1.5":{"url":"./.pnpm/@rolldown+binding-openharmony-arm64@1.1.5/node_modules/@rolldown/binding-openharmony-arm64","dependencies":{"@rolldown/binding-openharmony-arm64":"@rolldown/binding-openharmony-arm64@1.1.5"}},"@rolldown/binding-wasm32-wasi@1.1.5":{"url":"./.pnpm/@rolldown+binding-wasm32-wasi@1.1.5/node_modules/@rolldown/binding-wasm32-wasi","dependencies":{"@emnapi/core":"@emnapi/core@1.11.1","@emnapi/runtime":"@emnapi/runtime@1.11.1","@napi-rs/wasm-runtime":"@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)","@rolldown/binding-wasm32-wasi":"@rolldown/binding-wasm32-wasi@1.1.5"}},"@rolldown/binding-win32-arm64-msvc@1.1.5":{"url":"./.pnpm/@rolldown+binding-win32-arm64-msvc@1.1.5/node_modules/@rolldown/binding-win32-arm64-msvc","dependencies":{"@rolldown/binding-win32-arm64-msvc":"@rolldown/binding-win32-arm64-msvc@1.1.5"}},"@rolldown/binding-win32-x64-msvc@1.1.5":{"url":"./.pnpm/@rolldown+binding-win32-x64-msvc@1.1.5/node_modules/@rolldown/binding-win32-x64-msvc","dependencies":{"@rolldown/binding-win32-x64-msvc":"@rolldown/binding-win32-x64-msvc@1.1.5"}},"@rolldown/pluginutils@1.0.1":{"url":"./.pnpm/@rolldown+pluginutils@1.0.1/node_modules/@rolldown/pluginutils","dependencies":{"@rolldown/pluginutils":"@rolldown/pluginutils@1.0.1"}},"@standard-schema/spec@1.1.0":{"url":"./.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec","dependencies":{"@standard-schema/spec":"@standard-schema/spec@1.1.0"}},"@sxzz/popperjs-es@2.11.8":{"url":"./.pnpm/@sxzz+popperjs-es@2.11.8/node_modules/@sxzz/popperjs-es","dependencies":{"@sxzz/popperjs-es":"@sxzz/popperjs-es@2.11.8"}},"@tybys/wasm-util@0.10.3":{"url":"./.pnpm/@tybys+wasm-util@0.10.3/node_modules/@tybys/wasm-util","dependencies":{"@tybys/wasm-util":"@tybys/wasm-util@0.10.3","tslib":"tslib@2.8.1"}},"@types/chai@5.2.3":{"url":"./.pnpm/@types+chai@5.2.3/node_modules/@types/chai","dependencies":{"@types/chai":"@types/chai@5.2.3","@types/deep-eql":"@types/deep-eql@4.0.2","assertion-error":"assertion-error@2.0.1"}},"@types/deep-eql@4.0.2":{"url":"./.pnpm/@types+deep-eql@4.0.2/node_modules/@types/deep-eql","dependencies":{"@types/deep-eql":"@types/deep-eql@4.0.2"}},"@types/estree@1.0.9":{"url":"./.pnpm/@types+estree@1.0.9/node_modules/@types/estree","dependencies":{"@types/estree":"@types/estree@1.0.9"}},"@types/jsesc@2.5.1":{"url":"./.pnpm/@types+jsesc@2.5.1/node_modules/@types/jsesc","dependencies":{"@types/jsesc":"@types/jsesc@2.5.1"}},"@types/lodash-es@4.17.12":{"url":"./.pnpm/@types+lodash-es@4.17.12/node_modules/@types/lodash-es","dependencies":{"@types/lodash":"@types/lodash@4.17.24","@types/lodash-es":"@types/lodash-es@4.17.12"}},"@types/lodash@4.17.24":{"url":"./.pnpm/@types+lodash@4.17.24/node_modules/@types/lodash","dependencies":{"@types/lodash":"@types/lodash@4.17.24"}},"@types/node@24.13.3":{"url":"./.pnpm/@types+node@24.13.3/node_modules/@types/node","dependencies":{"@types/node":"@types/node@24.13.3","undici-types":"undici-types@7.18.2"}},"@types/sortablejs@1.15.9":{"url":"./.pnpm/@types+sortablejs@1.15.9/node_modules/@types/sortablejs","dependencies":{"@types/sortablejs":"@types/sortablejs@1.15.9"}},"@types/web-bluetooth@0.0.21":{"url":"./.pnpm/@types+web-bluetooth@0.0.21/node_modules/@types/web-bluetooth","dependencies":{"@types/web-bluetooth":"@types/web-bluetooth@0.0.21"}},"@vitejs/plugin-vue@6.0.8(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))":{"url":"./.pnpm/@vitejs+plugin-vue@6.0.8_vi_aff8e940ee635d9cd9071146b659acb0/node_modules/@vitejs/plugin-vue","dependencies":{"@rolldown/pluginutils":"@rolldown/pluginutils@1.0.1","@vitejs/plugin-vue":"@vitejs/plugin-vue@6.0.8(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))","vite":"vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)","vue":"vue@3.5.40(typescript@5.9.3)"}},"@vitest/expect@4.1.10":{"url":"./.pnpm/@vitest+expect@4.1.10/node_modules/@vitest/expect","dependencies":{"@standard-schema/spec":"@standard-schema/spec@1.1.0","@types/chai":"@types/chai@5.2.3","@vitest/expect":"@vitest/expect@4.1.10","@vitest/spy":"@vitest/spy@4.1.10","@vitest/utils":"@vitest/utils@4.1.10","chai":"chai@6.2.2","tinyrainbow":"tinyrainbow@3.1.0"}},"@vitest/mocker@4.1.10(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))":{"url":"./.pnpm/@vitest+mocker@4.1.10_vite@_4de309d5b8dbdc98c8d0abe1489ccfc6/node_modules/@vitest/mocker","dependencies":{"@vitest/mocker":"@vitest/mocker@4.1.10(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))","@vitest/spy":"@vitest/spy@4.1.10","estree-walker":"estree-walker@3.0.3","magic-string":"magic-string@0.30.21","vite":"vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)"}},"@vitest/pretty-format@4.1.10":{"url":"./.pnpm/@vitest+pretty-format@4.1.10/node_modules/@vitest/pretty-format","dependencies":{"@vitest/pretty-format":"@vitest/pretty-format@4.1.10","tinyrainbow":"tinyrainbow@3.1.0"}},"@vitest/runner@4.1.10":{"url":"./.pnpm/@vitest+runner@4.1.10/node_modules/@vitest/runner","dependencies":{"@vitest/runner":"@vitest/runner@4.1.10","@vitest/utils":"@vitest/utils@4.1.10","pathe":"pathe@2.0.3"}},"@vitest/snapshot@4.1.10":{"url":"./.pnpm/@vitest+snapshot@4.1.10/node_modules/@vitest/snapshot","dependencies":{"@vitest/pretty-format":"@vitest/pretty-format@4.1.10","@vitest/snapshot":"@vitest/snapshot@4.1.10","@vitest/utils":"@vitest/utils@4.1.10","magic-string":"magic-string@0.30.21","pathe":"pathe@2.0.3"}},"@vitest/spy@4.1.10":{"url":"./.pnpm/@vitest+spy@4.1.10/node_modules/@vitest/spy","dependencies":{"@vitest/spy":"@vitest/spy@4.1.10"}},"@vitest/utils@4.1.10":{"url":"./.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils","dependencies":{"@vitest/pretty-format":"@vitest/pretty-format@4.1.10","@vitest/utils":"@vitest/utils@4.1.10","convert-source-map":"convert-source-map@2.0.0","tinyrainbow":"tinyrainbow@3.1.0"}},"@volar/language-core@2.4.28":{"url":"./.pnpm/@volar+language-core@2.4.28/node_modules/@volar/language-core","dependencies":{"@volar/language-core":"@volar/language-core@2.4.28","@volar/source-map":"@volar/source-map@2.4.28"}},"@volar/source-map@2.4.28":{"url":"./.pnpm/@volar+source-map@2.4.28/node_modules/@volar/source-map","dependencies":{"@volar/source-map":"@volar/source-map@2.4.28"}},"@volar/typescript@2.4.28":{"url":"./.pnpm/@volar+typescript@2.4.28/node_modules/@volar/typescript","dependencies":{"@volar/language-core":"@volar/language-core@2.4.28","@volar/typescript":"@volar/typescript@2.4.28","path-browserify":"path-browserify@1.0.1","vscode-uri":"vscode-uri@3.1.0"}},"@vue-macros/common@3.1.4(vue@3.5.40(typescript@5.9.3))":{"url":"./.pnpm/@vue-macros+common@3.1.4_vue@3.5.40_typescript@5.9.3_/node_modules/@vue-macros/common","dependencies":{"@vue-macros/common":"@vue-macros/common@3.1.4(vue@3.5.40(typescript@5.9.3))","@vue/compiler-sfc":"@vue/compiler-sfc@3.5.40","ast-kit":"ast-kit@2.2.0","local-pkg":"local-pkg@1.2.1","magic-string-ast":"magic-string-ast@1.0.3","unplugin-utils":"unplugin-utils@0.3.2","vue":"vue@3.5.40(typescript@5.9.3)"}},"@vue/compiler-core@3.5.40":{"url":"./.pnpm/@vue+compiler-core@3.5.40/node_modules/@vue/compiler-core","dependencies":{"@babel/parser":"@babel/parser@7.29.7","@vue/compiler-core":"@vue/compiler-core@3.5.40","@vue/shared":"@vue/shared@3.5.40","entities":"entities@7.0.1","estree-walker":"estree-walker@2.0.2","source-map-js":"source-map-js@1.2.1"}},"@vue/compiler-dom@3.5.40":{"url":"./.pnpm/@vue+compiler-dom@3.5.40/node_modules/@vue/compiler-dom","dependencies":{"@vue/compiler-core":"@vue/compiler-core@3.5.40","@vue/compiler-dom":"@vue/compiler-dom@3.5.40","@vue/shared":"@vue/shared@3.5.40"}},"@vue/compiler-sfc@3.5.40":{"url":"./.pnpm/@vue+compiler-sfc@3.5.40/node_modules/@vue/compiler-sfc","dependencies":{"@babel/parser":"@babel/parser@7.29.7","@vue/compiler-core":"@vue/compiler-core@3.5.40","@vue/compiler-dom":"@vue/compiler-dom@3.5.40","@vue/compiler-sfc":"@vue/compiler-sfc@3.5.40","@vue/compiler-ssr":"@vue/compiler-ssr@3.5.40","@vue/shared":"@vue/shared@3.5.40","estree-walker":"estree-walker@2.0.2","magic-string":"magic-string@0.30.21","postcss":"postcss@8.5.23","source-map-js":"source-map-js@1.2.1"}},"@vue/compiler-ssr@3.5.40":{"url":"./.pnpm/@vue+compiler-ssr@3.5.40/node_modules/@vue/compiler-ssr","dependencies":{"@vue/compiler-dom":"@vue/compiler-dom@3.5.40","@vue/compiler-ssr":"@vue/compiler-ssr@3.5.40","@vue/shared":"@vue/shared@3.5.40"}},"@vue/devtools-api@8.2.1":{"url":"./.pnpm/@vue+devtools-api@8.2.1/node_modules/@vue/devtools-api","dependencies":{"@vue/devtools-api":"@vue/devtools-api@8.2.1","@vue/devtools-kit":"@vue/devtools-kit@8.2.1"}},"@vue/devtools-kit@8.2.1":{"url":"./.pnpm/@vue+devtools-kit@8.2.1/node_modules/@vue/devtools-kit","dependencies":{"@vue/devtools-kit":"@vue/devtools-kit@8.2.1","@vue/devtools-shared":"@vue/devtools-shared@8.2.1","birpc":"birpc@2.9.0","hookable":"hookable@5.5.3","perfect-debounce":"perfect-debounce@2.1.0"}},"@vue/devtools-shared@8.2.1":{"url":"./.pnpm/@vue+devtools-shared@8.2.1/node_modules/@vue/devtools-shared","dependencies":{"@vue/devtools-shared":"@vue/devtools-shared@8.2.1"}},"@vue/language-core@3.3.8":{"url":"./.pnpm/@vue+language-core@3.3.8/node_modules/@vue/language-core","dependencies":{"@volar/language-core":"@volar/language-core@2.4.28","@vue/compiler-dom":"@vue/compiler-dom@3.5.40","@vue/language-core":"@vue/language-core@3.3.8","@vue/shared":"@vue/shared@3.5.40","alien-signals":"alien-signals@3.2.1","muggle-string":"muggle-string@0.4.1","path-browserify":"path-browserify@1.0.1","picomatch":"picomatch@4.0.5"}},"@vue/reactivity@3.5.40":{"url":"./.pnpm/@vue+reactivity@3.5.40/node_modules/@vue/reactivity","dependencies":{"@vue/reactivity":"@vue/reactivity@3.5.40","@vue/shared":"@vue/shared@3.5.40"}},"@vue/runtime-core@3.5.40":{"url":"./.pnpm/@vue+runtime-core@3.5.40/node_modules/@vue/runtime-core","dependencies":{"@vue/reactivity":"@vue/reactivity@3.5.40","@vue/runtime-core":"@vue/runtime-core@3.5.40","@vue/shared":"@vue/shared@3.5.40"}},"@vue/runtime-dom@3.5.40":{"url":"./.pnpm/@vue+runtime-dom@3.5.40/node_modules/@vue/runtime-dom","dependencies":{"@vue/reactivity":"@vue/reactivity@3.5.40","@vue/runtime-core":"@vue/runtime-core@3.5.40","@vue/runtime-dom":"@vue/runtime-dom@3.5.40","@vue/shared":"@vue/shared@3.5.40","csstype":"csstype@3.2.3"}},"@vue/server-renderer@3.5.40":{"url":"./.pnpm/@vue+server-renderer@3.5.40/node_modules/@vue/server-renderer","dependencies":{"@vue/compiler-ssr":"@vue/compiler-ssr@3.5.40","@vue/runtime-dom":"@vue/runtime-dom@3.5.40","@vue/server-renderer":"@vue/server-renderer@3.5.40","@vue/shared":"@vue/shared@3.5.40"}},"@vue/shared@3.5.40":{"url":"./.pnpm/@vue+shared@3.5.40/node_modules/@vue/shared","dependencies":{"@vue/shared":"@vue/shared@3.5.40"}},"@vue/test-utils@2.4.11(@vue/compiler-dom@3.5.40)(@vue/server-renderer@3.5.40)(vue@3.5.40(typescript@5.9.3))":{"url":"./.pnpm/@vue+test-utils@2.4.11_@vue_e8c95f6be4ba3aa4aa11ed14b41f32fd/node_modules/@vue/test-utils","dependencies":{"@vue/compiler-dom":"@vue/compiler-dom@3.5.40","@vue/server-renderer":"@vue/server-renderer@3.5.40","@vue/test-utils":"@vue/test-utils@2.4.11(@vue/compiler-dom@3.5.40)(@vue/server-renderer@3.5.40)(vue@3.5.40(typescript@5.9.3))","js-beautify":"js-beautify@1.15.4","vue":"vue@3.5.40(typescript@5.9.3)","vue-component-type-helpers":"vue-component-type-helpers@3.3.8"}},"@vueuse/core@14.3.0(vue@3.5.40(typescript@5.9.3))":{"url":"./.pnpm/@vueuse+core@14.3.0_vue@3.5.40_typescript@5.9.3_/node_modules/@vueuse/core","dependencies":{"@types/web-bluetooth":"@types/web-bluetooth@0.0.21","@vueuse/core":"@vueuse/core@14.3.0(vue@3.5.40(typescript@5.9.3))","@vueuse/metadata":"@vueuse/metadata@14.3.0","@vueuse/shared":"@vueuse/shared@14.3.0(vue@3.5.40(typescript@5.9.3))","vue":"vue@3.5.40(typescript@5.9.3)"}},"@vueuse/metadata@14.3.0":{"url":"./.pnpm/@vueuse+metadata@14.3.0/node_modules/@vueuse/metadata","dependencies":{"@vueuse/metadata":"@vueuse/metadata@14.3.0"}},"@vueuse/shared@14.3.0(vue@3.5.40(typescript@5.9.3))":{"url":"./.pnpm/@vueuse+shared@14.3.0_vue@3.5.40_typescript@5.9.3_/node_modules/@vueuse/shared","dependencies":{"@vueuse/shared":"@vueuse/shared@14.3.0(vue@3.5.40(typescript@5.9.3))","vue":"vue@3.5.40(typescript@5.9.3)"}},"abbrev@2.0.0":{"url":"./.pnpm/abbrev@2.0.0/node_modules/abbrev","dependencies":{"abbrev":"abbrev@2.0.0"}},"acorn@8.17.0":{"url":"./.pnpm/acorn@8.17.0/node_modules/acorn","dependencies":{"acorn":"acorn@8.17.0"}},"agent-base@6.0.2":{"url":"./.pnpm/agent-base@6.0.2/node_modules/agent-base","dependencies":{"agent-base":"agent-base@6.0.2","debug":"debug@4.4.3"}},"alien-signals@3.2.1":{"url":"./.pnpm/alien-signals@3.2.1/node_modules/alien-signals","dependencies":{"alien-signals":"alien-signals@3.2.1"}},"ansi-regex@5.0.1":{"url":"./.pnpm/ansi-regex@5.0.1/node_modules/ansi-regex","dependencies":{"ansi-regex":"ansi-regex@5.0.1"}},"ansi-regex@6.2.2":{"url":"./.pnpm/ansi-regex@6.2.2/node_modules/ansi-regex","dependencies":{"ansi-regex":"ansi-regex@6.2.2"}},"ansi-styles@4.3.0":{"url":"./.pnpm/ansi-styles@4.3.0/node_modules/ansi-styles","dependencies":{"ansi-styles":"ansi-styles@4.3.0","color-convert":"color-convert@2.0.1"}},"ansi-styles@6.2.3":{"url":"./.pnpm/ansi-styles@6.2.3/node_modules/ansi-styles","dependencies":{"ansi-styles":"ansi-styles@6.2.3"}},"assertion-error@2.0.1":{"url":"./.pnpm/assertion-error@2.0.1/node_modules/assertion-error","dependencies":{"assertion-error":"assertion-error@2.0.1"}},"ast-kit@2.2.0":{"url":"./.pnpm/ast-kit@2.2.0/node_modules/ast-kit","dependencies":{"@babel/parser":"@babel/parser@7.29.7","ast-kit":"ast-kit@2.2.0","pathe":"pathe@2.0.3"}},"ast-walker-scope@0.9.0":{"url":"./.pnpm/ast-walker-scope@0.9.0/node_modules/ast-walker-scope","dependencies":{"@babel/parser":"@babel/parser@7.29.7","@babel/types":"@babel/types@7.29.7","ast-kit":"ast-kit@2.2.0","ast-walker-scope":"ast-walker-scope@0.9.0"}},"async-validator@4.2.5":{"url":"./.pnpm/async-validator@4.2.5/node_modules/async-validator","dependencies":{"async-validator":"async-validator@4.2.5"}},"asynckit@0.4.0":{"url":"./.pnpm/asynckit@0.4.0/node_modules/asynckit","dependencies":{"asynckit":"asynckit@0.4.0"}},"axios@1.18.1(debug@4.4.3)":{"url":"./.pnpm/axios@1.18.1_debug@4.4.3/node_modules/axios","dependencies":{"axios":"axios@1.18.1(debug@4.4.3)","follow-redirects":"follow-redirects@1.16.0(debug@4.4.3)","form-data":"form-data@4.0.6","https-proxy-agent":"https-proxy-agent@5.0.1","proxy-from-env":"proxy-from-env@2.1.0"}},"balanced-match@1.0.2":{"url":"./.pnpm/balanced-match@1.0.2/node_modules/balanced-match","dependencies":{"balanced-match":"balanced-match@1.0.2"}},"bidi-js@1.0.3":{"url":"./.pnpm/bidi-js@1.0.3/node_modules/bidi-js","dependencies":{"bidi-js":"bidi-js@1.0.3","require-from-string":"require-from-string@2.0.2"}},"birpc@2.9.0":{"url":"./.pnpm/birpc@2.9.0/node_modules/birpc","dependencies":{"birpc":"birpc@2.9.0"}},"brace-expansion@2.1.2":{"url":"./.pnpm/brace-expansion@2.1.2/node_modules/brace-expansion","dependencies":{"balanced-match":"balanced-match@1.0.2","brace-expansion":"brace-expansion@2.1.2"}},"call-bind-apply-helpers@1.0.2":{"url":"./.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers","dependencies":{"call-bind-apply-helpers":"call-bind-apply-helpers@1.0.2","es-errors":"es-errors@1.3.0","function-bind":"function-bind@1.1.2"}},"chai@6.2.2":{"url":"./.pnpm/chai@6.2.2/node_modules/chai","dependencies":{"chai":"chai@6.2.2"}},"chokidar@5.0.0":{"url":"./.pnpm/chokidar@5.0.0/node_modules/chokidar","dependencies":{"chokidar":"chokidar@5.0.0","readdirp":"readdirp@5.0.0"}},"color-convert@2.0.1":{"url":"./.pnpm/color-convert@2.0.1/node_modules/color-convert","dependencies":{"color-convert":"color-convert@2.0.1","color-name":"color-name@1.1.4"}},"color-name@1.1.4":{"url":"./.pnpm/color-name@1.1.4/node_modules/color-name","dependencies":{"color-name":"color-name@1.1.4"}},"combined-stream@1.0.8":{"url":"./.pnpm/combined-stream@1.0.8/node_modules/combined-stream","dependencies":{"combined-stream":"combined-stream@1.0.8","delayed-stream":"delayed-stream@1.0.0"}},"commander@10.0.1":{"url":"./.pnpm/commander@10.0.1/node_modules/commander","dependencies":{"commander":"commander@10.0.1"}},"confbox@0.1.8":{"url":"./.pnpm/confbox@0.1.8/node_modules/confbox","dependencies":{"confbox":"confbox@0.1.8"}},"confbox@0.2.4":{"url":"./.pnpm/confbox@0.2.4/node_modules/confbox","dependencies":{"confbox":"confbox@0.2.4"}},"config-chain@1.1.13":{"url":"./.pnpm/config-chain@1.1.13/node_modules/config-chain","dependencies":{"config-chain":"config-chain@1.1.13","ini":"ini@1.3.8","proto-list":"proto-list@1.2.4"}},"convert-source-map@2.0.0":{"url":"./.pnpm/convert-source-map@2.0.0/node_modules/convert-source-map","dependencies":{"convert-source-map":"convert-source-map@2.0.0"}},"cross-spawn@7.0.6":{"url":"./.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn","dependencies":{"cross-spawn":"cross-spawn@7.0.6","path-key":"path-key@3.1.1","shebang-command":"shebang-command@2.0.0","which":"which@2.0.2"}},"css-tree@3.2.1":{"url":"./.pnpm/css-tree@3.2.1/node_modules/css-tree","dependencies":{"css-tree":"css-tree@3.2.1","mdn-data":"mdn-data@2.27.1","source-map-js":"source-map-js@1.2.1"}},"csstype@3.2.3":{"url":"./.pnpm/csstype@3.2.3/node_modules/csstype","dependencies":{"csstype":"csstype@3.2.3"}},"data-urls@7.0.0":{"url":"./.pnpm/data-urls@7.0.0/node_modules/data-urls","dependencies":{"data-urls":"data-urls@7.0.0","whatwg-mimetype":"whatwg-mimetype@5.0.0","whatwg-url":"whatwg-url@16.0.1"}},"dayjs@1.11.21":{"url":"./.pnpm/dayjs@1.11.21/node_modules/dayjs","dependencies":{"dayjs":"dayjs@1.11.21"}},"debug@4.4.3":{"url":"./.pnpm/debug@4.4.3/node_modules/debug","dependencies":{"debug":"debug@4.4.3","ms":"ms@2.1.3"}},"decimal.js@10.6.0":{"url":"./.pnpm/decimal.js@10.6.0/node_modules/decimal.js","dependencies":{"decimal.js":"decimal.js@10.6.0"}},"delayed-stream@1.0.0":{"url":"./.pnpm/delayed-stream@1.0.0/node_modules/delayed-stream","dependencies":{"delayed-stream":"delayed-stream@1.0.0"}},"detect-libc@2.1.2":{"url":"./.pnpm/detect-libc@2.1.2/node_modules/detect-libc","dependencies":{"detect-libc":"detect-libc@2.1.2"}},"dunder-proto@1.0.1":{"url":"./.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto","dependencies":{"call-bind-apply-helpers":"call-bind-apply-helpers@1.0.2","dunder-proto":"dunder-proto@1.0.1","es-errors":"es-errors@1.3.0","gopd":"gopd@1.2.0"}},"eastasianwidth@0.2.0":{"url":"./.pnpm/eastasianwidth@0.2.0/node_modules/eastasianwidth","dependencies":{"eastasianwidth":"eastasianwidth@0.2.0"}},"editorconfig@1.0.7":{"url":"./.pnpm/editorconfig@1.0.7/node_modules/editorconfig","dependencies":{"@one-ini/wasm":"@one-ini/wasm@0.1.1","commander":"commander@10.0.1","editorconfig":"editorconfig@1.0.7","minimatch":"minimatch@9.0.9","semver":"semver@7.8.5"}},"element-plus@2.14.3(vue@3.5.40(typescript@5.9.3))":{"url":"./.pnpm/element-plus@2.14.3_vue@3.5.40_typescript@5.9.3_/node_modules/element-plus","dependencies":{"@ctrl/tinycolor":"@ctrl/tinycolor@4.2.0","@element-plus/icons-vue":"@element-plus/icons-vue@2.3.2(vue@3.5.40(typescript@5.9.3))","@floating-ui/dom":"@floating-ui/dom@1.8.0","@popperjs/core":"@sxzz/popperjs-es@2.11.8","@types/lodash":"@types/lodash@4.17.24","@types/lodash-es":"@types/lodash-es@4.17.12","@vueuse/core":"@vueuse/core@14.3.0(vue@3.5.40(typescript@5.9.3))","async-validator":"async-validator@4.2.5","dayjs":"dayjs@1.11.21","element-plus":"element-plus@2.14.3(vue@3.5.40(typescript@5.9.3))","lodash":"lodash@4.18.1","lodash-es":"lodash-es@4.18.1","lodash-unified":"lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1)","memoize-one":"memoize-one@6.0.0","normalize-wheel-es":"normalize-wheel-es@1.2.0","vue":"vue@3.5.40(typescript@5.9.3)","vue-component-type-helpers":"vue-component-type-helpers@3.3.8"}},"emoji-regex@8.0.0":{"url":"./.pnpm/emoji-regex@8.0.0/node_modules/emoji-regex","dependencies":{"emoji-regex":"emoji-regex@8.0.0"}},"emoji-regex@9.2.2":{"url":"./.pnpm/emoji-regex@9.2.2/node_modules/emoji-regex","dependencies":{"emoji-regex":"emoji-regex@9.2.2"}},"entities@7.0.1":{"url":"./.pnpm/entities@7.0.1/node_modules/entities","dependencies":{"entities":"entities@7.0.1"}},"entities@8.0.0":{"url":"./.pnpm/entities@8.0.0/node_modules/entities","dependencies":{"entities":"entities@8.0.0"}},"es-define-property@1.0.1":{"url":"./.pnpm/es-define-property@1.0.1/node_modules/es-define-property","dependencies":{"es-define-property":"es-define-property@1.0.1"}},"es-errors@1.3.0":{"url":"./.pnpm/es-errors@1.3.0/node_modules/es-errors","dependencies":{"es-errors":"es-errors@1.3.0"}},"es-module-lexer@2.3.1":{"url":"./.pnpm/es-module-lexer@2.3.1/node_modules/es-module-lexer","dependencies":{"es-module-lexer":"es-module-lexer@2.3.1"}},"es-object-atoms@1.1.2":{"url":"./.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms","dependencies":{"es-errors":"es-errors@1.3.0","es-object-atoms":"es-object-atoms@1.1.2"}},"es-set-tostringtag@2.1.0":{"url":"./.pnpm/es-set-tostringtag@2.1.0/node_modules/es-set-tostringtag","dependencies":{"es-errors":"es-errors@1.3.0","es-set-tostringtag":"es-set-tostringtag@2.1.0","get-intrinsic":"get-intrinsic@1.3.0","has-tostringtag":"has-tostringtag@1.0.2","hasown":"hasown@2.0.4"}},"escape-string-regexp@5.0.0":{"url":"./.pnpm/escape-string-regexp@5.0.0/node_modules/escape-string-regexp","dependencies":{"escape-string-regexp":"escape-string-regexp@5.0.0"}},"estree-walker@2.0.2":{"url":"./.pnpm/estree-walker@2.0.2/node_modules/estree-walker","dependencies":{"estree-walker":"estree-walker@2.0.2"}},"estree-walker@3.0.3":{"url":"./.pnpm/estree-walker@3.0.3/node_modules/estree-walker","dependencies":{"@types/estree":"@types/estree@1.0.9","estree-walker":"estree-walker@3.0.3"}},"expect-type@1.4.0":{"url":"./.pnpm/expect-type@1.4.0/node_modules/expect-type","dependencies":{"expect-type":"expect-type@1.4.0"}},"exsolve@1.1.0":{"url":"./.pnpm/exsolve@1.1.0/node_modules/exsolve","dependencies":{"exsolve":"exsolve@1.1.0"}},"fdir@6.5.0(picomatch@4.0.5)":{"url":"./.pnpm/fdir@6.5.0_picomatch@4.0.5/node_modules/fdir","dependencies":{"fdir":"fdir@6.5.0(picomatch@4.0.5)","picomatch":"picomatch@4.0.5"}},"follow-redirects@1.16.0(debug@4.4.3)":{"url":"./.pnpm/follow-redirects@1.16.0_debug@4.4.3/node_modules/follow-redirects","dependencies":{"debug":"debug@4.4.3","follow-redirects":"follow-redirects@1.16.0(debug@4.4.3)"}},"foreground-child@3.3.1":{"url":"./.pnpm/foreground-child@3.3.1/node_modules/foreground-child","dependencies":{"cross-spawn":"cross-spawn@7.0.6","foreground-child":"foreground-child@3.3.1","signal-exit":"signal-exit@4.1.0"}},"form-data@4.0.6":{"url":"./.pnpm/form-data@4.0.6/node_modules/form-data","dependencies":{"asynckit":"asynckit@0.4.0","combined-stream":"combined-stream@1.0.8","es-set-tostringtag":"es-set-tostringtag@2.1.0","form-data":"form-data@4.0.6","hasown":"hasown@2.0.4","mime-types":"mime-types@2.1.35"}},"fsevents@2.3.3":{"url":"./.pnpm/fsevents@2.3.3/node_modules/fsevents","dependencies":{"fsevents":"fsevents@2.3.3"}},"function-bind@1.1.2":{"url":"./.pnpm/function-bind@1.1.2/node_modules/function-bind","dependencies":{"function-bind":"function-bind@1.1.2"}},"get-intrinsic@1.3.0":{"url":"./.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic","dependencies":{"call-bind-apply-helpers":"call-bind-apply-helpers@1.0.2","es-define-property":"es-define-property@1.0.1","es-errors":"es-errors@1.3.0","es-object-atoms":"es-object-atoms@1.1.2","function-bind":"function-bind@1.1.2","get-intrinsic":"get-intrinsic@1.3.0","get-proto":"get-proto@1.0.1","gopd":"gopd@1.2.0","has-symbols":"has-symbols@1.1.0","hasown":"hasown@2.0.4","math-intrinsics":"math-intrinsics@1.1.0"}},"get-proto@1.0.1":{"url":"./.pnpm/get-proto@1.0.1/node_modules/get-proto","dependencies":{"dunder-proto":"dunder-proto@1.0.1","es-object-atoms":"es-object-atoms@1.1.2","get-proto":"get-proto@1.0.1"}},"glob@10.5.0":{"url":"./.pnpm/glob@10.5.0/node_modules/glob","dependencies":{"foreground-child":"foreground-child@3.3.1","glob":"glob@10.5.0","jackspeak":"jackspeak@3.4.3","minimatch":"minimatch@9.0.9","minipass":"minipass@7.1.3","package-json-from-dist":"package-json-from-dist@1.0.1","path-scurry":"path-scurry@1.11.1"}},"gopd@1.2.0":{"url":"./.pnpm/gopd@1.2.0/node_modules/gopd","dependencies":{"gopd":"gopd@1.2.0"}},"has-symbols@1.1.0":{"url":"./.pnpm/has-symbols@1.1.0/node_modules/has-symbols","dependencies":{"has-symbols":"has-symbols@1.1.0"}},"has-tostringtag@1.0.2":{"url":"./.pnpm/has-tostringtag@1.0.2/node_modules/has-tostringtag","dependencies":{"has-symbols":"has-symbols@1.1.0","has-tostringtag":"has-tostringtag@1.0.2"}},"hasown@2.0.4":{"url":"./.pnpm/hasown@2.0.4/node_modules/hasown","dependencies":{"function-bind":"function-bind@1.1.2","hasown":"hasown@2.0.4"}},"hookable@5.5.3":{"url":"./.pnpm/hookable@5.5.3/node_modules/hookable","dependencies":{"hookable":"hookable@5.5.3"}},"html-encoding-sniffer@6.0.0":{"url":"./.pnpm/html-encoding-sniffer@6.0.0/node_modules/html-encoding-sniffer","dependencies":{"@exodus/bytes":"@exodus/bytes@1.15.1","html-encoding-sniffer":"html-encoding-sniffer@6.0.0"}},"https-proxy-agent@5.0.1":{"url":"./.pnpm/https-proxy-agent@5.0.1/node_modules/https-proxy-agent","dependencies":{"agent-base":"agent-base@6.0.2","debug":"debug@4.4.3","https-proxy-agent":"https-proxy-agent@5.0.1"}},"ini@1.3.8":{"url":"./.pnpm/ini@1.3.8/node_modules/ini","dependencies":{"ini":"ini@1.3.8"}},"is-fullwidth-code-point@3.0.0":{"url":"./.pnpm/is-fullwidth-code-point@3.0.0/node_modules/is-fullwidth-code-point","dependencies":{"is-fullwidth-code-point":"is-fullwidth-code-point@3.0.0"}},"is-potential-custom-element-name@1.0.1":{"url":"./.pnpm/is-potential-custom-element-name@1.0.1/node_modules/is-potential-custom-element-name","dependencies":{"is-potential-custom-element-name":"is-potential-custom-element-name@1.0.1"}},"isexe@2.0.0":{"url":"./.pnpm/isexe@2.0.0/node_modules/isexe","dependencies":{"isexe":"isexe@2.0.0"}},"jackspeak@3.4.3":{"url":"./.pnpm/jackspeak@3.4.3/node_modules/jackspeak","dependencies":{"@isaacs/cliui":"@isaacs/cliui@8.0.2","@pkgjs/parseargs":"@pkgjs/parseargs@0.11.0","jackspeak":"jackspeak@3.4.3"}},"js-beautify@1.15.4":{"url":"./.pnpm/js-beautify@1.15.4/node_modules/js-beautify","dependencies":{"config-chain":"config-chain@1.1.13","editorconfig":"editorconfig@1.0.7","glob":"glob@10.5.0","js-beautify":"js-beautify@1.15.4","js-cookie":"js-cookie@3.0.8","nopt":"nopt@7.2.1"}},"js-cookie@3.0.8":{"url":"./.pnpm/js-cookie@3.0.8/node_modules/js-cookie","dependencies":{"js-cookie":"js-cookie@3.0.8"}},"js-tokens@9.0.1":{"url":"./.pnpm/js-tokens@9.0.1/node_modules/js-tokens","dependencies":{"js-tokens":"js-tokens@9.0.1"}},"jsdom@29.1.1":{"url":"./.pnpm/jsdom@29.1.1/node_modules/jsdom","dependencies":{"@asamuzakjp/css-color":"@asamuzakjp/css-color@5.1.11","@asamuzakjp/dom-selector":"@asamuzakjp/dom-selector@7.1.1","@bramus/specificity":"@bramus/specificity@2.4.2","@csstools/css-syntax-patches-for-csstree":"@csstools/css-syntax-patches-for-csstree@1.1.7(css-tree@3.2.1)","@exodus/bytes":"@exodus/bytes@1.15.1","css-tree":"css-tree@3.2.1","data-urls":"data-urls@7.0.0","decimal.js":"decimal.js@10.6.0","html-encoding-sniffer":"html-encoding-sniffer@6.0.0","is-potential-custom-element-name":"is-potential-custom-element-name@1.0.1","jsdom":"jsdom@29.1.1","lru-cache":"lru-cache@11.5.2","parse5":"parse5@8.0.1","saxes":"saxes@6.0.0","symbol-tree":"symbol-tree@3.2.4","tough-cookie":"tough-cookie@6.0.2","undici":"undici@7.29.0","w3c-xmlserializer":"w3c-xmlserializer@5.0.0","webidl-conversions":"webidl-conversions@8.0.1","whatwg-mimetype":"whatwg-mimetype@5.0.0","whatwg-url":"whatwg-url@16.0.1","xml-name-validator":"xml-name-validator@5.0.0"}},"jsesc@3.1.0":{"url":"./.pnpm/jsesc@3.1.0/node_modules/jsesc","dependencies":{"jsesc":"jsesc@3.1.0"}},"json5@2.2.3":{"url":"./.pnpm/json5@2.2.3/node_modules/json5","dependencies":{"json5":"json5@2.2.3"}},"lightningcss-android-arm64@1.33.0":{"url":"./.pnpm/lightningcss-android-arm64@1.33.0/node_modules/lightningcss-android-arm64","dependencies":{"lightningcss-android-arm64":"lightningcss-android-arm64@1.33.0"}},"lightningcss-darwin-arm64@1.33.0":{"url":"./.pnpm/lightningcss-darwin-arm64@1.33.0/node_modules/lightningcss-darwin-arm64","dependencies":{"lightningcss-darwin-arm64":"lightningcss-darwin-arm64@1.33.0"}},"lightningcss-darwin-x64@1.33.0":{"url":"./.pnpm/lightningcss-darwin-x64@1.33.0/node_modules/lightningcss-darwin-x64","dependencies":{"lightningcss-darwin-x64":"lightningcss-darwin-x64@1.33.0"}},"lightningcss-freebsd-x64@1.33.0":{"url":"./.pnpm/lightningcss-freebsd-x64@1.33.0/node_modules/lightningcss-freebsd-x64","dependencies":{"lightningcss-freebsd-x64":"lightningcss-freebsd-x64@1.33.0"}},"lightningcss-linux-arm-gnueabihf@1.33.0":{"url":"./.pnpm/lightningcss-linux-arm-gnueabihf@1.33.0/node_modules/lightningcss-linux-arm-gnueabihf","dependencies":{"lightningcss-linux-arm-gnueabihf":"lightningcss-linux-arm-gnueabihf@1.33.0"}},"lightningcss-linux-arm64-gnu@1.33.0":{"url":"./.pnpm/lightningcss-linux-arm64-gnu@1.33.0/node_modules/lightningcss-linux-arm64-gnu","dependencies":{"lightningcss-linux-arm64-gnu":"lightningcss-linux-arm64-gnu@1.33.0"}},"lightningcss-linux-arm64-musl@1.33.0":{"url":"./.pnpm/lightningcss-linux-arm64-musl@1.33.0/node_modules/lightningcss-linux-arm64-musl","dependencies":{"lightningcss-linux-arm64-musl":"lightningcss-linux-arm64-musl@1.33.0"}},"lightningcss-linux-x64-gnu@1.33.0":{"url":"./.pnpm/lightningcss-linux-x64-gnu@1.33.0/node_modules/lightningcss-linux-x64-gnu","dependencies":{"lightningcss-linux-x64-gnu":"lightningcss-linux-x64-gnu@1.33.0"}},"lightningcss-linux-x64-musl@1.33.0":{"url":"./.pnpm/lightningcss-linux-x64-musl@1.33.0/node_modules/lightningcss-linux-x64-musl","dependencies":{"lightningcss-linux-x64-musl":"lightningcss-linux-x64-musl@1.33.0"}},"lightningcss-win32-arm64-msvc@1.33.0":{"url":"./.pnpm/lightningcss-win32-arm64-msvc@1.33.0/node_modules/lightningcss-win32-arm64-msvc","dependencies":{"lightningcss-win32-arm64-msvc":"lightningcss-win32-arm64-msvc@1.33.0"}},"lightningcss-win32-x64-msvc@1.33.0":{"url":"./.pnpm/lightningcss-win32-x64-msvc@1.33.0/node_modules/lightningcss-win32-x64-msvc","dependencies":{"lightningcss-win32-x64-msvc":"lightningcss-win32-x64-msvc@1.33.0"}},"lightningcss@1.33.0":{"url":"./.pnpm/lightningcss@1.33.0/node_modules/lightningcss","dependencies":{"detect-libc":"detect-libc@2.1.2","lightningcss":"lightningcss@1.33.0","lightningcss-android-arm64":"lightningcss-android-arm64@1.33.0","lightningcss-darwin-arm64":"lightningcss-darwin-arm64@1.33.0","lightningcss-darwin-x64":"lightningcss-darwin-x64@1.33.0","lightningcss-freebsd-x64":"lightningcss-freebsd-x64@1.33.0","lightningcss-linux-arm-gnueabihf":"lightningcss-linux-arm-gnueabihf@1.33.0","lightningcss-linux-arm64-gnu":"lightningcss-linux-arm64-gnu@1.33.0","lightningcss-linux-arm64-musl":"lightningcss-linux-arm64-musl@1.33.0","lightningcss-linux-x64-gnu":"lightningcss-linux-x64-gnu@1.33.0","lightningcss-linux-x64-musl":"lightningcss-linux-x64-musl@1.33.0","lightningcss-win32-arm64-msvc":"lightningcss-win32-arm64-msvc@1.33.0","lightningcss-win32-x64-msvc":"lightningcss-win32-x64-msvc@1.33.0"}},"local-pkg@1.2.1":{"url":"./.pnpm/local-pkg@1.2.1/node_modules/local-pkg","dependencies":{"local-pkg":"local-pkg@1.2.1","mlly":"mlly@1.8.2","pkg-types":"pkg-types@2.3.1","quansync":"quansync@0.2.11"}},"lodash-es@4.18.1":{"url":"./.pnpm/lodash-es@4.18.1/node_modules/lodash-es","dependencies":{"lodash-es":"lodash-es@4.18.1"}},"lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1)":{"url":"./.pnpm/lodash-unified@1.0.3_@types_168785b94d783e1b7a7274df40d5f9d9/node_modules/lodash-unified","dependencies":{"@types/lodash-es":"@types/lodash-es@4.17.12","lodash":"lodash@4.18.1","lodash-es":"lodash-es@4.18.1","lodash-unified":"lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1)"}},"lodash@4.18.1":{"url":"./.pnpm/lodash@4.18.1/node_modules/lodash","dependencies":{"lodash":"lodash@4.18.1"}},"lru-cache@10.4.3":{"url":"./.pnpm/lru-cache@10.4.3/node_modules/lru-cache","dependencies":{"lru-cache":"lru-cache@10.4.3"}},"lru-cache@11.5.2":{"url":"./.pnpm/lru-cache@11.5.2/node_modules/lru-cache","dependencies":{"lru-cache":"lru-cache@11.5.2"}},"magic-string-ast@1.0.3":{"url":"./.pnpm/magic-string-ast@1.0.3/node_modules/magic-string-ast","dependencies":{"magic-string":"magic-string@0.30.21","magic-string-ast":"magic-string-ast@1.0.3"}},"magic-string@0.30.21":{"url":"./.pnpm/magic-string@0.30.21/node_modules/magic-string","dependencies":{"@jridgewell/sourcemap-codec":"@jridgewell/sourcemap-codec@1.5.5","magic-string":"magic-string@0.30.21"}},"math-intrinsics@1.1.0":{"url":"./.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics","dependencies":{"math-intrinsics":"math-intrinsics@1.1.0"}},"mdn-data@2.27.1":{"url":"./.pnpm/mdn-data@2.27.1/node_modules/mdn-data","dependencies":{"mdn-data":"mdn-data@2.27.1"}},"memoize-one@6.0.0":{"url":"./.pnpm/memoize-one@6.0.0/node_modules/memoize-one","dependencies":{"memoize-one":"memoize-one@6.0.0"}},"mime-db@1.52.0":{"url":"./.pnpm/mime-db@1.52.0/node_modules/mime-db","dependencies":{"mime-db":"mime-db@1.52.0"}},"mime-types@2.1.35":{"url":"./.pnpm/mime-types@2.1.35/node_modules/mime-types","dependencies":{"mime-db":"mime-db@1.52.0","mime-types":"mime-types@2.1.35"}},"minimatch@9.0.9":{"url":"./.pnpm/minimatch@9.0.9/node_modules/minimatch","dependencies":{"brace-expansion":"brace-expansion@2.1.2","minimatch":"minimatch@9.0.9"}},"minipass@7.1.3":{"url":"./.pnpm/minipass@7.1.3/node_modules/minipass","dependencies":{"minipass":"minipass@7.1.3"}},"mlly@1.8.2":{"url":"./.pnpm/mlly@1.8.2/node_modules/mlly","dependencies":{"acorn":"acorn@8.17.0","mlly":"mlly@1.8.2","pathe":"pathe@2.0.3","pkg-types":"pkg-types@1.3.1","ufo":"ufo@1.6.4"}},"ms@2.1.3":{"url":"./.pnpm/ms@2.1.3/node_modules/ms","dependencies":{"ms":"ms@2.1.3"}},"muggle-string@0.4.1":{"url":"./.pnpm/muggle-string@0.4.1/node_modules/muggle-string","dependencies":{"muggle-string":"muggle-string@0.4.1"}},"nanoid@3.3.16":{"url":"./.pnpm/nanoid@3.3.16/node_modules/nanoid","dependencies":{"nanoid":"nanoid@3.3.16"}},"nopt@7.2.1":{"url":"./.pnpm/nopt@7.2.1/node_modules/nopt","dependencies":{"abbrev":"abbrev@2.0.0","nopt":"nopt@7.2.1"}},"normalize-wheel-es@1.2.0":{"url":"./.pnpm/normalize-wheel-es@1.2.0/node_modules/normalize-wheel-es","dependencies":{"normalize-wheel-es":"normalize-wheel-es@1.2.0"}},"nostics@1.2.0":{"url":"./.pnpm/nostics@1.2.0/node_modules/nostics","dependencies":{"nostics":"nostics@1.2.0"}},"obug@2.1.4":{"url":"./.pnpm/obug@2.1.4/node_modules/obug","dependencies":{"obug":"obug@2.1.4"}},"package-json-from-dist@1.0.1":{"url":"./.pnpm/package-json-from-dist@1.0.1/node_modules/package-json-from-dist","dependencies":{"package-json-from-dist":"package-json-from-dist@1.0.1"}},"parse5@8.0.1":{"url":"./.pnpm/parse5@8.0.1/node_modules/parse5","dependencies":{"entities":"entities@8.0.0","parse5":"parse5@8.0.1"}},"path-browserify@1.0.1":{"url":"./.pnpm/path-browserify@1.0.1/node_modules/path-browserify","dependencies":{"path-browserify":"path-browserify@1.0.1"}},"path-key@3.1.1":{"url":"./.pnpm/path-key@3.1.1/node_modules/path-key","dependencies":{"path-key":"path-key@3.1.1"}},"path-scurry@1.11.1":{"url":"./.pnpm/path-scurry@1.11.1/node_modules/path-scurry","dependencies":{"lru-cache":"lru-cache@10.4.3","minipass":"minipass@7.1.3","path-scurry":"path-scurry@1.11.1"}},"pathe@2.0.3":{"url":"./.pnpm/pathe@2.0.3/node_modules/pathe","dependencies":{"pathe":"pathe@2.0.3"}},"perfect-debounce@2.1.0":{"url":"./.pnpm/perfect-debounce@2.1.0/node_modules/perfect-debounce","dependencies":{"perfect-debounce":"perfect-debounce@2.1.0"}},"picocolors@1.1.1":{"url":"./.pnpm/picocolors@1.1.1/node_modules/picocolors","dependencies":{"picocolors":"picocolors@1.1.1"}},"picomatch@4.0.5":{"url":"./.pnpm/picomatch@4.0.5/node_modules/picomatch","dependencies":{"picomatch":"picomatch@4.0.5"}},"pinia@4.0.2(@vue/devtools-api@8.2.1)(typescript@5.9.3)(vue@3.5.40(typescript@5.9.3))":{"url":"./.pnpm/pinia@4.0.2_@vue+devtools-a_b92da3656e156e155ff60832373d6152/node_modules/pinia","dependencies":{"@vue/devtools-api":"@vue/devtools-api@8.2.1","nostics":"nostics@1.2.0","pinia":"pinia@4.0.2(@vue/devtools-api@8.2.1)(typescript@5.9.3)(vue@3.5.40(typescript@5.9.3))","typescript":"typescript@5.9.3","vue":"vue@3.5.40(typescript@5.9.3)"}},"pkg-types@1.3.1":{"url":"./.pnpm/pkg-types@1.3.1/node_modules/pkg-types","dependencies":{"confbox":"confbox@0.1.8","mlly":"mlly@1.8.2","pathe":"pathe@2.0.3","pkg-types":"pkg-types@1.3.1"}},"pkg-types@2.3.1":{"url":"./.pnpm/pkg-types@2.3.1/node_modules/pkg-types","dependencies":{"confbox":"confbox@0.2.4","exsolve":"exsolve@1.1.0","pathe":"pathe@2.0.3","pkg-types":"pkg-types@2.3.1"}},"postcss@8.5.23":{"url":"./.pnpm/postcss@8.5.23/node_modules/postcss","dependencies":{"nanoid":"nanoid@3.3.16","picocolors":"picocolors@1.1.1","postcss":"postcss@8.5.23","source-map-js":"source-map-js@1.2.1"}},"proto-list@1.2.4":{"url":"./.pnpm/proto-list@1.2.4/node_modules/proto-list","dependencies":{"proto-list":"proto-list@1.2.4"}},"proxy-from-env@2.1.0":{"url":"./.pnpm/proxy-from-env@2.1.0/node_modules/proxy-from-env","dependencies":{"proxy-from-env":"proxy-from-env@2.1.0"}},"punycode@2.3.1":{"url":"./.pnpm/punycode@2.3.1/node_modules/punycode","dependencies":{"punycode":"punycode@2.3.1"}},"quansync@0.2.11":{"url":"./.pnpm/quansync@0.2.11/node_modules/quansync","dependencies":{"quansync":"quansync@0.2.11"}},"readdirp@5.0.0":{"url":"./.pnpm/readdirp@5.0.0/node_modules/readdirp","dependencies":{"readdirp":"readdirp@5.0.0"}},"require-from-string@2.0.2":{"url":"./.pnpm/require-from-string@2.0.2/node_modules/require-from-string","dependencies":{"require-from-string":"require-from-string@2.0.2"}},"rolldown@1.1.5":{"url":"./.pnpm/rolldown@1.1.5/node_modules/rolldown","dependencies":{"@oxc-project/types":"@oxc-project/types@0.139.0","@rolldown/binding-android-arm64":"@rolldown/binding-android-arm64@1.1.5","@rolldown/binding-darwin-arm64":"@rolldown/binding-darwin-arm64@1.1.5","@rolldown/binding-darwin-x64":"@rolldown/binding-darwin-x64@1.1.5","@rolldown/binding-freebsd-x64":"@rolldown/binding-freebsd-x64@1.1.5","@rolldown/binding-linux-arm-gnueabihf":"@rolldown/binding-linux-arm-gnueabihf@1.1.5","@rolldown/binding-linux-arm64-gnu":"@rolldown/binding-linux-arm64-gnu@1.1.5","@rolldown/binding-linux-arm64-musl":"@rolldown/binding-linux-arm64-musl@1.1.5","@rolldown/binding-linux-ppc64-gnu":"@rolldown/binding-linux-ppc64-gnu@1.1.5","@rolldown/binding-linux-s390x-gnu":"@rolldown/binding-linux-s390x-gnu@1.1.5","@rolldown/binding-linux-x64-gnu":"@rolldown/binding-linux-x64-gnu@1.1.5","@rolldown/binding-linux-x64-musl":"@rolldown/binding-linux-x64-musl@1.1.5","@rolldown/binding-openharmony-arm64":"@rolldown/binding-openharmony-arm64@1.1.5","@rolldown/binding-wasm32-wasi":"@rolldown/binding-wasm32-wasi@1.1.5","@rolldown/binding-win32-arm64-msvc":"@rolldown/binding-win32-arm64-msvc@1.1.5","@rolldown/binding-win32-x64-msvc":"@rolldown/binding-win32-x64-msvc@1.1.5","@rolldown/pluginutils":"@rolldown/pluginutils@1.0.1","rolldown":"rolldown@1.1.5"}},"saxes@6.0.0":{"url":"./.pnpm/saxes@6.0.0/node_modules/saxes","dependencies":{"saxes":"saxes@6.0.0","xmlchars":"xmlchars@2.2.0"}},"scule@1.3.0":{"url":"./.pnpm/scule@1.3.0/node_modules/scule","dependencies":{"scule":"scule@1.3.0"}},"semver@7.8.5":{"url":"./.pnpm/semver@7.8.5/node_modules/semver","dependencies":{"semver":"semver@7.8.5"}},"shared":{"url":"../shared","dependencies":{}},"shebang-command@2.0.0":{"url":"./.pnpm/shebang-command@2.0.0/node_modules/shebang-command","dependencies":{"shebang-command":"shebang-command@2.0.0","shebang-regex":"shebang-regex@3.0.0"}},"shebang-regex@3.0.0":{"url":"./.pnpm/shebang-regex@3.0.0/node_modules/shebang-regex","dependencies":{"shebang-regex":"shebang-regex@3.0.0"}},"siginfo@2.0.0":{"url":"./.pnpm/siginfo@2.0.0/node_modules/siginfo","dependencies":{"siginfo":"siginfo@2.0.0"}},"signal-exit@4.1.0":{"url":"./.pnpm/signal-exit@4.1.0/node_modules/signal-exit","dependencies":{"signal-exit":"signal-exit@4.1.0"}},"sortablejs@1.15.7":{"url":"./.pnpm/sortablejs@1.15.7/node_modules/sortablejs","dependencies":{"sortablejs":"sortablejs@1.15.7"}},"source-map-js@1.2.1":{"url":"./.pnpm/source-map-js@1.2.1/node_modules/source-map-js","dependencies":{"source-map-js":"source-map-js@1.2.1"}},"stackback@0.0.2":{"url":"./.pnpm/stackback@0.0.2/node_modules/stackback","dependencies":{"stackback":"stackback@0.0.2"}},"std-env@4.2.0":{"url":"./.pnpm/std-env@4.2.0/node_modules/std-env","dependencies":{"std-env":"std-env@4.2.0"}},"string-width@4.2.3":{"url":"./.pnpm/string-width@4.2.3/node_modules/string-width","dependencies":{"emoji-regex":"emoji-regex@8.0.0","is-fullwidth-code-point":"is-fullwidth-code-point@3.0.0","string-width":"string-width@4.2.3","strip-ansi":"strip-ansi@6.0.1"}},"string-width@5.1.2":{"url":"./.pnpm/string-width@5.1.2/node_modules/string-width","dependencies":{"eastasianwidth":"eastasianwidth@0.2.0","emoji-regex":"emoji-regex@9.2.2","string-width":"string-width@5.1.2","strip-ansi":"strip-ansi@7.2.0"}},"strip-ansi@6.0.1":{"url":"./.pnpm/strip-ansi@6.0.1/node_modules/strip-ansi","dependencies":{"ansi-regex":"ansi-regex@5.0.1","strip-ansi":"strip-ansi@6.0.1"}},"strip-ansi@7.2.0":{"url":"./.pnpm/strip-ansi@7.2.0/node_modules/strip-ansi","dependencies":{"ansi-regex":"ansi-regex@6.2.2","strip-ansi":"strip-ansi@7.2.0"}},"strip-literal@3.1.0":{"url":"./.pnpm/strip-literal@3.1.0/node_modules/strip-literal","dependencies":{"js-tokens":"js-tokens@9.0.1","strip-literal":"strip-literal@3.1.0"}},"symbol-tree@3.2.4":{"url":"./.pnpm/symbol-tree@3.2.4/node_modules/symbol-tree","dependencies":{"symbol-tree":"symbol-tree@3.2.4"}},"tinybench@2.9.0":{"url":"./.pnpm/tinybench@2.9.0/node_modules/tinybench","dependencies":{"tinybench":"tinybench@2.9.0"}},"tinyexec@1.2.4":{"url":"./.pnpm/tinyexec@1.2.4/node_modules/tinyexec","dependencies":{"tinyexec":"tinyexec@1.2.4"}},"tinyglobby@0.2.17":{"url":"./.pnpm/tinyglobby@0.2.17/node_modules/tinyglobby","dependencies":{"fdir":"fdir@6.5.0(picomatch@4.0.5)","picomatch":"picomatch@4.0.5","tinyglobby":"tinyglobby@0.2.17"}},"tinyrainbow@3.1.0":{"url":"./.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow","dependencies":{"tinyrainbow":"tinyrainbow@3.1.0"}},"tldts-core@7.4.9":{"url":"./.pnpm/tldts-core@7.4.9/node_modules/tldts-core","dependencies":{"tldts-core":"tldts-core@7.4.9"}},"tldts@7.4.9":{"url":"./.pnpm/tldts@7.4.9/node_modules/tldts","dependencies":{"tldts":"tldts@7.4.9","tldts-core":"tldts-core@7.4.9"}},"tough-cookie@6.0.2":{"url":"./.pnpm/tough-cookie@6.0.2/node_modules/tough-cookie","dependencies":{"tldts":"tldts@7.4.9","tough-cookie":"tough-cookie@6.0.2"}},"tr46@6.0.0":{"url":"./.pnpm/tr46@6.0.0/node_modules/tr46","dependencies":{"punycode":"punycode@2.3.1","tr46":"tr46@6.0.0"}},"tslib@2.8.1":{"url":"./.pnpm/tslib@2.8.1/node_modules/tslib","dependencies":{"tslib":"tslib@2.8.1"}},"typescript@5.9.3":{"url":"./.pnpm/typescript@5.9.3/node_modules/typescript","dependencies":{"typescript":"typescript@5.9.3"}},"ufo@1.6.4":{"url":"./.pnpm/ufo@1.6.4/node_modules/ufo","dependencies":{"ufo":"ufo@1.6.4"}},"undici-types@7.18.2":{"url":"./.pnpm/undici-types@7.18.2/node_modules/undici-types","dependencies":{"undici-types":"undici-types@7.18.2"}},"undici@7.29.0":{"url":"./.pnpm/undici@7.29.0/node_modules/undici","dependencies":{"undici":"undici@7.29.0"}},"unimport@5.7.0":{"url":"./.pnpm/unimport@5.7.0/node_modules/unimport","dependencies":{"acorn":"acorn@8.17.0","escape-string-regexp":"escape-string-regexp@5.0.0","estree-walker":"estree-walker@3.0.3","local-pkg":"local-pkg@1.2.1","magic-string":"magic-string@0.30.21","mlly":"mlly@1.8.2","pathe":"pathe@2.0.3","picomatch":"picomatch@4.0.5","pkg-types":"pkg-types@2.3.1","scule":"scule@1.3.0","strip-literal":"strip-literal@3.1.0","tinyglobby":"tinyglobby@0.2.17","unimport":"unimport@5.7.0","unplugin":"unplugin@2.3.11","unplugin-utils":"unplugin-utils@0.3.2"}},"unplugin-auto-import@21.0.0(@vueuse/core@14.3.0(vue@3.5.40(typescript@5.9.3)))":{"url":"./.pnpm/unplugin-auto-import@21.0.0_407d79210ed26e1b67c9bae89ae794e7/node_modules/unplugin-auto-import","dependencies":{"@vueuse/core":"@vueuse/core@14.3.0(vue@3.5.40(typescript@5.9.3))","local-pkg":"local-pkg@1.2.1","magic-string":"magic-string@0.30.21","picomatch":"picomatch@4.0.5","unimport":"unimport@5.7.0","unplugin":"unplugin@2.3.11","unplugin-auto-import":"unplugin-auto-import@21.0.0(@vueuse/core@14.3.0(vue@3.5.40(typescript@5.9.3)))","unplugin-utils":"unplugin-utils@0.3.2"}},"unplugin-utils@0.3.2":{"url":"./.pnpm/unplugin-utils@0.3.2/node_modules/unplugin-utils","dependencies":{"pathe":"pathe@2.0.3","picomatch":"picomatch@4.0.5","unplugin-utils":"unplugin-utils@0.3.2"}},"unplugin-vue-components@32.1.0(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))":{"url":"./.pnpm/unplugin-vue-components@32._5895c473a797c7a0430a04f9edbf0e54/node_modules/unplugin-vue-components","dependencies":{"chokidar":"chokidar@5.0.0","local-pkg":"local-pkg@1.2.1","magic-string":"magic-string@0.30.21","mlly":"mlly@1.8.2","obug":"obug@2.1.4","picomatch":"picomatch@4.0.5","tinyglobby":"tinyglobby@0.2.17","unplugin":"unplugin@3.3.0(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))","unplugin-utils":"unplugin-utils@0.3.2","unplugin-vue-components":"unplugin-vue-components@32.1.0(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))","vue":"vue@3.5.40(typescript@5.9.3)"}},"unplugin@2.3.11":{"url":"./.pnpm/unplugin@2.3.11/node_modules/unplugin","dependencies":{"@jridgewell/remapping":"@jridgewell/remapping@2.3.5","acorn":"acorn@8.17.0","picomatch":"picomatch@4.0.5","unplugin":"unplugin@2.3.11","webpack-virtual-modules":"webpack-virtual-modules@0.6.2"}},"unplugin@3.3.0(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))":{"url":"./.pnpm/unplugin@3.3.0_rolldown@1.1_f6b35aa598b76edb8152c0573cfac818/node_modules/unplugin","dependencies":{"@jridgewell/remapping":"@jridgewell/remapping@2.3.5","picomatch":"picomatch@4.0.5","rolldown":"rolldown@1.1.5","unplugin":"unplugin@3.3.0(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))","vite":"vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)","webpack-virtual-modules":"webpack-virtual-modules@0.6.2"}},"vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)":{"url":"./.pnpm/vite@8.1.5_@types+node@24.13.3_yaml@2.9.0/node_modules/vite","dependencies":{"@types/node":"@types/node@24.13.3","fsevents":"fsevents@2.3.3","lightningcss":"lightningcss@1.33.0","picomatch":"picomatch@4.0.5","postcss":"postcss@8.5.23","rolldown":"rolldown@1.1.5","tinyglobby":"tinyglobby@0.2.17","vite":"vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)","yaml":"yaml@2.9.0"}},"vitest@4.1.10(@types/node@24.13.3)(jsdom@29.1.1)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))":{"url":"./.pnpm/vitest@4.1.10_@types+node@2_684c6d116269d8b9a57007d2e711980e/node_modules/vitest","dependencies":{"@types/node":"@types/node@24.13.3","@vitest/expect":"@vitest/expect@4.1.10","@vitest/mocker":"@vitest/mocker@4.1.10(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))","@vitest/pretty-format":"@vitest/pretty-format@4.1.10","@vitest/runner":"@vitest/runner@4.1.10","@vitest/snapshot":"@vitest/snapshot@4.1.10","@vitest/spy":"@vitest/spy@4.1.10","@vitest/utils":"@vitest/utils@4.1.10","es-module-lexer":"es-module-lexer@2.3.1","expect-type":"expect-type@1.4.0","jsdom":"jsdom@29.1.1","magic-string":"magic-string@0.30.21","obug":"obug@2.1.4","pathe":"pathe@2.0.3","picomatch":"picomatch@4.0.5","std-env":"std-env@4.2.0","tinybench":"tinybench@2.9.0","tinyexec":"tinyexec@1.2.4","tinyglobby":"tinyglobby@0.2.17","tinyrainbow":"tinyrainbow@3.1.0","vite":"vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)","vitest":"vitest@4.1.10(@types/node@24.13.3)(jsdom@29.1.1)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))","why-is-node-running":"why-is-node-running@2.3.0"}},"vscode-uri@3.1.0":{"url":"./.pnpm/vscode-uri@3.1.0/node_modules/vscode-uri","dependencies":{"vscode-uri":"vscode-uri@3.1.0"}},"vue-component-type-helpers@3.3.8":{"url":"./.pnpm/vue-component-type-helpers@3.3.8/node_modules/vue-component-type-helpers","dependencies":{"vue-component-type-helpers":"vue-component-type-helpers@3.3.8"}},"vue-router@5.2.0(@vue/compiler-sfc@3.5.40)(pinia@4.0.2(@vue/devtools-api@8.2.1)(typescript@5.9.3)(vue@3.5.40(typescript@5.9.3)))(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))":{"url":"./.pnpm/vue-router@5.2.0_@vue+compi_b4a151216dd2fb3ddc479aca26abbdbb/node_modules/vue-router","dependencies":{"@babel/generator":"@babel/generator@8.0.0","@vue-macros/common":"@vue-macros/common@3.1.4(vue@3.5.40(typescript@5.9.3))","@vue/compiler-sfc":"@vue/compiler-sfc@3.5.40","@vue/devtools-api":"@vue/devtools-api@8.2.1","ast-walker-scope":"ast-walker-scope@0.9.0","chokidar":"chokidar@5.0.0","json5":"json5@2.2.3","local-pkg":"local-pkg@1.2.1","magic-string":"magic-string@0.30.21","mlly":"mlly@1.8.2","muggle-string":"muggle-string@0.4.1","nostics":"nostics@1.2.0","pathe":"pathe@2.0.3","picomatch":"picomatch@4.0.5","pinia":"pinia@4.0.2(@vue/devtools-api@8.2.1)(typescript@5.9.3)(vue@3.5.40(typescript@5.9.3))","scule":"scule@1.3.0","tinyglobby":"tinyglobby@0.2.17","unplugin":"unplugin@3.3.0(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))","unplugin-utils":"unplugin-utils@0.3.2","vite":"vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)","vue":"vue@3.5.40(typescript@5.9.3)","vue-router":"vue-router@5.2.0(@vue/compiler-sfc@3.5.40)(pinia@4.0.2(@vue/devtools-api@8.2.1)(typescript@5.9.3)(vue@3.5.40(typescript@5.9.3)))(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))","yaml":"yaml@2.9.0"}},"vue-tsc@3.3.8(typescript@5.9.3)":{"url":"./.pnpm/vue-tsc@3.3.8_typescript@5.9.3/node_modules/vue-tsc","dependencies":{"@volar/typescript":"@volar/typescript@2.4.28","@vue/language-core":"@vue/language-core@3.3.8","typescript":"typescript@5.9.3","vue-tsc":"vue-tsc@3.3.8(typescript@5.9.3)"}},"vue@3.5.40(typescript@5.9.3)":{"url":"./.pnpm/vue@3.5.40_typescript@5.9.3/node_modules/vue","dependencies":{"@vue/compiler-dom":"@vue/compiler-dom@3.5.40","@vue/compiler-sfc":"@vue/compiler-sfc@3.5.40","@vue/runtime-dom":"@vue/runtime-dom@3.5.40","@vue/server-renderer":"@vue/server-renderer@3.5.40","@vue/shared":"@vue/shared@3.5.40","typescript":"typescript@5.9.3","vue":"vue@3.5.40(typescript@5.9.3)"}},"w3c-xmlserializer@5.0.0":{"url":"./.pnpm/w3c-xmlserializer@5.0.0/node_modules/w3c-xmlserializer","dependencies":{"w3c-xmlserializer":"w3c-xmlserializer@5.0.0","xml-name-validator":"xml-name-validator@5.0.0"}},"webidl-conversions@8.0.1":{"url":"./.pnpm/webidl-conversions@8.0.1/node_modules/webidl-conversions","dependencies":{"webidl-conversions":"webidl-conversions@8.0.1"}},"webpack-virtual-modules@0.6.2":{"url":"./.pnpm/webpack-virtual-modules@0.6.2/node_modules/webpack-virtual-modules","dependencies":{"webpack-virtual-modules":"webpack-virtual-modules@0.6.2"}},"whatwg-mimetype@5.0.0":{"url":"./.pnpm/whatwg-mimetype@5.0.0/node_modules/whatwg-mimetype","dependencies":{"whatwg-mimetype":"whatwg-mimetype@5.0.0"}},"whatwg-url@16.0.1":{"url":"./.pnpm/whatwg-url@16.0.1/node_modules/whatwg-url","dependencies":{"@exodus/bytes":"@exodus/bytes@1.15.1","tr46":"tr46@6.0.0","webidl-conversions":"webidl-conversions@8.0.1","whatwg-url":"whatwg-url@16.0.1"}},"which@2.0.2":{"url":"./.pnpm/which@2.0.2/node_modules/which","dependencies":{"isexe":"isexe@2.0.0","which":"which@2.0.2"}},"why-is-node-running@2.3.0":{"url":"./.pnpm/why-is-node-running@2.3.0/node_modules/why-is-node-running","dependencies":{"siginfo":"siginfo@2.0.0","stackback":"stackback@0.0.2","why-is-node-running":"why-is-node-running@2.3.0"}},"wrap-ansi@7.0.0":{"url":"./.pnpm/wrap-ansi@7.0.0/node_modules/wrap-ansi","dependencies":{"ansi-styles":"ansi-styles@4.3.0","string-width":"string-width@4.2.3","strip-ansi":"strip-ansi@6.0.1","wrap-ansi":"wrap-ansi@7.0.0"}},"wrap-ansi@8.1.0":{"url":"./.pnpm/wrap-ansi@8.1.0/node_modules/wrap-ansi","dependencies":{"ansi-styles":"ansi-styles@6.2.3","string-width":"string-width@5.1.2","strip-ansi":"strip-ansi@7.2.0","wrap-ansi":"wrap-ansi@8.1.0"}},"xml-name-validator@5.0.0":{"url":"./.pnpm/xml-name-validator@5.0.0/node_modules/xml-name-validator","dependencies":{"xml-name-validator":"xml-name-validator@5.0.0"}},"xmlchars@2.2.0":{"url":"./.pnpm/xmlchars@2.2.0/node_modules/xmlchars","dependencies":{"xmlchars":"xmlchars@2.2.0"}},"yaml@2.9.0":{"url":"./.pnpm/yaml@2.9.0/node_modules/yaml","dependencies":{"yaml":"yaml@2.9.0"}}}} diff --git a/node_modules.corrupt/.pnpm-workspace-state-v1.json b/node_modules.corrupt/.pnpm-workspace-state-v1.json deleted file mode 100644 index 10d7c6db..00000000 --- a/node_modules.corrupt/.pnpm-workspace-state-v1.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "lastValidatedTimestamp": 1787208452958, - "projects": {}, - "pnpmfiles": [], - "settings": { - "autoInstallPeers": true, - "dedupeDirectDeps": false, - "dedupeInjectedDeps": true, - "dedupePeerDependents": true, - "dedupePeers": false, - "dev": true, - "excludeLinksFromLockfile": false, - "hoistPattern": [ - "*" - ], - "hoistWorkspacePackages": true, - "injectWorkspacePackages": false, - "linkWorkspacePackages": false, - "minimumReleaseAge": 1440, - "minimumReleaseAgeIgnoreMissingTime": true, - "nodeLinker": "isolated", - "optional": true, - "peersSuffixMaxLength": 1000, - "preferWorkspacePackages": false, - "production": true, - "publicHoistPattern": [] - }, - "filteredInstall": false -} diff --git a/node_modules.corrupt/.pnpm/lock.yaml b/node_modules.corrupt/.pnpm/lock.yaml deleted file mode 100644 index f9855f2d..00000000 --- a/node_modules.corrupt/.pnpm/lock.yaml +++ /dev/null @@ -1,2657 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@chongchong/shared': - specifier: link:./shared - version: link:./shared - '@lucide/vue': - specifier: ^1.27.0 - version: 1.27.0(vue@3.5.40(typescript@5.9.3)) - axios: - specifier: ^1.18.1 - version: 1.18.1(debug@4.4.3) - element-plus: - specifier: ^2.14.3 - version: 2.14.3(vue@3.5.40(typescript@5.9.3)) - pinia: - specifier: ^4.0.2 - version: 4.0.2(@vue/devtools-api@8.2.1)(typescript@5.9.3)(vue@3.5.40(typescript@5.9.3)) - sortablejs: - specifier: ^1.15.7 - version: 1.15.7 - vue: - specifier: ^3.5.40 - version: 3.5.40(typescript@5.9.3) - vue-router: - specifier: ^5.2.0 - version: 5.2.0(@vue/compiler-sfc@3.5.40)(pinia@4.0.2(@vue/devtools-api@8.2.1)(typescript@5.9.3)(vue@3.5.40(typescript@5.9.3)))(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) - devDependencies: - '@types/node': - specifier: ^24.10.0 - version: 24.13.3 - '@types/sortablejs': - specifier: ^1.15.9 - version: 1.15.9 - '@vitejs/plugin-vue': - specifier: ^6.0.8 - version: 6.0.8(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) - '@vue/test-utils': - specifier: ^2.4.11 - version: 2.4.11(@vue/compiler-dom@3.5.40)(@vue/server-renderer@3.5.40)(vue@3.5.40(typescript@5.9.3)) - jsdom: - specifier: ^29.1.1 - version: 29.1.1 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - unplugin-auto-import: - specifier: ^21.0.0 - version: 21.0.0(@vueuse/core@14.3.0(vue@3.5.40(typescript@5.9.3))) - unplugin-vue-components: - specifier: ^32.1.0 - version: 32.1.0(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) - vite: - specifier: ^8.1.5 - version: 8.1.5(@types/node@24.13.3)(yaml@2.9.0) - vitest: - specifier: ^4.1.10 - version: 4.1.10(@types/node@24.13.3)(jsdom@29.1.1)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)) - vue-tsc: - specifier: ^3.3.8 - version: 3.3.8(typescript@5.9.3) - -packages: - - '@asamuzakjp/css-color@5.1.11': - resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/dom-selector@7.1.1': - resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/generational-cache@1.0.1': - resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/nwsapi@2.3.9': - resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - - '@babel/generator@8.0.0': - resolution: {integrity: sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-string-parser@7.29.7': - resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@8.0.0': - resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/helper-validator-identifier@7.29.7': - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@8.0.4': - resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@babel/parser@7.29.7': - resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@8.0.4': - resolution: {integrity: sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==} - engines: {node: ^22.18.0 || >=24.11.0} - hasBin: true - - '@babel/types@7.29.7': - resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} - engines: {node: '>=6.9.0'} - - '@babel/types@8.0.4': - resolution: {integrity: sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==} - engines: {node: ^22.18.0 || >=24.11.0} - - '@bramus/specificity@2.4.2': - resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} - hasBin: true - - '@csstools/color-helpers@6.1.0': - resolution: {integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==} - engines: {node: '>=20.19.0'} - - '@csstools/css-calc@3.3.0': - resolution: {integrity: sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 - - '@csstools/css-color-parser@4.1.10': - resolution: {integrity: sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 - - '@csstools/css-parser-algorithms@4.0.0': - resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-tokenizer': ^4.0.0 - - '@csstools/css-syntax-patches-for-csstree@1.1.7': - resolution: {integrity: sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==} - peerDependencies: - css-tree: ^3.2.1 - peerDependenciesMeta: - css-tree: - optional: true - - '@csstools/css-tokenizer@4.0.0': - resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} - engines: {node: '>=20.19.0'} - - '@ctrl/tinycolor@4.2.0': - resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} - engines: {node: '>=14'} - - '@element-plus/icons-vue@2.3.2': - resolution: {integrity: sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==} - peerDependencies: - vue: ^3.2.0 - - '@emnapi/core@1.11.1': - resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} - - '@emnapi/runtime@1.11.1': - resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} - - '@emnapi/wasi-threads@1.2.2': - resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} - - '@exodus/bytes@1.15.1': - resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - peerDependencies: - '@noble/hashes': ^1.8.0 || ^2.0.0 - peerDependenciesMeta: - '@noble/hashes': - optional: true - - '@floating-ui/core@1.8.0': - resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} - - '@floating-ui/dom@1.8.0': - resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} - - '@floating-ui/utils@0.2.12': - resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@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/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@lucide/vue@1.27.0': - resolution: {integrity: sha512-LKDEZJ0Uo9UaT4vxBMYVwXeK/0dGcWCTdav1AK/aGD/jYsDPtiVvOgfM7jPlx9BVeyGZ1Uf0aQhHA++rmbe7rw==} - peerDependencies: - vue: '>=3.0.1' - - '@napi-rs/wasm-runtime@1.1.6': - resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 - - '@one-ini/wasm@0.1.1': - resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - - '@oxc-project/types@0.139.0': - resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@rolldown/binding-android-arm64@1.1.5': - resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@rolldown/binding-darwin-arm64@1.1.5': - resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@rolldown/binding-darwin-x64@1.1.5': - resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@rolldown/binding-freebsd-x64@1.1.5': - resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@rolldown/binding-linux-arm-gnueabihf@1.1.5': - resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@rolldown/binding-linux-arm64-gnu@1.1.5': - resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-arm64-musl@1.1.5': - resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rolldown/binding-linux-ppc64-gnu@1.1.5': - resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-s390x-gnu@1.1.5': - resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-gnu@1.1.5': - resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-musl@1.1.5': - resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rolldown/binding-openharmony-arm64@1.1.5': - resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@rolldown/binding-wasm32-wasi@1.1.5': - resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.1.5': - resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.1.5': - resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@rolldown/pluginutils@1.0.1': - resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - - '@sxzz/popperjs-es@2.11.8': - resolution: {integrity: sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==} - - '@tybys/wasm-util@0.10.3': - resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} - - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - - '@types/jsesc@2.5.1': - resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} - - '@types/lodash-es@4.17.12': - resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} - - '@types/lodash@4.17.24': - resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} - - '@types/node@24.13.3': - resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==} - - '@types/sortablejs@1.15.9': - resolution: {integrity: sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ==} - - '@types/web-bluetooth@0.0.21': - resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - - '@vitejs/plugin-vue@6.0.8': - resolution: {integrity: sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==} - engines: {node: ^20.19.0 || >=22.12.0} - peerDependencies: - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - vue: ^3.2.25 - - '@vitest/expect@4.1.10': - resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} - - '@vitest/mocker@4.1.10': - resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} - peerDependencies: - msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - - '@vitest/pretty-format@4.1.10': - resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} - - '@vitest/runner@4.1.10': - resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} - - '@vitest/snapshot@4.1.10': - resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} - - '@vitest/spy@4.1.10': - resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} - - '@vitest/utils@4.1.10': - resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} - - '@volar/language-core@2.4.28': - resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} - - '@volar/source-map@2.4.28': - resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} - - '@volar/typescript@2.4.28': - resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} - - '@vue-macros/common@3.1.4': - resolution: {integrity: sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw==} - engines: {node: '>=20.19.0'} - peerDependencies: - vue: ^2.7.0 || ^3.2.25 - peerDependenciesMeta: - vue: - optional: true - - '@vue/compiler-core@3.5.40': - resolution: {integrity: sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==} - - '@vue/compiler-dom@3.5.40': - resolution: {integrity: sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==} - - '@vue/compiler-sfc@3.5.40': - resolution: {integrity: sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==} - - '@vue/compiler-ssr@3.5.40': - resolution: {integrity: sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==} - - '@vue/devtools-api@8.2.1': - resolution: {integrity: sha512-6u4vXBlIBAC1wMplIZgpyPn7uh/s4Bf6F5bMzvLv+EdJ0aHs/+4B7Ygv864EStQSjRbsRzTko/kUG1A1IejQ3A==} - - '@vue/devtools-kit@8.2.1': - resolution: {integrity: sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==} - - '@vue/devtools-shared@8.2.1': - resolution: {integrity: sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==} - - '@vue/language-core@3.3.8': - resolution: {integrity: sha512-ieGT8jJdhhy0mGzStZhsg/qPw5bQZJg5yF+3+XU6saf4sM7yo9ZXy3h+nCwrm2+b4qS/SypkNdR2jAF3uei9tA==} - - '@vue/reactivity@3.5.40': - resolution: {integrity: sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==} - - '@vue/runtime-core@3.5.40': - resolution: {integrity: sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==} - - '@vue/runtime-dom@3.5.40': - resolution: {integrity: sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==} - - '@vue/server-renderer@3.5.40': - resolution: {integrity: sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==} - - '@vue/shared@3.5.40': - resolution: {integrity: sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==} - - '@vue/test-utils@2.4.11': - resolution: {integrity: sha512-GDqaqZsA6m2E5vNzej0aYiIb6BX8xV9pNSbbbXKOfEYwg7ZNblVX8suyqmUBThq8VIrgAJNxn+z72hVtUeiWHA==} - peerDependencies: - '@vue/compiler-dom': 3.x - '@vue/server-renderer': 3.x - vue: 3.x - peerDependenciesMeta: - '@vue/server-renderer': - optional: true - - '@vueuse/core@14.3.0': - resolution: {integrity: sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==} - peerDependencies: - vue: ^3.5.0 - - '@vueuse/metadata@14.3.0': - resolution: {integrity: sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==} - - '@vueuse/shared@14.3.0': - resolution: {integrity: sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==} - peerDependencies: - vue: ^3.5.0 - - abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - acorn@8.17.0: - resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} - engines: {node: '>=0.4.0'} - hasBin: true - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - alien-signals@3.2.1: - resolution: {integrity: sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - ast-kit@2.2.0: - resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} - engines: {node: '>=20.19.0'} - - ast-walker-scope@0.9.0: - resolution: {integrity: sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==} - engines: {node: '>=20.19.0'} - - async-validator@4.2.5: - resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - axios@1.18.1: - resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - - birpc@2.9.0: - resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} - - brace-expansion@2.1.2: - resolution: {integrity: sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} - engines: {node: '>=18'} - - chokidar@5.0.0: - resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} - engines: {node: '>= 20.19.0'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - - confbox@0.2.4: - resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} - - config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - css-tree@3.2.1: - resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - - data-urls@7.0.0: - resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - dayjs@1.11.21: - resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decimal.js@10.6.0: - resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - editorconfig@1.0.7: - resolution: {integrity: sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==} - engines: {node: '>=14'} - hasBin: true - - element-plus@2.14.3: - resolution: {integrity: sha512-pJcvxcpZjYruNzuJhAeVwnbYjfNgzBKnWHwSVEhwzM2/kcLI3brzmtIBxtPqd4hQWJfD1PRnjoc1WipLw2eBGg==} - peerDependencies: - vue: ^3.3.7 - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} - - entities@8.0.0: - resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} - engines: {node: '>=20.19.0'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@2.3.1: - resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} - - es-object-atoms@1.1.2: - resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - expect-type@1.4.0: - resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} - engines: {node: '>=12.0.0'} - - exsolve@1.1.0: - resolution: {integrity: sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - follow-redirects@1.16.0: - resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - form-data@4.0.6: - resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} - engines: {node: '>= 6'} - - 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==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - 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 - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.4: - resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} - engines: {node: '>= 0.4'} - - hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - - html-encoding-sniffer@6.0.0: - resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - js-beautify@1.15.4: - resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} - engines: {node: '>=14'} - hasBin: true - - js-cookie@3.0.8: - resolution: {integrity: sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==} - - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - - jsdom@29.1.1: - resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} - peerDependencies: - canvas: ^3.0.0 - peerDependenciesMeta: - canvas: - optional: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - lightningcss-android-arm64@1.33.0: - resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.33.0: - resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.33.0: - resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.33.0: - resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.33.0: - resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.33.0: - resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - lightningcss-linux-arm64-musl@1.33.0: - resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - - lightningcss-linux-x64-gnu@1.33.0: - resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - - lightningcss-linux-x64-musl@1.33.0: - resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [musl] - - lightningcss-win32-arm64-msvc@1.33.0: - resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.33.0: - resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.33.0: - resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} - engines: {node: '>= 12.0.0'} - - local-pkg@1.2.1: - resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} - engines: {node: '>=14'} - - lodash-es@4.18.1: - resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} - - lodash-unified@1.0.3: - resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} - peerDependencies: - '@types/lodash-es': '*' - lodash: '*' - lodash-es: '*' - - lodash@4.18.1: - resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@11.5.2: - resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} - engines: {node: 20 || >=22} - - magic-string-ast@1.0.3: - resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==} - engines: {node: '>=20.19.0'} - - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mdn-data@2.27.1: - resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - - memoize-one@6.0.0: - resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} - - 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'} - - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - - minipass@7.1.3: - resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} - engines: {node: '>=16 || 14 >=14.17'} - - mlly@1.8.2: - resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - muggle-string@0.4.1: - resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - - nanoid@3.3.16: - resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - nopt@7.2.1: - resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - - normalize-wheel-es@1.2.0: - resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} - - nostics@1.2.0: - resolution: {integrity: sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg==} - - obug@2.1.4: - resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} - engines: {node: '>=12.20.0'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - parse5@8.0.1: - resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} - - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - perfect-debounce@2.1.0: - resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@4.0.5: - resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} - engines: {node: '>=12'} - - pinia@4.0.2: - resolution: {integrity: sha512-yKVVA7bSj5oRZFp/Ab9wLlmyb5gPUYEiIm4ryiWTe/xe7PtkRdMVOp1X1ggvq0c6Uj7Q0Du1HnV2mtAwM0Ks1g==} - peerDependencies: - '@vue/devtools-api': ^8.1.5 - typescript: '>=5.6.0' - vue: ^3.5.11 - peerDependenciesMeta: - typescript: - optional: true - - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - - pkg-types@2.3.1: - resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} - - postcss@8.5.23: - resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} - engines: {node: ^10 || ^12 || >=14} - - proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - - proxy-from-env@2.1.0: - resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} - engines: {node: '>=10'} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - quansync@0.2.11: - resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - - readdirp@5.0.0: - resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} - engines: {node: '>= 20.19.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - rolldown@1.1.5: - resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - - scule@1.3.0: - resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} - - semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} - engines: {node: '>=10'} - hasBin: true - - 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'} - - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - sortablejs@1.15.7: - resolution: {integrity: sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A==} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - std-env@4.2.0: - resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} - - 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'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - - tinyexec@1.2.4: - resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} - engines: {node: '>=18'} - - tinyglobby@0.2.17: - resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} - engines: {node: '>=12.0.0'} - - tinyrainbow@3.1.0: - resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} - engines: {node: '>=14.0.0'} - - tldts-core@7.4.9: - resolution: {integrity: sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==} - - tldts@7.4.9: - resolution: {integrity: sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==} - hasBin: true - - tough-cookie@6.0.2: - resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} - engines: {node: '>=16'} - - tr46@6.0.0: - resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} - engines: {node: '>=20'} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - ufo@1.6.4: - resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - - undici@7.29.0: - resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} - engines: {node: '>=20.18.1'} - - unimport@5.7.0: - resolution: {integrity: sha512-njnL6sp8lEA8QQbZrt+52p/g4X0rw3bnGGmUcJnt1jeG8+iiqO779aGz0PirCtydAIVcuTBRlJ52F0u46z309Q==} - engines: {node: '>=18.12.0'} - - unplugin-auto-import@21.0.0: - resolution: {integrity: sha512-vWuC8SwqJmxZFYwPojhOhOXDb5xFhNNcEVb9K/RFkyk/3VnfaOjzitWN7v+8DEKpMjSsY2AEGXNgt6I0yQrhRQ==} - engines: {node: '>=20.19.0'} - 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@32.1.0: - resolution: {integrity: sha512-YiUkSxuRjab18XFOrX5VsIxXzccrfmHVGsGeJgSgklb829DQmCy9E4vvDUE4tuvZZdxyFJZX0Oc4TPnnxiiMyg==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@nuxt/kit': ^3.2.2 || ^4.0.0 - vue: ^3.0.0 - peerDependenciesMeta: - '@nuxt/kit': - optional: true - - unplugin@2.3.11: - resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} - engines: {node: '>=18.12.0'} - - unplugin@3.3.0: - resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==} - engines: {node: ^20.19.0 || >=22.12.0} - peerDependencies: - '@farmfe/core': '*' - '@rspack/core': '*' - bun-types-no-globals: '*' - esbuild: '*' - rolldown: '*' - rollup: '*' - unloader: '*' - vite: '*' - webpack: '*' - peerDependenciesMeta: - '@farmfe/core': - optional: true - '@rspack/core': - optional: true - bun-types-no-globals: - optional: true - esbuild: - optional: true - rolldown: - optional: true - rollup: - optional: true - unloader: - optional: true - vite: - optional: true - webpack: - optional: true - - vite@8.1.5: - resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.3.0 - esbuild: ^0.27.0 || ^0.28.0 - jiti: '>=1.21.0' - less: ^4.0.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - '@vitejs/devtools': - optional: true - esbuild: - optional: true - jiti: - optional: true - less: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vitest@4.1.10: - resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.10 - '@vitest/browser-preview': 4.1.10 - '@vitest/browser-webdriverio': 4.1.10 - '@vitest/coverage-istanbul': 4.1.10 - '@vitest/coverage-v8': 4.1.10 - '@vitest/ui': 4.1.10 - happy-dom: '*' - jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/coverage-istanbul': - optional: true - '@vitest/coverage-v8': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - - vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - - vue-component-type-helpers@3.3.8: - resolution: {integrity: sha512-troqCMmQodQDqUqn63NQaFi+CDSclSe7sc8VEBFqf5GFLqmGR2Ph3P2WEC7qwpRVyEWsTi/aAr4vyOe/B1hU3g==} - - vue-router@5.2.0: - resolution: {integrity: sha512-QAC5i0LEb1GLG0LXDQmHu8L7FX12j0KwU/JTKmLQUJMrn04gQdKP6Du+p0QwpHb3iy71vBlqnHQ8WAfOSAWhqw==} - peerDependencies: - '@pinia/colada': '>=0.21.2' - '@vue/compiler-sfc': ^3.5.34 || ^4.0.0 - pinia: ^3.0.4 || ^4.0.2 - vite: ^7.3.0 || ^8.0.0 - vue: ^3.5.34 || ^4.0.0 - peerDependenciesMeta: - '@pinia/colada': - optional: true - '@vue/compiler-sfc': - optional: true - pinia: - optional: true - vite: - optional: true - - vue-tsc@3.3.8: - resolution: {integrity: sha512-xXmYlVQpcwJDWyGlqbHrGVOl1h3UOsASymRibrHc+iy9j/UNnOrOn4u+fntHz4D6Cs74RtapeqVV6CzJeg+UlA==} - hasBin: true - peerDependencies: - typescript: '>=5.0.0' - - vue@3.5.40: - resolution: {integrity: sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - - webidl-conversions@8.0.1: - resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} - engines: {node: '>=20'} - - webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - - whatwg-mimetype@5.0.0: - resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} - engines: {node: '>=20'} - - whatwg-url@16.0.1: - resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - - 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'} - - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - - yaml@2.9.0: - resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} - engines: {node: '>= 14.6'} - hasBin: true - -snapshots: - - '@asamuzakjp/css-color@5.1.11': - dependencies: - '@asamuzakjp/generational-cache': 1.0.1 - '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.1.10(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - - '@asamuzakjp/dom-selector@7.1.1': - dependencies: - '@asamuzakjp/generational-cache': 1.0.1 - '@asamuzakjp/nwsapi': 2.3.9 - bidi-js: 1.0.3 - css-tree: 3.2.1 - is-potential-custom-element-name: 1.0.1 - - '@asamuzakjp/generational-cache@1.0.1': {} - - '@asamuzakjp/nwsapi@2.3.9': {} - - '@babel/generator@8.0.0': - dependencies: - '@babel/parser': 8.0.4 - '@babel/types': 8.0.4 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@types/jsesc': 2.5.1 - jsesc: 3.1.0 - - '@babel/helper-string-parser@7.29.7': {} - - '@babel/helper-string-parser@8.0.0': {} - - '@babel/helper-validator-identifier@7.29.7': {} - - '@babel/helper-validator-identifier@8.0.4': {} - - '@babel/parser@7.29.7': - dependencies: - '@babel/types': 7.29.7 - - '@babel/parser@8.0.4': - dependencies: - '@babel/types': 8.0.4 - - '@babel/types@7.29.7': - dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - - '@babel/types@8.0.4': - dependencies: - '@babel/helper-string-parser': 8.0.0 - '@babel/helper-validator-identifier': 8.0.4 - - '@bramus/specificity@2.4.2': - dependencies: - css-tree: 3.2.1 - - '@csstools/color-helpers@6.1.0': {} - - '@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - - '@csstools/css-color-parser@4.1.10(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/color-helpers': 6.1.0 - '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - - '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/css-tokenizer': 4.0.0 - - '@csstools/css-syntax-patches-for-csstree@1.1.7(css-tree@3.2.1)': - optionalDependencies: - css-tree: 3.2.1 - - '@csstools/css-tokenizer@4.0.0': {} - - '@ctrl/tinycolor@4.2.0': {} - - '@element-plus/icons-vue@2.3.2(vue@3.5.40(typescript@5.9.3))': - dependencies: - vue: 3.5.40(typescript@5.9.3) - - '@emnapi/core@1.11.1': - dependencies: - '@emnapi/wasi-threads': 1.2.2 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.11.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.2': - dependencies: - tslib: 2.8.1 - optional: true - - '@exodus/bytes@1.15.1': {} - - '@floating-ui/core@1.8.0': - dependencies: - '@floating-ui/utils': 0.2.12 - - '@floating-ui/dom@1.8.0': - dependencies: - '@floating-ui/core': 1.8.0 - '@floating-ui/utils': 0.2.12 - - '@floating-ui/utils@0.2.12': {} - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@lucide/vue@1.27.0(vue@3.5.40(typescript@5.9.3))': - dependencies: - vue: 3.5.40(typescript@5.9.3) - - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': - dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@tybys/wasm-util': 0.10.3 - optional: true - - '@one-ini/wasm@0.1.1': {} - - '@oxc-project/types@0.139.0': {} - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@rolldown/binding-android-arm64@1.1.5': - optional: true - - '@rolldown/binding-darwin-arm64@1.1.5': - optional: true - - '@rolldown/binding-darwin-x64@1.1.5': - optional: true - - '@rolldown/binding-freebsd-x64@1.1.5': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.1.5': - optional: true - - '@rolldown/binding-linux-arm64-gnu@1.1.5': - optional: true - - '@rolldown/binding-linux-arm64-musl@1.1.5': - optional: true - - '@rolldown/binding-linux-ppc64-gnu@1.1.5': - optional: true - - '@rolldown/binding-linux-s390x-gnu@1.1.5': - optional: true - - '@rolldown/binding-linux-x64-gnu@1.1.5': - optional: true - - '@rolldown/binding-linux-x64-musl@1.1.5': - optional: true - - '@rolldown/binding-openharmony-arm64@1.1.5': - optional: true - - '@rolldown/binding-wasm32-wasi@1.1.5': - dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) - optional: true - - '@rolldown/binding-win32-arm64-msvc@1.1.5': - optional: true - - '@rolldown/binding-win32-x64-msvc@1.1.5': - optional: true - - '@rolldown/pluginutils@1.0.1': {} - - '@standard-schema/spec@1.1.0': {} - - '@sxzz/popperjs-es@2.11.8': {} - - '@tybys/wasm-util@0.10.3': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/chai@5.2.3': - dependencies: - '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 - - '@types/deep-eql@4.0.2': {} - - '@types/estree@1.0.9': {} - - '@types/jsesc@2.5.1': {} - - '@types/lodash-es@4.17.12': - dependencies: - '@types/lodash': 4.17.24 - - '@types/lodash@4.17.24': {} - - '@types/node@24.13.3': - dependencies: - undici-types: 7.18.2 - - '@types/sortablejs@1.15.9': {} - - '@types/web-bluetooth@0.0.21': {} - - '@vitejs/plugin-vue@6.0.8(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))': - dependencies: - '@rolldown/pluginutils': 1.0.1 - vite: 8.1.5(@types/node@24.13.3)(yaml@2.9.0) - vue: 3.5.40(typescript@5.9.3) - - '@vitest/expect@4.1.10': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 - chai: 6.2.2 - tinyrainbow: 3.1.0 - - '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))': - dependencies: - '@vitest/spy': 4.1.10 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 8.1.5(@types/node@24.13.3)(yaml@2.9.0) - - '@vitest/pretty-format@4.1.10': - dependencies: - tinyrainbow: 3.1.0 - - '@vitest/runner@4.1.10': - dependencies: - '@vitest/utils': 4.1.10 - pathe: 2.0.3 - - '@vitest/snapshot@4.1.10': - dependencies: - '@vitest/pretty-format': 4.1.10 - '@vitest/utils': 4.1.10 - magic-string: 0.30.21 - pathe: 2.0.3 - - '@vitest/spy@4.1.10': {} - - '@vitest/utils@4.1.10': - dependencies: - '@vitest/pretty-format': 4.1.10 - convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 - - '@volar/language-core@2.4.28': - dependencies: - '@volar/source-map': 2.4.28 - - '@volar/source-map@2.4.28': {} - - '@volar/typescript@2.4.28': - dependencies: - '@volar/language-core': 2.4.28 - path-browserify: 1.0.1 - vscode-uri: 3.1.0 - - '@vue-macros/common@3.1.4(vue@3.5.40(typescript@5.9.3))': - dependencies: - '@vue/compiler-sfc': 3.5.40 - ast-kit: 2.2.0 - local-pkg: 1.2.1 - magic-string-ast: 1.0.3 - unplugin-utils: 0.3.2 - optionalDependencies: - vue: 3.5.40(typescript@5.9.3) - - '@vue/compiler-core@3.5.40': - dependencies: - '@babel/parser': 7.29.7 - '@vue/shared': 3.5.40 - entities: 7.0.1 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - - '@vue/compiler-dom@3.5.40': - dependencies: - '@vue/compiler-core': 3.5.40 - '@vue/shared': 3.5.40 - - '@vue/compiler-sfc@3.5.40': - dependencies: - '@babel/parser': 7.29.7 - '@vue/compiler-core': 3.5.40 - '@vue/compiler-dom': 3.5.40 - '@vue/compiler-ssr': 3.5.40 - '@vue/shared': 3.5.40 - estree-walker: 2.0.2 - magic-string: 0.30.21 - postcss: 8.5.23 - source-map-js: 1.2.1 - - '@vue/compiler-ssr@3.5.40': - dependencies: - '@vue/compiler-dom': 3.5.40 - '@vue/shared': 3.5.40 - - '@vue/devtools-api@8.2.1': - dependencies: - '@vue/devtools-kit': 8.2.1 - - '@vue/devtools-kit@8.2.1': - dependencies: - '@vue/devtools-shared': 8.2.1 - birpc: 2.9.0 - hookable: 5.5.3 - perfect-debounce: 2.1.0 - - '@vue/devtools-shared@8.2.1': {} - - '@vue/language-core@3.3.8': - dependencies: - '@volar/language-core': 2.4.28 - '@vue/compiler-dom': 3.5.40 - '@vue/shared': 3.5.40 - alien-signals: 3.2.1 - muggle-string: 0.4.1 - path-browserify: 1.0.1 - picomatch: 4.0.5 - - '@vue/reactivity@3.5.40': - dependencies: - '@vue/shared': 3.5.40 - - '@vue/runtime-core@3.5.40': - dependencies: - '@vue/reactivity': 3.5.40 - '@vue/shared': 3.5.40 - - '@vue/runtime-dom@3.5.40': - dependencies: - '@vue/reactivity': 3.5.40 - '@vue/runtime-core': 3.5.40 - '@vue/shared': 3.5.40 - csstype: 3.2.3 - - '@vue/server-renderer@3.5.40': - dependencies: - '@vue/compiler-ssr': 3.5.40 - '@vue/runtime-dom': 3.5.40 - '@vue/shared': 3.5.40 - - '@vue/shared@3.5.40': {} - - '@vue/test-utils@2.4.11(@vue/compiler-dom@3.5.40)(@vue/server-renderer@3.5.40)(vue@3.5.40(typescript@5.9.3))': - dependencies: - '@vue/compiler-dom': 3.5.40 - js-beautify: 1.15.4 - vue: 3.5.40(typescript@5.9.3) - vue-component-type-helpers: 3.3.8 - optionalDependencies: - '@vue/server-renderer': 3.5.40 - - '@vueuse/core@14.3.0(vue@3.5.40(typescript@5.9.3))': - dependencies: - '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 14.3.0 - '@vueuse/shared': 14.3.0(vue@3.5.40(typescript@5.9.3)) - vue: 3.5.40(typescript@5.9.3) - - '@vueuse/metadata@14.3.0': {} - - '@vueuse/shared@14.3.0(vue@3.5.40(typescript@5.9.3))': - dependencies: - vue: 3.5.40(typescript@5.9.3) - - abbrev@2.0.0: {} - - acorn@8.17.0: {} - - agent-base@6.0.2: - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - alien-signals@3.2.1: {} - - ansi-regex@5.0.1: {} - - ansi-regex@6.2.2: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.3: {} - - assertion-error@2.0.1: {} - - ast-kit@2.2.0: - dependencies: - '@babel/parser': 7.29.7 - pathe: 2.0.3 - - ast-walker-scope@0.9.0: - dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - ast-kit: 2.2.0 - - async-validator@4.2.5: {} - - asynckit@0.4.0: {} - - axios@1.18.1(debug@4.4.3): - dependencies: - follow-redirects: 1.16.0(debug@4.4.3) - form-data: 4.0.6 - https-proxy-agent: 5.0.1 - proxy-from-env: 2.1.0 - transitivePeerDependencies: - - debug - - supports-color - - balanced-match@1.0.2: {} - - bidi-js@1.0.3: - dependencies: - require-from-string: 2.0.2 - - birpc@2.9.0: {} - - brace-expansion@2.1.2: - dependencies: - balanced-match: 1.0.2 - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - chai@6.2.2: {} - - chokidar@5.0.0: - dependencies: - readdirp: 5.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@10.0.1: {} - - confbox@0.1.8: {} - - confbox@0.2.4: {} - - config-chain@1.1.13: - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 - - convert-source-map@2.0.0: {} - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - css-tree@3.2.1: - dependencies: - mdn-data: 2.27.1 - source-map-js: 1.2.1 - - csstype@3.2.3: {} - - data-urls@7.0.0: - dependencies: - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1 - transitivePeerDependencies: - - '@noble/hashes' - - dayjs@1.11.21: {} - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - decimal.js@10.6.0: {} - - delayed-stream@1.0.0: {} - - detect-libc@2.1.2: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - eastasianwidth@0.2.0: {} - - editorconfig@1.0.7: - dependencies: - '@one-ini/wasm': 0.1.1 - commander: 10.0.1 - minimatch: 9.0.9 - semver: 7.8.5 - - element-plus@2.14.3(vue@3.5.40(typescript@5.9.3)): - dependencies: - '@ctrl/tinycolor': 4.2.0 - '@element-plus/icons-vue': 2.3.2(vue@3.5.40(typescript@5.9.3)) - '@floating-ui/dom': 1.8.0 - '@popperjs/core': '@sxzz/popperjs-es@2.11.8' - '@types/lodash': 4.17.24 - '@types/lodash-es': 4.17.12 - '@vueuse/core': 14.3.0(vue@3.5.40(typescript@5.9.3)) - async-validator: 4.2.5 - dayjs: 1.11.21 - lodash: 4.18.1 - lodash-es: 4.18.1 - lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1) - memoize-one: 6.0.0 - normalize-wheel-es: 1.2.0 - vue: 3.5.40(typescript@5.9.3) - vue-component-type-helpers: 3.3.8 - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - entities@7.0.1: {} - - entities@8.0.0: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-module-lexer@2.3.1: {} - - es-object-atoms@1.1.2: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.4 - - escape-string-regexp@5.0.0: {} - - estree-walker@2.0.2: {} - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.9 - - expect-type@1.4.0: {} - - exsolve@1.1.0: {} - - fdir@6.5.0(picomatch@4.0.5): - optionalDependencies: - picomatch: 4.0.5 - - follow-redirects@1.16.0(debug@4.4.3): - optionalDependencies: - debug: 4.4.3 - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - form-data@4.0.6: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.4 - mime-types: 2.1.35 - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.4 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.2 - - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - gopd@1.2.0: {} - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.4: - dependencies: - function-bind: 1.1.2 - - hookable@5.5.3: {} - - html-encoding-sniffer@6.0.0: - dependencies: - '@exodus/bytes': 1.15.1 - transitivePeerDependencies: - - '@noble/hashes' - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - ini@1.3.8: {} - - is-fullwidth-code-point@3.0.0: {} - - is-potential-custom-element-name@1.0.1: {} - - isexe@2.0.0: {} - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - js-beautify@1.15.4: - dependencies: - config-chain: 1.1.13 - editorconfig: 1.0.7 - glob: 10.5.0 - js-cookie: 3.0.8 - nopt: 7.2.1 - - js-cookie@3.0.8: {} - - js-tokens@9.0.1: {} - - jsdom@29.1.1: - dependencies: - '@asamuzakjp/css-color': 5.1.11 - '@asamuzakjp/dom-selector': 7.1.1 - '@bramus/specificity': 2.4.2 - '@csstools/css-syntax-patches-for-csstree': 1.1.7(css-tree@3.2.1) - '@exodus/bytes': 1.15.1 - css-tree: 3.2.1 - data-urls: 7.0.0 - decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0 - is-potential-custom-element-name: 1.0.1 - lru-cache: 11.5.2 - parse5: 8.0.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 6.0.2 - undici: 7.29.0 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.1 - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - '@noble/hashes' - - jsesc@3.1.0: {} - - json5@2.2.3: {} - - lightningcss-android-arm64@1.33.0: - optional: true - - lightningcss-darwin-arm64@1.33.0: - optional: true - - lightningcss-darwin-x64@1.33.0: - optional: true - - lightningcss-freebsd-x64@1.33.0: - optional: true - - lightningcss-linux-arm-gnueabihf@1.33.0: - optional: true - - lightningcss-linux-arm64-gnu@1.33.0: - optional: true - - lightningcss-linux-arm64-musl@1.33.0: - optional: true - - lightningcss-linux-x64-gnu@1.33.0: - optional: true - - lightningcss-linux-x64-musl@1.33.0: - optional: true - - lightningcss-win32-arm64-msvc@1.33.0: - optional: true - - lightningcss-win32-x64-msvc@1.33.0: - optional: true - - lightningcss@1.33.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.33.0 - lightningcss-darwin-arm64: 1.33.0 - lightningcss-darwin-x64: 1.33.0 - lightningcss-freebsd-x64: 1.33.0 - lightningcss-linux-arm-gnueabihf: 1.33.0 - lightningcss-linux-arm64-gnu: 1.33.0 - lightningcss-linux-arm64-musl: 1.33.0 - lightningcss-linux-x64-gnu: 1.33.0 - lightningcss-linux-x64-musl: 1.33.0 - lightningcss-win32-arm64-msvc: 1.33.0 - lightningcss-win32-x64-msvc: 1.33.0 - - local-pkg@1.2.1: - dependencies: - mlly: 1.8.2 - pkg-types: 2.3.1 - quansync: 0.2.11 - - lodash-es@4.18.1: {} - - lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1): - dependencies: - '@types/lodash-es': 4.17.12 - lodash: 4.18.1 - lodash-es: 4.18.1 - - lodash@4.18.1: {} - - lru-cache@10.4.3: {} - - lru-cache@11.5.2: {} - - magic-string-ast@1.0.3: - dependencies: - magic-string: 0.30.21 - - magic-string@0.30.21: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - - math-intrinsics@1.1.0: {} - - mdn-data@2.27.1: {} - - memoize-one@6.0.0: {} - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - minimatch@9.0.9: - dependencies: - brace-expansion: 2.1.2 - - minipass@7.1.3: {} - - mlly@1.8.2: - dependencies: - acorn: 8.17.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.4 - - ms@2.1.3: {} - - muggle-string@0.4.1: {} - - nanoid@3.3.16: {} - - nopt@7.2.1: - dependencies: - abbrev: 2.0.0 - - normalize-wheel-es@1.2.0: {} - - nostics@1.2.0: {} - - obug@2.1.4: {} - - package-json-from-dist@1.0.1: {} - - parse5@8.0.1: - dependencies: - entities: 8.0.0 - - path-browserify@1.0.1: {} - - path-key@3.1.1: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.3 - - pathe@2.0.3: {} - - perfect-debounce@2.1.0: {} - - picocolors@1.1.1: {} - - picomatch@4.0.5: {} - - pinia@4.0.2(@vue/devtools-api@8.2.1)(typescript@5.9.3)(vue@3.5.40(typescript@5.9.3)): - dependencies: - '@vue/devtools-api': 8.2.1 - nostics: 1.2.0 - vue: 3.5.40(typescript@5.9.3) - optionalDependencies: - typescript: 5.9.3 - - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.8.2 - pathe: 2.0.3 - - pkg-types@2.3.1: - dependencies: - confbox: 0.2.4 - exsolve: 1.1.0 - pathe: 2.0.3 - - postcss@8.5.23: - dependencies: - nanoid: 3.3.16 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - proto-list@1.2.4: {} - - proxy-from-env@2.1.0: {} - - punycode@2.3.1: {} - - quansync@0.2.11: {} - - readdirp@5.0.0: {} - - require-from-string@2.0.2: {} - - rolldown@1.1.5: - dependencies: - '@oxc-project/types': 0.139.0 - '@rolldown/pluginutils': 1.0.1 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.1.5 - '@rolldown/binding-darwin-arm64': 1.1.5 - '@rolldown/binding-darwin-x64': 1.1.5 - '@rolldown/binding-freebsd-x64': 1.1.5 - '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 - '@rolldown/binding-linux-arm64-gnu': 1.1.5 - '@rolldown/binding-linux-arm64-musl': 1.1.5 - '@rolldown/binding-linux-ppc64-gnu': 1.1.5 - '@rolldown/binding-linux-s390x-gnu': 1.1.5 - '@rolldown/binding-linux-x64-gnu': 1.1.5 - '@rolldown/binding-linux-x64-musl': 1.1.5 - '@rolldown/binding-openharmony-arm64': 1.1.5 - '@rolldown/binding-wasm32-wasi': 1.1.5 - '@rolldown/binding-win32-arm64-msvc': 1.1.5 - '@rolldown/binding-win32-x64-msvc': 1.1.5 - - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - - scule@1.3.0: {} - - semver@7.8.5: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - siginfo@2.0.0: {} - - signal-exit@4.1.0: {} - - sortablejs@1.15.7: {} - - source-map-js@1.2.1: {} - - stackback@0.0.2: {} - - std-env@4.2.0: {} - - 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.2.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.2.2 - - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - - symbol-tree@3.2.4: {} - - tinybench@2.9.0: {} - - tinyexec@1.2.4: {} - - tinyglobby@0.2.17: - dependencies: - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 - - tinyrainbow@3.1.0: {} - - tldts-core@7.4.9: {} - - tldts@7.4.9: - dependencies: - tldts-core: 7.4.9 - - tough-cookie@6.0.2: - dependencies: - tldts: 7.4.9 - - tr46@6.0.0: - dependencies: - punycode: 2.3.1 - - tslib@2.8.1: - optional: true - - typescript@5.9.3: {} - - ufo@1.6.4: {} - - undici-types@7.18.2: {} - - undici@7.29.0: {} - - unimport@5.7.0: - dependencies: - acorn: 8.17.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.5 - pkg-types: 2.3.1 - scule: 1.3.0 - strip-literal: 3.1.0 - tinyglobby: 0.2.17 - unplugin: 2.3.11 - unplugin-utils: 0.3.2 - - unplugin-auto-import@21.0.0(@vueuse/core@14.3.0(vue@3.5.40(typescript@5.9.3))): - dependencies: - local-pkg: 1.2.1 - magic-string: 0.30.21 - picomatch: 4.0.5 - unimport: 5.7.0 - unplugin: 2.3.11 - unplugin-utils: 0.3.2 - optionalDependencies: - '@vueuse/core': 14.3.0(vue@3.5.40(typescript@5.9.3)) - - unplugin-utils@0.3.2: - dependencies: - pathe: 2.0.3 - picomatch: 4.0.5 - - unplugin-vue-components@32.1.0(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)): - dependencies: - chokidar: 5.0.0 - local-pkg: 1.2.1 - magic-string: 0.30.21 - mlly: 1.8.2 - obug: 2.1.4 - picomatch: 4.0.5 - tinyglobby: 0.2.17 - unplugin: 3.3.0(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)) - unplugin-utils: 0.3.2 - vue: 3.5.40(typescript@5.9.3) - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rolldown - - rollup - - unloader - - vite - - webpack - - unplugin@2.3.11: - dependencies: - '@jridgewell/remapping': 2.3.5 - acorn: 8.17.0 - picomatch: 4.0.5 - webpack-virtual-modules: 0.6.2 - - unplugin@3.3.0(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)): - dependencies: - '@jridgewell/remapping': 2.3.5 - picomatch: 4.0.5 - webpack-virtual-modules: 0.6.2 - optionalDependencies: - rolldown: 1.1.5 - vite: 8.1.5(@types/node@24.13.3)(yaml@2.9.0) - - vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0): - dependencies: - lightningcss: 1.33.0 - picomatch: 4.0.5 - postcss: 8.5.23 - rolldown: 1.1.5 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 24.13.3 - fsevents: 2.3.3 - yaml: 2.9.0 - - vitest@4.1.10(@types/node@24.13.3)(jsdom@29.1.1)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)): - dependencies: - '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.10 - '@vitest/runner': 4.1.10 - '@vitest/snapshot': 4.1.10 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 - es-module-lexer: 2.3.1 - expect-type: 1.4.0 - magic-string: 0.30.21 - obug: 2.1.4 - pathe: 2.0.3 - picomatch: 4.0.5 - std-env: 4.2.0 - tinybench: 2.9.0 - tinyexec: 1.2.4 - tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 - vite: 8.1.5(@types/node@24.13.3)(yaml@2.9.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 24.13.3 - jsdom: 29.1.1 - transitivePeerDependencies: - - msw - - vscode-uri@3.1.0: {} - - vue-component-type-helpers@3.3.8: {} - - vue-router@5.2.0(@vue/compiler-sfc@3.5.40)(pinia@4.0.2(@vue/devtools-api@8.2.1)(typescript@5.9.3)(vue@3.5.40(typescript@5.9.3)))(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)): - dependencies: - '@babel/generator': 8.0.0 - '@vue-macros/common': 3.1.4(vue@3.5.40(typescript@5.9.3)) - '@vue/devtools-api': 8.2.1 - ast-walker-scope: 0.9.0 - chokidar: 5.0.0 - json5: 2.2.3 - local-pkg: 1.2.1 - magic-string: 0.30.21 - mlly: 1.8.2 - muggle-string: 0.4.1 - nostics: 1.2.0 - pathe: 2.0.3 - picomatch: 4.0.5 - scule: 1.3.0 - tinyglobby: 0.2.17 - unplugin: 3.3.0(rolldown@1.1.5)(vite@8.1.5(@types/node@24.13.3)(yaml@2.9.0)) - unplugin-utils: 0.3.2 - vue: 3.5.40(typescript@5.9.3) - yaml: 2.9.0 - optionalDependencies: - '@vue/compiler-sfc': 3.5.40 - pinia: 4.0.2(@vue/devtools-api@8.2.1)(typescript@5.9.3)(vue@3.5.40(typescript@5.9.3)) - vite: 8.1.5(@types/node@24.13.3)(yaml@2.9.0) - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rolldown - - rollup - - unloader - - webpack - - vue-tsc@3.3.8(typescript@5.9.3): - dependencies: - '@volar/typescript': 2.4.28 - '@vue/language-core': 3.3.8 - typescript: 5.9.3 - - vue@3.5.40(typescript@5.9.3): - dependencies: - '@vue/compiler-dom': 3.5.40 - '@vue/compiler-sfc': 3.5.40 - '@vue/runtime-dom': 3.5.40 - '@vue/server-renderer': 3.5.40 - '@vue/shared': 3.5.40 - optionalDependencies: - typescript: 5.9.3 - - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - - webidl-conversions@8.0.1: {} - - webpack-virtual-modules@0.6.2: {} - - whatwg-mimetype@5.0.0: {} - - whatwg-url@16.0.1: - dependencies: - '@exodus/bytes': 1.15.1 - tr46: 6.0.0 - webidl-conversions: 8.0.1 - transitivePeerDependencies: - - '@noble/hashes' - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - - 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.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 - - xml-name-validator@5.0.0: {} - - xmlchars@2.2.0: {} - - yaml@2.9.0: {} diff --git a/src/app/DomesticOutboundListStates.test.ts b/src/app/DomesticOutboundListStates.test.ts index 470fa9e5..738e665a 100644 --- a/src/app/DomesticOutboundListStates.test.ts +++ b/src/app/DomesticOutboundListStates.test.ts @@ -30,7 +30,7 @@ describe('domestic outbound list state contracts', () => { const truckingDetail = source('src/modules/trucking/pages/TruckAppointmentDetailView.vue') expect(layout).toContain('') - expect(layout).toContain(':key="workspace.cacheKey(workspaceRouteId(renderedRoute))"') + expect(layout).toContain(':key="workspace.cacheKey(workspaceRouteId(renderedRoute)) + \':\' + JSON.stringify(renderedRoute.params)"') expect(oceanDetail).toContain("router.push('/ocean-bookings')") expect(truckingDetail).toContain("router.push({ name: 'trucking' })") }) diff --git a/src/app/layouts/AppLayout.test.ts b/src/app/layouts/AppLayout.test.ts index 1eed235a..8a3f58f6 100644 --- a/src/app/layouts/AppLayout.test.ts +++ b/src/app/layouts/AppLayout.test.ts @@ -125,7 +125,7 @@ describe('AppLayout', () => { expect(wrapper.get('[aria-label="消息中心"]').attributes('disabled')).toBeUndefined() expect(wrapper.text()).toContain('消息管理') expect(wrapper.text()).toContain('模板管理') - expect(wrapper.text()).not.toContain('我的消息') + expect(wrapper.text()).toContain('我的消息') const notificationTrigger = wrapper.get('.notification-trigger') expect(notificationTrigger.find('.notification-count').exists()).toBe(false) }) diff --git a/src/app/layouts/AppLayout.vue b/src/app/layouts/AppLayout.vue index ff3b690a..39bfcbff 100644 --- a/src/app/layouts/AppLayout.vue +++ b/src/app/layouts/AppLayout.vue @@ -37,7 +37,8 @@ const menuExpanded = computed(() => ( isMobileViewport.value ? mobileMenuOpen.value : !collapsed.value )) const canOpenNotificationManagement = computed(() => ( - access.can('platform:notification:task:list') + access.can('platform:notification:view') + || access.can('platform:notification:task:list') || access.can('platform:notification:template:list') )) @@ -177,6 +178,7 @@ watch(() => auth.user?.id || auth.user?.account || '', (userId, previousUserId) 消息中心 @@ -193,7 +195,7 @@ watch(() => auth.user?.id || auth.user?.account || '', (userId, previousUserId) diff --git a/src/app/router/index.test.ts b/src/app/router/index.test.ts index b4a68aeb..b316b27c 100644 --- a/src/app/router/index.test.ts +++ b/src/app/router/index.test.ts @@ -110,6 +110,7 @@ describe('admin router access metadata', () => { it('registers message-center routes with the frozen IAM permissions', () => { const expected = [ + ['notification-inbox', '/notifications', 'platform:notification:view'], ['notification-messages', '/notifications/messages', 'platform:notification:task:list'], ['notification-templates', '/notifications/templates', 'platform:notification:template:list'], ] diff --git a/src/core/auth/auth.test.ts b/src/core/auth/auth.test.ts index 93ddb1dc..eed3a8cc 100644 --- a/src/core/auth/auth.test.ts +++ b/src/core/auth/auth.test.ts @@ -1,5 +1,5 @@ import { createPinia, setActivePinia } from 'pinia' -import { beforeEach, describe, expect, it, vi } from 'vitest' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const mocks = vi.hoisted(() => ({ post: vi.fn(), @@ -89,6 +89,8 @@ describe('admin auth session', () => { mocks.refreshHandler = null }) + afterEach(() => vi.unstubAllGlobals()) + it('accepts a domestic-only token response when the test environment has no overseas services', async () => { mocks.post.mockResolvedValue(domesticOnlyLoginResponse()) mocks.listCurrentPlatformPermissionCodes.mockResolvedValue(['platform:warehouse:list']) @@ -203,6 +205,32 @@ describe('admin auth session', () => { .toBe('["platform:warehouse:list","platform:firstleg:inbound:list"]') }) + it('reuses a session rotated by another tab without refreshing it again', async () => { + const previousToken = token({ token_version: 1 }) + const rotatedToken = token({ token_version: 2 }) + localStorage.setItem('cc-admin-token', previousToken) + localStorage.setItem('cc-admin-refresh-token', 'refresh-old') + localStorage.setItem('cc-admin-permission-codes', '["platform:warehouse:list"]') + vi.stubGlobal('navigator', { + locks: { + request: vi.fn(async (_name: string, _options: LockOptions, callback: () => Promise) => { + localStorage.setItem('cc-admin-token', rotatedToken) + localStorage.setItem('cc-admin-refresh-token', 'refresh-rotated') + localStorage.setItem('cc-admin-permission-codes', '["platform:firstleg:inbound:list"]') + return callback() + }), + }, + }) + const auth = useAuthStore() + + await expect(auth.refreshSession()).resolves.toBeUndefined() + + expect(mocks.post).not.toHaveBeenCalled() + expect(auth.token).toBe(rotatedToken) + expect(auth.refreshToken).toBe('refresh-rotated') + expect([...auth.permissionCodes]).toEqual(['platform:firstleg:inbound:list']) + }) + it('does not let an in-flight refresh restore a session after logout', async () => { localStorage.setItem('cc-admin-token', token()) localStorage.setItem('cc-admin-refresh-token', 'refresh-old') diff --git a/src/core/auth/auth.ts b/src/core/auth/auth.ts index 3a893a4f..03aa5f7b 100644 --- a/src/core/auth/auth.ts +++ b/src/core/auth/auth.ts @@ -203,14 +203,9 @@ export const useAuthStore = defineStore('admin-auth', () => { observedRefreshToken, currentRefreshToken: () => localStorage.getItem(REFRESH_TOKEN_KEY) || '', reuseCurrentSession: async () => { - const storedAccessToken = localStorage.getItem(TOKEN_KEY) || '' - const storedRefreshToken = localStorage.getItem(REFRESH_TOKEN_KEY) || '' - if (!storedAccessToken || !storedRefreshToken) throw new Error('登录状态已过期') - const response = await http.post, ApiEnvelope>( - '/auth/refresh', - { refreshToken: storedRefreshToken }, - ) - await applySession(unwrapApiResponse(response), expectedGeneration) + applyStoredSession() + ensureCurrentGeneration(expectedGeneration) + if (!token.value || !refreshToken.value) throw new Error('登录状态已过期') }, refresh: async (currentRefreshToken) => { const response = await http.post, ApiEnvelope>( diff --git a/src/core/auth/crossTabRefresh.test.ts b/src/core/auth/crossTabRefresh.test.ts index 2fc9ea5c..5aeee799 100644 --- a/src/core/auth/crossTabRefresh.test.ts +++ b/src/core/auth/crossTabRefresh.test.ts @@ -1,5 +1,5 @@ import { afterEach, describe, expect, it, vi } from 'vitest' -import { coordinateCrossTabRefresh } from './crossTabRefresh' +import { coordinateCrossTabRefresh, CrossTabRefreshTimeoutError } from './crossTabRefresh' afterEach(() => vi.unstubAllGlobals()) @@ -10,7 +10,7 @@ describe('cross-tab refresh coordination', () => { const reuseCurrentSession = vi.fn(async () => 'access-new') vi.stubGlobal('navigator', { locks: { - request: vi.fn(async (_name: string, callback: () => Promise) => { + request: vi.fn(async (_name: string, _options: LockOptions, callback: () => Promise) => { currentRefreshToken = 'refresh-new' return callback() }), @@ -32,7 +32,7 @@ describe('cross-tab refresh coordination', () => { it('performs the refresh when the token has not changed', async () => { const refresh = vi.fn(async () => 'access-new') vi.stubGlobal('navigator', { - locks: { request: vi.fn(async (_name: string, callback: () => Promise) => callback()) }, + locks: { request: vi.fn(async (_name: string, _options: LockOptions, callback: () => Promise) => callback()) }, }) await expect(coordinateCrossTabRefresh({ @@ -61,4 +61,23 @@ describe('cross-tab refresh coordination', () => { expect(refresh).toHaveBeenCalledWith('refresh-old') }) + + it('aborts a refresh lock that cannot be acquired', async () => { + vi.stubGlobal('navigator', { + locks: { + request: vi.fn((_name: string, options: LockOptions) => new Promise((_resolve, reject) => { + options.signal?.addEventListener('abort', () => reject(options.signal?.reason), { once: true }) + })), + }, + }) + + await expect(coordinateCrossTabRefresh({ + lockName: 'admin-refresh', + lockTimeoutMs: 5, + observedRefreshToken: 'refresh-old', + currentRefreshToken: () => 'refresh-old', + reuseCurrentSession: vi.fn(), + refresh: vi.fn(), + })).rejects.toBeInstanceOf(CrossTabRefreshTimeoutError) + }) }) diff --git a/src/core/auth/crossTabRefresh.ts b/src/core/auth/crossTabRefresh.ts index 6f429ec1..11252f2a 100644 --- a/src/core/auth/crossTabRefresh.ts +++ b/src/core/auth/crossTabRefresh.ts @@ -1,11 +1,21 @@ export interface CrossTabRefreshOptions { lockName: string + lockTimeoutMs?: number observedRefreshToken: string currentRefreshToken: () => string reuseCurrentSession: () => Promise refresh: (refreshToken: string) => Promise } +export class CrossTabRefreshTimeoutError extends Error { + constructor() { + super('登录状态刷新等待超时,请重新登录') + this.name = 'CrossTabRefreshTimeoutError' + } +} + +const DEFAULT_LOCK_TIMEOUT_MS = 20_000 + export async function coordinateCrossTabRefresh(options: CrossTabRefreshOptions): Promise { const run = async () => { const currentRefreshToken = options.currentRefreshToken() @@ -33,5 +43,14 @@ export async function coordinateCrossTabRefresh(options: CrossTabRefreshOptio throw error } } - return navigator.locks.request(options.lockName, run) + const controller = new AbortController() + const timeout = setTimeout(() => controller.abort(), options.lockTimeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS) + try { + return await navigator.locks.request(options.lockName, { signal: controller.signal }, run) + } catch (error) { + if (controller.signal.aborted) throw new CrossTabRefreshTimeoutError() + throw error + } finally { + clearTimeout(timeout) + } } diff --git a/src/core/navigation/adminNavigation.test.ts b/src/core/navigation/adminNavigation.test.ts index 0f6b2895..e08d6b01 100644 --- a/src/core/navigation/adminNavigation.test.ts +++ b/src/core/navigation/adminNavigation.test.ts @@ -32,7 +32,9 @@ describe('adminNavigation', () => { '订单列表', '订单测量', '测量数据审核', + '预装清单', '库位管理', + '托盘管理', '整柜业务', ]) expect(adminNavigation.find((item) => item.key === 'customer-service')?.children?.map((item) => item.title)).toEqual(['异常订单', '客户回访']) @@ -45,7 +47,6 @@ describe('adminNavigation', () => { '订舱列表', '拖车列表', '货柜列表', - '预装清单', '装柜清单', ]) expect(adminNavigation.find((item) => item.key === 'overseas-inventory')?.children?.map((item) => item.title)).toEqual([ @@ -249,8 +250,8 @@ describe('adminNavigation', () => { expect(getNavigationLeaves(filtered).map((item) => item.path)).toEqual([ '/dashboard', - '/container-loading', '/loading-plans', + '/container-loading', '/loading-lists', ]) }) diff --git a/src/core/navigation/adminNavigation.ts b/src/core/navigation/adminNavigation.ts index 0186a35a..2e7affd5 100644 --- a/src/core/navigation/adminNavigation.ts +++ b/src/core/navigation/adminNavigation.ts @@ -1,7 +1,6 @@ import type { Component } from 'vue' import { Building2, - ClipboardCheck, ContactRound, ClipboardList, CircleDollarSign, @@ -68,7 +67,9 @@ export const adminNavigation: AdminNavigationNode[] = [ { key: 'order-list', title: '订单列表', icon: ClipboardList, path: '/orders', permission: 'platform:order:list', permissionAnyOf: ['platform:firstleg:inbound:list'] }, { key: 'inbound-dedup', title: '订单测量', icon: ClipboardList, path: '/inbounds/measurements', permission: 'platform:firstleg:inbound:measure:view' }, { key: 'inbound-measure', title: '测量数据审核', icon: FileCheck2, path: '/inbounds/measurement-reviews', permission: 'firstleg:inbound:measurement-review' }, + { key: 'container-preload', title: '预装清单', icon: ClipboardList, path: '/loading-plans', permission: 'platform:firstleg:preload:list' }, { key: 'locations', title: '库位管理', icon: WarehouseIcon, path: '/master-data/locations', permission: 'platform:location:list' }, + { key: 'pallets', title: '托盘管理', icon: WarehouseIcon, path: '/master-data/pallets', permission: 'platform:pallet:list' }, { key: 'domestic-containers', title: '整柜业务', icon: WarehouseIcon, path: '/domestic-containers', permission: 'platform:domestic-container:list' }, ], }, @@ -102,7 +103,6 @@ export const adminNavigation: AdminNavigationNode[] = [ { key: 'booking-list', title: '订舱列表', icon: ClipboardList, path: '/ocean-bookings', permission: 'platform:firstleg:ocean-booking:list' }, { key: 'truck-list', title: '拖车列表', icon: Truck, path: '/trucking', permission: 'platform:firstleg:truck-appointment:list' }, { key: 'container-list', title: '货柜列表', icon: WarehouseIcon, path: '/container-loading', permission: 'platform:firstleg:container:list' }, - { key: 'container-preload', title: '预装清单', icon: ClipboardList, path: '/loading-plans', permission: 'platform:firstleg:preload:list' }, { key: 'container-manifest', title: '装柜清单', icon: ClipboardList, path: '/loading-lists', permission: 'platform:firstleg:loading-list:list' }, ], }, @@ -129,7 +129,6 @@ export const adminNavigation: AdminNavigationNode[] = [ { key: 'fba-relabel-order', title: '换标单', icon: ClipboardList, path: '/overseas-warehouse/relabel-orders', permission: 'platform:overseas-warehouse:relabel-order:list' }, { key: 'fba-pallet', title: '托盘管理', icon: WarehouseIcon, path: '/overseas-warehouse/pallets', permission: 'platform:overseas-warehouse:pallet:list' }, { key: 'overseas-inventory-list', title: '库存管理', icon: WarehouseIcon, path: '/overseas-warehouse/inventory', permission: 'platform:overseas-warehouse:inventory:list' }, - { key: 'overseas-acceptance', title: '尾程流程验收', icon: ClipboardCheck, path: '/prototype/overseas-delivery/acceptance-workbench' }, ], }, { diff --git a/src/deployment/nginxConfig.test.ts b/src/deployment/nginxConfig.test.ts index 1c389c18..a26cf17b 100644 --- a/src/deployment/nginxConfig.test.ts +++ b/src/deployment/nginxConfig.test.ts @@ -9,8 +9,10 @@ const jenkinsfile = readFileSync(resolve(process.cwd(), 'Jenkinsfile'), 'utf8') const dockerfile = readFileSync(resolve(process.cwd(), 'Dockerfile'), 'utf8') describe('admin nginx deployment config', () => { - it('allows qualification uploads with multipart overhead through the API proxy', () => { - expect(config).toContain('client_max_body_size 12m;') + it('allows 50 MiB files plus multipart overhead through both bounded API proxies', () => { + expect(config.match(/client_max_body_size 55m;/g)).toHaveLength(2) + expect(config).not.toContain('client_max_body_size 12m;') + expect(config).not.toContain('client_max_body_size 0;') }) it('prevents the application shell from retaining stale chunk references', () => { @@ -36,8 +38,13 @@ describe('admin nginx deployment config', () => { }) it('declares an explicit overseas gateway upstream in container deployments', () => { - expect(testCompose).toContain('OVERSEAS_API_UPSTREAM: "http://host.docker.internal:9300"') - expect(developmentCompose).toContain('OVERSEAS_API_UPSTREAM: "http://host.docker.internal:9300"') + expect(testCompose).toContain('API_UPSTREAM: "http://test-api-cn.buggoglobal.com"') + expect(testCompose).toContain('OVERSEAS_API_UPSTREAM: "http://test-api-global.buggoglobal.com"') + expect(testCompose).toContain('CLIENT_WEB_URL: "${CLIENT_WEB_URL:-https://test-app.buggoglobal.com/}"') + expect(testCompose).not.toContain('CLIENT_WEB_URL: "http://8.163.') + expect(developmentCompose).toContain('CLIENT_WEB_URL: "${CLIENT_WEB_URL:-https://dev-app.buggoglobal.com/}"') + expect(developmentCompose).toContain('OVERSEAS_API_UPSTREAM: "http://firstleg-development-gateway-overseas:9300"') + expect(config).toContain('proxy_set_header Host $proxy_host;') }) it('runs each deployment on its target node without controller-local SSH files', () => { @@ -58,5 +65,6 @@ describe('admin nginx deployment config', () => { expect(jenkinsfile).toContain("NGINX_BASE_IMAGE = '172.31.198.7:10082/java-project/nginx:1.27-alpine'") expect(jenkinsfile).toContain('withCredentials([usernamePassword(') expect(jenkinsfile).toContain('export DOCKER_CONFIG="${WORKSPACE}@tmp/docker-auth"') + expect(jenkinsfile).toContain('--build-arg VITE_CLIENT_WEB_URL="${CLIENT_WEB_URL:-https://dev-app.buggoglobal.com/}"') }) }) diff --git a/src/modules/container-loading/api/platformContainerCustoms.test.ts b/src/modules/container-loading/api/platformContainerCustoms.test.ts new file mode 100644 index 00000000..1a64e112 --- /dev/null +++ b/src/modules/container-loading/api/platformContainerCustoms.test.ts @@ -0,0 +1,58 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { http } from '@/shared/api/http' +import { completeAllBuyContainerCustoms, downloadContainerCustomsCompletion, downloadContainerCustomsDocument, getContainerCustoms, startContainerCustoms, uploadContainerCustomsCompletion } from './platformContainerCustoms' + +const customs = { + aggregateId: 2092438843630391401n, loadingPlanId: 2092438843630391402n, containerBookingId: 2092438843630391403n, + planNo: 'LP-1', cabinetNo: 'CB-1', containerNo: 'MSCU-1', status: 'READY_TO_START', version: '3', taxRefundCount: 1, coveredTaxRefundCount: 1, + inbounds: [{ inboundId: 2092438843630391404n, orderId: 2092438843630391405n, orderNo: 'O-1', inboundCode: 'RK-1', tenantId: 2092438843630391406n, customerName: '客户一', taxMode: 'TAX_REFUND', covered: true }], + documents: [{ documentId: 2092438843630391407n, tenantId: 2092438843630391406n, source: { fileId: '2092438843630391408', fileName: 'source.pdf', fileHash: 'hash', sizeBytes: 1, version: 2, uploadedAt: '2026-08-28T10:00:00' }, inboundIds: ['2092438843630391404'], inboundCodes: ['RK-1'], frozen: true, completion: null }], + startedAt: null, completedAt: null, +} + +describe('platform container customs API', () => { + beforeEach(() => vi.restoreAllMocks()) + + it('uses the frozen customs-v1 paths and preserves long ids as strings', async () => { + const get = vi.spyOn(http, 'get').mockResolvedValue({ code: '200', message: 'ok', data: customs }) + const result = await getContainerCustoms('2092438843630391402') + expect(get).toHaveBeenCalledWith('/platform/v1/customs/loading-plans/2092438843630391402') + expect(result).toMatchObject({ aggregateId: '2092438843630391401', loadingPlanId: '2092438843630391402', containerBookingId: '2092438843630391403' }) + expect(result.inbounds[0]).toMatchObject({ inboundId: '2092438843630391404', orderId: '2092438843630391405', tenantId: '2092438843630391406' }) + expect(result.documents[0]?.documentId).toBe('2092438843630391407') + }) + + it('sends confirmed start and all-buy completion with optimistic version and idempotency', async () => { + const post = vi.spyOn(http, 'post').mockResolvedValue({ code: '200', message: 'ok', data: customs }) + await startContainerCustoms('2092438843630391402', 3) + await completeAllBuyContainerCustoms('2092438843630391402', 4) + expect(post.mock.calls[0]?.slice(0, 2)).toEqual(['/platform/v1/customs/loading-plans/2092438843630391402/start', { expectedVersion: 3, confirm: true, remark: null }]) + expect(post.mock.calls[1]?.slice(0, 2)).toEqual(['/platform/v1/customs/loading-plans/2092438843630391402/complete-all-buy', { expectedVersion: 4, confirm: true, remark: null }]) + expect(post.mock.calls[0]?.[2]).toMatchObject({ headers: { 'Idempotency-Key': expect.any(String) } }) + }) + + it('uploads one completion file with final-confirmation query parameters', async () => { + const document = { ...customs.documents[0], documentId: '2092438843630391407', tenantId: '2092438843630391406' } + const post = vi.spyOn(http, 'post').mockResolvedValue({ code: '200', message: 'ok', data: document }) + const completion = new File(['done'], 'done.pdf') + await uploadContainerCustomsCompletion('2092438843630391407', completion, 0, true) + expect(post.mock.calls[0]?.[0]).toBe('/platform/v1/customs/loading-plans/documents/2092438843630391407/completion/upload') + expect((post.mock.calls[0]?.[1] as FormData).get('file')).toBe(completion) + expect(post.mock.calls[0]?.[2]).toMatchObject({ params: { expectedVersion: 0, finalConfirmation: true }, headers: { 'Content-Type': 'multipart/form-data', 'Idempotency-Key': expect.any(String) } }) + }) + + it('keeps source and completion downloads isolated on the long document id', async () => { + const source = new Blob(['source']) + const completion = new Blob(['completion']) + const get = vi.spyOn(http, 'get').mockResolvedValueOnce(source).mockResolvedValueOnce(completion) + const documentId = '2092438843630391407' + + await expect(downloadContainerCustomsDocument(documentId)).resolves.toBe(source) + await expect(downloadContainerCustomsCompletion(documentId)).resolves.toBe(completion) + + expect(get.mock.calls).toEqual([ + [`/platform/v1/customs/loading-plans/documents/${documentId}/download`, { responseType: 'blob' }], + [`/platform/v1/customs/loading-plans/documents/${documentId}/completion/download`, { responseType: 'blob' }], + ]) + }) +}) diff --git a/src/modules/container-loading/api/platformContainerCustoms.ts b/src/modules/container-loading/api/platformContainerCustoms.ts new file mode 100644 index 00000000..92005b3a --- /dev/null +++ b/src/modules/container-loading/api/platformContainerCustoms.ts @@ -0,0 +1,116 @@ +import { http, unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http' + +export type ContainerCustomsStatus = 'WAITING_CUSTOMER_DOCUMENTS' | 'READY_TO_START' | 'DECLARING' | 'COMPLETED' +export type ContainerCustomsTaxMode = 'TAX_REFUND' | 'BUY_DECLARATION' + +export interface ContainerCustomsFile { + fileId: string + fileName: string + fileHash: string + sizeBytes: number + version: number + uploadedAt: string +} + +export interface ContainerCustomsInbound { + inboundId: string + orderId: string + orderNo: string + inboundCode: string + tenantId: string + customerName: string + taxMode: ContainerCustomsTaxMode + covered: boolean +} + +export interface ContainerCustomsDocument { + documentId: string + tenantId: string + source: ContainerCustomsFile + inboundIds: string[] + inboundCodes: string[] + frozen: boolean + completion: ContainerCustomsFile | null +} + +export interface ContainerCustomsView { + aggregateId: string + loadingPlanId: string + containerBookingId: string + planNo: string + cabinetNo: string + containerNo: string | null + status: ContainerCustomsStatus + version: number + taxRefundCount: number + coveredTaxRefundCount: number + inbounds: ContainerCustomsInbound[] + documents: ContainerCustomsDocument[] + startedAt: string | null + completedAt: string | null +} + +interface RawContainerCustomsView extends Omit { + aggregateId: string | number + loadingPlanId: string | number + containerBookingId: string | number + version: string | number + inbounds: Array & { inboundId: string | number; orderId: string | number; tenantId: string | number }> + documents: Array & { documentId: string | number; tenantId: string | number; source: ContainerCustomsFile; completion: ContainerCustomsFile | null }> +} + +const basePath = '/platform/v1/customs/loading-plans' +function operationId(prefix: string) { return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2)}` } +function file(value: ContainerCustomsFile | null): ContainerCustomsFile | null { + return value ? { ...value, fileId: String(value.fileId), sizeBytes: Number(value.sizeBytes), version: Number(value.version) } : null +} +function normalize(value: RawContainerCustomsView): ContainerCustomsView { + return { + ...value, + aggregateId: String(value.aggregateId), loadingPlanId: String(value.loadingPlanId), containerBookingId: String(value.containerBookingId), version: Number(value.version), + inbounds: value.inbounds.map((item) => ({ ...item, inboundId: String(item.inboundId), orderId: String(item.orderId), tenantId: String(item.tenantId) })), + documents: value.documents.map((item) => ({ ...item, documentId: String(item.documentId), tenantId: String(item.tenantId), source: file(item.source)!, completion: file(item.completion) })), + } +} + +export async function getContainerCustoms(loadingPlanId: string) { + const response = await http.get, ApiEnvelope>(`${basePath}/${encodeURIComponent(loadingPlanId)}`) + return normalize(unwrapApiResponse(response)) +} + +export function downloadContainerCustomsDocument(documentId: string) { + return http.get(`${basePath}/documents/${encodeURIComponent(documentId)}/download`, { responseType: 'blob' }) +} + +export function downloadContainerCustomsCompletion(documentId: string) { + return http.get(`${basePath}/documents/${encodeURIComponent(documentId)}/completion/download`, { responseType: 'blob' }) +} + +async function action(loadingPlanId: string, name: 'start' | 'complete-all-buy', expectedVersion: number, remark?: string) { + const response = await http.post, ApiEnvelope>( + `${basePath}/${encodeURIComponent(loadingPlanId)}/${name}`, + { expectedVersion, confirm: true, remark: remark?.trim() || null }, + { headers: { 'Idempotency-Key': operationId(`container-customs-${name}`) } }, + ) + return normalize(unwrapApiResponse(response)) +} + +export function startContainerCustoms(loadingPlanId: string, expectedVersion: number) { + return action(loadingPlanId, 'start', expectedVersion) +} + +export function completeAllBuyContainerCustoms(loadingPlanId: string, expectedVersion: number) { + return action(loadingPlanId, 'complete-all-buy', expectedVersion) +} + +export async function uploadContainerCustomsCompletion(documentId: string, fileValue: File, expectedVersion: number, finalConfirmation: boolean) { + const body = new FormData() + body.append('file', fileValue) + const response = await http.post, ApiEnvelope>( + `${basePath}/documents/${encodeURIComponent(documentId)}/completion/upload`, + body, + { params: { expectedVersion, finalConfirmation }, headers: { 'Content-Type': 'multipart/form-data', 'Idempotency-Key': operationId('container-customs-completion') } }, + ) + const result = unwrapApiResponse(response) + return { ...result, documentId: String(result.documentId), tenantId: String(result.tenantId), source: file(result.source)!, completion: file(result.completion) } +} diff --git a/src/modules/container-loading/api/platformContainerLoading.test.ts b/src/modules/container-loading/api/platformContainerLoading.test.ts index d27daf98..cbcb13e1 100644 --- a/src/modules/container-loading/api/platformContainerLoading.test.ts +++ b/src/modules/container-loading/api/platformContainerLoading.test.ts @@ -1,13 +1,15 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' +import { readFileSync } from 'node:fs' +import { resolve } from 'node:path' import { http } from '@/shared/api/http' import { - adjustSmartLoadingItem, assignSmartLoadingItem, createSmartLoadingPlan, getContainer, - listContainers, listSmartLoadingCandidates, pushSmartLoadingPreload, removeSmartLoadingItem, + adjustSmartLoadingItem, assignSmartLoadingGroup, assignSmartLoadingItem, createSmartLoadingPlan, getContainer, + listContainers, listSmartLoadingCandidates, pushSmartLoadingPreload, removeSmartLoadingGroup, removeSmartLoadingItem, getContainerClearance, downloadContainerClearance, uploadContainerClearance, completeContainerClearance, getContainerOverview, markContainerException, cancelContainerException, uploadContainerDocument, downloadContainerDocument, downloadContainerPdaPhoto, getCustomerContainerTransitSummary, createContainerSimulation, linkContainerOceanBooking, unlinkContainerOceanBooking, - updateContainer, updateContainerTransport, + updateContainer, } from './platformContainerLoading' vi.mock('@/shared/api/http', () => ({ @@ -42,14 +44,12 @@ describe('platform container loading API', () => { expect(http.get).toHaveBeenCalledWith('/platform/v1/containers', { params: { page: 1, size: 20 } }) }) - it('uses full-edit and transport whitelist request shapes', async () => { + it('uses the full-edit request shape without retaining the retired container transport endpoint', async () => { vi.mocked(http.put).mockResolvedValue({ code: '200', data: container }) - vi.mocked(http.patch).mockResolvedValue({ code: '200', data: container }) const data = { warehouseId: '8', warehouseName: '义乌仓', containerType: '40HC', containerNo: null, billOfLadingNo: null, vesselName: null, voyageNo: null, shippingCompanyId: null, shippingCompanyName: null, departurePortCode: null, departurePortName: null, destinationPortCode: null, destinationPortName: null, destinationWarehouseCode: null, destinationWarehouseName: null, capacityCbm: 76, maxWeightKg: 28000, terminalTruckingCompanyId: null, terminalTruckingCompany: null, loadingAt: null, estimatedSailingAt: null, actualSailingAt: null, estimatedPortArrivalAt: null, actualPortArrivalAt: null, estimatedWarehouseArrivalAt: null, actualWarehouseArrivalAt: null } await updateContainer('7', 2, data) - await updateContainerTransport('7', 3, { containerNo: 'MSCU1', voyageNo: 'V8' }) expect(http.put).toHaveBeenCalledWith('/platform/v1/containers/7', { version: 2, data }) - expect(http.patch).toHaveBeenCalledWith('/platform/v1/containers/7/transport', { version: 3, containerNo: 'MSCU1', voyageNo: 'V8' }) + expect(readFileSync(resolve(process.cwd(), 'src/modules/container-loading/api/platformContainerLoading.ts'), 'utf8')).not.toContain('/transport') }) it('uses the frozen simulation create and ocean booking link contracts', async () => { @@ -66,9 +66,9 @@ describe('platform container loading API', () => { it('normalizes every long id in candidates and plans', async () => { vi.mocked(http.get) .mockResolvedValueOnce({ code: '200', data: container }) - .mockResolvedValueOnce({ code: '200', data: [{ accountId: 1, inboundId: 2, orderId: 4, inboundCode: 'IN-1', warehouseId: 5, destinationWarehouseId: 6, channelCode: 'NY_EXX', channelName: '纽约EXX海铁', goodsSummary: '服装、鞋类', availablePackageCount: '7', unitGrossWeightKg: '12.5', unitNetWeightKg: '11.8', averageUnitVolumeCbm: '0.187', availableVolumeCbm: '1.309' }] }) + .mockResolvedValueOnce({ code: '200', data: [{ accountId: 1, inboundId: 2, orderId: 4, inboundCode: 'IN-1', warehouseId: 5, destinationWarehouseId: 6, channelCode: 'NY_EXX', channelName: '纽约EXX海铁', goodsSummary: '服装、鞋类', availablePackageCount: '7', unitGrossWeightKg: '12.5', unitNetWeightKg: '11.8', averageUnitVolumeCbm: '0.187', availableVolumeCbm: '1.309', coLoadGroupId: 9007199254740999n, groupNo: 'CLG-9007199254740999', memberCount: '3', groupTotalBoxes: '21', locked: false, blockReason: null }] }) expect((await getContainer('9')).id).toBe(String(container.id)) - expect(await listSmartLoadingCandidates('7', '5')).toMatchObject([{ accountId: '1', inboundId: '2', inboundCode: 'IN-1', destinationWarehouseId: '6', channelCode: 'NY_EXX', channelName: '纽约EXX海铁', goodsSummary: '服装、鞋类', availablePackageCount: 7, unitGrossWeightKg: 12.5, unitNetWeightKg: 11.8, averageUnitVolumeCbm: 0.187, availableVolumeCbm: 1.309 }]) + expect(await listSmartLoadingCandidates('7', '5')).toMatchObject([{ accountId: '1', inboundId: '2', inboundCode: 'IN-1', destinationWarehouseId: '6', channelCode: 'NY_EXX', channelName: '纽约EXX海铁', goodsSummary: '服装、鞋类', availablePackageCount: 7, unitGrossWeightKg: 12.5, unitNetWeightKg: 11.8, averageUnitVolumeCbm: 0.187, availableVolumeCbm: 1.309, coLoadGroupId: '9007199254740999', groupNo: 'CLG-9007199254740999', memberCount: 3, groupTotalBoxes: 21, locked: false, blockReason: null }]) expect(http.get).toHaveBeenLastCalledWith('/platform/v1/first-leg/smart-loading/inbound-candidates', { params: { bookingId: '7', warehouseId: '5' } }) }) @@ -90,6 +90,21 @@ describe('platform container loading API', () => { expect(vi.mocked(http.post).mock.calls[2]?.[2]).toMatchObject({ headers: { 'Idempotency-Key': expect.stringContaining('push-preload-') } }) }) + it('uses only the atomic group assign and whole-group remove endpoints for co-load groups', async () => { + vi.mocked(http.post).mockResolvedValue({ code: '200', data: plan }) + vi.mocked(http.delete).mockResolvedValue({ code: '200', data: plan }) + await assignSmartLoadingGroup('10', '2093000000000000006', 5) + await removeSmartLoadingGroup('10', '2093000000000000001', 6) + expect(http.post).toHaveBeenCalledWith( + '/platform/v1/first-leg/smart-loading/plans/10/group-assignments', + { inboundId: '2093000000000000006', expectedVersion: 5, operationId: expect.stringContaining('assign-coload-group-') }, + ) + expect(http.delete).toHaveBeenCalledWith( + '/platform/v1/first-leg/smart-loading/plans/10/group-assignments/2093000000000000001', + { data: { expectedPlanVersion: 6, operationId: expect.stringContaining('remove-coload-group-') } }, + ) + }) + it('uses stable container id and versioned clearance document actions', async () => { vi.spyOn(http, 'get').mockResolvedValue({ code: '200', data: { id: 4, documentType: 'CUSTOMS_CLEARANCE', fileId: 8, fileName: 'clearance.pdf', version: 2 } }) vi.spyOn(http, 'post').mockResolvedValue({ code: '200', data: { id: 4, documentType: 'CUSTOMS_CLEARANCE', fileId: 8, fileName: 'clearance.pdf', version: 3 } }) @@ -112,10 +127,10 @@ describe('platform container loading API', () => { container: { id: 9007199254740993, warehouseId: 9007199254740994, version: '4' }, loadingPlanId: 9007199254740995, pda: { taskId: 9007199254740996, loadingPlanId: 9007199254740995, containerBookingId: 9007199254740993, taskVersion: '2', itemCount: '4', completedItemCount: '3', unresolvedItemCount: '1', photoCounts: [{ evidenceType: 'EMPTY_CONTAINER', count: '2' }], photos: [{ evidenceId: 20, tenantId: 21, inboundId: 22, fileId: 23, downloadPath: '/api/platform/v1/containers/9007199254740993/pda/photos/23/download' }], exceptionReasons: [] }, documents: [{ id: 9007199254740997, documentType: 'DELIVERY_ORDER', fileId: 9007199254740998, uploadedBy: 9, version: '2' }], - exception: { active: false, markedBy: null }, exceptionHistory: [{ id: 10, operatorId: 11 }], timeline: [{ operatorId: 12 }], + exception: { active: false, markedBy: null }, exceptionHistory: [{ id: 10, operatorId: 11 }], timeline: [{ id: '2092438843630397001', eventId: '2092438843630397002', idempotencyKey: '2092438843630397003', operatorId: 12, eventType: 'PUSH_PRELOAD', detail: '推送预装清单' }], } }) const result = await getContainerOverview('7') - expect(result).toMatchObject({ container: { id: expect.any(String), warehouseId: expect.any(String), version: 4 }, loadingPlanId: expect.any(String), pda: { taskId: expect.any(String), itemCount: 4, photoCounts: [{ count: 2 }] }, documents: [{ fileId: expect.any(String), version: 2 }] }) + expect(result).toMatchObject({ container: { id: expect.any(String), warehouseId: expect.any(String), version: 4 }, loadingPlanId: expect.any(String), pda: { taskId: expect.any(String), itemCount: 4, photoCounts: [{ count: 2 }] }, documents: [{ fileId: expect.any(String), version: 2 }], timeline: [{ id: '2092438843630397001', eventId: '2092438843630397002', idempotencyKey: '2092438843630397003', operatorId: '12' }] }) expect(http.get).toHaveBeenCalledWith('/platform/v1/containers/7/overview') vi.mocked(http.post).mockResolvedValueOnce({ code: '200', data: null }) diff --git a/src/modules/container-loading/api/platformContainerLoading.ts b/src/modules/container-loading/api/platformContainerLoading.ts index c1aa5393..91cffa06 100644 --- a/src/modules/container-loading/api/platformContainerLoading.ts +++ b/src/modules/container-loading/api/platformContainerLoading.ts @@ -60,7 +60,13 @@ function overview(raw: ContainerOverview): ContainerOverview { documents: (raw.documents || []).map(overviewDocument), exception: { ...raw.exception, markedBy: optionalId(raw.exception?.markedBy) }, exceptionHistory: (raw.exceptionHistory || []).map((entry) => ({ ...entry, id: id(entry.id), operatorId: optionalId(entry.operatorId) })), - timeline: (raw.timeline || []).map((entry) => ({ ...entry, operatorId: optionalId(entry.operatorId) })), + timeline: (raw.timeline || []).map((entry) => ({ + ...entry, + id: optionalId(entry.id), + eventId: optionalId(entry.eventId), + idempotencyKey: optionalId(entry.idempotencyKey), + operatorId: optionalId(entry.operatorId), + })), } } @@ -196,11 +202,6 @@ export async function updateContainer(containerId: string, version: number, data return container(unwrapApiResponse(response)) } -export async function updateContainerTransport(containerId: string, version: number, payload: { containerNo: string | null; voyageNo: string | null }) { - const response = await http.patch, ApiEnvelope>(`${containerPath}/${encodeURIComponent(containerId)}/transport`, { ...payload, version }) - return container(unwrapApiResponse(response)) -} - export async function getContainerClearance(containerId: string) { const response = await http.get, ApiEnvelope>(`${containerPath}/${encodeURIComponent(containerId)}/clearance`) return document(unwrapApiResponse(response)) @@ -229,6 +230,10 @@ export async function listSmartLoadingCandidates(bookingId: string, warehouseId: return unwrapApiResponse(response).map((raw) => ({ ...raw, accountId: id(raw.accountId), inboundId: id(raw.inboundId), orderId: id(raw.orderId), warehouseId: id(raw.warehouseId), destinationWarehouseId: optionalId(raw.destinationWarehouseId), + coLoadGroupId: optionalId(raw.coLoadGroupId), + memberCount: raw.memberCount == null ? null : numberValue(raw.memberCount), + groupTotalBoxes: raw.groupTotalBoxes == null ? null : numberValue(raw.groupTotalBoxes), + locked: raw.locked == null ? null : Boolean(raw.locked), availablePackageCount: numberValue(raw.availablePackageCount), unitGrossWeightKg: raw.unitGrossWeightKg == null ? null : numberValue(raw.unitGrossWeightKg), unitNetWeightKg: raw.unitNetWeightKg == null ? null : numberValue(raw.unitNetWeightKg), @@ -257,6 +262,14 @@ export async function assignSmartLoadingItem(planId: string, payload: { inboundI return plan(unwrapApiResponse(response)) } +export async function assignSmartLoadingGroup(planId: string, inboundId: string, expectedVersion: number) { + const response = await http.post, ApiEnvelope>( + `${smartLoadingPath}/plans/${encodeURIComponent(planId)}/group-assignments`, + { inboundId, expectedVersion, operationId: operationId('assign-coload-group') }, + ) + return plan(unwrapApiResponse(response)) +} + export async function recommendSmartLoading(planId: string, expectedVersion: number) { const response = await http.post, ApiEnvelope>(`${smartLoadingPath}/plans/${encodeURIComponent(planId)}/recommend`, { expectedVersion, operationId: operationId('recommend') }) return plan(unwrapApiResponse(response)) @@ -272,6 +285,14 @@ export async function removeSmartLoadingItem(planId: string, itemId: string, exp return plan(unwrapApiResponse(response)) } +export async function removeSmartLoadingGroup(planId: string, groupId: string, expectedPlanVersion: number) { + const response = await http.delete, ApiEnvelope>( + `${smartLoadingPath}/plans/${encodeURIComponent(planId)}/group-assignments/${encodeURIComponent(groupId)}`, + { data: { expectedPlanVersion, operationId: operationId('remove-coload-group') } }, + ) + return plan(unwrapApiResponse(response)) +} + export async function pushSmartLoadingPreload(planId: string, expectedVersion: number) { const response = await http.post, ApiEnvelope>(`${smartLoadingPath}/plans/${encodeURIComponent(planId)}/push-preload`, { expectedVersion }, { headers: { 'Idempotency-Key': operationId('push-preload') } }) return plan(unwrapApiResponse(response)) diff --git a/src/modules/container-loading/components/ContainerCustomsPanel.test.ts b/src/modules/container-loading/components/ContainerCustomsPanel.test.ts new file mode 100644 index 00000000..3166eac1 --- /dev/null +++ b/src/modules/container-loading/components/ContainerCustomsPanel.test.ts @@ -0,0 +1,134 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { flushPromises, mount } from '@vue/test-utils' +import ElementPlus from 'element-plus' +import { ApiResponseError } from '@/shared/api/http' +import type { ContainerCustomsStatus, ContainerCustomsView } from '../api/platformContainerCustoms' + +const api = vi.hoisted(() => ({ + get: vi.fn(), + start: vi.fn(), + completeAllBuy: vi.fn(), + upload: vi.fn(), + downloadSource: vi.fn(), + downloadCompletion: vi.fn(), +})) + +vi.mock('../api/platformContainerCustoms', () => ({ + getContainerCustoms: api.get, + startContainerCustoms: api.start, + completeAllBuyContainerCustoms: api.completeAllBuy, + uploadContainerCustomsCompletion: api.upload, + downloadContainerCustomsDocument: api.downloadSource, + downloadContainerCustomsCompletion: api.downloadCompletion, +})) +vi.mock('@/modules/downloads', () => ({ createPlatformExportTask: vi.fn() })) + +import ContainerCustomsPanel from './ContainerCustomsPanel.vue' + +function customs(status: ContainerCustomsStatus, hasCompletion = false): ContainerCustomsView { + return { + aggregateId: '2092438843630391401', loadingPlanId: '2092438843630391402', containerBookingId: '2092438843630391403', + planNo: 'LP-1', cabinetNo: 'MCR08290001', containerNo: 'MSCU-1', status, version: 3, taxRefundCount: 1, coveredTaxRefundCount: 1, + inbounds: [{ inboundId: '2092438843630391404', orderId: '2092438843630391405', orderNo: 'O-1', inboundCode: 'RK-1', tenantId: '2092438843630391406', customerName: '客户一', taxMode: 'TAX_REFUND', covered: true }], + documents: [{ + documentId: '2092438843630391407', tenantId: '2092438843630391406', + source: { fileId: '2092438843630391408', fileName: '客户退税资料.pdf', fileHash: 'source-hash', sizeBytes: 12, version: 2, uploadedAt: '2026-08-29T10:00:00' }, + inboundIds: ['2092438843630391404'], inboundCodes: ['RK-1'], frozen: true, + completion: hasCompletion ? { fileId: '2092438843630391409', fileName: '报关完成文件.pdf', fileHash: 'completion-hash', sizeBytes: 13, version: 1, uploadedAt: '2026-08-29T11:00:00' } : null, + }], + startedAt: status === 'DECLARING' || status === 'COMPLETED' ? '2026-08-29T10:30:00' : null, + completedAt: status === 'COMPLETED' ? '2026-08-29T11:30:00' : null, + } +} + +async function render(status: ContainerCustomsStatus, canManage = true, hasCompletion = false) { + api.get.mockResolvedValue(customs(status, hasCompletion)) + const wrapper = mount(ContainerCustomsPanel, { + props: { loadingPlanId: '2092438843630391402', canList: true, canManage, departureState: 'WAITING_OTHER_GATES' }, + global: { plugins: [ElementPlus] }, + }) + await flushPromises() + return wrapper +} + +function buttonTexts(wrapper: Awaited>) { + return wrapper.findAll('button').map((button) => button.text()) +} + +describe('ContainerCustomsPanel', () => { + beforeEach(() => { + vi.clearAllMocks() + api.downloadSource.mockResolvedValue(new Blob(['source'])) + api.downloadCompletion.mockResolvedValue(new Blob(['completion'])) + Object.defineProperty(URL, 'createObjectURL', { configurable: true, value: vi.fn(() => 'blob:customs-file') }) + Object.defineProperty(URL, 'revokeObjectURL', { configurable: true, value: vi.fn() }) + vi.spyOn(HTMLAnchorElement.prototype, 'click').mockImplementation(() => undefined) + }) + + it('keeps READY_TO_START read-only while exposing source file name and download', async () => { + const wrapper = await render('READY_TO_START') + expect(wrapper.text()).toContain('开始报关') + expect(wrapper.text()).toContain('客户退税资料.pdf') + expect(wrapper.find('[aria-label="下载源资料 客户退税资料.pdf"]').exists()).toBe(true) + expect(buttonTexts(wrapper)).not.toContain('上传完成文件') + expect(buttonTexts(wrapper)).not.toContain('覆盖完成文件') + expect(buttonTexts(wrapper)).not.toContain('提交') + }) + + it('allows completion upload and overwrite only while DECLARING with manage permission', async () => { + let wrapper = await render('DECLARING', true, false) + expect(wrapper.text()).toContain('上传完成文件') + expect(wrapper.text()).toContain('提交') + wrapper.unmount() + + wrapper = await render('DECLARING', true, true) + expect(wrapper.text()).toContain('覆盖完成文件') + expect(wrapper.text()).toContain('报关完成文件.pdf') + wrapper.unmount() + + wrapper = await render('DECLARING', false, true) + expect(wrapper.text()).toContain('只读') + expect(buttonTexts(wrapper)).not.toContain('上传完成文件') + expect(buttonTexts(wrapper)).not.toContain('覆盖完成文件') + expect(buttonTexts(wrapper)).not.toContain('提交') + }) + + it('keeps COMPLETED strictly read-only with both files visible and downloadable', async () => { + const wrapper = await render('COMPLETED', true, true) + expect(wrapper.text()).toContain('客户退税资料.pdf') + expect(wrapper.text()).toContain('报关完成文件.pdf') + expect(wrapper.text()).toContain('报关已完成,待其他离仓条件') + expect(buttonTexts(wrapper)).not.toContain('上传完成文件') + expect(buttonTexts(wrapper)).not.toContain('覆盖完成文件') + expect(buttonTexts(wrapper)).not.toContain('提交') + }) + + it('routes source and completion downloads independently by the long document id and original names', async () => { + const wrapper = await render('COMPLETED', false, true) + await wrapper.get('[aria-label="下载源资料 客户退税资料.pdf"]').trigger('click') + await flushPromises() + expect(api.downloadSource).toHaveBeenCalledWith('2092438843630391407') + expect(api.downloadCompletion).not.toHaveBeenCalled() + + await wrapper.get('[aria-label="下载完成文件 报关完成文件.pdf"]').trigger('click') + await flushPromises() + expect(api.downloadCompletion).toHaveBeenCalledWith('2092438843630391407') + expect(HTMLAnchorElement.prototype.click).toHaveBeenCalledTimes(2) + expect(URL.createObjectURL).toHaveBeenCalledTimes(2) + expect(URL.revokeObjectURL).toHaveBeenCalledWith('blob:customs-file') + }) + + it('preserves backend error code, request id and trace id when one download fails', async () => { + api.downloadSource.mockRejectedValueOnce(new ApiResponseError('文件不可用', 'CUSTOMS_FILE_404', 404, undefined, 'request-customs-download', 'trace-customs-download')) + const wrapper = await render('COMPLETED', false, true) + + await wrapper.get('[aria-label="下载源资料 客户退税资料.pdf"]').trigger('click') + await flushPromises() + + expect(wrapper.text()).toContain('文件不可用') + expect(wrapper.text()).toContain('CUSTOMS_FILE_404') + expect(wrapper.text()).toContain('request-customs-download') + expect(wrapper.text()).toContain('trace-customs-download') + expect(api.downloadCompletion).not.toHaveBeenCalled() + }) +}) diff --git a/src/modules/container-loading/components/ContainerCustomsPanel.vue b/src/modules/container-loading/components/ContainerCustomsPanel.vue new file mode 100644 index 00000000..40847c08 --- /dev/null +++ b/src/modules/container-loading/components/ContainerCustomsPanel.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/src/modules/container-loading/components/ContainerOverviewPanel.test.ts b/src/modules/container-loading/components/ContainerOverviewPanel.test.ts index 4767d2ce..f4137e24 100644 --- a/src/modules/container-loading/components/ContainerOverviewPanel.test.ts +++ b/src/modules/container-loading/components/ContainerOverviewPanel.test.ts @@ -47,11 +47,11 @@ describe('ContainerOverviewPanel', () => { expect(wrapper.text()).not.toContain('9007199254740999') }) - it('renders four compact document table rows with the operation column first', () => { + it('renders three compact non-customs document rows with the operation column first', () => { const wrapper = mount(ContainerOverviewPanel, { props: { overview, canManageDocuments: true, canManageCustoms: true, canManageException: true }, global: { plugins: [ElementPlus] } }) const headers = wrapper.findAll('.document-table thead th').map((cell) => cell.text()) expect(headers).toEqual(['操作', '资料类型', '文件名', '上传人', '上传时间', '状态']) - expect(wrapper.findAll('.document-table tbody tr')).toHaveLength(4) + expect(wrapper.findAll('.document-table tbody tr')).toHaveLength(3) expect(wrapper.findAll('.document-item')).toHaveLength(0) expect(wrapper.find('.document-table-wrap').exists()).toBe(true) const deliveryRow = wrapper.findAll('.document-table tbody tr').find((row) => row.text().includes('DO 资料'))! @@ -158,11 +158,4 @@ describe('ContainerOverviewPanel', () => { expect(wrapper.text()).not.toContain('Authorization') }) - it('keeps a completed customs document labelled as an attachment, not formal customs release', () => { - const customs = { ...overview.documents[0], documentType: 'CUSTOMS_DECLARATION', completed: true, fileName: 'customs.pdf' } - const wrapper = mount(ContainerOverviewPanel, { props: { overview: { ...overview, pda: null, documents: [customs] }, canManageDocuments: true, canManageCustoms: true, canManageException: true }, global: { plugins: [ElementPlus] } }) - expect(wrapper.text()).toContain('国内出口报关附件') - expect(wrapper.text()).not.toContain('已完成报关') - expect(wrapper.text()).not.toContain('已放行') - }) }) diff --git a/src/modules/container-loading/components/ContainerOverviewPanel.vue b/src/modules/container-loading/components/ContainerOverviewPanel.vue index 5f54dd0c..76071b84 100644 --- a/src/modules/container-loading/components/ContainerOverviewPanel.vue +++ b/src/modules/container-loading/components/ContainerOverviewPanel.vue @@ -1,6 +1,6 @@ @@ -603,9 +737,12 @@ onMounted(() => { void load(); void loadCustomers() }) .readonly-status-card strong { font-size: 16px; } .readonly-status-card p { max-width: 460px; margin: 0; color: var(--cc-muted); line-height: 1.6; } .meter-title { justify-content: space-between; margin-bottom: 8px; font-size: 12px; } -.plan-pane :deep(.el-input-number) { width: 120px; } +.package-count-editor { display: flex; min-width: 0; } +.plan-pane :deep(.package-count-editor .el-input-number) { width: 100%; min-width: 0; } .assign-dialog p { margin: 0 0 10px; } .assign-dialog :deep(.el-input-number) { width: 100%; } +.candidate-group { display: grid; gap: 4px; } +.candidate-block { color: var(--el-color-danger) !important; } @media (max-width: 1180px) { .dispatch-grid { grid-template-columns: 1fr; height: auto; min-height: 0; overflow: visible; } .embedded-smart-loading .dispatch-grid { height: auto; } diff --git a/src/modules/container-loading/pages/SmartLoadingWorkbenchView.test.ts b/src/modules/container-loading/pages/SmartLoadingWorkbenchView.test.ts index 2621cc3c..3c3dbfb0 100644 --- a/src/modules/container-loading/pages/SmartLoadingWorkbenchView.test.ts +++ b/src/modules/container-loading/pages/SmartLoadingWorkbenchView.test.ts @@ -1,4 +1,4 @@ -import ElementPlus from 'element-plus' +import ElementPlus, { ElMessageBox } from 'element-plus' import { AxiosError } from 'axios' import { createPinia, setActivePinia } from 'pinia' import { createMemoryHistory, createRouter } from 'vue-router' @@ -7,13 +7,14 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { readFileSync } from 'node:fs' import { resolve } from 'node:path' import SmartLoadingWorkbenchView from './SmartLoadingWorkbenchView.vue' -import { getContainer, getSmartLoadingPlanByBooking, listSmartLoadingCandidates, recommendSmartLoading } from '../api/platformContainerLoading' +import { assignSmartLoadingGroup, assignSmartLoadingItem, getContainer, getSmartLoadingPlanByBooking, listSmartLoadingCandidates, recommendSmartLoading, removeSmartLoadingGroup } from '../api/platformContainerLoading' vi.mock('../api/platformContainerLoading', () => ({ getContainer: vi.fn(), getSmartLoadingPlanByBooking: vi.fn(), listSmartLoadingCandidates: vi.fn(), - createSmartLoadingPlan: vi.fn(), assignSmartLoadingItem: vi.fn(), recommendSmartLoading: vi.fn(), - adjustSmartLoadingItem: vi.fn(), removeSmartLoadingItem: vi.fn(), pushSmartLoadingPreload: vi.fn(), + createSmartLoadingPlan: vi.fn(), assignSmartLoadingItem: vi.fn(), assignSmartLoadingGroup: vi.fn(), recommendSmartLoading: vi.fn(), + adjustSmartLoadingItem: vi.fn(), removeSmartLoadingItem: vi.fn(), removeSmartLoadingGroup: vi.fn(), pushSmartLoadingPreload: vi.fn(), })) +vi.mock('../smartLoadingPlanGroups', () => ({ loadSmartLoadingPlanCoLoadGroups: vi.fn().mockResolvedValue(new Map()) })) vi.mock('@/core/access/accessPreview', () => ({ useAccessPreviewStore: () => ({ can: () => true }) })) const container = { @@ -30,6 +31,7 @@ const planResponse = { canAssign: true, canEdit: true, blockedReason: null, finalCompletionStatus: 'NOT_STARTED' as const, pdaTaskId: null, pdaTaskStatus: null, pdaTaskVersion: null, items: [], } +const candidate = { accountId: '1', inboundId: '2', orderId: '4', orderNo: 'ORD-1', inboundCode: 'IN-1', warehouseId: '8', channelCode: 'ZBYHK', channelName: '美森正班海卡包税', destinationWarehouseId: '9', destinationWarehouseCode: 'LAX9', destinationWarehouseName: 'LAX9', customerName: '示例企业', goodsSummary: '服装', availablePackageCount: 12, unitGrossWeightKg: 10, unitNetWeightKg: 9, averageUnitVolumeCbm: 0.2, availableVolumeCbm: 2.4, coLoadGroupId: null, groupNo: null, memberCount: null, groupTotalBoxes: null, locked: null, blockReason: null } describe('SmartLoadingWorkbenchView', () => { beforeEach(() => { @@ -37,7 +39,7 @@ describe('SmartLoadingWorkbenchView', () => { vi.clearAllMocks() vi.mocked(getContainer).mockResolvedValue(container) vi.mocked(getSmartLoadingPlanByBooking).mockResolvedValue(planResponse) - vi.mocked(listSmartLoadingCandidates).mockResolvedValue([{ accountId: '1', inboundId: '2', orderId: '4', orderNo: 'ORD-1', inboundCode: 'IN-1', warehouseId: '8', channelCode: 'ZBYHK', channelName: '美森正班海卡包税', destinationWarehouseId: '9', destinationWarehouseCode: 'LAX9', destinationWarehouseName: 'LAX9', customerName: '示例企业', goodsSummary: '服装', availablePackageCount: 12, unitGrossWeightKg: 10, unitNetWeightKg: 9, averageUnitVolumeCbm: 0.2, availableVolumeCbm: 2.4 }]) + vi.mocked(listSmartLoadingCandidates).mockResolvedValue([candidate]) }) it('restores the real draft and explains candidate capacity', async () => { @@ -99,6 +101,10 @@ describe('SmartLoadingWorkbenchView', () => { expect(source).toContain("canPush && plan?.status === 'EDITING'") expect(source).not.toContain("canPush && plan?.status === 'EDITING' && container?.containerNo") expect(source).toContain('推送后生成预装清单,不会直接开放 PDA') + expect(source).toContain('后续还需补集装箱号、确认预装。确认继续?') + expect(source).toContain('预装清单已生成,请继续完成集装箱号和预装确认') + expect(source).not.toContain('关联并放舱真实订舱') + expect(source).not.toContain('订舱放舱') expect(source).not.toContain('link type="primary" :disabled="!routeMatches(row)') expect(source).not.toContain("label: '目的仓'") expect(source).not.toContain('plan.planNo') @@ -107,4 +113,68 @@ describe('SmartLoadingWorkbenchView', () => { expect(source).toContain('集装箱号') expect(source).not.toContain('当前柜号') }) + + it('keeps the package count editor inside its table cell without overflow ellipsis', () => { + const source = readFileSync(resolve(process.cwd(), 'src/modules/container-loading/pages/SmartLoadingWorkbenchView.vue'), 'utf8') + expect(source).toContain('
{ + vi.mocked(listSmartLoadingCandidates).mockResolvedValue([ + { ...candidate, inboundId: '201', orderId: '301', inboundCode: 'IN-201', availablePackageCount: 4, availableVolumeCbm: 0.8, coLoadGroupId: '9007199254740999', groupNo: 'CLG-9007199254740999', memberCount: 3, groupTotalBoxes: 12, locked: false, blockReason: null }, + { ...candidate, inboundId: '203', orderId: '301', orderNo: 'ORD-1', inboundCode: 'IN-203', availablePackageCount: 2, availableVolumeCbm: 0.4, coLoadGroupId: '9007199254740999', groupNo: 'CLG-9007199254740999', memberCount: 3, groupTotalBoxes: 12, locked: false, blockReason: null }, + { ...candidate, accountId: '2', inboundId: '202', orderId: '302', inboundCode: 'IN-202', availablePackageCount: 6, availableVolumeCbm: 1.2, coLoadGroupId: '9007199254740999', groupNo: 'CLG-9007199254740999', memberCount: 3, groupTotalBoxes: 12, locked: false, blockReason: null }, + ]) + vi.mocked(assignSmartLoadingGroup).mockResolvedValue(planResponse) + const router = createRouter({ history: createMemoryHistory(), routes: [{ path: '/container-loading/:containerId/smart-loading', component: SmartLoadingWorkbenchView }] }) + await router.push(`/container-loading/${container.id}/smart-loading`); await router.isReady() + const wrapper = mount(SmartLoadingWorkbenchView, { attachTo: document.body, global: { plugins: [ElementPlus, router] } }) + await flushPromises() + expect(wrapper.text()).toContain('CLG-9007199254740999 · 2 票') + expect(wrapper.text()).toContain('3 个入仓片段') + expect(wrapper.text()).toContain('ORD-1:IN-201、IN-203') + expect(wrapper.text()).toContain('整组 12 箱') + expect(wrapper.findAll('button').filter((button) => button.text().includes('整组分配'))).toHaveLength(1) + await wrapper.findAll('button').find((button) => button.text().includes('整组分配'))!.trigger('click') + await flushPromises() + ;([...document.body.querySelectorAll('button')].find((button) => button.textContent?.includes('确认整组分配')) as HTMLButtonElement).click() + await flushPromises() + expect(assignSmartLoadingGroup).toHaveBeenCalledWith(planResponse.id, '201', planResponse.version) + expect(assignSmartLoadingItem).not.toHaveBeenCalled() + wrapper.unmount() + }) + + it('shows an exact three-member group block and prevents individual assignment', async () => { + vi.mocked(listSmartLoadingCandidates).mockResolvedValue(['401', '402', '403'].map((inboundId, index) => ({ + ...candidate, inboundId, orderId: `5${index}`, inboundCode: `IN-${inboundId}`, coLoadGroupId: '9900', groupNo: 'CLG-9900', + memberCount: 3, groupTotalBoxes: 18, locked: false, blockReason: '同柜不可拆组成员候选不齐,缺少 1 票', + }))) + const router = createRouter({ history: createMemoryHistory(), routes: [{ path: '/container-loading/:containerId/smart-loading', component: SmartLoadingWorkbenchView }] }) + await router.push(`/container-loading/${container.id}/smart-loading`); await router.isReady() + const wrapper = mount(SmartLoadingWorkbenchView, { global: { plugins: [ElementPlus, router] } }) + await flushPromises() + expect(wrapper.text()).toContain('CLG-9900 · 3 票') + expect(wrapper.text()).toContain('同柜不可拆组成员候选不齐,缺少 1 票') + const button = wrapper.findAll('button').find((item) => item.text().includes('整组分配'))! + expect(button.attributes('disabled')).toBeDefined() + expect(wrapper.text()).not.toContain('本次计划装柜箱数') + }) + + it('keeps an ordinary ungrouped inbound on the existing partial-count assignment', async () => { + vi.mocked(assignSmartLoadingItem).mockResolvedValue(planResponse) + const router = createRouter({ history: createMemoryHistory(), routes: [{ path: '/container-loading/:containerId/smart-loading', component: SmartLoadingWorkbenchView }] }) + await router.push(`/container-loading/${container.id}/smart-loading`); await router.isReady() + const wrapper = mount(SmartLoadingWorkbenchView, { attachTo: document.body, global: { plugins: [ElementPlus, router] } }) + await flushPromises() + await wrapper.findAll('button').find((button) => button.text() === '分配')!.trigger('click') + await flushPromises() + expect(document.body.textContent).toContain('本次计划装柜箱数') + ;([...document.body.querySelectorAll('button')].find((button) => button.textContent?.trim() === '确认分配') as HTMLButtonElement).click() + await flushPromises() + expect(assignSmartLoadingItem).toHaveBeenCalledWith(planResponse.id, { inboundId: '2', packageCount: 1, expectedVersion: planResponse.version }) + expect(assignSmartLoadingGroup).not.toHaveBeenCalled() + wrapper.unmount() + }) + }) diff --git a/src/modules/container-loading/pages/SmartLoadingWorkbenchView.vue b/src/modules/container-loading/pages/SmartLoadingWorkbenchView.vue index def71293..af377aab 100644 --- a/src/modules/container-loading/pages/SmartLoadingWorkbenchView.vue +++ b/src/modules/container-loading/pages/SmartLoadingWorkbenchView.vue @@ -11,12 +11,13 @@ import DataTable, { type DataTableColumn } from '@/shared/components/DataTable.v import LoadErrorState from '@/shared/components/LoadErrorState.vue' import { getApiErrorDetails, type ApiErrorDetails } from '@/shared/api/http' import { - adjustSmartLoadingItem, assignSmartLoadingItem, createSmartLoadingPlan, getContainer, + adjustSmartLoadingItem, assignSmartLoadingGroup, assignSmartLoadingItem, createSmartLoadingPlan, getContainer, getSmartLoadingPlanByBooking, listSmartLoadingCandidates, pushSmartLoadingPreload, - recommendSmartLoading, removeSmartLoadingItem, + recommendSmartLoading, removeSmartLoadingGroup, removeSmartLoadingItem, } from '../api/platformContainerLoading' import type { ContainerBookingResource, SmartLoadingCandidate, SmartLoadingPlan } from '../types' import { groupSmartLoadingItems, type SmartLoadingInboundItem } from '../smartLoadingItems' +import { loadSmartLoadingPlanCoLoadGroups, type SmartLoadingPlanCoLoadGroup } from '../smartLoadingPlanGroups' const route = useRoute() const router = useRouter() @@ -31,9 +32,10 @@ const loadError = ref(null) const mutationError = ref(null) const noDraft = ref(false) const assignOpen = ref(false) -const selectedCandidate = ref(null) +const selectedCandidate = ref(null) const assignForm = reactive({ packageCount: 1 }) const quantityDrafts = reactive>({}) +const planGroupsByInboundId = ref(new Map()) const canCreate = computed(() => access.can('platform:firstleg:smart-loading:create')) const canAssign = computed(() => access.can('platform:firstleg:smart-loading:assign')) @@ -43,7 +45,90 @@ const canViewLoadingList = computed(() => access.can('platform:firstleg:loading- const editable = computed(() => plan.value?.canEdit === true) const assignable = computed(() => plan.value?.canAssign === true) const assignedInboundIds = computed(() => new Set((plan.value?.items || []).map((item) => item.inboundId))) -const displayedPlanItems = computed(() => groupSmartLoadingItems(plan.value?.items || [])) +type SmartLoadingCandidateRow = SmartLoadingCandidate & { sourceCandidates: SmartLoadingCandidate[]; memberInboundCodes: string[]; memberOrderSummaries: string[]; memberOrderCount: number; inboundFragmentCount: number } +function memberOrderSummaries(members: T[]) { + const orders = new Map() + for (const member of members) { + const current = orders.get(member.orderId) || { label: member.orderNo || '订单编码待补充', inboundCodes: [] } + const inboundCode = member.inboundCode || '入仓码暂缺' + if (!current.inboundCodes.includes(inboundCode)) current.inboundCodes.push(inboundCode) + orders.set(member.orderId, current) + } + return [...orders.values()].map((order) => `${order.label}:${order.inboundCodes.join('、')}`) +} +function groupMemberLabel(group: SmartLoadingPlanCoLoadGroup) { + return group.inboundFragmentCount === group.memberOrderCount + ? `${group.memberOrderCount} 票` + : `${group.memberOrderCount} 票 · ${group.inboundFragmentCount} 个入仓片段` +} +const displayedCandidates = computed(() => { + const rows: SmartLoadingCandidateRow[] = [] + const groups = new Map() + for (const candidate of candidates.value) { + if (!candidate.coLoadGroupId) { + rows.push({ ...candidate, sourceCandidates: [candidate], memberInboundCodes: [candidate.inboundCode || '入仓码暂缺'], memberOrderSummaries: memberOrderSummaries([candidate]), memberOrderCount: 1, inboundFragmentCount: 1 }) + continue + } + groups.set(candidate.coLoadGroupId, [...(groups.get(candidate.coLoadGroupId) || []), candidate]) + } + for (const members of groups.values()) { + const first = members[0] + rows.push({ + ...first, + inboundCode: members.map((member) => member.inboundCode).filter(Boolean).join('、'), + customerName: [...new Set(members.map((member) => member.customerName).filter(Boolean))].join('、'), + goodsSummary: [...new Set(members.map((member) => member.goodsSummary).filter(Boolean))].join('、'), + availablePackageCount: first.groupTotalBoxes || members.reduce((sum, member) => sum + member.availablePackageCount, 0), + availableVolumeCbm: members.reduce((sum, member) => sum + Number(member.availableVolumeCbm || 0), 0), + sourceCandidates: members, + memberInboundCodes: members.map((member) => member.inboundCode || '入仓码暂缺'), + memberOrderSummaries: memberOrderSummaries(members), + memberOrderCount: new Set(members.map((member) => member.orderId)).size, + inboundFragmentCount: Number(first.memberCount || members.length), + }) + } + return rows +}) +type SmartLoadingPlanRow = SmartLoadingInboundItem & { coLoadGroup: SmartLoadingPlanCoLoadGroup | null; memberInboundCodes: string[]; memberOrderSummaries: string[] } +const displayedPlanItems = computed(() => { + const inboundRows = groupSmartLoadingItems(plan.value?.items || []) + const result: SmartLoadingPlanRow[] = [] + const grouped = new Map() + for (const row of inboundRows) { + const group = planGroupsByInboundId.value.get(row.inboundId) + if (!group) { + result.push({ ...row, coLoadGroup: null, memberInboundCodes: [row.inboundCode || '入仓码暂缺'], memberOrderSummaries: memberOrderSummaries([row]) }) + continue + } + grouped.set(group.groupId, [...(grouped.get(group.groupId) || []), row]) + } + for (const rows of grouped.values()) { + const first = rows[0] + const group = planGroupsByInboundId.value.get(first.inboundId)! + result.push({ + ...first, + id: `coload:${group.groupId}`, + inboundCode: rows.map((row) => row.inboundCode).filter(Boolean).join('、'), + customerName: [...new Set(rows.map((row) => row.customerName).filter(Boolean))].join('、'), + skuCode: [...new Set(rows.map((row) => row.skuCode).filter(Boolean))].join('、'), + productNameZh: [...new Set(rows.map((row) => row.productNameZh).filter(Boolean))].join('、'), + packageCount: rows.reduce((sum, row) => sum + row.packageCount, 0), + productQuantity: rows.reduce((sum, row) => sum + Number(row.productQuantity || 0), 0), + grossWeightKg: rows.reduce((sum, row) => sum + Number(row.grossWeightKg || 0), 0), + volumeCbm: rows.reduce((sum, row) => sum + Number(row.volumeCbm || 0), 0), + pickedPackageCount: rows.reduce((sum, row) => sum + row.pickedPackageCount, 0), + minPackageCount: rows.reduce((sum, row) => sum + row.minPackageCount, 0), + canAdjust: false, + canRemove: rows.every((row) => row.canRemove), + sourceItems: rows.flatMap((row) => row.sourceItems), + detailCount: rows.reduce((sum, row) => sum + row.detailCount, 0), + coLoadGroup: group, + memberInboundCodes: rows.map((row) => row.inboundCode || '入仓码暂缺'), + memberOrderSummaries: memberOrderSummaries(rows), + }) + } + return result +}) const totalVolume = computed(() => (plan.value?.items || []).reduce((sum, item) => sum + Number(item.volumeCbm || 0), 0)) const totalWeight = computed(() => (plan.value?.items || []).reduce((sum, item) => sum + Number(item.grossWeightKg || 0), 0)) const volumeLimit = computed(() => Number(container.value?.capacityCbm || 0) * 1.1) @@ -57,6 +142,7 @@ const itemColumns: DataTableColumn[] = [ { key: 'actions', label: '操作', width: 180, fixed: 'left', slotName: 'actions' }, { key: 'sequence', prop: 'loadSequence', label: '顺序', width: 75 }, { key: 'order', label: '入仓码', minWidth: 190, slotName: 'order' }, + { key: 'coLoadGroup', label: '同柜不可拆', minWidth: 210, slotName: 'coLoadGroup' }, { key: 'customerName', prop: 'customerName', label: '客户', minWidth: 150 }, { key: 'goods', label: '货物', minWidth: 190, slotName: 'goods' }, { key: 'packageCount', label: '分配箱数', width: 150, slotName: 'packageCount' }, @@ -66,6 +152,7 @@ const itemColumns: DataTableColumn[] = [ const candidateColumns: DataTableColumn[] = [ { key: 'actions', label: '操作', width: 110, fixed: 'left', slotName: 'actions' }, { key: 'inboundCode', prop: 'inboundCode', label: '入仓码', minWidth: 190, fixed: 'left', showOverflowTooltip: true }, + { key: 'coLoadGroup', label: '同柜不可拆', minWidth: 210, slotName: 'coLoadGroup' }, { key: 'customerName', prop: 'customerName', label: '客户', minWidth: 150 }, { key: 'goodsSummary', prop: 'goodsSummary', label: '货物摘要', minWidth: 180, showOverflowTooltip: true }, { key: 'availablePackageCount', prop: 'availablePackageCount', label: '可用箱数', width: 110 }, @@ -76,7 +163,7 @@ const candidateColumns: DataTableColumn[] = [ function formatNumber(value: number, digits = 3) { return Number.isFinite(value) ? value.toLocaleString('zh-CN', { maximumFractionDigits: digits }) : '0' } function percentage(value: number) { return Number.isFinite(value) ? Number(Math.max(value, 0).toFixed(2)) : 0 } -function candidateRow(source: object) { return source as SmartLoadingCandidate } +function candidateRow(source: object) { return source as SmartLoadingCandidateRow } function itemRow(source: object) { return source as SmartLoadingInboundItem } function explainCandidate(source: object) { const candidate = candidateRow(source) @@ -100,9 +187,15 @@ function syncDrafts(preserved: Record = {}) { for (const item of displayedPlanItems.value) quantityDrafts[item.id] = preserved[item.id] ?? item.packageCount } function acceptPlan(next: SmartLoadingPlan, preserved: Record = {}) { plan.value = next; noDraft.value = false; syncDrafts(preserved) } +async function acceptPlanWithGroups(next: SmartLoadingPlan, preserved: Record = {}) { + acceptPlan(next, preserved) + planGroupsByInboundId.value = await loadSmartLoadingPlanCoLoadGroups(next) + syncDrafts(preserved) +} async function load() { loading.value = true; loadError.value = null; noDraft.value = false + planGroupsByInboundId.value = new Map() try { container.value = await getContainer(containerId.value) if (container.value.planStatus === 'COMPLETED') { @@ -110,7 +203,7 @@ async function load() { candidates.value = [] return } - try { acceptPlan(await getSmartLoadingPlanByBooking(containerId.value)) } + try { await acceptPlanWithGroups(await getSmartLoadingPlanByBooking(containerId.value)) } catch (error) { const detail = getApiErrorDetails(error) if (detail.code === 'A0404') { plan.value = null; noDraft.value = true } @@ -132,34 +225,51 @@ function openOperationalList() { async function createPlan() { mutating.value = true mutationError.value = null - try { acceptPlan(await createSmartLoadingPlan(containerId.value, null)); ElMessage.success('排柜计划已创建') } + try { await acceptPlanWithGroups(await createSmartLoadingPlan(containerId.value, null)); ElMessage.success('排柜计划已创建') } catch (error) { await handleMutationError(error, '创建排柜计划失败') } finally { mutating.value = false } } -function openAssign(source: object) { const candidate = candidateRow(source); selectedCandidate.value = candidate; assignForm.packageCount = Math.min(candidate.availablePackageCount, 1); assignOpen.value = true } +function openAssign(source: object) { + const candidate = candidateRow(source) + if (candidateBlocked(candidate)) return + selectedCandidate.value = candidate + assignForm.packageCount = candidate.coLoadGroupId ? Number(candidate.groupTotalBoxes || candidate.availablePackageCount) : Math.min(candidate.availablePackageCount, 1) + assignOpen.value = true +} async function assign() { if (!plan.value || !selectedCandidate.value || assignForm.packageCount < 1) return + if (selectedCandidate.value.coLoadGroupId && (selectedCandidate.value.blockReason || selectedCandidate.value.locked)) return mutating.value = true mutationError.value = null try { - acceptPlan(await assignSmartLoadingItem(plan.value.id, { inboundId: selectedCandidate.value.inboundId, packageCount: assignForm.packageCount, expectedVersion: plan.value.version })) - assignOpen.value = false; ElMessage.success('货物已分配') + const selected = selectedCandidate.value + const next = selected.coLoadGroupId + ? await assignSmartLoadingGroup(plan.value.id, selected.inboundId, plan.value.version) + : await assignSmartLoadingItem(plan.value.id, { inboundId: selected.inboundId, packageCount: assignForm.packageCount, expectedVersion: plan.value.version }) + await acceptPlanWithGroups(next) + assignOpen.value = false + ElMessage.success(selected.coLoadGroupId ? `同柜不可拆组 ${selected.groupNo} 已整组分配` : '货物已分配') } catch (error) { await handleMutationError(error, '分配失败') } finally { mutating.value = false } } +function candidateBlocked(candidate: SmartLoadingCandidateRow) { + return Boolean(candidate.blockReason) || candidate.locked === true + || candidate.sourceCandidates.some((member) => assignedInboundIds.value.has(member.inboundId)) + || candidate.availablePackageCount < 1 +} async function recommend() { if (!plan.value) return mutating.value = true mutationError.value = null try { try { - acceptPlan(await recommendSmartLoading(plan.value.id, plan.value.version)) + await acceptPlanWithGroups(await recommendSmartLoading(plan.value.id, plan.value.version)) } catch (error) { const details = getApiErrorDetails(error, '智能推荐失败') if (details.code !== 'A0409' || !/(版本|并发|已被修改|已变化)/.test(details.message)) throw error await load() if (!plan.value) throw error - acceptPlan(await recommendSmartLoading(plan.value.id, plan.value.version)) + await acceptPlanWithGroups(await recommendSmartLoading(plan.value.id, plan.value.version)) } ElMessage.success('智能建议已生成,请人工核对后再推送') } @@ -173,24 +283,34 @@ async function adjust(source: object) { if (!Number.isInteger(count) || count < item.minPackageCount) { ElMessage.warning(`分配箱数不能低于已拣下限 ${item.minPackageCount} 箱`); return } mutating.value = true mutationError.value = null - try { acceptPlan(await adjustSmartLoadingItem(plan.value.id, item.id, count, plan.value.version, item.version)); ElMessage.success('箱数已调整') } + try { await acceptPlanWithGroups(await adjustSmartLoadingItem(plan.value.id, item.id, count, plan.value.version, item.version)); ElMessage.success('箱数已调整') } catch (error) { await handleMutationError(error, '调整失败') } finally { mutating.value = false } } async function remove(source: object) { const item = itemRow(source) if (!plan.value || !item.canRemove) return - await ElMessageBox.confirm(`确认从计划移除入仓码“${item.inboundCode || '—'}”的 ${item.packageCount} 箱吗?`, '移除装柜明细', { type: 'warning', confirmButtonText: '移除', cancelButtonText: '取消' }).catch(() => false).then(async (confirmed) => { + const row = source as SmartLoadingPlanRow + const message = row.coLoadGroup + ? `确认整组移除 ${row.coLoadGroup.groupNo}(${groupMemberLabel(row.coLoadGroup)}、${row.packageCount} 箱)吗?组内所有入仓片段将联动移除。` + : `确认从计划移除入仓码“${item.inboundCode || '—'}”的 ${item.packageCount} 箱吗?` + await ElMessageBox.confirm(message, row.coLoadGroup ? '移除同柜不可拆组' : '移除装柜明细', { type: 'warning', confirmButtonText: row.coLoadGroup ? '移除整组' : '移除', cancelButtonText: '取消' }).catch(() => false).then(async (confirmed) => { if (!confirmed || !plan.value) return mutating.value = true mutationError.value = null try { + if (row.coLoadGroup) { + await acceptPlanWithGroups(await removeSmartLoadingGroup(plan.value!.id, row.coLoadGroup.groupId, plan.value!.version)) + await load() + ElMessage.success(`同柜不可拆组 ${row.coLoadGroup.groupNo} 已整组移除`) + return + } let current = plan.value! for (const original of item.sourceItems) { const currentItem = current.items.find((value) => value.id === original.id) if (!currentItem) continue current = await removeSmartLoadingItem(current.id, currentItem.id, current.version, currentItem.version) - acceptPlan(current) + await acceptPlanWithGroups(current) } await load() ElMessage.success('该入仓码已从装柜方案移除') @@ -201,11 +321,11 @@ async function remove(source: object) { } async function pushPreload() { if (!plan.value) return - const confirmed = await ElMessageBox.confirm('推送后生成预装清单,不会直接开放 PDA。后续还需补集装箱号、关联并放舱真实订舱、确认预装。确认继续?', '推送预装清单', { type: 'warning', confirmButtonText: '确认推送', cancelButtonText: '取消' }).catch(() => false) + const confirmed = await ElMessageBox.confirm('推送后生成预装清单,不会直接开放 PDA。后续还需补集装箱号、确认预装。确认继续?', '推送预装清单', { type: 'warning', confirmButtonText: '确认推送', cancelButtonText: '取消' }).catch(() => false) if (!confirmed || !plan.value) return mutating.value = true mutationError.value = null - try { acceptPlan(await pushSmartLoadingPreload(plan.value.id, plan.value.version)); ElMessage.success('预装清单已生成,请继续完成集装箱号、订舱放舱和预装确认') } + try { await acceptPlanWithGroups(await pushSmartLoadingPreload(plan.value.id, plan.value.version)); ElMessage.success('预装清单已生成,请继续完成集装箱号和预装确认') } catch (error) { await handleMutationError(error, '推送失败') } finally { mutating.value = false } } @@ -265,22 +385,24 @@ onMounted(load) - + + - + - + - + + -

{{ selectedCandidate.inboundCode || '入仓码暂缺' }}

{{ selectedCandidate.goodsSummary || '货物摘要暂缺' }} · 可用 {{ selectedCandidate.availablePackageCount }} 箱

只记录数量,具体上柜箱号未核验。
+

{{ selectedCandidate.groupNo || selectedCandidate.inboundCode || '入仓码暂缺' }}

@@ -306,8 +428,12 @@ onMounted(load) .readonly-status-card p { margin: 0; color: var(--cc-muted); } .meter-title { justify-content: space-between; gap: 12px; margin-bottom: 10px; font-size: 13px; } .row-actions { min-width: 150px; } -.workbench :deep(.el-input-number) { width: 130px; } +.package-count-editor { display: flex; min-width: 0; } +.workbench :deep(.package-count-editor .el-input-number) { width: 100%; min-width: 0; } .assign-dialog p { margin: 0 0 10px; } .assign-dialog :deep(.el-input-number) { width: 100%; } +.candidate-group { display: grid; width: fit-content; gap: 3px; } +.candidate-group > span,.candidate-group > small { color: var(--cc-muted); font-size: 11px; } +.candidate-group .candidate-block { color: var(--el-color-danger); } @media (max-width: 760px) { .workbench-command-bar,.header-actions { width: 100%; flex-direction: column; align-items: stretch; } .workbench-identities { flex-direction: column; align-items: stretch; gap: 10px; } .summary-band,.capacity-grid { grid-template-columns: 1fr; } .meter-title { align-items: flex-start; flex-direction: column; } .header-actions .el-button { min-height: 44px; margin-left: 0; } } diff --git a/src/modules/container-loading/smartLoadingPlanGroups.test.ts b/src/modules/container-loading/smartLoadingPlanGroups.test.ts new file mode 100644 index 00000000..068c634d --- /dev/null +++ b/src/modules/container-loading/smartLoadingPlanGroups.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it, vi } from 'vitest' +import { loadSmartLoadingPlanCoLoadGroups } from './smartLoadingPlanGroups' +import type { SmartLoadingPlan } from './types' + +const item = { + id: '701', loadingPlanId: '99', accountId: '1', inboundId: '201', inboundDetailId: '801', orderId: '301', + orderNo: 'ORD-1', inboundCode: 'IN-201', customerName: '客户一', destinationWarehouseId: '9', destinationWarehouseCode: 'LAX9', destinationWarehouseName: 'LAX9', + skuCode: 'SKU-1', productNameZh: '货物一', packageCount: 5, productQuantity: 50, grossWeightKg: 50, volumeCbm: 1, + loadSequence: 1, version: 1, pickedPackageCount: 0, minPackageCount: 1, canAdjust: true, canRemove: true, +} + +const plan = { + id: '99', planNo: 'LP-99', status: 'EDITING', bookingId: '88', containerNo: null, voyageNo: null, version: 2, + canAssign: true, canEdit: true, blockedReason: null, finalCompletionStatus: 'NOT_STARTED', pdaTaskId: null, + pdaTaskStatus: null, pdaTaskVersion: null, + items: [item, { ...item, id: '702', inboundId: '202', inboundDetailId: '802', orderId: '302', orderNo: 'ORD-2', inboundCode: 'IN-202', packageCount: 7 }], +} satisfies SmartLoadingPlan + +describe('smart loading plan co-load groups', () => { + it('rebuilds the locked group from the current inbound association contract', async () => { + const lookup = vi.fn(async (inboundId: string) => ({ + inboundId, inboundCode: `IN-${inboundId}`, loadingPlanId: '99', coLoadGroupId: '9001', coLoadGroupNo: 'CLG-9001', items: [], + })) + const result = await loadSmartLoadingPlanCoLoadGroups(plan, lookup) + expect(lookup).toHaveBeenCalledTimes(2) + expect(result.get('201')).toEqual({ + groupId: '9001', groupNo: 'CLG-9001', lockedPlanId: '99', memberOrderCount: 2, inboundFragmentCount: 2, fullPackageCount: 12, + }) + expect(result.get('202')).toBe(result.get('201')) + }) + + it('leaves ordinary plan items ungrouped', async () => { + const result = await loadSmartLoadingPlanCoLoadGroups(plan, async (inboundId) => ({ inboundId, inboundCode: `IN-${inboundId}`, items: [] })) + expect(result.size).toBe(0) + }) +}) diff --git a/src/modules/container-loading/smartLoadingPlanGroups.ts b/src/modules/container-loading/smartLoadingPlanGroups.ts new file mode 100644 index 00000000..bf4fb008 --- /dev/null +++ b/src/modules/container-loading/smartLoadingPlanGroups.ts @@ -0,0 +1,47 @@ +import { getLoadingAssociationSummaryByInboundId, type LoadingAssociationSummary } from '@/shared/api/inboundCodeRelations' +import { groupSmartLoadingItems } from './smartLoadingItems' +import type { SmartLoadingPlan } from './types' + +export interface SmartLoadingPlanCoLoadGroup { + groupId: string + groupNo: string + lockedPlanId: string + memberOrderCount: number + inboundFragmentCount: number + fullPackageCount: number +} + +type AssociationLookup = (inboundId: string) => Promise + +export async function loadSmartLoadingPlanCoLoadGroups( + plan: SmartLoadingPlan, + lookup: AssociationLookup = getLoadingAssociationSummaryByInboundId, +) { + const inboundRows = groupSmartLoadingItems(plan.items || []) + if (!inboundRows.length) return new Map() + + const associations = await Promise.all(inboundRows.map(async (row) => ({ + row, + association: await lookup(row.inboundId), + }))) + const membersByGroupId = new Map() + for (const entry of associations) { + const groupId = String(entry.association.coLoadGroupId || '') + if (!groupId) continue + membersByGroupId.set(groupId, [...(membersByGroupId.get(groupId) || []), entry]) + } + + const groupsByInboundId = new Map() + for (const [groupId, members] of membersByGroupId) { + const group = { + groupId, + groupNo: members.find((entry) => entry.association.coLoadGroupNo)?.association.coLoadGroupNo || '同柜不可拆组', + lockedPlanId: members.find((entry) => entry.association.loadingPlanId)?.association.loadingPlanId || plan.id, + memberOrderCount: new Set(members.map((entry) => entry.row.orderId)).size, + inboundFragmentCount: members.length, + fullPackageCount: members.reduce((sum, entry) => sum + entry.row.packageCount, 0), + } satisfies SmartLoadingPlanCoLoadGroup + for (const { row } of members) groupsByInboundId.set(row.inboundId, group) + } + return groupsByInboundId +} diff --git a/src/modules/container-loading/types.ts b/src/modules/container-loading/types.ts index e2cdd977..0b204ec7 100644 --- a/src/modules/container-loading/types.ts +++ b/src/modules/container-loading/types.ts @@ -88,7 +88,7 @@ export interface BusinessDocument { version: number } -export type ContainerDocumentType = 'DESTINATION_CLEARANCE' | 'CUSTOMS_DECLARATION' | 'DELIVERY_ORDER' | 'PICKUP_ORDER' +export type ContainerDocumentType = 'DESTINATION_CLEARANCE' | 'DELIVERY_ORDER' | 'PICKUP_ORDER' export type ContainerDocumentStatus = 'MISSING' | 'UPLOADED' | 'COMPLETED' export interface ContainerOverviewDocument { @@ -149,8 +149,20 @@ export interface ContainerExceptionHistory { } export interface ContainerTimelineEntry { + id?: string | null + eventId?: string | null + idempotencyKey?: string | null eventType: string + action?: string | null + fromStatus?: string | null + toStatus?: string | null detail: string | null + summary?: string | null + changeSummary?: string | null + reason?: string | null + changedFields?: unknown + fieldChanges?: unknown + changes?: unknown operatorId: string | null operatorName: string | null occurredAt: string | null @@ -236,6 +248,12 @@ export interface SmartLoadingCandidate { unitNetWeightKg: number | null averageUnitVolumeCbm: number | null availableVolumeCbm: number | null + coLoadGroupId: string | null + groupNo: string | null + memberCount: number | null + groupTotalBoxes: number | null + locked: boolean | null + blockReason: string | null } export interface SmartLoadingItem { diff --git a/src/modules/customers/overseasStorageFee.test.ts b/src/modules/customers/overseasStorageFee.test.ts index 5bc622d1..0cae8f3d 100644 --- a/src/modules/customers/overseasStorageFee.test.ts +++ b/src/modules/customers/overseasStorageFee.test.ts @@ -9,7 +9,14 @@ const overseasPanelSource = readFileSync(resolve(process.cwd(), 'src/modules/cus vi.mock('@/shared/api/http', () => ({ http: { get: vi.fn(), put: vi.fn() }, - unwrapApiResponse: (response: { data: T }) => response.data, + unwrapApiResponse: (response: { data: T }) => { + const value = response.data as T & { code?: string; message?: string; data?: unknown } + if (value && typeof value === 'object' && 'code' in value) { + if (value.code !== '200') throw new Error(value.message || 'request failed') + return value.data as T + } + return value + }, })) const config = { id: 12, customerId: 9007199254740993n.toString(), customerName: '客户', currency: 'USD', tiers: [], version: 0, createdAt: null, updatedAt: null } @@ -46,6 +53,19 @@ describe('customer overseas storage fee api', () => { expect(result.version).toBe(1) }) + it('rejects a business error returned by the update endpoint', async () => { + vi.mocked(http.put).mockResolvedValue({ data: { code: 'A0400', message: '璇锋眰鏃犳晥', data: null } }) + + await expect(updateCustomerOverseasStorageFees(config.customerId, { + customerId: config.customerId, + customerName: '瀹㈡埛', + currency: 'USD', + version: 0, + tiers: [{ feeType: 'STORAGE', billingUnit: 'CBM', startDay: 1, endDay: null, unitPrice: 0 }], + })).rejects.toThrow('璇锋眰鏃犳晥') + expect(http.get).not.toHaveBeenCalled() + }) + it('normalizes an omitted end day as an open-ended tier', async () => { vi.mocked(http.get).mockResolvedValue({ data: { ...config, tiers: [{ id: 1, startDay: 91, unitPrice: 2, sortNo: 5, feeType: 'STORAGE', billingUnit: 'CBM' }] } }) const result = await getCustomerOverseasStorageFees(config.customerId) diff --git a/src/modules/customers/overseasStorageFee.ts b/src/modules/customers/overseasStorageFee.ts index f1816c2d..88e590d1 100644 --- a/src/modules/customers/overseasStorageFee.ts +++ b/src/modules/customers/overseasStorageFee.ts @@ -55,7 +55,8 @@ export async function getCustomerOverseasStorageFees(tenantId: string) { } export async function updateCustomerOverseasStorageFees(tenantId: string, request: OverseasStorageFeeUpdateRequest) { - await http.put>(path(tenantId), request) + const response = await http.put>(path(tenantId), request) + unwrapApiResponse(response) return getCustomerOverseasStorageFees(tenantId) } diff --git a/src/modules/finance/api/finance.test.ts b/src/modules/finance/api/finance.test.ts index 3e53ae0a..54d30f27 100644 --- a/src/modules/finance/api/finance.test.ts +++ b/src/modules/finance/api/finance.test.ts @@ -56,6 +56,28 @@ describe('finance api', () => { ]) }) + it('includes a supplier filter only for payable fee-pool requests', async () => { + const get = vi.spyOn(http, 'get').mockResolvedValue({ code: '200', message: 'ok', data: [] }) + + await listFinanceFeePool('10001', 'PAYABLE', '301') + + expect(get).toHaveBeenCalledWith('/platform/finance/v1/fee-pool', { + params: { customerId: '10001', direction: 'PAYABLE', supplierId: '301' }, + }) + }) + + it('preserves settlement mode from fee-pool candidates for client-side eligibility checks', async () => { + vi.spyOn(http, 'get').mockResolvedValue({ code: '200', message: 'ok', data: [{ + poolItemId: 'PAYABLE:42', customerId: 10001, direction: 'PAYABLE', sourceType: 'INBOUND_FEE', sourceId: 42, + sourceVersion: 1, feeItemName: '进仓费', amount: 33, currency: 'CNY', settlementMode: 'DIRECT_PAID', + status: 'AVAILABLE', createdAt: '2026-08-26T00:00:00', + }] }) + + const [candidate] = await listFinanceFeePool('10001', 'PAYABLE', '301') + + expect(candidate.settlementMode).toBe('DIRECT_PAID') + }) + it('uses the formal G1 account list path and fixed page DTO', async () => { const get = vi.spyOn(http, 'get').mockResolvedValue({ code: '200', message: 'success', requestId: 'req-g1', traceId: 'trace-g1', data: [{ customerId: 10001, customerCode: 'C-10001', customerName: '客户A', contactName: '张三', contactPhone: '13800000000', outstandingReceivable: 300, pendingBilling: 50, receivedInPeriod: 100, totalCost: 260, paidCost: 180, outstandingPayable: 80, status: 'ACTIVE', lastChangedAt: '2026-08-11T10:00:00' }], page: { page: 2, pageSize: 20, total: 21 } }) diff --git a/src/modules/finance/api/finance.ts b/src/modules/finance/api/finance.ts index 368c4bf9..6bdada3e 100644 --- a/src/modules/finance/api/finance.ts +++ b/src/modules/finance/api/finance.ts @@ -111,12 +111,14 @@ export async function getFinanceCustomerAccountSummary(customerId: string): Prom } } -export async function listFinanceFeePool(customerId?: string, direction?: 'RECEIVABLE' | 'PAYABLE'): Promise { - const response = await http.get, ApiEnvelope>(`${basePath}/fee-pool`, { params: { customerId: customerId?.trim() || undefined, direction } }) +export async function listFinanceFeePool(customerId?: string, direction?: 'RECEIVABLE' | 'PAYABLE', supplierId?: string): Promise { + const params: Record = { customerId: customerId?.trim() || undefined, direction } + if (supplierId?.trim()) params.supplierId = supplierId.trim() + const response = await http.get, ApiEnvelope>(`${basePath}/fee-pool`, { params }) return unwrapApiResponse(response).map((item) => { const poolItemId = stringValue(item.poolItemId) const feeSourceId = stringValue(item.sourceType) === 'MANUAL_COST' ? null : (poolItemId.match(/^[A-Z_]+:(\d+)$/)?.[1] ?? null) - return { poolItemId, feeSourceId, customerId: stringValue(item.customerId), customerName: stringValue(item.customerName), direction: stringValue(item.direction) as FinanceFeePoolItem['direction'], sourceType: stringValue(item.sourceType), sourceId: stringValue(item.sourceId), sourceVersion: numberValue(item.sourceVersion), orderId: item.orderId == null ? null : stringValue(item.orderId), inboundId: item.inboundId == null ? null : stringValue(item.inboundId), containerId: item.containerId == null ? null : stringValue(item.containerId), feeItemName: stringValue(item.feeItemName), amount: numberValue(item.amount), currency: 'CNY', status: stringValue(item.status), createdAt: stringValue(item.createdAt) } + return { poolItemId, feeSourceId, customerId: stringValue(item.customerId), customerName: stringValue(item.customerName), direction: stringValue(item.direction) as FinanceFeePoolItem['direction'], sourceType: stringValue(item.sourceType), sourceId: stringValue(item.sourceId), sourceVersion: numberValue(item.sourceVersion), orderId: item.orderId == null ? null : stringValue(item.orderId), inboundId: item.inboundId == null ? null : stringValue(item.inboundId), containerId: item.containerId == null ? null : stringValue(item.containerId), feeItemName: stringValue(item.feeItemName), amount: numberValue(item.amount), currency: 'CNY', settlementMode: item.settlementMode == null ? null : stringValue(item.settlementMode), status: stringValue(item.status), createdAt: stringValue(item.createdAt) } }) } @@ -124,7 +126,7 @@ export async function listFinanceAccounts(params: { page?: number; size?: number const query = { page: params.page ?? 1, pageSize: params.size ?? 20, customerId: params.customerId || undefined, status: params.status || undefined } const response = await http.get & { page?: RawResource }, ApiEnvelope & { page?: RawResource }>(`${basePath}/accounts`, { params: query }) const data = unwrapApiResponse(response) - const records = data.map((item) => ({ customerId: stringValue(item.customerId), customerCode: stringValue(item.customerCode), customerName: stringValue(item.customerName), contactName: stringValue(item.contactName), contactPhone: stringValue(item.contactPhone), outstandingReceivable: numberValue(item.outstandingReceivable), pendingBilling: numberValue(item.pendingBilling), receivedInPeriod: numberValue(item.receivedInPeriod), totalCost: numberValue(item.totalCost), paidCost: numberValue(item.paidCost), outstandingPayable: numberValue(item.outstandingPayable), status: stringValue(item.status), lastChangedAt: stringValue(item.lastChangedAt) })) + const records: FinanceAccountSummary[] = data.map((item) => ({ customerId: stringValue(item.customerId), customerCode: stringValue(item.customerCode), customerName: stringValue(item.customerName), contactName: stringValue(item.contactName), contactPhone: stringValue(item.contactPhone), outstandingReceivable: numberValue(item.outstandingReceivable), pendingBilling: numberValue(item.pendingBilling), receivedInPeriod: numberValue(item.receivedInPeriod), totalCost: numberValue(item.totalCost), paidCost: numberValue(item.paidCost), outstandingPayable: numberValue(item.outstandingPayable), status: stringValue(item.status), lastChangedAt: stringValue(item.lastChangedAt) })) const total = numberValue(response.page?.total ?? records.length) const pageSize = numberValue(response.page?.pageSize ?? query.pageSize) || query.pageSize return { records, total, pages: Math.max(1, Math.ceil(total / pageSize)) } diff --git a/src/modules/finance/financeDelivery.test.ts b/src/modules/finance/financeDelivery.test.ts index 0cbe8bac..0effe20b 100644 --- a/src/modules/finance/financeDelivery.test.ts +++ b/src/modules/finance/financeDelivery.test.ts @@ -52,6 +52,7 @@ describe('finance six-page delivery contract', () => { it('connects G1 customer accounts to the formal list and ledger operations', () => { const page = source('src/modules/finance/pages/FinanceCustomerAccountsView.vue') + const types = source('src/modules/finance/types.ts') expect(api).toContain('`${basePath}/accounts`') expect(api).toContain('`${basePath}/accounts/${customerId}/ledger`') expect(page).toContain('listFinanceAccounts') @@ -62,6 +63,11 @@ describe('finance six-page delivery contract', () => { expect(page).toContain('options: customers.value.filter') expect(page).toContain('label: item.tenantName') expect(page).not.toContain('tenantCode') + expect(types).toContain('export interface FinanceOperatingFundsSummary') + expect(types).toContain('export interface FinanceAccountSummary extends FinanceOperatingFundsSummary') + expect(api).toContain('const records: FinanceAccountSummary[]') + for (const metric of ['待收客户款', '待付供应商款', '已线下支付供应商款']) expect(page).toContain(metric) + for (const forbidden of ['客户线下支付', '已收客户款', '已付成本']) expect(page).not.toContain(forbidden) const columns = page.slice(page.indexOf('const columns: DataTableColumn[]')) expect(columns.indexOf("key: 'actions'")).toBeLessThan(columns.indexOf("key: 'customerName'")) for (const state of ['客户账户加载失败', '暂无客户账户', '无权访问客户账户', '账户流水加载失败']) expect(page).toContain(state) diff --git a/src/modules/finance/index.ts b/src/modules/finance/index.ts index 6cc4b774..7c88f2d5 100644 --- a/src/modules/finance/index.ts +++ b/src/modules/finance/index.ts @@ -1,3 +1,9 @@ export { financeRoutes } from './routes' export { default as CustomerStatementsPanel } from './components/CustomerStatementsPanel.vue' -export { getFinanceCustomerAccountSummary, type FinanceCustomerAccountSummaryResource } from './api/finance' +export { + getFinanceCustomerAccountSummary, + getFinanceSettlement, + listFinancePayableSettlements, + listFinanceReceivableSettlements, + type FinanceCustomerAccountSummaryResource, +} from './api/finance' diff --git a/src/modules/finance/pages/FinanceCustomerAccountsView.test.ts b/src/modules/finance/pages/FinanceCustomerAccountsView.test.ts index 81c4b6fd..19054451 100644 --- a/src/modules/finance/pages/FinanceCustomerAccountsView.test.ts +++ b/src/modules/finance/pages/FinanceCustomerAccountsView.test.ts @@ -54,9 +54,10 @@ describe('FinanceCustomerAccountsView delivery', () => { expect(page).toContain('返回客户账户') expect(page).toContain('
@@ -275,12 +272,12 @@ watch(() => [route.name, String(route.params.customerId || '')], ([name, custome