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 @@