allow open rpc port in gui normal mode (#1795)

* allow open rpc port for gui normal mode
* downgrade dev tool console
This commit is contained in:
KKRainbow
2026-01-16 11:12:32 +08:00
committed by GitHub
parent 53264f67bf
commit 005b321f62
11 changed files with 295 additions and 117 deletions
Generated
+1
View File
@@ -2326,6 +2326,7 @@ dependencies = [
"tauri-plugin-vpnservice", "tauri-plugin-vpnservice",
"thunk-rs", "thunk-rs",
"tokio", "tokio",
"url",
"uuid", "uuid",
"winapi", "winapi",
"windows 0.52.0", "windows 0.52.0",
+1 -1
View File
@@ -54,7 +54,7 @@
"unplugin-vue-router": "^0.10.8", "unplugin-vue-router": "^0.10.8",
"uuid": "^10.0.0", "uuid": "^10.0.0",
"vite": "^5.4.8", "vite": "^5.4.8",
"vite-plugin-vue-devtools": "^8.0.5", "vite-plugin-vue-devtools": "^7.4.6",
"vite-plugin-vue-layouts": "^0.11.0", "vite-plugin-vue-layouts": "^0.11.0",
"vue-i18n": "^10.0.0", "vue-i18n": "^10.0.0",
"vue-tsc": "^2.1.10" "vue-tsc": "^2.1.10"
+2
View File
@@ -57,6 +57,8 @@ tauri-plugin-os = "2.3.0"
uuid = "1.17.0" uuid = "1.17.0"
async-trait = "0.1.89" async-trait = "0.1.89"
url = { version = "2.5", features = ["serde"] }
[target.'cfg(target_os = "windows")'.dependencies] [target.'cfg(target_os = "windows")'.dependencies]
windows = { version = "0.52", features = ["Win32_Foundation", "Win32_UI_Shell", "Win32_UI_WindowsAndMessaging"] } windows = { version = "0.52", features = ["Win32_Foundation", "Win32_UI_Shell", "Win32_UI_WindowsAndMessaging"] }
winapi = { version = "0.3.9", features = ["securitybaseapi", "processthreadsapi"] } winapi = { version = "0.3.9", features = ["securitybaseapi", "processthreadsapi"] }
+88 -25
View File
@@ -19,11 +19,13 @@ use easytier::{
launcher::NetworkConfig, launcher::NetworkConfig,
rpc_service::ApiRpcServer, rpc_service::ApiRpcServer,
tunnel::ring::RingTunnelListener, tunnel::ring::RingTunnelListener,
tunnel::tcp::TcpTunnelListener,
tunnel::TunnelListener,
utils::{self}, utils::{self},
}; };
use std::ops::Deref; use std::ops::Deref;
use std::sync::Arc; use std::sync::Arc;
use tokio::sync::{RwLock, RwLockReadGuard}; use tokio::sync::{Mutex, RwLock, RwLockReadGuard};
use uuid::Uuid; use uuid::Uuid;
use tauri::{AppHandle, Emitter, Manager as _}; use tauri::{AppHandle, Emitter, Manager as _};
@@ -40,8 +42,21 @@ static RPC_RING_UUID: once_cell::sync::Lazy<uuid::Uuid> =
static CLIENT_MANAGER: once_cell::sync::Lazy<RwLock<Option<manager::GUIClientManager>>> = static CLIENT_MANAGER: once_cell::sync::Lazy<RwLock<Option<manager::GUIClientManager>>> =
once_cell::sync::Lazy::new(|| RwLock::new(None)); once_cell::sync::Lazy::new(|| RwLock::new(None));
static RING_RPC_SERVER: once_cell::sync::Lazy<RwLock<Option<ApiRpcServer<RingTunnelListener>>>> = type BoxedTunnelListener = Box<dyn TunnelListener>;
once_cell::sync::Lazy::new(|| RwLock::new(None));
#[derive(Clone, Copy, PartialEq, Eq)]
enum RpcServerKind {
Ring,
Tcp,
}
struct RpcServer {
kind: RpcServerKind,
_server: ApiRpcServer<BoxedTunnelListener>,
bind_url: Option<url::Url>,
}
static RPC_SERVER: once_cell::sync::Lazy<Mutex<Option<RpcServer>>> =
once_cell::sync::Lazy::new(|| Mutex::new(None));
static WEB_CLIENT: once_cell::sync::Lazy<RwLock<Option<WebClient>>> = static WEB_CLIENT: once_cell::sync::Lazy<RwLock<Option<WebClient>>> =
once_cell::sync::Lazy::new(|| RwLock::new(None)); once_cell::sync::Lazy::new(|| RwLock::new(None));
@@ -322,8 +337,25 @@ fn get_service_status() -> Result<&'static str, String> {
} }
} }
fn normalize_normal_mode_rpc_portal(portal: &str) -> Result<(url::Url, url::Url), String> {
let portal_url: url::Url = portal
.parse()
.map_err(|e| format!("invalid rpc portal: {:#}", e))?;
let bind_url = portal_url.clone();
let mut connect_url = portal_url.clone();
// if bind addr is 0.0.0.0, should convert to 127.0.0.1
if connect_url.host_str() == Some("0.0.0.0") {
connect_url.set_host(Some("127.0.0.1")).unwrap();
}
Ok((bind_url, connect_url))
}
#[tauri::command] #[tauri::command]
async fn init_rpc_connection(_app: AppHandle, url: Option<String>) -> Result<(), String> { async fn init_rpc_connection(
_app: AppHandle,
is_normal_mode: bool,
url: Option<String>,
) -> Result<(), String> {
let mut client_manager_guard = let mut client_manager_guard =
tokio::time::timeout(std::time::Duration::from_secs(5), CLIENT_MANAGER.write()) tokio::time::timeout(std::time::Duration::from_secs(5), CLIENT_MANAGER.write())
.await .await
@@ -331,41 +363,72 @@ async fn init_rpc_connection(_app: AppHandle, url: Option<String>) -> Result<(),
let mut instance_manager_guard = INSTANCE_MANAGER let mut instance_manager_guard = INSTANCE_MANAGER
.try_write() .try_write()
.map_err(|_| "Failed to acquire write lock for instance manager")?; .map_err(|_| "Failed to acquire write lock for instance manager")?;
let mut ring_rpc_server_guard = RING_RPC_SERVER let mut rpc_server_guard = RPC_SERVER
.try_write() .try_lock()
.map_err(|_| "Failed to acquire write lock for ring rpc server")?; .map_err(|_| "Failed to acquire lock for rpc server")?;
let normal_mode = url.is_none(); let mut client_url = url.clone();
if normal_mode { if is_normal_mode {
let instance_manager = if let Some(im) = instance_manager_guard.take() { let instance_manager = if let Some(im) = instance_manager_guard.take() {
im im
} else { } else {
Arc::new(NetworkInstanceManager::new()) Arc::new(NetworkInstanceManager::new())
}; };
let rpc_server = if let Some(rpc_server) = ring_rpc_server_guard.take() {
rpc_server let portal = url.and_then(|s| {
let trimmed = s.trim().to_string();
if trimmed.is_empty() {
None
} else {
Some(trimmed)
}
});
let (desired_kind, bind_url, connect_url) = if let Some(portal) = portal {
let (bind_url, connect_url) = normalize_normal_mode_rpc_portal(&portal)?;
(RpcServerKind::Tcp, Some(bind_url), Some(connect_url))
} else { } else {
ApiRpcServer::from_tunnel( (RpcServerKind::Ring, None, None)
RingTunnelListener::new(
format!("ring://{}", RPC_RING_UUID.deref()).parse().unwrap(),
),
instance_manager.clone(),
)
.with_rx_timeout(None)
.serve()
.await
.map_err(|e| e.to_string())?
}; };
let need_restart = rpc_server_guard
.as_ref()
.map(|x| x.kind != desired_kind || x.bind_url != bind_url)
.unwrap_or(true);
if need_restart {
*rpc_server_guard = None;
let tunnel: BoxedTunnelListener = match desired_kind {
RpcServerKind::Ring => Box::new(RingTunnelListener::new(
format!("ring://{}", RPC_RING_UUID.deref()).parse().unwrap(),
)),
RpcServerKind::Tcp => Box::new(TcpTunnelListener::new(
bind_url.clone().expect("tcp rpc must have bind url"),
)),
};
let rpc_server = ApiRpcServer::from_tunnel(tunnel, instance_manager.clone())
.with_rx_timeout(None)
.serve()
.await
.map_err(|e| e.to_string())?;
*rpc_server_guard = Some(RpcServer {
kind: desired_kind,
_server: rpc_server,
bind_url,
});
}
*instance_manager_guard = Some(instance_manager); *instance_manager_guard = Some(instance_manager);
*ring_rpc_server_guard = Some(rpc_server); client_url = connect_url.map(|u| u.to_string());
} else { } else {
*ring_rpc_server_guard = None; *rpc_server_guard = None;
} }
let client_manager = tokio::time::timeout( let client_manager = tokio::time::timeout(
std::time::Duration::from_millis(1000), std::time::Duration::from_millis(1000),
manager::GUIClientManager::new(url), manager::GUIClientManager::new(client_url),
) )
.await .await
.map_err(|_| "connect remote rpc timed out".to_string())? .map_err(|_| "connect remote rpc timed out".to_string())?
@@ -373,7 +436,7 @@ async fn init_rpc_connection(_app: AppHandle, url: Option<String>) -> Result<(),
.map_err(|e| format!("{:#}", e))?; .map_err(|e| format!("{:#}", e))?;
*client_manager_guard = Some(client_manager); *client_manager_guard = Some(client_manager);
if !normal_mode { if !is_normal_mode {
drop(WEB_CLIENT.write().await.take()); drop(WEB_CLIENT.write().await.take());
if let Some(instance_manager) = instance_manager_guard.take() { if let Some(instance_manager) = instance_manager_guard.take() {
instance_manager instance_manager
+82 -1
View File
@@ -1,6 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, watch, onMounted, ref } from 'vue'; import { computed, watch, onMounted, ref } from 'vue';
import type { Mode, ServiceMode, RemoteMode } from '~/composables/mode'; import type { Mode, ServiceMode, RemoteMode, NormalMode } from '~/composables/mode';
import { appConfigDir, appLogDir } from '@tauri-apps/api/path'; import { appConfigDir, appLogDir } from '@tauri-apps/api/path';
import { join } from '@tauri-apps/api/path'; import { join } from '@tauri-apps/api/path';
import { getServiceStatus, type ServiceStatus } from '~/composables/backend'; import { getServiceStatus, type ServiceStatus } from '~/composables/backend';
@@ -15,6 +15,14 @@ const defaultLogDir = ref('')
const serviceStatus = ref<ServiceStatus>('NotInstalled') const serviceStatus = ref<ServiceStatus>('NotInstalled')
const isServiceStatusLoaded = ref(false) const isServiceStatusLoaded = ref(false)
function normalizeRpcListenPort(port: unknown): number {
const defaultPort = 15999
const numericPort = typeof port === 'number' ? port : Number.parseInt(String(port ?? ''), 10)
if (Number.isNaN(numericPort))
return defaultPort
return Math.min(65535, Math.max(1, Math.floor(numericPort)))
}
onMounted(async () => { onMounted(async () => {
defaultConfigDir.value = await join(await appConfigDir(), 'config.d') defaultConfigDir.value = await join(await appConfigDir(), 'config.d')
defaultLogDir.value = await appLogDir() defaultLogDir.value = await appLogDir()
@@ -26,6 +34,43 @@ const modeOptions = computed(() => [
{ label: t('mode.remote'), value: 'remote' }, { label: t('mode.remote'), value: 'remote' },
]); ]);
const normalMode = computed({
get: () => model.value.mode === 'normal' ? model.value as NormalMode : undefined,
set: (value) => {
if (value) {
model.value = value
}
}
})
const rpcListenOptions = computed(() => [
{ label: t('web.common.disable'), value: false },
{ label: t('web.common.enable'), value: true },
])
const rpcListenEnabled = computed<boolean>({
get: () => !!normalMode.value?.enable_rpc_port_listen,
set: (value) => {
if (!normalMode.value)
return
normalMode.value.enable_rpc_port_listen = value
},
})
const rpcListenPort = computed<string>({
get: () => String(normalMode.value?.rpc_listen_port ?? 15999),
set: (value) => {
if (!normalMode.value)
return
const trimmed = value.trim()
if (trimmed === '')
return
if (!/^\d+$/.test(trimmed))
return
normalMode.value.rpc_listen_port = Number.parseInt(trimmed, 10)
},
})
const serviceMode = computed({ const serviceMode = computed({
get: () => model.value.mode === 'service' ? model.value as ServiceMode : undefined, get: () => model.value.mode === 'service' ? model.value as ServiceMode : undefined,
set: (value) => { set: (value) => {
@@ -57,6 +102,24 @@ const statusColorClass = computed(() => {
} }
}) })
watch(() => [normalMode.value?.enable_rpc_port_listen, normalMode.value?.rpc_listen_port], ([enabled, port]) => {
if (!normalMode.value)
return
if (!enabled) {
normalMode.value.rpc_portal = undefined
return
}
const normalizedPort = normalizeRpcListenPort(port)
if (normalMode.value.rpc_listen_port !== normalizedPort)
normalMode.value.rpc_listen_port = normalizedPort
const desiredPortal = `tcp://0.0.0.0:${normalizedPort}`
if (normalMode.value.rpc_portal !== desiredPortal)
normalMode.value.rpc_portal = desiredPortal
}, { immediate: true })
watch(() => model.value.mode, async (newMode, oldMode) => { watch(() => model.value.mode, async (newMode, oldMode) => {
if (newMode === oldMode) if (newMode === oldMode)
return return
@@ -69,8 +132,12 @@ watch(() => model.value.mode, async (newMode, oldMode) => {
const oldModelValue = { ...model.value } const oldModelValue = { ...model.value }
if (newMode === 'normal') { if (newMode === 'normal') {
const portal = normalMode.value?.rpc_portal?.trim()
model.value = { model.value = {
...oldModelValue, ...oldModelValue,
rpc_portal: portal || undefined,
enable_rpc_port_listen: normalMode.value?.enable_rpc_port_listen,
rpc_listen_port: normalMode.value?.rpc_listen_port,
mode: 'normal', mode: 'normal',
} }
} }
@@ -113,6 +180,20 @@ watch(() => model.value.mode, async (newMode, oldMode) => {
{{ t('mode.remote_description') }} {{ t('mode.remote_description') }}
</div> </div>
<div v-if="normalMode" class="flex flex-col gap-2">
<div class="flex items-center gap-2">
<label for="rpc-listen-toggle">{{ t('mode.enable_rpc_tcp_listen') }}</label>
<SelectButton id="rpc-listen-toggle" v-model="rpcListenEnabled" :options="rpcListenOptions" option-label="label"
option-value="value" />
</div>
<div v-if="rpcListenEnabled" class="flex flex-col gap-2">
<div class="flex items-center gap-2">
<label for="rpc-listen-port">{{ t('mode.rpc_listen_port') }}</label>
<InputText id="rpc-listen-port" v-model="rpcListenPort" class="flex-1" inputmode="numeric" />
</div>
</div>
</div>
<div v-if="serviceMode" class="flex flex-col gap-2"> <div v-if="serviceMode" class="flex flex-col gap-2">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<label for="config-dir">{{ t('mode.config_dir') }}</label> <label for="config-dir">{{ t('mode.config_dir') }}</label>
+2 -2
View File
@@ -89,8 +89,8 @@ export async function getServiceStatus() {
return await invoke<ServiceStatus>('get_service_status') return await invoke<ServiceStatus>('get_service_status')
} }
export async function initRpcConnection(url?: string) { export async function initRpcConnection(isNormalMode: boolean, url?: string) {
return await invoke('init_rpc_connection', { url }) return await invoke('init_rpc_connection', { isNormalMode, url })
} }
export async function isClientRunning() { export async function isClientRunning() {
+5 -1
View File
@@ -4,8 +4,12 @@ export interface WebClientConfig {
config_server_url?: string config_server_url?: string
} }
interface NormalMode extends WebClientConfig { export interface NormalMode extends WebClientConfig {
mode: 'normal' mode: 'normal'
// if not provided will use ring tunnel rpc server
rpc_portal?: string
enable_rpc_port_listen?: boolean
rpc_listen_port?: number
} }
export interface ServiceMode extends WebClientConfig { export interface ServiceMode extends WebClientConfig {
+14 -4
View File
@@ -156,13 +156,23 @@ async function initWithMode(mode: Mode) {
url = "tcp://" + mode.rpc_portal.replace("0.0.0.0", "127.0.0.1") url = "tcp://" + mode.rpc_portal.replace("0.0.0.0", "127.0.0.1")
retrys = 5 retrys = 5
break; break;
case 'normal':
url = mode.rpc_portal;
break;
} }
for (let i = 0; i < retrys; i++) { for (let i = 0; i < retrys; i++) {
try { try {
await connectRpcClient(url) await connectRpcClient(mode.mode === 'normal', url)
break; break;
} catch (e) { } catch (e) {
if (i === retrys - 1) { if (i === retrys - 1) {
const errMsg = e instanceof Error ? e.message : String(e)
toast.add({
severity: 'error',
summary: t('error'),
detail: t('mode.rpc_connection_failed', { error: errMsg }),
life: 1000,
})
throw e; throw e;
} }
console.error("Error connecting rpc client, retrying...", e) console.error("Error connecting rpc client, retrying...", e)
@@ -332,9 +342,9 @@ const setting_menu_items: Ref<MenuItem[]> = ref([
}, },
]) ])
async function connectRpcClient(url?: string) { async function connectRpcClient(isNormalMode: boolean, url?: string) {
await initRpcConnection(url) await initRpcConnection(isNormalMode, url)
console.log("easytier rpc connection established") console.log("easytier rpc connection established, isNormalMode: ", isNormalMode)
} }
onMounted(async () => { onMounted(async () => {
@@ -334,6 +334,8 @@ web:
success: 成功 success: 成功
warning: 警告 warning: 警告
info: 提示 info: 提示
enable: 开启
disable: 关闭
settings: settings:
title: 设置 title: 设置
@@ -350,6 +352,8 @@ mode:
switch_mode: 切换模式 switch_mode: 切换模式
config_dir: 配置目录 config_dir: 配置目录
rpc_portal: RPC端口 rpc_portal: RPC端口
enable_rpc_tcp_listen: 开启 RPC 端口监听(TCP
rpc_listen_port: RPC 监听端口
log_level: 日志级别 log_level: 日志级别
log_dir: 日志目录 log_dir: 日志目录
remote_rpc_address: 远程RPC地址 remote_rpc_address: 远程RPC地址
@@ -370,6 +374,7 @@ mode:
stop_service_success: 服务停止成功 stop_service_success: 服务停止成功
remote_rpc_address_empty: 远程RPC地址不能为空 remote_rpc_address_empty: 远程RPC地址不能为空
service_config_empty: 服务配置不能为空 service_config_empty: 服务配置不能为空
rpc_connection_failed: "RPC 连接失败:{error}"
config-server: config-server:
title: 配置服务器 title: 配置服务器
@@ -334,6 +334,8 @@ web:
success: Success success: Success
warning: Warning warning: Warning
info: Info info: Info
enable: Enable
disable: Disable
settings: settings:
title: Settings title: Settings
@@ -350,6 +352,8 @@ mode:
switch_mode: Switch Mode switch_mode: Switch Mode
config_dir: Config Dir config_dir: Config Dir
rpc_portal: RPC Portal rpc_portal: RPC Portal
enable_rpc_tcp_listen: Enable RPC port listening (TCP)
rpc_listen_port: RPC Listen Port
log_level: Log Level log_level: Log Level
log_dir: Log Dir log_dir: Log Dir
remote_rpc_address: Remote RPC Address remote_rpc_address: Remote RPC Address
@@ -370,6 +374,7 @@ mode:
stop_service_success: Service stopped successfully stop_service_success: Service stopped successfully
remote_rpc_address_empty: Remote RPC Address cannot be empty remote_rpc_address_empty: Remote RPC Address cannot be empty
service_config_empty: Service Config cannot be empty service_config_empty: Service Config cannot be empty
rpc_connection_failed: "RPC connection failed: {error}"
config-server: config-server:
title: Config Server title: Config Server
+90 -83
View File
@@ -127,8 +127,8 @@ importers:
specifier: ^5.4.8 specifier: ^5.4.8
version: 5.4.19(@types/node@22.18.1) version: 5.4.19(@types/node@22.18.1)
vite-plugin-vue-devtools: vite-plugin-vue-devtools:
specifier: ^8.0.5 specifier: ^7.4.6
version: 8.0.5(vite@5.4.19(@types/node@22.18.1))(vue@3.5.21(typescript@5.6.3)) version: 7.4.6(rollup@4.50.1)(vite@5.4.19(@types/node@22.18.1))(vue@3.5.21(typescript@5.6.3))
vite-plugin-vue-layouts: vite-plugin-vue-layouts:
specifier: ^0.11.0 specifier: ^0.11.0
version: 0.11.0(vite@5.4.19(@types/node@22.18.1))(vue-router@4.5.1(vue@3.5.21(typescript@5.6.3)))(vue@3.5.21(typescript@5.6.3)) version: 0.11.0(vite@5.4.19(@types/node@22.18.1))(vue-router@4.5.1(vue@3.5.21(typescript@5.6.3)))(vue@3.5.21(typescript@5.6.3))
@@ -949,8 +949,8 @@ packages:
resolution: {integrity: sha512-BcmHpb5bQyeVNrptC3UhzpBZB/YHHDoEREOUERrmF2BRxsyOEuRrq+Z96C/D4+2KJb8kuHiouzAei7BXlG0YYw==} resolution: {integrity: sha512-BcmHpb5bQyeVNrptC3UhzpBZB/YHHDoEREOUERrmF2BRxsyOEuRrq+Z96C/D4+2KJb8kuHiouzAei7BXlG0YYw==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
'@intlify/shared@11.2.7': '@intlify/shared@11.2.8':
resolution: {integrity: sha512-uvlkvc/0uQ4FDlHQZccpUnmcOwNcaI3i+69ck2YJ+GqM35AoVbuS63b+YfirV4G0SZh64Ij2UMcFRMmB4nr95w==} resolution: {integrity: sha512-l6e4NZyUgv8VyXXH4DbuucFOBmxLF56C/mqh2tvApbzl2Hrhi1aTDcuv5TKdxzfHYmpO3UB0Cz04fgDT9vszfw==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
'@intlify/shared@12.0.0-alpha.3': '@intlify/shared@12.0.0-alpha.3':
@@ -1898,16 +1898,16 @@ packages:
'@vue/devtools-api@6.6.4': '@vue/devtools-api@6.6.4':
resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
'@vue/devtools-core@8.0.5': '@vue/devtools-core@7.7.9':
resolution: {integrity: sha512-dpCw8nl0GDBuiL9SaY0mtDxoGIEmU38w+TQiYEPOLhW03VDC0lfNMYXS/qhl4I0YlysGp04NLY4UNn6xgD0VIQ==} resolution: {integrity: sha512-48jrBSwG4GVQRvVeeXn9p9+dlx+ISgasM7SxZZKczseohB0cBz+ITKr4YbLWjmJdy45UHL7UMPlR4Y0CWTRcSQ==}
peerDependencies: peerDependencies:
vue: ^3.0.0 vue: ^3.0.0
'@vue/devtools-kit@8.0.5': '@vue/devtools-kit@7.7.9':
resolution: {integrity: sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==} resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==}
'@vue/devtools-shared@8.0.5': '@vue/devtools-shared@7.7.9':
resolution: {integrity: sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==} resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==}
'@vue/language-core@2.1.10': '@vue/language-core@2.1.10':
resolution: {integrity: sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==} resolution: {integrity: sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==}
@@ -2027,10 +2027,6 @@ packages:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'} engines: {node: '>=12'}
ansis@4.2.0:
resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==}
engines: {node: '>=14'}
any-promise@1.3.0: any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
@@ -2079,9 +2075,6 @@ packages:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'} engines: {node: '>=8'}
birpc@2.5.0:
resolution: {integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==}
birpc@2.9.0: birpc@2.9.0:
resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==}
@@ -2303,8 +2296,8 @@ packages:
error-ex@1.3.2: error-ex@1.3.2:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
error-stack-parser-es@1.0.5: error-stack-parser-es@0.1.5:
resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==}
es-define-property@1.0.1: es-define-property@1.0.1:
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
@@ -2578,6 +2571,10 @@ packages:
resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
execa@8.0.1:
resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
engines: {node: '>=16.17'}
exsolve@1.0.7: exsolve@1.0.7:
resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==}
@@ -2695,6 +2692,10 @@ packages:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'} engines: {node: '>=10'}
get-stream@8.0.1:
resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
engines: {node: '>=16'}
get-tsconfig@4.10.1: get-tsconfig@4.10.1:
resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==}
@@ -2772,6 +2773,10 @@ packages:
resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
engines: {node: '>=14.18.0'} engines: {node: '>=14.18.0'}
human-signals@5.0.0:
resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
engines: {node: '>=16.17.0'}
ignore@5.3.2: ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'} engines: {node: '>= 4'}
@@ -3264,9 +3269,6 @@ packages:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
ohash@2.0.11:
resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
onetime@6.0.0: onetime@6.0.0:
resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
@@ -3354,8 +3356,8 @@ packages:
pathe@2.0.3: pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
perfect-debounce@2.0.0: perfect-debounce@1.0.0:
resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
picocolors@1.1.1: picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -3603,6 +3605,10 @@ packages:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'} engines: {node: '>=14'}
sirv@2.0.4:
resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
engines: {node: '>= 10'}
sirv@3.0.2: sirv@3.0.2:
resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
engines: {node: '>=18'} engines: {node: '>=18'}
@@ -3880,10 +3886,6 @@ packages:
webpack: webpack:
optional: true optional: true
unplugin-utils@0.3.1:
resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==}
engines: {node: '>=20.19.0'}
unplugin-vue-components@0.27.5: unplugin-vue-components@0.27.5:
resolution: {integrity: sha512-m9j4goBeNwXyNN8oZHHxvIIYiG8FQ9UfmKWeNllpDvhU7btKNNELGPt+o3mckQKuPwrE7e0PvCsx+IWuDSD9Vg==} resolution: {integrity: sha512-m9j4goBeNwXyNN8oZHHxvIIYiG8FQ9UfmKWeNllpDvhU7btKNNELGPt+o3mckQKuPwrE7e0PvCsx+IWuDSD9Vg==}
engines: {node: '>=14'} engines: {node: '>=14'}
@@ -3954,11 +3956,6 @@ packages:
validate-npm-package-license@3.0.4: validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
vite-dev-rpc@1.1.0:
resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==}
peerDependencies:
vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0
vite-hot-client@2.1.0: vite-hot-client@2.1.0:
resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==} resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==}
peerDependencies: peerDependencies:
@@ -3973,12 +3970,12 @@ packages:
vite: vite:
optional: true optional: true
vite-plugin-inspect@11.3.3: vite-plugin-inspect@0.8.9:
resolution: {integrity: sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==} resolution: {integrity: sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==}
engines: {node: '>=14'} engines: {node: '>=14'}
peerDependencies: peerDependencies:
'@nuxt/kit': '*' '@nuxt/kit': '*'
vite: ^6.0.0 || ^7.0.0-0 vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1
peerDependenciesMeta: peerDependenciesMeta:
'@nuxt/kit': '@nuxt/kit':
optional: true optional: true
@@ -3990,11 +3987,11 @@ packages:
rollup: ^4.44.1 rollup: ^4.44.1
vite: ^5.4.11 || ^6.0.0 || ^7.0.0 vite: ^5.4.11 || ^6.0.0 || ^7.0.0
vite-plugin-vue-devtools@8.0.5: vite-plugin-vue-devtools@7.4.6:
resolution: {integrity: sha512-p619BlKFOqQXJ6uDWS1vUPQzuJOD6xJTfftj57JXBGoBD/yeQCowR7pnWcr/FEX4/HVkFbreI6w2uuGBmQOh6A==} resolution: {integrity: sha512-lOKur3qovCB3BQStL0qfHEoIusqya1ngfxfWuqn9DTa6h9rlw6+S3PV4geOP5YBGYQ4NW1hRX70OD8I+sYr1dA==}
engines: {node: '>=v14.21.3'} engines: {node: '>=v14.21.3'}
peerDependencies: peerDependencies:
vite: ^6.0.0 || ^7.0.0-0 vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0
vite-plugin-vue-inspector@5.3.2: vite-plugin-vue-inspector@5.3.2:
resolution: {integrity: sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==} resolution: {integrity: sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==}
@@ -4068,12 +4065,14 @@ packages:
vue-i18n@10.0.8: vue-i18n@10.0.8:
resolution: {integrity: sha512-mIjy4utxMz9lMMo6G9vYePv7gUFt4ztOMhY9/4czDJxZ26xPeJ49MAGa9wBAE3XuXbYCrtVPmPxNjej7JJJkZQ==} resolution: {integrity: sha512-mIjy4utxMz9lMMo6G9vYePv7gUFt4ztOMhY9/4czDJxZ26xPeJ49MAGa9wBAE3XuXbYCrtVPmPxNjej7JJJkZQ==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
deprecated: v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html
peerDependencies: peerDependencies:
vue: ^3.0.0 vue: ^3.0.0
vue-i18n@9.14.5: vue-i18n@9.14.5:
resolution: {integrity: sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==} resolution: {integrity: sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
deprecated: v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html
peerDependencies: peerDependencies:
vue: ^3.0.0 vue: ^3.0.0
@@ -4737,7 +4736,7 @@ snapshots:
'@intlify/shared@10.0.8': {} '@intlify/shared@10.0.8': {}
'@intlify/shared@11.2.7': {} '@intlify/shared@11.2.8': {}
'@intlify/shared@12.0.0-alpha.3': {} '@intlify/shared@12.0.0-alpha.3': {}
@@ -4747,8 +4746,8 @@ snapshots:
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.8.0(eslint@9.35.0(jiti@2.5.1)) '@eslint-community/eslint-utils': 4.8.0(eslint@9.35.0(jiti@2.5.1))
'@intlify/bundle-utils': 9.0.0(vue-i18n@10.0.8(vue@3.5.21(typescript@5.6.3))) '@intlify/bundle-utils': 9.0.0(vue-i18n@10.0.8(vue@3.5.21(typescript@5.6.3)))
'@intlify/shared': 11.2.7 '@intlify/shared': 11.2.8
'@intlify/vue-i18n-extensions': 7.0.0(@intlify/shared@11.2.7)(@vue/compiler-dom@3.5.21)(vue-i18n@10.0.8(vue@3.5.21(typescript@5.6.3)))(vue@3.5.21(typescript@5.6.3)) '@intlify/vue-i18n-extensions': 7.0.0(@intlify/shared@11.2.8)(@vue/compiler-dom@3.5.21)(vue-i18n@10.0.8(vue@3.5.21(typescript@5.6.3)))(vue@3.5.21(typescript@5.6.3))
'@rollup/pluginutils': 5.3.0(rollup@4.50.1) '@rollup/pluginutils': 5.3.0(rollup@4.50.1)
'@typescript-eslint/scope-manager': 8.42.0 '@typescript-eslint/scope-manager': 8.42.0
'@typescript-eslint/typescript-estree': 8.42.0(typescript@5.6.3) '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.6.3)
@@ -4770,11 +4769,11 @@ snapshots:
- supports-color - supports-color
- typescript - typescript
'@intlify/vue-i18n-extensions@7.0.0(@intlify/shared@11.2.7)(@vue/compiler-dom@3.5.21)(vue-i18n@10.0.8(vue@3.5.21(typescript@5.6.3)))(vue@3.5.21(typescript@5.6.3))': '@intlify/vue-i18n-extensions@7.0.0(@intlify/shared@11.2.8)(@vue/compiler-dom@3.5.21)(vue-i18n@10.0.8(vue@3.5.21(typescript@5.6.3)))(vue@3.5.21(typescript@5.6.3))':
dependencies: dependencies:
'@babel/parser': 7.28.4 '@babel/parser': 7.28.4
optionalDependencies: optionalDependencies:
'@intlify/shared': 11.2.7 '@intlify/shared': 11.2.8
'@vue/compiler-dom': 3.5.21 '@vue/compiler-dom': 3.5.21
vue: 3.5.21(typescript@5.6.3) vue: 3.5.21(typescript@5.6.3)
vue-i18n: 10.0.8(vue@3.5.21(typescript@5.6.3)) vue-i18n: 10.0.8(vue@3.5.21(typescript@5.6.3))
@@ -5774,10 +5773,10 @@ snapshots:
'@vue/devtools-api@6.6.4': {} '@vue/devtools-api@6.6.4': {}
'@vue/devtools-core@8.0.5(vite@5.4.19(@types/node@22.18.1))(vue@3.5.21(typescript@5.6.3))': '@vue/devtools-core@7.7.9(vite@5.4.19(@types/node@22.18.1))(vue@3.5.21(typescript@5.6.3))':
dependencies: dependencies:
'@vue/devtools-kit': 8.0.5 '@vue/devtools-kit': 7.7.9
'@vue/devtools-shared': 8.0.5 '@vue/devtools-shared': 7.7.9
mitt: 3.0.1 mitt: 3.0.1
nanoid: 5.1.5 nanoid: 5.1.5
pathe: 2.0.3 pathe: 2.0.3
@@ -5786,17 +5785,17 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- vite - vite
'@vue/devtools-kit@8.0.5': '@vue/devtools-kit@7.7.9':
dependencies: dependencies:
'@vue/devtools-shared': 8.0.5 '@vue/devtools-shared': 7.7.9
birpc: 2.9.0 birpc: 2.9.0
hookable: 5.5.3 hookable: 5.5.3
mitt: 3.0.1 mitt: 3.0.1
perfect-debounce: 2.0.0 perfect-debounce: 1.0.0
speakingurl: 14.0.1 speakingurl: 14.0.1
superjson: 2.2.2 superjson: 2.2.2
'@vue/devtools-shared@8.0.5': '@vue/devtools-shared@7.7.9':
dependencies: dependencies:
rfdc: 1.4.1 rfdc: 1.4.1
@@ -5946,8 +5945,6 @@ snapshots:
ansi-styles@6.2.1: {} ansi-styles@6.2.1: {}
ansis@4.2.0: {}
any-promise@1.3.0: {} any-promise@1.3.0: {}
anymatch@3.1.3: anymatch@3.1.3:
@@ -5999,8 +5996,6 @@ snapshots:
binary-extensions@2.3.0: {} binary-extensions@2.3.0: {}
birpc@2.5.0: {}
birpc@2.9.0: {} birpc@2.9.0: {}
boolbase@1.0.0: {} boolbase@1.0.0: {}
@@ -6196,7 +6191,7 @@ snapshots:
dependencies: dependencies:
is-arrayish: 0.2.1 is-arrayish: 0.2.1
error-stack-parser-es@1.0.5: {} error-stack-parser-es@0.1.5: {}
es-define-property@1.0.1: {} es-define-property@1.0.1: {}
@@ -6606,6 +6601,18 @@ snapshots:
signal-exit: 3.0.7 signal-exit: 3.0.7
strip-final-newline: 3.0.0 strip-final-newline: 3.0.0
execa@8.0.1:
dependencies:
cross-spawn: 7.0.6
get-stream: 8.0.1
human-signals: 5.0.0
is-stream: 3.0.0
merge-stream: 2.0.0
npm-run-path: 5.3.0
onetime: 6.0.0
signal-exit: 4.1.0
strip-final-newline: 3.0.0
exsolve@1.0.7: {} exsolve@1.0.7: {}
extend-shallow@2.0.1: extend-shallow@2.0.1:
@@ -6721,6 +6728,8 @@ snapshots:
get-stream@6.0.1: {} get-stream@6.0.1: {}
get-stream@8.0.1: {}
get-tsconfig@4.10.1: get-tsconfig@4.10.1:
dependencies: dependencies:
resolve-pkg-maps: 1.0.0 resolve-pkg-maps: 1.0.0
@@ -6787,6 +6796,8 @@ snapshots:
human-signals@4.3.1: {} human-signals@4.3.1: {}
human-signals@5.0.0: {}
ignore@5.3.2: {} ignore@5.3.2: {}
ignore@7.0.5: {} ignore@7.0.5: {}
@@ -7404,8 +7415,6 @@ snapshots:
object-hash@3.0.0: {} object-hash@3.0.0: {}
ohash@2.0.11: {}
onetime@6.0.0: onetime@6.0.0:
dependencies: dependencies:
mimic-fn: 4.0.0 mimic-fn: 4.0.0
@@ -7500,7 +7509,7 @@ snapshots:
pathe@2.0.3: {} pathe@2.0.3: {}
perfect-debounce@2.0.0: {} perfect-debounce@1.0.0: {}
picocolors@1.1.1: {} picocolors@1.1.1: {}
@@ -7740,6 +7749,12 @@ snapshots:
signal-exit@4.1.0: {} signal-exit@4.1.0: {}
sirv@2.0.4:
dependencies:
'@polka/url': 1.0.0-next.29
mrmime: 2.0.1
totalist: 3.0.1
sirv@3.0.2: sirv@3.0.2:
dependencies: dependencies:
'@polka/url': 1.0.0-next.29 '@polka/url': 1.0.0-next.29
@@ -8024,11 +8039,6 @@ snapshots:
unplugin: 1.16.1 unplugin: 1.16.1
vite: 5.4.19(@types/node@22.18.1) vite: 5.4.19(@types/node@22.18.1)
unplugin-utils@0.3.1:
dependencies:
pathe: 2.0.3
picomatch: 4.0.3
unplugin-vue-components@0.27.5(@babel/parser@7.28.4)(rollup@4.50.1)(vue@3.5.21(typescript@5.6.3)): unplugin-vue-components@0.27.5(@babel/parser@7.28.4)(rollup@4.50.1)(vue@3.5.21(typescript@5.6.3)):
dependencies: dependencies:
'@antfu/utils': 0.7.10 '@antfu/utils': 0.7.10
@@ -8192,12 +8202,6 @@ snapshots:
spdx-correct: 3.2.0 spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1 spdx-expression-parse: 3.0.1
vite-dev-rpc@1.1.0(vite@5.4.19(@types/node@22.18.1)):
dependencies:
birpc: 2.5.0
vite: 5.4.19(@types/node@22.18.1)
vite-hot-client: 2.1.0(vite@5.4.19(@types/node@22.18.1))
vite-hot-client@2.1.0(vite@5.4.19(@types/node@22.18.1)): vite-hot-client@2.1.0(vite@5.4.19(@types/node@22.18.1)):
dependencies: dependencies:
vite: 5.4.19(@types/node@22.18.1) vite: 5.4.19(@types/node@22.18.1)
@@ -8221,19 +8225,20 @@ snapshots:
- rollup - rollup
- supports-color - supports-color
vite-plugin-inspect@11.3.3(vite@5.4.19(@types/node@22.18.1)): vite-plugin-inspect@0.8.9(rollup@4.50.1)(vite@5.4.19(@types/node@22.18.1)):
dependencies: dependencies:
ansis: 4.2.0 '@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.3.0(rollup@4.50.1)
debug: 4.4.1 debug: 4.4.1
error-stack-parser-es: 1.0.5 error-stack-parser-es: 0.1.5
ohash: 2.0.11 fs-extra: 11.3.1
open: 10.2.0 open: 10.2.0
perfect-debounce: 2.0.0 perfect-debounce: 1.0.0
picocolors: 1.1.1
sirv: 3.0.2 sirv: 3.0.2
unplugin-utils: 0.3.1
vite: 5.4.19(@types/node@22.18.1) vite: 5.4.19(@types/node@22.18.1)
vite-dev-rpc: 1.1.0(vite@5.4.19(@types/node@22.18.1))
transitivePeerDependencies: transitivePeerDependencies:
- rollup
- supports-color - supports-color
vite-plugin-singlefile@2.3.0(rollup@4.50.1)(vite@5.4.19(@types/node@22.18.1)): vite-plugin-singlefile@2.3.0(rollup@4.50.1)(vite@5.4.19(@types/node@22.18.1)):
@@ -8242,17 +8247,19 @@ snapshots:
rollup: 4.50.1 rollup: 4.50.1
vite: 5.4.19(@types/node@22.18.1) vite: 5.4.19(@types/node@22.18.1)
vite-plugin-vue-devtools@8.0.5(vite@5.4.19(@types/node@22.18.1))(vue@3.5.21(typescript@5.6.3)): vite-plugin-vue-devtools@7.4.6(rollup@4.50.1)(vite@5.4.19(@types/node@22.18.1))(vue@3.5.21(typescript@5.6.3)):
dependencies: dependencies:
'@vue/devtools-core': 8.0.5(vite@5.4.19(@types/node@22.18.1))(vue@3.5.21(typescript@5.6.3)) '@vue/devtools-core': 7.7.9(vite@5.4.19(@types/node@22.18.1))(vue@3.5.21(typescript@5.6.3))
'@vue/devtools-kit': 8.0.5 '@vue/devtools-kit': 7.7.9
'@vue/devtools-shared': 8.0.5 '@vue/devtools-shared': 7.7.9
sirv: 3.0.2 execa: 8.0.1
sirv: 2.0.4
vite: 5.4.19(@types/node@22.18.1) vite: 5.4.19(@types/node@22.18.1)
vite-plugin-inspect: 11.3.3(vite@5.4.19(@types/node@22.18.1)) vite-plugin-inspect: 0.8.9(rollup@4.50.1)(vite@5.4.19(@types/node@22.18.1))
vite-plugin-vue-inspector: 5.3.2(vite@5.4.19(@types/node@22.18.1)) vite-plugin-vue-inspector: 5.3.2(vite@5.4.19(@types/node@22.18.1))
transitivePeerDependencies: transitivePeerDependencies:
- '@nuxt/kit' - '@nuxt/kit'
- rollup
- supports-color - supports-color
- vue - vue