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 TypeScriptmaster
parent
f80f277660
commit
4f31f091e6
|
@ -0,0 +1 @@
|
|||
VITE_URL_BACKEND=http://seu-backend-url
|
|
@ -12,6 +12,9 @@ dist
|
|||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Arquivos de ambiente
|
||||
.env
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
22
router.ts
22
router.ts
|
@ -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;
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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,
|
||||
};
|
||||
}
|
14
src/main.ts
14
src/main.ts
|
@ -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');
|
||||
|
|
|
@ -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
|
||||
}
|
||||
];
|
||||
|
|
|
@ -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>
|
|
@ -1,6 +0,0 @@
|
|||
<script setup lang="ts">
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<h1 class="text-text">Section</h1>
|
||||
</template>
|
|
@ -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>
|
|
@ -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[];
|
||||
}
|
|
@ -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,
|
||||
};
|
||||
});
|
|
@ -11,5 +11,5 @@
|
|||
"noFallthroughCasesInSwitch": true,
|
||||
"noUncheckedSideEffectImports": true
|
||||
},
|
||||
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
|
||||
"include": ["src/**/*.ts", "src/**/*.tsx"]
|
||||
}
|
||||
|
|
|
@ -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
293
yarn.lock
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue