feat: refatorar estrutura do projeto e adicionar funcionalidade de websocket

- Adiciona arquivo .env.example com variável VITE_URL_BACKEND
- Inclui .env no .gitignore
- Adiciona novas dependências: axios, pinia, socket.io-client,
- Remove sistema de roteamento anterior e simplifica App.vue
- Substitui componentes antigos (NavButton, ServerCard, SidePanel) por novo SessionCard
- Remove páginas antigas (Dashboard, Sections) e cria nova página Sessions
- Implementa composable useWebSocket para conexão com backend via socket.io
- Cria store Pinia para gerenciamento de estado das sessões e aplicações
- Define interfaces TypeScript para tipos de dados do websocket
- Atualiza mock de servidores para nova estrutura de dados
- Configura servidor Vite para hospedagem na porta 3333
- Ajusta configuração do TypeScript
master
Artur Oliveira 2025-08-21 09:46:26 -03:00
parent f80f277660
commit 4f31f091e6
20 changed files with 2105 additions and 1643 deletions

1
.env.example 100644
View File

@ -0,0 +1 @@
VITE_URL_BACKEND=http://seu-backend-url

3
.gitignore vendored
View File

@ -12,6 +12,9 @@ dist
dist-ssr
*.local
# Arquivos de ambiente
.env
# Editor directories and files
.vscode/*
!.vscode/extensions.json

View File

@ -9,7 +9,10 @@
"preview": "vite preview"
},
"dependencies": {
"axios": "^1.11.0",
"lucide-vue-next": "^0.539.0",
"pinia": "^3.0.3",
"socket.io-client": "^4.8.1",
"vue": "^3.5.18",
"vue-router": "4"
},

View File

@ -1,22 +0,0 @@
import { createRouter, createWebHashHistory } from 'vue-router';
import Dashboard from './src/pages/Dashboard.vue';
import Sections from './src/pages/Sections.vue';
const routes = [
{
path: '/',
name: 'dashboard',
component: Dashboard
},
{
path: '/sections',
name: 'Seções',
component: Sections
}
]
const router = createRouter({
history: createWebHashHistory(),
routes
})
export default router;

View File

@ -1,14 +1,11 @@
<script setup lang="ts">
import SidePanel from './components/SidePanel.vue';
import Sessions from './pages/Sessions.vue';
</script>
<template>
<div class="flex">
<SidePanel />
<main class="flex-1">
<RouterView />
<Sessions />
</main>
</div>
</template>

View File

@ -1,16 +0,0 @@
<script setup lang="ts">
interface Props {
title: string;
isActive: boolean;
}
const props = defineProps<Props>();
</script>
<template>
<button :class="`text-2xl bg-bg p-2 w-full rounded-lg border-2 border-border
capitalize font-bold hover:bg-cardHover transition duration-150
${props.isActive ? 'text-accent' : ''}`">
{{ props.title }}
</button>
</template>

View File

@ -1,90 +0,0 @@
<script setup lang="ts">
import { Server } from 'lucide-vue-next';
import { computed } from 'vue';
import type { ServerData } from '../mocks/mockServersList';
const props = defineProps<ServerData>();
// Função para calcular a porcentagem de uso do armazenamento
const storagePercentage = computed(() => {
// Função para converter para GB
const convertToGB = (value: string): number => {
const num = parseFloat(value.replace(/[^\d.]/g, ''));
if (value.includes('TB')) {
return num * 1024; // Converte TB para GB
}
return num; // Já está em GB
};
const totalGB = convertToGB(props.totalStorage);
const usedGB = convertToGB(props.usedStorage);
return Math.round((usedGB / totalGB) * 100);
});
// Função para calcular a porcentagem de uso da RAM
const ramPercentage = computed(() => {
const total = parseFloat(props.totalRam.replace(/[^\d.]/g, ''));
const used = parseFloat(props.totalRamUsed.replace(/[^\d.]/g, ''));
return Math.round((used / total) * 100);
});
</script>
<template>
<div class="bg-cardBg text-text rounded-lg p-4">
<div class="flex flex-row items-center gap-4">
<div class="p-2 bg-bg rounded-md">
<Server :size="32" />
</div>
<div>
<h1 class="text-xl font-bold">{{ props.name }}</h1>
<h1 class="text-green-600">{{ props.ip }}</h1>
</div>
</div>
<div class="h-1 bg-bg my-4" />
<div>
<div class="flex flex-row justify-between text-lg">
<h1 class="font-bold">Ram total: </h1>
<h1>{{ props.totalRam }}</h1>
</div>
<!-- Barra de progresso da RAM (menor) -->
<div class="mt-1 mb-2">
<div class="flex justify-between text-md text-gray-400 mb-1">
<span>{{ props.totalRamUsed }}</span>
<span>{{ ramPercentage }}%</span>
</div>
<div class="w-full bg-bg rounded-full h-1.5">
<div class="h-1.5 rounded-full transition-all duration-300"
:class="ramPercentage > 80 ? 'bg-red-400' : ramPercentage > 60 ? 'bg-yellow-400' : 'bg-blue-400'"
:style="`width: ${ramPercentage}%`"></div>
</div>
<!-- Informações detalhadas da RAM -->
<div class="flex justify-between text-md text-gray-400 mt-1">
<span>Livre: {{ props.freeRam }}</span>
<span>Cache: {{ props.cachedRam }}</span>
</div>
</div>
<div class="flex flex-row justify-between text-lg">
<h1 class="font-bold">Armazenamento: </h1>
<h1>{{ props.totalStorage }}</h1>
</div>
<!-- Barra de progresso do armazenamento -->
<div class="mt-2 mb-3">
<div class="flex justify-between text-sm text-gray-400 mb-1">
<span>Usado: {{ props.usedStorage }}</span>
<span>{{ storagePercentage }}%</span>
</div>
<div class="w-full bg-bg rounded-full h-2">
<div class="h-2 rounded-full transition-all duration-300"
:class="storagePercentage > 80 ? 'bg-red-500' : storagePercentage > 60 ? 'bg-yellow-500' : 'bg-green-500'"
:style="`width: ${storagePercentage}%`"></div>
</div>
</div>
</div>
</div>
</template>

View File

@ -0,0 +1,139 @@
<script setup lang="ts">
import { Server } from 'lucide-vue-next';
import { computed } from 'vue';
import type { Session } from '../props/websocketResponse';
interface Props {
session: Session;
index: number;
}
const props = defineProps<Props>();
const convertMemorySize = (size: string) => {
if (size.endsWith('Gi')) {
return size.replace('Gi', 'GB');
} else if (size.endsWith('Mi')) {
return size.replace('Mi', 'MB');
}
return size;
};
// Função para calcular a porcentagem de uso da RAM
const ramPercentage = computed(() => {
// Função para converter para Mi (Mebibytes)
const convertToMi = (value: string): number => {
const num = parseFloat(value.replace(/[^\d.]/g, ''));
if (value.includes('Gi')) {
return num * 1024; // Converte Gi para Mi
}
if (value.includes('Ti')) {
return num * 1024 * 1024; // Converte Ti para Mi
}
return num; // Já está em Mi
};
const totalMi = convertToMi(props.session.memoryTotal);
const usedMi = convertToMi(props.session.memoryUsed);
return Math.round((usedMi / totalMi) * 100);
});
// Função para converter a porcentagem de disco de string para número
const diskPercentageNumber = computed(() => {
const totalSize = parseFloat(props.session.diskSize.replace(/[^\d.]/g, ''));
const usedSize = parseFloat(props.session.diskUsed.replace(/[^\d.]/g, ''));
return Math.round((usedSize / totalSize) * 100);
});
</script>
<template>
<div class="bg-cardBg text-text rounded-lg p-4">
<div class="flex flex-row items-center gap-4">
<div class="p-2 bg-bg rounded-md">
<Server :size="32" />
</div>
<div>
<h1 class="text-xl font-bold">{{ session.name }}</h1>
<h1 class="text-green-600">{{ session.ipAddress }}</h1>
</div>
</div>
<div class="h-1 bg-bg my-4" />
<div>
<div class="flex flex-row justify-between text-lg">
<h1 class="font-bold">Ram total:</h1>
<h1>{{ convertMemorySize(session.memoryTotal) }}</h1>
</div>
<!-- Barra de progresso da RAM -->
<div class="mt-1 mb-2">
<div class="flex justify-between text-md text-gray-400 mb-1">
<span>{{ convertMemorySize(session.memoryUsed) }}</span>
<span>{{ ramPercentage }}%</span>
</div>
<div class="w-full bg-bg rounded-full h-1.5">
<div
class="h-1.5 rounded-full transition-all duration-300"
:class="
ramPercentage > 80 ? 'bg-red-400' : ramPercentage > 60 ? 'bg-yellow-400' : 'bg-blue-400'
"
:style="`width: ${ramPercentage}%`"
></div>
</div>
<!-- Informações detalhadas da RAM -->
<div class="flex justify-between text-md text-gray-400 mt-1">
<span>Livre: {{ convertMemorySize(session.memoryFree) }}</span>
<span>Cache: {{ convertMemorySize(session.memoryCache) }}</span>
</div>
</div>
<div class="flex flex-row justify-between text-lg">
<h1 class="font-bold">Armazenamento:</h1>
<h1>{{ session.diskSize }}</h1>
</div>
<!-- Barra de progresso do armazenamento -->
<div class="mt-2 mb-3">
<div class="flex justify-between text-sm text-gray-400 mb-1">
<span>Usado: {{ session.diskUsed }}</span>
<span>{{ diskPercentageNumber }}%</span>
</div>
<div class="w-full bg-bg rounded-full h-2">
<div
class="h-2 rounded-full transition-all duration-300"
:class="
diskPercentageNumber > 80
? 'bg-red-500'
: diskPercentageNumber > 60
? 'bg-yellow-500'
: 'bg-green-500'
"
:style="`width: ${diskPercentageNumber}%`"
></div>
</div>
<div class="flex justify-between text-sm text-gray-400 mt-1">
<span>Disponível: {{ session.diskAvailable }}</span>
</div>
</div>
<!-- Aplicações hospedadas -->
<div class="mt-4">
<h2 class="font-bold text-lg mb-2">Aplicações:</h2>
<div class="flex flex-wrap gap-1">
<span
v-if="session.appName && session.appName.length > 0"
v-for="app in session.appName"
:key="app"
class="px-2 py-1 bg-accent text-white text-xs rounded"
>
{{ app }}
</span>
<span v-else class="text-gray-400 text-sm">Nenhuma aplicação encontrada.</span>
</div>
</div>
</div>
</div>
</template>

View File

@ -1,53 +0,0 @@
<script setup lang="ts">
import { ChevronLeft, ChevronRight, LayoutDashboard, Settings } from 'lucide-vue-next';
import { ref } from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
const isCollapsed = ref(false);
const toggleCollapse = () => {
isCollapsed.value = !isCollapsed.value;
};
</script>
<template>
<div class="h-screen bg-cardBg border-r-2 border-border flex flex-col gap-10 transition-all duration-300"
:class="isCollapsed ? 'w-20 py-10 px-4' : 'w-fit p-10'">
<div class="flex items-center justify-between">
<h1 class="text-accent font-bold text-3xl transition-opacity duration-300"
:class="isCollapsed ? 'opacity-0 hidden' : 'opacity-100'">
Omnihit Manager
</h1>
<button @click="toggleCollapse"
class="p-2 rounded-lg hover:bg-bg transition-colors duration-200 text-accent">
<ChevronLeft v-if="!isCollapsed" :size="24" />
<ChevronRight v-else :size="24" />
</button>
</div>
<div class="flex flex-col gap-3">
<RouterLink to="/" class="block">
<div class="flex items-center gap-3 text-2xl bg-bg p-3 w-full rounded-lg border-2 border-border hover:bg-cardHover transition duration-150 cursor-pointer"
:class="route.path === '/' ? 'text-accent border-accent' : 'text-text'">
<LayoutDashboard :size="24" class="flex-shrink-0" />
<span class="capitalize font-bold transition-opacity duration-300"
:class="isCollapsed ? 'opacity-0 hidden' : 'opacity-100'">
Painel
</span>
</div>
</RouterLink>
<RouterLink to="/sections" class="block">
<div class="flex items-center gap-3 text-2xl bg-bg p-3 w-full rounded-lg border-2 border-border hover:bg-cardHover transition duration-150 cursor-pointer"
:class="route.path === '/sections' ? 'text-accent border-accent' : 'text-text'">
<Settings :size="24" class="flex-shrink-0" />
<span class="capitalize font-bold transition-opacity duration-300"
:class="isCollapsed ? 'opacity-0 hidden' : 'opacity-100'">
Seções
</span>
</div>
</RouterLink>
</div>
</div>
</template>

View File

@ -0,0 +1,84 @@
import { io, type Socket } from 'socket.io-client';
import { useStore } from '../stores/store';
import { onMounted, onUnmounted, ref } from 'vue';
import type { RefreshDataPayload } from '../props/websocketResponse';
export function useWebSocket() {
const store = useStore();
const socket = ref<Socket | null>(null);
const intervalIds = ref<{ applications: number[]; sessions: number[] }>({
applications: [],
sessions: [],
});
const clearIntervals = (type?: 'applications' | 'sessions') => {
if (type) {
intervalIds.value[type].forEach((id) => clearInterval(id));
intervalIds.value[type] = [];
} else {
Object.values(intervalIds.value)
.flat()
.forEach((id) => clearInterval(id));
intervalIds.value = { applications: [], sessions: [] };
}
};
const connectWebSocket = () => {
let sessionId = localStorage.getItem('sessionId');
socket.value = io(import.meta.env.VITE_URL_BACKEND, {
query: { sessionId },
});
socket.value.on('connect', () => {
if (!sessionId) {
sessionId = Math.random().toString(36).substring(2, 11);
localStorage.setItem('sessionId', sessionId);
socket.value?.emit('sessionId', sessionId);
}
});
socket.value.on('refreshData', (data: RefreshDataPayload) => {
clearIntervals();
store.setApplications(data.applications);
store.setSessions(data.sessions);
store.isLoading = false;
});
socket.value.on('error', () => {
alert(
'Atenção! Tentativa de conexão QRcode inválida. O dispositivo lido não corresponde com o telefone da aplicação.'
);
});
socket.value.on('disconnect', (reason) => {
console.log(`Desconectado: ${reason}`);
localStorage.removeItem('sessionId');
});
socket.value.on('reconnect', (attemptNumber) => {
console.log(`Reconectado após ${attemptNumber} tentativas.`);
});
};
const disconnectWebSocket = () => {
clearIntervals();
socket.value?.disconnect();
};
onMounted(() => {
connectWebSocket();
});
onUnmounted(() => {
disconnectWebSocket();
});
return {
socket,
intervalIds,
clearIntervals,
connectWebSocket,
disconnectWebSocket,
};
}

View File

@ -1,6 +1,10 @@
import { createApp } from 'vue'
import router from '../router'
import App from './App.vue'
import './style.css'
import { createApp } from 'vue';
import App from './App.vue';
import './style.css';
import { createPinia } from 'pinia';
createApp(App).use(router).mount('#app')
const app = createApp(App);
const pinia = createPinia();
app.use(pinia);
app.mount('#app');

View File

@ -1,58 +1,87 @@
export interface ServerData {
name: string;
ip: string;
totalRam: string;
totalRamUsed: string;
cachedRam: string;
freeRam: string;
totalStorage: string;
usedStorage: string;
freeStorage: string;
ipAddress: string;
memoryTotal: string;
memoryUsed: string;
memoryFree: string;
memoryCache: string;
diskSize: string;
diskUsed: string;
diskAvailable: string;
diskPercentage: string;
appName: string[];
caution: boolean;
}
export const mockServersList: ServerData[] = [
{
name: "Servidor Web 01",
ip: "192.168.1.10",
totalRam: "16GB",
totalRamUsed: "8.5GB",
cachedRam: "2.1GB",
freeRam: "7.5GB",
totalStorage: "500GB",
usedStorage: "320GB",
freeStorage: "180GB"
name: "SESSÃO 7",
ipAddress: "172.31.187.39",
memoryTotal: "2.0Gi",
memoryUsed: "100Mi",
memoryFree: "953Mi",
memoryCache: "993Mi",
diskSize: "20G",
diskUsed: "3.1G",
diskAvailable: "16G",
diskPercentage: "17%",
appName: [
"el_lojas",
"poc_colombia_test",
"polimix",
"same"
],
caution: false
},
{
name: "Servidor BD Principal",
ip: "192.168.1.11",
totalRam: "32GB",
totalRamUsed: "24.2GB",
cachedRam: "4.8GB",
freeRam: "7.8GB",
totalStorage: "1TB",
usedStorage: "750GB",
freeStorage: "250GB"
ipAddress: "192.168.1.11",
memoryTotal: "32Gi",
memoryUsed: "24.2Gi",
memoryFree: "7.8Gi",
memoryCache: "4.8Gi",
diskSize: "1T",
diskUsed: "750G",
diskAvailable: "250G",
diskPercentage: "75%",
appName: [
"database_primary",
"backup_service"
],
caution: true
},
{
name: "Servidor API",
ip: "192.168.1.12",
totalRam: "8GB",
totalRamUsed: "3.2GB",
cachedRam: "1.1GB",
freeRam: "4.8GB",
totalStorage: "250GB",
usedStorage: "120GB",
freeStorage: "130GB"
ipAddress: "192.168.1.12",
memoryTotal: "8Gi",
memoryUsed: "3.2Gi",
memoryFree: "4.8Gi",
memoryCache: "1.1Gi",
diskSize: "250G",
diskUsed: "120G",
diskAvailable: "130G",
diskPercentage: "48%",
appName: [
"api_gateway",
"auth_service"
],
caution: false
},
{
name: "Servidor Backup",
ip: "192.168.1.13",
totalRam: "16GB",
totalRamUsed: "5.1GB",
cachedRam: "2.5GB",
freeRam: "10.9GB",
totalStorage: "2TB",
usedStorage: "1.2TB",
freeStorage: "800GB"
ipAddress: "192.168.1.13",
memoryTotal: "16Gi",
memoryUsed: "5.1Gi",
memoryFree: "10.9Gi",
memoryCache: "2.5Gi",
diskSize: "2T",
diskUsed: "1.2T",
diskAvailable: "800G",
diskPercentage: "60%",
appName: [
"backup_manager",
"file_sync"
],
caution: false
}
];

View File

@ -1,14 +0,0 @@
<script setup lang="ts">
import ServerCard from '../components/ServerCard.vue';
import { mockServersList } from '../mocks/mockServersList';
const servers = mockServersList;
</script>
<template>
<div class="bg-bg h-screen text-text p-10">
<div class="grid grid-cols-4 gap-6">
<ServerCard v-for="server in servers" :key="server.ip" v-bind="server" />
</div>
</div>
</template>

View File

@ -1,6 +0,0 @@
<script setup lang="ts">
</script>
<template>
<h1 class="text-text">Section</h1>
</template>

View File

@ -0,0 +1,49 @@
<script setup lang="ts">
import { computed } from 'vue';
import { storeToRefs } from 'pinia';
import { useWebSocket } from '../composables/useWebSocket';
import SessionCard from '../components/SessionCard.vue';
import { useStore } from '../stores/store';
const store = useStore();
const { sessions, isLoading, reminderSessions } = storeToRefs(store);
useWebSocket();
// Compute se há alertas
const hasSessionAlerts = computed(() => reminderSessions.value);
</script>
<template>
<div class="bg-bg min-h-screen text-text">
<!-- Header de navegação -->
<div class="border-b border-border bg-cardBg">
<div class="p-6">
<div class="flex justify-between items-center">
<div class="flex items-center gap-2">
<h1 class="text-2xl font-bold text-accent">SESSÕES</h1>
<div v-if="hasSessionAlerts" class="w-2 h-2 bg-red-500 rounded-full"></div>
</div>
</div>
</div>
</div>
<!-- Loading -->
<div v-if="isLoading" class="flex justify-center items-center h-64">
<div class="animate-spin rounded-full h-12 w-12 border-b-2 border-accent"></div>
</div>
<!-- Conteúdo principal -->
<div v-else class="p-6">
<!-- Grid de sessões -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<SessionCard
v-for="(session, index) in sessions"
:key="`session_${index}`"
:session="session"
:index="index"
/>
</div>
</div>
</div>
</template>

View File

@ -0,0 +1,30 @@
export interface Application {
id: string;
name: string;
db: string;
status: string;
diskUse?: string;
diskSize?: string;
diskAvailable?: string;
url?: string;
qrcode?: string;
number?: string;
}
export interface Session {
name: string;
ipAddress: string;
memoryTotal: string;
memoryUsed: string;
memoryCache: string;
memoryFree: string;
diskSize: string;
diskUsed: string;
diskAvailable: string;
appName?: string[];
}
export interface RefreshDataPayload {
applications: Application[];
sessions: Session[];
}

View File

@ -0,0 +1,27 @@
import { defineStore } from 'pinia';
import type { Application, Session } from '../props/websocketResponse';
import { computed, reactive, ref } from 'vue';
export const useStore = defineStore('application', () => {
const applications = ref<Application[]>([]);
const sessions = ref<Session[]>([]);
const isLoading = ref(true);
const reminderSessions = ref(false);
const setApplications = (apps: Application[]) => {
applications.value = apps;
};
const setSessions = (sessionData: Session[]) => {
sessions.value = sessionData;
};
return {
applications,
sessions,
isLoading,
reminderSessions,
setApplications,
setSessions,
};
});

View File

@ -11,5 +11,5 @@
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
"include": ["src/**/*.ts", "src/**/*.tsx"]
}

View File

@ -1,7 +1,11 @@
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
// https://vite.dev/config/
export default defineConfig({
plugins: [vue()],
})
server: {
port: 3333,
host: '0.0.0.0',
},
});

293
yarn.lock
View File

@ -331,6 +331,11 @@
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz#87079f137b5fdb75da11508419aa998cc8cc3d8b"
integrity sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==
"@socket.io/component-emitter@~3.1.0":
version "3.1.2"
resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2"
integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==
"@types/estree@1.0.8":
version "1.0.8"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e"
@ -419,6 +424,33 @@
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343"
integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
"@vue/devtools-api@^7.7.2":
version "7.7.7"
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-7.7.7.tgz#5ef5f55f60396220725a273548c0d7ee983d5d34"
integrity sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==
dependencies:
"@vue/devtools-kit" "^7.7.7"
"@vue/devtools-kit@^7.7.7":
version "7.7.7"
resolved "https://registry.yarnpkg.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz#41a64f9526e9363331c72405544df020ce2e3641"
integrity sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==
dependencies:
"@vue/devtools-shared" "^7.7.7"
birpc "^2.3.0"
hookable "^5.5.3"
mitt "^3.0.1"
perfect-debounce "^1.0.0"
speakingurl "^14.0.1"
superjson "^2.2.2"
"@vue/devtools-shared@^7.7.7":
version "7.7.7"
resolved "https://registry.yarnpkg.com/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz#ff14aa8c1262ebac8c0397d3b09f767cd489750c"
integrity sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==
dependencies:
rfdc "^1.4.1"
"@vue/language-core@3.0.5":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-3.0.5.tgz#c296c65e7b2e6d69fbf2088f0208a55362825323"
@ -521,6 +553,11 @@ arg@^5.0.2:
resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
autoprefixer@^10.4.21:
version "10.4.21"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.21.tgz#77189468e7a8ad1d9a37fbc08efc9f480cf0a95d"
@ -533,6 +570,15 @@ autoprefixer@^10.4.21:
picocolors "^1.1.1"
postcss-value-parser "^4.2.0"
axios@^1.11.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.11.0.tgz#c2ec219e35e414c025b2095e8b8280278478fdb6"
integrity sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==
dependencies:
follow-redirects "^1.15.6"
form-data "^4.0.4"
proxy-from-env "^1.1.0"
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@ -543,6 +589,11 @@ binary-extensions@^2.0.0:
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
birpc@^2.3.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/birpc/-/birpc-2.5.0.tgz#3a014e54c17eceba0ce15738d484ea371dbf6527"
integrity sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==
brace-expansion@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7"
@ -567,6 +618,14 @@ browserslist@^4.24.4:
node-releases "^2.0.19"
update-browserslist-db "^1.1.3"
call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
dependencies:
es-errors "^1.3.0"
function-bind "^1.1.2"
camelcase-css@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
@ -604,11 +663,25 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
commander@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
copy-anything@^3.0.2:
version "3.0.5"
resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-3.0.5.tgz#2d92dce8c498f790fa7ad16b01a1ae5a45b020a0"
integrity sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==
dependencies:
is-what "^4.1.8"
cross-spawn@^7.0.6:
version "7.0.6"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
@ -633,6 +706,18 @@ de-indent@^1.0.2:
resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
debug@~4.3.1, debug@~4.3.2:
version "4.3.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
dependencies:
ms "^2.1.3"
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
didyoumean@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
@ -643,6 +728,15 @@ dlv@^1.1.3:
resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
dunder-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
dependencies:
call-bind-apply-helpers "^1.0.1"
es-errors "^1.3.0"
gopd "^1.2.0"
eastasianwidth@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
@ -663,11 +757,54 @@ emoji-regex@^9.2.2:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
engine.io-client@~6.6.1:
version "6.6.3"
resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.3.tgz#815393fa24f30b8e6afa8f77ccca2f28146be6de"
integrity sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==
dependencies:
"@socket.io/component-emitter" "~3.1.0"
debug "~4.3.1"
engine.io-parser "~5.2.1"
ws "~8.17.1"
xmlhttprequest-ssl "~2.1.1"
engine.io-parser@~5.2.1:
version "5.2.3"
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f"
integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==
entities@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
es-define-property@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
es-errors@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1"
integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
dependencies:
es-errors "^1.3.0"
es-set-tostringtag@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
dependencies:
es-errors "^1.3.0"
get-intrinsic "^1.2.6"
has-tostringtag "^1.0.2"
hasown "^2.0.2"
esbuild@^0.25.0:
version "0.25.9"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.9.tgz#15ab8e39ae6cdc64c24ff8a2c0aef5b3fd9fa976"
@ -740,6 +877,11 @@ fill-range@^7.1.1:
dependencies:
to-regex-range "^5.0.1"
follow-redirects@^1.15.6:
version "1.15.11"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340"
integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==
foreground-child@^3.1.0:
version "3.3.1"
resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f"
@ -748,6 +890,17 @@ foreground-child@^3.1.0:
cross-spawn "^7.0.6"
signal-exit "^4.0.1"
form-data@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4"
integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
es-set-tostringtag "^2.1.0"
hasown "^2.0.2"
mime-types "^2.1.12"
fraction.js@^4.3.7:
version "4.3.7"
resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
@ -763,6 +916,30 @@ function-bind@^1.1.2:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
get-intrinsic@^1.2.6:
version "1.3.0"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
dependencies:
call-bind-apply-helpers "^1.0.2"
es-define-property "^1.0.1"
es-errors "^1.3.0"
es-object-atoms "^1.1.1"
function-bind "^1.1.2"
get-proto "^1.0.1"
gopd "^1.2.0"
has-symbols "^1.1.0"
hasown "^2.0.2"
math-intrinsics "^1.1.0"
get-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
dependencies:
dunder-proto "^1.0.1"
es-object-atoms "^1.0.0"
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@ -789,6 +966,23 @@ glob@^10.3.10:
package-json-from-dist "^1.0.0"
path-scurry "^1.11.1"
gopd@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
has-symbols@^1.0.3, has-symbols@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
has-tostringtag@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
dependencies:
has-symbols "^1.0.3"
hasown@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
@ -801,6 +995,11 @@ he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
hookable@^5.5.3:
version "5.5.3"
resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d"
integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
@ -837,6 +1036,11 @@ is-number@^7.0.0:
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
is-what@^4.1.8:
version "4.1.16"
resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f"
integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@ -883,6 +1087,11 @@ magic-string@^0.30.17:
dependencies:
"@jridgewell/sourcemap-codec" "^1.5.0"
math-intrinsics@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
merge2@^1.3.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
@ -896,6 +1105,18 @@ micromatch@^4.0.8:
braces "^3.0.3"
picomatch "^2.3.1"
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.12:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
minimatch@^9.0.4:
version "9.0.5"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
@ -908,6 +1129,16 @@ minimatch@^9.0.4:
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
mitt@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
ms@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
muggle-string@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328"
@ -980,6 +1211,11 @@ path-scurry@^1.11.1:
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
perfect-debounce@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a"
integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
picocolors@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
@ -1000,6 +1236,13 @@ pify@^2.3.0:
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
pinia@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/pinia/-/pinia-3.0.3.tgz#f412019bdeb2f45e85927b432803190343e12d89"
integrity sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==
dependencies:
"@vue/devtools-api" "^7.7.2"
pirates@^4.0.1:
version "4.0.7"
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22"
@ -1058,6 +1301,11 @@ postcss@^8.4.47, postcss@^8.5.6:
picocolors "^1.1.1"
source-map-js "^1.2.1"
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
@ -1091,6 +1339,11 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f"
integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==
rfdc@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca"
integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==
rollup@^4.43.0:
version "4.46.2"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.46.2.tgz#09b1a45d811e26d09bed63dc3ecfb6831c16ce32"
@ -1144,11 +1397,34 @@ signal-exit@^4.0.1:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
socket.io-client@^4.8.1:
version "4.8.1"
resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.1.tgz#1941eca135a5490b94281d0323fe2a35f6f291cb"
integrity sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==
dependencies:
"@socket.io/component-emitter" "~3.1.0"
debug "~4.3.2"
engine.io-client "~6.6.1"
socket.io-parser "~4.2.4"
socket.io-parser@~4.2.4:
version "4.2.4"
resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83"
integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==
dependencies:
"@socket.io/component-emitter" "~3.1.0"
debug "~4.3.1"
source-map-js@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
speakingurl@^14.0.1:
version "14.0.1"
resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53"
integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==
"string-width-cjs@npm:string-width@^4.2.0":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
@ -1210,6 +1486,13 @@ sucrase@^3.35.0:
pirates "^4.0.1"
ts-interface-checker "^0.1.9"
superjson@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/superjson/-/superjson-2.2.2.tgz#9d52bf0bf6b5751a3c3472f1292e714782ba3173"
integrity sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==
dependencies:
copy-anything "^3.0.2"
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
@ -1365,6 +1648,16 @@ wrap-ansi@^8.1.0:
string-width "^5.0.1"
strip-ansi "^7.0.1"
ws@~8.17.1:
version "8.17.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b"
integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==
xmlhttprequest-ssl@~2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz#e9e8023b3f29ef34b97a859f584c5e6c61418e23"
integrity sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==
yaml@^2.3.4:
version "2.8.1"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79"