From 6ec8855c008d38e4909c1828d73d37ba8c3612e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20S=C3=A1nchez=20Pizarro?= Date: Tue, 20 Jan 2026 23:49:19 +0100 Subject: [PATCH] add landing and subscription plans MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Omar Sánchez Pizarro --- .dockerignore | 4 +- .gitignore | 4 +- DOCKER.md | 10 +- docker-compose.README.md | 2 +- docker-compose.yml | 36 +- landing/.astro/types.d.ts | 1 + landing/src/env.d.ts | 1 + package.json | 8 +- web/QUICKSTART.md | 4 +- web/backend/config/subscriptionPlans.js | 120 + web/backend/middlewares/subscriptionLimits.js | 133 + web/backend/routes/subscription.js | 208 + web/backend/routes/workers.js | 3 +- web/backend/server.js | 2 + web/backend/services/mongodb.js | 98 + web/backend/utils/fingerprint.js | 2 +- web/{frontend => dashboard}/.dockerignore | 0 .../CONFIGURACION_BACKEND.md | 0 web/{frontend => dashboard}/Dockerfile | 4 +- web/{frontend => dashboard}/index.html | 0 web/dashboard/nginx-dashboard.conf | 24 + web/{frontend => dashboard}/nginx.conf | 0 web/{frontend => dashboard}/package-lock.json | 4 +- web/{frontend => dashboard}/package.json | 2 +- web/{frontend => dashboard}/postcss.config.js | 0 .../public/android-chrome-192x192.png | Bin .../public/android-chrome-512x512.png | Bin .../public/apple-touch-icon.png | Bin .../public/favicon-16x16.png | Bin .../public/favicon-32x32.png | Bin .../public/favicon.ico | Bin web/{frontend => dashboard}/public/logo.jpg | Bin .../public/manifest.json | 0 web/{frontend => dashboard}/public/sw.js | 0 web/{frontend => dashboard}/src/App.vue | 10 +- .../src/components/ArticleCard.vue | 0 .../src/components/ToastContainer.vue | 0 .../src/components/ToastNotification.vue | 0 web/{frontend => dashboard}/src/main.js | 34 +- .../src/services/api.js | 22 + .../src/services/auth.js | 0 .../src/services/fingerprint.js | 0 .../src/services/pushNotifications.js | 0 web/{frontend => dashboard}/src/style.css | 0 .../src/views/ArticleDetail.vue | 0 .../src/views/Articles.vue | 0 .../src/views/Dashboard.vue | 0 .../src/views/Favorites.vue | 0 .../src/views/Login.vue | 4 +- .../src/views/Logs.vue | 0 .../src/views/RateLimiter.vue | 0 .../src/views/Sessions.vue | 0 web/dashboard/src/views/Settings.vue | 314 + web/dashboard/src/views/Subscription.vue | 264 + .../src/views/Users.vue | 618 +- .../src/views/Workers.vue | 0 .../tailwind.config.js | 0 web/{frontend => dashboard}/vite.config.js | 1 + web/landing/.gitignore | 23 + web/landing/Dockerfile | 27 + web/landing/README.md | 77 + web/landing/astro.config.mjs | 9 + web/landing/package-lock.json | 6119 +++++++++++++++++ web/landing/package.json | 18 + web/landing/public/favicon.svg | 5 + web/landing/public/logo.jpg | Bin 0 -> 39958 bytes web/landing/src/components/CTA.astro | 91 + web/landing/src/components/Features.astro | 98 + web/landing/src/components/Hero.astro | 84 + web/landing/src/components/HowItWorks.astro | 103 + web/landing/src/components/Platforms.astro | 103 + web/landing/src/components/Pricing.astro | 231 + web/landing/src/env.d.ts | 1 + web/landing/src/layouts/Layout.astro | 63 + web/landing/src/pages/index.astro | 19 + web/landing/tailwind.config.mjs | 88 + web/landing/tsconfig.json | 8 + web/nginx.conf | 76 + web/start.sh | 20 +- 79 files changed, 8839 insertions(+), 361 deletions(-) create mode 100644 landing/.astro/types.d.ts create mode 100644 landing/src/env.d.ts create mode 100644 web/backend/config/subscriptionPlans.js create mode 100644 web/backend/middlewares/subscriptionLimits.js create mode 100644 web/backend/routes/subscription.js rename web/{frontend => dashboard}/.dockerignore (100%) rename web/{frontend => dashboard}/CONFIGURACION_BACKEND.md (100%) rename web/{frontend => dashboard}/Dockerfile (77%) rename web/{frontend => dashboard}/index.html (100%) create mode 100644 web/dashboard/nginx-dashboard.conf rename web/{frontend => dashboard}/nginx.conf (100%) rename web/{frontend => dashboard}/package-lock.json (99%) rename web/{frontend => dashboard}/package.json (93%) rename web/{frontend => dashboard}/postcss.config.js (100%) rename web/{frontend => dashboard}/public/android-chrome-192x192.png (100%) rename web/{frontend => dashboard}/public/android-chrome-512x512.png (100%) rename web/{frontend => dashboard}/public/apple-touch-icon.png (100%) rename web/{frontend => dashboard}/public/favicon-16x16.png (100%) rename web/{frontend => dashboard}/public/favicon-32x32.png (100%) rename web/{frontend => dashboard}/public/favicon.ico (100%) rename web/{frontend => dashboard}/public/logo.jpg (100%) rename web/{frontend => dashboard}/public/manifest.json (100%) rename web/{frontend => dashboard}/public/sw.js (100%) rename web/{frontend => dashboard}/src/App.vue (97%) rename web/{frontend => dashboard}/src/components/ArticleCard.vue (100%) rename web/{frontend => dashboard}/src/components/ToastContainer.vue (100%) rename web/{frontend => dashboard}/src/components/ToastNotification.vue (100%) rename web/{frontend => dashboard}/src/main.js (74%) rename web/{frontend => dashboard}/src/services/api.js (86%) rename web/{frontend => dashboard}/src/services/auth.js (100%) rename web/{frontend => dashboard}/src/services/fingerprint.js (100%) rename web/{frontend => dashboard}/src/services/pushNotifications.js (100%) rename web/{frontend => dashboard}/src/style.css (100%) rename web/{frontend => dashboard}/src/views/ArticleDetail.vue (100%) rename web/{frontend => dashboard}/src/views/Articles.vue (100%) rename web/{frontend => dashboard}/src/views/Dashboard.vue (100%) rename web/{frontend => dashboard}/src/views/Favorites.vue (100%) rename web/{frontend => dashboard}/src/views/Login.vue (99%) rename web/{frontend => dashboard}/src/views/Logs.vue (100%) rename web/{frontend => dashboard}/src/views/RateLimiter.vue (100%) rename web/{frontend => dashboard}/src/views/Sessions.vue (100%) create mode 100644 web/dashboard/src/views/Settings.vue create mode 100644 web/dashboard/src/views/Subscription.vue rename web/{frontend => dashboard}/src/views/Users.vue (51%) rename web/{frontend => dashboard}/src/views/Workers.vue (100%) rename web/{frontend => dashboard}/tailwind.config.js (100%) rename web/{frontend => dashboard}/vite.config.js (95%) create mode 100644 web/landing/.gitignore create mode 100644 web/landing/Dockerfile create mode 100644 web/landing/README.md create mode 100644 web/landing/astro.config.mjs create mode 100644 web/landing/package-lock.json create mode 100644 web/landing/package.json create mode 100644 web/landing/public/favicon.svg create mode 100644 web/landing/public/logo.jpg create mode 100644 web/landing/src/components/CTA.astro create mode 100644 web/landing/src/components/Features.astro create mode 100644 web/landing/src/components/Hero.astro create mode 100644 web/landing/src/components/HowItWorks.astro create mode 100644 web/landing/src/components/Platforms.astro create mode 100644 web/landing/src/components/Pricing.astro create mode 100644 web/landing/src/env.d.ts create mode 100644 web/landing/src/layouts/Layout.astro create mode 100644 web/landing/src/pages/index.astro create mode 100644 web/landing/tailwind.config.mjs create mode 100644 web/landing/tsconfig.json create mode 100644 web/nginx.conf diff --git a/.dockerignore b/.dockerignore index 2450ed6..d05236e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -18,8 +18,8 @@ yarn-debug.log* yarn-error.log* # Web -web/frontend/dist/ -web/frontend/.vite/ +web/dashboard/dist/ +web/dashboard/.vite/ # IDE .vscode/ diff --git a/.gitignore b/.gitignore index 292146e..6a747c9 100644 --- a/.gitignore +++ b/.gitignore @@ -177,5 +177,5 @@ yarn-debug.log* yarn-error.log* # Web build -web/frontend/dist/ -web/frontend/.vite/ +web/dashboard/dist/ +web/dashboard/.vite/ diff --git a/DOCKER.md b/DOCKER.md index ba55791..e7eefde 100644 --- a/DOCKER.md +++ b/DOCKER.md @@ -31,7 +31,7 @@ docker-compose up -d Esto iniciará: - **Redis** (puerto 6379) - Cache de artículos - **Backend** (puerto 3001) - API Node.js -- **Frontend** (puerto 3000) - Interfaz web Vue +- **Dashboard** (puerto 3000) - Interfaz web Vue - **Wallabicher Python** - Servicio principal de monitoreo ### 3. Acceder a la interfaz @@ -51,7 +51,7 @@ Abre tu navegador en: **http://localhost:3000** - **WebSocket**: ws://localhost:3001 - **Funciones**: API REST y WebSockets para la interfaz web -### Frontend (Vue + Nginx) +### Dashboard (Vue + Nginx) - **Puerto**: 3000 - **URL**: http://localhost:3000 - **Funciones**: Interfaz web moderna @@ -70,7 +70,7 @@ docker-compose logs -f # Servicio específico docker-compose logs -f wallabicher docker-compose logs -f backend -docker-compose logs -f frontend +docker-compose logs -f dashboard ``` ### Detener servicios @@ -158,11 +158,11 @@ rm -rf monitor.log mkdir -p logs ``` -### El frontend no carga +### El dashboard no carga Verifica los logs: ```bash -docker-compose logs frontend +docker-compose logs dashboard ``` ### Reconstruir todo desde cero diff --git a/docker-compose.README.md b/docker-compose.README.md index 7b22d75..9371dc0 100644 --- a/docker-compose.README.md +++ b/docker-compose.README.md @@ -44,7 +44,7 @@ Abre: **http://localhost:3000** | Servicio | Puerto | Descripción | |----------|--------|-------------| -| **Frontend** | 3000 | Interfaz web Vue | +| **Dashboard** | 3000 | Interfaz web Vue | | **Backend** | 3001 | API Node.js | | **Redis** | 6379 | Cache de artículos | | **Wallabicher** | - | Servicio Python (interno) | diff --git a/docker-compose.yml b/docker-compose.yml index a36c0a7..609c06e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -55,18 +55,46 @@ services: timeout: 10s retries: 3 - # Frontend Vue - frontend: + # Dashboard Vue + dashboard: build: - context: ./web/frontend + context: ./web/dashboard dockerfile: Dockerfile - container_name: wallabicher-frontend + container_name: wallabicher-dashboard + environment: + - NGINX_CONF=nginx-dashboard.conf + volumes: + - ./web/dashboard/nginx-dashboard.conf:/etc/nginx/conf.d/default.conf:ro depends_on: - backend networks: - wallabicher-network restart: unless-stopped + # Landing page (Astro) + landing: + build: + context: ./landing + dockerfile: Dockerfile + container_name: wallabicher-landing + networks: + - wallabicher-network + restart: unless-stopped + + # Nginx reverse proxy principal + nginx: + image: nginx:alpine + container_name: wallabicher-nginx + volumes: + - ./web/nginx.conf:/etc/nginx/conf.d/default.conf:ro + depends_on: + - backend + - dashboard + - landing + networks: + - wallabicher-network + restart: unless-stopped + # Servicio Python principal (Wallabicher) # NOTA: Para usar MongoDB, asegúrate de que config.yaml tenga: # cache: diff --git a/landing/.astro/types.d.ts b/landing/.astro/types.d.ts new file mode 100644 index 0000000..f964fe0 --- /dev/null +++ b/landing/.astro/types.d.ts @@ -0,0 +1 @@ +/// diff --git a/landing/src/env.d.ts b/landing/src/env.d.ts new file mode 100644 index 0000000..9bc5cb4 --- /dev/null +++ b/landing/src/env.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/package.json b/package.json index ef190be..15b0b0e 100644 --- a/package.json +++ b/package.json @@ -20,10 +20,10 @@ "docker:clean": "docker compose down -v && docker system prune -f", "backend:dev": "cd web/backend && npm run dev", "backend:start": "cd web/backend && npm start", - "frontend:dev": "cd web/frontend && npm run dev", - "frontend:build": "cd web/frontend && npm run build", - "frontend:preview": "cd web/frontend && npm run preview", - "install:all": "cd web/backend && npm install && cd ../frontend && npm install", + "dashboard:dev": "cd web/dashboard && npm run dev", + "dashboard:build": "cd web/dashboard && npm run build", + "dashboard:preview": "cd web/dashboard && npm run preview", + "install:all": "cd web/backend && npm install && cd ../dashboard && npm install", "git:status": "git status", "git:pull": "git pull", "git:push": "git push", diff --git a/web/QUICKSTART.md b/web/QUICKSTART.md index 23d0d0e..f82aff9 100644 --- a/web/QUICKSTART.md +++ b/web/QUICKSTART.md @@ -10,9 +10,9 @@ cd web/backend npm install ``` -**Frontend:** +**Dashboard:** ```bash -cd web/frontend +cd web/dashboard npm install ``` diff --git a/web/backend/config/subscriptionPlans.js b/web/backend/config/subscriptionPlans.js new file mode 100644 index 0000000..0360f99 --- /dev/null +++ b/web/backend/config/subscriptionPlans.js @@ -0,0 +1,120 @@ +// Planes de suscripción con sus límites y precios +export const SUBSCRIPTION_PLANS = { + free: { + id: 'free', + name: 'Gratis', + description: 'Perfecto para empezar', + price: { + monthly: 0, + yearly: 0, + }, + limits: { + maxWorkers: 2, // Número máximo de búsquedas/workers + maxNotificationsPerDay: 50, + platforms: ['wallapop'], // Solo Wallapop + }, + features: [ + 'Hasta 2 búsquedas simultáneas', + 'Solo Wallapop', + '50 notificaciones por día', + 'Soporte por email', + ], + }, + basic: { + id: 'basic', + name: 'Básico', + description: 'Para usuarios ocasionales', + price: { + monthly: 9.99, + yearly: 99.99, // ~17% descuento + }, + limits: { + maxWorkers: 5, + maxNotificationsPerDay: 200, + platforms: ['wallapop', 'vinted'], + }, + features: [ + 'Hasta 5 búsquedas simultáneas', + 'Wallapop y Vinted', + '200 notificaciones por día', + 'Soporte prioritario', + 'Sin límite de favoritos', + ], + }, + pro: { + id: 'pro', + name: 'Pro', + description: 'Para usuarios avanzados', + price: { + monthly: 19.99, + yearly: 199.99, // ~17% descuento + }, + limits: { + maxWorkers: 15, + maxNotificationsPerDay: 1000, + platforms: ['wallapop', 'vinted', 'buyee'], + }, + features: [ + 'Hasta 15 búsquedas simultáneas', + 'Todas las plataformas', + '1000 notificaciones por día', + 'Soporte prioritario 24/7', + 'API access', + 'Webhooks personalizados', + ], + }, + enterprise: { + id: 'enterprise', + name: 'Enterprise', + description: 'Para equipos y uso intensivo', + price: { + monthly: 49.99, + yearly: 499.99, // ~17% descuento + }, + limits: { + maxWorkers: -1, // Ilimitado + maxNotificationsPerDay: -1, // Ilimitado + platforms: ['wallapop', 'vinted', 'buyee'], // Todas + }, + features: [ + 'Búsquedas ilimitadas', + 'Notificaciones ilimitadas', + 'Todas las plataformas', + 'Soporte dedicado', + 'API completa', + 'Webhooks personalizados', + 'Gestión de múltiples usuarios', + 'Estadísticas avanzadas', + ], + }, +}; + +// Obtener plan por ID +export function getPlan(planId) { + return SUBSCRIPTION_PLANS[planId] || SUBSCRIPTION_PLANS.free; +} + +// Verificar si un plan tiene una característica +export function hasFeature(planId, feature) { + const plan = getPlan(planId); + return plan.features.includes(feature); +} + +// Verificar si un plan tiene acceso a una plataforma +export function hasPlatformAccess(planId, platform) { + const plan = getPlan(planId); + return plan.limits.platforms.includes(platform) || plan.limits.platforms.length === 0; +} + +// Obtener límite de workers para un plan +export function getMaxWorkers(planId) { + const plan = getPlan(planId); + return plan.limits.maxWorkers; +} + +// Obtener límite de notificaciones diarias +export function getMaxNotificationsPerDay(planId) { + const plan = getPlan(planId); + return plan.limits.maxNotificationsPerDay; +} + diff --git a/web/backend/middlewares/subscriptionLimits.js b/web/backend/middlewares/subscriptionLimits.js new file mode 100644 index 0000000..8d9bd18 --- /dev/null +++ b/web/backend/middlewares/subscriptionLimits.js @@ -0,0 +1,133 @@ +import { getUser, getUserSubscription, getWorkerCount } from '../services/mongodb.js'; +import { getPlan, getMaxWorkers, hasPlatformAccess } from '../config/subscriptionPlans.js'; + +// Middleware para verificar límites de suscripción +export async function checkSubscriptionLimits(req, res, next) { + try { + const username = req.user?.username; + + if (!username) { + return res.status(401).json({ error: 'Authentication required' }); + } + + // Obtener usuario y suscripción + const user = await getUser(username); + if (!user) { + return res.status(404).json({ error: 'Usuario no encontrado' }); + } + + // Si es admin, no aplicar límites + if (user.role === 'admin') { + return next(); + } + + const subscription = await getUserSubscription(username); + const planId = subscription?.planId || 'free'; + const plan = getPlan(planId); + + // Añadir información del plan al request para uso posterior + req.userPlan = { + planId, + plan, + subscription, + }; + + next(); + } catch (error) { + console.error('Error verificando límites de suscripción:', error); + res.status(500).json({ error: 'Error verificando límites de suscripción' }); + } +} + +// Middleware para verificar límite de workers +export async function checkWorkerLimit(req, res, next) { + try { + const username = req.user?.username; + const userPlan = req.userPlan; + + if (!userPlan) { + // Si no hay userPlan, ejecutar checkSubscriptionLimits primero + await checkSubscriptionLimits(req, res, () => {}); + if (res.headersSent) return; + } + + const planId = req.userPlan.planId; + const maxWorkers = getMaxWorkers(planId); + + // Si es ilimitado (-1), permitir + if (maxWorkers === -1) { + return next(); + } + + // Obtener número actual de workers + const currentWorkerCount = await getWorkerCount(username); + + // Si estamos actualizando workers, verificar el nuevo número + if (req.method === 'PUT' && req.body?.items) { + const newWorkerCount = (req.body.items || []).filter( + (item, index) => !(req.body.disabled || []).includes(index) + ).length; + + if (newWorkerCount > maxWorkers) { + return res.status(403).json({ + error: 'Límite de búsquedas excedido', + message: `Tu plan actual (${req.userPlan.plan.name}) permite hasta ${maxWorkers} búsquedas simultáneas. Estás intentando crear ${newWorkerCount}.`, + currentPlan: planId, + maxWorkers, + currentCount: currentWorkerCount, + requestedCount: newWorkerCount, + }); + } + } else if (currentWorkerCount >= maxWorkers) { + // Si ya alcanzó el límite y está intentando crear más + return res.status(403).json({ + error: 'Límite de búsquedas alcanzado', + message: `Tu plan actual (${req.userPlan.plan.name}) permite hasta ${maxWorkers} búsquedas simultáneas.`, + currentPlan: planId, + maxWorkers, + currentCount: currentWorkerCount, + }); + } + + next(); + } catch (error) { + console.error('Error verificando límite de workers:', error); + res.status(500).json({ error: 'Error verificando límite de workers' }); + } +} + +// Middleware para verificar acceso a plataforma +export async function checkPlatformAccess(req, res, next) { + try { + const platform = req.body?.platform || req.query?.platform; + + if (!platform) { + return next(); // Si no hay plataforma especificada, continuar + } + + const userPlan = req.userPlan; + + if (!userPlan) { + await checkSubscriptionLimits(req, res, () => {}); + if (res.headersSent) return; + } + + const planId = req.userPlan.planId; + + if (!hasPlatformAccess(planId, platform)) { + return res.status(403).json({ + error: 'Plataforma no disponible en tu plan', + message: `La plataforma "${platform}" no está disponible en tu plan actual (${req.userPlan.plan.name}).`, + currentPlan: planId, + requestedPlatform: platform, + availablePlatforms: req.userPlan.plan.limits.platforms, + }); + } + + next(); + } catch (error) { + console.error('Error verificando acceso a plataforma:', error); + res.status(500).json({ error: 'Error verificando acceso a plataforma' }); + } +} + diff --git a/web/backend/routes/subscription.js b/web/backend/routes/subscription.js new file mode 100644 index 0000000..b33fe2c --- /dev/null +++ b/web/backend/routes/subscription.js @@ -0,0 +1,208 @@ +import express from 'express'; +import { basicAuthMiddleware } from '../middlewares/auth.js'; +import { adminAuthMiddleware } from '../middlewares/adminAuth.js'; +import { getUser, getUserSubscription, updateUserSubscription, getWorkerCount } from '../services/mongodb.js'; +import { SUBSCRIPTION_PLANS, getPlan } from '../config/subscriptionPlans.js'; + +const router = express.Router(); + +// Obtener planes disponibles (público) +router.get('/plans', (req, res) => { + try { + const plans = Object.values(SUBSCRIPTION_PLANS).map(plan => ({ + id: plan.id, + name: plan.name, + description: plan.description, + price: plan.price, + limits: { + maxWorkers: plan.limits.maxWorkers, + maxNotificationsPerDay: plan.limits.maxNotificationsPerDay, + platforms: plan.limits.platforms, + }, + features: plan.features, + })); + + res.json({ plans }); + } catch (error) { + console.error('Error obteniendo planes:', error); + res.status(500).json({ error: error.message }); + } +}); + +// Obtener suscripción del usuario actual +router.get('/me', basicAuthMiddleware, async (req, res) => { + try { + const username = req.user.username; + const subscription = await getUserSubscription(username); + const user = await getUser(username); + const workerCount = await getWorkerCount(username); + + const planId = subscription?.planId || 'free'; + const plan = getPlan(planId); + + res.json({ + subscription: { + planId, + plan: { + id: plan.id, + name: plan.name, + description: plan.description, + price: plan.price, + limits: plan.limits, + features: plan.features, + }, + status: subscription?.status || 'active', + currentPeriodStart: subscription?.currentPeriodStart || user?.createdAt, + currentPeriodEnd: subscription?.currentPeriodEnd || null, + cancelAtPeriodEnd: subscription?.cancelAtPeriodEnd || false, + }, + usage: { + workers: workerCount, + maxWorkers: plan.limits.maxWorkers === -1 ? 'Ilimitado' : plan.limits.maxWorkers, + }, + }); + } catch (error) { + console.error('Error obteniendo suscripción:', error); + res.status(500).json({ error: error.message }); + } +}); + +// Actualizar suscripción (requiere admin o para el propio usuario en caso de cancelación) +router.put('/me', basicAuthMiddleware, async (req, res) => { + try { + const username = req.user.username; + const { planId, status, cancelAtPeriodEnd } = req.body; + + if (!planId) { + return res.status(400).json({ error: 'planId es requerido' }); + } + + // Verificar que el plan existe + const plan = getPlan(planId); + if (!plan) { + return res.status(400).json({ error: 'Plan no válido' }); + } + + // Solo permitir actualizar a plan gratuito o cancelar suscripción + // Para actualizar a planes de pago, se requiere integración con pasarela de pago + if (planId !== 'free' && !req.user.role === 'admin') { + return res.status(403).json({ + error: 'Para actualizar a un plan de pago, contacta con soporte o usa la pasarela de pago' + }); + } + + const subscription = await getUserSubscription(username); + + // Calcular fechas del período + const now = new Date(); + let currentPeriodStart = subscription?.currentPeriodStart || now; + let currentPeriodEnd = null; + + if (planId !== 'free') { + // Para planes de pago, establecer período mensual o anual según corresponda + // Por ahora, asumimos mensual (30 días) + currentPeriodEnd = new Date(now); + currentPeriodEnd.setMonth(currentPeriodEnd.getMonth() + 1); + } + + await updateUserSubscription(username, { + planId, + status: status || 'active', + currentPeriodStart, + currentPeriodEnd, + cancelAtPeriodEnd: cancelAtPeriodEnd || false, + }); + + console.log(`✅ Suscripción actualizada para ${username}: ${planId}`); + res.json({ + success: true, + message: 'Suscripción actualizada correctamente', + subscription: { + planId, + status: status || 'active', + currentPeriodStart, + currentPeriodEnd, + cancelAtPeriodEnd: cancelAtPeriodEnd || false, + }, + }); + } catch (error) { + console.error('Error actualizando suscripción:', error); + res.status(500).json({ error: error.message }); + } +}); + +// Obtener suscripción de cualquier usuario (solo admin) +router.get('/:username', basicAuthMiddleware, adminAuthMiddleware, async (req, res) => { + try { + const { username } = req.params; + const subscription = await getUserSubscription(username); + const user = await getUser(username); + const workerCount = await getWorkerCount(username); + + const planId = subscription?.planId || 'free'; + const plan = getPlan(planId); + + res.json({ + subscription: { + planId, + plan: { + id: plan.id, + name: plan.name, + description: plan.description, + price: plan.price, + limits: plan.limits, + features: plan.features, + }, + status: subscription?.status || 'active', + currentPeriodStart: subscription?.currentPeriodStart || user?.createdAt, + currentPeriodEnd: subscription?.currentPeriodEnd || null, + cancelAtPeriodEnd: subscription?.cancelAtPeriodEnd || false, + }, + usage: { + workers: workerCount, + maxWorkers: plan.limits.maxWorkers === -1 ? 'Ilimitado' : plan.limits.maxWorkers, + }, + }); + } catch (error) { + console.error('Error obteniendo suscripción:', error); + res.status(500).json({ error: error.message }); + } +}); + +// Actualizar suscripción de cualquier usuario (solo admin) +router.put('/:username', basicAuthMiddleware, adminAuthMiddleware, async (req, res) => { + try { + const { username } = req.params; + const { planId, status, currentPeriodStart, currentPeriodEnd, cancelAtPeriodEnd } = req.body; + + if (!planId) { + return res.status(400).json({ error: 'planId es requerido' }); + } + + // Verificar que el plan existe + const plan = getPlan(planId); + if (!plan) { + return res.status(400).json({ error: 'Plan no válido' }); + } + + await updateUserSubscription(username, { + planId, + status: status || 'active', + currentPeriodStart: currentPeriodStart ? new Date(currentPeriodStart) : new Date(), + currentPeriodEnd: currentPeriodEnd ? new Date(currentPeriodEnd) : null, + cancelAtPeriodEnd: cancelAtPeriodEnd || false, + }); + + console.log(`✅ Suscripción actualizada para ${username}: ${planId} por admin ${req.user.username}`); + res.json({ + success: true, + message: `Suscripción de ${username} actualizada correctamente`, + }); + } catch (error) { + console.error('Error actualizando suscripción:', error); + res.status(500).json({ error: error.message }); + } +}); + +export default router; + diff --git a/web/backend/routes/workers.js b/web/backend/routes/workers.js index b2e3f09..1be6b1a 100644 --- a/web/backend/routes/workers.js +++ b/web/backend/routes/workers.js @@ -2,6 +2,7 @@ import express from 'express'; import { basicAuthMiddleware } from '../middlewares/auth.js'; import { broadcast } from '../services/websocket.js'; import { getWorkers, setWorkers, getDB } from '../services/mongodb.js'; +import { checkSubscriptionLimits, checkWorkerLimit, checkPlatformAccess } from '../middlewares/subscriptionLimits.js'; const router = express.Router(); @@ -23,7 +24,7 @@ router.get('/', basicAuthMiddleware, async (req, res) => { }); // Actualizar workers del usuario autenticado (requiere autenticación) -router.put('/', basicAuthMiddleware, async (req, res) => { +router.put('/', basicAuthMiddleware, checkSubscriptionLimits, checkWorkerLimit, checkPlatformAccess, async (req, res) => { try { const db = getDB(); if (!db) { diff --git a/web/backend/server.js b/web/backend/server.js index d0c05d1..a44818b 100644 --- a/web/backend/server.js +++ b/web/backend/server.js @@ -18,6 +18,7 @@ import telegramRouter from './routes/telegram.js'; import pushRouter from './routes/push.js'; import usersRouter from './routes/users.js'; import adminRouter from './routes/admin.js'; +import subscriptionRouter from './routes/subscription.js'; const app = express(); const server = createServer(app); @@ -49,6 +50,7 @@ app.use('/api/telegram', telegramRouter); app.use('/api/push', pushRouter); app.use('/api/users', usersRouter); app.use('/api/admin', adminRouter); +app.use('/api/subscription', subscriptionRouter); // Inicializar servidor async function startServer() { diff --git a/web/backend/services/mongodb.js b/web/backend/services/mongodb.js index 98cca41..7b27386 100644 --- a/web/backend/services/mongodb.js +++ b/web/backend/services/mongodb.js @@ -1277,6 +1277,104 @@ export async function updateArticleFavorite(platform, id, is_favorite, username) } } +// Funciones para suscripciones +export async function getUserSubscription(username) { + if (!db) { + return null; + } + + try { + const usersCollection = db.collection('users'); + const user = await usersCollection.findOne({ username }); + + if (!user) { + return null; + } + + // Si no tiene suscripción, retornar plan gratuito por defecto + if (!user.subscription) { + return { + planId: 'free', + status: 'active', + currentPeriodStart: user.createdAt || new Date(), + currentPeriodEnd: null, // Plan gratuito no expira + cancelAtPeriodEnd: false, + }; + } + + return user.subscription; + } catch (error) { + console.error(`Error obteniendo suscripción de ${username}:`, error.message); + return null; + } +} + +export async function updateUserSubscription(username, subscriptionData) { + if (!db) { + throw new Error('MongoDB no está disponible'); + } + + try { + const usersCollection = db.collection('users'); + + // Verificar que el usuario existe + const user = await usersCollection.findOne({ username }); + if (!user) { + throw new Error(`Usuario ${username} no existe`); + } + + // Actualizar suscripción + await usersCollection.updateOne( + { username }, + { + $set: { + subscription: { + planId: subscriptionData.planId || 'free', + status: subscriptionData.status || 'active', + currentPeriodStart: subscriptionData.currentPeriodStart || new Date(), + currentPeriodEnd: subscriptionData.currentPeriodEnd || null, + cancelAtPeriodEnd: subscriptionData.cancelAtPeriodEnd || false, + stripeCustomerId: subscriptionData.stripeCustomerId || null, + stripeSubscriptionId: subscriptionData.stripeSubscriptionId || null, + updatedAt: new Date(), + }, + updatedAt: new Date(), + }, + } + ); + + return true; + } catch (error) { + console.error(`Error actualizando suscripción de ${username}:`, error.message); + throw error; + } +} + +export async function getWorkerCount(username) { + if (!db) { + return 0; + } + + try { + const workersCollection = db.collection('workers'); + const workersData = await workersCollection.findOne({ username }); + + if (!workersData || !workersData.items) { + return 0; + } + + // Contar solo workers activos (no deshabilitados) + const activeWorkers = (workersData.items || []).filter( + (item, index) => !(workersData.disabled || []).includes(index) + ); + + return activeWorkers.length; + } catch (error) { + console.error(`Error contando workers de ${username}:`, error.message); + return 0; + } +} + // Cerrar conexión export async function closeMongoDB() { if (mongoClient) { diff --git a/web/backend/utils/fingerprint.js b/web/backend/utils/fingerprint.js index e9d151b..573a2d1 100644 --- a/web/backend/utils/fingerprint.js +++ b/web/backend/utils/fingerprint.js @@ -139,7 +139,7 @@ function parseUserAgent(userAgent) { } /** - * Genera un fingerprint desde el frontend (cuando se envía desde el cliente) + * Genera un fingerprint desde el dashboard (cuando se envía desde el cliente) * @param {string} fingerprintHash - Hash del fingerprint generado en el cliente * @param {Object} deviceInfo - Información del dispositivo del cliente * @param {Object} req - Request object de Express diff --git a/web/frontend/.dockerignore b/web/dashboard/.dockerignore similarity index 100% rename from web/frontend/.dockerignore rename to web/dashboard/.dockerignore diff --git a/web/frontend/CONFIGURACION_BACKEND.md b/web/dashboard/CONFIGURACION_BACKEND.md similarity index 100% rename from web/frontend/CONFIGURACION_BACKEND.md rename to web/dashboard/CONFIGURACION_BACKEND.md diff --git a/web/frontend/Dockerfile b/web/dashboard/Dockerfile similarity index 77% rename from web/frontend/Dockerfile rename to web/dashboard/Dockerfile index 5d7bac2..941108c 100644 --- a/web/frontend/Dockerfile +++ b/web/dashboard/Dockerfile @@ -20,8 +20,8 @@ FROM nginx:alpine # Copiar archivos construidos COPY --from=builder /app/dist /usr/share/nginx/html -# Copiar configuración de nginx -COPY nginx.conf /etc/nginx/conf.d/default.conf +# Copiar configuración de nginx (se puede sobrescribir con volumen) +COPY nginx-dashboard.conf /etc/nginx/conf.d/default.conf EXPOSE 80 diff --git a/web/frontend/index.html b/web/dashboard/index.html similarity index 100% rename from web/frontend/index.html rename to web/dashboard/index.html diff --git a/web/dashboard/nginx-dashboard.conf b/web/dashboard/nginx-dashboard.conf new file mode 100644 index 0000000..acd6f45 --- /dev/null +++ b/web/dashboard/nginx-dashboard.conf @@ -0,0 +1,24 @@ +server { + listen 80; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + # Gzip compression + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/json application/javascript; + + # SPA routing - todas las rutas del dashboard + location / { + try_files $uri $uri/ /index.html; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } +} + diff --git a/web/frontend/nginx.conf b/web/dashboard/nginx.conf similarity index 100% rename from web/frontend/nginx.conf rename to web/dashboard/nginx.conf diff --git a/web/frontend/package-lock.json b/web/dashboard/package-lock.json similarity index 99% rename from web/frontend/package-lock.json rename to web/dashboard/package-lock.json index 2daf3e3..0dc0023 100644 --- a/web/frontend/package-lock.json +++ b/web/dashboard/package-lock.json @@ -1,11 +1,11 @@ { - "name": "wallabicher-frontend", + "name": "wallabicher-dashboard", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "wallabicher-frontend", + "name": "wallabicher-dashboard", "version": "1.0.0", "dependencies": { "@fingerprintjs/fingerprintjs": "^5.0.1", diff --git a/web/frontend/package.json b/web/dashboard/package.json similarity index 93% rename from web/frontend/package.json rename to web/dashboard/package.json index d6df72d..be9144d 100644 --- a/web/frontend/package.json +++ b/web/dashboard/package.json @@ -1,5 +1,5 @@ { - "name": "wallabicher-frontend", + "name": "wallabicher-dashboard", "version": "1.0.0", "type": "module", "scripts": { diff --git a/web/frontend/postcss.config.js b/web/dashboard/postcss.config.js similarity index 100% rename from web/frontend/postcss.config.js rename to web/dashboard/postcss.config.js diff --git a/web/frontend/public/android-chrome-192x192.png b/web/dashboard/public/android-chrome-192x192.png similarity index 100% rename from web/frontend/public/android-chrome-192x192.png rename to web/dashboard/public/android-chrome-192x192.png diff --git a/web/frontend/public/android-chrome-512x512.png b/web/dashboard/public/android-chrome-512x512.png similarity index 100% rename from web/frontend/public/android-chrome-512x512.png rename to web/dashboard/public/android-chrome-512x512.png diff --git a/web/frontend/public/apple-touch-icon.png b/web/dashboard/public/apple-touch-icon.png similarity index 100% rename from web/frontend/public/apple-touch-icon.png rename to web/dashboard/public/apple-touch-icon.png diff --git a/web/frontend/public/favicon-16x16.png b/web/dashboard/public/favicon-16x16.png similarity index 100% rename from web/frontend/public/favicon-16x16.png rename to web/dashboard/public/favicon-16x16.png diff --git a/web/frontend/public/favicon-32x32.png b/web/dashboard/public/favicon-32x32.png similarity index 100% rename from web/frontend/public/favicon-32x32.png rename to web/dashboard/public/favicon-32x32.png diff --git a/web/frontend/public/favicon.ico b/web/dashboard/public/favicon.ico similarity index 100% rename from web/frontend/public/favicon.ico rename to web/dashboard/public/favicon.ico diff --git a/web/frontend/public/logo.jpg b/web/dashboard/public/logo.jpg similarity index 100% rename from web/frontend/public/logo.jpg rename to web/dashboard/public/logo.jpg diff --git a/web/frontend/public/manifest.json b/web/dashboard/public/manifest.json similarity index 100% rename from web/frontend/public/manifest.json rename to web/dashboard/public/manifest.json diff --git a/web/frontend/public/sw.js b/web/dashboard/public/sw.js similarity index 100% rename from web/frontend/public/sw.js rename to web/dashboard/public/sw.js diff --git a/web/frontend/src/App.vue b/web/dashboard/src/App.vue similarity index 97% rename from web/frontend/src/App.vue rename to web/dashboard/src/App.vue index dce5ecd..9dc02b0 100644 --- a/web/frontend/src/App.vue +++ b/web/dashboard/src/App.vue @@ -9,7 +9,7 @@ >
- +
Admin Panel

- +
{ return; } + // Si accede a la raíz y está autenticado, redirigir al dashboard + if (to.path === '/') { + if (authService.hasCredentials()) { + const isValid = await authService.validateSession(); + if (isValid) { + next(); + return; + } + } + // Si no está autenticado, redirigir a login + next('/login'); + return; + } + // Para todas las demás rutas, verificar autenticación if (to.meta.requiresAuth) { // Verificar si hay token almacenado @@ -63,6 +81,16 @@ router.beforeEach(async (to, from, next) => { next('/login'); return; } + + // Verificar si requiere permisos de administrador + if (to.meta.requiresAdmin) { + const isAdmin = authService.isAdmin(); + if (!isAdmin) { + // No es admin, redirigir a dashboard (raíz relativa) + next('/'); + return; + } + } } // Continuar la navegación diff --git a/web/frontend/src/services/api.js b/web/dashboard/src/services/api.js similarity index 86% rename from web/frontend/src/services/api.js rename to web/dashboard/src/services/api.js index 233ed81..157dca6 100644 --- a/web/frontend/src/services/api.js +++ b/web/dashboard/src/services/api.js @@ -171,5 +171,27 @@ export default { const response = await api.delete(`/admin/sessions/${token}`); return response.data; }, + + // Suscripciones + async getSubscriptionPlans() { + const response = await api.get('/subscription/plans'); + return response.data; + }, + + async getMySubscription() { + const response = await api.get('/subscription/me'); + return response.data; + }, + + async updateSubscription(subscriptionData) { + const response = await api.put('/subscription/me', subscriptionData); + return response.data; + }, + + // Admin: Actualizar suscripción de otro usuario + async updateUserSubscription(username, subscriptionData) { + const response = await api.put(`/subscription/${username}`, subscriptionData); + return response.data; + }, }; diff --git a/web/frontend/src/services/auth.js b/web/dashboard/src/services/auth.js similarity index 100% rename from web/frontend/src/services/auth.js rename to web/dashboard/src/services/auth.js diff --git a/web/frontend/src/services/fingerprint.js b/web/dashboard/src/services/fingerprint.js similarity index 100% rename from web/frontend/src/services/fingerprint.js rename to web/dashboard/src/services/fingerprint.js diff --git a/web/frontend/src/services/pushNotifications.js b/web/dashboard/src/services/pushNotifications.js similarity index 100% rename from web/frontend/src/services/pushNotifications.js rename to web/dashboard/src/services/pushNotifications.js diff --git a/web/frontend/src/style.css b/web/dashboard/src/style.css similarity index 100% rename from web/frontend/src/style.css rename to web/dashboard/src/style.css diff --git a/web/frontend/src/views/ArticleDetail.vue b/web/dashboard/src/views/ArticleDetail.vue similarity index 100% rename from web/frontend/src/views/ArticleDetail.vue rename to web/dashboard/src/views/ArticleDetail.vue diff --git a/web/frontend/src/views/Articles.vue b/web/dashboard/src/views/Articles.vue similarity index 100% rename from web/frontend/src/views/Articles.vue rename to web/dashboard/src/views/Articles.vue diff --git a/web/frontend/src/views/Dashboard.vue b/web/dashboard/src/views/Dashboard.vue similarity index 100% rename from web/frontend/src/views/Dashboard.vue rename to web/dashboard/src/views/Dashboard.vue diff --git a/web/frontend/src/views/Favorites.vue b/web/dashboard/src/views/Favorites.vue similarity index 100% rename from web/frontend/src/views/Favorites.vue rename to web/dashboard/src/views/Favorites.vue diff --git a/web/frontend/src/views/Login.vue b/web/dashboard/src/views/Login.vue similarity index 99% rename from web/frontend/src/views/Login.vue rename to web/dashboard/src/views/Login.vue index 8bfd3c2..e62dfd1 100644 --- a/web/frontend/src/views/Login.vue +++ b/web/dashboard/src/views/Login.vue @@ -259,7 +259,7 @@ async function handleLogin() { // Si llegamos aquí, el login fue exitoso // Redirigir al dashboard - router.push('/'); + router.push('/dashboard'); // Disparar evento para que App.vue se actualice window.dispatchEvent(new CustomEvent('auth-login')); @@ -275,7 +275,7 @@ async function handleLogin() { onMounted(() => { // Si ya está autenticado, redirigir al dashboard if (authService.hasCredentials()) { - router.push('/'); + router.push('/dashboard'); return; } diff --git a/web/frontend/src/views/Logs.vue b/web/dashboard/src/views/Logs.vue similarity index 100% rename from web/frontend/src/views/Logs.vue rename to web/dashboard/src/views/Logs.vue diff --git a/web/frontend/src/views/RateLimiter.vue b/web/dashboard/src/views/RateLimiter.vue similarity index 100% rename from web/frontend/src/views/RateLimiter.vue rename to web/dashboard/src/views/RateLimiter.vue diff --git a/web/frontend/src/views/Sessions.vue b/web/dashboard/src/views/Sessions.vue similarity index 100% rename from web/frontend/src/views/Sessions.vue rename to web/dashboard/src/views/Sessions.vue diff --git a/web/dashboard/src/views/Settings.vue b/web/dashboard/src/views/Settings.vue new file mode 100644 index 0000000..f302cc4 --- /dev/null +++ b/web/dashboard/src/views/Settings.vue @@ -0,0 +1,314 @@ + + + + diff --git a/web/dashboard/src/views/Subscription.vue b/web/dashboard/src/views/Subscription.vue new file mode 100644 index 0000000..2a82ab6 --- /dev/null +++ b/web/dashboard/src/views/Subscription.vue @@ -0,0 +1,264 @@ + + + + diff --git a/web/frontend/src/views/Users.vue b/web/dashboard/src/views/Users.vue similarity index 51% rename from web/frontend/src/views/Users.vue rename to web/dashboard/src/views/Users.vue index c421812..2a9ccc4 100644 --- a/web/frontend/src/views/Users.vue +++ b/web/dashboard/src/views/Users.vue @@ -3,13 +3,6 @@

Gestión de Usuarios

-
-
+
+

Acceso Denegado

+

+ Solo los administradores pueden acceder a esta sección. +

+ + Ir a Configuración + +
+ +

Cargando usuarios...

@@ -51,7 +54,7 @@
-
+
Creado: {{ formatDate(user.createdAt) }} @@ -65,24 +68,37 @@ {{ formatDate(user.updatedAt) }}
+ + +
+
+
+ Plan: + + {{ userSubscriptions[user.username].plan?.name || 'Gratis' }} + +
+ + {{ userSubscriptions[user.username].subscription?.status === 'active' ? 'Activo' : 'Inactivo' }} + +
+
+ Uso: {{ userSubscriptions[user.username].usage.workers }} / {{ userSubscriptions[user.username].usage.maxWorkers === 'Ilimitado' ? '∞' : userSubscriptions[user.username].usage.maxWorkers }} búsquedas +
+
-
+
-
- + +
-
+
-

Cambiar Contraseña

+

+ Gestionar Suscripción: {{ selectedUserForSubscription }} +

-
-
- {{ passwordError }} -
- -
- {{ passwordSuccess }} -
- -
- - -
- -
- - -

- Mínimo 6 caracteres -

-
- -
- - -
- -
- - -
-
-
-
- - -
-
-
-

Configuración de Telegram

- +
+
+

Cargando información...

-

- Configura tu bot de Telegram y canal para recibir notificaciones de tus workers. -

-
-
- {{ telegramError }} -
-
- {{ telegramSuccess }} + +
+ +
+

Plan Actual

+
+
+

Plan

+

+ {{ selectedUserSubscription.subscription?.plan?.name || 'Gratis' }} +

+
+
+

Estado

+ + {{ selectedUserSubscription.subscription?.status === 'active' ? 'Activo' : 'Inactivo' }} + +
+
+

Búsquedas

+

+ {{ selectedUserSubscription.usage.workers }} / {{ selectedUserSubscription.usage.maxWorkers === 'Ilimitado' ? '∞' : selectedUserSubscription.usage.maxWorkers }} +

+
+
+ +
- - -

- Obtén tu token desde @BotFather en Telegram -

+

Cambiar Plan

+
+ +
-
- - -

- Usa @nombrecanal para canales públicos o el ID numérico para grupos/canales privados -

-
-
- - -
-
- - -
- + + +
+
+ {{ subscriptionError }} +
+ +
+ {{ subscriptionSuccess }} +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
@@ -425,14 +410,15 @@ const users = ref([]); const loading = ref(true); const loadingAction = ref(false); const showAddModal = ref(false); -const showChangePasswordModal = ref(false); -const showTelegramModal = ref(false); +const showSubscriptionModal = ref(false); const userToDelete = ref(null); +const selectedUserForSubscription = ref(null); +const loadingSubscription = ref(false); +const userSubscriptions = ref({}); +const availablePlans = ref([]); +const subscriptionError = ref(''); +const subscriptionSuccess = ref(''); const addError = ref(''); -const passwordError = ref(''); -const passwordSuccess = ref(''); -const telegramError = ref(''); -const telegramSuccess = ref(''); const userForm = ref({ username: '', @@ -440,17 +426,13 @@ const userForm = ref({ passwordConfirm: '', }); -const passwordForm = ref({ - currentPassword: '', - newPassword: '', - newPasswordConfirm: '', +const subscriptionForm = ref({ + planId: 'free', + status: 'active', + cancelAtPeriodEnd: false, }); -const telegramForm = ref({ - token: '', - channel: '', - enable_polling: false -}); +const selectedUserSubscription = ref(null); const isAuthenticated = computed(() => authService.hasCredentials()); const currentUser = computed(() => { @@ -481,6 +463,11 @@ async function loadUsers() { try { const data = await api.getUsers(); users.value = data.users || []; + + // Cargar información de suscripción para todos los usuarios (solo si es admin) + if (isAdmin.value) { + await loadAllUserSubscriptions(); + } } catch (error) { console.error('Error cargando usuarios:', error); // El modal de login se manejará automáticamente desde App.vue @@ -489,6 +476,132 @@ async function loadUsers() { } } +async function loadAllUserSubscriptions() { + // Cargar suscripciones de todos los usuarios en paralelo + const subscriptionPromises = users.value.map(async (user) => { + try { + // Usar el endpoint de admin para obtener suscripción de cualquier usuario + const response = await fetch(`/api/subscription/${user.username}`, { + method: 'GET', + headers: { + 'Authorization': authService.getAuthHeader(), + }, + }); + if (response.ok) { + const data = await response.json(); + userSubscriptions.value[user.username] = data; + } + } catch (error) { + console.error(`Error cargando suscripción de ${user.username}:`, error); + } + }); + await Promise.all(subscriptionPromises); +} + +async function loadAvailablePlans() { + try { + const data = await api.getSubscriptionPlans(); + availablePlans.value = data.plans || []; + } catch (error) { + console.error('Error cargando planes:', error); + } +} + +async function openSubscriptionModal(username) { + selectedUserForSubscription.value = username; + showSubscriptionModal.value = true; + loadingSubscription.value = true; + subscriptionError.value = ''; + subscriptionSuccess.value = ''; + + try { + // Cargar planes disponibles + await loadAvailablePlans(); + + // Cargar suscripción del usuario seleccionado + const response = await fetch(`/api/subscription/${username}`, { + method: 'GET', + headers: { + 'Authorization': authService.getAuthHeader(), + }, + }); + + if (response.ok) { + const data = await response.json(); + selectedUserSubscription.value = data; + subscriptionForm.value = { + planId: data.subscription?.planId || 'free', + status: data.subscription?.status || 'active', + cancelAtPeriodEnd: data.subscription?.cancelAtPeriodEnd || false, + }; + } else { + // Si no hay suscripción, usar valores por defecto + selectedUserSubscription.value = { + subscription: { + planId: 'free', + status: 'active', + plan: { name: 'Gratis', description: 'Plan gratuito' } + }, + usage: { workers: 0, maxWorkers: 2 }, + }; + subscriptionForm.value = { + planId: 'free', + status: 'active', + cancelAtPeriodEnd: false, + }; + } + } catch (error) { + console.error('Error cargando suscripción:', error); + subscriptionError.value = 'Error al cargar información de suscripción'; + } finally { + loadingSubscription.value = false; + } +} + +function closeSubscriptionModal() { + showSubscriptionModal.value = false; + selectedUserForSubscription.value = null; + selectedUserSubscription.value = null; + subscriptionError.value = ''; + subscriptionSuccess.value = ''; + subscriptionForm.value = { + planId: 'free', + status: 'active', + cancelAtPeriodEnd: false, + }; +} + +async function handleUpdateUserSubscription() { + if (!selectedUserForSubscription.value) return; + + subscriptionError.value = ''; + subscriptionSuccess.value = ''; + loadingAction.value = true; + + try { + await api.updateUserSubscription(selectedUserForSubscription.value, { + planId: subscriptionForm.value.planId, + status: subscriptionForm.value.status, + cancelAtPeriodEnd: subscriptionForm.value.cancelAtPeriodEnd, + }); + + subscriptionSuccess.value = 'Suscripción actualizada correctamente'; + + // Actualizar la información en la lista + await loadAllUserSubscriptions(); + + // Recargar la información del modal después de un momento + setTimeout(async () => { + await openSubscriptionModal(selectedUserForSubscription.value); + }, 1000); + } catch (error) { + console.error('Error actualizando suscripción:', error); + subscriptionError.value = error.response?.data?.error || 'Error al actualizar la suscripción'; + } finally { + loadingAction.value = false; + } +} + async function handleCreateUser() { addError.value = ''; loadingAction.value = true; @@ -537,57 +650,6 @@ async function handleCreateUser() { } } -async function handleChangePassword() { - passwordError.value = ''; - passwordSuccess.value = ''; - loadingAction.value = true; - - if (!passwordForm.value.currentPassword || !passwordForm.value.newPassword || !passwordForm.value.newPasswordConfirm) { - passwordError.value = 'Todos los campos son requeridos'; - loadingAction.value = false; - return; - } - - if (passwordForm.value.newPassword.length < 6) { - passwordError.value = 'La nueva contraseña debe tener al menos 6 caracteres'; - loadingAction.value = false; - return; - } - - if (passwordForm.value.newPassword !== passwordForm.value.newPasswordConfirm) { - passwordError.value = 'Las contraseñas no coinciden'; - loadingAction.value = false; - return; - } - - try { - await api.changePassword({ - currentPassword: passwordForm.value.currentPassword, - newPassword: passwordForm.value.newPassword, - }); - - passwordSuccess.value = 'Contraseña actualizada correctamente. Por favor, inicia sesión nuevamente.'; - - // Invalidar la sesión actual - el usuario deberá hacer login nuevamente - // El backend ya invalidó todas las sesiones, así que limpiamos localmente también - setTimeout(async () => { - await authService.logout(); - closeChangePasswordModal(); - // Recargar página para forzar nuevo login - // El evento auth-required se disparará automáticamente cuando intente cargar datos - window.location.reload(); - }, 2000); - } catch (error) { - console.error('Error cambiando contraseña:', error); - if (error.response?.data?.error) { - passwordError.value = error.response.data.error; - } else { - passwordError.value = 'Error cambiando contraseña. Intenta de nuevo.'; - } - } finally { - loadingAction.value = false; - } -} async function handleDeleteUser() { if (!userToDelete.value) return; @@ -619,81 +681,12 @@ function closeAddModal() { }; } -function closeChangePasswordModal() { - showChangePasswordModal.value = false; - passwordError.value = ''; - passwordSuccess.value = ''; - passwordForm.value = { - currentPassword: '', - newPassword: '', - newPasswordConfirm: '', - }; -} - -function closeTelegramModal() { - showTelegramModal.value = false; - telegramError.value = ''; - telegramSuccess.value = ''; - telegramForm.value = { - token: '', - channel: '', - enable_polling: false - }; -} - -async function loadTelegramConfig() { - try { - const config = await api.getTelegramConfig(); - if (config) { - telegramForm.value = { - token: config.token || '', - channel: config.channel || '', - enable_polling: config.enable_polling || false - }; - } - } catch (error) { - console.error('Error cargando configuración de Telegram:', error); - telegramError.value = 'Error cargando la configuración de Telegram'; - } -} - -async function saveTelegramConfig() { - telegramError.value = ''; - telegramSuccess.value = ''; - - if (!telegramForm.value.token || !telegramForm.value.channel) { - telegramError.value = 'Token y canal son requeridos'; - return; - } - - loadingAction.value = true; - try { - await api.setTelegramConfig(telegramForm.value); - telegramSuccess.value = 'Configuración de Telegram guardada correctamente'; - setTimeout(() => { - closeTelegramModal(); - }, 1500); - } catch (error) { - console.error('Error guardando configuración de Telegram:', error); - if (error.response?.data?.error) { - telegramError.value = error.response.data.error; - } else { - telegramError.value = 'Error al guardar la configuración de Telegram'; - } - } finally { - loadingAction.value = false; - } -} - function handleAuthLogout() { // Cuando el usuario se desconecta globalmente, limpiar datos users.value = []; showAddModal.value = false; - showChangePasswordModal.value = false; userToDelete.value = null; addError.value = ''; - passwordError.value = ''; - passwordSuccess.value = ''; } onMounted(() => { @@ -705,13 +698,6 @@ onMounted(() => { }); }); -// Cargar configuración de Telegram cuando se abre el modal -watch(showTelegramModal, (newVal) => { - if (newVal) { - loadTelegramConfig(); - } -}); - onUnmounted(() => { window.removeEventListener('auth-logout', handleAuthLogout); window.removeEventListener('auth-login', loadUsers); diff --git a/web/frontend/src/views/Workers.vue b/web/dashboard/src/views/Workers.vue similarity index 100% rename from web/frontend/src/views/Workers.vue rename to web/dashboard/src/views/Workers.vue diff --git a/web/frontend/tailwind.config.js b/web/dashboard/tailwind.config.js similarity index 100% rename from web/frontend/tailwind.config.js rename to web/dashboard/tailwind.config.js diff --git a/web/frontend/vite.config.js b/web/dashboard/vite.config.js similarity index 95% rename from web/frontend/vite.config.js rename to web/dashboard/vite.config.js index 4c9b02d..92adf38 100644 --- a/web/frontend/vite.config.js +++ b/web/dashboard/vite.config.js @@ -4,6 +4,7 @@ import { fileURLToPath, URL } from 'url'; export default defineConfig({ plugins: [vue()], + base: '/dashboard/', resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), diff --git a/web/landing/.gitignore b/web/landing/.gitignore new file mode 100644 index 0000000..3b46330 --- /dev/null +++ b/web/landing/.gitignore @@ -0,0 +1,23 @@ +# build output +dist/ +.output/ + +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + diff --git a/web/landing/Dockerfile b/web/landing/Dockerfile new file mode 100644 index 0000000..0099950 --- /dev/null +++ b/web/landing/Dockerfile @@ -0,0 +1,27 @@ +FROM node:18-alpine AS builder + +WORKDIR /app + +# Copiar archivos de dependencias +COPY package.json package-lock.json* ./ + +# Instalar dependencias +RUN npm ci + +# Copiar código fuente +COPY . . + +# Construir aplicación Astro +RUN npm run build + +# Stage de producción - servir con nginx +FROM nginx:alpine + +# Copiar archivos construidos +COPY --from=builder /app/dist /usr/share/nginx/html/landing + +# Exponer puerto +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] + diff --git a/web/landing/README.md b/web/landing/README.md new file mode 100644 index 0000000..b9374f2 --- /dev/null +++ b/web/landing/README.md @@ -0,0 +1,77 @@ +# Wallabicher Landing Page + +Landing page moderna y profesional para Wallabicher construida con Astro. Diseño minimalista con modo dark automático basado en las preferencias del sistema. + +## ✨ Características + +- 🎨 **Diseño minimalista y profesional** - Interfaz limpia y moderna +- 🌙 **Modo dark automático** - Se adapta automáticamente a las preferencias del sistema +- 🎭 **Animaciones suaves** - Transiciones y efectos visuales elegantes +- 📱 **Totalmente responsive** - Optimizado para todos los dispositivos +- 🎯 **Colores del logo** - Paleta de colores teal/cyan basada en el logo +- ⚡ **Rendimiento óptimo** - Construido con Astro para máxima velocidad + +## 🚀 Inicio Rápido + +```bash +# Instalar dependencias +npm install + +# Iniciar servidor de desarrollo +npm run dev + +# Construir para producción +npm run build + +# Previsualizar build de producción +npm run preview +``` + +## 📁 Estructura + +``` +landing/ +├── public/ +│ ├── favicon.svg +│ └── logo.jpg # Logo de Wallabicher +├── src/ +│ ├── components/ +│ │ ├── CTA.astro # Sección de llamada a la acción +│ │ ├── Features.astro # Características principales +│ │ ├── Hero.astro # Sección hero con logo +│ │ ├── HowItWorks.astro # Cómo funciona +│ │ └── Platforms.astro # Plataformas soportadas +│ ├── layouts/ +│ │ └── Layout.astro # Layout base con modo dark +│ └── pages/ +│ └── index.astro # Página principal +├── astro.config.mjs +├── package.json +└── tailwind.config.mjs # Configuración con colores teal/cyan +``` + +## 🎨 Tecnologías + +- **Astro** - Framework web moderno y rápido +- **Tailwind CSS** - Framework CSS utility-first +- **TypeScript** - Tipado estático +- **Inter Font** - Tipografía profesional + +## 🎨 Paleta de Colores + +La landing page usa una paleta de colores basada en el logo: +- **Primary (Teal/Cyan)**: `#06b6d4` - Color principal +- **Teal**: Variaciones de teal para acentos +- **Gray**: Escala de grises para texto y fondos +- **Modo Dark**: Adaptación automática con colores oscuros + +## 📝 Personalización + +- **Colores**: Modifica `tailwind.config.mjs` para cambiar la paleta +- **Componentes**: Edita los archivos en `src/components/` +- **Contenido**: Actualiza el texto en cada componente según necesites + +## 🌙 Modo Dark + +El modo dark se detecta automáticamente usando `prefers-color-scheme`. No requiere JavaScript adicional y funciona de forma nativa. + diff --git a/web/landing/astro.config.mjs b/web/landing/astro.config.mjs new file mode 100644 index 0000000..5d3750b --- /dev/null +++ b/web/landing/astro.config.mjs @@ -0,0 +1,9 @@ +import { defineConfig } from 'astro/config'; +import tailwind from '@astrojs/tailwind'; + +// https://astro.build/config +export default defineConfig({ + integrations: [tailwind()], + output: 'static', +}); + diff --git a/web/landing/package-lock.json b/web/landing/package-lock.json new file mode 100644 index 0000000..2d43ffb --- /dev/null +++ b/web/landing/package-lock.json @@ -0,0 +1,6119 @@ +{ + "name": "wallabicher-landing", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wallabicher-landing", + "version": "1.0.0", + "dependencies": { + "@astrojs/tailwind": "^5.1.0", + "astro": "^4.15.0", + "tailwindcss": "^3.4.1" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.0.tgz", + "integrity": "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.1.tgz", + "integrity": "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==", + "license": "MIT" + }, + "node_modules/@astrojs/markdown-remark": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-5.3.0.tgz", + "integrity": "sha512-r0Ikqr0e6ozPb5bvhup1qdWnSPUvQu6tub4ZLYaKyG50BXZ0ej6FhGz3GpChKpH7kglRFPObJd/bDyf2VM9pkg==", + "license": "MIT", + "dependencies": { + "@astrojs/prism": "3.1.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.1.0", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.1", + "remark-smartypants": "^3.0.2", + "shiki": "^1.22.0", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.1.0.tgz", + "integrity": "sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.29.0" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + } + }, + "node_modules/@astrojs/tailwind": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@astrojs/tailwind/-/tailwind-5.1.5.tgz", + "integrity": "sha512-1diguZEau7FZ9vIjzE4BwavGdhD3+JkdS8zmibl1ene+EHgIU5hI0NMgRYG3yea+Niaf7cyMwjeWeLvzq/maxg==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.20", + "postcss": "^8.5.1", + "postcss-load-config": "^4.0.2" + }, + "peerDependencies": { + "astro": "^3.0.0 || ^4.0.0 || ^5.0.0", + "tailwindcss": "^3.0.24" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.1.0.tgz", + "integrity": "sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.0.0", + "debug": "^4.3.4", + "dlv": "^1.1.3", + "dset": "^3.1.3", + "is-docker": "^3.0.0", + "is-wsl": "^3.0.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.2.tgz", + "integrity": "sha512-21J6xzayjy3O6NdnlO6aXi/urvSRjm6nCI6+nF6ra2YofKruGixN9kfT+dt55HVNwfDmpDHJcaS3JuP/boNnlA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.2.tgz", + "integrity": "sha512-eXBg7ibkNUZ+sTwbFiDKou0BAckeV6kIigK7y5Ko4mB/5A1KLhuzEKovsmfvsL8mQorkoincMFGnQuIT92SKqA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.2.tgz", + "integrity": "sha512-UCbaTklREjrc5U47ypLulAgg4njaqfOVLU18VrCrI+6E5MQjuG0lSWaqLlAJwsD7NpFV249XgB0Bi37Zh5Sz4g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.2.tgz", + "integrity": "sha512-dP67MA0cCMHFT2g5XyjtpVOtp7y4UyUxN3dhLdt11at5cPKnSm4lY+EhwNvDXIMzAMIo2KU+mc9wxaAQJTn7sQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.2.tgz", + "integrity": "sha512-WDUPLUwfYV9G1yxNRJdXcvISW15mpvod1Wv3ok+Ws93w1HjIVmCIFxsG2DquO+3usMNCpJQ0wqO+3GhFdl6Fow==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.2.tgz", + "integrity": "sha512-Ng95wtHVEulRwn7R0tMrlUuiLVL/HXA8Lt/MYVpy88+s5ikpntzZba1qEulTuPnPIZuOPcW9wNEiqvZxZmgmqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.2.tgz", + "integrity": "sha512-AEXMESUDWWGqD6LwO/HkqCZgUE1VCJ1OhbvYGsfqX2Y6w5quSXuyoy/Fg3nRqiwro+cJYFxiw5v4kB2ZDLhxrw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.2.tgz", + "integrity": "sha512-ZV7EljjBDwBBBSv570VWj0hiNTdHt9uGznDtznBB4Caj3ch5rgD4I2K1GQrtbvJ/QiB+663lLgOdcADMNVC29Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.2.tgz", + "integrity": "sha512-uvjwc8NtQVPAJtq4Tt7Q49FOodjfbf6NpqXyW/rjXoV+iZ3EJAHLNAnKT5UJBc6ffQVgmXTUL2ifYiLABlGFqA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.2.tgz", + "integrity": "sha512-s3KoWVNnye9mm/2WpOZ3JeUiediUVw6AvY/H7jNA6qgKA2V2aM25lMkVarTDfiicn/DLq3O0a81jncXszoyCFA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.2.tgz", + "integrity": "sha512-gi21faacK+J8aVSyAUptML9VQN26JRxe484IbF+h3hpG+sNVoMXPduhREz2CcYr5my0NE3MjVvQ5bMKX71pfVA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.2.tgz", + "integrity": "sha512-qSlWiXnVaS/ceqXNfnoFZh4IiCA0EwvCivivTGbEu1qv2o+WTHpn1zNmCTAoOG5QaVr2/yhCoLScQtc/7RxshA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.2.tgz", + "integrity": "sha512-rPyuLFNoF1B0+wolH277E780NUKf+KoEDb3OyoLbAO18BbeKi++YN6gC/zuJoPPDlQRL3fIxHxCxVEWiem2yXw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.2.tgz", + "integrity": "sha512-g+0ZLMook31iWV4PvqKU0i9E78gaZgYpSrYPed/4Bu+nGTgfOPtfs1h11tSSRPXSjC5EzLTjV/1A7L2Vr8pJoQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.2.tgz", + "integrity": "sha512-i+sGeRGsjKZcQRh3BRfpLsM3LX3bi4AoEVqmGDyc50L6KfYsN45wVCSz70iQMwPWr3E5opSiLOwsC9WB4/1pqg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.2.tgz", + "integrity": "sha512-C1vLcKc4MfFV6I0aWsC7B2Y9QcsiEcvKkfxprwkPfLaN8hQf0/fKHwSF2lcYzA9g4imqnhic729VB9Fo70HO3Q==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.2.tgz", + "integrity": "sha512-68gHUK/howpQjh7g7hlD9DvTTt4sNLp1Bb+Yzw2Ki0xvscm2cOdCLZNJNhd2jW8lsTPrHAHuF751BygifW4bkQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.2.tgz", + "integrity": "sha512-1e30XAuaBP1MAizaOBApsgeGZge2/Byd6wV4a8oa6jPdHELbRHBiw7wvo4dp7Ie2PE8TZT4pj9RLGZv9N4qwlw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.2.tgz", + "integrity": "sha512-4BJucJBGbuGnH6q7kpPqGJGzZnYrpAzRd60HQSt3OpX/6/YVgSsJnNzR8Ot74io50SeVT4CtCWe/RYIAymFPwA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.2.tgz", + "integrity": "sha512-cT2MmXySMo58ENv8p6/O6wI/h/gLnD3D6JoajwXFZH6X9jz4hARqUhWpGuQhOgLNXscfZYRQMJvZDtWNzMAIDw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.2.tgz", + "integrity": "sha512-sZnyUgGkuzIXaK3jNMPmUIyJrxu/PjmATQrocpGA1WbCPX8H5tfGgRSuYtqBYAvLuIGp8SPRb1O4d1Fkb5fXaQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.2.tgz", + "integrity": "sha512-sDpFbenhmWjNcEbBcoTV0PWvW5rPJFvu+P7XoTY0YLGRupgLbFY0XPfwIbJOObzO7QgkRDANh65RjhPmgSaAjQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.2.tgz", + "integrity": "sha512-GvJ03TqqaweWCigtKQVBErw2bEhu1tyfNQbarwr94wCGnczA9HF8wqEe3U/Lfu6EdeNP0p6R+APeHVwEqVxpUQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.2.tgz", + "integrity": "sha512-KvXsBvp13oZz9JGe5NYS7FNizLe99Ny+W8ETsuCyjXiKdiGrcz2/J/N8qxZ/RSwivqjQguug07NLHqrIHrqfYw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.2.tgz", + "integrity": "sha512-xNO+fksQhsAckRtDSPWaMeT1uIM+JrDRXlerpnWNXhn1TdB3YZ6uKBMBTKP0eX9XtYEP978hHk1f8332i2AW8Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.2.tgz", + "integrity": "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==", + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz", + "integrity": "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.2.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", + "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/langs": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.2.tgz", + "integrity": "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/themes": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.2.tgz", + "integrity": "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/types": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", + "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astro": { + "version": "4.16.19", + "resolved": "https://registry.npmjs.org/astro/-/astro-4.16.19.tgz", + "integrity": "sha512-baeSswPC5ZYvhGDoj25L2FuzKRWMgx105FetOPQVJFMCAp0o08OonYC7AhwsFdhvp7GapqjnC1Fe3lKb2lupYw==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.10.3", + "@astrojs/internal-helpers": "0.4.1", + "@astrojs/markdown-remark": "5.3.0", + "@astrojs/telemetry": "3.1.0", + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/types": "^7.26.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.1.3", + "@types/babel__core": "^7.20.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.1.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^0.7.2", + "cssesc": "^3.0.0", + "debug": "^4.3.7", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.1.1", + "diff": "^5.2.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.5.4", + "esbuild": "^0.21.5", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.2", + "flattie": "^1.1.1", + "github-slugger": "^2.0.0", + "gray-matter": "^4.0.3", + "html-escaper": "^3.0.3", + "http-cache-semantics": "^4.1.1", + "js-yaml": "^4.1.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.14", + "magicast": "^0.3.5", + "micromatch": "^4.0.8", + "mrmime": "^2.0.0", + "neotraverse": "^0.6.18", + "ora": "^8.1.1", + "p-limit": "^6.1.0", + "p-queue": "^8.0.1", + "preferred-pm": "^4.0.0", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.6.3", + "shiki": "^1.23.1", + "tinyexec": "^0.3.1", + "tsconfck": "^3.1.4", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3", + "vite": "^5.4.11", + "vitefu": "^1.0.4", + "which-pm": "^3.0.0", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.5", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "optionalDependencies": { + "sharp": "^0.33.3" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.16.tgz", + "integrity": "sha512-KeUZdBuxngy825i8xvzaK1Ncnkx0tBmb3k8DkEuqjKRkmtvNTjey2ZsNeh8Dw4lfKvbCOu9oeNx2TKm2vHqcRw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001765", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz", + "integrity": "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT", + "optional": true + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "license": "MIT", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz", + "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT", + "optional": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/load-yaml-file/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/load-yaml-file/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-to-es": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", + "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/preferred-pm": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.1.1.tgz", + "integrity": "sha512-rU+ZAv1Ur9jAUZtGPebQVQPzdGhNzaEiQ7VL9+cjsAWPHFYOccNXPNiev1CCDSOg/2j7UujM7ojNhpkuILEVNQ==", + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0", + "find-yarn-workspace-root2": "1.2.16", + "which-pm": "^3.0.1" + }, + "engines": { + "node": ">=18.12" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/regex": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", + "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", + "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", + "license": "MIT", + "dependencies": { + "regex": "^5.1.1", + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.2.tgz", + "integrity": "sha512-PggGy4dhwx5qaW+CKBilA/98Ql9keyfnb7lh4SR6shQ91QQQi1ORJ1v4UinkdP2i87OBs9AQFooQylcrrRfIcg==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.2", + "@rollup/rollup-android-arm64": "4.55.2", + "@rollup/rollup-darwin-arm64": "4.55.2", + "@rollup/rollup-darwin-x64": "4.55.2", + "@rollup/rollup-freebsd-arm64": "4.55.2", + "@rollup/rollup-freebsd-x64": "4.55.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.2", + "@rollup/rollup-linux-arm-musleabihf": "4.55.2", + "@rollup/rollup-linux-arm64-gnu": "4.55.2", + "@rollup/rollup-linux-arm64-musl": "4.55.2", + "@rollup/rollup-linux-loong64-gnu": "4.55.2", + "@rollup/rollup-linux-loong64-musl": "4.55.2", + "@rollup/rollup-linux-ppc64-gnu": "4.55.2", + "@rollup/rollup-linux-ppc64-musl": "4.55.2", + "@rollup/rollup-linux-riscv64-gnu": "4.55.2", + "@rollup/rollup-linux-riscv64-musl": "4.55.2", + "@rollup/rollup-linux-s390x-gnu": "4.55.2", + "@rollup/rollup-linux-x64-gnu": "4.55.2", + "@rollup/rollup-linux-x64-musl": "4.55.2", + "@rollup/rollup-openbsd-x64": "4.55.2", + "@rollup/rollup-openharmony-arm64": "4.55.2", + "@rollup/rollup-win32-arm64-msvc": "4.55.2", + "@rollup/rollup-win32-ia32-msvc": "4.55.2", + "@rollup/rollup-win32-x64-gnu": "4.55.2", + "@rollup/rollup-win32-x64-msvc": "4.55.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/shiki": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.2.tgz", + "integrity": "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "1.29.2", + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/langs": "1.29.2", + "@shikijs/themes": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which-pm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-3.0.1.tgz", + "integrity": "sha512-v2JrMq0waAI4ju1xU5x3blsxBBMgdgZve580iYMN5frDaLGjbA24fok7wKCsya8KLVO19Ju4XDc5+zTZCJkQfg==", + "license": "MIT", + "dependencies": { + "load-yaml-file": "^0.2.0" + }, + "engines": { + "node": ">=18.12" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/web/landing/package.json b/web/landing/package.json new file mode 100644 index 0000000..dee1301 --- /dev/null +++ b/web/landing/package.json @@ -0,0 +1,18 @@ +{ + "name": "wallabicher-landing", + "type": "module", + "version": "1.0.0", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/tailwind": "^5.1.0", + "astro": "^4.15.0", + "tailwindcss": "^3.4.1" + } +} + diff --git a/web/landing/public/favicon.svg b/web/landing/public/favicon.svg new file mode 100644 index 0000000..ad254d1 --- /dev/null +++ b/web/landing/public/favicon.svg @@ -0,0 +1,5 @@ + + + 🛎️ + + diff --git a/web/landing/public/logo.jpg b/web/landing/public/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a41a34cf4edab0a4712ad294baec8fa320e88de GIT binary patch literal 39958 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 literal 0 HcmV?d00001 diff --git a/web/landing/src/components/CTA.astro b/web/landing/src/components/CTA.astro new file mode 100644 index 0000000..aa592b4 --- /dev/null +++ b/web/landing/src/components/CTA.astro @@ -0,0 +1,91 @@ +--- +--- + +
+ +
+
+
+
+
+ +
+

+ ¿Listo para empezar? +

+

+ Instala Wallabicher en minutos y comienza a recibir notificaciones de los artículos que te interesan. +

+ + +
+
+
+
+
+
+
+
+ Terminal +
+
# 1. Instala las dependencias
+pip3 install -r requirements.txt
+
+# 2. Configura el proyecto
+python setup_config.py
+
+# 3. Edita config.yaml con tus credenciales de Telegram
+
+# 4. Personaliza workers.json con tus búsquedas
+
+# 5. Ejecuta Wallabicher
+python3 wallabicher.py
+
+
+ + + +
+
+ +
+
+
+
+
+ Wallabicher +
+

Wallabicher

+
+

+ Hecho con ❤️ para ayudarte a encontrar las mejores ofertas +

+

+ © 2024 Wallabicher. Todos los derechos reservados. +

+
+
+
diff --git a/web/landing/src/components/Features.astro b/web/landing/src/components/Features.astro new file mode 100644 index 0000000..59d8739 --- /dev/null +++ b/web/landing/src/components/Features.astro @@ -0,0 +1,98 @@ +--- +const features = [ + { + icon: '🔍', + title: 'Búsquedas Automatizadas', + description: 'Configura tus criterios de búsqueda una vez y deja que Wallabicher monitoree las plataformas 24/7 sin interrupciones.', + color: 'from-primary-500 to-primary-600', + delay: '0.1s', + }, + { + icon: '⚡', + title: 'Notificaciones Instantáneas', + description: 'Recibe alertas en tiempo real en tu canal o chat de Telegram cuando aparezcan artículos que coincidan con tus filtros.', + color: 'from-teal-500 to-teal-600', + delay: '0.2s', + }, + { + icon: '🎯', + title: 'Filtros Avanzados', + description: 'Filtra por precio, ubicación, condición, palabras clave y mucho más. Control total sobre lo que quieres ver.', + color: 'from-cyan-500 to-cyan-600', + delay: '0.3s', + }, + { + icon: '📱', + title: 'Integración con Telegram', + description: 'Recibe notificaciones con imágenes, descripciones y enlaces directos. Incluso organiza por temas en grupos.', + color: 'from-primary-500 to-teal-500', + delay: '0.4s', + }, + { + icon: '⭐', + title: 'Sistema de Favoritos', + description: 'Guarda tus artículos favoritos con un solo clic y accede a ellos cuando quieras con el comando /favs.', + color: 'from-teal-500 to-cyan-500', + delay: '0.5s', + }, + { + icon: '🌐', + title: 'Multi-Plataforma', + description: 'Soporta múltiples marketplaces: Wallapop, Vinted y más. Arquitectura extensible para añadir nuevas plataformas fácilmente.', + color: 'from-cyan-500 to-primary-500', + delay: '0.6s', + }, +]; +--- + +
+ +
+
+
+
+ +
+
+

+ Características + + Principales + +

+

+ Todo lo que necesitas para no perderte ningún artículo interesante +

+
+ +
+ {features.map((feature, index) => ( +
+ +
+ +
+ +
+ {feature.icon} +
+ + +

+ {feature.title} +

+

+ {feature.description} +

+
+ + +
+
+ ))} +
+
+
diff --git a/web/landing/src/components/Hero.astro b/web/landing/src/components/Hero.astro new file mode 100644 index 0000000..585f41b --- /dev/null +++ b/web/landing/src/components/Hero.astro @@ -0,0 +1,84 @@ +--- +--- + +
+ +
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+ Wallabicher Logo +
+
+
+ + +

+ + Wallabicher + + 🛎️ +

+ + +

+ Automatiza tus búsquedas en marketplaces +

+

+ Recibe notificaciones instantáneas en Telegram cuando aparezcan artículos que te interesan +

+ + + + + +
+ + + +
+
+
+ + +
+
+ + diff --git a/web/landing/src/components/HowItWorks.astro b/web/landing/src/components/HowItWorks.astro new file mode 100644 index 0000000..25441ac --- /dev/null +++ b/web/landing/src/components/HowItWorks.astro @@ -0,0 +1,103 @@ +--- +const steps = [ + { + number: '1', + title: 'Configura tus búsquedas', + description: 'Define tus criterios: término de búsqueda, rango de precios, ubicación, filtros avanzados y más.', + icon: '⚙️', + }, + { + number: '2', + title: 'Conecta Telegram', + description: 'Configura tu token de Telegram y el canal o chat donde quieres recibir las notificaciones.', + icon: '📱', + }, + { + number: '3', + title: 'Ejecuta Wallabicher', + description: 'Inicia el monitor y deja que trabaje en segundo plano. Revisará las plataformas automáticamente.', + icon: '🚀', + }, + { + number: '4', + title: 'Recibe notificaciones', + description: 'Cuando aparezca un artículo que coincida con tus filtros, recibirás una notificación instantánea con toda la información.', + icon: '🔔', + }, +]; +--- + +
+ +
+
+
+
+ +
+
+

+ ¿Cómo + + Funciona? + +

+

+ Configuración simple en 4 pasos +

+
+ +
+ + + +
+ {steps.map((step, index) => ( +
+ +
+ + + +
+ +
+
+
+
+ {step.icon} +
+
+
+ + +
+ {step.number} +
+ + +
+

+ {step.title} +

+

+ {step.description} +

+
+
+
+ + + {index < steps.length - 1 && ( + + )} +
+ ))} +
+
+
+
diff --git a/web/landing/src/components/Platforms.astro b/web/landing/src/components/Platforms.astro new file mode 100644 index 0000000..ac3825f --- /dev/null +++ b/web/landing/src/components/Platforms.astro @@ -0,0 +1,103 @@ +--- +const platforms = [ + { + name: 'Wallapop', + status: 'Totalmente funcional', + statusColor: 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-400', + icon: '🟢', + description: 'Monitoriza búsquedas en Wallapop con todos los filtros disponibles y notificaciones en tiempo real.', + gradient: 'from-primary-500 to-primary-600', + }, + { + name: 'Vinted', + status: 'Implementado', + statusColor: 'bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-400', + icon: '🟢', + description: 'Soporte para múltiples países. Requiere intervalos de búsqueda más largos para evitar bloqueos.', + gradient: 'from-teal-500 to-teal-600', + }, + { + name: 'Buyee', + status: 'Por implementar', + statusColor: 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-700 dark:text-yellow-400', + icon: '🟡', + description: 'Próximamente disponible. Arquitectura extensible lista para nuevas plataformas.', + gradient: 'from-gray-400 to-gray-500', + }, +]; +--- + +
+ +
+
+
+
+ +
+
+

+ Plataformas + + Soportadas + +

+

+ Arquitectura extensible que permite añadir nuevas plataformas fácilmente +

+
+ +
+ {platforms.map((platform, index) => ( +
+ +
+ +
+ +
+

{platform.name}

+ {platform.icon} +
+ + + + {platform.status} + + + +

+ {platform.description} +

+
+ + +
+
+ ))} +
+ + +
+
+

+ ¿Quieres añadir una nueva plataforma? +

+ + Consulta la documentación + + + + +
+
+
+
diff --git a/web/landing/src/components/Pricing.astro b/web/landing/src/components/Pricing.astro new file mode 100644 index 0000000..603ca87 --- /dev/null +++ b/web/landing/src/components/Pricing.astro @@ -0,0 +1,231 @@ +--- +const plans = [ + { + id: 'free', + name: 'Gratis', + description: 'Perfecto para empezar', + price: { monthly: 0, yearly: 0 }, + popular: false, + features: [ + 'Hasta 2 búsquedas simultáneas', + 'Solo Wallapop', + '50 notificaciones por día', + 'Soporte por email', + ], + limits: { + workers: 2, + notifications: 50, + platforms: ['Wallapop'], + }, + }, + { + id: 'basic', + name: 'Básico', + description: 'Para usuarios ocasionales', + price: { monthly: 9.99, yearly: 99.99 }, + popular: true, + features: [ + 'Hasta 5 búsquedas simultáneas', + 'Wallapop y Vinted', + '200 notificaciones por día', + 'Soporte prioritario', + 'Sin límite de favoritos', + ], + limits: { + workers: 5, + notifications: 200, + platforms: ['Wallapop', 'Vinted'], + }, + }, + { + id: 'pro', + name: 'Pro', + description: 'Para usuarios avanzados', + price: { monthly: 19.99, yearly: 199.99 }, + popular: false, + features: [ + 'Hasta 15 búsquedas simultáneas', + 'Todas las plataformas', + '1000 notificaciones por día', + 'Soporte prioritario 24/7', + 'API access', + 'Webhooks personalizados', + ], + limits: { + workers: 15, + notifications: 1000, + platforms: ['Wallapop', 'Vinted', 'Buyee'], + }, + }, + { + id: 'enterprise', + name: 'Enterprise', + description: 'Para equipos y uso intensivo', + price: { monthly: 49.99, yearly: 499.99 }, + popular: false, + features: [ + 'Búsquedas ilimitadas', + 'Notificaciones ilimitadas', + 'Todas las plataformas', + 'Soporte dedicado', + 'API completa', + 'Webhooks personalizados', + 'Gestión de múltiples usuarios', + 'Estadísticas avanzadas', + ], + limits: { + workers: 'Ilimitado', + notifications: 'Ilimitado', + platforms: ['Todas'], + }, + }, +]; +--- + +
+ +
+
+
+
+ +
+
+

+ Planes y + + Precios + +

+

+ Elige el plan que mejor se adapte a tus necesidades +

+
+ + +
+
+ + +
+
+ +
+ {plans.map((plan, index) => ( +
+ {plan.popular && ( +
+ Más Popular +
+ )} + + +
+

{plan.name}

+

{plan.description}

+ + +
+
+ + €{plan.price.monthly.toFixed(2)} + + /mes +
+ +
+
+ + +
    + {plan.features.map((feature) => ( +
  • + + + + {feature} +
  • + ))} +
+ + + + {plan.id === 'free' ? 'Empezar gratis' : 'Elegir plan'} + +
+ ))} +
+ + +
+

+ ¿Necesitas un plan personalizado? +

+ + Contacta con nosotros + + + + +
+
+
+ + + diff --git a/web/landing/src/env.d.ts b/web/landing/src/env.d.ts new file mode 100644 index 0000000..9bc5cb4 --- /dev/null +++ b/web/landing/src/env.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/web/landing/src/layouts/Layout.astro b/web/landing/src/layouts/Layout.astro new file mode 100644 index 0000000..85fb727 --- /dev/null +++ b/web/landing/src/layouts/Layout.astro @@ -0,0 +1,63 @@ +--- +interface Props { + title: string; + description?: string; +} + +const { title, description = "Automatiza tus búsquedas en marketplaces (Wallapop, Vinted, etc.) y recibe notificaciones instantáneas en Telegram cuando aparezcan nuevos artículos." } = Astro.props; +--- + + + + + + + + + + + + + + {title} + + + + + + + + diff --git a/web/landing/src/pages/index.astro b/web/landing/src/pages/index.astro new file mode 100644 index 0000000..1de8373 --- /dev/null +++ b/web/landing/src/pages/index.astro @@ -0,0 +1,19 @@ +--- +import Layout from '../layouts/Layout.astro'; +import Hero from '../components/Hero.astro'; +import Features from '../components/Features.astro'; +import Platforms from '../components/Platforms.astro'; +import HowItWorks from '../components/HowItWorks.astro'; +import Pricing from '../components/Pricing.astro'; +import CTA from '../components/CTA.astro'; +--- + + + + + + + + + + diff --git a/web/landing/tailwind.config.mjs b/web/landing/tailwind.config.mjs new file mode 100644 index 0000000..9e928e8 --- /dev/null +++ b/web/landing/tailwind.config.mjs @@ -0,0 +1,88 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'], + darkMode: 'media', // Detecta automáticamente las preferencias del sistema + theme: { + extend: { + colors: { + // Colores basados en el logo teal/cyan + primary: { + 50: '#ecfeff', + 100: '#cffafe', + 200: '#a5f3fc', + 300: '#67e8f9', + 400: '#22d3ee', + 500: '#06b6d4', // Teal principal + 600: '#0891b2', + 700: '#0e7490', + 800: '#155e75', + 900: '#164e63', + 950: '#083344', + }, + teal: { + 50: '#f0fdfa', + 100: '#ccfbf1', + 200: '#99f6e4', + 300: '#5eead4', + 400: '#2dd4bf', + 500: '#14b8a6', + 600: '#0d9488', + 700: '#0f766e', + 800: '#115e59', + 900: '#134e4a', + }, + gray: { + 50: '#f9fafb', + 100: '#f3f4f6', + 200: '#e5e7eb', + 300: '#d1d5db', + 400: '#9ca3af', + 500: '#6b7280', + 600: '#4b5563', + 700: '#374151', + 800: '#1f2937', + 900: '#111827', + 950: '#030712', + }, + }, + fontFamily: { + sans: ['Inter', 'system-ui', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'sans-serif'], + }, + animation: { + 'fade-in': 'fadeIn 0.6s ease-out', + 'slide-up': 'slideUp 0.6s ease-out', + 'slide-in-right': 'slideInRight 0.6s ease-out', + 'float': 'float 6s ease-in-out infinite', + 'gradient': 'gradient 15s ease infinite', + }, + keyframes: { + fadeIn: { + '0%': { opacity: '0' }, + '100%': { opacity: '1' }, + }, + slideUp: { + '0%': { transform: 'translateY(20px)', opacity: '0' }, + '100%': { transform: 'translateY(0)', opacity: '1' }, + }, + slideInRight: { + '0%': { transform: 'translateX(-20px)', opacity: '0' }, + '100%': { transform: 'translateX(0)', opacity: '1' }, + }, + float: { + '0%, 100%': { transform: 'translateY(0px)' }, + '50%': { transform: 'translateY(-20px)' }, + }, + gradient: { + '0%, 100%': { backgroundPosition: '0% 50%' }, + '50%': { backgroundPosition: '100% 50%' }, + }, + }, + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + 'gradient-conic': 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', + }, + }, + }, + plugins: [], +} + diff --git a/web/landing/tsconfig.json b/web/landing/tsconfig.json new file mode 100644 index 0000000..7006450 --- /dev/null +++ b/web/landing/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "astro/tsconfigs/strict", + "compilerOptions": { + "jsx": "react-jsx", + "jsxImportSource": "react" + } +} + diff --git a/web/nginx.conf b/web/nginx.conf new file mode 100644 index 0000000..498cae0 --- /dev/null +++ b/web/nginx.conf @@ -0,0 +1,76 @@ +server { + listen 80; + server_name localhost; + + # Gzip compression + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/json application/javascript; + + # API proxy - debe ir antes de otras rutas + location /api { + proxy_pass http://backend:3001; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # WebSocket proxy + location /ws { + proxy_pass http://backend:3001; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Login también va al dashboard + location /login { + proxy_pass http://dashboard:80; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Dashboard Vue + location /dashboard { + proxy_pass http://dashboard:80; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # Para SPA routing dentro de /dashboard - quitar el prefijo /dashboard + rewrite ^/dashboard/(.*)$ /$1 break; + rewrite ^/dashboard$ / break; + } + + # Landing page (Astro) - raíz + location / { + proxy_pass http://landing:80; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } +} + diff --git a/web/start.sh b/web/start.sh index 5becb1d..5941c1e 100755 --- a/web/start.sh +++ b/web/start.sh @@ -25,10 +25,10 @@ if [ ! -d "backend/node_modules" ]; then cd .. fi -# Instalar dependencias del frontend si no existen -if [ ! -d "frontend/node_modules" ]; then - echo "📦 Instalando dependencias del frontend..." - cd frontend +# Instalar dependencias del dashboard si no existen +if [ ! -d "dashboard/node_modules" ]; then + echo "📦 Instalando dependencias del dashboard..." + cd dashboard npm install cd .. fi @@ -43,21 +43,21 @@ cd .. # Esperar un poco para que el backend se inicie sleep 2 -# Iniciar frontend -echo "🎨 Iniciando frontend..." -cd frontend +# Iniciar dashboard +echo "🎨 Iniciando dashboard..." +cd dashboard npm run dev & -FRONTEND_PID=$! +DASHBOARD_PID=$! cd .. echo "" echo "✅ Servidores iniciados!" echo "📡 Backend: http://localhost:3001" -echo "🎨 Frontend: http://localhost:3000" +echo "🎨 Dashboard: http://localhost:3000" echo "" echo "Presiona Ctrl+C para detener los servidores" # Esperar a que se presione Ctrl+C -trap "kill $BACKEND_PID $FRONTEND_PID 2>/dev/null; exit" INT TERM +trap "kill $BACKEND_PID $DASHBOARD_PID 2>/dev/null; exit" INT TERM wait