From 0f5c2e8667751971b9140432ed139a71b9b1dca2 Mon Sep 17 00:00:00 2001 From: let5sne Date: Thu, 23 Jul 2026 14:40:23 +0800 Subject: [PATCH] feat(mobile-app): prepare native app packaging --- .gitignore | 3 + docs/MOBILE_APP_DEVICE_ACCEPTANCE.md | 31 + docs/MOBILE_APP_PACKAGING.md | 42 + mobile-uni/androidPrivacy.json.example | 35 + mobile-uni/package-lock.json | 802 ++++-------------- mobile-uni/package.json | 19 +- mobile-uni/scripts/generate-app-assets.sh | 83 ++ mobile-uni/scripts/verify-app-assets.mjs | 107 +++ .../src/components/chat/ChatComposer.vue | 75 +- mobile-uni/src/manifest.json | 97 +++ .../src/pages/candidate/interview/index.vue | 78 +- mobile-uni/src/pages/user/practice/index.vue | 90 +- mobile-uni/src/pages/user/report/index.vue | 9 +- mobile-uni/src/pages/user/sop/index.vue | 14 +- mobile-uni/src/pages/user/today/index.vue | 73 +- mobile-uni/src/pages/user/web-ai/index.vue | 9 +- mobile-uni/src/services/api.ts | 13 +- mobile-uni/src/services/realtime-practice.ts | 4 +- mobile-uni/src/services/speech-capture.ts | 170 ++++ mobile-uni/src/services/speech.ts | 9 + mobile-uni/src/shims/vue-app-runtime.js | 15 + .../src/static/app/icons/android-hdpi.png | Bin 0 -> 3258 bytes .../src/static/app/icons/android-xhdpi.png | Bin 0 -> 5095 bytes .../src/static/app/icons/android-xxhdpi.png | Bin 0 -> 10249 bytes .../src/static/app/icons/android-xxxhdpi.png | Bin 0 -> 17419 bytes .../src/static/app/icons/ios-appstore.png | Bin 0 -> 361458 bytes .../src/static/app/icons/ios-ipad-app-2x.png | Bin 0 -> 11572 bytes .../src/static/app/icons/ios-ipad-app.png | Bin 0 -> 3600 bytes .../app/icons/ios-ipad-notification-2x.png | Bin 0 -> 1518 bytes .../app/icons/ios-ipad-notification.png | Bin 0 -> 651 bytes .../static/app/icons/ios-ipad-pro-app-2x.png | Bin 0 -> 13985 bytes .../static/app/icons/ios-ipad-settings-2x.png | Bin 0 -> 2423 bytes .../static/app/icons/ios-ipad-settings.png | Bin 0 -> 945 bytes .../app/icons/ios-ipad-spotlight-2x.png | Bin 0 -> 3901 bytes .../static/app/icons/ios-ipad-spotlight.png | Bin 0 -> 1518 bytes .../static/app/icons/ios-iphone-app-2x.png | Bin 0 -> 7489 bytes .../static/app/icons/ios-iphone-app-3x.png | Bin 0 -> 15463 bytes .../app/icons/ios-iphone-notification-2x.png | Bin 0 -> 1518 bytes .../app/icons/ios-iphone-notification-3x.png | Bin 0 -> 2629 bytes .../app/icons/ios-iphone-settings-2x.png | Bin 0 -> 2423 bytes .../app/icons/ios-iphone-settings-3x.png | Bin 0 -> 4400 bytes .../app/icons/ios-iphone-spotlight-2x.png | Bin 0 -> 3901 bytes .../app/icons/ios-iphone-spotlight-3x.png | Bin 0 -> 7489 bytes .../src/static/app/splash/android-hdpi.png | Bin 0 -> 38716 bytes .../src/static/app/splash/android-xhdpi.png | Bin 0 -> 79913 bytes .../src/static/app/splash/android-xxhdpi.png | Bin 0 -> 134467 bytes .../static/app/splash/ios-ipad-1112h-2x.png | Bin 0 -> 294200 bytes .../static/app/splash/ios-ipad-1194h-2x.png | Bin 0 -> 296317 bytes .../static/app/splash/ios-ipad-1366h-2x.png | Bin 0 -> 422008 bytes .../app/splash/ios-ipad-portrait-retina7.png | Bin 0 -> 250810 bytes .../static/app/splash/ios-ipad-portrait7.png | Bin 0 -> 74061 bytes .../static/app/splash/ios-iphone-896h-2x.png | Bin 0 -> 89832 bytes .../static/app/splash/ios-iphone-896h-3x.png | Bin 0 -> 178794 bytes .../static/app/splash/ios-iphone-retina40.png | Bin 0 -> 58050 bytes .../static/app/splash/ios-iphone-retina47.png | Bin 0 -> 76474 bytes .../static/app/splash/ios-iphone-retina55.png | Bin 0 -> 167532 bytes .../src/static/app/splash/ios-iphone-x.png | Bin 0 -> 146674 bytes mobile-uni/tests/app-packaging.test.mjs | 15 + mobile-uni/tests/mobile-user-pages.test.mjs | 5 +- mobile-uni/tests/realtime-practice.test.mjs | 1 + mobile-uni/tests/work-report.test.mjs | 2 +- mobile-uni/vite.config.ts | 11 + 62 files changed, 979 insertions(+), 833 deletions(-) create mode 100644 docs/MOBILE_APP_DEVICE_ACCEPTANCE.md create mode 100644 docs/MOBILE_APP_PACKAGING.md create mode 100644 mobile-uni/androidPrivacy.json.example create mode 100644 mobile-uni/scripts/generate-app-assets.sh create mode 100644 mobile-uni/scripts/verify-app-assets.mjs create mode 100644 mobile-uni/src/services/speech-capture.ts create mode 100644 mobile-uni/src/shims/vue-app-runtime.js create mode 100644 mobile-uni/src/static/app/icons/android-hdpi.png create mode 100644 mobile-uni/src/static/app/icons/android-xhdpi.png create mode 100644 mobile-uni/src/static/app/icons/android-xxhdpi.png create mode 100644 mobile-uni/src/static/app/icons/android-xxxhdpi.png create mode 100644 mobile-uni/src/static/app/icons/ios-appstore.png create mode 100644 mobile-uni/src/static/app/icons/ios-ipad-app-2x.png create mode 100644 mobile-uni/src/static/app/icons/ios-ipad-app.png create mode 100644 mobile-uni/src/static/app/icons/ios-ipad-notification-2x.png create mode 100644 mobile-uni/src/static/app/icons/ios-ipad-notification.png create mode 100644 mobile-uni/src/static/app/icons/ios-ipad-pro-app-2x.png create mode 100644 mobile-uni/src/static/app/icons/ios-ipad-settings-2x.png create mode 100644 mobile-uni/src/static/app/icons/ios-ipad-settings.png create mode 100644 mobile-uni/src/static/app/icons/ios-ipad-spotlight-2x.png create mode 100644 mobile-uni/src/static/app/icons/ios-ipad-spotlight.png create mode 100644 mobile-uni/src/static/app/icons/ios-iphone-app-2x.png create mode 100644 mobile-uni/src/static/app/icons/ios-iphone-app-3x.png create mode 100644 mobile-uni/src/static/app/icons/ios-iphone-notification-2x.png create mode 100644 mobile-uni/src/static/app/icons/ios-iphone-notification-3x.png create mode 100644 mobile-uni/src/static/app/icons/ios-iphone-settings-2x.png create mode 100644 mobile-uni/src/static/app/icons/ios-iphone-settings-3x.png create mode 100644 mobile-uni/src/static/app/icons/ios-iphone-spotlight-2x.png create mode 100644 mobile-uni/src/static/app/icons/ios-iphone-spotlight-3x.png create mode 100644 mobile-uni/src/static/app/splash/android-hdpi.png create mode 100644 mobile-uni/src/static/app/splash/android-xhdpi.png create mode 100644 mobile-uni/src/static/app/splash/android-xxhdpi.png create mode 100644 mobile-uni/src/static/app/splash/ios-ipad-1112h-2x.png create mode 100644 mobile-uni/src/static/app/splash/ios-ipad-1194h-2x.png create mode 100644 mobile-uni/src/static/app/splash/ios-ipad-1366h-2x.png create mode 100644 mobile-uni/src/static/app/splash/ios-ipad-portrait-retina7.png create mode 100644 mobile-uni/src/static/app/splash/ios-ipad-portrait7.png create mode 100644 mobile-uni/src/static/app/splash/ios-iphone-896h-2x.png create mode 100644 mobile-uni/src/static/app/splash/ios-iphone-896h-3x.png create mode 100644 mobile-uni/src/static/app/splash/ios-iphone-retina40.png create mode 100644 mobile-uni/src/static/app/splash/ios-iphone-retina47.png create mode 100644 mobile-uni/src/static/app/splash/ios-iphone-retina55.png create mode 100644 mobile-uni/src/static/app/splash/ios-iphone-x.png create mode 100644 mobile-uni/tests/app-packaging.test.mjs diff --git a/.gitignore b/.gitignore index 948a3967..dedfe6a5 100644 --- a/.gitignore +++ b/.gitignore @@ -19,5 +19,8 @@ mobile/node_modules/ mobile/dist/ mobile-uni/node_modules/ mobile-uni/dist/ +mobile-uni/unpackage/ +mobile-uni/certificates/ +mobile-uni/androidPrivacy.json .tmp/ .worktrees/ diff --git a/docs/MOBILE_APP_DEVICE_ACCEPTANCE.md b/docs/MOBILE_APP_DEVICE_ACCEPTANCE.md new file mode 100644 index 00000000..887d6864 --- /dev/null +++ b/docs/MOBILE_APP_DEVICE_ACCEPTANCE.md @@ -0,0 +1,31 @@ +# 原生 App 真机验收清单 + +此清单用于 Android/iOS 自定义基座或签名包验收。`npm --prefix mobile-uni run verify:app-assets` 只校验静态资源和 manifest 映射,不能替代本清单。 + +## 预条件 + +1. 已执行 `npm --prefix mobile-uni run build:app`,并使用 HBuilderX 的**自定义运行基座**运行当前资源。 +2. Android 首次上机前,复制 `mobile-uni/androidPrivacy.json.example` 为 `mobile-uni/androidPrivacy.json`,替换两个法务确认的 HTTPS 链接;再执行 `npm --prefix mobile-uni run verify:app-release`。 +3. 使用有效的移动端测试账号;不得把管理员 Web 登录态当作 App 登录验证。 +4. 每台设备保留系统版本、App `versionName/versionCode`、基座/包哈希、录屏或截图和失败日志。 + +## Android(最低 Android 10 + 一台当前主流机型) + +- [ ] 首次启动先显示原生隐私弹窗;两个协议链接可打开,拒绝后退出,同意后才进入登录。 +- [ ] 手机号登录、短信验证码错误、登录失效重登均符合预期。 +- [ ] 首次录音允许麦克风后,可完成转写;拒绝麦克风后不循环申请,能选择本地音频继续。 +- [ ] 图片、视频、文档和音频可选择并上传;受控附件下载后可打开,不泄露 OSS 地址。 +- [ ] 前后台切换、网络断开/恢复、窄屏和底部手势区无白屏、遮挡或重复提交。 +- [ ] 再次安装同版本后,桌面图标、启动图和 Android 导航栏不闪白。 + +## iPhone(iOS 15 + 一台当前刘海或灵动岛机型) + +- [ ] 初次访问录音时,系统麦克风说明与功能一致;拒绝后可选择音频且不崩溃。 +- [ ] 选择图片/视频/文件时,系统照片/文件访问说明与功能一致;取消选择不会残留上传状态。 +- [ ] 登录、录音转写、TTS 播放、上传、受控下载、前后台切换均通过。 +- [ ] 启动图全屏,无黑边;状态栏、刘海、底部安全区和键盘不遮挡主要操作。 +- [ ] App Store 图标无透明通道、未预制圆角;真机图标更新后重启设备复核 iOS 缓存。 + +## 通过口径 + +每个平台的必测项全部通过,且录音拒绝、媒体取消、登录失效和离线恢复四种反例均留有证据,才可进入签名包或 TestFlight/企业 APK 测试。任何 App 壳、权限、原生插件或证书变更都必须重新云打包并重跑本清单。 diff --git a/docs/MOBILE_APP_PACKAGING.md b/docs/MOBILE_APP_PACKAGING.md new file mode 100644 index 00000000..224b0911 --- /dev/null +++ b/docs/MOBILE_APP_PACKAGING.md @@ -0,0 +1,42 @@ +# mobile-uni 原生 App 打包 + +`mobile-uni/` 采用 uni-app Vue 3 的 App-Plus 目标,同时保留 H5。App 不是将线上 H5 包进 WebView;前端资源通过 `npm --prefix mobile-uni run build:app` 编译,再由 HBuilderX 的自定义基座或云端打包生成 Android/iOS 原生安装包。 + +## 当前约定 + +- Android applicationId 与 iOS Bundle ID 预设为 `com.yincheng.wygj`。在首次签名或注册 App ID 前,发布负责人必须确认企业实际拥有该标识;变更时 Android、iOS 必须同步修改。 +- App 直接请求 `https://peilian.njzhmj.top/dev-api`。不依赖 H5 开发服务器的 `/dev-api` proxy;地址是公开配置,不得在 App 包中放入短信、模型、签名或任何服务端密钥。 +- `manifest.json` 只保留不含秘密的发布配置。`.keystore`、`.p12`、`.mobileprovision` 与证书密码只能由发布负责人在 HBuilderX 云打包界面或受控 CI 秘密变量中提供,绝不能提交 Git。 +- Android 最低试点设备为 Android 10,iOS 最低试点设备为 iOS 15;每次发版提升 `versionCode`,再更新 `versionName`。 + +## 本地验证与出包 + +```bash +npm --prefix mobile-uni run generate:app-assets +npm --prefix mobile-uni run verify:app-assets +npm --prefix mobile-uni run typecheck +npm --prefix mobile-uni run build:h5 +npm --prefix mobile-uni run build:app +``` + +1. 用 HBuilderX 打开 `mobile-uni`,先生成 Android/iOS **自定义运行基座**。标准基座不会加载当前的包名、权限、启动图或原生配置。 +2. 在真实 Android 与 iPhone 上验证手机号登录、录音并转写、TTS 播放、图片/视频/文件上传、附件下载、拒绝权限、前后台切换、刘海和底部安全区。 +3. Android 试点使用企业签名的正式 APK;上架渠道按渠道要求导出相应制品。iOS 使用企业 Apple Developer 账号的 Distribution 证书和 provisioning profile,先走 TestFlight。 + +## 发布前尚需提供的资产 + +- 经法务确认并已可公开访问的《服务协议》《隐私政策》;Android 必须用该实际链接配置原生 template 隐私弹窗,iOS 需提供相应的麦克风、相机、相册/文件用途说明。 +- 无透明通道的 1024×1024 App Store 图标,以及 Android 自适应图标/启动图。 +- 企业持有的 Android 签名证书、Apple Team、Bundle ID 注册与 iOS 发布证书。上述资产缺失时可以完成代码与真机调试,不能声称已具备商店上架条件。 + +## 已接入的资产与隐私模板 + +- 图标和启动图由 `scripts/generate-app-assets.sh` 从现有 `src/static/brand-logo.png` 生成,输出位于 `src/static/app/`,并由 `manifest.json` 显式关联。iOS App Store 图标为 1024×1024、无 alpha、未预制圆角;生成后可用 `npm --prefix mobile-uni run verify:app-assets` 校验尺寸和映射。 +- 现有品牌源图仅为 64×64,因此这里生成的是**可用于自定义基座和测试包的派生资产**。正式提交商店前应替换为品牌方提供的高分辨率母版,再重新执行生成和预检。 +- `androidPrivacy.json.example` 是**未启用的法务模板**,其中 `__TERMS_URL__` 与 `__PRIVACY_URL__` 必须替换为法务确认的 HTTPS 地址。复制为被 Git 忽略的 `androidPrivacy.json` 后,`npm --prefix mobile-uni run verify:app-release` 才会通过。 +- iOS 已按实际功能填写麦克风和照片库用途说明;不申请相机、定位、通讯录、蓝牙或广告追踪权限。 +- 真机步骤和证据口径见 `docs/MOBILE_APP_DEVICE_ACCEPTANCE.md`。资源预检通过不等于 Android/iOS 真机或应用商店验收通过。 + +## 更新策略 + +涉及原生权限、插件、证书或 App 壳的改动必须重新云打包并通过应用商店/TestFlight 发布。仅 JavaScript/CSS/静态资源的热更新(WGT)不作为首个试点版本的发布方式;如后续启用,须有版本兼容、完整性校验、灰度与回滚方案。 diff --git a/mobile-uni/androidPrivacy.json.example b/mobile-uni/androidPrivacy.json.example new file mode 100644 index 00000000..a6cf967d --- /dev/null +++ b/mobile-uni/androidPrivacy.json.example @@ -0,0 +1,35 @@ +{ + "version": "1", + "prompt": "template", + "title": "服务协议和隐私政策", + "message": "  请你审慎阅读并充分理解《服务协议》和《隐私政策》。为了提供登录、录音转写、图片/视频/文件上传和故障排查服务,本应用会在你使用相应功能时请求必要的设备和文件访问权限。你可阅读《服务协议》和《隐私政策》了解详细信息。点击“同意并继续”即表示你同意上述协议。", + "buttonAccept": "同意并继续", + "buttonRefuse": "暂不同意", + "hrefLoader": "system", + "backToExit": "false", + "second": { + "title": "确认提示", + "message": "  进入应用前,请先阅读并同意《服务协议》和《隐私政策》。", + "buttonAccept": "同意并继续", + "buttonRefuse": "退出应用" + }, + "disagreeMode": { + "support": false, + "loadNativePlugins": false, + "visitorEntry": false, + "showAlways": false + }, + "styles": { + "backgroundColor": "#FFFFFF", + "borderRadius": "12px", + "title": { + "color": "#1F2329" + }, + "buttonAccept": { + "color": "#E60012" + }, + "buttonRefuse": { + "color": "#6B7280" + } + } +} diff --git a/mobile-uni/package-lock.json b/mobile-uni/package-lock.json index adb7d471..118bc669 100644 --- a/mobile-uni/package-lock.json +++ b/mobile-uni/package-lock.json @@ -8,15 +8,15 @@ "name": "aihr-mobile-uni", "version": "0.1.0", "dependencies": { - "@dcloudio/uni-app": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-h5": "3.0.0-alpha-5020120260706001", + "@dcloudio/uni-app": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-h5": "3.0.0-alpha-5020120260710001", "@dcloudio/uni-ui": "^1.5.12", "lxgw-wenkai-tc-webfont": "^1.0.0", "vue": "3.5.30" }, "devDependencies": { "@dcloudio/types": "3.4.31", - "@dcloudio/vite-plugin-uni": "3.0.0-alpha-5020120260706001", + "@dcloudio/vite-plugin-uni": "3.0.0-alpha-5020120260710001", "sass": "^1.101.0", "typescript": "~5.9.3", "vite": "5.2.8", @@ -1915,18 +1915,18 @@ "license": "Apache-2.0" }, "node_modules/@dcloudio/uni-app": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-app/-/uni-app-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-20h/MGx9btNHhTUdUGEmHLZ+kfMQr8ToZJLFjVeuSE+NAayIGPZFYWVhYE8oNeQtnm7OgLgmksTlhB/e5CZy2g==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-app/-/uni-app-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-z4k1D2+vSthqcEm6biyo4TzbpcgvSJdQteoD3uI3DyrleeNBAfx+ywmnmXwjNFYf/qKOLIjeW0pd6lgkA+T6PA==", "license": "Apache-2.0", "dependencies": { - "@dcloudio/uni-cloud": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-components": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-console": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-i18n": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-push": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-shared": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-stat": "3.0.0-alpha-5020120260706001", + "@dcloudio/uni-cloud": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-components": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-console": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-i18n": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-push": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-stat": "3.0.0-alpha-5020120260710001", "@vue/shared": "3.4.21" }, "peerDependencies": { @@ -1934,9 +1934,9 @@ } }, "node_modules/@dcloudio/uni-cli-shared": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-kDSF4mxHZl/4mvFrFob55YSUVhdEcdGBCkhEnfN3mP51p4GNYEMECCkyuMS1ShvUykKU0IiYJjnSng4je8zVVA==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-ZBs1zw83RHh+4Ecsvl/+ML+yGCUVo+oYb9gDaB/Z1leHDQ76kHvNtLNubf/Np9X5pzcXEx/Xe+PhqRvjdeuXbA==", "license": "Apache-2.0", "dependencies": { "@ampproject/remapping": "^2.1.2", @@ -1944,9 +1944,9 @@ "@babel/core": "7.25.2", "@babel/parser": "7.25.6", "@babel/types": "7.25.6", - "@dcloudio/uni-i18n": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-nvue-styler": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-shared": "3.0.0-alpha-5020120260706001", + "@dcloudio/uni-i18n": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-nvue-styler": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001", "@intlify/core-base": "9.1.9", "@intlify/shared": "9.1.9", "@intlify/vue-devtools": "9.1.9", @@ -1995,118 +1995,50 @@ "node": "^14.18.0 || >=16.0.0" } }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/reactivity": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz", - "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/shared": "3.4.21" - } - }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/runtime-core": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz", - "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/reactivity": "3.4.21", - "@vue/shared": "3.4.21" - } - }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/runtime-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", - "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/runtime-core": "3.4.21", - "@vue/shared": "3.4.21", - "csstype": "^3.1.3" - } - }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/server-renderer": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz", - "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21" - }, - "peerDependencies": { - "vue": "3.4.21" - } - }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/vue": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz", - "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-sfc": "3.4.21", - "@vue/runtime-dom": "3.4.21", - "@vue/server-renderer": "3.4.21", - "@vue/shared": "3.4.21" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@dcloudio/uni-cloud": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-cloud/-/uni-cloud-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-Y9mE0IHNb45PBp2TYr9kfq4wxwr03szyH79EL2jGggKr1H159dByt+jc3ffTa3SFZhyi3xSPcDdxO8ZJ+jvgrg==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-cloud/-/uni-cloud-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-aKsPXFSN8W//QbJYoICfyXAUPuXujxv8Azfh0mJvSRW1OQnbnn1NNV9cMDoLbuQMIN6dZ6ulivbQB4HbaxObvw==", "license": "Apache-2.0", "dependencies": { - "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-i18n": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-shared": "3.0.0-alpha-5020120260706001", + "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-i18n": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001", "@vue/shared": "3.4.21", "fast-glob": "3.3.3" } }, "node_modules/@dcloudio/uni-components": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-components/-/uni-components-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-OwRTi/uGaOoih2JV1mnpijYGn8owfU/O+AlTX2YLlJrvIuT+WrLc8X31gfCm2pjhcrwsOUZk0bxPbMuLQImOPQ==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-components/-/uni-components-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-StYutCSkyrDL7BU5vwmFGrwYRorfRTQnAjrzB+R0O3lQn5UJmzelJ5vablIc4PRhJF8euMcoGoytSo0oGtZZLw==", "license": "Apache-2.0", "dependencies": { - "@dcloudio/uni-cloud": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-h5": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-i18n": "3.0.0-alpha-5020120260706001" + "@dcloudio/uni-cloud": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-h5": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-i18n": "3.0.0-alpha-5020120260710001" } }, "node_modules/@dcloudio/uni-console": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-console/-/uni-console-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-b2JXNLqo47k3QR1hBjzCbsrR4P7iLGgCKyr1yZjCKFth6VvO7I9a2K7GzLSwg8FhJzJQCq43gexEk955juxyzw==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-console/-/uni-console-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-323YWL0nIBGnybKNP1U7Y3PYYT1bJo/7Z+44aZ9X9e5506bjnmTRkWvXhT9qIS1QxFD1dHG68CCuKtevjINdRQ==", "license": "Apache-2.0", "dependencies": { - "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260706001", + "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001", "fs-extra": "10.1.0" } }, "node_modules/@dcloudio/uni-h5": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5/-/uni-h5-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-uNGc8ImjVcBj4sB5jY/LvLOxN+J/Sr+0YV9iaiOf1t3id6pZTuQgX1+JZYwZi+hgHMtBB7EZ74KihzATyb5J3g==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5/-/uni-h5-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-wdWVFxWe6mHyaNx7vkU8jkPndETf6EcszWbJlKNS5nnMipsHEDIJTNBVn4Md5ofGejtlo03REjJ2HH37MG/kNw==", "license": "Apache-2.0", "dependencies": { - "@dcloudio/uni-h5-vite": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-h5-vue": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-i18n": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-shared": "3.0.0-alpha-5020120260706001", + "@dcloudio/uni-h5-vite": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-h5-vue": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-i18n": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001", "@vue/server-renderer": "3.4.21", "@vue/shared": "3.4.21", "debug": "4.3.7", @@ -2118,13 +2050,13 @@ } }, "node_modules/@dcloudio/uni-h5-vite": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5-vite/-/uni-h5-vite-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-FA6M/vAw9MREo/pAjHRwbtUevmzcAORTLAyQBUW1Vc3Kytnq9Pvs/pHEAyRHtsB7ydR988PF+6+p0jt38mGE3A==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5-vite/-/uni-h5-vite-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-NhalG7UZWE3hA8TOUFNSeMW2+t+e1e0gn1lbZGi+BzH//n8dR7xyX15KORhZPqv586ShldmA1BbdmPb46g46Jw==", "license": "Apache-2.0", "dependencies": { - "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-shared": "3.0.0-alpha-5020120260706001", + "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001", "@rollup/pluginutils": "5.1.0", "@vitejs/plugin-basic-ssl": "1.2.0", "@vue/compiler-dom": "3.4.21", @@ -2137,230 +2069,26 @@ "module-alias": "2.2.3" } }, - "node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/reactivity": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz", - "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/shared": "3.4.21" - } - }, - "node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/runtime-core": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz", - "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/reactivity": "3.4.21", - "@vue/shared": "3.4.21" - } - }, - "node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/runtime-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", - "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/runtime-core": "3.4.21", - "@vue/shared": "3.4.21", - "csstype": "^3.1.3" - } - }, - "node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/server-renderer": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz", - "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21" - }, - "peerDependencies": { - "vue": "3.4.21" - } - }, - "node_modules/@dcloudio/uni-h5-vite/node_modules/vue": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz", - "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-sfc": "3.4.21", - "@vue/runtime-dom": "3.4.21", - "@vue/server-renderer": "3.4.21", - "@vue/shared": "3.4.21" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@dcloudio/uni-h5-vue": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5-vue/-/uni-h5-vue-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-PCvlICnA4IbR/kABS/bVVNClSxGVLy5YlmPC+YlLtP1pqIqwWcy09lbJpgD6UNMa4/F7+jCXbgLhlys6KAiIgQ==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5-vue/-/uni-h5-vue-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-Uluox+HR4+Uj9HcXEz8mKZPzLJzrKLVNimGPtSHYAHnTJ0XGLmagn7qyO3OEusvge3yIvefYfIdS++h8dgyF1g==", "license": "Apache-2.0", "dependencies": { - "@dcloudio/uni-shared": "3.0.0-alpha-5020120260706001", + "@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001", "@vue/server-renderer": "3.4.21" } }, - "node_modules/@dcloudio/uni-h5-vue/node_modules/@vue/reactivity": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz", - "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/shared": "3.4.21" - } - }, - "node_modules/@dcloudio/uni-h5-vue/node_modules/@vue/runtime-core": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz", - "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/reactivity": "3.4.21", - "@vue/shared": "3.4.21" - } - }, - "node_modules/@dcloudio/uni-h5-vue/node_modules/@vue/runtime-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", - "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/runtime-core": "3.4.21", - "@vue/shared": "3.4.21", - "csstype": "^3.1.3" - } - }, - "node_modules/@dcloudio/uni-h5-vue/node_modules/@vue/server-renderer": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz", - "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21" - }, - "peerDependencies": { - "vue": "3.4.21" - } - }, - "node_modules/@dcloudio/uni-h5-vue/node_modules/vue": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz", - "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-sfc": "3.4.21", - "@vue/runtime-dom": "3.4.21", - "@vue/server-renderer": "3.4.21", - "@vue/shared": "3.4.21" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@dcloudio/uni-h5/node_modules/@vue/reactivity": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz", - "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/shared": "3.4.21" - } - }, - "node_modules/@dcloudio/uni-h5/node_modules/@vue/runtime-core": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz", - "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/reactivity": "3.4.21", - "@vue/shared": "3.4.21" - } - }, - "node_modules/@dcloudio/uni-h5/node_modules/@vue/runtime-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", - "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/runtime-core": "3.4.21", - "@vue/shared": "3.4.21", - "csstype": "^3.1.3" - } - }, - "node_modules/@dcloudio/uni-h5/node_modules/@vue/server-renderer": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz", - "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21" - }, - "peerDependencies": { - "vue": "3.4.21" - } - }, - "node_modules/@dcloudio/uni-h5/node_modules/vue": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz", - "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-sfc": "3.4.21", - "@vue/runtime-dom": "3.4.21", - "@vue/server-renderer": "3.4.21", - "@vue/shared": "3.4.21" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@dcloudio/uni-i18n": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-IwZF+4/aHmPSsuZmzX35Vs1PZWPHIsgBzYGDn0GhN1rxHH2NztYr8ApelNWtK0QA0uSHJmq+0MYBJbER2u6C2A==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-B4PFuzRdFi9PIX6rvuJGvAJUlfKZPT9gjGogozWl7eToJbzX+vNjG5kPT0uaSBzI9qlbS6L2ObCkYkudZAPCBQ==", "license": "Apache-2.0" }, "node_modules/@dcloudio/uni-nvue-styler": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-nvue-styler/-/uni-nvue-styler-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-HAupU/LedtzyZFpwD6rPfrenHixU+XXv6ViElcGAtWY/oBlVgPyPNH1gSobfHdvINamQ4hsWkABPabwHth3j/A==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-nvue-styler/-/uni-nvue-styler-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-ahXTw9RyQb1EmaRYA/PFqyeUBAu41YyC4sdyXscpY5UAQUqC6EGu8IEIdrczj8pxYMitE7tGseGoWQdMEUtDGg==", "license": "Apache-2.0", "dependencies": { "@vue/shared": "3.4.21", @@ -2404,31 +2132,31 @@ } }, "node_modules/@dcloudio/uni-push": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-push/-/uni-push-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-pGlhki4lrvg6E3r9078Ov6RPoCaBDsnzI+oQl2NsDS1fysvapBvGJAUWbPbgpqINnIPMGOCDAcKPv22FfnP4kg==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-push/-/uni-push-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-aRqZdjHu9A0XWT4h4OMl6bs0O+GrnuUPTTrQ/6rWuTC08Vx3ZhDxoB9emhf4JyKGfHbIBqHdSIt/rtNITTtjlg==", "license": "Apache-2.0", "dependencies": { - "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260706001" + "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001" } }, "node_modules/@dcloudio/uni-shared": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-shared/-/uni-shared-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-3qT+vSNTcjJXKUX2PyqVbqAIEfeLICOqBgOtu7JneRrTRRHnrR+iXzo5RpwHwJ3EEc/D0DtVPPtX2VHQcHTO1g==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-shared/-/uni-shared-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-9awppRC9Mj9rpCLVNA5tR5qvyj3cui7CKzMhdn32haDA5MQb3JzWJvoUA1byjvbsaVahDrkCy9+68ltf9QLnyA==", "license": "Apache-2.0", "dependencies": { "@vue/shared": "3.4.21" } }, "node_modules/@dcloudio/uni-stat": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/uni-stat/-/uni-stat-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-JtxPjb2NLTYcJRMJOD6i/nyksuaiAaafOBc3I/EsLdwq/xx1w4jEPyWQe3bXVmNc5CNOgwcp6G9XU759KZRMqA==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/uni-stat/-/uni-stat-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-bXMWdKBAsPWahhaD3RDc6AlnIh/mvfhXipfTwZreknp+0y5Z5cSoKmfOTG6HGBXfMyp4/r1DXo71bgZTWtZUOw==", "license": "Apache-2.0", "dependencies": { - "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-shared": "3.0.0-alpha-5020120260706001", + "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001", "debug": "4.3.7" } }, @@ -2439,9 +2167,9 @@ "license": "Apache-2.0" }, "node_modules/@dcloudio/vite-plugin-uni": { - "version": "3.0.0-alpha-5020120260706001", - "resolved": "https://registry.npmmirror.com/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-alpha-5020120260706001.tgz", - "integrity": "sha512-2tAFkY/n8t8ig+ynhzP0ySmHXJI3+IgDgKvGe7YzzyiGBWk6dEVbHE7sg9Qb9wB8Kl9Idsi1KoNI+KRMylLf1w==", + "version": "3.0.0-alpha-5020120260710001", + "resolved": "https://registry.npmmirror.com/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-alpha-5020120260710001.tgz", + "integrity": "sha512-nns/haZStdxXDUehSRiKjlOGquKl9aoV7hKN/CeJBR80mO4iNvHUAJwZLlXNA4vZbvdCfb/WxGljxG3fN5+UTQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2449,9 +2177,9 @@ "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-transform-typescript": "^7.23.3", "@babel/types": "7.25.6", - "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-nvue-styler": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-shared": "3.0.0-alpha-5020120260706001", + "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-nvue-styler": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001", "@rollup/pluginutils": "5.1.0", "@vitejs/plugin-legacy": "5.3.2", "@vitejs/plugin-vue": "5.2.4", @@ -3972,31 +3700,6 @@ "node": ">=6.9.0" } }, - "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-core": { - "version": "3.5.39", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.39.tgz", - "integrity": "sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@vue/shared": "3.5.39", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-dom": { - "version": "3.5.39", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.39.tgz", - "integrity": "sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.39", - "@vue/shared": "3.5.39" - } - }, "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-sfc": { "version": "3.5.39", "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.39.tgz", @@ -4026,13 +3729,6 @@ "@vue/shared": "3.5.39" } }, - "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/shared": { - "version": "3.5.39", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.39.tgz", - "integrity": "sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==", - "dev": true, - "license": "MIT" - }, "node_modules/@vue/babel-plugin-resolve-type/node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", @@ -4051,55 +3747,118 @@ "license": "ISC" }, "node_modules/@vue/compiler-core": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz", - "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/shared": "3.4.21", - "entities": "^4.5.0", + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.1" } }, - "node_modules/@vue/compiler-core/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" + "node_modules/@vue/compiler-core/node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@vue/compiler-core/node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", - "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", - "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/compiler-core": "3.4.21", - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21", + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", "estree-walker": "^2.0.2", - "magic-string": "^0.30.7", - "postcss": "^8.4.35", - "source-map-js": "^1.0.2" + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/@vue/compiler-ssr": { @@ -4134,50 +3893,6 @@ "picomatch": "^4.0.4" } }, - "node_modules/@vue/language-core/node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@vue/language-core/node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@vue/language-core/node_modules/@vue/compiler-core": { - "version": "3.5.39", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.39.tgz", - "integrity": "sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@vue/shared": "3.5.39", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, "node_modules/@vue/language-core/node_modules/@vue/compiler-dom": { "version": "3.5.39", "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.39.tgz", @@ -4189,6 +3904,13 @@ "@vue/shared": "3.5.39" } }, + "node_modules/@vue/language-core/node_modules/@vue/compiler-dom/node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@vue/language-core/node_modules/@vue/shared": { "version": "3.5.39", "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.39.tgz", @@ -4218,12 +3940,6 @@ "@vue/shared": "3.5.30" } }, - "node_modules/@vue/reactivity/node_modules/@vue/shared": { - "version": "3.5.30", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.30.tgz", - "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", - "license": "MIT" - }, "node_modules/@vue/runtime-core": { "version": "3.5.30", "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.30.tgz", @@ -4234,12 +3950,6 @@ "@vue/shared": "3.5.30" } }, - "node_modules/@vue/runtime-core/node_modules/@vue/shared": { - "version": "3.5.30", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.30.tgz", - "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", - "license": "MIT" - }, "node_modules/@vue/runtime-dom": { "version": "3.5.30", "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", @@ -4252,12 +3962,6 @@ "csstype": "^3.2.3" } }, - "node_modules/@vue/runtime-dom/node_modules/@vue/shared": { - "version": "3.5.30", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.30.tgz", - "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", - "license": "MIT" - }, "node_modules/@vue/server-renderer": { "version": "3.5.30", "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.30.tgz", @@ -4271,57 +3975,6 @@ "vue": "3.5.30" } }, - "node_modules/@vue/server-renderer/node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@vue/server-renderer/node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@vue/server-renderer/node_modules/@vue/compiler-core": { - "version": "3.5.30", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.30.tgz", - "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@vue/shared": "3.5.30", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/server-renderer/node_modules/@vue/compiler-dom": { - "version": "3.5.30", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", - "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.30", - "@vue/shared": "3.5.30" - } - }, "node_modules/@vue/server-renderer/node_modules/@vue/compiler-ssr": { "version": "3.5.30", "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", @@ -4332,18 +3985,12 @@ "@vue/shared": "3.5.30" } }, - "node_modules/@vue/server-renderer/node_modules/@vue/shared": { + "node_modules/@vue/shared": { "version": "3.5.30", "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.30.tgz", "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", "license": "MIT" }, - "node_modules/@vue/shared": { - "version": "3.4.21", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz", - "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", - "license": "MIT" - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", @@ -7591,99 +7238,6 @@ "typescript": ">=5.0.0" } }, - "node_modules/vue/node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/vue/node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/vue/node_modules/@vue/compiler-core": { - "version": "3.5.30", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.30.tgz", - "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@vue/shared": "3.5.30", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/vue/node_modules/@vue/compiler-dom": { - "version": "3.5.30", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", - "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.30", - "@vue/shared": "3.5.30" - } - }, - "node_modules/vue/node_modules/@vue/compiler-sfc": { - "version": "3.5.30", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", - "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@vue/compiler-core": "3.5.30", - "@vue/compiler-dom": "3.5.30", - "@vue/compiler-ssr": "3.5.30", - "@vue/shared": "3.5.30", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.8", - "source-map-js": "^1.2.1" - } - }, - "node_modules/vue/node_modules/@vue/compiler-ssr": { - "version": "3.5.30", - "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", - "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.30", - "@vue/shared": "3.5.30" - } - }, - "node_modules/vue/node_modules/@vue/shared": { - "version": "3.5.30", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.30.tgz", - "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", - "license": "MIT" - }, - "node_modules/vue/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", diff --git a/mobile-uni/package.json b/mobile-uni/package.json index 6f7e475d..712baf3e 100644 --- a/mobile-uni/package.json +++ b/mobile-uni/package.json @@ -8,24 +8,37 @@ "dev": "uni -p h5", "dev:h5": "uni -p h5", "build:h5": "uni build -p h5", + "build:app": "uni build -p app", + "generate:app-assets": "sh scripts/generate-app-assets.sh", + "verify:app-assets": "node scripts/verify-app-assets.mjs", + "verify:app-release": "node scripts/verify-app-assets.mjs --require-privacy", "test:unit": "node --test tests/*.test.mjs", "typecheck": "vue-tsc --noEmit" }, "dependencies": { - "@dcloudio/uni-app": "3.0.0-alpha-5020120260706001", - "@dcloudio/uni-h5": "3.0.0-alpha-5020120260706001", + "@dcloudio/uni-app": "3.0.0-alpha-5020120260710001", + "@dcloudio/uni-h5": "3.0.0-alpha-5020120260710001", "@dcloudio/uni-ui": "^1.5.12", "lxgw-wenkai-tc-webfont": "^1.0.0", "vue": "3.5.30" }, "devDependencies": { "@dcloudio/types": "3.4.31", - "@dcloudio/vite-plugin-uni": "3.0.0-alpha-5020120260706001", + "@dcloudio/vite-plugin-uni": "3.0.0-alpha-5020120260710001", "sass": "^1.101.0", "typescript": "~5.9.3", "vite": "5.2.8", "vue-tsc": "^3.2.5" }, + "overrides": { + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, "engines": { "node": ">=20.19.0", "npm": ">=8.19.0" diff --git a/mobile-uni/scripts/generate-app-assets.sh b/mobile-uni/scripts/generate-app-assets.sh new file mode 100644 index 00000000..1b64b097 --- /dev/null +++ b/mobile-uni/scripts/generate-app-assets.sh @@ -0,0 +1,83 @@ +#!/bin/sh +set -eu + +project_root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) +brand_logo="$project_root/src/static/brand-logo.png" +icons="$project_root/src/static/app/icons" +splash="$project_root/src/static/app/splash" + +if ! command -v magick >/dev/null 2>&1; then + echo "ImageMagick (magick) is required to generate App assets." >&2 + exit 1 +fi + +if [ ! -f "$brand_logo" ]; then + echo "Brand logo not found: $brand_logo" >&2 + exit 1 +fi + +mkdir -p "$icons" "$splash" + +make_icon() { + size=$1 + logo_size=$2 + output=$3 + magick -size "${size}x${size}" xc:'#FFFFFF' \ + \( "$brand_logo" -resize "${logo_size}x${logo_size}" \) \ + -gravity center -compose over -composite -alpha off -strip "$output" +} + +make_splash() { + canvas=$1 + logo_size=$2 + output=$3 + magick -size "$canvas" xc:'#F7F8FA' \ + \( "$brand_logo" -resize "${logo_size}x${logo_size}" \) \ + -gravity center -compose over -composite -alpha off -strip "$output" +} + +# All launch and App Store icons are opaque PNGs. iOS applies its own rounded +# mask; source artwork must remain a square without alpha information. +make_icon 1024 620 "$icons/ios-appstore.png" +make_icon 192 118 "$icons/android-xxxhdpi.png" +make_icon 144 88 "$icons/android-xxhdpi.png" +make_icon 96 60 "$icons/android-xhdpi.png" +make_icon 72 44 "$icons/android-hdpi.png" + +make_icon 180 110 "$icons/ios-iphone-app-3x.png" +make_icon 120 74 "$icons/ios-iphone-app-2x.png" +make_icon 120 74 "$icons/ios-iphone-spotlight-3x.png" +make_icon 80 50 "$icons/ios-iphone-spotlight-2x.png" +make_icon 87 54 "$icons/ios-iphone-settings-3x.png" +make_icon 58 36 "$icons/ios-iphone-settings-2x.png" +make_icon 60 38 "$icons/ios-iphone-notification-3x.png" +make_icon 40 26 "$icons/ios-iphone-notification-2x.png" + +make_icon 167 104 "$icons/ios-ipad-pro-app-2x.png" +make_icon 152 94 "$icons/ios-ipad-app-2x.png" +make_icon 76 48 "$icons/ios-ipad-app.png" +make_icon 80 50 "$icons/ios-ipad-spotlight-2x.png" +make_icon 40 26 "$icons/ios-ipad-spotlight.png" +make_icon 58 36 "$icons/ios-ipad-settings-2x.png" +make_icon 29 18 "$icons/ios-ipad-settings.png" +make_icon 40 26 "$icons/ios-ipad-notification-2x.png" +make_icon 20 14 "$icons/ios-ipad-notification.png" + +make_splash '480x762' 160 "$splash/android-hdpi.png" +make_splash '720x1242' 240 "$splash/android-xhdpi.png" +make_splash '1080x1882' 320 "$splash/android-xxhdpi.png" + +make_splash '640x1136' 200 "$splash/ios-iphone-retina40.png" +make_splash '750x1334' 230 "$splash/ios-iphone-retina47.png" +make_splash '1242x2208' 360 "$splash/ios-iphone-retina55.png" +make_splash '1125x2436' 330 "$splash/ios-iphone-x.png" +make_splash '828x1792' 250 "$splash/ios-iphone-896h-2x.png" +make_splash '1242x2688' 370 "$splash/ios-iphone-896h-3x.png" + +make_splash '768x1024' 230 "$splash/ios-ipad-portrait7.png" +make_splash '1536x2048' 460 "$splash/ios-ipad-portrait-retina7.png" +make_splash '1668x2224' 500 "$splash/ios-ipad-1112h-2x.png" +make_splash '1668x2388' 500 "$splash/ios-ipad-1194h-2x.png" +make_splash '2048x2732' 610 "$splash/ios-ipad-1366h-2x.png" + +echo "Generated App icons and portrait splash images from src/static/brand-logo.png" diff --git a/mobile-uni/scripts/verify-app-assets.mjs b/mobile-uni/scripts/verify-app-assets.mjs new file mode 100644 index 00000000..0defd032 --- /dev/null +++ b/mobile-uni/scripts/verify-app-assets.mjs @@ -0,0 +1,107 @@ +import { readFileSync, existsSync } from 'node:fs'; +import { resolve } from 'node:path'; + +const projectRoot = resolve(import.meta.dirname, '..'); +const manifestPath = resolve(projectRoot, 'src/manifest.json'); +const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')); +const requirePrivacy = process.argv.includes('--require-privacy'); +const failures = []; + +const fail = (message) => failures.push(message); +const readPng = (relativePath) => { + if (typeof relativePath !== 'string' || !relativePath) { + fail('manifest is missing an App asset path'); + return undefined; + } + const path = resolve(projectRoot, 'src', relativePath); + if (!existsSync(path)) { + fail(`missing asset: ${relativePath}`); + return undefined; + } + const header = readFileSync(path).subarray(0, 29); + const isPng = header.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])); + if (!isPng || header.toString('ascii', 12, 16) !== 'IHDR') { + fail(`invalid PNG: ${relativePath}`); + return undefined; + } + return { + width: header.readUInt32BE(16), + height: header.readUInt32BE(20), + colorType: header[25] + }; +}; + +const expectPng = (relativePath, width, height, opaque = false) => { + const png = readPng(relativePath); + if (!png) return; + if (png.width !== width || png.height !== height) { + fail(`unexpected dimensions for ${relativePath}: got ${png.width}x${png.height}, expected ${width}x${height}`); + } + if (opaque && (png.colorType === 4 || png.colorType === 6)) { + fail(`iOS App icon must not contain alpha: ${relativePath}`); + } +}; + +const app = manifest['app-plus']; +const distribute = app?.distribute; +const icons = distribute?.icons; +const splashscreen = distribute?.splashscreen; + +if (!Array.isArray(app?.screenOrientation) || !app.screenOrientation.includes('portrait-primary')) { + fail('app-plus.screenOrientation must include portrait-primary'); +} + +const androidIcons = [ + ['hdpi', 72], ['xhdpi', 96], ['xxhdpi', 144], ['xxxhdpi', 192] +]; +for (const [density, size] of androidIcons) { + expectPng(icons?.android?.[density], size, size); +} + +const iosIconPaths = [ + [icons?.ios?.appstore, 1024], + [icons?.ios?.iphone?.['app@2x'], 120], [icons?.ios?.iphone?.['app@3x'], 180], + [icons?.ios?.iphone?.['spotlight@2x'], 80], [icons?.ios?.iphone?.['spotlight@3x'], 120], + [icons?.ios?.iphone?.['settings@2x'], 58], [icons?.ios?.iphone?.['settings@3x'], 87], + [icons?.ios?.iphone?.['notification@2x'], 40], [icons?.ios?.iphone?.['notification@3x'], 60], + [icons?.ios?.ipad?.app, 76], [icons?.ios?.ipad?.['app@2x'], 152], [icons?.ios?.ipad?.['proapp@2x'], 167], + [icons?.ios?.ipad?.spotlight, 40], [icons?.ios?.ipad?.['spotlight@2x'], 80], + [icons?.ios?.ipad?.settings, 29], [icons?.ios?.ipad?.['settings@2x'], 58], + [icons?.ios?.ipad?.notification, 20], [icons?.ios?.ipad?.['notification@2x'], 40] +]; +for (const [relativePath, size] of iosIconPaths) expectPng(relativePath, size, size, true); + +const splashPaths = [ + [splashscreen?.android?.hdpi, 480, 762], [splashscreen?.android?.xhdpi, 720, 1242], [splashscreen?.android?.xxhdpi, 1080, 1882], + [splashscreen?.ios?.iphone?.retina40, 640, 1136], [splashscreen?.ios?.iphone?.retina47, 750, 1334], + [splashscreen?.ios?.iphone?.retina55, 1242, 2208], [splashscreen?.ios?.iphone?.iphonex, 1125, 2436], + [splashscreen?.ios?.iphone?.['portrait-896h@2x'], 828, 1792], [splashscreen?.ios?.iphone?.['portrait-896h@3x'], 1242, 2688], + [splashscreen?.ios?.ipad?.portrait7, 768, 1024], [splashscreen?.ios?.ipad?.['portrait-retina7'], 1536, 2048], + [splashscreen?.ios?.ipad?.['portrait-1112h@2x'], 1668, 2224], [splashscreen?.ios?.ipad?.['portrait-1194h@2x'], 1668, 2388], + [splashscreen?.ios?.ipad?.['portrait-1366h@2x'], 2048, 2732] +]; +for (const [relativePath, width, height] of splashPaths) expectPng(relativePath, width, height); + +const privacyPath = resolve(projectRoot, 'androidPrivacy.json'); +if (requirePrivacy) { + if (!existsSync(privacyPath)) { + fail('androidPrivacy.json is required for release; copy androidPrivacy.json.example and replace both legal links'); + } else { + try { + const privacy = JSON.parse(readFileSync(privacyPath, 'utf8')); + const links = [...String(privacy.message || '').matchAll(/href="([^"]+)"/g)].map((match) => match[1]); + if (privacy.prompt !== 'template' || links.length < 2 || links.some((link) => !/^https:\/\//.test(link) || link.includes('__'))) { + fail('androidPrivacy.json must use prompt=template and two final HTTPS legal links'); + } + } catch { + fail('androidPrivacy.json must be valid JSON without comments'); + } + } +} + +if (failures.length) { + console.error(`App asset verification failed:\n- ${failures.join('\n- ')}`); + process.exit(1); +} + +console.log(`App asset verification passed (${androidIcons.length + iosIconPaths.length} icons, ${splashPaths.length} splash images).`); diff --git a/mobile-uni/src/components/chat/ChatComposer.vue b/mobile-uni/src/components/chat/ChatComposer.vue index dcdea504..9c553347 100644 --- a/mobile-uni/src/components/chat/ChatComposer.vue +++ b/mobile-uni/src/components/chat/ChatComposer.vue @@ -102,6 +102,8 @@