diff --git a/.gitignore b/.gitignore index 848638a96..9fc0edc7f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ pnpm-debug auto-*.d.ts .idea .history +output/ diff --git a/.image/common/im-feature.png b/.image/common/im-feature.png new file mode 100644 index 000000000..da3f01280 Binary files /dev/null and b/.image/common/im-feature.png differ diff --git a/.image/common/im-preview-home.png b/.image/common/im-preview-home.png new file mode 100644 index 000000000..c4790a324 Binary files /dev/null and b/.image/common/im-preview-home.png differ diff --git a/.image/common/im-preview-manager.png b/.image/common/im-preview-manager.png new file mode 100644 index 000000000..b8bb057dc Binary files /dev/null and b/.image/common/im-preview-manager.png differ diff --git a/.vscode/settings.json b/.vscode/settings.json index 74ab52a74..6856b5d10 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,7 @@ { - "typescript.tsdk": "node_modules/typescript/lib", + "typescript.tsdk": "./node_modules/typescript/lib", + "volar.tsPlugin": true, + "volar.tsPluginStatus": false, "npm.packageManager": "pnpm", "editor.tabSize": 2, "prettier.printWidth": 100, // 超过最大值换行 @@ -83,54 +85,75 @@ "editor.defaultFormatter": "esbenp.prettier-vscode" }, "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit", - "source.fixAll.stylelint": "explicit" + "source.fixAll.eslint": "explicit" }, "editor.formatOnSave": true, "[vue]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.fixAll.stylelint": "explicit" + } }, "i18n-ally.localesPaths": ["src/locales"], "i18n-ally.keystyle": "nested", "i18n-ally.sortKeys": true, - "i18n-ally.namespace": false, + "i18n-ally.namespace": true, "i18n-ally.enabledParsers": ["ts"], "i18n-ally.sourceLanguage": "en", "i18n-ally.displayLanguage": "zh-CN", "i18n-ally.enabledFrameworks": ["vue", "react"], "cSpell.words": [ - "brotli", - "browserslist", - "codemirror", - "commitlint", - "cropperjs", - "echart", - "echarts", - "esnext", - "esno", - "iconify", - "INTLIFY", - "lintstagedrc", - "logicflow", - "nprogress", - "pinia", - "pnpm", - "qrcode", - "sider", - "sortablejs", - "stylelint", - "svgs", - "unocss", - "unplugin", - "unref", - "videojs", - "VITE", - "vitejs", - "vueuse", - "wangeditor", "xingyu", "yudao", - "zxcvbn" + "unocss", + "browserslist", + "esnext", + "unplugin", + "qrcode", + "sider", + "pinia", + "sider", + "nprogress", + "INTLIFY", + "stylelint", + "esno", + "vitejs", + "sortablejs", + "codemirror", + "iconify", + "commitlint", + "videojs", + "echarts", + "wangeditor", + "cropperjs", + "logicflow", + "vueuse", + "zxcvbn", + "lintstagedrc", + "brotli", + "sider", + "pnpm" + ], + "vetur.format.scriptInitialIndent": true, + "vetur.format.styleInitialIndent": true, + "vetur.validation.script": false, + "MicroPython.executeButton": [ + { + "text": "▶", + "tooltip": "运行", + "alignment": "left", + "command": "extension.executeFile", + "priority": 3.5 + } + ], + "MicroPython.syncButton": [ + { + "text": "$(sync)", + "tooltip": "同步", + "alignment": "left", + "command": "extension.execute", + "priority": 4 + } ], // 控制相关文件嵌套展示 "explorer.fileNesting.enabled": true, @@ -139,8 +162,7 @@ "*.ts": "$(capture).test.ts, $(capture).test.tsx", "*.tsx": "$(capture).test.ts, $(capture).test.tsx", "*.env": "$(capture).env.*", - "package.json": "pnpm-lock.yaml,yarn.lock,LICENSE,README*,CHANGELOG*,CNAME,.gitattributes,.eslintrc-auto-import.json,.gitignore,prettier.config.js,stylelint.config.js,commitlint.config.js,.stylelintignore,.prettierignore,.gitpod.yml,.eslintrc.js,.eslintignore" + "package.json": "pnpm-lock.yaml,yarn.lock,LICENSE,README*,CHANGELOG*,CNAME,.gitattributes,.gitignore,prettier.config.js,stylelint.config.js,commitlint.config.js,.stylelintignore,.prettierignore,.gitpod.yml,.eslintrc.js,.eslintignore" }, - "terminal.integrated.scrollback": 10000, - "nuxt.isNuxtApp": false + "terminal.integrated.scrollback": 10000 } diff --git a/README.md b/README.md index 17ee0859c..86a42a197 100644 --- a/README.md +++ b/README.md @@ -284,6 +284,19 @@ ![预览图](/.image/common/iot-preview.png) +### IM 即时通讯 + +演示地址(Vue3 + Element Plus): + +使用文档: + + +![功能图](/.image/common/im-feature.png) + +| 聊天界面 | 聊天管理 | +| --- | --- | +| ![聊天界面](/.image/common/im-preview-home.png) | ![聊天管理](/.image/common/im-preview-manager.png) | + ## 🐷 演示图 ### 系统功能 diff --git a/package.json b/package.json index a2a85562c..c78fc4456 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yudao-ui-admin-vue3", - "version": "2026.04-snapshot", + "version": "2026.05-snapshot", "description": "基于vue3、vite4、element-plus、typesScript", "author": "xingyu", "private": false, @@ -56,6 +56,7 @@ "jsbarcode": "^3.12.3", "jsencrypt": "^3.5.4", "jsoneditor": "^10.4.3", + "livekit-client": "^2.18.9", "lodash-es": "^4.18.1", "markdown-it": "^14.1.1", "markmap-common": "^0.18.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d587f5aee..14012d4fc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -101,6 +101,9 @@ importers: jsoneditor: specifier: ^10.4.3 version: 10.4.3 + livekit-client: + specifier: ^2.18.9 + version: 2.19.1(@types/dom-mediacapture-record@1.0.22) lodash-es: specifier: ^4.18.1 version: 4.18.1 @@ -883,7 +886,7 @@ packages: engines: {node: '>=6.9.0'} '@bpmn-io/cm-theme@0.1.0-alpha.2': - resolution: {integrity: sha512-ZILgiYzxk3KMvxplUXmdRFQo45/JehDPg5k9tWfehmzUOSE13ssyLPil8uCloMQnb3yyzyOWTjb/wzKXTHlFQw==} + resolution: {integrity: sha512-ZILgiYzxk3KMvxplUXmdRFQo45/JehDPg5k9tWfehmzUOSE13ssyLPil8uCloMQnb3yyzyOWTjb/wzKXTHlFQw==, tarball: https://registry.npmmirror.com/@bpmn-io/cm-theme/-/cm-theme-0.1.0-alpha.2.tgz} '@bpmn-io/diagram-js-ui@0.2.3': resolution: {integrity: sha512-OGyjZKvGK8tHSZ0l7RfeKhilGoOGtFDcoqSGYkX0uhFlo99OVZ9Jn1K7TJGzcE9BdKwvA5Y5kGqHEhdTxHvFfw==} @@ -892,31 +895,34 @@ packages: resolution: {integrity: sha512-1E5ydNzTqgx513NxA1nxk2CqDb9OkusfU9Tf6WejD1BiY+5u130XnZOFE/FQX0JB6ZmPOeFMx4IDEuHjrGhOzw==} '@bpmn-io/feel-editor@1.12.1': - resolution: {integrity: sha512-XEsbglURtQsphlvGQll3aiGYsM8Qc22y7fDGmxUqSYv3AVzORBzYdFhFFwfYMfKfzln/qwa3Wlrl0amvELRJ2A==} + resolution: {integrity: sha512-XEsbglURtQsphlvGQll3aiGYsM8Qc22y7fDGmxUqSYv3AVzORBzYdFhFFwfYMfKfzln/qwa3Wlrl0amvELRJ2A==, tarball: https://registry.npmmirror.com/@bpmn-io/feel-editor/-/feel-editor-1.12.1.tgz} engines: {node: '>= 16'} '@bpmn-io/feel-lint@2.1.0': - resolution: {integrity: sha512-fUGye6KppyowiwUqlfRHpMtXQ8so8jv1rh2LEQp+fhKf+WeLkbokmQwXZbCQe/4Kam/OLQRlx+p3Qnu0IrZQ6A==} + resolution: {integrity: sha512-fUGye6KppyowiwUqlfRHpMtXQ8so8jv1rh2LEQp+fhKf+WeLkbokmQwXZbCQe/4Kam/OLQRlx+p3Qnu0IrZQ6A==, tarball: https://registry.npmmirror.com/@bpmn-io/feel-lint/-/feel-lint-2.1.0.tgz} '@bpmn-io/feel-lint@3.1.0': - resolution: {integrity: sha512-nOCYWMXgwR0joU4XKhu4f3P5f4/AsmuyiV1e+fzcXTCh7iMLU8VYdHXSIzZuJ0zxz3Gsnp7A8S8lt+HJ43H6IA==} + resolution: {integrity: sha512-nOCYWMXgwR0joU4XKhu4f3P5f4/AsmuyiV1e+fzcXTCh7iMLU8VYdHXSIzZuJ0zxz3Gsnp7A8S8lt+HJ43H6IA==, tarball: https://registry.npmmirror.com/@bpmn-io/feel-lint/-/feel-lint-3.1.0.tgz} '@bpmn-io/feelin@6.1.0': - resolution: {integrity: sha512-nqmmlHRD9tl0ZcpYTEkZdpc/rAMoYc+ct0SOg9fFIFWRaEApme3DuXC7v9AMA5g+upGCKd6cUc3t97y+unpfMw==} + resolution: {integrity: sha512-nqmmlHRD9tl0ZcpYTEkZdpc/rAMoYc+ct0SOg9fFIFWRaEApme3DuXC7v9AMA5g+upGCKd6cUc3t97y+unpfMw==, tarball: https://registry.npmmirror.com/@bpmn-io/feelin/-/feelin-6.1.0.tgz} engines: {node: '>= 20.12.0'} '@bpmn-io/lang-feel@2.4.0': - resolution: {integrity: sha512-0c1pratAD/YTOaivwLd7MljT0/MoDUMpfm87JbtAOBvivRfEr8mel5l8Ig3kgpYJ+xkznLaA9s79ZDKLh/O8ag==} + resolution: {integrity: sha512-0c1pratAD/YTOaivwLd7MljT0/MoDUMpfm87JbtAOBvivRfEr8mel5l8Ig3kgpYJ+xkznLaA9s79ZDKLh/O8ag==, tarball: https://registry.npmmirror.com/@bpmn-io/lang-feel/-/lang-feel-2.4.0.tgz} '@bpmn-io/lezer-feel@1.9.0': - resolution: {integrity: sha512-mV+pj+x0++9zT5/RkOOUNtkT2hpKpGWbXuFR8trJlvJeRe1dL/5yPal/RBcnk3z73tILK4kP6LzXelcsshQCEw==} + resolution: {integrity: sha512-mV+pj+x0++9zT5/RkOOUNtkT2hpKpGWbXuFR8trJlvJeRe1dL/5yPal/RBcnk3z73tILK4kP6LzXelcsshQCEw==, tarball: https://registry.npmmirror.com/@bpmn-io/lezer-feel/-/lezer-feel-1.9.0.tgz} '@bpmn-io/lezer-feel@2.4.0': - resolution: {integrity: sha512-V6L6p7GZSQnpNld1RKlk9A2GYmKoK3f1Qnzcay58ei/OGYDUHCl+267ldhe9LRmlFUr5emp5MSvjG2ekkXdwtQ==} + resolution: {integrity: sha512-V6L6p7GZSQnpNld1RKlk9A2GYmKoK3f1Qnzcay58ei/OGYDUHCl+267ldhe9LRmlFUr5emp5MSvjG2ekkXdwtQ==, tarball: https://registry.npmmirror.com/@bpmn-io/lezer-feel/-/lezer-feel-2.4.0.tgz} engines: {node: '>= 20.12.0'} '@bpmn-io/properties-panel@3.25.0': - resolution: {integrity: sha512-SRGgj8uJc1Yyjcht2g36Q+xKR7sTx5VZXvcwDrdmQKlx5Y3nRmvmMjDGzeGDJDb7pNU1DSlaBJic84uISDBMWg==} + resolution: {integrity: sha512-SRGgj8uJc1Yyjcht2g36Q+xKR7sTx5VZXvcwDrdmQKlx5Y3nRmvmMjDGzeGDJDb7pNU1DSlaBJic84uISDBMWg==, tarball: https://registry.npmmirror.com/@bpmn-io/properties-panel/-/properties-panel-3.25.0.tgz} + + '@bufbuild/protobuf@1.10.1': + resolution: {integrity: sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==, tarball: https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-1.10.1.tgz} '@cacheable/memory@2.0.8': resolution: {integrity: sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==} @@ -925,25 +931,25 @@ packages: resolution: {integrity: sha512-eiFgzCbIneyMlLOmNG4g9xzF7Hv3Mga4LjxjcSC/ues6VYq2+gUbQI8JqNuw/ZM8tJIeIaBGpswAsqV2V7ApgA==} '@camunda/feel-builtins@0.2.0': - resolution: {integrity: sha512-Jusm8x3Onqze9E5Y0lGGdPj66bnFKLYNwDz+uG4otsEXgSL0FpF+koGHK48LkF9Jqo67KaP1y3zr2y/HIWRePw==} + resolution: {integrity: sha512-Jusm8x3Onqze9E5Y0lGGdPj66bnFKLYNwDz+uG4otsEXgSL0FpF+koGHK48LkF9Jqo67KaP1y3zr2y/HIWRePw==, tarball: https://registry.npmmirror.com/@camunda/feel-builtins/-/feel-builtins-0.2.0.tgz} '@codemirror/autocomplete@6.20.1': - resolution: {integrity: sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==} + resolution: {integrity: sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==, tarball: https://registry.npmmirror.com/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz} '@codemirror/commands@6.10.3': - resolution: {integrity: sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==} + resolution: {integrity: sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==, tarball: https://registry.npmmirror.com/@codemirror/commands/-/commands-6.10.3.tgz} '@codemirror/language@6.12.3': - resolution: {integrity: sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==} + resolution: {integrity: sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==, tarball: https://registry.npmmirror.com/@codemirror/language/-/language-6.12.3.tgz} '@codemirror/lint@6.9.5': - resolution: {integrity: sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==} + resolution: {integrity: sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==, tarball: https://registry.npmmirror.com/@codemirror/lint/-/lint-6.9.5.tgz} '@codemirror/state@6.6.0': - resolution: {integrity: sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==} + resolution: {integrity: sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==, tarball: https://registry.npmmirror.com/@codemirror/state/-/state-6.6.0.tgz} '@codemirror/view@6.41.1': - resolution: {integrity: sha512-ToDnWKbBnke+ZLrP6vgTTDScGi5H37YYuZGniQaBzxMVdtCxMrslsmtnOvbPZk4RX9bvkQqnWR/WS/35tJA0qg==} + resolution: {integrity: sha512-ToDnWKbBnke+ZLrP6vgTTDScGi5H37YYuZGniQaBzxMVdtCxMrslsmtnOvbPZk4RX9bvkQqnWR/WS/35tJA0qg==, tarball: https://registry.npmmirror.com/@codemirror/view/-/view-6.41.1.tgz} '@commitlint/cli@20.5.3': resolution: {integrity: sha512-OJdL0EXWD5y9LPa0nr/geOwzaS8BsdaybKkcloB0JgsguGxNv2R+hC2FTPqrAcprg35zF33KOQerY0x8W1aesA==} @@ -1113,322 +1119,322 @@ packages: vue: ^3.2.0 '@emnapi/core@1.10.0': - resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==, tarball: https://registry.npmmirror.com/@emnapi/core/-/core-1.10.0.tgz} '@emnapi/runtime@1.10.0': - resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==, tarball: https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.10.0.tgz} '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==, tarball: https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz} '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==, tarball: https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz} engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/aix-ppc64@0.27.3': - resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==, tarball: https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz} engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz} engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm64@0.27.3': - resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz} engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-arm@0.27.3': - resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==, tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz} engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/android-x64@0.27.3': - resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==, tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==, tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz} engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-arm64@0.27.3': - resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==, tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==, tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz} engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/darwin-x64@0.27.3': - resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==, tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-arm64@0.27.3': - resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz} engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/freebsd-x64@0.27.3': - resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz} engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm64@0.27.3': - resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz} engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-arm@0.27.3': - resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==, tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz} engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-ia32@0.27.3': - resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==, tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz} engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz} engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-loong64@0.27.3': - resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz} engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==, tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz} engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-mips64el@0.27.3': - resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==, tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz} engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==, tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz} engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-ppc64@0.27.3': - resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==, tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz} engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==, tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz} engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-riscv64@0.27.3': - resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==, tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz} engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==, tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz} engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-s390x@0.27.3': - resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==, tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz} engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==, tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz} engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/linux-x64@0.27.3': - resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==, tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==, tarball: https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] '@esbuild/netbsd-arm64@0.27.3': - resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==, tarball: https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==, tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz} engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/netbsd-x64@0.27.3': - resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==, tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==, tarball: https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-arm64@0.27.3': - resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==, tarball: https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==, tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz} engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/openbsd-x64@0.27.3': - resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==, tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==, tarball: https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] '@esbuild/openharmony-arm64@0.27.3': - resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==, tarball: https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==, tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz} engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/sunos-x64@0.27.3': - resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==, tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==, tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz} engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-arm64@0.27.3': - resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==, tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz} engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==, tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz} engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-ia32@0.27.3': - resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==, tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz} engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==, tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz} engines: {node: '>=18'} cpu: [x64] os: [win32] '@esbuild/win32-x64@0.27.3': - resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==, tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1670,31 +1676,37 @@ packages: resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} '@lezer/common@1.5.2': - resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==} + resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==, tarball: https://registry.npmmirror.com/@lezer/common/-/common-1.5.2.tgz} '@lezer/highlight@1.2.3': - resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} + resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==, tarball: https://registry.npmmirror.com/@lezer/highlight/-/highlight-1.2.3.tgz} '@lezer/lr@1.4.10': - resolution: {integrity: sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==} + resolution: {integrity: sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==, tarball: https://registry.npmmirror.com/@lezer/lr/-/lr-1.4.10.tgz} '@lezer/markdown@1.6.3': - resolution: {integrity: sha512-jpGm5Ps+XErS+xA4urw7ogEGkeZOahVQF21Z6oECF0sj+2liwZopd2+I8uH5I/vZsRuuze3OxBREIANLf6KKUw==} + resolution: {integrity: sha512-jpGm5Ps+XErS+xA4urw7ogEGkeZOahVQF21Z6oECF0sj+2liwZopd2+I8uH5I/vZsRuuze3OxBREIANLf6KKUw==, tarball: https://registry.npmmirror.com/@lezer/markdown/-/markdown-1.6.3.tgz} + + '@livekit/mutex@1.1.1': + resolution: {integrity: sha512-EsshAucklmpuUAfkABPxJNhzj9v2sG7JuzFDL4ML1oJQSV14sqrpTYnsaOudMAw9yOaW53NU3QQTlUQoRs4czw==, tarball: https://registry.npmmirror.com/@livekit/mutex/-/mutex-1.1.1.tgz} + + '@livekit/protocol@1.45.8': + resolution: {integrity: sha512-Q+l57E7w/xxOBFVWzdX5rkAZO7ffyF+rlDzNUYq2SU114+5aTyCq+PK4unaEVDNd4952Af7wteKr3sOgasGuaA==, tarball: https://registry.npmmirror.com/@livekit/protocol/-/protocol-1.45.8.tgz} '@marijn/find-cluster-break@1.0.2': - resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==, tarball: https://registry.npmmirror.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz} '@microsoft/fetch-event-source@2.0.1': resolution: {integrity: sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==} '@napi-rs/wasm-runtime@1.1.3': - resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} + resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==, tarball: https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 '@napi-rs/wasm-runtime@1.1.4': - resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==, tarball: https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -1722,128 +1734,128 @@ packages: resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} '@oxc-parser/binding-android-arm-eabi@0.124.0': - resolution: {integrity: sha512-+R9zCafSL8ovjokdPtorUp3sXrh8zQ2AC2L0ivXNvlLR0WS+5WdPkNVrnENq5UvzagM4Xgl0NPsJKz3Hv9+y8g==} + resolution: {integrity: sha512-+R9zCafSL8ovjokdPtorUp3sXrh8zQ2AC2L0ivXNvlLR0WS+5WdPkNVrnENq5UvzagM4Xgl0NPsJKz3Hv9+y8g==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] '@oxc-parser/binding-android-arm64@0.124.0': - resolution: {integrity: sha512-ULHC/gVZ+nP4pd3kNNQTYaQ/e066BW/KuY5qUsvwkVWwOUQGDg+WpfyVOmQ4xfxoue6cMlkKkJ+ntdzfDXpNlg==} + resolution: {integrity: sha512-ULHC/gVZ+nP4pd3kNNQTYaQ/e066BW/KuY5qUsvwkVWwOUQGDg+WpfyVOmQ4xfxoue6cMlkKkJ+ntdzfDXpNlg==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] '@oxc-parser/binding-darwin-arm64@0.124.0': - resolution: {integrity: sha512-fGJ2hw7bnbUYn6UvTjp0m4WJ9zXz3cohgcwcgeo7gUZehpPNpvcVEVeIVHNmHnAuAw/ysf4YJR8DA1E+xCA4Lw==} + resolution: {integrity: sha512-fGJ2hw7bnbUYn6UvTjp0m4WJ9zXz3cohgcwcgeo7gUZehpPNpvcVEVeIVHNmHnAuAw/ysf4YJR8DA1E+xCA4Lw==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] '@oxc-parser/binding-darwin-x64@0.124.0': - resolution: {integrity: sha512-j0+re9pgps5BH2Tk3fm59Hi3QuLP3C4KhqXi6A+wRHHHJWDFR8mc/KI9mBrfk2JRT+15doGo+zv1eN75/9DuOw==} + resolution: {integrity: sha512-j0+re9pgps5BH2Tk3fm59Hi3QuLP3C4KhqXi6A+wRHHHJWDFR8mc/KI9mBrfk2JRT+15doGo+zv1eN75/9DuOw==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] '@oxc-parser/binding-freebsd-x64@0.124.0': - resolution: {integrity: sha512-0k5mS0npnrhKy72UfF51lpOZ2ESoPWn6gdFw+RdeRWcokraDW1O2kSx3laQ+yk7cCEavQdJSpWCYS/GvBbUCXQ==} + resolution: {integrity: sha512-0k5mS0npnrhKy72UfF51lpOZ2ESoPWn6gdFw+RdeRWcokraDW1O2kSx3laQ+yk7cCEavQdJSpWCYS/GvBbUCXQ==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] '@oxc-parser/binding-linux-arm-gnueabihf@0.124.0': - resolution: {integrity: sha512-P/i4eguRWvAUfGdfhQYg1jpwYkyUV6D3gefIH7HhmRl1Ph6P4IqTIEVcyJr1i/3vr1V5OHU4wonH6/ue/Qzvrw==} + resolution: {integrity: sha512-P/i4eguRWvAUfGdfhQYg1jpwYkyUV6D3gefIH7HhmRl1Ph6P4IqTIEVcyJr1i/3vr1V5OHU4wonH6/ue/Qzvrw==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] '@oxc-parser/binding-linux-arm-musleabihf@0.124.0': - resolution: {integrity: sha512-/ameqFQH5fFP+66Atr8Ynv/2rYe4utcU7L4MoWS5JtrFLVO78g4qDLavyIlJxa6caSwYOvG/eO3c/DXqY5/6Rw==} + resolution: {integrity: sha512-/ameqFQH5fFP+66Atr8Ynv/2rYe4utcU7L4MoWS5JtrFLVO78g4qDLavyIlJxa6caSwYOvG/eO3c/DXqY5/6Rw==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] '@oxc-parser/binding-linux-arm64-gnu@0.124.0': - resolution: {integrity: sha512-gNeyEcXTtfrRCbj2EfxWU85Fs0wIX3p44Y3twnvuMfkWlLrb9M1Z25AYNSKjJM+fdAjeeQCjw0on47zFuBYwQw==} + resolution: {integrity: sha512-gNeyEcXTtfrRCbj2EfxWU85Fs0wIX3p44Y3twnvuMfkWlLrb9M1Z25AYNSKjJM+fdAjeeQCjw0on47zFuBYwQw==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.124.0': - resolution: {integrity: sha512-uvG7v4Tz9S8/PVqY0SP0DLHxo4hZGe+Pv2tGVnwcsjKCCUPjplbrFVvDzXq+kOaEoUkiCY0Kt1hlZ6FDJ1LKNQ==} + resolution: {integrity: sha512-uvG7v4Tz9S8/PVqY0SP0DLHxo4hZGe+Pv2tGVnwcsjKCCUPjplbrFVvDzXq+kOaEoUkiCY0Kt1hlZ6FDJ1LKNQ==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] '@oxc-parser/binding-linux-ppc64-gnu@0.124.0': - resolution: {integrity: sha512-t7KZaaUhfp2au0MRpoENEFqwLKYDdptEry6V7pTAVdPEcFG4P6ii8yeGU9m6p5vb+b8WEKmdpGMNXBEYy7iJdw==} + resolution: {integrity: sha512-t7KZaaUhfp2au0MRpoENEFqwLKYDdptEry6V7pTAVdPEcFG4P6ii8yeGU9m6p5vb+b8WEKmdpGMNXBEYy7iJdw==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] '@oxc-parser/binding-linux-riscv64-gnu@0.124.0': - resolution: {integrity: sha512-eurGGaxHZiIQ+fBSageS8TAkRqZgdOiBeqNrWAqAPup9hXBTmQ0WcBjwsLElf+3jvDL9NhnX0dOgOqPfsjSjdg==} + resolution: {integrity: sha512-eurGGaxHZiIQ+fBSageS8TAkRqZgdOiBeqNrWAqAPup9hXBTmQ0WcBjwsLElf+3jvDL9NhnX0dOgOqPfsjSjdg==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] '@oxc-parser/binding-linux-riscv64-musl@0.124.0': - resolution: {integrity: sha512-d1V7/ll1i/LhqE/gZy6Wbz6evlk0egh2XKkwMI3epiojtbtUwQSLIER0Y3yDBBocPuWOjJdvmjtEmPTTLXje/w==} + resolution: {integrity: sha512-d1V7/ll1i/LhqE/gZy6Wbz6evlk0egh2XKkwMI3epiojtbtUwQSLIER0Y3yDBBocPuWOjJdvmjtEmPTTLXje/w==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] '@oxc-parser/binding-linux-s390x-gnu@0.124.0': - resolution: {integrity: sha512-w1+cBvriUteOpox6ATqCFVkpGL47PFdcfCPGmgUZbd78Fw44U0gQkc+kVGvAOTvGrptMYgwomD1c6OTVvkrpGg==} + resolution: {integrity: sha512-w1+cBvriUteOpox6ATqCFVkpGL47PFdcfCPGmgUZbd78Fw44U0gQkc+kVGvAOTvGrptMYgwomD1c6OTVvkrpGg==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.124.0': - resolution: {integrity: sha512-RRB1evQiXRtMCsQQiAh9U0H3HzguLpE0ytfStuhRgmOj7tqUCOVxkHsvM9geZjAax6NqVRj7VXx32qjjkZPsBw==} + resolution: {integrity: sha512-RRB1evQiXRtMCsQQiAh9U0H3HzguLpE0ytfStuhRgmOj7tqUCOVxkHsvM9geZjAax6NqVRj7VXx32qjjkZPsBw==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.124.0': - resolution: {integrity: sha512-asVYN0qmSHlCU8H9Q47SmeJ/Z5EG4IWCC+QGxkfFboI5qh15aLlJnHmnrV61MwQRPXGnVC/sC3qKhrUyqGxUqw==} + resolution: {integrity: sha512-asVYN0qmSHlCU8H9Q47SmeJ/Z5EG4IWCC+QGxkfFboI5qh15aLlJnHmnrV61MwQRPXGnVC/sC3qKhrUyqGxUqw==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] '@oxc-parser/binding-openharmony-arm64@0.124.0': - resolution: {integrity: sha512-nhwuxm6B8pn9lzAzMUfa571L5hCXYwQo8C8cx5aGOuHWCzruR8gPJnRRXGBci+uGaIIQEZDyU/U6HDgrSp/JlQ==} + resolution: {integrity: sha512-nhwuxm6B8pn9lzAzMUfa571L5hCXYwQo8C8cx5aGOuHWCzruR8gPJnRRXGBci+uGaIIQEZDyU/U6HDgrSp/JlQ==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] '@oxc-parser/binding-wasm32-wasi@0.124.0': - resolution: {integrity: sha512-LWuq4Dl9tff7n+HjJcqoBjDlVCtruc0shgtdtGM+rTUIE9aFxHA/P+wCYR+aWMjN8m9vNaRME/sKXErmhmeKrA==} + resolution: {integrity: sha512-LWuq4Dl9tff7n+HjJcqoBjDlVCtruc0shgtdtGM+rTUIE9aFxHA/P+wCYR+aWMjN8m9vNaRME/sKXErmhmeKrA==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.124.0.tgz} engines: {node: '>=14.0.0'} cpu: [wasm32] '@oxc-parser/binding-win32-arm64-msvc@0.124.0': - resolution: {integrity: sha512-aOh3Lf3AeH0dgzT4yBXcArFZ8VhqNXwZ/xlN0GqBtgVaGoHOOqL2YHlcVIgT+ghsXPVR2PTtYgBiQ1CNK7jp5A==} + resolution: {integrity: sha512-aOh3Lf3AeH0dgzT4yBXcArFZ8VhqNXwZ/xlN0GqBtgVaGoHOOqL2YHlcVIgT+ghsXPVR2PTtYgBiQ1CNK7jp5A==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] '@oxc-parser/binding-win32-ia32-msvc@0.124.0': - resolution: {integrity: sha512-sib5xC0nz/+SCpaETBuHBz4SXS02KuG5HtyOcHsO/SK5ZvLRGhOZx0elDKawjb6adFkD7dQCqpXUS25wY6ELKQ==} + resolution: {integrity: sha512-sib5xC0nz/+SCpaETBuHBz4SXS02KuG5HtyOcHsO/SK5ZvLRGhOZx0elDKawjb6adFkD7dQCqpXUS25wY6ELKQ==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] '@oxc-parser/binding-win32-x64-msvc@0.124.0': - resolution: {integrity: sha512-UgojtjGUgZgAZQYt7SC6VO65OVdxEkRe2q+2vbHJO//18qw3Hrk6UvHGQKldsQKgbVcIBT/YBrt85YberiYIPQ==} + resolution: {integrity: sha512-UgojtjGUgZgAZQYt7SC6VO65OVdxEkRe2q+2vbHJO//18qw3Hrk6UvHGQKldsQKgbVcIBT/YBrt85YberiYIPQ==, tarball: https://registry.npmmirror.com/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.124.0.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1855,95 +1867,95 @@ packages: resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} '@parcel/watcher-android-arm64@2.5.6': - resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==, tarball: https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] '@parcel/watcher-darwin-arm64@2.5.6': - resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==, tarball: https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] '@parcel/watcher-darwin-x64@2.5.6': - resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==, tarball: https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] '@parcel/watcher-freebsd-x64@2.5.6': - resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==, tarball: https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] '@parcel/watcher-linux-arm-glibc@2.5.6': - resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==, tarball: https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.6': - resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==, tarball: https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.6': - resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==, tarball: https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.6': - resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==, tarball: https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.6': - resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==, tarball: https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.6': - resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==, tarball: https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] libc: [musl] '@parcel/watcher-win32-arm64@2.5.6': - resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==, tarball: https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] '@parcel/watcher-win32-ia32@2.5.6': - resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==, tarball: https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] '@parcel/watcher-win32-x64@2.5.6': - resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==, tarball: https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] '@parcel/watcher@2.5.6': - resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==, tarball: https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.6.tgz} engines: {node: '>= 10.0.0'} '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, tarball: https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz} engines: {node: '>=14'} '@pkgr/core@0.2.9': @@ -1957,96 +1969,96 @@ packages: resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} '@rolldown/binding-android-arm64@1.0.0-rc.17': - resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} + resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==, tarball: https://registry.npmmirror.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] '@rolldown/binding-darwin-arm64@1.0.0-rc.17': - resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} + resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==, tarball: https://registry.npmmirror.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] '@rolldown/binding-darwin-x64@1.0.0-rc.17': - resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} + resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==, tarball: https://registry.npmmirror.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] '@rolldown/binding-freebsd-x64@1.0.0-rc.17': - resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} + resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==, tarball: https://registry.npmmirror.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': - resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} + resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==, tarball: https://registry.npmmirror.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} + resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==, tarball: https://registry.npmmirror.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': - resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} + resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==, tarball: https://registry.npmmirror.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} + resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==, tarball: https://registry.npmmirror.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} + resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==, tarball: https://registry.npmmirror.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} + resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==, tarball: https://registry.npmmirror.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': - resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} + resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==, tarball: https://registry.npmmirror.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': - resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} + resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==, tarball: https://registry.npmmirror.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': - resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} + resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==, tarball: https://registry.npmmirror.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': - resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} + resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==, tarball: https://registry.npmmirror.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': - resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} + resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==, tarball: https://registry.npmmirror.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -2079,140 +2091,140 @@ packages: optional: true '@rollup/rollup-android-arm-eabi@4.60.3': - resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} + resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==, tarball: https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.3.tgz} cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.60.3': - resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==} + resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==, tarball: https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.3.tgz} cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.60.3': - resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==} + resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==, tarball: https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.3.tgz} cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.60.3': - resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==} + resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==, tarball: https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.3.tgz} cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.60.3': - resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==} + resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.3.tgz} cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.60.3': - resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==} + resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==, tarball: https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.3.tgz} cpu: [x64] os: [freebsd] '@rollup/rollup-linux-arm-gnueabihf@4.60.3': - resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} + resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.3.tgz} cpu: [arm] os: [linux] libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.60.3': - resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} + resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.3.tgz} cpu: [arm] os: [linux] libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.60.3': - resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} + resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.3.tgz} cpu: [arm64] os: [linux] libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.60.3': - resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} + resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.3.tgz} cpu: [arm64] os: [linux] libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.60.3': - resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} + resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.3.tgz} cpu: [loong64] os: [linux] libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.60.3': - resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} + resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.3.tgz} cpu: [loong64] os: [linux] libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.60.3': - resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} + resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.3.tgz} cpu: [ppc64] os: [linux] libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.60.3': - resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} + resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.3.tgz} cpu: [ppc64] os: [linux] libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.60.3': - resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} + resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.3.tgz} cpu: [riscv64] os: [linux] libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.60.3': - resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} + resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.3.tgz} cpu: [riscv64] os: [linux] libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.60.3': - resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} + resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.3.tgz} cpu: [s390x] os: [linux] libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.3': - resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} + resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.3.tgz} cpu: [x64] os: [linux] libc: [glibc] '@rollup/rollup-linux-x64-musl@4.60.3': - resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} + resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.3.tgz} cpu: [x64] os: [linux] libc: [musl] '@rollup/rollup-openbsd-x64@4.60.3': - resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} + resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==, tarball: https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.3.tgz} cpu: [x64] os: [openbsd] '@rollup/rollup-openharmony-arm64@4.60.3': - resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==} + resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==, tarball: https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.3.tgz} cpu: [arm64] os: [openharmony] '@rollup/rollup-win32-arm64-msvc@4.60.3': - resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==} + resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.3.tgz} cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.60.3': - resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==} + resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.3.tgz} cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-gnu@4.60.3': - resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==} + resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.3.tgz} cpu: [x64] os: [win32] '@rollup/rollup-win32-x64-msvc@4.60.3': - resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==} + resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.3.tgz} cpu: [x64] os: [win32] @@ -2235,65 +2247,65 @@ packages: resolution: {integrity: sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==} '@swc/core-darwin-arm64@1.15.18': - resolution: {integrity: sha512-+mIv7uBuSaywN3C9LNuWaX1jJJ3SKfiJuE6Lr3bd+/1Iv8oMU7oLBjYMluX1UrEPzwN2qCdY6Io0yVicABoCwQ==} + resolution: {integrity: sha512-+mIv7uBuSaywN3C9LNuWaX1jJJ3SKfiJuE6Lr3bd+/1Iv8oMU7oLBjYMluX1UrEPzwN2qCdY6Io0yVicABoCwQ==, tarball: https://registry.npmmirror.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.18.tgz} engines: {node: '>=10'} cpu: [arm64] os: [darwin] '@swc/core-darwin-x64@1.15.18': - resolution: {integrity: sha512-wZle0eaQhnzxWX5V/2kEOI6Z9vl/lTFEC6V4EWcn+5pDjhemCpQv9e/TDJ0GIoiClX8EDWRvuZwh+Z3dhL1NAg==} + resolution: {integrity: sha512-wZle0eaQhnzxWX5V/2kEOI6Z9vl/lTFEC6V4EWcn+5pDjhemCpQv9e/TDJ0GIoiClX8EDWRvuZwh+Z3dhL1NAg==, tarball: https://registry.npmmirror.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.18.tgz} engines: {node: '>=10'} cpu: [x64] os: [darwin] '@swc/core-linux-arm-gnueabihf@1.15.18': - resolution: {integrity: sha512-ao61HGXVqrJFHAcPtF4/DegmwEkVCo4HApnotLU8ognfmU8x589z7+tcf3hU+qBiU1WOXV5fQX6W9Nzs6hjxDw==} + resolution: {integrity: sha512-ao61HGXVqrJFHAcPtF4/DegmwEkVCo4HApnotLU8ognfmU8x589z7+tcf3hU+qBiU1WOXV5fQX6W9Nzs6hjxDw==, tarball: https://registry.npmmirror.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.18.tgz} engines: {node: '>=10'} cpu: [arm] os: [linux] '@swc/core-linux-arm64-gnu@1.15.18': - resolution: {integrity: sha512-3xnctOBLIq3kj8PxOCgPrGjBLP/kNOddr6f5gukYt/1IZxsITQaU9TDyjeX6jG+FiCIHjCuWuffsyQDL5Ew1bg==} + resolution: {integrity: sha512-3xnctOBLIq3kj8PxOCgPrGjBLP/kNOddr6f5gukYt/1IZxsITQaU9TDyjeX6jG+FiCIHjCuWuffsyQDL5Ew1bg==, tarball: https://registry.npmmirror.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.18.tgz} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [glibc] '@swc/core-linux-arm64-musl@1.15.18': - resolution: {integrity: sha512-0a+Lix+FSSHBSBOA0XznCcHo5/1nA6oLLjcnocvzXeqtdjnPb+SvchItHI+lfeiuj1sClYPDvPMLSLyXFaiIKw==} + resolution: {integrity: sha512-0a+Lix+FSSHBSBOA0XznCcHo5/1nA6oLLjcnocvzXeqtdjnPb+SvchItHI+lfeiuj1sClYPDvPMLSLyXFaiIKw==, tarball: https://registry.npmmirror.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.18.tgz} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [musl] '@swc/core-linux-x64-gnu@1.15.18': - resolution: {integrity: sha512-wG9J8vReUlpaHz4KOD/5UE1AUgirimU4UFT9oZmupUDEofxJKYb1mTA/DrMj0s78bkBiNI+7Fo2EgPuvOJfuAA==} + resolution: {integrity: sha512-wG9J8vReUlpaHz4KOD/5UE1AUgirimU4UFT9oZmupUDEofxJKYb1mTA/DrMj0s78bkBiNI+7Fo2EgPuvOJfuAA==, tarball: https://registry.npmmirror.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.18.tgz} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [glibc] '@swc/core-linux-x64-musl@1.15.18': - resolution: {integrity: sha512-4nwbVvCphKzicwNWRmvD5iBaZj8JYsRGa4xOxJmOyHlMDpsvvJ2OR2cODlvWyGFH6BYL1MfIAK3qph3hp0Az6g==} + resolution: {integrity: sha512-4nwbVvCphKzicwNWRmvD5iBaZj8JYsRGa4xOxJmOyHlMDpsvvJ2OR2cODlvWyGFH6BYL1MfIAK3qph3hp0Az6g==, tarball: https://registry.npmmirror.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.18.tgz} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [musl] '@swc/core-win32-arm64-msvc@1.15.18': - resolution: {integrity: sha512-zk0RYO+LjiBCat2RTMHzAWaMky0cra9loH4oRrLKLLNuL+jarxKLFDA8xTZWEkCPLjUTwlRN7d28eDLLMgtUcQ==} + resolution: {integrity: sha512-zk0RYO+LjiBCat2RTMHzAWaMky0cra9loH4oRrLKLLNuL+jarxKLFDA8xTZWEkCPLjUTwlRN7d28eDLLMgtUcQ==, tarball: https://registry.npmmirror.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.18.tgz} engines: {node: '>=10'} cpu: [arm64] os: [win32] '@swc/core-win32-ia32-msvc@1.15.18': - resolution: {integrity: sha512-yVuTrZ0RccD5+PEkpcLOBAuPbYBXS6rslENvIXfvJGXSdX5QGi1ehC4BjAMl5FkKLiam4kJECUI0l7Hq7T1vwg==} + resolution: {integrity: sha512-yVuTrZ0RccD5+PEkpcLOBAuPbYBXS6rslENvIXfvJGXSdX5QGi1ehC4BjAMl5FkKLiam4kJECUI0l7Hq7T1vwg==, tarball: https://registry.npmmirror.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.18.tgz} engines: {node: '>=10'} cpu: [ia32] os: [win32] '@swc/core-win32-x64-msvc@1.15.18': - resolution: {integrity: sha512-7NRmE4hmUQNCbYU3Hn9Tz57mK9Qq4c97ZS+YlamlK6qG9Fb5g/BB3gPDe0iLlJkns/sYv2VWSkm8c3NmbEGjbg==} + resolution: {integrity: sha512-7NRmE4hmUQNCbYU3Hn9Tz57mK9Qq4c97ZS+YlamlK6qG9Fb5g/BB3gPDe0iLlJkns/sYv2VWSkm8c3NmbEGjbg==, tarball: https://registry.npmmirror.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.18.tgz} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -2317,20 +2329,23 @@ packages: resolution: {integrity: sha512-zeSORFArxqUwfVMTRHu8AN9k9LlfSn0CKDSzLhJDITpgLoS0xpnocxsgMjQjUcVYDgO47r9zLP49HEjH/iGsFg==} '@sxzz/popperjs-es@2.11.8': - resolution: {integrity: sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==} + resolution: {integrity: sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==, tarball: https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz} '@transloadit/prettier-bytes@0.0.7': resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==} '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==, tarball: https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz} '@tybys/wasm-util@0.10.2': - resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==, tarball: https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.2.tgz} '@types/ace@0.0.52': resolution: {integrity: sha512-YPF9S7fzpuyrxru+sG/rrTpZkC6gpHBPF14W3x70kqVOD+ks6jkYLapk4yceh36xej7K4HYxcyz9ZDQ2lTvwgQ==} + '@types/dom-mediacapture-record@1.0.22': + resolution: {integrity: sha512-mUMZLK3NvwRLcAAT9qmcK+9p7tpU2FHdDsntR3YI4+GY88XrgG4XiE7u1Q2LAN2/FZOz/tdMDC3GQCR4T8nFuw==, tarball: https://registry.npmmirror.com/@types/dom-mediacapture-record/-/dom-mediacapture-record-1.0.22.tgz} + '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} @@ -2368,10 +2383,10 @@ packages: resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==} '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==, tarball: https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz} '@types/video.js@7.3.58': - resolution: {integrity: sha512-1CQjuSrgbv1/dhmcfQ83eVyYbvGyqhTvb2Opxr0QCV+iJ4J6/J+XWQ3Om59WiwCd1MN3rDUHasx5XRrpUtewYQ==} + resolution: {integrity: sha512-1CQjuSrgbv1/dhmcfQ83eVyYbvGyqhTvb2Opxr0QCV+iJ4J6/J+XWQ3Om59WiwCd1MN3rDUHasx5XRrpUtewYQ==, tarball: https://registry.npmmirror.com/@types/video.js/-/video.js-7.3.58.tgz} '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} @@ -3118,7 +3133,7 @@ packages: engines: {node: '>=6'} camunda-bpmn-js-behaviors@1.7.2: - resolution: {integrity: sha512-xjLJHc18T40tcYu4JCeYDo1wR5i9+ZqcVnXVP6c4ooAe2gKISbBvFc07gqGpqiwm7TpEBvUfDj3PrRr+ofaf4w==} + resolution: {integrity: sha512-xjLJHc18T40tcYu4JCeYDo1wR5i9+ZqcVnXVP6c4ooAe2gKISbBvFc07gqGpqiwm7TpEBvUfDj3PrRr+ofaf4w==, tarball: https://registry.npmmirror.com/camunda-bpmn-js-behaviors/-/camunda-bpmn-js-behaviors-1.7.2.tgz} peerDependencies: bpmn-js: '>= 9' camunda-bpmn-moddle: '>= 7' @@ -3163,7 +3178,7 @@ packages: resolution: {integrity: sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==} classnames@2.5.1: - resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==, tarball: https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz} cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} @@ -3236,7 +3251,7 @@ packages: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} component-event@0.2.1: - resolution: {integrity: sha512-wGA++isMqiDq1jPYeyv2as/Bt/u+3iLW0rEa+8NQ82jAv3TgqMiCM+B2SaBdn2DfLilLjjq736YcezihRYhfxw==} + resolution: {integrity: sha512-wGA++isMqiDq1jPYeyv2as/Bt/u+3iLW0rEa+8NQ82jAv3TgqMiCM+B2SaBdn2DfLilLjjq736YcezihRYhfxw==, tarball: https://registry.npmmirror.com/component-event/-/component-event-0.2.1.tgz} compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} @@ -3304,7 +3319,7 @@ packages: optional: true crelt@1.0.6: - resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==, tarball: https://registry.npmmirror.com/crelt/-/crelt-1.0.6.tgz} cropperjs@2.1.1: resolution: {integrity: sha512-FDJMarkY+/SepYarPZsvkG2LmI2PElecciMFnvBiBIoKnFYua/scprC5qejCLLyuX2jEqJRS2njbAsHxfjtIXA==} @@ -3569,7 +3584,7 @@ packages: engines: {node: '>= 4'} domify@1.4.2: - resolution: {integrity: sha512-m4yreHcUWHBncGVV7U+yQzc12vIlq0jMrtHZ5mW6dQMiL/7skSYNVX9wqKwOtyO9SGCgevrAFEgOCAHmamHTUA==} + resolution: {integrity: sha512-m4yreHcUWHBncGVV7U+yQzc12vIlq0jMrtHZ5mW6dQMiL/7skSYNVX9wqKwOtyO9SGCgevrAFEgOCAHmamHTUA==, tarball: https://registry.npmmirror.com/domify/-/domify-1.4.2.tgz} domify@3.0.0: resolution: {integrity: sha512-bs2yO68JDFOm6rKv8f0EnrM2cENduhRkpqOtt/s5l5JBA/eqGBZCzLPmdYoHtJ6utgLGgcBajFsEQbl12pT0lQ==} @@ -3708,7 +3723,7 @@ packages: hasBin: true esbuild@0.27.3: - resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.27.3.tgz} engines: {node: '>=18'} hasBin: true @@ -3832,6 +3847,10 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, tarball: https://registry.npmmirror.com/events/-/events-3.3.0.tgz} + engines: {node: '>=0.8.x'} + exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} @@ -3882,7 +3901,7 @@ packages: optional: true feelers@1.5.1: - resolution: {integrity: sha512-LKIAqtScSfy55Tw62DhBcxIT3k2XnppzWrkmGfsbdad0a+TxMfaLF1CSYhoVRF5FvPAUXvor1Ux/75wtBaDYpA==} + resolution: {integrity: sha512-LKIAqtScSfy55Tw62DhBcxIT3k2XnppzWrkmGfsbdad0a+TxMfaLF1CSYhoVRF5FvPAUXvor1Ux/75wtBaDYpA==, tarball: https://registry.npmmirror.com/feelers/-/feelers-1.5.1.tgz} file-entry-cache@11.1.2: resolution: {integrity: sha512-N2WFfK12gmrK1c1GXOqiAJ1tc5YE+R53zvQ+t5P8S5XhnmKYVB5eZEiLNZKDSmoG8wqqbF9EXYBBW/nef19log==} @@ -3928,7 +3947,7 @@ packages: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} focus-trap@7.8.0: - resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} + resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==, tarball: https://registry.npmmirror.com/focus-trap/-/focus-trap-7.8.0.tgz} follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} @@ -3958,7 +3977,7 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -4127,7 +4146,7 @@ packages: engines: {node: '>=0.10.0'} ids@1.0.5: - resolution: {integrity: sha512-XQ0yom/4KWTL29sLG+tyuycy7UmeaM/79GRtSJq6IG9cJGIPeBz5kwDCguie3TwxaMNIc3WtPi0cTa1XYHicpw==} + resolution: {integrity: sha512-XQ0yom/4KWTL29sLG+tyuycy7UmeaM/79GRtSJq6IG9cJGIPeBz5kwDCguie3TwxaMNIc3WtPi0cTa1XYHicpw==, tarball: https://registry.npmmirror.com/ids/-/ids-1.0.5.tgz} ids@3.0.2: resolution: {integrity: sha512-t6YJP4mdC+GHF96Nbis/4FEANhP/8VWmYMvUuYpXvSdrhg5hpIVbq2XZlOA3UWTbtdwPCi0q7jEXOdHkAnqOnw==} @@ -4262,6 +4281,9 @@ packages: resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} engines: {node: '>= 0.6.0'} + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==, tarball: https://registry.npmmirror.com/jose/-/jose-6.2.3.tgz} + js-beautify@1.15.4: resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} engines: {node: '>=14'} @@ -4355,71 +4377,71 @@ packages: engines: {node: '>= 0.8.0'} lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==, tarball: https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==, tarball: https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==, tarball: https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==, tarball: https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==, tarball: https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==, tarball: https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==, tarball: https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==, tarball: https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==, tarball: https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==, tarball: https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==, tarball: https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] @@ -4443,6 +4465,11 @@ packages: resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} engines: {node: '>=20.0.0'} + livekit-client@2.19.1: + resolution: {integrity: sha512-knwEuozt3d7optuUMvw+0PGrV/68GWXrTdAefezOM51Dk8QLb28qOm73UMSSQET58gUqelxqU1afchd2YyPKnQ==, tarball: https://registry.npmmirror.com/livekit-client/-/livekit-client-2.19.1.tgz} + peerDependencies: + '@types/dom-mediacapture-record': ^1 + local-pkg@1.1.2: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} @@ -4517,7 +4544,7 @@ packages: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} luxon@3.7.2: - resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==, tarball: https://registry.npmmirror.com/luxon/-/luxon-3.7.2.tgz} engines: {node: '>=12'} m3u8-parser@7.2.0: @@ -4628,7 +4655,7 @@ packages: engines: {node: '>=18'} min-dash@4.2.3: - resolution: {integrity: sha512-VLMYQI5+FcD9Ad24VcB08uA83B07OhueAlZ88jBK6PyupTvEJwllTMUqMy0wPGYs7pZUEtEEMWdHB63m3LtEcg==} + resolution: {integrity: sha512-VLMYQI5+FcD9Ad24VcB08uA83B07OhueAlZ88jBK6PyupTvEJwllTMUqMy0wPGYs7pZUEtEEMWdHB63m3LtEcg==, tarball: https://registry.npmmirror.com/min-dash/-/min-dash-4.2.3.tgz} min-dash@5.0.0: resolution: {integrity: sha512-EGuoBnVL7/Fnv2sqakpX5WGmZehZ3YMmLayT7sM8E9DRU74kkeyMg4Rik1lsOkR2GbFNeBca4/L+UfU6gF0Edw==} @@ -4637,7 +4664,7 @@ packages: resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==} min-dom@4.2.1: - resolution: {integrity: sha512-TMoL8SEEIhUWYgkj7XMSgxmwSyGI+4fP2KFFGnN3FbHfbGHVdsLYSz8LoIsgPhz4dWRmLvxWWSMgzZMJW5sZuA==} + resolution: {integrity: sha512-TMoL8SEEIhUWYgkj7XMSgxmwSyGI+4fP2KFFGnN3FbHfbGHVdsLYSz8LoIsgPhz4dWRmLvxWWSMgzZMJW5sZuA==, tarball: https://registry.npmmirror.com/min-dom/-/min-dom-4.2.1.tgz} min-dom@5.3.0: resolution: {integrity: sha512-0w5FEBgPAyHhmFojW3zxd7we3D+m5XYS3E/06OyvxmbHJoiQVa4Nagj6RWvoAKYRw5xth6cP5TMePc5cR1M9hA==} @@ -5184,6 +5211,9 @@ packages: rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==, tarball: https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -5210,6 +5240,13 @@ packages: scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + sdp-transform@2.15.0: + resolution: {integrity: sha512-KrOH82c/W+GYQ0LHqtr3caRpM3ITglq3ljGUIb8LTki7ByacJZ9z+piSGiwZDsRyhQbYBOBJgr2k6X4BZXi3Kw==, tarball: https://registry.npmmirror.com/sdp-transform/-/sdp-transform-2.15.0.tgz} + hasBin: true + + sdp@3.2.2: + resolution: {integrity: sha512-xZocWwfyp4hkbN4hLWxMjmv2Q8aNa9MhmOZ7L9aCZPT+dZsgRr6wZRrSYE3HTdyk/2pZKPSgqI7ns7Een1xMSA==, tarball: https://registry.npmmirror.com/sdp/-/sdp-3.2.2.tgz} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -5367,7 +5404,7 @@ packages: resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} style-mod@4.1.3: - resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} + resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==, tarball: https://registry.npmmirror.com/style-mod/-/style-mod-4.1.3.tgz} stylelint-config-html@1.1.0: resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==} @@ -5443,7 +5480,7 @@ packages: resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==} tabbable@6.4.0: - resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==, tarball: https://registry.npmmirror.com/tabbable/-/tabbable-6.4.0.tgz} table@6.9.0: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} @@ -5501,7 +5538,7 @@ packages: resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, tarball: https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz} tyme4ts@1.4.6: resolution: {integrity: sha512-6uiAlUxS4BNu2FGsKg0KdUr329jJjhnEURhURR8v5GKXnv1B7Z4kAZHjOByhGcCJ+jhuQskR5kmGSvZJ7fE/VA==} @@ -5520,6 +5557,9 @@ packages: type@2.7.3: resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + typed-emitter@2.1.0: + resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==, tarball: https://registry.npmmirror.com/typed-emitter/-/typed-emitter-2.1.0.tgz} + typescript-eslint@8.59.2: resolution: {integrity: sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5845,7 +5885,7 @@ packages: vue: ^3.0.1 w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==, tarball: https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz} wangeditor@4.7.15: resolution: {integrity: sha512-aPTdREd8BxXVyJ5MI+LU83FQ7u1EPd341iXIorRNYSOvoimNoZ4nPg+yn3FGbB93/owEa6buLw8wdhYnMCJQLg==} @@ -5856,6 +5896,10 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webrtc-adapter@9.0.5: + resolution: {integrity: sha512-U9vjByy/sK2OMXu5mmfuZFKTMIUQe34c0JXRO+oDrxJTsntdYT2iIFwYMOV7HhMTuktcZLGf2W1N/OcSf9ssWg==, tarball: https://registry.npmmirror.com/webrtc-adapter/-/webrtc-adapter-9.0.5.tgz} + engines: {node: '>=6.0.0', npm: '>=3.10.0'} + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -5965,7 +6009,7 @@ packages: engines: {node: '>=10'} zeebe-bpmn-moddle@1.7.0: - resolution: {integrity: sha512-eZ6OXSt0c4n9V/oN/46gTlwDIS3GhWQLt9jbM5uS/YryB4yN8wdrrKrtw+TpyNy0SSKWXNDHyC83nCA2blPO3Q==} + resolution: {integrity: sha512-eZ6OXSt0c4n9V/oN/46gTlwDIS3GhWQLt9jbM5uS/YryB4yN8wdrrKrtw+TpyNy0SSKWXNDHyC83nCA2blPO3Q==, tarball: https://registry.npmmirror.com/zeebe-bpmn-moddle/-/zeebe-bpmn-moddle-1.7.0.tgz} zrender@6.0.0: resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==} @@ -6741,6 +6785,8 @@ snapshots: min-dash: 4.2.3 min-dom: 4.2.1 + '@bufbuild/protobuf@1.10.1': {} + '@cacheable/memory@2.0.8': dependencies: '@cacheable/utils': 2.4.1 @@ -7491,6 +7537,12 @@ snapshots: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 + '@livekit/mutex@1.1.1': {} + + '@livekit/protocol@1.45.8': + dependencies: + '@bufbuild/protobuf': 1.10.1 + '@marijn/find-cluster-break@1.0.2': {} '@microsoft/fetch-event-source@2.0.1': {} @@ -7915,6 +7967,8 @@ snapshots: '@types/ace@0.0.52': {} + '@types/dom-mediacapture-record@1.0.22': {} + '@types/esrecurse@4.3.1': {} '@types/estree@1.0.8': {} @@ -9841,6 +9895,8 @@ snapshots: eventemitter3@5.0.4: {} + events@3.3.0: {} + exsolve@1.0.8: {} ext@1.7.0: @@ -10277,6 +10333,8 @@ snapshots: jmespath@0.16.0: {} + jose@6.2.3: {} + js-beautify@1.15.4: dependencies: config-chain: 1.1.13 @@ -10437,6 +10495,19 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.2 + livekit-client@2.19.1(@types/dom-mediacapture-record@1.0.22): + dependencies: + '@livekit/mutex': 1.1.1 + '@livekit/protocol': 1.45.8 + '@types/dom-mediacapture-record': 1.0.22 + events: 3.3.0 + jose: 6.2.3 + loglevel: 1.9.2 + sdp-transform: 2.15.0 + tslib: 2.8.1 + typed-emitter: 2.1.0 + webrtc-adapter: 9.0.5 + local-pkg@1.1.2: dependencies: mlly: 1.8.2 @@ -11188,6 +11259,11 @@ snapshots: rw@1.3.3: {} + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + optional: true + safer-buffer@2.1.2: {} sass@1.99.0: @@ -11210,6 +11286,10 @@ snapshots: scule@1.3.0: {} + sdp-transform@2.15.0: {} + + sdp@3.2.2: {} + semver@6.3.1: {} semver@7.7.4: {} @@ -11532,6 +11612,10 @@ snapshots: type@2.7.3: {} + typed-emitter@2.1.0: + optionalDependencies: + rxjs: 7.8.2 + typescript-eslint@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3): dependencies: '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3) @@ -11928,6 +12012,10 @@ snapshots: webpack-virtual-modules@0.6.2: {} + webrtc-adapter@9.0.5: + dependencies: + sdp: 3.2.2 + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 diff --git a/src/api/im/channel/material/index.ts b/src/api/im/channel/material/index.ts new file mode 100644 index 000000000..a01ed7e50 --- /dev/null +++ b/src/api/im/channel/material/index.ts @@ -0,0 +1,18 @@ +import request from '@/config/axios' + +// 用户端能看到的频道素材详情 +export interface ImChannelMaterialRespVO { + id: number + channelId: number + type: number + title: string + coverUrl?: string + summary?: string + content?: string + url?: string +} + +// 获取频道素材详情;用于客户端点击图文卡片渲染详情页 +export const getChannelMaterial = (id: number) => { + return request.get({ url: '/im/channel/material/get', params: { id } }) +} diff --git a/src/api/im/face/pack/index.ts b/src/api/im/face/pack/index.ts new file mode 100644 index 000000000..713fa580d --- /dev/null +++ b/src/api/im/face/pack/index.ts @@ -0,0 +1,23 @@ +import request from '@/config/axios' + +// 用户端表情包项(精简版) +export interface ImFacePackUserItemVO { + id: number + url: string + name?: string + width: number + height: number +} + +// 用户端表情包 + 嵌套 items +export interface ImFacePackUserVO { + id: number + name: string + icon?: string + items: ImFacePackUserItemVO[] +} + +// 拉取所有启用的系统表情包(含表情列表) +export const getFacePackList = () => { + return request.get({ url: '/im/face-pack/list' }) +} diff --git a/src/api/im/face/useritem/index.ts b/src/api/im/face/useritem/index.ts new file mode 100644 index 000000000..ab3599689 --- /dev/null +++ b/src/api/im/face/useritem/index.ts @@ -0,0 +1,33 @@ +import request from '@/config/axios' + +// 个人表情 +export interface ImFaceUserItemVO { + id: number + url: string + name?: string + width: number + height: number +} + +// 添加个人表情请求 +export interface ImFaceUserItemSaveReqVO { + url: string + name?: string + width: number + height: number +} + +// 获取我的个人表情列表 +export const getFaceUserItemList = () => { + return request.get({ url: '/im/face-user-item/list' }) +} + +// 添加个人表情 +export const createFaceUserItem = (data: ImFaceUserItemSaveReqVO) => { + return request.post({ url: '/im/face-user-item/create', data }) +} + +// 删除个人表情 +export const deleteFaceUserItem = (id: number) => { + return request.delete({ url: '/im/face-user-item/delete', params: { id } }) +} diff --git a/src/api/im/friend/index.ts b/src/api/im/friend/index.ts new file mode 100644 index 000000000..c16e478e8 --- /dev/null +++ b/src/api/im/friend/index.ts @@ -0,0 +1,62 @@ +import request from '@/config/axios' + +// IM 好友 Response VO +export interface ImFriendRespVO { + id: number // 关系记录编号 + friendUserId: number // 好友的用户编号 + silent?: boolean // 是否免打扰 + displayName?: string // 好友展示备注(仅自己可见) + displayNamePinyin?: string // 备注的拼音(小写无空格,前端按首字母分桶 / 拼音搜索) + addSource?: number // 添加来源;参见 ImFriendAddSourceEnum + pinned?: boolean // 是否置顶联系人 + blocked?: boolean // 是否拉黑 + status?: number // 好友状态(0=正常,1=已删除) + addTime?: string // 添加好友时间 + deleteTime?: string // 删除好友时间 + // 聚合字段(自 AdminUser) + nickname?: string // 好友昵称 + nicknamePinyin?: string // 昵称的拼音(小写无空格,前端按首字母分桶 / 拼音搜索) + avatar?: string // 好友头像 +} + +// IM 好友更新 Request VO +export interface ImFriendUpdateReqVO { + friendUserId: number // 好友的用户编号 + silent?: boolean // 是否免打扰 + displayName?: string // 好友展示备注 + pinned?: boolean // 是否置顶联系人 +} + +// 获得当前登录用户的好友列表 +export const getMyFriendList = () => { + return request.get({ url: '/im/friend/list' }) +} + +// 获得好友详情 +export const getFriend = (friendUserId: number | string) => { + return request.get({ url: '/im/friend/get', params: { friendUserId } }) +} + +// 删除好友(单向软删除) +export const deleteFriend = (friendUserId: number | string, clear: boolean) => { + return request.delete({ + url: '/im/friend/delete', + params: { friendUserId, clear } + }) +} + +// 更新好友信息(备注 / 免打扰 / 联系人置顶) +export const updateFriend = (data: ImFriendUpdateReqVO) => { + return request.put({ url: '/im/friend/update', data }) +} + +// 拉黑好友(必须先是好友;单边屏蔽对方私聊消息) +export const blockFriend = (friendUserId: number | string) => { + return request.put({ url: '/im/friend/block', params: { friendUserId } }) +} + +// 移出黑名单 +export const unblockFriend = (friendUserId: number | string) => { + return request.put({ url: '/im/friend/unblock', params: { friendUserId } }) +} + diff --git a/src/api/im/friend/request/index.ts b/src/api/im/friend/request/index.ts new file mode 100644 index 000000000..63072b57e --- /dev/null +++ b/src/api/im/friend/request/index.ts @@ -0,0 +1,65 @@ +import request from '@/config/axios' + +// IM 好友申请 Response VO +export interface ImFriendRequestRespVO { + id: number // 申请编号 + fromUserId: number // 发起方用户编号 + toUserId: number // 接收方用户编号 + handleResult: number // 处理结果;0=未处理;1=同意;2=拒绝 + applyContent?: string // 申请理由 + handleContent?: string // 处理理由(接收方拒绝时可选填) + addSource?: number // 添加来源;参见 ImFriendAddSourceEnum + handleTime?: string // 处理时间 + createTime: string // 申请创建时间 + // 聚合字段(自 AdminUser) + fromNickname?: string // 发起方昵称 + fromAvatar?: string // 发起方头像 + toNickname?: string // 接收方昵称 + toAvatar?: string // 接收方头像 +} + +// IM 好友申请发起 Request VO +export interface ImFriendRequestApplyReqVO { + toUserId: number // 接收方用户编号 + applyContent?: string // 申请理由 + displayName?: string // 对接收方的备注(仅自己可见) + addSource?: number // 添加来源 +} + +// 发起好友申请 +export const applyFriendRequest = (data: ImFriendRequestApplyReqVO) => { + return request.post({ url: '/im/friend-request/apply', data }) +} + +// 同意好友申请 +export const agreeFriendRequest = (id: number | string) => { + return request.put({ url: '/im/friend-request/agree', params: { id } }) +} + +// 拒绝好友申请 +export const refuseFriendRequest = (id: number | string, handleContent?: string) => { + return request.put({ + url: '/im/friend-request/refuse', + params: { id, handleContent } + }) +} + +// 查询「我相关」的好友申请列表(游标分页:传 maxId 加载更多) +export const getMyFriendRequestList = (limit: number, maxId?: number) => { + const params: Record = { limit } + if (maxId != null) { + params.maxId = maxId + } + return request.get({ + url: '/im/friend-request/list', + params + }) +} + +// 按 id 单查「我相关」的申请记录(带越权过滤;WebSocket 通知到达后用) +export const getMyFriendRequest = (id: number) => { + return request.get({ + url: '/im/friend-request/get', + params: { id } + }) +} diff --git a/src/api/im/group/index.ts b/src/api/im/group/index.ts new file mode 100644 index 000000000..6aefb7fbd --- /dev/null +++ b/src/api/im/group/index.ts @@ -0,0 +1,137 @@ +import request from '@/config/axios' +import type { ImGroupMessageRespVO } from '@/api/im/message/group' + +// 群 Response VO +export interface ImGroupRespVO { + id: number // 编号 + name: string // 群名称 + ownerUserId: number // 群主用户编号 + avatar?: string // 群头像 + notice?: string // 群公告 + banned?: boolean // 是否封禁 + mutedAll?: boolean // 是否全群禁言 + joinApproval?: boolean // 进群是否需群主 / 管理员审批 + bannedTime?: string // 封禁时间 + status: number // 群状态(0=正常,1=已解散) + dissolvedTime?: string // 解散时间 + createTime?: string // 创建时间 + pinnedMessages?: ImGroupMessageRespVO[] // 群置顶消息列表(后端关联回填,仅当登录用户是群成员时非空) +} + +// 群消息置顶 / 取消置顶 Request VO +export interface ImGroupMessagePinReqVO { + id: number // 群编号 + messageId: number // 消息编号 +} + +// 群创建 Request VO +export interface ImGroupCreateReqVO { + name: string // 群名称 + memberUserIds?: number[] // 初始成员用户编号列表(建群同时邀请的好友,不含创建者自己) + joinApproval?: boolean // 进群是否需审批;不传默认 false 自由进群 +} + +// 群更新 Request VO +export interface ImGroupUpdateReqVO { + id: number // 群编号 + name?: string // 群名称 + avatar?: string // 群头像 + notice?: string // 群公告 + joinApproval?: boolean // 进群是否需审批 +} + +// 添加 / 撤销群管理员 Request VO +export interface ImGroupAdminReqVO { + id: number // 群编号 + userIds: number[] // 目标用户编号列表 +} + +// 群主转让 Request VO +export interface ImGroupTransferOwnerReqVO { + id: number // 群编号 + newOwnerUserId: number // 新群主用户编号 +} + +// 全群禁言 / 取消 Request VO +export interface ImGroupMuteAllReqVO { + id: number // 群编号 + mutedAll: boolean // 是否全群禁言 +} + +// 成员禁言 Request VO +export interface ImGroupMuteMemberReqVO { + id: number // 群编号 + userId: number // 被禁言的用户编号 + mutedSeconds: number // 禁言时长(秒),0 表示永久禁言 +} + +// 取消成员禁言 Request VO +export interface ImGroupCancelMuteMemberReqVO { + id: number // 群编号 + userId: number // 被取消禁言的用户编号 +} + +// 获得当前登录用户的群列表 +export const getMyGroupList = () => { + return request.get({ url: '/im/group/list' }) +} + +// 获得群详情 +export const getGroup = (id: number | string) => { + return request.get({ url: '/im/group/get', params: { id } }) +} + +// 创建群 +export const createGroup = (data: ImGroupCreateReqVO) => { + return request.post({ url: '/im/group/create', data }) +} + +// 更新群 +export const updateGroup = (data: ImGroupUpdateReqVO) => { + return request.put({ url: '/im/group/update', data }) +} + +// 解散群 +export const dissolveGroup = (id: number | string) => { + return request.delete({ url: '/im/group/dissolve', params: { id } }) +} + +// 添加群管理员(仅群主可调) +export const addGroupAdmin = (data: ImGroupAdminReqVO) => { + return request.put({ url: '/im/group/add-admin', data }) +} + +// 撤销群管理员(仅群主可调) +export const removeGroupAdmin = (data: ImGroupAdminReqVO) => { + return request.put({ url: '/im/group/remove-admin', data }) +} + +// 转让群主(仅老群主可调;旧群主转让后降为普通成员) +export const transferGroupOwner = (data: ImGroupTransferOwnerReqVO) => { + return request.put({ url: '/im/group/transfer-owner', data }) +} + +// 置顶群消息(仅群主 / 管理员可调) +export const pinGroupMessage = (data: ImGroupMessagePinReqVO) => { + return request.put({ url: '/im/group/pin-message', data }) +} + +// 取消置顶群消息(仅群主 / 管理员可调) +export const unpinGroupMessage = (data: ImGroupMessagePinReqVO) => { + return request.put({ url: '/im/group/unpin-message', data }) +} + +// 全群禁言 / 取消(仅群主 / 管理员可调) +export const muteAll = (data: ImGroupMuteAllReqVO) => { + return request.put({ url: '/im/group/mute-all', data }) +} + +// 禁言成员 +export const muteMember = (data: ImGroupMuteMemberReqVO) => { + return request.put({ url: '/im/group/mute-member', data }) +} + +// 取消成员禁言 +export const cancelMuteMember = (data: ImGroupCancelMuteMemberReqVO) => { + return request.put({ url: '/im/group/cancel-mute-member', data }) +} diff --git a/src/api/im/group/member/index.ts b/src/api/im/group/member/index.ts new file mode 100644 index 000000000..5ca9be4a6 --- /dev/null +++ b/src/api/im/group/member/index.ts @@ -0,0 +1,76 @@ +import request from '@/config/axios' + +// 群成员 Response VO +export interface ImGroupMemberRespVO { + id: number // 编号 + groupId: number // 群编号 + userId: number // 用户编号 + displayUserName?: string // 组内显示名(群主设置的备注) + groupRemark?: string // 群备注(当前用户对群的备注) + silent?: boolean // 是否免打扰 + status?: number // 成员状态(0=在群,1=退群) + role?: number // 成员角色,参见 ImGroupMemberRole 枚举 + joinTime?: string // 入群时间 + quitTime?: string // 退群时间 + muteEndTime?: string // 禁言到期时间 + createTime?: string // 创建时间 + // 聚合字段(自 AdminUser) + nickname?: string // 用户昵称 + avatar?: string // 用户头像 +} + +// 群成员邀请 Request VO +export interface ImGroupMemberInviteReqVO { + groupId: number // 群编号 + memberUserIds: number[] // 被邀请的用户编号列表 +} + +// 群成员移除 Request VO +export interface ImGroupMemberRemoveReqVO { + groupId: number // 群编号 + memberUserIds: number[] // 被移除的用户编号列表 +} + +// 群成员更新 Request VO +export interface ImGroupMemberUpdateReqVO { + groupId: number // 群编号 + displayUserName?: string // 群内昵称 + groupRemark?: string // 群备注 + silent?: boolean // 是否免打扰 +} + +// 邀请用户加入群 +export const inviteGroupMember = (data: ImGroupMemberInviteReqVO) => { + return request.post({ url: '/im/group/invite', data }) +} + +// 退出群 +export const quitGroup = (groupId: number | string) => { + return request.delete({ url: '/im/group/quit', params: { groupId } }) +} + +// 移除群成员 +export const removeGroupMember = (data: ImGroupMemberRemoveReqVO) => { + return request.delete({ url: '/im/group/kicking', data }) +} + +// 获得群成员详情 +export const getGroupMember = (groupId: number, userId: number) => { + return request.get({ + url: '/im/group-member/get', + params: { groupId, userId } + }) +} + +// 获得指定群的成员列表(聚合 AdminUser 昵称 / 头像) +export const getGroupMemberList = (groupId: number | string) => { + return request.get({ + url: '/im/group-member/list', + params: { groupId } + }) +} + +// 更新群成员 +export const updateGroupMember = (data: ImGroupMemberUpdateReqVO) => { + return request.put({ url: '/im/group-member/update', data }) +} diff --git a/src/api/im/group/request/index.ts b/src/api/im/group/request/index.ts new file mode 100644 index 000000000..14aa41a50 --- /dev/null +++ b/src/api/im/group/request/index.ts @@ -0,0 +1,71 @@ +import request from '@/config/axios' + +// IM 加群申请 Response VO +export interface ImGroupRequestRespVO { + id: number // 申请编号 + groupId: number // 群编号 + userId: number // 申请人 / 被邀请人用户编号 + inviterUserId?: number // 邀请人;NULL 表示用户主动申请 + handleResult: number // 处理结果;0=未处理;1=同意;2=拒绝 + applyContent?: string // 申请理由 + handleContent?: string // 处理理由(拒绝时可选填) + handleUserId?: number // 处理人用户编号 + addSource?: number // 加入来源;参见 ImGroupAddSourceEnum + handleTime?: string // 处理时间 + createTime: string // 申请创建时间 + // 聚合字段 + userNickname?: string // 申请人 / 被邀请人昵称 + userAvatar?: string // 申请人 / 被邀请人头像 + inviterNickname?: string // 邀请人昵称 + inviterAvatar?: string // 邀请人头像 + groupName?: string // 群名称 + groupAvatar?: string // 群头像 +} + +// IM 加群申请发起 Request VO +export interface ImGroupRequestApplyReqVO { + groupId: number // 群编号 + applyContent?: string // 申请理由 + addSource?: number // 加入来源 +} + +// 申请加群 +export const applyJoinGroup = (data: ImGroupRequestApplyReqVO) => { + return request.post({ url: '/im/group-request/apply', data }) +} + +// 同意加群申请(群主或管理员) +export const agreeGroupRequest = (id: number | string) => { + return request.put({ url: '/im/group-request/agree', params: { id } }) +} + +// 拒绝加群申请(群主或管理员) +export const refuseGroupRequest = (id: number | string, handleContent?: string) => { + return request.put({ + url: '/im/group-request/refuse', + params: { id, handleContent } + }) +} + +// 查询「我管理的所有群」下的未处理加群申请列表(不分页);前端 store 据此派生横幅红点 + Drawer 列表 +export const getUnhandledRequestList = () => { + return request.get({ + url: '/im/group-request/unhandled-list' + }) +} + +// 查询指定群下的全部加群申请(含已处理);仅群主 / 管理员可查 +export const getGroupRequestListByGroupId = (groupId: number) => { + return request.get({ + url: '/im/group-request/list-by-group', + params: { groupId } + }) +} + +// 按 id 单查申请记录(带越权过滤;WebSocket 通知到达后用) +export const getMyGroupRequest = (id: number) => { + return request.get({ + url: '/im/group-request/get', + params: { id } + }) +} diff --git a/src/api/im/manager/channel/index.ts b/src/api/im/manager/channel/index.ts new file mode 100644 index 000000000..86c0434ca --- /dev/null +++ b/src/api/im/manager/channel/index.ts @@ -0,0 +1,41 @@ +import request from '@/config/axios' + +export interface ImManagerChannelVO { + id: number + code: string + name: string + avatar?: string + sort: number + status: number + createTime?: Date +} + +// 获得频道分页 +export const getManagerChannelPage = (params: PageParam) => { + return request.get({ url: '/im/manager/channel/page', params }) +} + +// 获得频道详情 +export const getManagerChannel = (id: number) => { + return request.get({ url: '/im/manager/channel/get', params: { id } }) +} + +// 新增频道 +export const createManagerChannel = (data: ImManagerChannelVO) => { + return request.post({ url: '/im/manager/channel/create', data }) +} + +// 修改频道 +export const updateManagerChannel = (data: ImManagerChannelVO) => { + return request.put({ url: '/im/manager/channel/update', data }) +} + +// 删除频道 +export const deleteManagerChannel = (id: number) => { + return request.delete({ url: '/im/manager/channel/delete', params: { id } }) +} + +// 获得启用的频道精简列表(表单选择用) +export const getSimpleChannelList = () => { + return request.get({ url: '/im/manager/channel/simple-list' }) +} diff --git a/src/api/im/manager/channel/material/index.ts b/src/api/im/manager/channel/material/index.ts new file mode 100644 index 000000000..ef207ee7e --- /dev/null +++ b/src/api/im/manager/channel/material/index.ts @@ -0,0 +1,47 @@ +import request from '@/config/axios' + +export interface ImManagerChannelMaterialVO { + id: number + channelId: number + channelName?: string + type: number + title: string + coverUrl?: string + summary?: string + content?: string + url?: string + createTime?: Date +} + +// 获得素材分页 +export const getManagerChannelMaterialPage = (params: PageParam) => { + return request.get({ url: '/im/manager/channel-material/page', params }) +} + +// 获得指定频道下的素材精简列表 +export const getSimpleManagerChannelMaterialList = (channelId: number) => { + return request.get({ + url: '/im/manager/channel-material/simple-list', + params: { channelId } + }) +} + +// 获得素材详情 +export const getManagerChannelMaterial = (id: number) => { + return request.get({ url: '/im/manager/channel-material/get', params: { id } }) +} + +// 新增素材 +export const createManagerChannelMaterial = (data: ImManagerChannelMaterialVO) => { + return request.post({ url: '/im/manager/channel-material/create', data }) +} + +// 修改素材 +export const updateManagerChannelMaterial = (data: ImManagerChannelMaterialVO) => { + return request.put({ url: '/im/manager/channel-material/update', data }) +} + +// 删除素材 +export const deleteManagerChannelMaterial = (id: number) => { + return request.delete({ url: '/im/manager/channel-material/delete', params: { id } }) +} diff --git a/src/api/im/manager/channel/message/index.ts b/src/api/im/manager/channel/message/index.ts new file mode 100644 index 000000000..91c30beb8 --- /dev/null +++ b/src/api/im/manager/channel/message/index.ts @@ -0,0 +1,34 @@ +import request from '@/config/axios' + +export interface ImManagerChannelMessageVO { + id: number + channelId: number + channelName?: string + materialId: number + materialTitle?: string + materialCoverUrl?: string + type: number + content?: string + receiverUserIds?: number[] + sendTime?: Date +} + +export interface ImManagerChannelMessageSendReqVO { + materialId: number + receiverUserIds?: number[] +} + +// 立即推送频道消息 +export const sendManagerChannelMessage = (data: ImManagerChannelMessageSendReqVO) => { + return request.post({ url: '/im/manager/channel-message/send', data }) +} + +// 删除频道消息 +export const deleteManagerChannelMessage = (id: number) => { + return request.delete({ url: '/im/manager/channel-message/delete', params: { id } }) +} + +// 获得频道消息分页 +export const getManagerChannelMessagePage = (params: PageParam) => { + return request.get({ url: '/im/manager/channel-message/page', params }) +} diff --git a/src/api/im/manager/face/item/index.ts b/src/api/im/manager/face/item/index.ts new file mode 100644 index 000000000..7609e9fa4 --- /dev/null +++ b/src/api/im/manager/face/item/index.ts @@ -0,0 +1,46 @@ +import request from '@/config/axios' + +export interface ImManagerFacePackItemVO { + id: number + packId: number + url: string + name?: string + width: number + height: number + sort: number + status: number + createTime?: Date +} + +// 获得表情分页 +export const getManagerFacePackItemPage = (params: PageParam) => { + return request.get({ url: '/im/manager/face-pack-item/page', params }) +} + +// 获得表情详情 +export const getManagerFacePackItem = (id: number) => { + return request.get({ url: '/im/manager/face-pack-item/get', params: { id } }) +} + +// 新增表情 +export const createManagerFacePackItem = (data: ImManagerFacePackItemVO) => { + return request.post({ url: '/im/manager/face-pack-item/create', data }) +} + +// 修改表情 +export const updateManagerFacePackItem = (data: ImManagerFacePackItemVO) => { + return request.put({ url: '/im/manager/face-pack-item/update', data }) +} + +// 删除表情 +export const deleteManagerFacePackItem = (id: number) => { + return request.delete({ url: '/im/manager/face-pack-item/delete', params: { id } }) +} + +// 批量删除表情 +export const deleteManagerFacePackItemList = (ids: number[]) => { + return request.delete({ + url: '/im/manager/face-pack-item/delete-list', + params: { ids: ids.join(',') } + }) +} diff --git a/src/api/im/manager/face/pack/index.ts b/src/api/im/manager/face/pack/index.ts new file mode 100644 index 000000000..61a7c0175 --- /dev/null +++ b/src/api/im/manager/face/pack/index.ts @@ -0,0 +1,43 @@ +import request from '@/config/axios' + +export interface ImManagerFacePackVO { + id: number + name: string + icon?: string + sort: number + status: number + createTime?: Date +} + +// 获得表情包分页 +export const getManagerFacePackPage = (params: PageParam) => { + return request.get({ url: '/im/manager/face-pack/page', params }) +} + +// 获得表情包详情 +export const getManagerFacePack = (id: number) => { + return request.get({ url: '/im/manager/face-pack/get', params: { id } }) +} + +// 新增表情包 +export const createManagerFacePack = (data: ImManagerFacePackVO) => { + return request.post({ url: '/im/manager/face-pack/create', data }) +} + +// 修改表情包 +export const updateManagerFacePack = (data: ImManagerFacePackVO) => { + return request.put({ url: '/im/manager/face-pack/update', data }) +} + +// 删除表情包 +export const deleteManagerFacePack = (id: number) => { + return request.delete({ url: '/im/manager/face-pack/delete', params: { id } }) +} + +// 批量删除表情包 +export const deleteManagerFacePackList = (ids: number[]) => { + return request.delete({ + url: '/im/manager/face-pack/delete-list', + params: { ids: ids.join(',') } + }) +} diff --git a/src/api/im/manager/face/userItem/index.ts b/src/api/im/manager/face/userItem/index.ts new file mode 100644 index 000000000..becc8cf68 --- /dev/null +++ b/src/api/im/manager/face/userItem/index.ts @@ -0,0 +1,22 @@ +import request from '@/config/axios' + +export interface ImManagerFaceUserItemVO { + id: number + userId: number + userNickname?: string + url: string + name?: string + width?: number + height?: number + createTime?: Date +} + +// 获得用户表情分页 +export const getManagerFaceUserItemPage = (params: PageParam) => { + return request.get({ url: '/im/manager/face-user-item/page', params }) +} + +// 删除用户表情 +export const deleteManagerFaceUserItem = (id: number) => { + return request.delete({ url: '/im/manager/face-user-item/delete', params: { id } }) +} diff --git a/src/api/im/manager/friend/index.ts b/src/api/im/manager/friend/index.ts new file mode 100644 index 000000000..d8c4423b9 --- /dev/null +++ b/src/api/im/manager/friend/index.ts @@ -0,0 +1,23 @@ +import request from '@/config/axios' + +export interface ImManagerFriendVO { + id: number + userId: number + userNickname?: string + friendUserId: number + friendNickname?: string + displayName?: string + addSource?: number + silent: boolean + pinned: boolean + blocked: boolean + status: number + addTime?: Date + deleteTime?: Date + createTime: Date +} + +// 获得好友关系分页 +export const getManagerFriendPage = (params: PageParam) => { + return request.get({ url: '/im/manager/friend/page', params }) +} diff --git a/src/api/im/manager/friend/request/index.ts b/src/api/im/manager/friend/request/index.ts new file mode 100644 index 000000000..a6cf7e672 --- /dev/null +++ b/src/api/im/manager/friend/request/index.ts @@ -0,0 +1,21 @@ +import request from '@/config/axios' + +export interface ImManagerFriendRequestVO { + id: number + fromUserId: number + fromNickname?: string + toUserId: number + toNickname?: string + applyContent?: string + displayName?: string + addSource?: number + handleResult: number + handleContent?: string + handleTime?: Date + createTime: Date +} + +// 获得好友申请分页 +export const getManagerFriendRequestPage = (params: PageParam) => { + return request.get({ url: '/im/manager/friend-request/page', params }) +} diff --git a/src/api/im/manager/group/index.ts b/src/api/im/manager/group/index.ts new file mode 100644 index 000000000..20114a8b8 --- /dev/null +++ b/src/api/im/manager/group/index.ts @@ -0,0 +1,62 @@ +import request from '@/config/axios' + +export interface ImManagerGroupVO { + id: number + name: string + avatar?: string + notice?: string + ownerUserId: number + ownerNickname?: string + memberCount?: number + status: number + banned: boolean + mutedAll?: boolean // 是否全群禁言 + bannedReason?: string + bannedTime?: Date + dissolvedTime?: Date + createTime: Date +} + +export interface ImManagerGroupMemberVO { + userId: number + nickname?: string + avatar?: string + displayUserName?: string + groupRemark?: string + silent?: boolean + status: number + role?: number // 成员角色,参见 ImGroupMemberRole 枚举 + joinTime?: Date + quitTime?: Date + muteEndTime?: Date // 禁言到期时间 +} + +// 获得群分页 +export const getManagerGroupPage = (params: PageParam) => { + return request.get({ url: '/im/manager/group/page', params }) +} + +// 获得群详情 +export const getManagerGroup = (id: number) => { + return request.get({ url: '/im/manager/group/get', params: { id } }) +} + +// 封禁群 +export const banManagerGroup = (data: { id: number; reason: string }) => { + return request.put({ url: '/im/manager/group/ban', data }) +} + +// 解封群 +export const unbanManagerGroup = (id: number) => { + return request.put({ url: '/im/manager/group/unban', params: { id } }) +} + +// 解散群 +export const dissolveManagerGroup = (id: number) => { + return request.delete({ url: '/im/manager/group/dissolve', params: { id } }) +} + +// 获得群成员列表(含已退群成员,由前端按需过滤) +export const getManagerGroupMemberList = (groupId: number) => { + return request.get({ url: '/im/manager/group/member/list', params: { groupId } }) +} diff --git a/src/api/im/manager/group/request/index.ts b/src/api/im/manager/group/request/index.ts new file mode 100644 index 000000000..a58bdeb56 --- /dev/null +++ b/src/api/im/manager/group/request/index.ts @@ -0,0 +1,24 @@ +import request from '@/config/axios' + +export interface ImManagerGroupRequestVO { + id: number + groupId: number + groupName?: string + userId: number + userNickname?: string + inviterUserId?: number + inviterNickname?: string + applyContent?: string + addSource?: number + handleResult: number + handleUserId?: number + handleNickname?: string + handleContent?: string + handleTime?: Date + createTime: Date +} + +// 获得加群申请分页 +export const getManagerGroupRequestPage = (params: PageParam) => { + return request.get({ url: '/im/manager/group-request/page', params }) +} diff --git a/src/api/im/manager/message/group/index.ts b/src/api/im/manager/message/group/index.ts new file mode 100644 index 000000000..d56ed13c5 --- /dev/null +++ b/src/api/im/manager/message/group/index.ts @@ -0,0 +1,29 @@ +import request from '@/config/axios' + +export interface ImManagerGroupMessageVO { + id: number + clientMessageId?: string + groupId: number + groupName?: string + senderId: number + senderNickname?: string + type: number + content: string + status: number + atUserIds?: number[] + // 与 atUserIds 同长度;后端对找不到 / 已删除的成员返回 null,UI 用 `?.[idx] || userId` 回退到 userId 渲染 + atUserNicknames?: (string | null)[] + receiptStatus?: number + sendTime: Date + createTime: Date +} + +// 获得群聊消息分页 +export const getManagerGroupMessagePage = (params: PageParam) => { + return request.get({ url: '/im/manager/message/group/page', params }) +} + +// 获得群聊消息详情 +export const getManagerGroupMessage = (id: number) => { + return request.get({ url: '/im/manager/message/group/get', params: { id } }) +} diff --git a/src/api/im/manager/message/private/index.ts b/src/api/im/manager/message/private/index.ts new file mode 100644 index 000000000..3ccf70b79 --- /dev/null +++ b/src/api/im/manager/message/private/index.ts @@ -0,0 +1,25 @@ +import request from '@/config/axios' + +export interface ImManagerPrivateMessageVO { + id: number + clientMessageId?: string + senderId: number + senderNickname?: string + receiverId: number + receiverNickname?: string + type: number + content: string + status: number + sendTime: Date + createTime: Date +} + +// 获得私聊消息分页 +export const getManagerPrivateMessagePage = (params: PageParam) => { + return request.get({ url: '/im/manager/message/private/page', params }) +} + +// 获得私聊消息详情 +export const getManagerPrivateMessage = (id: number) => { + return request.get({ url: '/im/manager/message/private/get', params: { id } }) +} diff --git a/src/api/im/manager/rtc/index.ts b/src/api/im/manager/rtc/index.ts new file mode 100644 index 000000000..d5c4cc7a3 --- /dev/null +++ b/src/api/im/manager/rtc/index.ts @@ -0,0 +1,40 @@ +import request from '@/config/axios' + +export interface ImManagerRtcCallVO { + id: number + room: string + conversationType: number + mediaType: number + inviterUserId: number + inviterNickname?: string + groupId?: number + groupName?: string + status: number + endReason?: number + startTime: Date + acceptTime?: Date + endTime?: Date + createTime: Date +} + +export interface ImManagerRtcParticipantVO { + id: number + callId: number + userId: number + userNickname?: string + role: number + status: number + inviteTime: Date + acceptTime?: Date + leaveTime?: Date +} + +// 获得通话记录分页 +export const getManagerRtcCallPage = (params: PageParam) => { + return request.get({ url: '/im/manager/rtc/page', params }) +} + +// 获得通话参与者列表 +export const getManagerRtcCallParticipantList = (id: number) => { + return request.get({ url: '/im/manager/rtc/participant-list', params: { id } }) +} diff --git a/src/api/im/manager/sensitiveword/index.ts b/src/api/im/manager/sensitiveword/index.ts new file mode 100644 index 000000000..165bc76db --- /dev/null +++ b/src/api/im/manager/sensitiveword/index.ts @@ -0,0 +1,43 @@ +import request from '@/config/axios' + +export interface ImManagerSensitiveWordVO { + id: number + word: string + status: number + creator?: string + creatorName?: string + createTime?: Date +} + +// 获得敏感词分页 +export const getManagerSensitiveWordPage = (params: PageParam) => { + return request.get({ url: '/im/manager/sensitive-word/page', params }) +} + +// 获得敏感词详情 +export const getManagerSensitiveWord = (id: number) => { + return request.get({ url: '/im/manager/sensitive-word/get', params: { id } }) +} + +// 新增敏感词 +export const createManagerSensitiveWord = (data: ImManagerSensitiveWordVO) => { + return request.post({ url: '/im/manager/sensitive-word/create', data }) +} + +// 修改敏感词 +export const updateManagerSensitiveWord = (data: ImManagerSensitiveWordVO) => { + return request.put({ url: '/im/manager/sensitive-word/update', data }) +} + +// 删除敏感词 +export const deleteManagerSensitiveWord = (id: number) => { + return request.delete({ url: '/im/manager/sensitive-word/delete', params: { id } }) +} + +// 批量删除敏感词 +export const deleteManagerSensitiveWordList = (ids: number[]) => { + return request.delete({ + url: '/im/manager/sensitive-word/delete-list', + params: { ids: ids.join(',') } + }) +} diff --git a/src/api/im/manager/statistics/index.ts b/src/api/im/manager/statistics/index.ts new file mode 100644 index 000000000..10d10fe5e --- /dev/null +++ b/src/api/im/manager/statistics/index.ts @@ -0,0 +1,70 @@ +import request from '@/config/axios' + +export interface ImStatisticsOverviewVO { + totalUser: number + newUserToday: number + totalGroup: number + newGroupToday: number + activeUserDaily: number + activeUserWeekly: number + activeUserMonthly: number + privateMessageToday: number + groupMessageToday: number + privateMessageYesterday: number + groupMessageYesterday: number +} + +export interface ImStatisticsTrendVO { + dates: string[] + series: Record +} + +export interface ImStatisticsMessageTypeVO { + type: number // 参见 ImMessageTypeEnum 枚举类,由前端按 DICT_TYPE.IM_MESSAGE_TYPE 翻译 + value: number +} + +export interface ImStatisticsGroupSizeVO { + range: string + count: number +} + +export interface ImStatisticsTopSenderVO { + userId: number + nickname: string + messageCount: number +} + +// 获得 KPI 概览 +export const getStatisticsOverview = (): Promise => { + return request.get({ url: '/im/manager/statistics/overview' }) +} + +// 获得消息趋势(私聊 + 群聊双线) +export const getMessageTrend = (days: number): Promise => { + return request.get({ url: '/im/manager/statistics/message-trend', params: { days } }) +} + +// 获得用户趋势(新增注册 + 日活双线) +export const getUserTrend = (days: number): Promise => { + return request.get({ url: '/im/manager/statistics/user-trend', params: { days } }) +} + +// 获得消息类型分布(最近 30 天) +export const getMessageTypeDistribution = (): Promise => { + return request.get({ + url: '/im/manager/statistics/message-type-distribution' + }) +} + +// 获得群规模分布 +export const getGroupSizeDistribution = (): Promise => { + return request.get({ + url: '/im/manager/statistics/group-size-distribution' + }) +} + +// 获得消息 TOP 发送者(最近 30 天) +export const getTopSenders = (): Promise => { + return request.get({ url: '/im/manager/statistics/top-senders' }) +} diff --git a/src/api/im/message/channel/index.ts b/src/api/im/message/channel/index.ts new file mode 100644 index 000000000..0760a0670 --- /dev/null +++ b/src/api/im/message/channel/index.ts @@ -0,0 +1,30 @@ +import request from '@/config/axios' + +export interface ImChannelMessageRespVO { + id: number + clientMessageId?: string + channelId: number + materialId: number + type: number + content: string + /** 当前用户已读态;pull 时按 Redis 游标计算填充,多端同步使用 */ + status?: number + sendTime: string +} + +// 拉取当前用户应收的频道消息(离线增量);按 minId 游标分页 +export const pullChannelMessages = (params: { minId: number; size?: number }, signal?: AbortSignal) => { + return request.get({ + url: '/im/channel/message/pull', + params, + signal + }) +} + +// 上报频道消息已读位置;切到频道会话或拉到新消息后调 +export const readChannelMessages = (channelId: number, messageId: number) => { + return request.put({ + url: '/im/channel/message/read', + params: { channelId, messageId } + }) +} diff --git a/src/api/im/message/group/index.ts b/src/api/im/message/group/index.ts new file mode 100644 index 000000000..e8988e588 --- /dev/null +++ b/src/api/im/message/group/index.ts @@ -0,0 +1,76 @@ +import request from '@/config/axios' + +// 群聊消息 Response VO +export interface ImGroupMessageRespVO { + id: number // 消息编号 + clientMessageId: string // 客户端消息编号 + senderId: number // 发送人编号 + groupId: number // 群编号 + type: number // 消息类型 + content: string // 消息内容(JSON 格式) + status: number // 消息状态 + sendTime: string // 发送时间 + atUserIds?: number[] // @ 目标用户编号列表 + receiverUserIds?: number[] // 定向接收用户编号列表 + receiptStatus?: number // 回执状态 + readCount?: number // 已读人数(回执消息、且发送人为当前用户时有值) +} + +// 群聊消息发送 Request VO +export interface ImGroupMessageSendReqVO { + clientMessageId: string // 客户端消息编号 + groupId: number // 群编号 + type: number // 消息类型 + content: string // 消息内容(JSON 格式) + atUserIds?: number[] // @ 目标用户编号列表 + receipt?: boolean // 是否需要回执 +} + +// 群聊历史消息列表 Request VO +export interface ImGroupMessageListReqVO { + groupId: number | string // 群编号 + maxId?: number | string // 起始消息编号(不含),为空则从最新消息开始 + limit: number // 拉取数量(1 ~ 200) +} + +// 发送群聊消息 +export const sendGroupMessage = (data: ImGroupMessageSendReqVO) => { + return request.post({ url: '/im/message/group/send', data }) +} + +// 拉取群聊消息(增量) +export const pullGroupMessages = ( + params: { minId: number | string; size: number }, + signal?: AbortSignal +) => { + return request.get({ url: '/im/message/group/pull', params, signal }) +} + +// 查询群聊历史消息 +export const getGroupMessageList = (params: ImGroupMessageListReqVO) => { + return request.get({ url: '/im/message/group/list', params }) +} + +// 标记群聊消息已读 +export const readGroupMessages = (groupId: number | string, messageId: number | string) => { + return request.put({ + url: '/im/message/group/read', + params: { groupId, messageId } + }) +} + +// 撤回群聊消息 +export const recallGroupMessage = (id: number | string) => { + return request.delete({ + url: '/im/message/group/recall', + params: { id } + }) +} + +// 获取群消息已读用户列表 +export const getGroupReadUsers = (params: { + groupId: number | string + messageId: number | string +}) => { + return request.get({ url: '/im/message/group/get-read-user-ids', params }) +} diff --git a/src/api/im/message/private/index.ts b/src/api/im/message/private/index.ts new file mode 100644 index 000000000..43ee78ad6 --- /dev/null +++ b/src/api/im/message/private/index.ts @@ -0,0 +1,71 @@ +import request from '@/config/axios' + +// 私聊消息 Response VO +export interface ImPrivateMessageRespVO { + id: number // 消息编号 + clientMessageId: string // 客户端消息编号 + senderId: number // 发送人编号 + receiverId: number // 接收人编号 + type: number // 消息类型 + content: string // 消息内容(JSON 格式) + status: number // 消息状态 + sendTime: string // 发送时间 +} + +// 私聊消息发送 Request VO +export interface ImPrivateMessageSendReqVO { + clientMessageId: string // 客户端消息编号 + receiverId: number // 接收人编号 + type: number // 消息类型 + content: string // 消息内容(JSON 格式) +} + +// 私聊历史消息列表 Request VO +export interface ImPrivateMessageListReqVO { + receiverId: number | string // 接收人编号(对方) + maxId?: number | string // 起始消息编号(不含),为空则从最新消息开始 + limit: number // 拉取数量(1 ~ 200) +} + +// 发送私聊消息 +export const sendPrivateMessage = (data: ImPrivateMessageSendReqVO) => { + return request.post({ url: '/im/message/private/send', data }) +} + +// 拉取私聊消息(增量) +export const pullPrivateMessages = ( + params: { minId: number | string; size: number }, + signal?: AbortSignal +) => { + return request.get({ url: '/im/message/private/pull', params, signal }) +} + +// 查询私聊历史消息 +export const getPrivateMessageList = (params: ImPrivateMessageListReqVO) => { + return request.get({ url: '/im/message/private/list', params }) +} + +// 标记私聊消息已读 +export const readPrivateMessages = (receiverId: number | string, messageId: number | string) => { + return request.put({ + url: '/im/message/private/read', + params: { receiverId, messageId } + }) +} + +// 查询对方已读到我发的最大消息 id(多端 / 离线后用于补齐已读状态) +export const getPrivateMaxReadMessageId = (peerId: number | string, signal?: AbortSignal) => { + return request.get({ + url: '/im/message/private/max-read-message-id', + params: { peerId }, + signal + }) +} + +// 撤回私聊消息 +export const recallPrivateMessage = (id: number | string) => { + return request.delete({ + url: '/im/message/private/recall', + params: { id } + }) +} diff --git a/src/api/im/rtc/index.ts b/src/api/im/rtc/index.ts new file mode 100644 index 000000000..61b56c923 --- /dev/null +++ b/src/api/im/rtc/index.ts @@ -0,0 +1,88 @@ +import request from '@/config/axios' + +// 创建新通话请求 VO +export interface ImRtcCallCreateReqVO { + conversationType: number + mediaType: number + groupId?: number + inviteeIds: number[] // 被邀请的用户编号集合;私聊必传 1 个对端,群聊必传至少 1 人 +} + +// 通话中追加邀请请求 VO;仅群通话可用 +export interface ImRtcCallInviteReqVO { + room: string + inviteeIds: number[] +} + +// 通话会话 VO;create / join / accept / refreshToken 共用 +export interface ImRtcCallRespVO { + room: string // 业务通话编号(同时作为 LiveKit 房间名) + livekitUrl: string + token?: string // ENDED 状态时为 null(无需 connect LiveKit) + conversationType: number + mediaType: number + status: number + endReason?: number // 结束原因;仅 status=ENDED 时有值 + inviterId: number + groupId?: number + inviteeIds?: number[] + joinedUserIds?: number[] +} + +// 群活跃通话查询响应;不含 token +export interface ImRtcGroupCallRespVO { + room: string + groupId: number + mediaType: number + inviterId: number + joinedUserIds?: number[] + inviteeIds?: number[] +} + +// 创建新通话;私聊或群聊根据 conversationType 区分 +export const createCall = (data: ImRtcCallCreateReqVO) => { + return request.post({ url: '/im/rtc/create', data }) +} + +// 通话中追加邀请;仅群通话可用 +export const inviteCall = (data: ImRtcCallInviteReqVO) => { + return request.post({ url: '/im/rtc/invite', data }) +} + +// 加入已有群通话;用于胶囊条「加入」按钮 +export const joinCall = (room: string) => { + return request.post({ url: '/im/rtc/join', params: { room } }) +} + +// 接听通话 +export const acceptCall = (room: string) => { + return request.post({ url: '/im/rtc/accept', params: { room } }) +} + +// 拒绝通话 +export const rejectCall = (room: string) => { + return request.post({ url: '/im/rtc/reject', params: { room } }) +} + +// 取消邀请;主叫接通前调用 +export const cancelCall = (room: string) => { + return request.post({ url: '/im/rtc/cancel', params: { room } }) +} + +// 离开通话;接通后调用 +export const leaveCall = (room: string) => { + return request.post({ url: '/im/rtc/leave', params: { room } }) +} + +// 振铃超时检查;RUNNING 端 timer 兜底,触发后端立即扫描该 room 的超时 INVITING(接口静默) +export const noAnswerCallCheck = (room: string) => { + return request.post({ url: '/im/rtc/no-answer-call-check', params: { room } }) +} + +// 查询当前进行中的通话;目前仅群聊场景(胶囊条),返回 null 表示无活跃通话 +export const getActiveCall = (groupId: number) => { + return request.get({ + url: '/im/rtc/get-active-call', + params: { groupId } + }) +} diff --git a/src/api/system/dept/index.ts b/src/api/system/dept/index.ts index c0959f409..0d4baec2a 100644 --- a/src/api/system/dept/index.ts +++ b/src/api/system/dept/index.ts @@ -10,6 +10,7 @@ export interface DeptVO { phone: string email: string createTime: Date + children?: DeptVO[] } // 查询部门(精简)列表 diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts index e92a24ae6..efdae02ec 100644 --- a/src/api/system/user/index.ts +++ b/src/api/system/user/index.ts @@ -5,6 +5,7 @@ export interface UserVO { username: string nickname: string deptId: number + deptName?: string postIds: string[] email: string mobile: string @@ -15,7 +16,24 @@ export interface UserVO { remark: string loginDate: Date createTime: Date - disabled?: boolean +} + +// 获取用户精简信息列表 +export const getSimpleUserList = (): Promise => { + return request.get({ url: '/system/user/simple-list' }) +} + +// 按用户编号查询用户精简信息(点头像弹名片) +export const getSimpleUser = (id: number | string) => { + return request.get({ url: '/system/user/get-simple', params: { id } }) +} + +// 按昵称模糊搜索用户(加好友) +export const getSimpleUserListByNickname = (nickname: string) => { + return request.get({ + url: '/system/user/list-by-nickname', + params: { nickname } + }) } // 查询用户管理列表 @@ -80,8 +98,3 @@ export const updateUserStatus = (id: number, status: number) => { } return request.put({ url: '/system/user/update-status', data: data }) } - -// 获取用户精简信息列表 -export const getSimpleUserList = (): Promise => { - return request.get({ url: '/system/user/simple-list' }) -} diff --git a/src/assets/audio/im/message-tip.mp3 b/src/assets/audio/im/message-tip.mp3 new file mode 100644 index 000000000..5f317dcd4 Binary files /dev/null and b/src/assets/audio/im/message-tip.mp3 differ diff --git a/src/components/FormCreate/src/components/useApiSelect.tsx b/src/components/FormCreate/src/components/useApiSelect.tsx index 847eb077c..98466c32b 100644 --- a/src/components/FormCreate/src/components/useApiSelect.tsx +++ b/src/components/FormCreate/src/components/useApiSelect.tsx @@ -2,7 +2,7 @@ import request from '@/config/axios' import { isEmpty } from '@/utils/is' import { ApiSelectProps } from '@/components/FormCreate/src/type' import { jsonParse } from '@/utils' -import { useUserStoreWithOut } from '@/store/modules/user' +import { getCurrentUserId } from '@/utils/auth' export const useApiSelect = (option: ApiSelectProps) => { return defineComponent({ @@ -99,9 +99,7 @@ export const useApiSelect = (option: ApiSelectProps) => { } // 获取当前用户 ID - const userStore = useUserStoreWithOut() - const user = userStore.getUser - const currentUserId = user?.id + const currentUserId = getCurrentUserId() if (currentUserId) { // 根据多选/单选模式设置默认值 const defaultValue = props.multiple ? [currentUserId] : currentUserId diff --git a/src/layout/components/Message/src/Message.vue b/src/layout/components/Message/src/Message.vue index d33b3b640..d4fe8e28c 100644 --- a/src/layout/components/Message/src/Message.vue +++ b/src/layout/components/Message/src/Message.vue @@ -89,6 +89,22 @@ onMounted(() => { diff --git a/src/views/im/home/components/ToolBar.vue b/src/views/im/home/components/ToolBar.vue new file mode 100644 index 000000000..b9647465a --- /dev/null +++ b/src/views/im/home/components/ToolBar.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/src/views/im/home/components/card/CardBubble.vue b/src/views/im/home/components/card/CardBubble.vue new file mode 100644 index 000000000..b41e73fb3 --- /dev/null +++ b/src/views/im/home/components/card/CardBubble.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/views/im/home/components/card/CardLineLabel.vue b/src/views/im/home/components/card/CardLineLabel.vue new file mode 100644 index 000000000..eb265f791 --- /dev/null +++ b/src/views/im/home/components/card/CardLineLabel.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/views/im/home/components/friend/FriendAddDialog.vue b/src/views/im/home/components/friend/FriendAddDialog.vue new file mode 100644 index 000000000..d2b6d92fa --- /dev/null +++ b/src/views/im/home/components/friend/FriendAddDialog.vue @@ -0,0 +1,286 @@ + + + diff --git a/src/views/im/home/components/friend/FriendItem.vue b/src/views/im/home/components/friend/FriendItem.vue new file mode 100644 index 000000000..7fdd85b76 --- /dev/null +++ b/src/views/im/home/components/friend/FriendItem.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/views/im/home/components/group/GroupAdminSetDialog.vue b/src/views/im/home/components/group/GroupAdminSetDialog.vue new file mode 100644 index 000000000..93f5e527d --- /dev/null +++ b/src/views/im/home/components/group/GroupAdminSetDialog.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/src/views/im/home/components/group/GroupAvatar.vue b/src/views/im/home/components/group/GroupAvatar.vue new file mode 100644 index 000000000..fd5164ce3 --- /dev/null +++ b/src/views/im/home/components/group/GroupAvatar.vue @@ -0,0 +1,128 @@ + + + diff --git a/src/views/im/home/components/group/GroupCreateDialog.vue b/src/views/im/home/components/group/GroupCreateDialog.vue new file mode 100644 index 000000000..2a9bfeb75 --- /dev/null +++ b/src/views/im/home/components/group/GroupCreateDialog.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/src/views/im/home/components/group/GroupInfo.vue b/src/views/im/home/components/group/GroupInfo.vue new file mode 100644 index 000000000..bb3a17508 --- /dev/null +++ b/src/views/im/home/components/group/GroupInfo.vue @@ -0,0 +1,141 @@ + + + diff --git a/src/views/im/home/components/group/GroupInfoCard.vue b/src/views/im/home/components/group/GroupInfoCard.vue new file mode 100644 index 000000000..5d12afdee --- /dev/null +++ b/src/views/im/home/components/group/GroupInfoCard.vue @@ -0,0 +1,104 @@ + + + diff --git a/src/views/im/home/components/group/GroupItem.vue b/src/views/im/home/components/group/GroupItem.vue new file mode 100644 index 000000000..fc5fe13fe --- /dev/null +++ b/src/views/im/home/components/group/GroupItem.vue @@ -0,0 +1,42 @@ + + + diff --git a/src/views/im/home/components/group/GroupMember.vue b/src/views/im/home/components/group/GroupMember.vue new file mode 100644 index 000000000..874786b2b --- /dev/null +++ b/src/views/im/home/components/group/GroupMember.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/views/im/home/components/group/GroupMemberAddDialog.vue b/src/views/im/home/components/group/GroupMemberAddDialog.vue new file mode 100644 index 000000000..b3b795def --- /dev/null +++ b/src/views/im/home/components/group/GroupMemberAddDialog.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/src/views/im/home/components/group/GroupMemberGrid.vue b/src/views/im/home/components/group/GroupMemberGrid.vue new file mode 100644 index 000000000..e38580e39 --- /dev/null +++ b/src/views/im/home/components/group/GroupMemberGrid.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/views/im/home/components/group/GroupMemberItem.vue b/src/views/im/home/components/group/GroupMemberItem.vue new file mode 100644 index 000000000..9e01eb93b --- /dev/null +++ b/src/views/im/home/components/group/GroupMemberItem.vue @@ -0,0 +1,81 @@ + + + diff --git a/src/views/im/home/components/group/GroupMemberRemoveDialog.vue b/src/views/im/home/components/group/GroupMemberRemoveDialog.vue new file mode 100644 index 000000000..6339349c3 --- /dev/null +++ b/src/views/im/home/components/group/GroupMemberRemoveDialog.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/views/im/home/components/group/GroupMuteMemberDialog.vue b/src/views/im/home/components/group/GroupMuteMemberDialog.vue new file mode 100644 index 000000000..35f0b1aac --- /dev/null +++ b/src/views/im/home/components/group/GroupMuteMemberDialog.vue @@ -0,0 +1,97 @@ + + + diff --git a/src/views/im/home/components/group/GroupOwnerTransferDialog.vue b/src/views/im/home/components/group/GroupOwnerTransferDialog.vue new file mode 100644 index 000000000..80caed5a6 --- /dev/null +++ b/src/views/im/home/components/group/GroupOwnerTransferDialog.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/views/im/home/components/group/GroupRequestListDialog.vue b/src/views/im/home/components/group/GroupRequestListDialog.vue new file mode 100644 index 000000000..dcb19f6d2 --- /dev/null +++ b/src/views/im/home/components/group/GroupRequestListDialog.vue @@ -0,0 +1,361 @@ + + + + + + + diff --git a/src/views/im/home/components/picker/ConversationPickerPanel.vue b/src/views/im/home/components/picker/ConversationPickerPanel.vue new file mode 100644 index 000000000..86da0cb06 --- /dev/null +++ b/src/views/im/home/components/picker/ConversationPickerPanel.vue @@ -0,0 +1,370 @@ + + + + + diff --git a/src/views/im/home/components/picker/FriendPickerPanel.vue b/src/views/im/home/components/picker/FriendPickerPanel.vue new file mode 100644 index 000000000..f613cd033 --- /dev/null +++ b/src/views/im/home/components/picker/FriendPickerPanel.vue @@ -0,0 +1,244 @@ + + + diff --git a/src/views/im/home/components/picker/GroupMemberPickerPanel.vue b/src/views/im/home/components/picker/GroupMemberPickerPanel.vue new file mode 100644 index 000000000..101dd79b6 --- /dev/null +++ b/src/views/im/home/components/picker/GroupMemberPickerPanel.vue @@ -0,0 +1,243 @@ + + + + diff --git a/src/views/im/home/components/picker/picker-dialog.scss b/src/views/im/home/components/picker/picker-dialog.scss new file mode 100644 index 000000000..7f9943a8e --- /dev/null +++ b/src/views/im/home/components/picker/picker-dialog.scss @@ -0,0 +1,13 @@ +// IM 选择类弹窗的公共样式 mixin +// 每个业务壳在自己的 diff --git a/src/views/im/home/components/rtc/RtcCallParticipantTile.vue b/src/views/im/home/components/rtc/RtcCallParticipantTile.vue new file mode 100644 index 000000000..98ef36ce7 --- /dev/null +++ b/src/views/im/home/components/rtc/RtcCallParticipantTile.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/views/im/home/components/rtc/RtcCallRunning.vue b/src/views/im/home/components/rtc/RtcCallRunning.vue new file mode 100644 index 000000000..1b8714071 --- /dev/null +++ b/src/views/im/home/components/rtc/RtcCallRunning.vue @@ -0,0 +1,289 @@ + + + + + diff --git a/src/views/im/home/components/rtc/RtcGroupCallBanner.vue b/src/views/im/home/components/rtc/RtcGroupCallBanner.vue new file mode 100644 index 000000000..1a3509bbb --- /dev/null +++ b/src/views/im/home/components/rtc/RtcGroupCallBanner.vue @@ -0,0 +1,172 @@ + + + diff --git a/src/views/im/home/components/user/RecommendCardDialog.vue b/src/views/im/home/components/user/RecommendCardDialog.vue new file mode 100644 index 000000000..5a35af056 --- /dev/null +++ b/src/views/im/home/components/user/RecommendCardDialog.vue @@ -0,0 +1,313 @@ + + + + + diff --git a/src/views/im/home/components/user/UserAvatar.vue b/src/views/im/home/components/user/UserAvatar.vue new file mode 100644 index 000000000..61b424b06 --- /dev/null +++ b/src/views/im/home/components/user/UserAvatar.vue @@ -0,0 +1,129 @@ + + + diff --git a/src/views/im/home/components/user/UserInfo.vue b/src/views/im/home/components/user/UserInfo.vue new file mode 100644 index 000000000..c12619fc9 --- /dev/null +++ b/src/views/im/home/components/user/UserInfo.vue @@ -0,0 +1,453 @@ + + + + + diff --git a/src/views/im/home/components/user/UserInfoCard.vue b/src/views/im/home/components/user/UserInfoCard.vue new file mode 100644 index 000000000..6d62f9f9d --- /dev/null +++ b/src/views/im/home/components/user/UserInfoCard.vue @@ -0,0 +1,120 @@ + + + diff --git a/src/views/im/home/composables/useFriendBuckets.ts b/src/views/im/home/composables/useFriendBuckets.ts new file mode 100644 index 000000000..2f592e941 --- /dev/null +++ b/src/views/im/home/composables/useFriendBuckets.ts @@ -0,0 +1,98 @@ +import { computed, type ComputedRef, type Ref } from 'vue' + +import type { FriendLite } from '../types' + +/** 字母分桶结果:letter 取 'A'-'Z' 或兜底 '#';list 桶内按拼音 / 名字自然序 */ +export interface FriendBucket { + letter: string + list: FriendLite[] +} + +/** 取分桶 / 排序键:备注拼音优先 → 昵称拼音 → 名字本身(兜底英文 / 数字) */ +function getSortKey(friend: FriendLite): string { + return ( + friend.displayNamePinyin || + friend.nicknamePinyin || + (friend.displayName || friend.nickname || '').toLowerCase() + ) +} + +/** 取分桶字母:拼音首字母大写,非字母(纯符号 / 数字 / 中文)兜底 '#' */ +function getBucketLetter(friend: FriendLite): string { + const first = getSortKey(friend).charAt(0) + return /^[a-zA-Z]$/.test(first) ? first.toUpperCase() : '#' +} + +/** 拼音首字母拼接:「lao zhang」→ 'lz',支持「输 lz 搜老张」 */ +function pinyinInitials(pinyin?: string): string { + if (!pinyin) { + return '' + } + return pinyin + .split(' ') + .map((word) => word.charAt(0)) + .join('') +} + +/** + * 好友列表的搜索 + 字母分桶 + * + * - 搜索匹配:备注 / 昵称 / 全拼(去空格)/ 首字母任一命中 + * - 分桶规则:A-Z + '#' 兜底,桶内按 getSortKey 自然序 + * + * 通讯录页 FriendList 与选择类弹窗 FriendPickerPanel 共用,避免规则各自实现走偏 + */ +export function useFriendBuckets( + friends: Ref | ComputedRef, + keyword: Ref +): { + filtered: ComputedRef + buckets: ComputedRef +} { + const filtered = computed(() => { + const keywordLower = keyword.value.trim().toLowerCase() + if (!keywordLower) { + return friends.value + } + return friends.value.filter((friend) => { + const nicknamePinyin = friend.nicknamePinyin || '' + const displayNamePinyin = friend.displayNamePinyin || '' + // 全拼搜索去掉空格,让「laozhang」也能命中「lao zhang」 + return ( + (friend.nickname || '').toLowerCase().includes(keywordLower) || + (friend.displayName || '').toLowerCase().includes(keywordLower) || + nicknamePinyin.replace(/\s/g, '').includes(keywordLower) || + displayNamePinyin.replace(/\s/g, '').includes(keywordLower) || + pinyinInitials(nicknamePinyin).includes(keywordLower) || + pinyinInitials(displayNamePinyin).includes(keywordLower) + ) + }) + }) + + const buckets = computed(() => { + const map = new Map() + for (const friend of filtered.value) { + const letter = getBucketLetter(friend) + if (!map.has(letter)) { + map.set(letter, []) + } + map.get(letter)!.push(friend) + } + const letters = Array.from(map.keys()).sort((a, b) => { + // '#' 永远排末尾,A-Z 走 localeCompare + if (a === '#') { + return 1 + } + if (b === '#') { + return -1 + } + return a.localeCompare(b) + }) + return letters.map((letter) => ({ + letter, + list: map.get(letter)!.sort((a, b) => getSortKey(a).localeCompare(getSortKey(b))) + })) + }) + + return { filtered, buckets } +} diff --git a/src/views/im/home/composables/useGroupCallMembers.ts b/src/views/im/home/composables/useGroupCallMembers.ts new file mode 100644 index 000000000..78def6a73 --- /dev/null +++ b/src/views/im/home/composables/useGroupCallMembers.ts @@ -0,0 +1,52 @@ +import { computed, type ComputedRef, type Ref } from 'vue' +import { useRtcStore } from '../store/rtcStore' +import { ImConversationType } from '../../utils/constants' +import { getSenderAvatar, getSenderDisplayName } from '../../utils/user' + +/** 群通话成员视图模型:已加入 + 接入中;pending 头像 UI 半透明,joined 不透明 */ +export interface GroupCallMember { + userId: number + nickname: string + avatar?: string + pending: boolean +} + +/** + * 群通话成员列表 computed:joined 在前,未 joined 的 invitee 在后; + * 缓存为空(来电首屏渲染早于 syncGroupActiveCall 回写)时用 fallback 主叫兜底,避免空白 + * + * @param groupId 群编号 + * @param fallbackInviterId 兜底主叫;缓存为空时填一个头像,标记为已加入而非 pending + */ +export function useGroupCallMembers( + groupId: Ref, + fallbackInviterId?: Ref +): ComputedRef { + const rtcStore = useRtcStore() + return computed(() => { + const gid = groupId.value + if (!gid) { + return [] + } + const groupCall = rtcStore.getGroupCall(gid) + const joinedIds = groupCall?.joinedUserIds ?? [] + const inviteeIds = groupCall?.inviteeIds ?? [] + const joinedSet = new Set(joinedIds) + const orderedIds = [...joinedIds, ...inviteeIds.filter((id) => !joinedSet.has(id))] + if (orderedIds.length > 0) { + return orderedIds.map((userId) => toVM(userId, gid, !joinedSet.has(userId))) + } + const fallback = fallbackInviterId?.value + return fallback ? [toVM(fallback, gid, false)] : [] + }) +} + +/** 把 userId 翻译成视图模型,统一走 user.ts helper 解析昵称 / 头像 */ +function toVM(userId: number, groupId: number, pending: boolean): GroupCallMember { + return { + userId, + nickname: getSenderDisplayName(userId, ImConversationType.GROUP, groupId), + avatar: getSenderAvatar(userId, ImConversationType.GROUP, groupId) || undefined, + pending + } +} diff --git a/src/views/im/home/composables/useLiveKitRoom.ts b/src/views/im/home/composables/useLiveKitRoom.ts new file mode 100644 index 000000000..b061ae25d --- /dev/null +++ b/src/views/im/home/composables/useLiveKitRoom.ts @@ -0,0 +1,330 @@ +import { computed, ref, shallowRef } from 'vue' +import { + Room, + RoomEvent, + ConnectionQuality, + Track, + VideoPresets, + type LocalParticipant, + type Participant, + type RemoteParticipant +} from 'livekit-client' + +type ParticipantEventHandler = (userId: number) => void + +/** LiveKit Room 连接 / 设备 / 事件的薄封装;UI 组件只关心响应式状态 */ +export function useLiveKitRoom() { + /** Room 实例;模块内部状态,不对外暴露,避免调用方误写 */ + const _room = shallowRef(null) + /** 只读 room 引用;调用方仅用于幂等判定 */ + const room = computed(() => _room.value) + /** 本地参与者;连接成功后赋值 */ + const localParticipant = shallowRef(null) + /** 远端参与者列表;ParticipantConnected / Disconnected 时刷新;shallowRef 避免 Vue 深度代理 SDK class 内部 */ + const remoteParticipants = shallowRef([]) + /** 连接状态 */ + const isConnected = ref(false) + /** 连接质量 */ + const connectionQuality = ref(ConnectionQuality.Unknown) + /** 麦克风开关 */ + const micEnabled = ref(true) + /** 摄像头开关 */ + const cameraEnabled = ref(false) + /** 扬声器开关;浏览器无系统级 API,通过 audio 元素 muted 属性实现远端音频静音 */ + const speakerEnabled = ref(true) + /** 屏幕共享开关 */ + const screenShareEnabled = ref(false) + /** 当前是否处于「重连中」;瞬断时 UI 显示提示而不强制结束通话 */ + const reconnecting = ref(false) + /** 远端断开订阅者;通话结束时统一清空 */ + const disconnectedHandlers = new Set<() => void>() + /** 房内某人加入订阅者;主叫端用于从 INVITING 切到 RUNNING */ + const participantConnectedHandlers = new Set() + /** 房内某人离开订阅者;用于把 userId 标记为「已退出」从 pending 占位中移除 */ + const participantDisconnectedHandlers = new Set() + + /** 同步远端参与者列表到响应式数组 */ + function syncRemotes(r: Room) { + remoteParticipants.value = Array.from(r.remoteParticipants.values()) + } + + /** 连接 LiveKit Server;audio / video 控制初始默认开关 */ + async function connect(url: string, token: string, opts: { audio?: boolean; video?: boolean }) { + // 新连接前先断开旧 Room;保留本次注册的事件回调 + if (_room.value) { + await disconnectRoom(false) + } + const r = new Room({ + // 按格子尺寸自动选 simulcast 层 + adaptiveStream: true, + // 未订阅的层动态停发,节省上行 + dynacast: true, + // 采集分辨率 720p,确保大格子清晰 + videoCaptureDefaults: { + resolution: VideoPresets.h720.resolution + }, + // 发布编码上限 1.5 Mbps / 30fps;保留默认 simulcast 三层(180p / 360p / 720p) + publishDefaults: { + videoEncoding: { + maxBitrate: 1_500_000, + maxFramerate: 30, + priority: 'high' + }, + // 屏幕共享码率 3 Mbps,文字界面清晰 + screenShareEncoding: { + maxBitrate: 3_000_000, + maxFramerate: 15, + priority: 'medium' + } + } + }) + _room.value = r + + r.on(RoomEvent.ParticipantConnected, (rp) => { + syncRemotes(r) + const userId = parseUserId(rp.identity) + if (userId != null) { + participantConnectedHandlers.forEach((cb) => cb(userId)) + } + }) + .on(RoomEvent.ParticipantDisconnected, (rp) => { + syncRemotes(r) + // 离开的参与者缓存清掉,避免下次同 sid 重连命中失效引用 + for (const key of Array.from(streamCache.keys())) { + if (key.startsWith(`${rp.sid}:`)) { + streamCache.delete(key) + } + } + const userId = parseUserId(rp.identity) + if (userId != null) { + participantDisconnectedHandlers.forEach((cb) => cb(userId)) + } + }) + .on(RoomEvent.TrackSubscribed, () => syncRemotes(r)) + .on(RoomEvent.TrackUnsubscribed, () => syncRemotes(r)) + // mute / unmute 让 pickStream 的 isMuted 短路重算,video 元素能解绑 srcObject 而不是卡最后一帧 + .on(RoomEvent.TrackMuted, () => syncRemotes(r)) + .on(RoomEvent.TrackUnmuted, () => syncRemotes(r)) + .on(RoomEvent.ConnectionQualityChanged, (quality) => { + connectionQuality.value = quality + }) + // 瞬断 → 显示「重连中」;不关通话窗,由 SDK 内部重连机制恢复 + .on(RoomEvent.Reconnecting, () => { + reconnecting.value = true + }) + .on(RoomEvent.Reconnected, () => { + reconnecting.value = false + }) + // 重连失败 / 主动断 / 被踢时触发清理 + .on(RoomEvent.Disconnected, () => { + isConnected.value = false + reconnecting.value = false + disconnectedHandlers.forEach((cb) => cb()) + }) + + // 预热 getUserMedia 与 WebSocket 握手并行,省 100~300ms 串行延迟; + // 拿到的 stream 仅用于触发权限弹窗 + 设备就绪,握手完成后由 LiveKit 内部重新请求设备发布轨 + const warmup = prewarmMedia(opts) + // 建立 WebSocket 信令 + WebRTC 媒体通道;完成后 localParticipant 可用,已在房参与者会通过 ParticipantConnected 事件批量推送 + await r.connect(url, token) + // 期间被外部 disconnect 替换;中止后续 publish,避免摄像头被重新启用 + if (_room.value !== r) { + return + } + localParticipant.value = r.localParticipant + isConnected.value = true + + // 预热结果不直接发布(避免 SDK 与外部 track 生命周期纠缠),仅等待权限就绪后再走标准 setXxxEnabled + await warmup + if (_room.value !== r) { + return + } + // 麦克风与摄像头权限相互独立,并行启用发布 + const inits: Promise[] = [] + if (opts.audio) { + inits.push(r.localParticipant.setMicrophoneEnabled(true)) + } + if (opts.video) { + inits.push(r.localParticipant.setCameraEnabled(true)) + } + if (inits.length > 0) { + await Promise.all(inits) + } + micEnabled.value = !!opts.audio + cameraEnabled.value = !!opts.video + + // 兜底同步一次远端列表:r.connect 期间 ParticipantConnected 事件可能在 handler 绑定前触发被吞,导致首屏漏人 + syncRemotes(r) + } + + /** 提前触发权限弹窗 + 设备唤起,串行延迟在 r.connect 期间一起跑;失败静默(连接后会再试一次) */ + async function prewarmMedia(opts: { audio?: boolean; video?: boolean }): Promise { + if (!opts.audio && !opts.video) { + return + } + try { + const stream = await navigator.mediaDevices.getUserMedia({ + audio: !!opts.audio, + video: !!opts.video + }) + // 拿到权限即可,立即停掉所有 track 释放设备;正式发布走 SDK 流程重新请求 + stream.getTracks().forEach((t) => t.stop()) + } catch { + // 用户拒绝 / 设备占用等异常,交给后续 setXxxEnabled 再次尝试报错 + } + } + + /** 切麦克风 */ + async function setMicEnabled(enabled: boolean) { + if (!_room.value) { + return + } + await _room.value.localParticipant.setMicrophoneEnabled(enabled) + micEnabled.value = enabled + } + + /** 切摄像头 */ + async function setCameraEnabled(enabled: boolean) { + if (!_room.value) { + return + } + await _room.value.localParticipant.setCameraEnabled(enabled) + cameraEnabled.value = enabled + } + + /** 切扬声器;仅切响应式状态,实际静音由模板上 audio 元素 :muted 绑定生效 */ + function setSpeakerEnabled(enabled: boolean) { + speakerEnabled.value = enabled + } + + /** + * 切屏幕共享; + * + * 浏览器会弹原生「选择共享内容」对话框,用户在弹窗里点取消时 setScreenShareEnabled 会抛错,捕获并把状态复位回 SDK 的实际值 + */ + async function setScreenShareEnabled(enabled: boolean) { + if (!_room.value) return + try { + await _room.value.localParticipant.setScreenShareEnabled(enabled) + screenShareEnabled.value = enabled + } catch (e) { + // 用户在浏览器原生对话框里取消选择,不当作错误 + screenShareEnabled.value = _room.value.localParticipant.isScreenShareEnabled + throw e + } + } + + /** 注册「远端连接异常断开」回调;返回反注册函数 */ + function onDisconnected(cb: () => void): () => void { + disconnectedHandlers.add(cb) + return () => disconnectedHandlers.delete(cb) + } + + /** 注册「房内某人加入」回调;返回反注册函数 */ + function onParticipantConnected(cb: ParticipantEventHandler): () => void { + participantConnectedHandlers.add(cb) + return () => participantConnectedHandlers.delete(cb) + } + + /** 注册「房内某人离开」回调;返回反注册函数 */ + function onParticipantDisconnected(cb: ParticipantEventHandler): () => void { + participantDisconnectedHandlers.add(cb) + return () => participantDisconnectedHandlers.delete(cb) + } + + /** identity 是后端签 token 时塞的 userId 字符串,转 number 返回;非数字(兼容性兜底)返回 null */ + function parseUserId(identity: string): number | null { + const id = Number(identity) + return Number.isNaN(id) ? null : id + } + + /** + * MediaStream 缓存;key 为 `${participantSid}:${source}`,value 为 `{ track, stream }`; + * 同一条 MediaStreamTrack 复用同一个 MediaStream,避免