From 4f45070d2be31afa093772ff44f2277e11a0daa4 Mon Sep 17 00:00:00 2001 From: Dawn <2439646234@qq.com> Date: Mon, 15 Sep 2025 11:48:12 +0800 Subject: [PATCH 1/4] build(naive-ui): :package: update naive-ui --- package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 4b61a4ef..45f93336 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "hula-emojis": "^1.2.26", "lodash-es": "^4.17.21", "mitt": "^3.0.1", - "naive-ui": "^2.42.0", + "naive-ui": "^2.43.1", "pinia": "^3.0.3", "pinia-plugin-persistedstate": "^4.5.0", "pinia-shared-state": "^1.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18827cff..8ae678df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -111,8 +111,8 @@ importers: specifier: ^3.0.1 version: 3.0.1 naive-ui: - specifier: ^2.42.0 - version: 2.42.0(vue@3.5.18(typescript@5.9.2)) + specifier: ^2.43.1 + version: 2.43.1(vue@3.5.18(typescript@5.9.2)) pinia: specifier: ^3.0.3 version: 3.0.3(typescript@5.9.2)(vue@3.5.18(typescript@5.9.2)) @@ -3507,8 +3507,8 @@ packages: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} - naive-ui@2.42.0: - resolution: {integrity: sha512-c7cXR2YgOjgtBadXHwiWL4Y0tpGLAI5W5QzzHksOi22iuHXoSGMAzdkVTGVPE/PM0MSGQ/JtUIzCx2Y0hU0vTQ==} + naive-ui@2.43.1: + resolution: {integrity: sha512-w52W0mOhdOGt4uucFSZmP0DI44PCsFyuxeLSs9aoUThfIuxms90MYjv46Qrr7xprjyJRw5RU6vYpCx4o9ind3A==} peerDependencies: vue: ^3.0.0 @@ -4520,8 +4520,8 @@ packages: typescript: optional: true - vueuc@0.4.64: - resolution: {integrity: sha512-wlJQj7fIwKK2pOEoOq4Aro8JdPOGpX8aWQhV8YkTW9OgWD2uj2O8ANzvSsIGjx7LTOc7QbS7sXdxHi6XvRnHPA==} + vueuc@0.4.65: + resolution: {integrity: sha512-lXuMl+8gsBmruudfxnMF9HW4be8rFziylXFu1VHVNbLVhRTXXV4njvpRuJapD/8q+oFEMSfQMH16E/85VoWRyQ==} peerDependencies: vue: ^3.0.11 @@ -7788,7 +7788,7 @@ snapshots: mute-stream@2.0.0: {} - naive-ui@2.42.0(vue@3.5.18(typescript@5.9.2)): + naive-ui@2.43.1(vue@3.5.18(typescript@5.9.2)): dependencies: '@css-render/plugin-bem': 0.15.14(css-render@0.15.14) '@css-render/vue3-ssr': 0.15.14(vue@3.5.18(typescript@5.9.2)) @@ -7809,7 +7809,7 @@ snapshots: vdirs: 0.1.8(vue@3.5.18(typescript@5.9.2)) vooks: 0.2.12(vue@3.5.18(typescript@5.9.2)) vue: 3.5.18(typescript@5.9.2) - vueuc: 0.4.64(vue@3.5.18(typescript@5.9.2)) + vueuc: 0.4.65(vue@3.5.18(typescript@5.9.2)) nano-spawn@1.0.3: {} @@ -8869,7 +8869,7 @@ snapshots: optionalDependencies: typescript: 5.9.2 - vueuc@0.4.64(vue@3.5.18(typescript@5.9.2)): + vueuc@0.4.65(vue@3.5.18(typescript@5.9.2)): dependencies: '@css-render/vue3-ssr': 0.15.14(vue@3.5.18(typescript@5.9.2)) '@juggle/resize-observer': 3.4.0 -- Gitee From d2be80a5db379f4d8cc8e8a5f778bc16c33cdf1c Mon Sep 17 00:00:00 2001 From: Dawn <2439646234@qq.com> Date: Thu, 18 Sep 2025 19:53:30 +0800 Subject: [PATCH 2/4] fix(common): :bug: fix some defects and improve mobile terminal (#335) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(common): :bug: chatmain scroll behavior * fix(common): :bug: chatMain scroll bug * fix(common): :bug: p2p chat sendTime * feat(mobile): :sparkles: added friend/group page and functionality * fix(common): :bug: order group member * style(common): :lipstick: refactor layout center * fix(agreement): :bug: chat and announcements * fix(common): :bug: group basic information editing * refactor(common): :recycle: union config * ci(config): :ferris_wheel: change some configuration * refactor(common): :recycle: config yudao * fix(common): :bug: exit group * refactor(common): :recycle: tencent config * fix(common): :bug: network config * feat(mobile): :sparkles: added Friend or Group Message Page * fix(common): :bug: exit group error * feat(message): :sparkles: add message management settings * fix(mobile): :bug: fix the issue where the mobile client fails to locate the configuration file * fix(mobile): :bug: resolve mobile misidentification of local and production environments * feat(mobile): :sparkles: optimize the maximum width of bot messages and reply messages * feat(mobile): :sparkles: optimize the maximum width of image messages * feat(common): :sparkles: msg multi choose relay * build(vite): :package: update startup and vite configuration * perf(message forwarding): :zap: optimize message forwarding styles * fix(common): :bug: msg time block * feat(mobile): :sparkles: added ability to view detailed information about friends * feat(mobile): :sparkles: add functionality to remove friends * fix(style): :bug: fix special message not centered issue * fix(mobile): :bug: fix hmr host bug * fix(mobile): :bug: fix contact page not showing friend requests * feat(common): :sparkles: msg merge * feat(mobile): :sparkles: added chatroom redirection feature on friend detail page * fix(common): :bug: merge msg display * feat(mobile): :sparkles: add file and image uploader components * fix(common): :bug: send new msg error when scroll too top * fix(common): :bug: reconstruct the notification module * fix(system): :bug: fix some style and logic issues --------- Co-authored-by: wanwanruwoxin <254693270@qq.com> Co-authored-by: 卡仔 <1271013637@qq.com> Co-authored-by: 乾乾 <1046762075@qq.com> --- .env | 2 + .env.development | 15 - .env.production | 14 - package.json | 11 +- pnpm-lock.yaml | 641 +++++++++++------- public/icon.js | 2 +- scripts/check-all.js | 4 - src-tauri/.env | 3 - src-tauri/.gitignore | 1 + src-tauri/configuration/base.yaml | 1 + src-tauri/configuration/local.yaml | 4 - src-tauri/configuration/production.yaml | 8 + src-tauri/entity/src/im_message.rs | 1 + src-tauri/gen/android/app/.gitignore | 3 +- .../android/app/src/main/AndroidManifest.xml | 54 +- .../src/main/assets/configuration/base.yaml | 4 - .../src/main/assets/configuration/local.yaml | 4 - .../main/assets/configuration/production.yaml | 4 - src-tauri/gen/apple/PrivacyInfo.xcprivacy | 17 + src-tauri/migration/src/lib.rs | 2 + .../src/m20250917_000001_update_msg_table.rs | 35 + src-tauri/src/command/chat_history_command.rs | 2 +- src-tauri/src/command/message_command.rs | 42 +- src-tauri/src/command/mod.rs | 1 + src-tauri/src/command/setting_command.rs | 28 + src-tauri/src/configuration.rs | 306 ++++----- src-tauri/src/desktops/common_cmd.rs | 36 +- src-tauri/src/desktops/window_payload.rs | 14 +- src-tauri/src/im_request_client.rs | 22 +- src-tauri/src/lib.rs | 39 +- .../src/repository/im_message_repository.rs | 40 +- src-tauri/src/websocket/commands.rs | 4 +- src/components/common/FloatBlockList.vue | 2 +- src/components/rightBox/ApplyList.vue | 121 ++-- .../rightBox/chatBox/ChatFooter.vue | 8 +- .../rightBox/chatBox/ChatHeader.vue | 30 +- src/components/rightBox/chatBox/ChatMain.vue | 157 +++-- .../rightBox/chatBox/ChatMsgMultiChoose.vue | 221 ++++++ .../rightBox/chatBox/ChatMultiMsg.vue | 55 ++ .../rightBox/chatBox/ChatSidebar.vue | 4 + src/components/rightBox/chatBox/index.vue | 17 +- .../rightBox/renderMessage/Image.vue | 3 +- .../rightBox/renderMessage/MergeMessage.vue | 29 + .../rightBox/renderMessage/Text.vue | 44 +- .../rightBox/renderMessage/index.vue | 448 ++++++------ .../renderMessage/special/BotMessage.vue | 26 +- .../renderMessage/special/RecallMessage.vue | 4 +- .../renderMessage/special/SystemMessage.vue | 8 +- src/enums/index.ts | 16 +- src/hooks/useChatMain.ts | 7 + src/hooks/useMessage.ts | 21 +- src/hooks/useMockMessage.ts | 2 +- src/hooks/useMsgInput.ts | 66 +- src/hooks/useNetworkReconnect.ts | 65 +- src/hooks/useWindow.ts | 44 +- src/layout/center/index.vue | 16 +- src/layout/center/model.tsx | 12 - src/layout/index.vue | 15 +- src/mobile/components/chat-room/FooterBar.vue | 126 +++- src/mobile/components/chat-room/HeaderBar.vue | 10 +- src/mobile/components/my/MobileApplyList.vue | 262 +++++++ src/mobile/components/my/PersonalInfo.vue | 242 ++++--- .../layout/chat-room/ChatRoomLayout.vue | 7 + src/mobile/layout/index.vue | 119 +++- src/mobile/views/chat-room/ChatSetting.vue | 320 +++++++-- src/mobile/views/chat-room/MobileChatMain.vue | 7 +- .../views/chat-room/notice/NoticeList.vue | 40 +- src/mobile/views/friends/AddFriends.vue | 10 +- src/mobile/views/friends/ConfirmAddFriend.vue | 97 +++ src/mobile/views/friends/ConfirmAddGroup.vue | 93 +++ .../views/{my => friends}/FriendInfo.vue | 8 +- src/mobile/views/friends/index.vue | 85 ++- src/mobile/views/my/MyMessages.vue | 141 +--- src/mobile/views/my/index.vue | 4 +- src/router/index.ts | 38 +- src/services/tauriCommand.ts | 32 + src/services/translate.ts | 15 +- src/services/types.ts | 81 ++- src/services/webSocketRust.ts | 16 - src/stores/chat.ts | 121 ++-- src/stores/contacts.ts | 12 +- src/stores/group.ts | 11 +- src/stores/setting.ts | 14 +- src/stores/user.ts | 6 +- src/strategy/MessageStrategy.ts | 2 +- src/styles/scss/global/desktop.scss | 10 +- src/styles/scss/global/mobile.scss | 8 + src/styles/scss/global/variable.scss | 3 +- src/typings/components.d.ts | 20 +- src/typings/global.d.ts | 16 + src/typings/stores.d.ts | 5 + src/utils/ComputedTime.ts | 39 +- src/utils/ImRequestUtils.ts | 29 +- src/views/friendWindow/AddFriendVerify.vue | 6 +- src/views/loginWindow/Network.vue | 21 +- .../moreWindow/settings/Notification.vue | 412 +++++++++++ src/views/moreWindow/settings/config.ts | 11 +- src/views/multiMsgWindow/index.vue | 66 ++ tsconfig.node.json | 1 + vite.config.ts | 44 +- 100 files changed, 3736 insertions(+), 1679 deletions(-) create mode 100644 .env delete mode 100644 .env.development delete mode 100644 .env.production delete mode 100644 src-tauri/.env delete mode 100644 src-tauri/configuration/local.yaml delete mode 100644 src-tauri/gen/android/app/src/main/assets/configuration/base.yaml delete mode 100644 src-tauri/gen/android/app/src/main/assets/configuration/local.yaml delete mode 100644 src-tauri/gen/android/app/src/main/assets/configuration/production.yaml create mode 100644 src-tauri/gen/apple/PrivacyInfo.xcprivacy create mode 100644 src-tauri/migration/src/m20250917_000001_update_msg_table.rs create mode 100644 src-tauri/src/command/setting_command.rs create mode 100644 src/components/rightBox/chatBox/ChatMsgMultiChoose.vue create mode 100644 src/components/rightBox/chatBox/ChatMultiMsg.vue create mode 100644 src/components/rightBox/renderMessage/MergeMessage.vue create mode 100644 src/mobile/components/my/MobileApplyList.vue create mode 100644 src/mobile/views/friends/ConfirmAddFriend.vue create mode 100644 src/mobile/views/friends/ConfirmAddGroup.vue rename src/mobile/views/{my => friends}/FriendInfo.vue (97%) create mode 100644 src/services/tauriCommand.ts create mode 100644 src/views/moreWindow/settings/Notification.vue create mode 100644 src/views/multiMsgWindow/index.vue diff --git a/.env b/.env new file mode 100644 index 00000000..ab2986ad --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +# gitee token +VITE_GITEE_TOKEN="a9029798336825cea39ac9e4413b8579" \ No newline at end of file diff --git a/.env.development b/.env.development deleted file mode 100644 index 1c88a830..00000000 --- a/.env.development +++ /dev/null @@ -1,15 +0,0 @@ -# 后端服务地址 -VITE_SERVICE_URL="https://hulaspark.com/api" -# # # websocket服务地址 -VITE_WEBSOCKET_URL="wss://hulaspark.com/api/ws/ws" -# 项目标题 -VITE_APP_TITLE="HuLa—IM" -# 项目名称 -VITE_APP_NAME="HuLa" -# gitee token -VITE_GITEE_TOKEN="a9029798336825cea39ac9e4413b8579" - - -VITE_USE_RUST_WEBSOCKET=true - -TAURI_DEV_HOST=192.168.1.26 diff --git a/.env.production b/.env.production deleted file mode 100644 index 3d7ce64e..00000000 --- a/.env.production +++ /dev/null @@ -1,14 +0,0 @@ -# 后端服务地址 -VITE_SERVICE_URL="https://hulaspark.com/api" -# # # websocket服务地址 -VITE_WEBSOCKET_URL="wss://hulaspark.com/api/ws/ws" -# 项目标题 -VITE_APP_TITLE="HuLa—IM" -# 项目名称 -VITE_APP_NAME="HuLa" -# gitee token -VITE_GITEE_TOKEN="a9029798336825cea39ac9e4413b8579" - -VITE_USE_RUST_WEBSOCKET=true - -TAURI_DEV_HOST=192.168.1.26 \ No newline at end of file diff --git a/package.json b/package.json index 45f93336..5030c443 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,10 @@ "tauri:dev": "tauri dev", "========= 启动HuLa桌面应用程序(简化命令) =========": "", "td": "tauri dev", + "========= windows中启动安卓纯前端(简化命令) =========": "", + "adev:win": "set TAURI_ENV_PLATFORM=android&& vite", + "========= mac中启动ios纯前端(简化命令) =========": "", + "idev:mac": "TAURI_ENV_PLATFORM=ios vite", "========= 启动安卓程序(简化命令) =========": "", "adev": "tauri android dev", "========= 启动ios程序(简化命令) =========": "", @@ -107,6 +111,7 @@ "file-type": "^21.0.0", "grapheme-splitter": "^1.0.4", "hula-emojis": "^1.2.26", + "internal-ip": "^8.0.0", "lodash-es": "^4.17.21", "mitt": "^3.0.1", "naive-ui": "^2.43.1", @@ -147,7 +152,7 @@ "@vitest/ui": "^3.2.4", "@vue/test-utils": "^2.4.6", "@vueuse/core": "^13.7.0", - "chalk": "^5.6.0", + "chalk": "^5.6.2", "commitizen": "^4.3.1", "cz-git": "^1.12.0", "happy-dom": "^15.11.7", @@ -156,11 +161,11 @@ "postcss-pxtorem": "^6.1.0", "prettier": "^3.6.2", "release-it": "^17.11.0", - "sass": "1.90.0", + "sass": "1.92.1", "typescript": "^5.9.2", "unplugin-auto-import": "^20.1.0", "unplugin-vue-components": "^29.0.0", - "vite": "7.1.5", + "vite": "7.1.6", "vite-plugin-vue-setup-extend": "^0.4.0", "vitest": "^3.2.4", "vue-tsc": "^3.0.6" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ae678df..87b084d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -104,6 +104,9 @@ importers: hula-emojis: specifier: ^1.2.26 version: 1.2.26 + internal-ip: + specifier: ^8.0.0 + version: 8.0.0 lodash-es: specifier: ^4.17.21 version: 4.17.21 @@ -173,7 +176,7 @@ importers: version: 8.0.2(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0)(release-it@17.11.0(typescript@5.9.2)) '@rollup/plugin-terser': specifier: ^0.4.4 - version: 0.4.4(rollup@4.50.1) + version: 0.4.4(rollup@4.50.2) '@tauri-apps/cli': specifier: 2.8.4 version: 2.8.4 @@ -200,13 +203,13 @@ importers: version: 66.5.1 '@unocss/vite': specifier: ^66.5.1 - version: 66.5.1(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1)) + version: 66.5.1(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1)) '@vitejs/plugin-vue': specifier: ^6.0.1 - version: 6.0.1(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) + version: 6.0.1(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.0.1 - version: 5.0.1(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) + version: 5.0.1(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2)) '@vitest/coverage-v8': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) @@ -220,8 +223,8 @@ importers: specifier: ^13.7.0 version: 13.7.0(vue@3.5.18(typescript@5.9.2)) chalk: - specifier: ^5.6.0 - version: 5.6.0 + specifier: ^5.6.2 + version: 5.6.2 commitizen: specifier: ^4.3.1 version: 4.3.1(@types/node@24.3.0)(typescript@5.9.2) @@ -247,8 +250,8 @@ importers: specifier: ^17.11.0 version: 17.11.0(typescript@5.9.2) sass: - specifier: 1.90.0 - version: 1.90.0 + specifier: 1.92.1 + version: 1.92.1 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -259,14 +262,14 @@ importers: specifier: ^29.0.0 version: 29.0.0(@babel/parser@7.28.4)(vue@3.5.18(typescript@5.9.2)) vite: - specifier: 7.1.5 - version: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) + specifier: 7.1.6 + version: 7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) vite-plugin-vue-setup-extend: specifier: ^0.4.0 - version: 0.4.0(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1)) + version: 0.4.0(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) + version: 3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) vue-tsc: specifier: ^3.0.6 version: 3.0.6(typescript@5.9.2) @@ -626,8 +629,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -638,8 +641,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -650,8 +653,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -662,8 +665,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -674,8 +677,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -686,8 +689,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -698,8 +701,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -710,8 +713,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -722,8 +725,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -734,8 +737,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -746,8 +749,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -758,8 +761,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -770,8 +773,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -782,8 +785,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -794,8 +797,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -806,8 +809,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -818,14 +821,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -836,8 +839,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -848,8 +851,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -860,14 +863,14 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -878,8 +881,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -890,8 +893,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -902,8 +905,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -914,8 +917,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1503,119 +1506,119 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.50.1': - resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==} + '@rollup/rollup-android-arm-eabi@4.50.2': + resolution: {integrity: sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.50.1': - resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==} + '@rollup/rollup-android-arm64@4.50.2': + resolution: {integrity: sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.50.1': - resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==} + '@rollup/rollup-darwin-arm64@4.50.2': + resolution: {integrity: sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.50.1': - resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==} + '@rollup/rollup-darwin-x64@4.50.2': + resolution: {integrity: sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.50.1': - resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==} + '@rollup/rollup-freebsd-arm64@4.50.2': + resolution: {integrity: sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.50.1': - resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==} + '@rollup/rollup-freebsd-x64@4.50.2': + resolution: {integrity: sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.50.1': - resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==} + '@rollup/rollup-linux-arm-gnueabihf@4.50.2': + resolution: {integrity: sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.50.1': - resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==} + '@rollup/rollup-linux-arm-musleabihf@4.50.2': + resolution: {integrity: sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.50.1': - resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==} + '@rollup/rollup-linux-arm64-gnu@4.50.2': + resolution: {integrity: sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.50.1': - resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==} + '@rollup/rollup-linux-arm64-musl@4.50.2': + resolution: {integrity: sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loongarch64-gnu@4.50.1': - resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==} + '@rollup/rollup-linux-loong64-gnu@4.50.2': + resolution: {integrity: sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-gnu@4.50.1': - resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} + '@rollup/rollup-linux-ppc64-gnu@4.50.2': + resolution: {integrity: sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.50.1': - resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==} + '@rollup/rollup-linux-riscv64-gnu@4.50.2': + resolution: {integrity: sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.50.1': - resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==} + '@rollup/rollup-linux-riscv64-musl@4.50.2': + resolution: {integrity: sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.50.1': - resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==} + '@rollup/rollup-linux-s390x-gnu@4.50.2': + resolution: {integrity: sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.50.1': - resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==} + '@rollup/rollup-linux-x64-gnu@4.50.2': + resolution: {integrity: sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.50.1': - resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==} + '@rollup/rollup-linux-x64-musl@4.50.2': + resolution: {integrity: sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openharmony-arm64@4.50.1': - resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==} + '@rollup/rollup-openharmony-arm64@4.50.2': + resolution: {integrity: sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.50.1': - resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==} + '@rollup/rollup-win32-arm64-msvc@4.50.2': + resolution: {integrity: sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.50.1': - resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==} + '@rollup/rollup-win32-ia32-msvc@4.50.2': + resolution: {integrity: sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.50.1': - resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==} + '@rollup/rollup-win32-x64-msvc@4.50.2': + resolution: {integrity: sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA==} cpu: [x64] os: [win32] @@ -2255,8 +2258,8 @@ packages: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chalk@5.6.0: - resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} chardet@0.7.0: @@ -2281,6 +2284,14 @@ packages: resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} engines: {node: '>=8'} + cidr-regex@4.0.3: + resolution: {integrity: sha512-HOwDIy/rhKeMf6uOzxtv7FAbrz8zPjmVKfSpM+U7/bNBXC5rtOyr758jxcptiSx6ZZn5LOhPJT5WWxPAGDV8dw==} + engines: {node: '>=14'} + + cidr-tools@6.4.2: + resolution: {integrity: sha512-KZC8t2ipCqU2M+ISmTxRDGu9bku5MRU3V1cWyGEFJTZEzRhGvBJvVsbpZO5UAu12fExRFihtYGXAlgFFpmK9jw==} + engines: {node: '>=16'} + cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} @@ -2313,6 +2324,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone-regexp@3.0.0: + resolution: {integrity: sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==} + engines: {node: '>=12'} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -2461,6 +2476,10 @@ packages: engines: {node: '>=16'} hasBin: true + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -2578,6 +2597,10 @@ packages: resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} engines: {node: '>=18'} + default-gateway@7.2.2: + resolution: {integrity: sha512-AD7TrdNNPXRZIGw63dw+lnGmT4v7ggZC5NHNJgAYWm5njrwoze1q5JSAW9YuLy2tjnoLUG/r8FEB93MCh9QJPg==} + engines: {node: '>= 16'} + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -2682,8 +2705,8 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} hasBin: true @@ -2740,6 +2763,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@8.0.0: resolution: {integrity: sha512-CTNS0BcKBcoOsawKBlpcKNmK4Kjuyz5jVLhf+PUsHGMqiKMVTa4cN3U7r7bRY8KTpfOGpXMo27fdy0dYVg2pqA==} engines: {node: '>=16.17'} @@ -2848,6 +2875,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-timeout@0.1.1: + resolution: {integrity: sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==} + engines: {node: '>=14.16'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2999,6 +3030,10 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -3059,6 +3094,10 @@ packages: resolution: {integrity: sha512-+ynEbhWKhyomnaX0n2aLIMSkgSlGB5RrWbNXnEqj6mdaIydu6y40MdBjL38SAB0JcdmOaIaMua1azdjLEr3sdw==} engines: {node: '>=18'} + internal-ip@8.0.0: + resolution: {integrity: sha512-e6c3zxr9COnnc29PIz9LffmALOt0XhIJdR7f83DyHcQksL3B40KGmU3Sr1lrHja3i7Zyqo+AbwKZ+nZiMvg/OA==} + engines: {node: '>=16'} + interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} @@ -3070,6 +3109,14 @@ packages: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} + ip-bigint@7.3.0: + resolution: {integrity: sha512-2qVAe0Q9+Y+5nGvmogwK9y4kefD5Ks5l/IG0Jo1lhU9gIF34jifhqrwXwzkIl+LC594Q6SyAlngs4p890xsXVw==} + engines: {node: '>=16'} + + ip-regex@5.0.0: + resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -3134,6 +3181,10 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} + is-ip@5.0.1: + resolution: {integrity: sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==} + engines: {node: '>=14.16'} + is-npm@6.0.0: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3150,6 +3201,10 @@ packages: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + is-ssh@1.4.1: resolution: {integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==} @@ -3607,6 +3662,10 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + p-event@5.0.1: + resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} @@ -3627,6 +3686,10 @@ packages: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} + p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + pac-proxy-agent@7.2.0: resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} engines: {node: '>= 14'} @@ -3901,8 +3964,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.50.1: - resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} + rollup@4.50.2: + resolution: {integrity: sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3933,8 +3996,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.90.0: - resolution: {integrity: sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==} + sass@1.92.1: + resolution: {integrity: sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -4083,6 +4146,9 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-natural-compare@3.0.1: + resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -4144,6 +4210,10 @@ packages: stubborn-fs@1.2.5: resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + super-regex@0.2.0: + resolution: {integrity: sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==} + engines: {node: '>=14.16'} + superjson@2.2.2: resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} @@ -4182,6 +4252,10 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -4390,8 +4464,8 @@ packages: peerDependencies: vite: '>=2.0.0' - vite@7.1.5: - resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} + vite@7.1.6: + resolution: {integrity: sha512-SRYIB8t/isTwNn8vMB3MR6E+EQZM/WG1aKmmIUCfDXfVvKfc20ZpamngWHKzAmmu9ppsgxsg4b2I7c90JZudIQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -4944,7 +5018,7 @@ snapshots: '@commitlint/format@19.8.1': dependencies: '@commitlint/types': 19.8.1 - chalk: 5.6.0 + chalk: 5.6.2 '@commitlint/is-ignored@19.8.1': dependencies: @@ -4964,7 +5038,7 @@ snapshots: '@commitlint/execute-rule': 19.5.0 '@commitlint/resolve-extends': 19.5.0 '@commitlint/types': 19.8.1 - chalk: 5.6.0 + chalk: 5.6.2 cosmiconfig: 9.0.0(typescript@5.9.2) cosmiconfig-typescript-loader: 6.1.0(@types/node@24.3.0)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2) lodash.isplainobject: 4.0.6 @@ -4981,7 +5055,7 @@ snapshots: '@commitlint/execute-rule': 19.8.1 '@commitlint/resolve-extends': 19.8.1 '@commitlint/types': 19.8.1 - chalk: 5.6.0 + chalk: 5.6.2 cosmiconfig: 9.0.0(typescript@5.9.2) cosmiconfig-typescript-loader: 6.1.0(@types/node@24.3.0)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2) lodash.isplainobject: 4.0.6 @@ -5042,7 +5116,7 @@ snapshots: '@commitlint/types@19.8.1': dependencies: '@types/conventional-commits-parser': 5.0.1 - chalk: 5.6.0 + chalk: 5.6.2 '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0)': dependencies: @@ -5070,151 +5144,151 @@ snapshots: '@esbuild/aix-ppc64@0.23.1': optional: true - '@esbuild/aix-ppc64@0.25.9': + '@esbuild/aix-ppc64@0.25.10': optional: true '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm64@0.25.9': + '@esbuild/android-arm64@0.25.10': optional: true '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/android-arm@0.25.9': + '@esbuild/android-arm@0.25.10': optional: true '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/android-x64@0.25.9': + '@esbuild/android-x64@0.25.10': optional: true '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/darwin-arm64@0.25.9': + '@esbuild/darwin-arm64@0.25.10': optional: true '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/darwin-x64@0.25.9': + '@esbuild/darwin-x64@0.25.10': optional: true '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.25.9': + '@esbuild/freebsd-arm64@0.25.10': optional: true '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.25.9': + '@esbuild/freebsd-x64@0.25.10': optional: true '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-arm64@0.25.9': + '@esbuild/linux-arm64@0.25.10': optional: true '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-arm@0.25.9': + '@esbuild/linux-arm@0.25.10': optional: true '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-ia32@0.25.9': + '@esbuild/linux-ia32@0.25.10': optional: true '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-loong64@0.25.9': + '@esbuild/linux-loong64@0.25.10': optional: true '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-mips64el@0.25.9': + '@esbuild/linux-mips64el@0.25.10': optional: true '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/linux-ppc64@0.25.9': + '@esbuild/linux-ppc64@0.25.10': optional: true '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/linux-riscv64@0.25.9': + '@esbuild/linux-riscv64@0.25.10': optional: true '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/linux-s390x@0.25.9': + '@esbuild/linux-s390x@0.25.10': optional: true '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/linux-x64@0.25.9': + '@esbuild/linux-x64@0.25.10': optional: true - '@esbuild/netbsd-arm64@0.25.9': + '@esbuild/netbsd-arm64@0.25.10': optional: true '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.25.9': + '@esbuild/netbsd-x64@0.25.10': optional: true '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/openbsd-arm64@0.25.9': + '@esbuild/openbsd-arm64@0.25.10': optional: true '@esbuild/openbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.25.9': + '@esbuild/openbsd-x64@0.25.10': optional: true - '@esbuild/openharmony-arm64@0.25.9': + '@esbuild/openharmony-arm64@0.25.10': optional: true '@esbuild/sunos-x64@0.23.1': optional: true - '@esbuild/sunos-x64@0.25.9': + '@esbuild/sunos-x64@0.25.10': optional: true '@esbuild/win32-arm64@0.23.1': optional: true - '@esbuild/win32-arm64@0.25.9': + '@esbuild/win32-arm64@0.25.10': optional: true '@esbuild/win32-ia32@0.23.1': optional: true - '@esbuild/win32-ia32@0.25.9': + '@esbuild/win32-ia32@0.25.10': optional: true '@esbuild/win32-x64@0.23.1': optional: true - '@esbuild/win32-x64@0.25.9': + '@esbuild/win32-x64@0.25.10': optional: true '@fastify/busboy@2.1.1': {} @@ -5748,75 +5822,75 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.31': {} - '@rollup/plugin-terser@0.4.4(rollup@4.50.1)': + '@rollup/plugin-terser@0.4.4(rollup@4.50.2)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.37.0 optionalDependencies: - rollup: 4.50.1 + rollup: 4.50.2 - '@rollup/rollup-android-arm-eabi@4.50.1': + '@rollup/rollup-android-arm-eabi@4.50.2': optional: true - '@rollup/rollup-android-arm64@4.50.1': + '@rollup/rollup-android-arm64@4.50.2': optional: true - '@rollup/rollup-darwin-arm64@4.50.1': + '@rollup/rollup-darwin-arm64@4.50.2': optional: true - '@rollup/rollup-darwin-x64@4.50.1': + '@rollup/rollup-darwin-x64@4.50.2': optional: true - '@rollup/rollup-freebsd-arm64@4.50.1': + '@rollup/rollup-freebsd-arm64@4.50.2': optional: true - '@rollup/rollup-freebsd-x64@4.50.1': + '@rollup/rollup-freebsd-x64@4.50.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.50.1': + '@rollup/rollup-linux-arm-gnueabihf@4.50.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.50.1': + '@rollup/rollup-linux-arm-musleabihf@4.50.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.50.1': + '@rollup/rollup-linux-arm64-gnu@4.50.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.50.1': + '@rollup/rollup-linux-arm64-musl@4.50.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.50.1': + '@rollup/rollup-linux-loong64-gnu@4.50.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.50.1': + '@rollup/rollup-linux-ppc64-gnu@4.50.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.50.1': + '@rollup/rollup-linux-riscv64-gnu@4.50.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.50.1': + '@rollup/rollup-linux-riscv64-musl@4.50.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.50.1': + '@rollup/rollup-linux-s390x-gnu@4.50.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.50.1': + '@rollup/rollup-linux-x64-gnu@4.50.2': optional: true - '@rollup/rollup-linux-x64-musl@4.50.1': + '@rollup/rollup-linux-x64-musl@4.50.2': optional: true - '@rollup/rollup-openharmony-arm64@4.50.1': + '@rollup/rollup-openharmony-arm64@4.50.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.50.1': + '@rollup/rollup-win32-arm64-msvc@4.50.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.50.1': + '@rollup/rollup-win32-ia32-msvc@4.50.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.50.1': + '@rollup/rollup-win32-x64-msvc@4.50.2': optional: true '@sindresorhus/merge-streams@2.3.0': {} @@ -6030,7 +6104,7 @@ snapshots: dependencies: '@unocss/core': 66.5.1 - '@unocss/vite@66.5.1(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1))': + '@unocss/vite@66.5.1(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1))': dependencies: '@jridgewell/remapping': 2.3.5 '@unocss/config': 66.5.1 @@ -6041,7 +6115,7 @@ snapshots: pathe: 2.0.3 tinyglobby: 0.2.15 unplugin-utils: 0.3.0 - vite: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) '@vant/popperjs@1.3.0': {} @@ -6049,21 +6123,21 @@ snapshots: dependencies: vue: 3.5.18(typescript@5.9.2) - '@vitejs/plugin-vue-jsx@5.0.1(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': + '@vitejs/plugin-vue-jsx@5.0.1(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) '@rolldown/pluginutils': 1.0.0-beta.31 '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.28.0) - vite: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) vue: 3.5.18(typescript@5.9.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.1(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': + '@vitejs/plugin-vue@6.0.1(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1))(vue@3.5.18(typescript@5.9.2))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 - vite: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) vue: 3.5.18(typescript@5.9.2) '@vitest/coverage-v8@3.2.4(vitest@3.2.4)': @@ -6081,7 +6155,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) + vitest: 3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -6093,13 +6167,13 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -6130,7 +6204,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) + vitest: 3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) '@vitest/utils@3.2.4': dependencies: @@ -6466,7 +6540,7 @@ snapshots: dependencies: ansi-align: 3.0.1 camelcase: 8.0.0 - chalk: 5.6.0 + chalk: 5.6.2 cli-boxes: 3.0.0 string-width: 7.2.0 type-fest: 4.37.0 @@ -6542,7 +6616,7 @@ snapshots: chalk@5.4.1: {} - chalk@5.6.0: {} + chalk@5.6.2: {} chardet@0.7.0: {} @@ -6568,6 +6642,17 @@ snapshots: ci-info@4.2.0: {} + cidr-regex@4.0.3: + dependencies: + ip-regex: 5.0.0 + + cidr-tools@6.4.2: + dependencies: + cidr-regex: 4.0.3 + ip-bigint: 7.3.0 + ip-regex: 5.0.0 + string-natural-compare: 3.0.1 + cli-boxes@3.0.0: {} cli-cursor@3.1.0: @@ -6595,6 +6680,10 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone-regexp@3.0.0: + dependencies: + is-regexp: 3.1.0 + clone@1.0.4: {} color-convert@1.9.3: @@ -6774,6 +6863,8 @@ snapshots: git-semver-tags: 7.0.1 meow: 12.1.1 + convert-hrtime@5.0.0: {} + convert-source-map@2.0.0: {} copy-anything@3.0.5: @@ -6875,6 +6966,10 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.0 + default-gateway@7.2.2: + dependencies: + execa: 7.2.0 + defaults@1.0.4: dependencies: clone: 1.0.4 @@ -6979,34 +7074,34 @@ snapshots: '@esbuild/win32-x64': 0.23.1 optional: true - esbuild@0.25.9: + esbuild@0.25.10: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.9 - '@esbuild/android-arm': 0.25.9 - '@esbuild/android-arm64': 0.25.9 - '@esbuild/android-x64': 0.25.9 - '@esbuild/darwin-arm64': 0.25.9 - '@esbuild/darwin-x64': 0.25.9 - '@esbuild/freebsd-arm64': 0.25.9 - '@esbuild/freebsd-x64': 0.25.9 - '@esbuild/linux-arm': 0.25.9 - '@esbuild/linux-arm64': 0.25.9 - '@esbuild/linux-ia32': 0.25.9 - '@esbuild/linux-loong64': 0.25.9 - '@esbuild/linux-mips64el': 0.25.9 - '@esbuild/linux-ppc64': 0.25.9 - '@esbuild/linux-riscv64': 0.25.9 - '@esbuild/linux-s390x': 0.25.9 - '@esbuild/linux-x64': 0.25.9 - '@esbuild/netbsd-arm64': 0.25.9 - '@esbuild/netbsd-x64': 0.25.9 - '@esbuild/openbsd-arm64': 0.25.9 - '@esbuild/openbsd-x64': 0.25.9 - '@esbuild/openharmony-arm64': 0.25.9 - '@esbuild/sunos-x64': 0.25.9 - '@esbuild/win32-arm64': 0.25.9 - '@esbuild/win32-ia32': 0.25.9 - '@esbuild/win32-x64': 0.25.9 + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 escalade@3.2.0: {} @@ -7054,6 +7149,18 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@7.2.0: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + execa@8.0.0: dependencies: cross-spawn: 7.0.6 @@ -7175,6 +7282,8 @@ snapshots: function-bind@1.1.2: {} + function-timeout@0.1.1: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -7344,6 +7453,8 @@ snapshots: human-signals@2.1.0: {} + human-signals@4.3.1: {} + human-signals@5.0.0: {} husky@9.1.7: {} @@ -7415,6 +7526,13 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 + internal-ip@8.0.0: + dependencies: + cidr-tools: 6.4.2 + default-gateway: 7.2.2 + is-ip: 5.0.1 + p-event: 5.0.1 + interpret@1.4.0: {} iota-array@1.0.0: {} @@ -7424,6 +7542,10 @@ snapshots: jsbn: 1.1.0 sprintf-js: 1.1.3 + ip-bigint@7.3.0: {} + + ip-regex@5.0.0: {} + is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} @@ -7469,6 +7591,11 @@ snapshots: is-interactive@2.0.0: {} + is-ip@5.0.1: + dependencies: + ip-regex: 5.0.0 + super-regex: 0.2.0 + is-npm@6.0.0: {} is-number@7.0.0: {} @@ -7477,6 +7604,8 @@ snapshots: is-path-inside@4.0.0: {} + is-regexp@3.1.0: {} + is-ssh@1.4.1: dependencies: protocols: 2.0.2 @@ -7600,7 +7729,7 @@ snapshots: lint-staged@16.1.6: dependencies: - chalk: 5.6.0 + chalk: 5.6.2 commander: 14.0.0 debug: 4.4.1 lilconfig: 3.1.3 @@ -7671,7 +7800,7 @@ snapshots: log-symbols@6.0.0: dependencies: - chalk: 5.6.0 + chalk: 5.6.2 is-unicode-supported: 1.3.0 log-update@6.1.0: @@ -7903,7 +8032,7 @@ snapshots: ora@8.1.1: dependencies: - chalk: 5.6.0 + chalk: 5.6.2 cli-cursor: 5.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 @@ -7920,6 +8049,10 @@ snapshots: os-tmpdir@1.0.2: {} + p-event@5.0.1: + dependencies: + p-timeout: 5.1.0 + p-finally@1.0.0: {} p-limit@4.0.0: @@ -7939,6 +8072,8 @@ snapshots: dependencies: p-finally: 1.0.0 + p-timeout@5.1.0: {} + pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 @@ -8231,31 +8366,31 @@ snapshots: rfdc@1.4.1: {} - rollup@4.50.1: + rollup@4.50.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.50.1 - '@rollup/rollup-android-arm64': 4.50.1 - '@rollup/rollup-darwin-arm64': 4.50.1 - '@rollup/rollup-darwin-x64': 4.50.1 - '@rollup/rollup-freebsd-arm64': 4.50.1 - '@rollup/rollup-freebsd-x64': 4.50.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.50.1 - '@rollup/rollup-linux-arm-musleabihf': 4.50.1 - '@rollup/rollup-linux-arm64-gnu': 4.50.1 - '@rollup/rollup-linux-arm64-musl': 4.50.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.50.1 - '@rollup/rollup-linux-ppc64-gnu': 4.50.1 - '@rollup/rollup-linux-riscv64-gnu': 4.50.1 - '@rollup/rollup-linux-riscv64-musl': 4.50.1 - '@rollup/rollup-linux-s390x-gnu': 4.50.1 - '@rollup/rollup-linux-x64-gnu': 4.50.1 - '@rollup/rollup-linux-x64-musl': 4.50.1 - '@rollup/rollup-openharmony-arm64': 4.50.1 - '@rollup/rollup-win32-arm64-msvc': 4.50.1 - '@rollup/rollup-win32-ia32-msvc': 4.50.1 - '@rollup/rollup-win32-x64-msvc': 4.50.1 + '@rollup/rollup-android-arm-eabi': 4.50.2 + '@rollup/rollup-android-arm64': 4.50.2 + '@rollup/rollup-darwin-arm64': 4.50.2 + '@rollup/rollup-darwin-x64': 4.50.2 + '@rollup/rollup-freebsd-arm64': 4.50.2 + '@rollup/rollup-freebsd-x64': 4.50.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.50.2 + '@rollup/rollup-linux-arm-musleabihf': 4.50.2 + '@rollup/rollup-linux-arm64-gnu': 4.50.2 + '@rollup/rollup-linux-arm64-musl': 4.50.2 + '@rollup/rollup-linux-loong64-gnu': 4.50.2 + '@rollup/rollup-linux-ppc64-gnu': 4.50.2 + '@rollup/rollup-linux-riscv64-gnu': 4.50.2 + '@rollup/rollup-linux-riscv64-musl': 4.50.2 + '@rollup/rollup-linux-s390x-gnu': 4.50.2 + '@rollup/rollup-linux-x64-gnu': 4.50.2 + '@rollup/rollup-linux-x64-musl': 4.50.2 + '@rollup/rollup-openharmony-arm64': 4.50.2 + '@rollup/rollup-win32-arm64-msvc': 4.50.2 + '@rollup/rollup-win32-ia32-msvc': 4.50.2 + '@rollup/rollup-win32-x64-msvc': 4.50.2 fsevents: 2.3.3 run-applescript@7.0.0: {} @@ -8280,7 +8415,7 @@ snapshots: safer-buffer@2.1.2: {} - sass@1.90.0: + sass@1.92.1: dependencies: chokidar: 4.0.3 immutable: 5.1.3 @@ -8432,6 +8567,8 @@ snapshots: string-argv@0.3.2: {} + string-natural-compare@3.0.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -8491,6 +8628,12 @@ snapshots: stubborn-fs@1.2.5: {} + super-regex@0.2.0: + dependencies: + clone-regexp: 3.0.0 + function-timeout: 0.1.1 + time-span: 5.1.0 + superjson@2.2.2: dependencies: copy-anything: 3.0.5 @@ -8530,6 +8673,10 @@ snapshots: through@2.3.8: {} + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -8698,7 +8845,7 @@ snapshots: update-notifier@7.3.1: dependencies: boxen: 8.0.1 - chalk: 5.6.0 + chalk: 5.6.2 configstore: 7.0.0 is-in-ci: 1.0.0 is-installed-globally: 1.0.0 @@ -8729,13 +8876,13 @@ snapshots: evtd: 0.2.4 vue: 3.5.18(typescript@5.9.2) - vite-node@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -8750,34 +8897,34 @@ snapshots: - tsx - yaml - vite-plugin-vue-setup-extend@0.4.0(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1)): + vite-plugin-vue-setup-extend@0.4.0(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1)): dependencies: '@vue/compiler-sfc': 3.5.13 magic-string: 0.25.9 - vite: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) - vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1): + vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1): dependencies: - esbuild: 0.25.9 + esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.50.1 + rollup: 4.50.2 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.3.0 fsevents: 2.3.3 jiti: 2.5.1 - sass: 1.90.0 + sass: 1.92.1 terser: 5.37.0 tsx: 4.19.2 yaml: 2.8.1 - vitest@3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1): + vitest@3.2.4(@types/node@24.3.0)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -8795,8 +8942,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.5(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) + vite: 7.1.6(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(sass@1.92.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.3.0 diff --git a/public/icon.js b/public/icon.js index 6498ae24..fae8cbb8 100644 --- a/public/icon.js +++ b/public/icon.js @@ -1 +1 @@ -!function(e){var t,n,d,o,i,a,r='';function c(){i||(i=!0,d())}t=function(){var e,t,n;(n=document.createElement("div")).innerHTML=r,r=null,(t=n.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",e=t,(n=document.body).firstChild?(t=n.firstChild).parentNode.insertBefore(e,t):n.appendChild(e))},document.addEventListener?["complete","loaded","interactive"].indexOf(document.readyState)>-1?setTimeout(t,0):(n=function(){document.removeEventListener("DOMContentLoaded",n,!1),t()},document.addEventListener("DOMContentLoaded",n,!1)):document.attachEvent&&(d=t,o=e.document,i=!1,(a=function(){try{o.documentElement.doScroll("left")}catch(e){return void setTimeout(a,50)}c()})(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,c())})}(window); +!function(e){var t,n,d,o,i,a,r='';function c(){i||(i=!0,d())}t=function(){var e,t,n;(n=document.createElement("div")).innerHTML=r,r=null,(t=n.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",e=t,(n=document.body).firstChild?(t=n.firstChild).parentNode.insertBefore(e,t):n.appendChild(e))},document.addEventListener?["complete","loaded","interactive"].indexOf(document.readyState)>-1?setTimeout(t,0):(n=function(){document.removeEventListener("DOMContentLoaded",n,!1),t()},document.addEventListener("DOMContentLoaded",n,!1)):document.attachEvent&&(d=t,o=e.document,i=!1,(a=function(){try{o.documentElement.doScroll("left")}catch(e){return void setTimeout(a,50)}c()})(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,c())})}(window); diff --git a/scripts/check-all.js b/scripts/check-all.js index 7238e4d3..806b421e 100644 --- a/scripts/check-all.js +++ b/scripts/check-all.js @@ -31,10 +31,6 @@ async function main() { /** @type {CheckItem[]} */ const checks = [ - { - script: join(__dirname, 'check-env.js'), - description: '配置文件检查' - }, { script: join(__dirname, 'check-dependencies.js'), description: '环境检查' diff --git a/src-tauri/.env b/src-tauri/.env deleted file mode 100644 index 0996fdeb..00000000 --- a/src-tauri/.env +++ /dev/null @@ -1,3 +0,0 @@ -RUST_BACKTRACE=1 -# APP_ENVIRONMENT=local -APP_ENVIRONMENT=production diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore index f4dfb82b..325a84bc 100644 --- a/src-tauri/.gitignore +++ b/src-tauri/.gitignore @@ -1,4 +1,5 @@ # Generated by Cargo # will have compiled files and executables /target/ +local.yaml diff --git a/src-tauri/configuration/base.yaml b/src-tauri/configuration/base.yaml index 12732d25..d2409302 100644 --- a/src-tauri/configuration/base.yaml +++ b/src-tauri/configuration/base.yaml @@ -2,3 +2,4 @@ database: sqlite_file: db.sqlite backend: base_url: https://hulaspark.com/api +active_config: local diff --git a/src-tauri/configuration/local.yaml b/src-tauri/configuration/local.yaml deleted file mode 100644 index 25d58dfc..00000000 --- a/src-tauri/configuration/local.yaml +++ /dev/null @@ -1,4 +0,0 @@ -database: - sqlite_file: db.sqlite -backend: - base_url: http://192.168.1.37:18760 diff --git a/src-tauri/configuration/production.yaml b/src-tauri/configuration/production.yaml index 12732d25..caf85ed8 100644 --- a/src-tauri/configuration/production.yaml +++ b/src-tauri/configuration/production.yaml @@ -2,3 +2,11 @@ database: sqlite_file: db.sqlite backend: base_url: https://hulaspark.com/api + ws_url: wss://hulaspark.com/api/ws/ws + +youdao: + app_key: '' + app_secret: '' +tencent: + api_key: '' + secret_id: '' diff --git a/src-tauri/entity/src/im_message.rs b/src-tauri/entity/src/im_message.rs index 7a4dba53..3fb0bc1b 100644 --- a/src-tauri/entity/src/im_message.rs +++ b/src-tauri/entity/src/im_message.rs @@ -22,6 +22,7 @@ pub struct Model { pub login_uid: String, /// 消息发送状态: pending, success, fail pub send_status: String, + pub time_block: Option, } impl ActiveModelBehavior for ActiveModel {} diff --git a/src-tauri/gen/android/app/.gitignore b/src-tauri/gen/android/app/.gitignore index 160e8ff8..c9cc7578 100644 --- a/src-tauri/gen/android/app/.gitignore +++ b/src-tauri/gen/android/app/.gitignore @@ -3,4 +3,5 @@ /src/main/assets/tauri.conf.json /tauri.build.gradle.kts /proguard-tauri.pro -/tauri.properties \ No newline at end of file +/tauri.properties +/src/main/assets/configuration \ No newline at end of file diff --git a/src-tauri/gen/android/app/src/main/AndroidManifest.xml b/src-tauri/gen/android/app/src/main/AndroidManifest.xml index e0f1deb3..39890f9f 100644 --- a/src-tauri/gen/android/app/src/main/AndroidManifest.xml +++ b/src-tauri/gen/android/app/src/main/AndroidManifest.xml @@ -1,41 +1,25 @@ - + - - - + + + + + - - - - - - - - - + + + + + + + + + - - - - + + + + diff --git a/src-tauri/gen/android/app/src/main/assets/configuration/base.yaml b/src-tauri/gen/android/app/src/main/assets/configuration/base.yaml deleted file mode 100644 index 12732d25..00000000 --- a/src-tauri/gen/android/app/src/main/assets/configuration/base.yaml +++ /dev/null @@ -1,4 +0,0 @@ -database: - sqlite_file: db.sqlite -backend: - base_url: https://hulaspark.com/api diff --git a/src-tauri/gen/android/app/src/main/assets/configuration/local.yaml b/src-tauri/gen/android/app/src/main/assets/configuration/local.yaml deleted file mode 100644 index 25d58dfc..00000000 --- a/src-tauri/gen/android/app/src/main/assets/configuration/local.yaml +++ /dev/null @@ -1,4 +0,0 @@ -database: - sqlite_file: db.sqlite -backend: - base_url: http://192.168.1.37:18760 diff --git a/src-tauri/gen/android/app/src/main/assets/configuration/production.yaml b/src-tauri/gen/android/app/src/main/assets/configuration/production.yaml deleted file mode 100644 index 12732d25..00000000 --- a/src-tauri/gen/android/app/src/main/assets/configuration/production.yaml +++ /dev/null @@ -1,4 +0,0 @@ -database: - sqlite_file: db.sqlite -backend: - base_url: https://hulaspark.com/api diff --git a/src-tauri/gen/apple/PrivacyInfo.xcprivacy b/src-tauri/gen/apple/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..7caf4233 --- /dev/null +++ b/src-tauri/gen/apple/PrivacyInfo.xcprivacy @@ -0,0 +1,17 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/src-tauri/migration/src/lib.rs b/src-tauri/migration/src/lib.rs index fdd7dcca..aafd77c1 100644 --- a/src-tauri/migration/src/lib.rs +++ b/src-tauri/migration/src/lib.rs @@ -3,6 +3,7 @@ pub use sea_orm_migration::prelude::*; mod m20220101_000001_create_table; mod m20241220_000002_add_token_field; mod m20241220_000003_add_refresh_token_field; +mod m20250917_000001_update_msg_table; pub struct Migrator; @@ -13,6 +14,7 @@ impl MigratorTrait for Migrator { Box::new(m20220101_000001_create_table::Migration), Box::new(m20241220_000002_add_token_field::Migration), Box::new(m20241220_000003_add_refresh_token_field::Migration), + Box::new(m20250917_000001_update_msg_table::Migration), ] } } diff --git a/src-tauri/migration/src/m20250917_000001_update_msg_table.rs b/src-tauri/migration/src/m20250917_000001_update_msg_table.rs new file mode 100644 index 00000000..cf5c5edd --- /dev/null +++ b/src-tauri/migration/src/m20250917_000001_update_msg_table.rs @@ -0,0 +1,35 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager.alter_table( + Table::alter() + .table(ImMessage::Table) + .add_column(ColumnDef::new(ImMessage::TimeBlock).big_integer()) + .to_owned() + ).await?; + + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager.alter_table( + Table::alter() + .table(ImMessage::Table) + .drop_column(ImMessage::TimeBlock) + .to_owned() + ).await?; + + Ok(()) + } +} + +#[derive(DeriveIden)] +enum ImMessage { + Table, + TimeBlock, +} diff --git a/src-tauri/src/command/chat_history_command.rs b/src-tauri/src/command/chat_history_command.rs index 795decba..2555dbd2 100644 --- a/src-tauri/src/command/chat_history_command.rs +++ b/src-tauri/src/command/chat_history_command.rs @@ -84,7 +84,7 @@ pub async fn query_chat_history( // 转换为响应格式 let message_resps: Vec = messages .into_iter() - .map(|msg| crate::command::message_command::convert_message_to_resp(msg)) + .map(|msg| crate::command::message_command::convert_message_to_resp(msg, None)) .collect(); // 根据返回的消息数量判断是否还有更多数据 diff --git a/src-tauri/src/command/message_command.rs b/src-tauri/src/command/message_command.rs index 7bde7446..8a10b085 100644 --- a/src-tauri/src/command/message_command.rs +++ b/src-tauri/src/command/message_command.rs @@ -25,6 +25,7 @@ pub struct MessageResp { pub from_user: FromUser, pub message: Message, pub old_msg_id: Option, + pub time_block: Option, } #[derive(Serialize, Deserialize, Debug, Clone)] @@ -95,6 +96,7 @@ pub async fn page_msg( param: CursorPageMessageParam, state: State<'_, AppData>, ) -> Result>, String> { + info!("get page msg"); // 获取当前登录用户的 uid let login_uid = { let user_info = state.user_info.lock().await; @@ -116,7 +118,7 @@ pub async fn page_msg( .list .unwrap_or_default() .into_iter() - .map(|msg| convert_message_to_resp(msg)) + .map(|msg| convert_message_to_resp(msg, None)) .rev() .collect(); @@ -129,7 +131,7 @@ pub async fn page_msg( } /// 将数据库消息模型转换为响应模型 -pub fn convert_message_to_resp(msg: im_message::Model) -> MessageResp { +pub fn convert_message_to_resp(msg: im_message::Model, old_msg_id: Option) -> MessageResp { // 解析消息体 - 安全地处理 JSON 解析 let body = msg.body.as_ref().and_then(|body_str| { if body_str.trim().is_empty() { @@ -193,7 +195,8 @@ pub fn convert_message_to_resp(msg: im_message::Model) -> MessageResp { message_marks, send_time: msg.send_time, }, - old_msg_id: None, + old_msg_id: old_msg_id, + time_block: msg.time_block, } } @@ -254,7 +257,7 @@ pub async fn fetch_all_messages( uid, last_opt_time ); // 调用后端接口 /chat/msg/list 获取所有消息,传递 last_opt_time 参数 - let params = if let Some(time) = last_opt_time { + let body = if let Some(time) = last_opt_time { Some(serde_json::json!({ "lastOptTime": time })) @@ -263,7 +266,7 @@ pub async fn fetch_all_messages( }; let messages: Option> = client - .im_request(ImUrl::GetMsgList, None::, params) + .im_request(ImUrl::GetMsgList, body, None::) .await?; if let Some(messages) = messages { @@ -332,6 +335,7 @@ fn convert_resp_to_model_for_fetch(msg_resp: MessageResp, uid: String) -> im_mes update_time: msg_resp.update_time, login_uid: uid.to_string(), // 这里暂时设为空字符串,实际使用时会在 save_all 中设置 send_status: "success".to_string(), // 从后端获取的消息默认为成功状态 + time_block: msg_resp.time_block, } } @@ -376,6 +380,7 @@ pub async fn send_msg( update_time: Some(current_time), login_uid: login_uid.clone(), send_status: "pending".to_string(), // 初始状态为pending + time_block: None, }; let tx = state @@ -418,28 +423,30 @@ pub async fn send_msg( Ok(Some(mut resp)) => { resp.old_msg_id = Some(msg_id.clone()); id = resp.message.id.clone(); - // 尝试克隆数据以避免所有权问题 - let event_data = resp.clone(); - success_channel.send(event_data).unwrap(); "success" } - _ => { - error_channel.send(msg_id.clone()).unwrap(); - "fail" - } + _ => "fail", }; // 更新消息状态 - if let Err(e) = im_message_repository::update_message_status( + let model = im_message_repository::update_message_status( db_conn.deref(), - &msg_id, + message, status, id, login_uid.clone(), ) - .await - { - error!("Failed to update message status: {}", e); + .await; + + match model { + Ok(model) => { + let resp = convert_message_to_resp(model, Some(msg_id)); + success_channel.send(resp).unwrap(); + } + Err(e) => { + error!("{:?}", e); + error_channel.send(msg_id.clone()).unwrap(); + } } }); @@ -448,6 +455,7 @@ pub async fn send_msg( #[tauri::command] pub async fn save_msg(data: MessageResp, state: State<'_, AppData>) -> Result<(), String> { + info!("save msg: {:?}", serde_json::to_string(&data)); // 创建 im_message::Model let message = convert_resp_to_model_for_fetch(data, state.user_info.lock().await.uid.clone()); diff --git a/src-tauri/src/command/mod.rs b/src-tauri/src/command/mod.rs index 76963775..c1e5ab96 100644 --- a/src-tauri/src/command/mod.rs +++ b/src-tauri/src/command/mod.rs @@ -5,3 +5,4 @@ pub mod message_mark_command; pub mod request_command; pub mod room_member_command; pub mod user_command; +pub mod setting_command; diff --git a/src-tauri/src/command/setting_command.rs b/src-tauri/src/command/setting_command.rs new file mode 100644 index 00000000..3a80a648 --- /dev/null +++ b/src-tauri/src/command/setting_command.rs @@ -0,0 +1,28 @@ +use serde::{Deserialize, Serialize}; +use tauri::State; +use tracing::info; + +use crate::{configuration::Settings, AppData}; + + +#[tauri::command] +pub async fn get_settings(state: State<'_, AppData>,) -> Result { + Ok(state.config.lock().await.clone()) +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +pub struct UpdateSettingsParams { + base_url: String, + ws_url: String, +} + +#[tauri::command] +pub async fn update_settings(state: State<'_, AppData>, settings: UpdateSettingsParams) -> Result<(), String> { + let mut config = state.config.lock().await; + config.backend.base_url = settings.base_url.clone(); + config.backend.ws_url = settings.ws_url; + info!("update settings: {:?}", config); + state.rc.lock().await.set_base_url(settings.base_url.clone()); + Ok(()) +} diff --git a/src-tauri/src/configuration.rs b/src-tauri/src/configuration.rs index 8b5328fb..9c3e67d6 100644 --- a/src-tauri/src/configuration.rs +++ b/src-tauri/src/configuration.rs @@ -6,22 +6,37 @@ use tauri::{AppHandle, Manager}; use tracing::info; // 应用程序设置结构体 -#[derive(serde::Deserialize, Clone, Debug)] +#[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] +#[serde(rename_all = "camelCase")] pub struct Settings { pub database: DatabaseSettings, pub backend: BackendSettings, + pub youdao: Youdao, } // 数据库配置设置 -#[derive(serde::Deserialize, Clone, Debug)] +#[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct DatabaseSettings { pub sqlite_file: String, } // 后端服务配置设置 -#[derive(serde::Deserialize, Clone, Debug)] +#[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] pub struct BackendSettings { pub base_url: String, + pub ws_url: String, +} + +#[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] +pub struct Youdao { + pub app_key: String, + pub app_secret: String, +} + +#[derive(serde::Deserialize, serde::Serialize, Clone, Debug)] +pub struct Tencent { + pub api_key: String, + pub secret_id: String, } // 应用程序运行环境枚举 @@ -31,13 +46,6 @@ pub enum Environment { Production, } -// 配置文件来源枚举 -enum ConfigSource { - FileSystem(PathBuf, PathBuf), - Resource(PathBuf, PathBuf), - Embedded, -} - impl DatabaseSettings { /// 创建数据库连接 /// 根据不同的运行环境(桌面开发、移动端、桌面生产)选择合适的数据库路径 @@ -150,204 +158,120 @@ impl TryFrom for Environment { /// * `Ok(Settings)` - 成功时返回配置设置 /// * `Err(config::ConfigError)` - 失败时返回配置错误 pub fn get_configuration(app_handle: &AppHandle) -> Result { - let environment: Environment = std::env::var("APP_ENVIRONMENT") - .unwrap_or_else(|_| "local".into()) - .try_into() - .map_err(|e| { - config::ConfigError::Message(format!("Failed to parse APP_ENVIRONMENT: {:?}", e)) - })?; + #[cfg(not(target_os = "android"))] + { + let is_desktop_dev = cfg!(debug_assertions) && cfg!(desktop); - info!("APP_ENVIRONMENT: {}", environment.as_str()); - let environment_filename = format!("{}.yaml", environment.as_str()); - let is_desktop_dev = cfg!(debug_assertions) && cfg!(desktop); + let config_path_buf = get_config_path_buf(app_handle, is_desktop_dev)?; - match load_config_source(app_handle, &environment_filename, is_desktop_dev) { - ConfigSource::FileSystem(base_path, env_path) => { - tracing::info!("Using filesystem configuration files"); - build_config_from_files(base_path, env_path) - } - ConfigSource::Resource(base_path, env_path) => { - tracing::info!("Using Resource directory configuration files"); - build_config_from_files(base_path, env_path) - } - ConfigSource::Embedded => { - tracing::info!("Using embedded configuration"); - build_config_from_embedded(&environment) - } - } -} + let settings = config::Config::builder() + .add_source(config::File::from(config_path_buf.0)) + .add_source(config::File::from(config_path_buf.1)) + .add_source( + config::Environment::with_prefix("APP") + .prefix_separator("_") + .separator("__"), + ) + .build()?; -/// 加载配置文件来源 -/// 根据运行环境和配置文件可用性确定配置来源 -/// 优先级:文件系统 > 资源目录 > 嵌入式配置 -/// -/// # 参数 -/// * `app_handle` - Tauri应用句柄 -/// * `environment_filename` - 环境配置文件名 -/// * `is_desktop_dev` - 是否为桌面开发环境 -/// -/// # 返回值 -/// * `ConfigSource` - 配置文件来源枚举 -fn load_config_source( - app_handle: &AppHandle, - environment_filename: &str, - is_desktop_dev: bool, -) -> ConfigSource { - if is_desktop_dev { - if let Ok(config_dir) = get_configuration_directory(app_handle) { - let base_path = config_dir.join("base.yaml"); - let env_path = config_dir.join(environment_filename); - return ConfigSource::FileSystem(base_path, env_path); - } + settings.try_deserialize::() } - if let Ok(config_dir) = app_handle - .path() - .resolve("configuration", tauri::path::BaseDirectory::Resource) + #[cfg(target_os = "android")] { - let base_path = config_dir.join("base.yaml"); - let env_path = config_dir.join(environment_filename); + // 读取 base.yaml 内容 + let base_content = std::str::from_utf8(include_bytes!("../configuration/base.yaml")) + .map_err(|e| config::ConfigError::Message(e.to_string()))?; - if base_path.exists() && env_path.exists() { - return ConfigSource::Resource(base_path, env_path); - } else { - tracing::warn!( - "Resource directory configuration files do not exist, falling back to embedded config" - ); + // 构建 base 配置对象 + let base_config = config::Config::builder() + .add_source(config::File::from_str( + base_content, + config::FileFormat::Yaml, + )) + .build()?; + + // 获取 active_config 字段 + let active_config = base_config.get_string("active_config").map_err(|_| { + config::ConfigError::Message( + "Missing or invalid 'active_config' in base.yaml".to_string(), + ) + })?; + + // 校验 active_config 合法性 + if active_config != "local" && active_config != "production" { + return Err(config::ConfigError::Message( + "Only \"local\" or \"production\" can be specified in active_config".to_string(), + )); } - } else { - tracing::warn!("Failed to get Resource directory, falling back to embedded config"); - } - ConfigSource::Embedded -} + // 加载对应的配置文件内容 + let config_file_bytes: &[u8] = match active_config.as_str() { + "local" => include_bytes!("../configuration/local.yaml").as_ref(), + "production" => include_bytes!("../configuration/production.yaml").as_ref(), + _ => return Err(config::ConfigError::Message("Invalid active_config".into())),// 这里可以支持更多的环境配置 + }; -/// 从配置文件构建配置对象 -/// 加载基础配置文件和环境特定配置文件,并合并环境变量配置 -/// -/// # 参数 -/// * `base_path` - 基础配置文件路径 -/// * `env_path` - 环境配置文件路径 -/// -/// # 返回值 -/// * `Ok(Settings)` - 成功时返回配置设置 -/// * `Err(config::ConfigError)` - 失败时返回配置错误 -fn build_config_from_files( - base_path: PathBuf, - env_path: PathBuf, -) -> Result { - let settings = config::Config::builder() - .add_source(config::File::from(base_path)) - .add_source(config::File::from(env_path)) - .add_source( - config::Environment::with_prefix("APP") - .prefix_separator("_") - .separator("__"), - ) - .build()?; - settings.try_deserialize::() + let active_content = std::str::from_utf8(config_file_bytes) + .map_err(|e| config::ConfigError::Message(e.to_string()))?; + + // 构建最终配置对象 + config::Config::builder() + .add_source(config::File::from_str( + base_content, + config::FileFormat::Yaml, + )) + .add_source(config::File::from_str( + active_content, + config::FileFormat::Yaml, + )) + .add_source( + config::Environment::with_prefix("APP") + .prefix_separator("_") + .separator("__"), + ) + .build()? + .try_deserialize::() + } } -/// 从嵌入式配置构建配置对象 -/// 使用编译时嵌入的配置文件内容构建配置 -/// -/// # 参数 -/// * `environment` - 运行环境枚举 -/// -/// # 返回值 -/// * `Ok(Settings)` - 成功时返回配置设置 -/// * `Err(config::ConfigError)` - 失败时返回配置错误 -fn build_config_from_embedded(environment: &Environment) -> Result { - let base_config = include_str!("../configuration/base.yaml"); - let env_config = match environment.as_str() { - "local" => include_str!("../configuration/local.yaml"), - "production" => include_str!("../configuration/production.yaml"), - _ => { - return Err(config::ConfigError::Message(format!( - "Unsupported environment: {}", - environment.as_str() - ))); - } +fn get_config_path_buf( + app_handle: &AppHandle, + is_desktop_dev: bool, +) -> Result<(PathBuf, PathBuf), config::ConfigError> { + let dir = if is_desktop_dev { + let base_path = std::env::current_dir().map_err(|e| { + config::ConfigError::Message(format!("Failed to get current dir: {}", e)) + })?; + + base_path.join("configuration") + } else { + app_handle + .path() + .resource_dir() + .map_err(|e| config::ConfigError::NotFound(format!("resource not find: {}", e)))? + .join("configuration") }; - let settings = config::Config::builder() - .add_source(config::File::from_str( - base_config, - config::FileFormat::Yaml, - )) - .add_source(config::File::from_str(env_config, config::FileFormat::Yaml)) - .add_source( - config::Environment::with_prefix("APP") - .prefix_separator("_") - .separator("__"), - ) + let base_path = dir.join("base.yaml"); + + #[cfg(not(target_os = "android"))] + let base_config = config::Config::builder() + .add_source(config::File::from(base_path.clone())) .build()?; - settings.try_deserialize::() -} -/// 获取配置文件目录路径 -/// 根据运行环境选择合适的配置文件目录: -/// - 桌面开发环境:项目根目录/configuration -/// - 其他环境:优先使用Resource目录,失败则使用app_data_dir -/// -/// # 参数 -/// * `app_handle` - Tauri应用句柄 -/// -/// # 返回值 -/// * `Ok(PathBuf)` - 成功时返回配置目录路径 -/// * `Err(config::ConfigError)` - 失败时返回配置错误 -fn get_configuration_directory(app_handle: &AppHandle) -> Result { - // 配置目录路径策略: - // 桌面端开发环境:使用项目根目录 - // 其他情况:使用 Resource 目录 - let config_path = if cfg!(debug_assertions) && cfg!(desktop) { - let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - path.push("configuration"); - path - } else { - // 非桌面端开发环境:优先使用 Resource 目录,失败则使用 app_data_dir - match app_handle - .path() - .resolve("configuration", tauri::path::BaseDirectory::Resource) - { - Ok(path) => { - info!("Using Resource configuration directory: {:?}", path); - path - } - Err(e) => { - tracing::warn!( - "Failed to get Resource configuration directory: {}, trying app_data_dir", - e - ); + #[cfg(target_os = "android")] + let base_config = { + let content = std::str::from_utf8(include_bytes!("../configuration/base.yaml")) + .map_err(|e| config::ConfigError::Message(e.to_string()))?; - match app_handle.path().app_data_dir() { - Ok(app_data_dir) => { - let config_dir = app_data_dir.join("configuration"); - if let Err(create_err) = std::fs::create_dir_all(&config_dir) { - tracing::warn!( - "Failed to create app_data_dir configuration directory: {}", - create_err - ); - } - info!( - "Using backup app_data_dir configuration directory: {:?}", - config_dir - ); - config_dir - } - Err(app_data_err) => { - let error_msg = format!( - "Failed to get both Resource and app_data_dir configuration directories: Resource error={}, app_data_dir error={}", - e, app_data_err - ); - tracing::error!("{}", error_msg); - return Err(config::ConfigError::Message(error_msg)); - } - } - } - } + config::Config::builder() + .add_source(config::File::from_str(content, config::FileFormat::Yaml)) + .build()? }; - info!("Configuration file directory: {:?}", config_path); - Ok(config_path) + let active_config = base_config.get_string("active_config")?; + println!("active_config: {:?}", active_config); + let active_config_path_buf = dir.clone().join(active_config); + Ok((base_path, active_config_path_buf)) } diff --git a/src-tauri/src/desktops/common_cmd.rs b/src-tauri/src/desktops/common_cmd.rs index 128ce02f..cee2cf6b 100644 --- a/src-tauri/src/desktops/common_cmd.rs +++ b/src-tauri/src/desktops/common_cmd.rs @@ -10,7 +10,7 @@ use std::sync::{Arc, RwLock}; use std::thread; use std::time::Duration; use tauri::path::BaseDirectory; -use tauri::{AppHandle, Emitter, LogicalSize, Manager, ResourceId, Runtime, Webview}; +use tauri::{AppHandle, LogicalSize, Manager, ResourceId, Runtime, Webview}; #[cfg(target_os = "macos")] use objc2::rc::Retained; @@ -32,12 +32,6 @@ pub struct WindowsScaleInfo { /// 是否检测到文本缩放 pub has_text_scaling: bool, } - -use crate::desktops::window_payload::{ - WindowPayload, get_window_payload as _get_window_payload, - push_window_payload as _push_window_payload, -}; - // 定义用户信息结构体 #[derive(Debug, Clone, Serialize)] pub struct UserInfo { @@ -246,34 +240,6 @@ pub fn show_title_bar_buttons(window_label: &str, handle: AppHandle) -> Result<( Ok(()) } -#[tauri::command] -pub async fn push_window_payload( - label: String, - payload: serde_json::Value, - handle: AppHandle, -) -> Result<(), String> { - let payload_entity = WindowPayload::new(payload); - if let Some(window) = handle.get_webview_window(&label) { - window - // 找到了对应label的window说明已经打开了,就只需要提醒刷新就行了 - .emit(&format!("{}:update", label), payload_entity) - .map_err(|e| e.to_string()) - } else { - _push_window_payload(label, payload_entity) - .await - // 这里是存在值的时候才算失败,不存在值则是插入成功 - .map_or_else(|| Ok(()), |_| Err("none".to_string())) - } -} - -#[tauri::command] -pub async fn get_window_payload(label: String) -> Result { - _get_window_payload(label) - .await - .map(|payload_entity| payload_entity.payload) - .ok_or(()) -} - #[tauri::command] pub async fn get_files_meta(files_path: Vec) -> Result, String> { let mut files_meta: Vec = Vec::new(); diff --git a/src-tauri/src/desktops/window_payload.rs b/src-tauri/src/desktops/window_payload.rs index 6e3611c5..87507d5a 100644 --- a/src-tauri/src/desktops/window_payload.rs +++ b/src-tauri/src/desktops/window_payload.rs @@ -9,22 +9,18 @@ pub struct WindowPayload { pub payload: serde_json::Value, } -impl WindowPayload { - pub fn new(payload: serde_json::Value) -> Self { - WindowPayload { payload } - } -} - lazy_static! { - static ref PAYLOAD_CACHE: Mutex> = Mutex::new(HashMap::new()); + static ref PAYLOAD_CACHE: Mutex> = Mutex::new(HashMap::new()); } -pub async fn push_window_payload(label: String, payload: WindowPayload) -> Option { +#[tauri::command] +pub async fn push_window_payload(label: String, payload: serde_json::Value) -> Option { let mut payload_cache = PAYLOAD_CACHE.lock().await; payload_cache.insert(label, payload) } -pub async fn get_window_payload(label: String) -> Option { +#[tauri::command] +pub async fn get_window_payload(label: String) -> Option { let mut payload_cache = PAYLOAD_CACHE.lock().await; payload_cache.remove(&label) } diff --git a/src-tauri/src/im_request_client.rs b/src-tauri/src/im_request_client.rs index 71926cbc..c54aabe0 100644 --- a/src-tauri/src/im_request_client.rs +++ b/src-tauri/src/im_request_client.rs @@ -43,6 +43,10 @@ impl ImRequestClient { }) } + pub fn set_base_url(&mut self, base_url: String) { + self.base_url = base_url; + } + pub async fn request< T: serde::de::DeserializeOwned, B: serde::Serialize, @@ -102,7 +106,11 @@ impl ImRequestClient { return Err(anyhow::anyhow!("请重新登录")); } Some(200) => { - info!("✅ Request successful: {}, Method: {}", &url, method.clone()); + info!( + "✅ Request successful: {}, Method: {}", + &url, + method.clone() + ); return Ok(result); } _ => { @@ -260,6 +268,7 @@ pub enum ImUrl { HandleInvite, ApplyUnReadCount, RequestApplyPage, + RequestNoticePage, GetContactList, SearchFriend, ChangeUserState, @@ -285,6 +294,8 @@ pub enum ImUrl { GetFriendPage, MarkMsgRead, CheckEmail, + MergeMsg, + GetUserByIds, } impl ImUrl { @@ -360,6 +371,7 @@ impl ImUrl { ImUrl::HandleInvite => (http::Method::POST, "im/room/apply/handler/apply"), ImUrl::ApplyUnReadCount => (http::Method::GET, "im/room/apply/unread"), ImUrl::RequestApplyPage => (http::Method::GET, "im/room/apply/page"), + ImUrl::RequestNoticePage => (http::Method::GET, "im/room/notice/page"), ImUrl::GetFriendPage => (http::Method::GET, "im/user/friend/page"), ImUrl::GetContactList => (http::Method::GET, "im/chat/contact/list"), ImUrl::SearchFriend => (http::Method::GET, "im/user/friend/search"), @@ -384,12 +396,15 @@ impl ImUrl { ImUrl::RecallMsg => (http::Method::PUT, "im/chat/msg/recall"), ImUrl::MarkMsg => (http::Method::PUT, "im/chat/msg/mark"), ImUrl::GetMsgPage => (http::Method::GET, "im/chat/msg/page"), - ImUrl::GetMsgList => (http::Method::GET, "im/chat/msg/list"), + ImUrl::GetMsgList => (http::Method::POST, "im/chat/msg/list"), ImUrl::GetMemberStatistic => (http::Method::GET, "im/chat/member/statistic"), // 群成员信息 ImUrl::GetAllUserBaseInfo => (http::Method::GET, "im/room/group/member/list"), ImUrl::CheckEmail => (http::Method::GET, "oauth/anyTenant/checkEmail"), + + ImUrl::MergeMsg => (http::Method::POST, "im/room/mergeMessage"), + ImUrl::GetUserByIds => (http::Method::POST, "im/user/getUserByIds"), } } @@ -461,6 +476,7 @@ impl ImUrl { "handleInvite" => Ok(ImUrl::HandleInvite), "applyUnReadCount" => Ok(ImUrl::ApplyUnReadCount), "requestApplyPage" => Ok(ImUrl::RequestApplyPage), + "requestNoticePage" => Ok(ImUrl::RequestNoticePage), "getContactList" => Ok(ImUrl::GetContactList), "searchFriend" => Ok(ImUrl::SearchFriend), @@ -495,6 +511,8 @@ impl ImUrl { "markMsgRead" => Ok(ImUrl::MarkMsgRead), "groupListMember" => Ok(ImUrl::GroupListMember), "checkEmail" => Ok(ImUrl::CheckEmail), + "mergeMsg" => Ok(ImUrl::MergeMsg), + "getUserByIds" => Ok(ImUrl::GetUserByIds), // 未匹配的字符串 _ => Err(anyhow::anyhow!("未知的URL类型: {}", s)), diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 48a65336..65e64dd9 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -6,21 +6,21 @@ use common::init::CustomInit; #[cfg(target_os = "windows")] use common_cmd::get_windows_scale_info; #[cfg(desktop)] -use common_cmd::{ - audio, default_window_icon, get_files_meta, get_window_payload, push_window_payload, - screenshot, set_height, -}; +use common_cmd::{audio, default_window_icon, get_files_meta, screenshot, set_height}; #[cfg(target_os = "macos")] use common_cmd::{hide_title_bar_buttons, set_window_level_above_menubar, show_title_bar_buttons}; #[cfg(target_os = "macos")] use desktops::app_event; #[cfg(desktop)] +use desktops::window_payload::{get_window_payload, push_window_payload}; +#[cfg(desktop)] use desktops::{common_cmd, directory_scanner, init, tray, video_thumbnail::get_video_thumbnail}; #[cfg(desktop)] use directory_scanner::{cancel_directory_scan, get_directory_usage_info_with_progress}; #[cfg(desktop)] use init::DesktopCustomInit; use std::sync::Arc; +use tauri_plugin_fs::FsExt; pub mod command; pub mod common; pub mod configuration; @@ -37,8 +37,9 @@ use crate::command::request_command::{im_request_command, login_command}; use crate::command::room_member_command::{ cursor_page_room_members, get_room_members, page_room, update_my_room_info, }; +use crate::command::setting_command::{get_settings, update_settings}; use crate::command::user_command::remove_tokens; -use crate::configuration::get_configuration; +use crate::configuration::{Settings, get_configuration}; use crate::error::CommonError; use crate::repository::im_user_repository; use sea_orm::DatabaseConnection; @@ -55,6 +56,7 @@ pub struct AppData { db_conn: Arc, user_info: Arc>, pub rc: Arc>, + pub config: Arc>, } use crate::command::chat_history_command::query_chat_history; @@ -118,6 +120,7 @@ async fn initialize_app_data( Arc, Arc>, Arc>, + Arc>, ), CommonError, > { @@ -125,14 +128,16 @@ async fn initialize_app_data( use tracing::info; // 加载配置 - let configuration = Arc::new( - get_configuration(&app_handle) - .map_err(|e| anyhow::anyhow!("Failed to load configuration: {}", e))?, - ); + let configuration = + Arc::new(Mutex::new(get_configuration(&app_handle).map_err(|e| { + anyhow::anyhow!("Failed to load configuration: {}", e) + })?)); // 初始化数据库连接 let db: Arc = Arc::new( configuration + .lock() + .await .database .connection_string(&app_handle) .await?, @@ -148,8 +153,10 @@ async fn initialize_app_data( } } - let rc: im_request_client::ImRequestClient = - im_request_client::ImRequestClient::new(configuration.backend.base_url.clone()).unwrap(); + let rc: im_request_client::ImRequestClient = im_request_client::ImRequestClient::new( + configuration.lock().await.backend.base_url.clone(), + ) + .unwrap(); // 创建用户信息 let user_info = UserInfo { @@ -159,7 +166,7 @@ async fn initialize_app_data( }; let user_info = Arc::new(Mutex::new(user_info)); - Ok((db, user_info, Arc::new(Mutex::new(rc)))) + Ok((db, user_info, Arc::new(Mutex::new(rc)), configuration)) } // 设置用户信息监听器 @@ -352,6 +359,9 @@ fn setup_mobile() { // 公共的 setup 函数 fn common_setup(app: &mut tauri::App) -> Result<(), Box> { + let scope = app.fs_scope(); + scope.allow_directory("configuration", false).unwrap(); + let app_handle = app.handle().clone(); setup_user_info_listener_early(app.handle().clone()); #[cfg(desktop)] @@ -359,12 +369,13 @@ fn common_setup(app: &mut tauri::App) -> Result<(), Box> // 异步初始化应用数据,避免阻塞主线程 match tauri::async_runtime::block_on(initialize_app_data(app_handle.clone())) { - Ok((db, user_info, rc)) => { + Ok((db, user_info, rc, settings)) => { // 使用 manage 方法在运行时添加状态 app_handle.manage(AppData { db_conn: db.clone(), user_info: user_info.clone(), rc: rc, + config: settings, }); } Err(e) => { @@ -455,5 +466,7 @@ fn get_invoke_handlers() -> impl Fn(tauri::ipc::Invoke) -> bool + Se ws_get_app_background_state, login_command, im_request_command, + get_settings, + update_settings, ] } diff --git a/src-tauri/src/repository/im_message_repository.rs b/src-tauri/src/repository/im_message_repository.rs index a6cbca72..9115ae4b 100644 --- a/src-tauri/src/repository/im_message_repository.rs +++ b/src-tauri/src/repository/im_message_repository.rs @@ -5,7 +5,7 @@ use sea_orm::prelude::Expr; use sea_orm::sea_query::Alias; use sea_orm::{ ColumnTrait, Condition, ConnectionTrait, DatabaseConnection, DatabaseTransaction, EntityTrait, - IntoActiveModel, PaginatorTrait, QueryFilter, QueryOrder, QuerySelect, Set, + IntoActiveModel, PaginatorTrait, QueryFilter, QueryOrder, QuerySelect, Set, TryIntoModel, }; use tracing::{debug, error, info}; @@ -237,19 +237,45 @@ pub async fn save_message( /// 更新消息发送状态 pub async fn update_message_status( db: &DatabaseConnection, - message_id: &str, + message: im_message::Model, status: &str, id: Option, login_uid: String, -) -> Result<(), CommonError> { +) -> Result { let mut active_model: im_message::ActiveModel = - im_message::Entity::find_by_id((message_id.to_string(), login_uid)) + im_message::Entity::find_by_id((message.id.clone(), login_uid)) .one(db) .await .map_err(|e| anyhow::anyhow!("Failed to find message: {}", e))? .ok_or_else(|| CommonError::UnexpectedError(anyhow::anyhow!("Message not found")))? .into_active_model(); + // 设置 time_block + if message.id.starts_with('T') { + info!("check msg sendTime"); + // 查找该房间的最后一条消息 + let last_message = im_message::Entity::find() + .filter(im_message::Column::RoomId.eq(&message.room_id)) + .filter(im_message::Column::LoginUid.eq(message.login_uid.clone())) + .filter(im_message::Column::Id.ne(&message.id)) + .order_by_desc(im_message::Column::Id) + .limit(1) + .one(db) + .await + .map_err(|e| anyhow::anyhow!("Failed to find last message: {}", e))?; + + if let Some(last_message) = last_message { + // 比较时间戳 + if let (Some(last_send_time), Some(send_time)) = + (last_message.send_time, message.send_time) + { + if send_time - last_send_time >= 1000 * 60 * 15 { + active_model.time_block = Set(Some(send_time - last_send_time)); + } + } + } + } + active_model.send_status = Set(status.to_string()); if status == "success" { @@ -263,11 +289,11 @@ pub async fn update_message_status( } im_message::Entity::update_many() - .set(active_model) - .filter(im_message::Column::Id.eq(message_id)) + .set(active_model.clone()) + .filter(im_message::Column::Id.eq(message.id)) .exec(db) .await?; - Ok(()) + Ok(active_model.try_into_model()?) } /// 更新消息撤回状态 diff --git a/src-tauri/src/websocket/commands.rs b/src-tauri/src/websocket/commands.rs index f87d8436..e718c7f2 100644 --- a/src-tauri/src/websocket/commands.rs +++ b/src-tauri/src/websocket/commands.rs @@ -22,8 +22,6 @@ fn get_websocket_client_container() -> &'static Arc, pub client_id: String, } @@ -72,7 +70,7 @@ pub async fn ws_init_connection( let rc = state.rc.lock().await; let config = WebSocketConfig { - server_url: params.server_url, + server_url: state.config.lock().await.backend.ws_url.clone(), client_id: params.client_id, token: rc.token.clone(), ..Default::default() diff --git a/src/components/common/FloatBlockList.vue b/src/components/common/FloatBlockList.vue index 9c96a18d..9d2bb08a 100644 --- a/src/components/common/FloatBlockList.vue +++ b/src/components/common/FloatBlockList.vue @@ -105,7 +105,7 @@ const handleItemMouseEnter = (index: number) => { // 获取当前悬停项的DOM元素 const item = - document.activeElement?.closest('.float-block') || (event?.target as HTMLElement)?.closest('.float-block') + (event?.target as HTMLElement)?.closest('.float-block') || document.activeElement?.closest('.float-block') if (item) { // 获取元素相对于列表容器的位置 diff --git a/src/components/rightBox/ApplyList.vue b/src/components/rightBox/ApplyList.vue index 73682676..d841dd9e 100644 --- a/src/components/rightBox/ApplyList.vue +++ b/src/components/rightBox/ApplyList.vue @@ -2,7 +2,9 @@

{{ props.type === 'friend' ? '好友通知' : '群通知' }}

- + + +

- {{ groupStore.getUserInfo(isCurrentUser(item.uid) ? item.targetId : item.uid)!.name }} + {{ groupStore.getUserInfo(isCurrentUser(item.senderId) ? item.operateId : item.senderId)!.name }}

@@ -38,39 +46,53 @@

{{ formatTimestamp(item.createTime) }}

-

留言:{{ item.msg }}

+

+ 留言:{{ item.content }} +

- - 接受 - - - - - - - - {{ - isAccepted(item.targetId) - ? '已同意' - : item.status === RequestFriendAgreeStatus.Reject - ? '对方已拒绝' - : '等待验证' - }} - - 已同意 - 已拒绝 - 已忽略 +
+ + + 接受 + + + + + + + + + + + 已同意 + + + 已拒绝 + + + 已忽略 + + + {{ + isAccepted(item) + ? '已同意' + : item.status === RequestNoticeAgreeStatus.REJECTED + ? '对方已拒绝' + : '等待验证' + }} + +
@@ -78,12 +100,12 @@ - + + diff --git a/src/components/rightBox/chatBox/ChatMultiMsg.vue b/src/components/rightBox/chatBox/ChatMultiMsg.vue new file mode 100644 index 00000000..022490be --- /dev/null +++ b/src/components/rightBox/chatBox/ChatMultiMsg.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/src/components/rightBox/chatBox/ChatSidebar.vue b/src/components/rightBox/chatBox/ChatSidebar.vue index 729805bb..6f9a4c85 100644 --- a/src/components/rightBox/chatBox/ChatSidebar.vue +++ b/src/components/rightBox/chatBox/ChatSidebar.vue @@ -254,6 +254,10 @@ const filteredUserList = computed(() => { }) } return userList.sort((a, b) => { + if (a.roleId && b.roleId && a.roleId !== b.roleId) { + return a.roleId - b.roleId + } + if (a.activeStatus !== b.activeStatus) { return a.activeStatus - b.activeStatus } diff --git a/src/components/rightBox/chatBox/index.vue b/src/components/rightBox/chatBox/index.vue index e41039bc..300c265e 100644 --- a/src/components/rightBox/chatBox/index.vue +++ b/src/components/rightBox/chatBox/index.vue @@ -2,13 +2,14 @@ -
+
-
+
+ - +
@@ -22,12 +23,4 @@ const settingStore = useSettingStore() const { page } = storeToRefs(settingStore) const globalStore = useGlobalStore() - + diff --git a/src/components/rightBox/renderMessage/Image.vue b/src/components/rightBox/renderMessage/Image.vue index a4f3ef6f..907ddf3a 100644 --- a/src/components/rightBox/renderMessage/Image.vue +++ b/src/components/rightBox/renderMessage/Image.vue @@ -40,13 +40,14 @@ import { MsgEnum } from '@/enums/index' import { useImageViewer } from '@/hooks/useImageViewer' import type { ImageBody } from '@/services/types' +import { isMobile } from '@/utils/PlatformConstants' const props = defineProps<{ body: ImageBody onImageClick?: (url: string) => void }>() // 图片显示相关常量 -const MAX_WIDTH = 320 +const MAX_WIDTH = isMobile() ? 240 : 320 const MAX_HEIGHT = 240 const MIN_WIDTH = 60 const MIN_HEIGHT = 60 diff --git a/src/components/rightBox/renderMessage/MergeMessage.vue b/src/components/rightBox/renderMessage/MergeMessage.vue new file mode 100644 index 00000000..9e039399 --- /dev/null +++ b/src/components/rightBox/renderMessage/MergeMessage.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/components/rightBox/renderMessage/Text.vue b/src/components/rightBox/renderMessage/Text.vue index 0eab937b..6cea1ff5 100644 --- a/src/components/rightBox/renderMessage/Text.vue +++ b/src/components/rightBox/renderMessage/Text.vue @@ -9,26 +9,30 @@ {{ item }}
+ class="text-(12px #909090) h-12px flex select-none" + :class="{ + 'pr-48px justify-end': isMe, + 'pl-42px justify-start': !isMe + }"> {{ formatTimestamp(message.message.sendTime, true) }}
-
- - - - - - - - - - +
+ +
+ + + + + + + + + + - - - - - - - - - {{ useBadgeInfo(groupStore.getUserInfo(fromUser.uid)?.wearingItemId).value.describe }} + + + + + + + + + {{ useBadgeInfo(groupStore.getUserInfo(fromUser.uid)?.wearingItemId).value.describe }} + + + + + {{ groupStore.getUserDisplayName(fromUser.uid) }} - - - - {{ groupStore.getUserDisplayName(fromUser.uid) }} - - - - ({{ groupStore.getUserInfo(fromUser.uid)?.locPlace }}) + + + ({{ groupStore.getUserInfo(fromUser.uid)?.locPlace }}) + + + + +
+ 群主 +
+ +
+ 管理员 +
+ + + + {{ formatTimestamp(message.message.sendTime, true) }} -
- - -
- 群主 -
- -
- 管理员 -
- - - - {{ formatTimestamp(message.message.sendTime, true) }} - - -
- - - + + + + + - - -
- - - {{ message.message.body.translatedText.provider }} - - + + +
+ + + {{ message.message.body.translatedText.provider }} + + + + + + - - +

{{ message.message.body.translatedText.text }}

+
+ + + +
+ + + + + + - -

{{ message.message.body.translatedText.text }}

+
- + - -
- - - - - - - - -
- + + + + + + + {{ `${message.message.body.reply.username}: ` }} + + {{ message.message.body.reply.body }} + +
+ {{ message.message.body.reply.imgCount }} +
+
- - - - - - - {{ `${message.message.body.reply.username}: ` }} - - {{ message.message.body.reply.body }} - -
- {{ message.message.body.reply.imgCount }} + +
+
- - -
- -
- +
@@ -272,6 +274,7 @@ import { useGroupStore } from '@/stores/group' import { useSettingStore } from '@/stores/setting' import { AvatarUtils } from '@/utils/AvatarUtils' import { formatTimestamp } from '@/utils/ComputedTime.ts' +import { useChatStore } from '~/src/stores/chat' import { useUserStore } from '~/src/stores/user' import { markMsg } from '~/src/utils/ImRequestUtils' import { isMac } from '~/src/utils/PlatformConstants' @@ -280,6 +283,7 @@ import AudioCall from './AudioCall.vue' import Emoji from './Emoji.vue' import File from './File.vue' import Image from './Image.vue' +import MergeMessage from './MergeMessage.vue' import BotMessage from './special/BotMessage.vue' import RecallMessage from './special/RecallMessage.vue' import SystemMessage from './special/SystemMessage.vue' @@ -320,6 +324,7 @@ const settingStore = useSettingStore() const { themes } = storeToRefs(settingStore) const { optionsList, report, activeBubble, handleItemType, emojiList, specialMenuList, handleMsgClick } = useChatMain() const groupStore = useGroupStore() +const chatStore = useChatStore() const recordEL = ref() // 获取用户头像 @@ -340,7 +345,8 @@ const componentMap: Partial> = { [MsgEnum.AUDIO_CALL]: AudioCall, [MsgEnum.SYSTEM]: SystemMessage, [MsgEnum.RECALL]: RecallMessage, - [MsgEnum.BOT]: BotMessage + [MsgEnum.BOT]: BotMessage, + [MsgEnum.MERGE]: MergeMessage } const isSpecialMsgType = (type: number): boolean => { diff --git a/src/components/rightBox/renderMessage/special/BotMessage.vue b/src/components/rightBox/renderMessage/special/BotMessage.vue index 27f4894b..acdbf795 100644 --- a/src/components/rightBox/renderMessage/special/BotMessage.vue +++ b/src/components/rightBox/renderMessage/special/BotMessage.vue @@ -1,18 +1,22 @@ + + diff --git a/src/mobile/components/my/PersonalInfo.vue b/src/mobile/components/my/PersonalInfo.vue index 2d4bb2b0..f8bf2387 100644 --- a/src/mobile/components/my/PersonalInfo.vue +++ b/src/mobile/components/my/PersonalInfo.vue @@ -7,56 +7,30 @@
- +
- {{ userStore.userInfo!.name }} -
- - 在线 + {{ userDetailInfo!.name }} +
+ + + + + {{ friendUserState.title ? friendUserState.title : currentState.title }} +
- - - - - -
- 账号:{{ userStore.userInfo!.account }} + 账号:{{ userDetailInfo!.account }} @@ -68,14 +42,14 @@ style="transform: translateZ(0)" class="relative w-118px overflow-hidden"> -
+
- - 还没获取任何勋章 +
+ 还没勋章哦~ @@ -99,41 +73,49 @@
920.13W
-
粉丝
+
粉丝
120
-
关注
+
关注
43.15W
-
点赞
+
点赞
-
编辑资料 -
-
+ - - 删除好友 -
-
+ + + 添加好友 -
-
+ 私聊 -
+
@@ -141,53 +123,133 @@ diff --git a/src/mobile/views/chat-room/MobileChatMain.vue b/src/mobile/views/chat-room/MobileChatMain.vue index 18d09d3e..e17c92bc 100644 --- a/src/mobile/views/chat-room/MobileChatMain.vue +++ b/src/mobile/views/chat-room/MobileChatMain.vue @@ -1,7 +1,12 @@