commit 094ea9cf8171d2b876254ecd620030953b21b7ce
Author: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com>
Date: Mon Jun 1 08:06:40 2026 -0500
feat: initial commit - Moraworld Imports project
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..580c55e
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,44 @@
+# ─── Base de datos ───
+# Opción A — Coolify (recomendado si ya tienes Postgres ahí):
+# DATABASE_URL="postgresql://USER:PASSWORD@HOST:5432/NOMBRE_BD?schema=moraworld"
+# Nota: en Postgres 15+ el schema "public" suele no permitir CREATE; usamos "moraworld".
+#
+# Opción B — Local con docker compose:
+DATABASE_URL="postgresql://moraworld:moraworld_dev@localhost:5432/moraworld?schema=public"
+
+# ─── Redis ───
+# Opción A — Coolify:
+# REDIS_URL="redis://:PASSWORD@HOST:6379"
+# REDIS_URL="rediss://:PASSWORD@HOST:6380" # si TLS
+#
+# Opción B — Local:
+REDIS_URL="redis://localhost:6379"
+
+# ─── API (NestJS) ───
+API_PORT=3001
+API_URL="http://localhost:3001"
+JWT_SECRET="change-me-in-production-min-32-chars-long"
+JWT_EXPIRES_IN="15m"
+JWT_REFRESH_EXPIRES_IN="7d"
+
+# ─── Web (Next.js) ───
+WEB_PORT=3000
+NEXT_PUBLIC_API_URL="http://localhost:3001"
+
+# ─── CORS (coma separada; en Coolify usar dominio real) ───
+CORS_ORIGINS="http://localhost:3000"
+
+# ─── Moraworld (negocio) ───
+WAREHOUSE_ADDRESS_STREET="150 N Day St"
+WAREHOUSE_ADDRESS_CITY="City of Orange"
+WAREHOUSE_ADDRESS_STATE="NJ"
+WAREHOUSE_ADDRESS_ZIP="07050"
+WAREHOUSE_ADDRESS_COUNTRY="US"
+
+# ─── S3 / archivos (opcional Fase 1; MinIO local en docker-compose) ───
+# S3_ENDPOINT="http://localhost:9000"
+# S3_BUCKET="moraworld"
+# S3_ACCESS_KEY="minioadmin"
+# S3_SECRET_KEY="minioadmin"
+# S3_REGION="us-east-1"
+# S3_FORCE_PATH_STYLE="true"
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d9fb62f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,40 @@
+# Dependencies
+node_modules/
+.pnpm-store/
+
+# Build
+dist/
+build/
+.next/
+out/
+.turbo/
+
+# Env
+.env
+.env.local
+.env.*.local
+!.env.example
+
+# IDE
+.idea/
+.vscode/
+*.swp
+*.swo
+
+# OS
+.DS_Store
+Thumbs.db
+
+# Logs
+*.log
+npm-debug.log*
+pnpm-debug.log*
+
+# Prisma
+packages/database/prisma/migrations/**/migration_lock.toml
+
+# Test / coverage
+coverage/
+
+# Coolify / Docker local overrides
+docker-compose.override.yml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8490883
--- /dev/null
+++ b/README.md
@@ -0,0 +1,96 @@
+# Moraworld Imports — Software
+
+Casillero internacional (EE.UU. → Ecuador). Monorepo con **Next.js**, **NestJS**, **PostgreSQL** y **Redis**.
+
+## Requisitos
+
+- Node.js 20+
+- pnpm 9+ (ver instalación abajo si sale `command not found`)
+- **Postgres + Redis** — en Coolify (recomendado) **o** Docker local
+
+### Instalar pnpm (si no lo tienes)
+
+```bash
+npm install -g pnpm@9.15.0
+```
+
+Cierra y abre la terminal, luego:
+
+```bash
+pnpm -v # debe mostrar 9.15.x
+```
+
+**Alternativa sin instalar global** (usa npx):
+
+```bash
+npx pnpm@9.15.0 install
+npx pnpm@9.15.0 dev
+```
+
+## Desarrollo local (paso a paso)
+
+### 1. Variables de entorno
+
+```bash
+cp .env.example .env
+```
+
+Pega `DATABASE_URL` y `REDIS_URL` de Coolify. Guía: **[docs/VARIABLES-COOLIFY.md](./docs/VARIABLES-COOLIFY.md)**
+
+### 2. Infraestructura (solo si NO usas Coolify para BD)
+
+```bash
+pnpm docker:up
+```
+
+Levanta **PostgreSQL** (`localhost:5432`) y **Redis** (`localhost:6379`).
+Si Postgres/Redis ya están en Coolify, **omite este paso**.
+
+### 3. Instalar dependencias
+
+```bash
+pnpm install
+```
+
+### 4. Base de datos
+
+```bash
+pnpm db:generate
+pnpm db:migrate
+```
+
+Nombre sugerido para la primera migración: `init`.
+
+### 5. Arrancar apps
+
+```bash
+pnpm dev
+```
+
+| Servicio | URL |
+|----------|-----|
+| Web (Next.js) | http://localhost:3000 |
+| API (NestJS) | http://localhost:3001/api/health |
+| Estado | http://localhost:3000/status |
+
+## Estructura
+
+```
+apps/
+ api/ # NestJS REST API
+ web/ # Next.js (landing + futuro portal)
+packages/
+ database/ # Prisma + PostgreSQL
+```
+
+## Coolify
+
+Ver **[docs/COOLIFY.md](./docs/COOLIFY.md)** para desplegar API y Web en Coolify (Postgres/Redis como servicios del panel o externos).
+
+## Roadmap
+
+Ver **[ROADMAP.md](./ROADMAP.md)** — Fase 0 en curso.
+
+## Prototipos HTML (legacy)
+
+Los archivos `index.html`, `portal-cliente.html`, etc. en la raíz del repo son maquetas de referencia hasta completar la migración a Next.js (Fase 1).
diff --git a/ROADMAP.md b/ROADMAP.md
new file mode 100644
index 0000000..d5edeae
--- /dev/null
+++ b/ROADMAP.md
@@ -0,0 +1,401 @@
+# Moraworld Imports — Roadmap de Desarrollo
+
+**Versión:** 1.0
+**Fecha inicio:** Mayo 2026
+**Estado:** En planificación → Fase 0
+
+---
+
+## Visión del producto
+
+Plataforma logística transfronteriza (EE.UU. → Ecuador) con:
+
+- **Casillero B2C** — automatizado (Amazon, eBay, etc.)
+- **Carga pesada B2B** — cotización manual
+- **Bodega NJ** — operaciones físicas sincronizadas por API
+- **Aduanas** — declaraciones SENAE
+- **Multi-tenant** — una instalación, datos aislados por empresa
+
+**Bodega:** `150 N Day St, Suite EC-XXXXX, City of Orange, NJ 07050`
+
+---
+
+## Stack acordado (base del roadmap)
+
+| Capa | Tecnología |
+|------|------------|
+| Monorepo | Turborepo + pnpm |
+| Frontend | Next.js 15 (App Router) + TypeScript + Tailwind CSS |
+| API | NestJS + TypeScript |
+| ORM / migraciones | Prisma |
+| Base de datos | PostgreSQL 16 |
+| Cache / colas | Redis + BullMQ |
+| Archivos | AWS S3 (facturas, fotos) |
+| Auth | JWT + refresh tokens + MFA TOTP |
+| Contenedores | Docker Compose (local) |
+| CI | GitHub Actions |
+| Docs API | Swagger (OpenAPI) |
+
+> El documento de requerimientos lista esto como **sugerido**; este roadmap lo adopta como decisión de implementación salvo cambio explícito.
+
+---
+
+## Estructura del repositorio (objetivo final)
+
+```
+moraworld/
+├── apps/
+│ ├── web/ # Next.js — landing + portal cliente + tracking público
+│ ├── admin/ # Next.js — portal admin + agente aduanero (Fase 3+)
+│ ├── warehouse/ # Next.js — portal bodega NJ (Fase 2)
+│ └── api/ # NestJS — REST API + workers
+├── packages/
+│ ├── database/ # Prisma schema + client
+│ ├── shared/ # Tipos, constantes, validaciones Zod
+│ └── ui/ # Componentes compartidos (opcional Fase 2)
+├── docker/
+│ └── docker-compose.yml
+├── docs/
+│ └── api/ # OpenAPI export
+└── ROADMAP.md
+```
+
+---
+
+## Fases y cronograma estimado
+
+| Fase | Nombre | Duración est. | Entregable principal |
+|:----:|--------|:-------------:|----------------------|
+| 0 | Fundación | 1 semana | Repo, Docker, BD, auth básico |
+| 1 | MVP Casillero (cliente) | 3–4 semanas | Registro, suite, paquetes, pre-alerta |
+| 2 | Bodega + API externa | 3–4 semanas | Portal operador NJ + sync software bodega |
+| 3 | Admin + tarifas | 2–3 semanas | Dashboard, roles, configuración |
+| 4 | Calculadora + pagos | 2–3 semanas | SENAE en calculadora + cobro en línea |
+| 5 | Aduanas SENAE | 4–6 semanas | DSI, envío WebService, agente aduanero |
+| 6 | Notificaciones + integraciones | 2–3 semanas | Email, SMS, WhatsApp, Amazon SP-API |
+| 7 | B2B carga pesada | 2 semanas | Cotizaciones, expedientes INEN |
+| 8 | Producción + hardening | 2–3 semanas | Deploy, backups, auditoría, ISO prep |
+
+**Total estimado:** 19–26 semanas (~5–6 meses) con 1–2 desarrolladores.
+
+---
+
+## Fase 0 — Fundación (Semana 1)
+
+### Objetivo
+Entorno de desarrollo reproducible y esqueleto del monorepo.
+
+### Tareas
+
+- [ ] Inicializar git + `.gitignore` + ramas (`main`, `develop`)
+- [ ] Crear monorepo Turborepo (pnpm workspaces)
+- [ ] `docker-compose`: PostgreSQL, Redis, (MinIO opcional para S3 local)
+- [ ] App `api` NestJS: health check, CORS, validación global
+- [ ] Package `database`: Prisma + primera migración
+- [ ] App `web` Next.js: layout base, tipografía Inter, colores marca
+- [ ] Variables de entorno (`.env.example`)
+- [ ] README con instrucciones `pnpm install` + `docker compose up`
+
+### Criterios de aceptación
+
+- `pnpm dev` levanta API + web en local
+- API responde `GET /health` → 200
+- Prisma conecta a PostgreSQL y aplica migraciones
+
+---
+
+## Fase 1 — MVP Casillero cliente (Semanas 2–5)
+
+### Objetivo
+Reemplazar el flujo mock de `login.html`, `registro.html` y `portal-cliente.html` con backend real.
+
+### Modelo de datos (Prisma — núcleo)
+
+```
+Tenant, User, Role, UserRole
+Suite (código EC-XXXXX por usuario)
+Package, PackageStatusHistory
+PreAlert, Document (S3 keys)
+TariffZone (básico)
+AuditLog
+```
+
+### Tareas backend (NestJS)
+
+- [ ] Módulo `auth`: registro, login, refresh, logout
+- [ ] MFA TOTP: activar / verificar en login
+- [ ] Módulo `users`: perfil, actualizar teléfono/WhatsApp
+- [ ] Módulo `suites`: asignación automática al registrar (`EC-{secuencia}`)
+- [ ] Módulo `packages`: CRUD, cambio de estado, historial inmutable
+- [ ] Módulo `pre-alerts`: crear, listar, adjuntar factura (upload S3)
+- [ ] Módulo `documents`: presigned URLs para subida
+- [ ] RBAC: guard `Cliente` vs roles internos (stub para fases posteriores)
+- [ ] Generador Tracking ID: `EC-YYYYMMDD-XXXXXX`
+- [ ] Seed: tenant Moraworld + usuario demo
+
+### Tareas frontend (Next.js `web`)
+
+- [ ] Migrar diseño de `index.html` → `/` (landing)
+- [ ] `/login`, `/registro` (multi-paso como HTML actual)
+- [ ] `/portal` — layout con sidebar (dashboard, paquetes, pre-alertas)
+- [ ] `/portal/mi-casillero` — dirección Suite copiable
+- [ ] `/portal/paquetes` — tabla con estados reales desde API
+- [ ] `/portal/pre-alertas` — formulario + upload factura
+- [ ] Modal registrar compra (manual; URL Amazon en Fase 6)
+- [ ] Cliente API (fetch/axios) + manejo de tokens
+
+### Criterios de aceptación
+
+- Usuario se registra y recibe Suite única en BD
+- Crea pre-alerta con PDF/imagen en S3
+- Registra paquete manual y ve estado `REGISTRADO`
+- Historial de estados visible y no editable
+
+---
+
+## Fase 2 — Portal bodega + API software propio (Semanas 6–9)
+
+### Objetivo
+Operadores en NJ gestionan paquetes físicos; tu software de bodega sincroniza por API.
+
+### Tareas
+
+- [ ] App `warehouse` (Next.js) o rutas `/warehouse` con rol `Operador Bodega`
+- [ ] Lista paquetes esperados (pre-alertas + registrados)
+- [ ] Acción: recibir paquete → `RECIBIDO_BODEGA`
+- [ ] Verificación: peso real, dimensiones, fotos (múltiples) → `EN_VERIFICACION` / `VERIFICADO`
+- [ ] Alerta discrepancia peso > 10%
+- [ ] Asignar paquete a Suite si llegó sin pre-alertar
+- [ ] **API externa v1** (API Key por tenant):
+ - `POST /api/v1/webhooks/package-status`
+ - `GET /api/v1/packages?status=...`
+ - `PATCH /api/v1/packages/:id/verify`
+- [ ] Documentación OpenAPI para integración bodega
+- [ ] Idempotencia en webhooks (`X-Idempotency-Key`)
+
+### Criterios de aceptación
+
+- Operador escanea/busca paquete y confirma recepción
+- Fotos visibles en portal cliente tras subirlas
+- Software externo puede actualizar estado vía API autenticada
+
+---
+
+## Fase 3 — Portal administrativo (Semanas 10–12)
+
+### Objetivo
+Admin Empresa y Super Admin gestionan operación.
+
+### Tareas
+
+- [ ] App `admin` o rutas `/admin`
+- [ ] Dashboard: paquetes por estado, ingresos, incidencias
+- [ ] Gestión usuarios y roles (matriz del doc §3.2)
+- [ ] Configurar tarifas: $/lb por zona Ecuador
+- [ ] Configurar categorías SENAE (4x4, B, C, D) editables
+- [ ] Logs de auditoría (solo lectura, filtros)
+- [ ] Reportes básicos CSV: envíos del mes
+
+### Criterios de aceptación
+
+- Admin cambia tarifa y afecta calculadora nueva
+- Toda acción sensible queda en `audit_logs`
+
+---
+
+## Fase 4 — Calculadora + pagos (Semanas 13–15)
+
+### Objetivo
+Calculadora pública y de portal con reglas reales; cobro anticipado del envío.
+
+### Tareas
+
+- [ ] Servicio `calculator`: peso volumétrico, flete, seguro, FODINFA, arancel, IVA
+- [ ] Endpoint público `POST /api/v1/calculate-shipping` (sin auth)
+- [ ] Migrar sección calculadora de `index.html` → datos desde API
+- [ ] Tracking público `GET /api/v1/tracking/:id` (sin auth, datos limitados)
+- [ ] Integración pasarela: **PayPhone** (prioridad Ecuador) + webhook confirmación
+- [ ] Vincular pago a `Package` antes de despacho
+- [ ] Estados post-pago en historial
+
+### Criterios de aceptación
+
+- Calculadora landing = misma lógica que portal (misma API)
+- Cliente paga envío y paquete queda marcado como pagado
+- Tracking público muestra timeline sin login
+
+---
+
+## Fase 5 — Módulo aduanas SENAE (Semanas 16–21)
+
+### Objetivo
+Declaración simplificada (DSI) y envío al WebService SENAE.
+
+### Tareas
+
+- [ ] Modelo `CustomsDeclaration` ligado a `Package`
+- [ ] Validación umbral $400 / régimen 4x4
+- [ ] Generación automática DSI (borrador)
+- [ ] Portal agente aduanero: revisar, aprobar, rechazar
+- [ ] Cola BullMQ: `submit-to-senae` con reintentos
+- [ ] Integración SENAE sandbox → producción
+- [ ] Guardar número autorización SENAE + PDF
+- [ ] Estado `DECLARACION_ADUANERA` → `EN_TRANSITO_ECUADOR`
+
+### Criterios de aceptación
+
+- Paquete `VERIFICADO` genera DSI revisable por agente
+- Envío exitoso a SENAE actualiza estado y notifica cliente
+- Paquetes sobre umbral generan alerta de importación formal
+
+---
+
+## Fase 6 — Notificaciones e integraciones (Semanas 22–24)
+
+### Objetivo
+Comunicación automática en cada cambio de estado.
+
+### Tareas
+
+- [ ] Worker notificaciones: email (Resend/SES), SMS, WhatsApp Business API
+- [ ] Plantillas por estado (11 estados del doc)
+- [ ] Preferencias usuario: canal activo
+- [ ] Amazon SP-API: parsear URL → pre-llenar registro compra
+- [ ] Courier APIs (UPS/FedEx): tracking vendedor opcional
+- [ ] Botón WhatsApp landing (ya en HTML) — números desde config admin
+
+### Criterios de aceptación
+
+- Cambio de estado dispara al menos email + un canal configurado
+- Pegar URL Amazon pre-llena formulario de compra
+
+---
+
+## Fase 7 — Carga pesada B2B (Semanas 25–26)
+
+### Objetivo
+Flujo separado del casillero para importadores mayoristas.
+
+### Tareas
+
+- [ ] Modelo `B2BQuote`, `B2BQuoteStatus`
+- [ ] Formulario cotización en `/carga-pesada/cotizacion`
+- [ ] Panel admin: revisar solicitudes, responder cotización
+- [ ] Expediente con tracking B2B propio
+- [ ] Campos INEN / certificación en formulario
+- [ ] Notificación manual (email/WhatsApp) al equipo Moraworld
+
+### Criterios de aceptación
+
+- Cotización B2B no mezcla flujo con paquetes B2C
+- Admin puede cerrar cotización como aceptada/rechazada
+
+---
+
+## Fase 8 — Producción y hardening (Semanas 27–29)
+
+### Objetivo
+Sistema listo para usuarios reales con SLA y seguridad.
+
+### Tareas
+
+- [ ] Ambientes: `development`, `staging`, `production`
+- [ ] Deploy: API + web (Railway/Render o AWS ECS + RDS)
+- [ ] TLS, dominio, Cloudflare WAF
+- [ ] Backups PostgreSQL automáticos (retención 90 días)
+- [ ] Rate limiting, helmet, validación OWASP básica
+- [ ] Políticas: privacidad LOPDP, términos, cookies
+- [ ] Monitoreo: Sentry + logs estructurados
+- [ ] Pruebas E2E críticas (Playwright): registro → pre-alerta → bodega recibe
+- [ ] Runbook operativo para equipo Moraworld
+
+### Criterios de aceptación
+
+- Staging accesible con datos de prueba
+- Producción con backup restaurable probado
+- Checklist ISO 27001 controles implementados documentado
+
+---
+
+## Roles del sistema (implementación por fase)
+
+| Rol | Fase disponible |
+|-----|-----------------|
+| Cliente Final | Fase 1 |
+| Operador Bodega | Fase 2 |
+| Soporte | Fase 3 (solo lectura) |
+| Admin Empresa | Fase 3 |
+| Agente Aduanero | Fase 5 |
+| Super Admin | Fase 3 |
+
+---
+
+## Estados de paquete (referencia única)
+
+```
+REGISTRADO → EN_TRANSITO_BODEGA → RECIBIDO_BODEGA → EN_VERIFICACION
+→ VERIFICADO → DECLARACION_ADUANERA → EN_TRANSITO_ECUADOR
+→ EN_ADUANA_ECUADOR → LISTO_ENTREGA → ENTREGADO
+(INCIDENCIA en cualquier punto)
+```
+
+---
+
+## Migración desde prototipos HTML actuales
+
+| Archivo actual | Destino en producción |
+|----------------|----------------------|
+| `index.html` | `apps/web` — `/`, secciones anchor |
+| `login.html` | `apps/web` — `/login` |
+| `registro.html` | `apps/web` — `/registro` |
+| `portal-cliente.html` | `apps/web` — `/portal/*` |
+| `documentacion.html` | Mantener estático o mover a `/docs` interno |
+| `presentacion.html` | Mantener para ventas; no producción |
+| `requerimientos-sistema-casillero.md` | Fuente de verdad funcional |
+
+Los HTML actuales **no se borran** hasta completar migración de cada sección (Fase 1–4).
+
+---
+
+## Riesgos y dependencias externas
+
+| Riesgo | Mitigación |
+|--------|------------|
+| Acceso API SENAE (sandbox/prod) | Iniciar trámite en Fase 0; mock en Fase 5 |
+| Software bodega sin API aún | Definir contrato OpenAPI en Fase 2; mock |
+| PayPhone / credenciales pagos | Cuenta merchant en Fase 4 |
+| WhatsApp Business verificación | Proceso Meta en Fase 6 |
+| Amazon SP-API aprobación | Fallback scraping/manual Fase 6 |
+
+---
+
+## Próximo paso inmediato (esta semana)
+
+**Iniciar Fase 0** en este orden:
+
+1. Crear monorepo + Docker + PostgreSQL + Redis
+2. Prisma schema v0 (Tenant, User, Suite, Package)
+3. NestJS auth mínimo (registro + login JWT)
+4. Next.js shell con página de health
+
+Cuando confirmes, ejecutamos la Fase 0 en el repositorio.
+
+---
+
+## Control de progreso
+
+| Fase | Estado | Fecha inicio | Fecha fin |
+|:----:|:------:|:------------:|:---------:|
+| 0 | 🟡 En curso | May 2026 | |
+| 1 | ⬜ Pendiente | | |
+| 2 | ⬜ Pendiente | | |
+| 3 | ⬜ Pendiente | | |
+| 4 | ⬜ Pendiente | | |
+| 5 | ⬜ Pendiente | | |
+| 6 | ⬜ Pendiente | | |
+| 7 | ⬜ Pendiente | | |
+| 8 | ⬜ Pendiente | | |
+
+---
+
+*Documento vivo — actualizar al cerrar cada fase.*
diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile
new file mode 100644
index 0000000..6a501e2
--- /dev/null
+++ b/apps/api/Dockerfile
@@ -0,0 +1,27 @@
+# Coolify / producción — API NestJS
+FROM node:22-alpine AS base
+RUN corepack enable && corepack prepare pnpm@9.15.0 --activate
+WORKDIR /app
+
+FROM base AS deps
+COPY package.json pnpm-workspace.yaml pnpm-lock.yaml* ./
+COPY apps/api/package.json ./apps/api/
+COPY packages/database/package.json ./packages/database/
+RUN pnpm install --frozen-lockfile 2>/dev/null || pnpm install
+
+FROM base AS builder
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+RUN pnpm --filter @moraworld/database generate
+RUN pnpm --filter @moraworld/database build
+RUN pnpm --filter @moraworld/api build
+
+FROM node:22-alpine AS runner
+WORKDIR /app
+ENV NODE_ENV=production
+COPY --from=builder /app/apps/api/dist ./dist
+COPY --from=builder /app/apps/api/package.json ./
+COPY --from=builder /app/node_modules ./node_modules
+COPY --from=builder /app/packages/database/node_modules/.prisma ./node_modules/.prisma
+EXPOSE 3001
+CMD ["node", "dist/main.js"]
diff --git a/apps/api/nest-cli.json b/apps/api/nest-cli.json
new file mode 100644
index 0000000..f9aa683
--- /dev/null
+++ b/apps/api/nest-cli.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "https://json.schemastore.org/nest-cli",
+ "collection": "@nestjs/schematics",
+ "sourceRoot": "src",
+ "compilerOptions": {
+ "deleteOutDir": true
+ }
+}
diff --git a/apps/api/package.json b/apps/api/package.json
new file mode 100644
index 0000000..f68f822
--- /dev/null
+++ b/apps/api/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "@moraworld/api",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "build": "nest build",
+ "dev": "nest start --watch",
+ "start": "node dist/main",
+ "start:prod": "node dist/main",
+ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
+ },
+ "dependencies": {
+ "@moraworld/database": "workspace:*",
+ "@nestjs/common": "^11.1.0",
+ "@nestjs/config": "^4.0.2",
+ "@nestjs/core": "^11.1.0",
+ "@nestjs/platform-express": "^11.1.0",
+ "reflect-metadata": "^0.2.2",
+ "rxjs": "^7.8.2"
+ },
+ "devDependencies": {
+ "@nestjs/cli": "^11.0.7",
+ "@nestjs/schematics": "^11.0.5",
+ "@types/express": "^5.0.1",
+ "@types/node": "^22.15.21",
+ "typescript": "^5.8.3"
+ }
+}
diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts
new file mode 100644
index 0000000..1fd2512
--- /dev/null
+++ b/apps/api/src/app.module.ts
@@ -0,0 +1,16 @@
+import { Module } from "@nestjs/common";
+import { ConfigModule } from "@nestjs/config";
+import { HealthModule } from "./health/health.module";
+import { PrismaModule } from "./prisma/prisma.module";
+
+@Module({
+ imports: [
+ ConfigModule.forRoot({
+ isGlobal: true,
+ envFilePath: ["../../.env", ".env"],
+ }),
+ PrismaModule,
+ HealthModule,
+ ],
+})
+export class AppModule {}
diff --git a/apps/api/src/health/health.controller.ts b/apps/api/src/health/health.controller.ts
new file mode 100644
index 0000000..9813686
--- /dev/null
+++ b/apps/api/src/health/health.controller.ts
@@ -0,0 +1,27 @@
+import { Controller, Get } from "@nestjs/common";
+import { PrismaService } from "../prisma/prisma.service";
+
+@Controller()
+export class HealthController {
+ constructor(private readonly prisma: PrismaService) {}
+
+ @Get("health")
+ async health() {
+ let database: "ok" | "error" = "ok";
+ try {
+ await this.prisma.client.$queryRaw`SELECT 1`;
+ } catch {
+ database = "error";
+ }
+
+ return {
+ status: database === "ok" ? "ok" : "degraded",
+ service: "moraworld-api",
+ version: "0.1.0",
+ timestamp: new Date().toISOString(),
+ checks: {
+ database,
+ },
+ };
+ }
+}
diff --git a/apps/api/src/health/health.module.ts b/apps/api/src/health/health.module.ts
new file mode 100644
index 0000000..40b7bdf
--- /dev/null
+++ b/apps/api/src/health/health.module.ts
@@ -0,0 +1,7 @@
+import { Module } from "@nestjs/common";
+import { HealthController } from "./health.controller";
+
+@Module({
+ controllers: [HealthController],
+})
+export class HealthModule {}
diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts
new file mode 100644
index 0000000..33aa306
--- /dev/null
+++ b/apps/api/src/main.ts
@@ -0,0 +1,24 @@
+import { NestFactory } from "@nestjs/core";
+import { AppModule } from "./app.module";
+
+async function bootstrap() {
+ const app = await NestFactory.create(AppModule);
+
+ const corsOrigins = (process.env.CORS_ORIGINS ?? "http://localhost:3000")
+ .split(",")
+ .map((o) => o.trim());
+
+ app.enableCors({
+ origin: corsOrigins,
+ credentials: true,
+ });
+
+ app.setGlobalPrefix("api");
+
+ const port = process.env.API_PORT ?? process.env.PORT ?? 3001;
+ await app.listen(port, "0.0.0.0");
+
+ console.log(`Moraworld API → http://localhost:${port}/api`);
+}
+
+bootstrap();
diff --git a/apps/api/src/prisma/prisma.module.ts b/apps/api/src/prisma/prisma.module.ts
new file mode 100644
index 0000000..1edbf95
--- /dev/null
+++ b/apps/api/src/prisma/prisma.module.ts
@@ -0,0 +1,9 @@
+import { Global, Module } from "@nestjs/common";
+import { PrismaService } from "./prisma.service";
+
+@Global()
+@Module({
+ providers: [PrismaService],
+ exports: [PrismaService],
+})
+export class PrismaModule {}
diff --git a/apps/api/src/prisma/prisma.service.ts b/apps/api/src/prisma/prisma.service.ts
new file mode 100644
index 0000000..3c47d49
--- /dev/null
+++ b/apps/api/src/prisma/prisma.service.ts
@@ -0,0 +1,15 @@
+import { Injectable, OnModuleDestroy, OnModuleInit } from "@nestjs/common";
+import { prisma, PrismaClient } from "@moraworld/database";
+
+@Injectable()
+export class PrismaService implements OnModuleInit, OnModuleDestroy {
+ readonly client: PrismaClient = prisma;
+
+ async onModuleInit() {
+ await prisma.$connect();
+ }
+
+ async onModuleDestroy() {
+ await prisma.$disconnect();
+ }
+}
diff --git a/apps/api/tsconfig.build.json b/apps/api/tsconfig.build.json
new file mode 100644
index 0000000..2fe1df2
--- /dev/null
+++ b/apps/api/tsconfig.build.json
@@ -0,0 +1,4 @@
+{
+ "extends": "./tsconfig.json",
+ "exclude": ["node_modules", "dist", "test", "**/*spec.ts"]
+}
diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json
new file mode 100644
index 0000000..d41ab1b
--- /dev/null
+++ b/apps/api/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "declaration": true,
+ "removeComments": true,
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "allowSyntheticDefaultImports": true,
+ "target": "ES2022",
+ "sourceMap": true,
+ "outDir": "./dist",
+ "baseUrl": "./",
+ "incremental": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true,
+ "esModuleInterop": true
+ },
+ "include": ["src/**/*"]
+}
diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile
new file mode 100644
index 0000000..6a314ae
--- /dev/null
+++ b/apps/web/Dockerfile
@@ -0,0 +1,28 @@
+# Coolify / producción — Next.js standalone
+FROM node:22-alpine AS base
+RUN corepack enable && corepack prepare pnpm@9.15.0 --activate
+WORKDIR /app
+
+FROM base AS deps
+COPY package.json pnpm-workspace.yaml pnpm-lock.yaml* ./
+COPY apps/web/package.json ./apps/web/
+RUN pnpm install --frozen-lockfile 2>/dev/null || pnpm install
+
+FROM base AS builder
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+ARG NEXT_PUBLIC_API_URL=http://localhost:3001
+ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
+RUN pnpm --filter @moraworld/web build
+
+FROM node:22-alpine AS runner
+WORKDIR /app
+ENV NODE_ENV=production
+ENV PORT=3000
+RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 nextjs
+COPY --from=builder /app/apps/web/public ./public
+COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/standalone ./
+COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static
+USER nextjs
+EXPOSE 3000
+CMD ["node", "apps/web/server.js"]
diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts
new file mode 100644
index 0000000..830fb59
--- /dev/null
+++ b/apps/web/next-env.d.ts
@@ -0,0 +1,6 @@
+///
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts
new file mode 100644
index 0000000..68a6c64
--- /dev/null
+++ b/apps/web/next.config.ts
@@ -0,0 +1,7 @@
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+ output: "standalone",
+};
+
+export default nextConfig;
diff --git a/apps/web/package.json b/apps/web/package.json
new file mode 100644
index 0000000..ec904dd
--- /dev/null
+++ b/apps/web/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "@moraworld/web",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev --port 3000",
+ "build": "next build",
+ "start": "next start --port 3000",
+ "lint": "next lint"
+ },
+ "dependencies": {
+ "next": "^15.3.2",
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0"
+ },
+ "devDependencies": {
+ "@types/node": "^22.15.21",
+ "@types/react": "^19.1.4",
+ "@types/react-dom": "^19.1.5",
+ "typescript": "^5.8.3"
+ }
+}
diff --git a/apps/web/public/.gitkeep b/apps/web/public/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css
new file mode 100644
index 0000000..06d9a0b
--- /dev/null
+++ b/apps/web/src/app/globals.css
@@ -0,0 +1,34 @@
+:root {
+ --primary: #0057ff;
+ --primary-dark: #003fc7;
+ --accent: #ff6b00;
+ --dark: #0d1117;
+ --gray-900: #111827;
+ --gray-500: #6b7280;
+ --gray-200: #e5e7eb;
+ --gray-100: #f3f4f6;
+ --white: #ffffff;
+ --green: #10b981;
+}
+
+* {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ font-family: var(--font-inter), system-ui, sans-serif;
+ color: var(--gray-900);
+ background: var(--white);
+ line-height: 1.6;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx
new file mode 100644
index 0000000..2099181
--- /dev/null
+++ b/apps/web/src/app/layout.tsx
@@ -0,0 +1,26 @@
+import type { Metadata } from "next";
+import { Inter } from "next/font/google";
+import "./globals.css";
+
+const inter = Inter({
+ subsets: ["latin"],
+ variable: "--font-inter",
+});
+
+export const metadata: Metadata = {
+ title: "Moraworld Imports — Casillero en EE.UU. para Ecuador",
+ description:
+ "Compra en Amazon, eBay y más. Tu casillero en New Jersey con envío y gestión aduanera a Ecuador.",
+};
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+
+
{children}
+
+ );
+}
diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx
new file mode 100644
index 0000000..6839531
--- /dev/null
+++ b/apps/web/src/app/page.tsx
@@ -0,0 +1,115 @@
+async function getApiHealth() {
+ const apiUrl = process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:3001";
+ try {
+ const res = await fetch(`${apiUrl}/api/health`, {
+ next: { revalidate: 10 },
+ });
+ if (!res.ok) return null;
+ return res.json();
+ } catch {
+ return null;
+ }
+}
+
+export default async function HomePage() {
+ const health = await getApiHealth();
+
+ return (
+
+
+
+ Moraworld. Imports
+
+
+ API: {health?.status === "ok" ? "conectada" : "local / pendiente"}
+
+
+
+
+
+
+ Fase 0 — Fundación del software
+
+
+ Tu casillero en New Jersey
+
+ para recibir en Ecuador
+
+
+ Monorepo activo: Next.js + NestJS + PostgreSQL. Desarrollo local con Docker; despliegue en Coolify.
+
+
+
+
+
+
+ Próximos pasos (Fase 1)
+
+ Registro e inicio de sesión con JWT + MFA
+ Asignación automática de Suite (EC-XXXXX)
+ Pre-alertas y registro de paquetes
+ Migración del portal desde portal-cliente.html
+
+
+
+ );
+}
diff --git a/apps/web/src/app/status/page.tsx b/apps/web/src/app/status/page.tsx
new file mode 100644
index 0000000..d7eb02d
--- /dev/null
+++ b/apps/web/src/app/status/page.tsx
@@ -0,0 +1,56 @@
+async function getHealth() {
+ const apiUrl = process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:3001";
+ const res = await fetch(`${apiUrl}/api/health`, { cache: "no-store" });
+ if (!res.ok) throw new Error("API no disponible");
+ return res.json();
+}
+
+export default async function StatusPage() {
+ let health: Record | null = null;
+ let error: string | null = null;
+
+ try {
+ health = await getHealth();
+ } catch (e) {
+ error = e instanceof Error ? e.message : "Error desconocido";
+ }
+
+ return (
+
+
+ ← Volver
+
+ Estado del sistema
+
+ {error ? (
+
+ {error}
+ {"\n\n"}
+ Asegúrate de tener corriendo:{"\n"}
+ 1. pnpm docker:up{"\n"}
+ 2. pnpm dev (api + web)
+
+ ) : (
+
+ {JSON.stringify(health, null, 2)}
+
+ )}
+
+ );
+}
diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json
new file mode 100644
index 0000000..fba2bf3
--- /dev/null
+++ b/apps/web/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "target": "ES2017",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [{ "name": "next" }],
+ "paths": { "@/*": ["./src/*"] }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..d38db2c
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,60 @@
+# OPCIONAL — solo si NO tienes Postgres/Redis en Coolify.
+# Si ya usas BD/Redis en Coolify, configura DATABASE_URL y REDIS_URL en .env y no levantes esto.
+#
+# Uso: pnpm docker:up
+# Apps api/web se despliegan en Coolify con docs/COOLIFY.md
+
+services:
+ postgres:
+ image: postgres:16-alpine
+ container_name: moraworld-postgres
+ restart: unless-stopped
+ ports:
+ - "5432:5432"
+ environment:
+ POSTGRES_USER: moraworld
+ POSTGRES_PASSWORD: moraworld_dev
+ POSTGRES_DB: moraworld
+ volumes:
+ - moraworld_pg_data:/var/lib/postgresql/data
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready -U moraworld -d moraworld"]
+ interval: 5s
+ timeout: 5s
+ retries: 5
+
+ redis:
+ image: redis:7-alpine
+ container_name: moraworld-redis
+ restart: unless-stopped
+ ports:
+ - "6379:6379"
+ volumes:
+ - moraworld_redis_data:/data
+ healthcheck:
+ test: ["CMD", "redis-cli", "ping"]
+ interval: 5s
+ timeout: 3s
+ retries: 5
+
+ # Almacenamiento compatible S3 (facturas/fotos — Fase 1+)
+ minio:
+ image: minio/minio:latest
+ container_name: moraworld-minio
+ restart: unless-stopped
+ ports:
+ - "9000:9000"
+ - "9001:9001"
+ environment:
+ MINIO_ROOT_USER: minioadmin
+ MINIO_ROOT_PASSWORD: minioadmin
+ command: server /data --console-address ":9001"
+ volumes:
+ - moraworld_minio_data:/data
+ profiles:
+ - storage
+
+volumes:
+ moraworld_pg_data:
+ moraworld_redis_data:
+ moraworld_minio_data:
diff --git a/docs/COOLIFY.md b/docs/COOLIFY.md
new file mode 100644
index 0000000..d87f507
--- /dev/null
+++ b/docs/COOLIFY.md
@@ -0,0 +1,80 @@
+# Despliegue en Coolify
+
+## Arquitectura recomendada
+
+| Servicio Coolify | Repo / Dockerfile | Puerto |
+|------------------|-------------------|--------|
+| **moraworld-web** | `apps/web/Dockerfile` (build context: raíz del monorepo) | 3000 |
+| **moraworld-api** | `apps/api/Dockerfile` (build context: raíz del monorepo) | 3001 |
+| **PostgreSQL** | Servicio Coolify o externo | 5432 |
+| **Redis** | Servicio Coolify o externo | 6379 |
+
+## Variables de entorno
+
+### API (`moraworld-api`)
+
+```
+DATABASE_URL=postgresql://USER:PASS@HOST:5432/moraworld
+REDIS_URL=redis://HOST:6379
+API_PORT=3001
+JWT_SECRET=
+CORS_ORIGINS=https://tu-dominio.com
+NODE_ENV=production
+```
+
+### Web (`moraworld-web`)
+
+```
+NEXT_PUBLIC_API_URL=https://api.tu-dominio.com
+PORT=3000
+NODE_ENV=production
+```
+
+> En build de Coolify para **web**, pasar `NEXT_PUBLIC_API_URL` como **build argument** si usas Dockerfile (ya declarado en `apps/web/Dockerfile`).
+
+## Build en Coolify
+
+1. Conectar repositorio Git.
+2. Crear **dos aplicaciones** desde el mismo repo:
+
+### Aplicación API
+
+- **Build Pack:** Dockerfile
+- **Dockerfile location:** `apps/api/Dockerfile`
+- **Base directory / Context:** `/` (raíz del monorepo)
+- **Health check path:** `/api/health`
+- **Puerto expuesto:** 3001
+
+### Aplicación Web
+
+- **Build Pack:** Dockerfile
+- **Dockerfile location:** `apps/web/Dockerfile`
+- **Base directory / Context:** `/`
+- **Health check path:** `/`
+- **Puerto expuesto:** 3000
+
+## Migraciones en producción
+
+Ejecutar una vez (o en CI) antes/después del deploy de API:
+
+```bash
+pnpm db:generate
+pnpm exec prisma migrate deploy --schema=packages/database/prisma/schema.prisma
+```
+
+En Coolify puedes usar un **one-off command** o job con imagen Node y `DATABASE_URL` del servicio Postgres.
+
+## Desarrollo local vs Coolify
+
+| | Local | Coolify |
+|---|--------|---------|
+| Postgres/Redis | `docker compose up` | Servicios gestionados |
+| API | `pnpm --filter @moraworld/api dev` | Contenedor NestJS |
+| Web | `pnpm --filter @moraworld/web dev` | Contenedor Next standalone |
+| Dominio | localhost | HTTPS + dominio real |
+
+## Notas
+
+- No subir `.env` al repositorio.
+- Ajustar `CORS_ORIGINS` con el dominio exacto del frontend.
+- Para archivos (facturas/fotos), configurar S3 o MinIO en Fase 1 (`S3_*` en `.env.example`).
diff --git a/docs/VARIABLES-COOLIFY.md b/docs/VARIABLES-COOLIFY.md
new file mode 100644
index 0000000..c82c5b8
--- /dev/null
+++ b/docs/VARIABLES-COOLIFY.md
@@ -0,0 +1,120 @@
+# Variables desde Coolify (Postgres + Redis externos)
+
+Si Postgres y Redis ya están en Coolify, **no necesitas** `docker compose` para la BD. Solo pega las URLs en `.env` (local) y en cada app de Coolify (producción).
+
+## Qué necesitamos que nos pases
+
+Copia desde el panel de Coolify (o pega aquí en el chat) estos valores:
+
+### PostgreSQL
+
+| Variable | Ejemplo | Dónde está en Coolify |
+|----------|---------|------------------------|
+| Host | `postgres.tudominio.com` o IP interna | Servicio Postgres → Connection |
+| Puerto | `5432` | |
+| Usuario | `moraworld` | |
+| Contraseña | `***` | |
+| Base de datos | `moraworld` | Crear DB si no existe |
+
+**Formato final en `.env`:**
+
+```env
+DATABASE_URL="postgresql://USUARIO:CONTRASEÑA@HOST:5432/NOMBRE_BD?schema=moraworld"
+```
+
+> En PostgreSQL 15+ el schema `public` a menudo no permite `CREATE` al usuario de la app. Usamos el schema **`moraworld`** (se crea automáticamente en el primer deploy si el usuario tiene permiso `CREATE SCHEMA`).
+
+> Si la contraseña tiene caracteres especiales (`@`, `#`, `%`), hay que codificarlos en URL (encodeURIComponent).
+
+### Redis
+
+| Variable | Ejemplo |
+|----------|---------|
+| Host | `redis.tudominio.com` |
+| Puerto | `6379` (o `6380` con TLS) |
+| Contraseña | si aplica |
+
+**Sin contraseña:**
+
+```env
+REDIS_URL="redis://HOST:6379"
+```
+
+**Con contraseña:**
+
+```env
+REDIS_URL="redis://:CONTRASEÑA@HOST:6379"
+```
+
+**Con TLS (rediss):**
+
+```env
+REDIS_URL="rediss://:CONTRASEÑA@HOST:6380"
+```
+
+---
+
+## Dónde configurarlas
+
+### Desarrollo en tu Mac (`.env` en la raíz)
+
+```bash
+cp .env.example .env
+# Editar DATABASE_URL y REDIS_URL con los valores de Coolify
+```
+
+Luego:
+
+```bash
+pnpm db:generate
+npx pnpm exec prisma migrate deploy --schema=packages/database/prisma/schema.prisma
+pnpm dev
+```
+
+> Tu Mac debe poder **alcanzar** el host de Postgres/Redis (IP pública, túnel, o VPN). Si Coolify solo expone red interna, usa túnel SSH o el dominio público que Coolify asigne.
+
+### Coolify — app API
+
+```
+DATABASE_URL=postgresql://...
+REDIS_URL=redis://...
+API_PORT=3001
+JWT_SECRET=...
+CORS_ORIGINS=https://tu-web.com
+NODE_ENV=production
+```
+
+### Coolify — app Web
+
+```
+NEXT_PUBLIC_API_URL=https://api.tu-dominio.com
+PORT=3000
+NODE_ENV=production
+```
+
+---
+
+## Migraciones contra Postgres en Coolify
+
+Una vez tengas `DATABASE_URL` en `.env`:
+
+```bash
+pnpm db:generate
+npx pnpm exec prisma migrate deploy --schema=packages/database/prisma/schema.prisma
+```
+
+Esto crea las tablas en tu Postgres remoto (migración `20260520120000_init`).
+
+---
+
+## Redis en Fase 0
+
+La API aún **no usa** Redis (colas BullMQ en Fase 6). Puedes dejar `REDIS_URL` configurado desde ya para no cambiar env después.
+
+---
+
+## Seguridad
+
+- No subir `.env` a Git.
+- En Coolify usar "Secrets" del panel.
+- Rotar contraseñas si se compartieron en chat; luego actualizar `.env` y Coolify.
diff --git a/documentacion.html b/documentacion.html
new file mode 100644
index 0000000..90db79b
--- /dev/null
+++ b/documentacion.html
@@ -0,0 +1,1156 @@
+
+
+
+
+
+Moraworld Imports — Documentación de Requerimientos v1.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Moraworld Imports › Documento de Requerimientos
+
+ v1.1
+ ISO/IEC 27001
+ 6 mayo 2026
+
+
+
+
+
+
+
+
+
+
+
🇪🇨
+
+
Moraworld Imports S.A.S.
+
Constituida bajo las leyes de Ecuador . Representante legal en Cuenca . RUC activo, permisos aduaneros vigentes ante la SENAE.
+
Ecuador · S.A.S. · SENAE · Cuenca
+
+
+
+
🇺🇸
+
+
Mora Global Import LLC
+
LLC registrada en el estado de New Jersey, EE.UU. Bodega operativa en 150 N Day St, City of Orange, NJ 07050 .
+
New Jersey · LLC · NJ 07050
+
+
+
+
+
+
+
+
+
+ Moraworld Imports S.A.S. y Mora Global Import LLC operan un ecosistema logístico transfronterizo. La bodega física en 150 N Day St, City of Orange, NJ 07050 recibe paquetes de clientes ecuatorianos que compran en tiendas online de EE.UU. El sistema gestiona la logística de reenvío a Ecuador, incluyendo la declaración automática ante la SENAE .
+
+
+
📍
+
Dirección de la bodega: 150 N Day St, City of Orange, NJ 07050, EE.UU. — Cada cliente recibe una Suite personalizada (p. ej., Suite EC-00345) como dirección de entrega para sus compras online.
+
+
+ Servicio Descripción Tipo de flujo Segmento
+
+ Casillero Personal Compras pequeñas en Amazon, eBay, Walmart, ropa, tecnología Automatizado B2C — Clientes individuales
+ Carga Pesada / Pallets Importación mayorista: pallets, contenedores (ej: 1,000 pares de zapatos) Cotización especial B2B — Importadores
+
+
+
+
+
+
+
+
El sistema estará desarrollado bajo una arquitectura Multi-Tenant , lo que permite que múltiples empresas usen la misma plataforma con sus datos totalmente separados mediante schemas independientes en la base de datos.
+
// Diagrama de capas
+🌐 INTERNET (HTTPS / TLS 1.3)
+ │
+ ⚡ Load Balancer / API Gateway
+ │
+ ┌─────┼──────┐
+ │ │ │
+Tenant A Tenant B Tenant N
+ │ │ │
+ └─────┼──────┘
+ │
+🗄️ PostgreSQL — Schema por Tenant
+
+
+
+
+
+
+
A.5 Políticas Política de uso aceptable, manejo de datos y retención
+
A.9 Acceso Autenticación MFA obligatoria, RBAC (Role-Based Access Control)
+
A.6 Organización Roles definidos con segregación de funciones
+
A.10 Criptografía TLS 1.3 en tránsito · AES-256 en reposo
+
A.8 Activos Inventario de datos personales y de paquetes (LOPDP Ecuador)
+
A.12 Operaciones Logs de auditoría inmutables, monitoreo continuo (SIEM)
+
A.14 Desarrollo SDLC seguro, revisiones de código, pruebas OWASP Top 10
+
A.16 Incidentes Proceso de gestión y notificación de incidentes de seguridad
+
A.7 RRHH Procedimientos de onboarding/offboarding de usuarios internos
+
A.18 Cumplimiento Declaración aduanera automática conforme a normativa SENAE
+
+
+
+
+
+
+
+ Capa Tecnología Detalle
+
+ Frontend Next.js / React SSR para SEO optimizado en landing page
+ Backend / API Node.js + NestJS REST / GraphQL
+ Base de datos PostgreSQL Multi-schema por tenant
+ Autenticación OAuth 2.0 + JWT + MFA TOTP para segundo factor
+ Almacenamiento AWS S3 o equivalente Fotos de paquetes, facturas, documentos
+ Integración Amazon SP-API · WebService SENAE Datos de productos y declaraciones aduaneras
+ Tracking Webhooks + IDs propios Sistema de tracking con ID único por paquete
+ Infraestructura AWS / GCP Ambientes: desarrollo, staging, producción
+ Seguridad WAF + Rate limiting + SIEM Monitoreo continuo y auditoría
+
+
+
+
+
+
+
+
+
+
👑
+
Super Admin
+
Acceso total. Gestiona tenants, usuarios globales y configuración del sistema completo.
+
Acceso total
+
+
+
🏢
+
Admin Empresa
+
Administra su propio tenant: usuarios, tarifas, bodegas asignadas, reportes.
+
Tenant propio
+
+
+
📦
+
Operador Bodega
+
Personal en NJ. Verifica, pesa, fotografía y despacha paquetes físicamente.
+
Bodega NJ
+
+
+
🛃
+
Agente Aduanero
+
Revisa y aprueba las declaraciones antes de enviarlas a la SENAE.
+
SENAE
+
+
+
🧑💻
+
Cliente Final
+
Usuario ecuatoriano: registra compras, hace pre-alertas y da seguimiento.
+
B2C · Ecuador
+
+
+
🎧
+
Soporte
+
Puede ver información del cliente y paquetes. No puede modificar datos clave.
+
Solo lectura
+
+
+
+
Matriz de Permisos
+
+
+
+ Acción Super Admin Admin Bodega Aduanero Cliente Soporte
+
+
+ Ver dashboard ✅ ✅ ✅ ✅ ✅ ✅
+ Crear / editar usuarios ✅ ✅ ❌ ❌ ❌ ❌
+ Configurar tarifas y zonas ✅ ✅ ❌ ❌ ❌ ❌
+ Registrar compra (link/manual) ❌ ❌ ❌ ❌ ✅ ❌
+ Ver mis paquetes ❌ ❌ ❌ ❌ ✅ Solo asign.
+ Verificar paquete en bodega ❌ ❌ ✅ ❌ ❌ ❌
+ Confirmar peso / dimensiones ❌ ❌ ✅ ❌ ❌ ❌
+ Generar declaración (DSI) ❌ ❌ ❌ ✅ ❌ ❌
+ Enviar datos a SENAE ✅ ✅ ❌ ✅ ❌ ❌
+ Ver historial de envíos ✅ ✅ ✅ ✅ Solo propios ✅
+ Acceder a logs de auditoría ✅ ✅ ❌ ❌ ❌ ❌
+
+
+
+
+
+
+
+
+
+
+
+
+ Hero con propuesta de valor y dirección Suite NJ
+ Calculadora de envío visible sin registro
+ Sección de legalidad: RUC, permisos SENAE, INEN
+ Servicios diferenciados: Casillero vs Carga Pesada
+ Botón WhatsApp flotante (NJ + Cuenca Ecuador)
+ FAQ · Blog · Preguntas frecuentes
+
+
+
+
+
+ Suite personalizada asignada automáticamente al registrarse
+ Pre-alerta con carga de factura (PDF/imagen)
+ Registro por URL (escaneo de Amazon) o manual
+ Fotos del paquete al llegar a bodega NJ
+ Calculadora con desglose SENAE antes de pagar
+ Tracking ID único · historial de envíos
+
+
+
+
+
+ Lista de paquetes esperados con pre-alertas del cliente
+ Recepción por escaneo de código de barras / QR
+ Confirmación de peso real y dimensiones
+ Toma y carga de fotos del paquete
+ Alerta de discrepancia si el peso difiere >10%
+ Sincronización vía API con el software propio de bodega
+
+
+
+
+
+ Dashboard con métricas en tiempo real
+ Gestión de usuarios y roles
+ Configuración de tarifas por libra/kg y por zona
+ Reportes de ingresos y volumen de envíos
+ Logs de auditoría inmutables
+ Gestión de múltiples bodegas
+
+
+
+
+
+ Generación automática de la Declaración Simplificada (DSI)
+ Cálculo automático de FODINFA, IVA y arancel
+ Envío electrónico al WebService oficial SENAE
+ Recepción y almacenamiento del número de autorización
+ Alerta si valor supera el umbral del régimen 4×4 ($400)
+ Proceso de importación formal (DAI) para carga pesada
+
+
+
+
+
+ ID único por paquete: EC-YYYYMMDD-XXXXXX
+ 11 estados del ciclo de vida del paquete
+ Búsqueda pública sin necesidad de login
+ Timeline visual del estado actual
+ Vinculación con el tracking del courier (FedEx/DHL/UPS)
+
+
+
+
+
+ Formulario de aviso previo: tienda, tracking vendedor, valor
+ Carga de factura comercial (PDF o imagen)
+ Fecha estimada de llegada a bodega
+ La bodega recibe aviso y organiza el espacio con anticipación
+ Vinculación automática cuando el paquete llega
+
+
+
+
+
+ Flujo de cotización (no automatizado)
+ Formulario: mercancía, peso, pallets, valor, origen
+ Verificación de cumplimiento normas INEN
+ Declaración formal DAI ante la SENAE
+ Asesoría en partidas arancelarias
+ Expediente dedicado con ID de seguimiento B2B
+
+
+
+
+
+
+
+
+
+
ℹ️
+
Formato del Tracking ID: EC-YYYYMMDD-XXXXXX · Ejemplo: EC-20260506-082341 · Búsqueda pública sin login desde la landing page.
+
+
+
01
REGISTRADO
El cliente registró la compra en el sistema
+
02
EN_TRANSITO_BODEGA
El vendedor despachó el pedido hacia la bodega en NJ
+
03
RECIBIDO_BODEGA
La bodega NJ confirmó la recepción física del paquete
+
04
EN_VERIFICACION
El operador está pesando, midiendo y fotografiando el paquete
+
05
VERIFICADO
Peso y dimensiones confirmados. Cobro final aplicado.
+
06
DECLARACION_ADUANERA
DSI enviada y aprobada por la SENAE. N.º de autorización generado.
+
07
EN_TRANSITO_ECUADOR
El paquete está en vuelo / tránsito desde EE.UU. hacia Ecuador
+
08
EN_ADUANA_ECUADOR
El paquete está en proceso de inspección aduanera en Ecuador
+
09
LISTO_ENTREGA
Aduana liberó el paquete. Listo para entrega al cliente.
+
10
ENTREGADO
Paquete entregado al cliente final en Ecuador ✓
+
11
INCIDENCIA
Problema reportado: daño, pérdida o retención en aduana ⚠
+
+
+
+
+
+
+
+
1
Accede a la Landing Page y se registra Correo electrónico + contraseña + verificación MFA (TOTP). El sistema crea la cuenta.
+
+
2
Recibe su Suite personalizada automáticamente El sistema asigna: 150 N Day St, Suite EC-XXXXX, City of Orange, NJ 07050
+
+
3
Compra en Amazon / eBay / Walmart usando su Suite como destino Usa la dirección asignada exactamente como aparece en el portal. El vendedor envía a la bodega.
+
+
4
⚡ Pre-alerta (opcional pero recomendado) El cliente vuelve al portal y registra la pre-alerta con el tracking del vendedor y carga la factura de Amazon/eBay. La bodega en NJ se organiza con anticipación.
+
+
+
+
Opción A — Por enlace
+
El cliente pega la URL del producto. El sistema extrae nombre, precio, peso e imagen automáticamente desde Amazon SP-API.
+
+
+
Opción B — Manual
+
El cliente llena el formulario: nombre, descripción, valor ($USD), tienda, cantidad y peso estimado.
+
+
+
5
Registra formalmente su compra Elige entre ingresar por enlace (escaneo automático) o formulario manual.
+
+
6
El sistema calcula y muestra el costo total con desglose SENAE Flete + seguro 2% + FODINFA 0.5% + IVA 15% + Arancel según categoría (4×4, B, C, D).
+
+
7
El cliente revisa el desglose y ACEPTA Puede ver el detalle de cada concepto antes de confirmar.
+
+
8
Realiza el PAGO del envío en línea Pasarela de pagos integrada (Stripe / PayPhone / PayPal). El pago se registra y vincula al Tracking ID.
+
+
9
✅ Tracking ID generado. Confirmación por correo. Estado inicial: REGISTRADO . El cliente recibe notificaciones automáticas en cada cambio de estado.
+
+
10
Seguimiento en tiempo real Desde el portal (con login) o desde la landing page ingresando el Tracking ID sin necesidad de iniciar sesión. Notificaciones por WhatsApp, SMS y correo.
+
+
11
🎉 Recibe el paquete en Ecuador Estado final: ENTREGADO .
+
+
+
+
+
+
+
+
1
Inicia sesión en el Portal de Bodega Ve la lista de paquetes esperados. Los que tienen pre-alerta están ya identificados y organizados.
+
+
2
Llega un paquete físico a la bodega El operador escanea el código de barras / QR o busca manualmente por el tracking del vendedor.
+
+
3
Confirma recepción → Estado: RECIBIDO_BODEGA El sistema actualiza el estado y notifica automáticamente al cliente.
+
+
4
Verificación del paquete Pesa en báscula (peso real), mide dimensiones (largo × ancho × alto) y toma fotos que se sincronizan al portal del cliente.
+
+
+
+
✅ Sin discrepancia
+
El peso real coincide con el declarado (diferencia ≤ 10%). Estado cambia a VERIFICADO . Se asigna a despacho.
+
+
+
⚠️ Hay discrepancia (>10%)
+
Se notifica al Admin de la empresa y al cliente. Se cobra la diferencia o se ajusta el precio. Luego pasa a VERIFICADO.
+
+
+
+
5
Asigna a envío consolidado o individual El operador puede consolidar varios paquetes del mismo cliente en un solo envío para optimizar costos.
+
+
6
✅ Genera orden de despacho hacia Ecuador El paquete queda listo para ser recogido por el courier internacional (FedEx / DHL / UPS).
+
+
+
+
+
+
+
+
1
Accede al Portal Administrativo Ve la cola de paquetes con estado VERIFICADO pendientes de declaración.
+
+
2
Revisa la información del paquete Descripción del producto, valor declarado, fotos, peso y dimensiones confirmados por el operador de bodega.
+
+
+
+
✅ Dentro del límite 4×4
+
Valor ≤ $400 USD y peso ≤ 4 kg. Proceso simplificado (DSI) automático sin arancel.
+
+
+
⚠️ Supera el límite
+
Notificación al cliente. Se inicia proceso de importación formal (DAI) con la documentación correspondiente.
+
+
+
+
3
Sistema genera la DSI automáticamente Declaración Simplificada de Importación pre-llenada con los datos verificados del paquete.
+
+
4
El agente REVISA y APRUEBA la declaración Última verificación humana antes del envío electrónico a la SENAE.
+
+
5
El sistema envía la DSI al WebService oficial de la SENAE Comunicación vía SOAP / REST con el portal electrónico de la aduana ecuatoriana.
+
+
6
✅ SENAE devuelve número de autorización El documento aduanero se almacena asociado al Tracking ID. Estado: DECLARACION_ADUANERA . El cliente recibe notificación automática.
+
+
+
+
+
+
+
+
1
Inicia sesión en el Portal Administrativo Autenticación segura con MFA obligatorio.
+
+
2
Ve el dashboard general Paquetes por estado, ingresos del día/mes, alertas de incidencias y métricas de rendimiento.
+
+
3
Acciones disponibles desde el panel
+
+
+
+ Acción Descripción
+
+ Gestionar usuarios y roles Crear, editar, desactivar usuarios. Asignar roles.
+ Configurar tarifas Precio por libra/kg, por zona geográfica en Ecuador
+ Generar reportes Ingresos, volumen de envíos, tiempo promedio de entrega
+ Ver logs de auditoría Registro inmutable de todas las acciones del sistema
+ Gestionar bodega Configuración de la bodega, capacidad, horarios
+ Configurar notificaciones Plantillas de mensajes automáticos por canal
+
+
+
+
+
+
+
+
+
+
⚠️
+
Nota INEN: El calzado, textiles, electrónicos y otros productos regulados requieren certificación de conformidad INEN antes de poder importarlos en volumen a Ecuador. El sistema asiste en verificar este requisito.
+
+
+
1
Accede a la sección "Carga Pesada / Pallets" en la landing page Sección diferenciada del casillero personal, con su propio flujo y formulario.
+
+
2
Llena el formulario de cotización especial Tipo de mercancía, cantidad, peso estimado, número de pallets, valor comercial total, ciudad de origen en EE.UU.
+
+
+
+
✅ Sin requisito INEN
+
Mercancía sin regulación técnica. Proceso de cotización directo.
+
+
+
⚠️ Requiere INEN
+
El importador debe obtener el Registro de Conformidad INEN antes de proceder.
+
+
+
+
3
El equipo Moraworld prepara la cotización personalizada La envía por correo y por WhatsApp al importador.
+
+
4
El importador acepta la cotización Se crea un expediente con ID de seguimiento B2B propio.
+
+
5
✅ Coordinación de embarque y documentación DAS o DAI según corresponda. Certificación INEN, BL de embarque, facturas comerciales. Seguimiento hasta entrega en Ecuador.
+
+
+
+
+
+
+
+
1
Cliente pega la URL del producto en el portal Soporta Amazon, eBay y otras plataformas compatibles.
+
+
2
Sistema llama a Amazon SP-API (o scraping equivalente) Extrae: nombre del producto, precio, peso estimado, imagen y dimensiones si están disponibles.
+
+
3
Pre-llena el formulario de registro automáticamente El cliente revisa los datos extraídos y puede corregir si es necesario.
+
+
4
Sistema calcula el costo total con desglose Flete (peso × $3.50/lb) + Seguro 2% + FODINFA 0.5% + Arancel según categoría + IVA 15%.
+
+
5
Muestra resumen al cliente para confirmación y pago El cliente ACEPTA el costo y realiza el pago en línea.
+
+
6
✅ Tracking ID generado. Estado → REGISTRADO. Correo de confirmación enviado automáticamente.
+
+
+
+
+
+
+
+
ℹ️
+
La calculadora está disponible sin necesidad de registro en la landing page y también dentro del portal del cliente autenticado.
+
+
Categorías SENAE
+
+
+
Régimen 4×4
+
0%
+
Hasta 4 envíos/año · máx. $400 · máx. 4 kg · Sin arancel · Proceso simplificado
+
+
+
Categoría B
+
10%
+
Bienes de consumo general fuera del 4×4 · + FODINFA + IVA
+
+
+
Categoría C
+
20%
+
Textiles, calzado, artículos del hogar · + FODINFA + IVA
+
+
+
Categoría D
+
0–15%
+
Electrónicos y telecomunicaciones · Puede requerir certificación INEN
+
+
+
Fórmulas de Cálculo
+
// 1. Determinar el peso a cobrar
+Peso_volumétrico = (largo_cm × ancho_cm × alto_cm) / 139
+Peso_final = MAX(peso_real_lbs, Peso_volumétrico )
+
+// 2. Calcular costos de envío y tributos
+Flete = Peso_final × $3.50 // tarifa por libra (configurable)
+Seguro = valor_declarado × 0.02 // 2% configurable
+FODINFA = valor_declarado × 0.005 // 0.5% — fijo SENAE
+Arancel = valor_declarado × % categoría // 0%, 10% o 20%
+IVA = (valor_declarado + FODINFA + Arancel) × 0.15
+
+// 3. Total a pagar
+TOTAL = Flete + Seguro + FODINFA + Arancel + IVA
+
* El sistema muestra el desglose completo de cada concepto al cliente antes de que confirme el pago. El costo final se ajusta si el peso real en bodega difiere del estimado.
+
+
+
+
+
+
+
1
Cambio de estado del paquete en base de datos Cualquier actualización de estado (por operador, agente o sistema automático) dispara el evento.
+
+
2
El sistema detecta el evento y activa el motor de notificaciones Procesamiento en cola (message queue) para garantizar entrega.
+
+
3
Envío paralelo a todos los canales activos del usuario
+
+
+
+ Canal Contenido Proveedor
+
+ ✉️ Correo electrónico Detalle completo: estado, tracking ID, descripción, fecha SendGrid / AWS SES
+ 💬 WhatsApp Business Mensaje directo: "Tu paquete EC-XXXXX está [estado]" WhatsApp Business API
+ 📱 SMS Resumen corto en 160 caracteres SMS Gateway API
+ 🔔 Push (portal web) Notificación en tiempo real en el dashboard del cliente WebSockets / SSE
+
+
+
+
+
+
+
+
+
+
1
Cualquier acción en el sistema Inicio de sesión, modificación de datos, cambio de estado, consulta de paquete, etc.
+
+
2
Se registra en el Log de Auditoría Campos: ID del usuario · Rol · Acción realizada · Timestamp (UTC) · IP de origen · Recurso afectado (ej: Tracking ID).
+
+
3
Log inmutable — no editable ni por Super Admin Almacenado en un sistema de append-only con firma de integridad.
+
+
4
Reportes disponibles para Super Admin y Admin Empresa Filtros por usuario, rango de fechas, tipo de acción y recurso afectado.
+
+
5
⚡ Alertas automáticas de seguridad
+
+
+
+ Múltiples intentos de login fallidos (brute force)
+ Acceso desde IPs inusuales (geolocalización fuera del perfil habitual)
+ Cambios masivos de datos en poco tiempo
+ Acceso a recursos fuera del horario habitual del usuario
+
+
+
+
+
+
+
+
+
🛒 Amazon SP-API REST API Extrae datos del producto desde una URL: nombre, precio, peso, imagen
+
🛃 WebService SENAE SOAP / REST Envío electrónico de DSI (simplificada) y DAI (formal) a la aduana ecuatoriana
+
💳 Pasarela de Pagos REST API Cobro en línea: Stripe, PayPhone, PayPal u otra pasarela ecuatoriana
+
💬 WhatsApp Business API REST API Notificaciones automáticas al cliente + botón de contacto flotante en la web
+
✉️ Correo (SendGrid/SES) SMTP / REST Notificaciones de estado, confirmaciones de pago y registro
+
📱 SMS Gateway REST API Notificaciones SMS de cambio de estado del paquete
+
🚚 Courier Internacional REST API FedEx / DHL / UPS: seguimiento del estado físico del envío en tránsito
+
🏭 Software de Bodega REST API propia Sincronización en tiempo real de estados de tracking con el software propietario de bodega
+
🏷️ Normas INEN REST / Web Consulta y verificación de certificaciones de conformidad para productos regulados
+
+
+
+
+
+
+
+
Disponibilidad
99.9% uptime (SLA garantizado en producción)
+
Tiempo respuesta
< 2 segundos para operaciones normales en el portal
+
Escalabilidad
Arquitectura multi-tenant preparada para múltiples empresas y miles de usuarios concurrentes
+
Seguridad
ISO/IEC 27001 · OWASP Top 10 · TLS 1.3 · AES-256 · MFA obligatorio · WAF
+
Accesibilidad
100% web · responsive mobile-first · accesible desde cualquier dispositivo con internet
+
Respaldo
Backups automáticos diarios · retención mínima 90 días · almacenamiento geográficamente redundante
+
Recuperación
RTO < 4 horas · RPO < 1 hora
+
Auditoría
Todos los eventos registrados con trazabilidad completa e inmutable
+
Multi-idioma
Español (clientes Ecuador) · Inglés (operadores bodega NJ)
+
Zona horaria
EST (New Jersey) y ECT (Ecuador) — mostrado según la ubicación del usuario en sesión
+
+
+
+
+
+
+
+
+
Área Pública
+
/
+/como-funciona
+/calculadora
+/tarifas
+/quienes-somos
+/tracking
+
+/casillero/
+ como-usar
+ calculadora
+ registro
+
+/carga-pesada/
+ como-funciona
+ cotizacion
+ inen
+
+
+
Área Autenticada
+
/portal/
+ dashboard
+ mi-casillero
+ pre-alerta
+ mis-paquetes
+ calculadora
+ perfil
+
+/admin/
+ usuarios
+ tarifas
+ reportes
+ auditoria
+
+/bodega/
+ paquetes
+ verificacion
+ despacho
+
+
+
+
+
+
+
+
🛡️ Protección de datos: Los datos personales de clientes ecuatorianos están sujetos a la Ley Orgánica de Protección de Datos Personales (LOPDP) de Ecuador . Al procesarse en EE.UU., también aplica la normativa del estado de New Jersey.
+
⚠️ Umbral aduanero 4×4: El régimen simplificado aplica a un máximo de 4 envíos al año , con valor máximo de $400 USD y peso máximo de 4 kg por envío. Superar cualquiera de estos límites activa el proceso de importación formal (DAI) con aranceles correspondientes.
+
🏷️ Normas INEN: Para carga pesada (calzado, textiles, electrónicos, alimentos), el importador debe verificar si el producto requiere Registro de Conformidad o Certificado INEN antes de embarcar. El sistema asiste en este proceso.
+
📦 Consolidación: El sistema soporta consolidar múltiples paquetes de un mismo cliente en un solo envío para optimizar costos de flete y reducir el número de declaraciones aduaneras.
+
+ Aspecto Detalle
+
+ Legalidad visible El sitio muestra prominentemente ambas empresas con sus documentos de constitución
+ WhatsApp contacto Dos opciones: representante NJ (operaciones) y representante legal en Cuenca (aduana)
+ API de bodega propia El sistema tendrá una capa de integración para conectarse al software propietario de gestión
+ Actualización de tarifas La calculadora debe actualizarse cuando el SENAE modifique las tablas arancelarias
+ Multi-idioma Español para clientes Ecuador · Inglés para operadores en New Jersey
+ Zona horaria EST (bodega NJ) y ECT (Ecuador) — el sistema muestra la hora del usuario en sesión
+
+
+
+
+
Moraworld Imports S.A.S. · Mora Global Import LLC
+
Documento de Requerimientos v1.1 · 6 de mayo de 2026
+
+ ISO/IEC 27001
+ SENAE Autorizado
+ INEN
+ LOPDP Ecuador
+ Multi-Tenant
+
+
+
+
+
+
+
+
+
+
diff --git a/index (1).html b/index (1).html
new file mode 100644
index 0000000..8bca207
--- /dev/null
+++ b/index (1).html
@@ -0,0 +1,1391 @@
+
+
+
+
+
+
+ Moraworld Imports — Casillero en EE.UU. para Ecuador
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Empresa legalmente constituida en Ecuador y EE.UU.
+
+
Tu casillero en New Jersey. Enviamos a Ecuador.
+
Compra en Amazon, eBay, Walmart y más. Usa tu Suite personal en nuestra bodega de NJ. Nosotros gestionamos el envío y la aduana ecuatoriana por ti.
+
+
+
+
150 N
+
Day St, Orange NJ
+
+
+
24/7
+
Tracking en línea
+
+
+
100%
+
Declaración SENAE
+
+
+
+
+
+
📦 Tu dirección en EE.UU.
+
+
Una vez registrado, tu casillero será:
+
150 N Day St,
+
Suite EC-XXXXX,
+
City of Orange, NJ 07050
+
United States 🇺🇸
+
+
+
+
1
+
Regístrate y obtén tu dirección Suite personalizada
+
+
+
2
+
Compra en cualquier tienda online usando esa dirección
+
+
+
3
+
Nosotros recibimos, verificamos y enviamos a Ecuador
+
+
+
4
+
Declaración aduanera SENAE incluida — sin sorpresas
+
+
+
+
+
+
+
+
+
+
+
+
+
Nuestros Servicios
+
Dos soluciones para importar desde EE.UU.
+
Tanto si compras para uso personal como si importas al por mayor, tenemos el servicio adecuado.
+
+
+
+
📦
+
Casillero Personal (B2C)
+
Para compras individuales en Amazon, eBay, Walmart y otras tiendas. Proceso 100% automatizado.
+
+ Dirección Suite personalizada en NJ
+ Pre-alerta y carga de facturas
+ Calculadora de costos con categorías SENAE
+ Fotos del paquete en bodega
+ Tracking en tiempo real con ID único
+ Declaración aduanera incluida
+ Notificaciones por WhatsApp, correo y SMS
+
+
Abrir casillero gratis →
+
+
+
🏭
+
Carga Pesada / Pallets (B2B)
+
Para importadores mayoristas. Pallets, contenedores, carga a granel. Gestión de normas INEN.
+
+ Cotización personalizada
+ Manejo de pallets y contenedores
+ Certificación y cumplimiento INEN
+ Declaración de importación formal (DAI)
+ Asesoría en partidas arancelarias
+ Expediente dedicado con seguimiento B2B
+
+
Solicitar cotización →
+
+
+
+
+
+
+
+
+
+
Proceso
+
Así de simple. 4 pasos.
+
Desde tu compra hasta la puerta de tu casa en Ecuador, lo manejamos todo.
+
+
+
+
1
+
Regístrate
+
Crea tu cuenta y obtén tu Suite exclusiva en New Jersey al instante.
+
+
+
2
+
Compra en EE.UU.
+
Usa tu dirección Suite en cualquier tienda online como Amazon, eBay o Walmart.
+
+
+
3
+
Recibimos en NJ
+
Tu paquete llega a nuestra bodega. Lo verificamos, fotografiamos y preparamos.
+
+
+
4
+
Te llega a Ecuador
+
Enviamos con declaración SENAE incluida. Sigues todo con tu Tracking ID.
+
+
+
+
+
+
+
+
+
+
Calculadora de Envío
+
Calcula tu costo ahora mismo
+
Sin registro. Ingresa el peso y valor de tu producto y obtén el desglose completo con impuestos SENAE.
+
+
+
+
📊 Datos de tu envío
+
+ Peso del producto (lbs)
+
+
+
+
+
+ Categoría del producto
+
+ 4x4 — Hasta $400, hasta 4 kg (sin arancel)
+ Categoría B — Bienes de consumo general (10%)
+ Categoría C — Textiles, calzado, hogar (20%)
+ Categoría D — Electrónicos, telecomunicaciones (10%)
+
+
+
Calcular costo total →
+
+
+
Categorías SENAE
+
+ 4x4
+ Régimen simplificado: hasta 4 envíos/año, máx. $400 y 4 kg. Sin arancel.
+
+
+ Cat. B
+ Bienes de consumo general fuera del 4x4. Arancel 10% + FODINFA + IVA.
+
+
+ Cat. C
+ Textiles, calzado, artículos del hogar. Arancel 20% + FODINFA + IVA.
+
+
+ Cat. D
+ Electrónicos y telecomunicaciones. Arancel 0–15% + puede requerir INEN.
+
+
+
+
+
+
💰 Desglose de costos
+
+ Peso a cobrar
+ — lbs
+
+
+ Costo de flete
+ $0.00
+
+
+ Seguro (2%)
+ $0.00
+
+
+ FODINFA (0.5%)
+ $0.00
+
+
+ Arancel
+ $0.00
+
+
+ IVA (15%)
+ $0.00
+
+
+ TOTAL ESTIMADO
+ $0.00
+
+
+ * Estimado referencial. El costo final se confirma cuando el paquete es pesado en bodega. Tarifa de flete: $3.50/lb.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Tracking en Tiempo Real
+
Sigue tu paquete en cada paso
+
Cada envío recibe un ID de Tracking único. Recibe notificaciones automáticas en cada cambio de estado.
+
+
+ Notificaciones automáticas por correo , SMS y WhatsApp en cada cambio de estado.
+
+
+
+
+
+
+
+
+
+
+
+
Pre-alerta de Paquetes
+
Avísanos antes de que llegue tu paquete
+
Carga tu factura y el tracking del vendedor. La bodega se prepara para recibirlo y agilizamos el proceso.
+
+
+
📄
+
+ Sube tu factura comercial
+ Factura de Amazon, eBay u otras tiendas en PDF o imagen
+
+
+
+
🔗
+
+ Ingresa el tracking del vendedor
+ El número de guía que te dio la tienda (UPS, FedEx, USPS)
+
+
+
+
⚡
+
+ Proceso más rápido en bodega
+ El operador ya sabe que tu paquete viene y lo asigna a tu Suite automáticamente
+
+
+
+
📸
+
+ Fotos de tu paquete
+ Cuando llega a la bodega, recibirás fotos del estado del paquete
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Confianza y Legalidad
+
Empresas legalmente constituidas en Ecuador y EE.UU.
+
Tu mercancía está en manos de un operador reconocido, con representación legal en ambos países.
+
+
+
+
🇪🇨
+
+
Moraworld Imports S.A.S.
+
Empresa constituida bajo las leyes de Ecuador. Representante legal en Cuenca. RUC registrado, permisos aduaneros activos ante la SENAE.
+
RUC Ecuador · SENAE · Cuenca
+
+
+
+
🇺🇸
+
+
Mora Global Import LLC
+
LLC registrada en el estado de New Jersey, EE.UU. Bodega operativa en 150 N Day St, City of Orange, NJ 07050.
+
LLC · New Jersey · NJ 07050
+
+
+
+
+
+
🏛️
+
Constituida legalmente
+
Empresa registrada en Ecuador (S.A.S.) y EE.UU. (LLC) con documentación vigente y representantes visibles en ambos países.
+
LEGALIDAD VERIFICADA
+
+
+
🛃
+
Certificación SENAE
+
Operamos con los permisos aduaneros requeridos por la SENAE. Emitimos Declaraciones Simplificadas (DSI) y Formales (DAI).
+
SENAE AUTORIZADO
+
+
+
🏷️
+
Normas INEN
+
Asesoría en cumplimiento de normas INEN para productos regulados: calzado, textiles, electrónicos, alimentos.
+
CUMPLIMIENTO INEN
+
+
+
🔒
+
Seguridad ISO 27001
+
Sistema desarrollado bajo el estándar ISO/IEC 27001. Tus datos y los de tus paquetes están protegidos con cifrado AES-256 y MFA.
+
ISO/IEC 27001
+
+
+
⚖️
+
Protección de datos
+
Cumplimos con la Ley Orgánica de Protección de Datos Personales (LOPDP) de Ecuador y la normativa aplicable de New Jersey.
+
LOPDP ECUADOR
+
+
+
📋
+
Transparencia tributaria
+
Calculamos y desglosamos automáticamente FODINFA, IVA y aranceles según la categoría SENAE de tu producto. Sin sorpresas.
+
TRANSPARENCIA TOTAL
+
+
+
+
+
+
+
+
+
+
+
Importación Mayorista
+
¿Importas al por mayor? Carga Pesada y Pallets
+
Desde 1,000 pares de zapatos hasta contenedores completos. Gestionamos toda la logística con cumplimiento INEN.
+
+
+
🚢
+
+ Carga en pallets y contenedores
+ Coordinamos el despacho desde cualquier ciudad de EE.UU. hacia Ecuador
+
+
+
+
🏷️
+
+ Certificación INEN incluida
+ Calzado, textiles, electrónicos: validamos el registro de conformidad antes de importar
+
+
+
+
📜
+
+ Declaración de importación formal (DAI)
+ Tramitamos la documentación aduanera completa ante la SENAE
+
+
+
+
💬
+
+ Asesoría personalizada en WhatsApp
+ Un agente especializado te acompaña en todo el proceso de importación
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
FAQ
+
Preguntas frecuentes
+
+
+
+
+ ¿Cómo obtengo mi dirección de casillero?
+ ▼
+
+
+
Al crear tu cuenta en Moraworld Imports, el sistema te asigna automáticamente una Suite personalizada en nuestra bodega: 150 N Day St, Suite EC-XXXXX, City of Orange, NJ 07050 . Solo debes usar esa dirección al hacer tus compras en línea.
+
+
+
+
+ ¿Cuánto cuesta el envío a Ecuador?
+ ▼
+
+
+
El costo depende del peso del paquete y la categoría del producto según el SENAE. Usa nuestra calculadora en línea para obtener un estimado. La tarifa base es de $3.50 por libra , más el seguro (2%) y los impuestos correspondientes (FODINFA 0.5%, IVA 15% y arancel según categoría).
+
+
+
+
+ ¿Qué es el régimen 4x4 de la SENAE?
+ ▼
+
+
+
El régimen 4x4 es un régimen simplificado de importación que permite importar hasta 4 paquetes por año , con un máximo de $400 USD y 4 kg por envío , sin pagar arancel. Si tu paquete supera esos límites, se aplica importación formal con la categoría correspondiente (B, C o D).
+
+
+
+
+ ¿Puedo importar calzado o ropa al por mayor?
+ ▼
+
+
+
Sí, ofrecemos el servicio de Carga Pesada / Pallets (B2B) para importadores mayoristas. Para calzado y textiles es necesario cumplir con las normas INEN . Contáctanos para una cotización especial y te asesoramos en la documentación necesaria.
+
+
+
+
+ ¿Cómo sigo el estado de mi paquete?
+ ▼
+
+
+
Cada paquete recibe un Tracking ID único (formato EC-YYYYMMDD-XXXXXX). Puedes rastrearlo en la sección de tracking de esta página sin necesidad de iniciar sesión. También recibirás notificaciones automáticas por correo, SMS y WhatsApp en cada cambio de estado.
+
+
+
+
+ ¿Están registrados y son legales?
+ ▼
+
+
+
Sí. Operamos bajo dos empresas constituidas legalmente: Moraworld Imports S.A.S. (registrada en Ecuador con RUC y permisos SENAE vigentes, representante en Cuenca) y Mora Global Import LLC (registrada en New Jersey, EE.UU., con operaciones en 150 N Day St, City of Orange, NJ 07050).
+
+
+
+
+
+
+
+
+
+
¿Listo para comprar en EE.UU. y recibir en Ecuador?
+
Regístrate gratis y obtén tu Suite en New Jersey en menos de 2 minutos.
+
Abrir mi casillero gratis →
+
+
+
+
+
+
+
+
+
+ 💬
+
+
+
+
+
+
+
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..469af76
--- /dev/null
+++ b/index.html
@@ -0,0 +1,1391 @@
+
+
+
+
+
+
+ Moraworld Imports — Casillero en EE.UU. para Ecuador
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Empresa legalmente constituida en Ecuador y EE.UU.
+
+
Tu casillero en New Jersey. Enviamos a Ecuador.
+
Compra en Amazon, eBay, Walmart y más. Usa tu Suite personal en nuestra bodega de NJ. Nosotros gestionamos el envío y la aduana ecuatoriana por ti.
+
+
+
+
150 N
+
Day St, Orange NJ
+
+
+
24/7
+
Tracking en línea
+
+
+
100%
+
Declaración SENAE
+
+
+
+
+
+
📦 Tu dirección en EE.UU.
+
+
Una vez registrado, tu casillero será:
+
150 N Day St,
+
Suite EC-XXXXX,
+
City of Orange, NJ 07050
+
United States 🇺🇸
+
+
+
+
1
+
Regístrate y obtén tu dirección Suite personalizada
+
+
+
2
+
Compra en cualquier tienda online usando esa dirección
+
+
+
3
+
Nosotros recibimos, verificamos y enviamos a Ecuador
+
+
+
4
+
Declaración aduanera SENAE incluida — sin sorpresas
+
+
+
+
+
+
+
+
+
+
+
+
+
Nuestros Servicios
+
Dos soluciones para importar desde EE.UU.
+
Tanto si compras para uso personal como si importas al por mayor, tenemos el servicio adecuado.
+
+
+
+
📦
+
Casillero Personal (B2C)
+
Para compras individuales en Amazon, eBay, Walmart y otras tiendas. Proceso 100% automatizado.
+
+ Dirección Suite personalizada en NJ
+ Pre-alerta y carga de facturas
+ Calculadora de costos con categorías SENAE
+ Fotos del paquete en bodega
+ Tracking en tiempo real con ID único
+ Declaración aduanera incluida
+ Notificaciones por WhatsApp, correo y SMS
+
+
Abrir casillero gratis →
+
+
+
🏭
+
Carga Pesada / Pallets (B2B)
+
Para importadores mayoristas. Pallets, contenedores, carga a granel. Gestión de normas INEN.
+
+ Cotización personalizada
+ Manejo de pallets y contenedores
+ Certificación y cumplimiento INEN
+ Declaración de importación formal (DAI)
+ Asesoría en partidas arancelarias
+ Expediente dedicado con seguimiento B2B
+
+
Solicitar cotización →
+
+
+
+
+
+
+
+
+
+
Proceso
+
Así de simple. 4 pasos.
+
Desde tu compra hasta la puerta de tu casa en Ecuador, lo manejamos todo.
+
+
+
+
1
+
Regístrate
+
Crea tu cuenta y obtén tu Suite exclusiva en New Jersey al instante.
+
+
+
2
+
Compra en EE.UU.
+
Usa tu dirección Suite en cualquier tienda online como Amazon, eBay o Walmart.
+
+
+
3
+
Recibimos en NJ
+
Tu paquete llega a nuestra bodega. Lo verificamos, fotografiamos y preparamos.
+
+
+
4
+
Te llega a Ecuador
+
Enviamos con declaración SENAE incluida. Sigues todo con tu Tracking ID.
+
+
+
+
+
+
+
+
+
+
Calculadora de Envío
+
Calcula tu costo ahora mismo
+
Sin registro. Ingresa el peso y valor de tu producto y obtén el desglose completo con impuestos SENAE.
+
+
+
+
📊 Datos de tu envío
+
+ Peso del producto (lbs)
+
+
+
+
+
+ Categoría del producto
+
+ 4x4 — Hasta $400, hasta 4 kg (sin arancel)
+ Categoría B — Bienes de consumo general (10%)
+ Categoría C — Textiles, calzado, hogar (20%)
+ Categoría D — Electrónicos, telecomunicaciones (10%)
+
+
+
Calcular costo total →
+
+
+
Categorías SENAE
+
+ 4x4
+ Régimen simplificado: hasta 4 envíos/año, máx. $400 y 4 kg. Sin arancel.
+
+
+ Cat. B
+ Bienes de consumo general fuera del 4x4. Arancel 10% + FODINFA + IVA.
+
+
+ Cat. C
+ Textiles, calzado, artículos del hogar. Arancel 20% + FODINFA + IVA.
+
+
+ Cat. D
+ Electrónicos y telecomunicaciones. Arancel 0–15% + puede requerir INEN.
+
+
+
+
+
+
💰 Desglose de costos
+
+ Peso a cobrar
+ — lbs
+
+
+ Costo de flete
+ $0.00
+
+
+ Seguro (2%)
+ $0.00
+
+
+ FODINFA (0.5%)
+ $0.00
+
+
+ Arancel
+ $0.00
+
+
+ IVA (15%)
+ $0.00
+
+
+ TOTAL ESTIMADO
+ $0.00
+
+
+ * Estimado referencial. El costo final se confirma cuando el paquete es pesado en bodega. Tarifa de flete: $3.50/lb.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Tracking en Tiempo Real
+
Sigue tu paquete en cada paso
+
Cada envío recibe un ID de Tracking único. Recibe notificaciones automáticas en cada cambio de estado.
+
+
+ Notificaciones automáticas por correo , SMS y WhatsApp en cada cambio de estado.
+
+
+
+
+
+
+
+
+
+
+
+
Pre-alerta de Paquetes
+
Avísanos antes de que llegue tu paquete
+
Carga tu factura y el tracking del vendedor. La bodega se prepara para recibirlo y agilizamos el proceso.
+
+
+
📄
+
+ Sube tu factura comercial
+ Factura de Amazon, eBay u otras tiendas en PDF o imagen
+
+
+
+
🔗
+
+ Ingresa el tracking del vendedor
+ El número de guía que te dio la tienda (UPS, FedEx, USPS)
+
+
+
+
⚡
+
+ Proceso más rápido en bodega
+ El operador ya sabe que tu paquete viene y lo asigna a tu Suite automáticamente
+
+
+
+
📸
+
+ Fotos de tu paquete
+ Cuando llega a la bodega, recibirás fotos del estado del paquete
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Confianza y Legalidad
+
Empresas legalmente constituidas en Ecuador y EE.UU.
+
Tu mercancía está en manos de un operador reconocido, con representación legal en ambos países.
+
+
+
+
🇪🇨
+
+
Moraworld Imports S.A.S.
+
Empresa constituida bajo las leyes de Ecuador. Representante legal en Cuenca. RUC registrado, permisos aduaneros activos ante la SENAE.
+
RUC Ecuador · SENAE · Cuenca
+
+
+
+
🇺🇸
+
+
Mora Global Import LLC
+
LLC registrada en el estado de New Jersey, EE.UU. Bodega operativa en 150 N Day St, City of Orange, NJ 07050.
+
LLC · New Jersey · NJ 07050
+
+
+
+
+
+
🏛️
+
Constituida legalmente
+
Empresa registrada en Ecuador (S.A.S.) y EE.UU. (LLC) con documentación vigente y representantes visibles en ambos países.
+
LEGALIDAD VERIFICADA
+
+
+
🛃
+
Certificación SENAE
+
Operamos con los permisos aduaneros requeridos por la SENAE. Emitimos Declaraciones Simplificadas (DSI) y Formales (DAI).
+
SENAE AUTORIZADO
+
+
+
🏷️
+
Normas INEN
+
Asesoría en cumplimiento de normas INEN para productos regulados: calzado, textiles, electrónicos, alimentos.
+
CUMPLIMIENTO INEN
+
+
+
🔒
+
Seguridad ISO 27001
+
Sistema desarrollado bajo el estándar ISO/IEC 27001. Tus datos y los de tus paquetes están protegidos con cifrado AES-256 y MFA.
+
ISO/IEC 27001
+
+
+
⚖️
+
Protección de datos
+
Cumplimos con la Ley Orgánica de Protección de Datos Personales (LOPDP) de Ecuador y la normativa aplicable de New Jersey.
+
LOPDP ECUADOR
+
+
+
📋
+
Transparencia tributaria
+
Calculamos y desglosamos automáticamente FODINFA, IVA y aranceles según la categoría SENAE de tu producto. Sin sorpresas.
+
TRANSPARENCIA TOTAL
+
+
+
+
+
+
+
+
+
+
+
Importación Mayorista
+
¿Importas al por mayor? Carga Pesada y Pallets
+
Desde 1,000 pares de zapatos hasta contenedores completos. Gestionamos toda la logística con cumplimiento INEN.
+
+
+
🚢
+
+ Carga en pallets y contenedores
+ Coordinamos el despacho desde cualquier ciudad de EE.UU. hacia Ecuador
+
+
+
+
🏷️
+
+ Certificación INEN incluida
+ Calzado, textiles, electrónicos: validamos el registro de conformidad antes de importar
+
+
+
+
📜
+
+ Declaración de importación formal (DAI)
+ Tramitamos la documentación aduanera completa ante la SENAE
+
+
+
+
💬
+
+ Asesoría personalizada en WhatsApp
+ Un agente especializado te acompaña en todo el proceso de importación
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
FAQ
+
Preguntas frecuentes
+
+
+
+
+ ¿Cómo obtengo mi dirección de casillero?
+ ▼
+
+
+
Al crear tu cuenta en Moraworld Imports, el sistema te asigna automáticamente una Suite personalizada en nuestra bodega: 150 N Day St, Suite EC-XXXXX, City of Orange, NJ 07050 . Solo debes usar esa dirección al hacer tus compras en línea.
+
+
+
+
+ ¿Cuánto cuesta el envío a Ecuador?
+ ▼
+
+
+
El costo depende del peso del paquete y la categoría del producto según el SENAE. Usa nuestra calculadora en línea para obtener un estimado. La tarifa base es de $3.50 por libra , más el seguro (2%) y los impuestos correspondientes (FODINFA 0.5%, IVA 15% y arancel según categoría).
+
+
+
+
+ ¿Qué es el régimen 4x4 de la SENAE?
+ ▼
+
+
+
El régimen 4x4 es un régimen simplificado de importación que permite importar hasta 4 paquetes por año , con un máximo de $400 USD y 4 kg por envío , sin pagar arancel. Si tu paquete supera esos límites, se aplica importación formal con la categoría correspondiente (B, C o D).
+
+
+
+
+ ¿Puedo importar calzado o ropa al por mayor?
+ ▼
+
+
+
Sí, ofrecemos el servicio de Carga Pesada / Pallets (B2B) para importadores mayoristas. Para calzado y textiles es necesario cumplir con las normas INEN . Contáctanos para una cotización especial y te asesoramos en la documentación necesaria.
+
+
+
+
+ ¿Cómo sigo el estado de mi paquete?
+ ▼
+
+
+
Cada paquete recibe un Tracking ID único (formato EC-YYYYMMDD-XXXXXX). Puedes rastrearlo en la sección de tracking de esta página sin necesidad de iniciar sesión. También recibirás notificaciones automáticas por correo, SMS y WhatsApp en cada cambio de estado.
+
+
+
+
+ ¿Están registrados y son legales?
+ ▼
+
+
+
Sí. Operamos bajo dos empresas constituidas legalmente: Moraworld Imports S.A.S. (registrada en Ecuador con RUC y permisos SENAE vigentes, representante en Cuenca) y Mora Global Import LLC (registrada en New Jersey, EE.UU., con operaciones en 150 N Day St, City of Orange, NJ 07050).
+
+
+
+
+
+
+
+
+
+
¿Listo para comprar en EE.UU. y recibir en Ecuador?
+
Regístrate gratis y obtén tu Suite en New Jersey en menos de 2 minutos.
+
Abrir mi casillero gratis →
+
+
+
+
+
+
+
+
+
+ 💬
+
+
+
+
+
+
+
diff --git a/login.html b/login.html
new file mode 100644
index 0000000..34e7490
--- /dev/null
+++ b/login.html
@@ -0,0 +1,294 @@
+
+
+
+
+
+ Iniciar sesión — Moraworld Imports
+
+
+
+
+
+
+ Moraworld. Imports
+ ← Volver al inicio
+
+
+
+
+
+
+
+
+ Sistema de Casillero Internacional
+
+
Tu puerta almercado americano
+
Gestiona tus compras en EE.UU., haz seguimiento en tiempo real y recibe en Ecuador con declaración SENAE incluida.
+
+
+
📦
+
+ Suite personalizada en NJ
+ 150 N Day St, City of Orange, NJ 07050
+
+
+
+
🔍
+
+ Tracking en tiempo real
+ 11 estados de seguimiento con notificaciones automáticas
+
+
+
+
🛃
+
+ Aduana incluida
+ Declaración simplificada SENAE gestionada automáticamente
+
+
+
+
🔒
+
+ Seguridad ISO/IEC 27001
+ MFA, cifrado AES-256 y protección de datos LOPDP
+
+
+
+
+
+
+
+
+
+
+
+
+ ⚠️
+ Correo o contraseña incorrectos.
+
+
+
+
+
Bienvenido de vuelta
+
¿No tienes cuenta? Crea la tuya gratis →
+
+
+
🔐
+
+ Autenticación segura
+ Este portal utiliza verificación en dos pasos (MFA) para proteger tu cuenta.
+
+
+
+
+ Correo electrónico
+
+
+
+
+
Iniciar sesión →
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..85f2bb2
--- /dev/null
+++ b/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "moraworld",
+ "private": true,
+ "version": "0.1.0",
+ "description": "Moraworld Imports — Casillero internacional EE.UU. → Ecuador",
+ "scripts": {
+ "dev": "turbo run dev",
+ "build": "turbo run build",
+ "lint": "turbo run lint",
+ "setup": "npm install -g pnpm@9.15.0 && pnpm install",
+ "db:generate": "pnpm --filter @moraworld/database generate",
+ "db:migrate": "pnpm --filter @moraworld/database migrate:dev",
+ "db:push": "pnpm --filter @moraworld/database push",
+ "db:studio": "pnpm --filter @moraworld/database studio",
+ "docker:up": "docker compose up -d",
+ "docker:down": "docker compose down",
+ "docker:logs": "docker compose logs -f"
+ },
+ "devDependencies": {
+ "turbo": "^2.5.4",
+ "typescript": "^5.8.3"
+ },
+ "packageManager": "pnpm@9.15.0",
+ "engines": {
+ "node": ">=20"
+ }
+}
diff --git a/packages/database/package.json b/packages/database/package.json
new file mode 100644
index 0000000..c2250ee
--- /dev/null
+++ b/packages/database/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "@moraworld/database",
+ "version": "0.1.0",
+ "private": true,
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.js"
+ }
+ },
+ "scripts": {
+ "build": "tsc",
+ "dev": "tsc --watch",
+ "generate": "prisma generate",
+ "migrate:dev": "prisma migrate dev",
+ "push": "prisma db push",
+ "studio": "prisma studio",
+ "seed": "tsx prisma/seed.ts"
+ },
+ "dependencies": {
+ "@prisma/client": "^6.8.2"
+ },
+ "devDependencies": {
+ "@types/node": "^22.15.21",
+ "prisma": "^6.8.2",
+ "tsx": "^4.19.4",
+ "typescript": "^5.8.3"
+ }
+}
diff --git a/packages/database/prisma/migrations/20260520120000_init/migration.sql b/packages/database/prisma/migrations/20260520120000_init/migration.sql
new file mode 100644
index 0000000..ae07c7b
--- /dev/null
+++ b/packages/database/prisma/migrations/20260520120000_init/migration.sql
@@ -0,0 +1,182 @@
+-- CreateEnum
+CREATE TYPE "UserRole" AS ENUM ('SUPER_ADMIN', 'ADMIN_EMPRESA', 'OPERADOR_BODEGA', 'AGENTE_ADUANERO', 'CLIENTE', 'SOPORTE');
+
+-- CreateEnum
+CREATE TYPE "PackageStatus" AS ENUM ('REGISTRADO', 'EN_TRANSITO_BODEGA', 'RECIBIDO_BODEGA', 'EN_VERIFICACION', 'VERIFICADO', 'DECLARACION_ADUANERA', 'EN_TRANSITO_ECUADOR', 'EN_ADUANA_ECUADOR', 'LISTO_ENTREGA', 'ENTREGADO', 'INCIDENCIA');
+
+-- CreateEnum
+CREATE TYPE "PreAlertStatus" AS ENUM ('PENDIENTE', 'VINCULADA', 'CANCELADA');
+
+-- CreateTable
+CREATE TABLE "Tenant" (
+ "id" TEXT NOT NULL,
+ "slug" TEXT NOT NULL,
+ "name" TEXT NOT NULL,
+ "isActive" BOOLEAN NOT NULL DEFAULT true,
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updatedAt" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "Tenant_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "User" (
+ "id" TEXT NOT NULL,
+ "tenantId" TEXT NOT NULL,
+ "email" TEXT NOT NULL,
+ "passwordHash" TEXT NOT NULL,
+ "firstName" TEXT NOT NULL,
+ "lastName" TEXT NOT NULL,
+ "phone" TEXT,
+ "role" "UserRole" NOT NULL DEFAULT 'CLIENTE',
+ "mfaEnabled" BOOLEAN NOT NULL DEFAULT false,
+ "mfaSecret" TEXT,
+ "isActive" BOOLEAN NOT NULL DEFAULT true,
+ "lastLoginAt" TIMESTAMP(3),
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updatedAt" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "User_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "Suite" (
+ "id" TEXT NOT NULL,
+ "tenantId" TEXT NOT NULL,
+ "userId" TEXT NOT NULL,
+ "code" TEXT NOT NULL,
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "Suite_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "Package" (
+ "id" TEXT NOT NULL,
+ "tenantId" TEXT NOT NULL,
+ "userId" TEXT NOT NULL,
+ "trackingId" TEXT NOT NULL,
+ "status" "PackageStatus" NOT NULL DEFAULT 'REGISTRADO',
+ "description" TEXT NOT NULL,
+ "store" TEXT,
+ "declaredValue" DECIMAL(10,2) NOT NULL,
+ "declaredWeight" DECIMAL(8,2),
+ "actualWeight" DECIMAL(8,2),
+ "vendorTracking" TEXT,
+ "productUrl" TEXT,
+ "paidAt" TIMESTAMP(3),
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updatedAt" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "Package_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "PackageStatusHistory" (
+ "id" TEXT NOT NULL,
+ "packageId" TEXT NOT NULL,
+ "status" "PackageStatus" NOT NULL,
+ "note" TEXT,
+ "createdBy" TEXT,
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "PackageStatusHistory_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "PreAlert" (
+ "id" TEXT NOT NULL,
+ "tenantId" TEXT NOT NULL,
+ "packageId" TEXT,
+ "store" TEXT NOT NULL,
+ "vendorTracking" TEXT,
+ "description" TEXT NOT NULL,
+ "declaredValue" DECIMAL(10,2) NOT NULL,
+ "invoiceKey" TEXT,
+ "status" "PreAlertStatus" NOT NULL DEFAULT 'PENDIENTE',
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updatedAt" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "PreAlert_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "AuditLog" (
+ "id" TEXT NOT NULL,
+ "tenantId" TEXT,
+ "userId" TEXT,
+ "action" TEXT NOT NULL,
+ "resource" TEXT,
+ "resourceId" TEXT,
+ "metadata" JSONB,
+ "ipAddress" TEXT,
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "AuditLog_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "Tenant_slug_key" ON "Tenant"("slug");
+
+-- CreateIndex
+CREATE INDEX "User_tenantId_idx" ON "User"("tenantId");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "User_tenantId_email_key" ON "User"("tenantId", "email");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "Suite_userId_key" ON "Suite"("userId");
+
+-- CreateIndex
+CREATE INDEX "Suite_tenantId_idx" ON "Suite"("tenantId");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "Suite_tenantId_code_key" ON "Suite"("tenantId", "code");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "Package_trackingId_key" ON "Package"("trackingId");
+
+-- CreateIndex
+CREATE INDEX "Package_tenantId_status_idx" ON "Package"("tenantId", "status");
+
+-- CreateIndex
+CREATE INDEX "Package_userId_idx" ON "Package"("userId");
+
+-- CreateIndex
+CREATE INDEX "PackageStatusHistory_packageId_idx" ON "PackageStatusHistory"("packageId");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "PreAlert_packageId_key" ON "PreAlert"("packageId");
+
+-- CreateIndex
+CREATE INDEX "PreAlert_tenantId_idx" ON "PreAlert"("tenantId");
+
+-- CreateIndex
+CREATE INDEX "AuditLog_tenantId_createdAt_idx" ON "AuditLog"("tenantId", "createdAt");
+
+-- CreateIndex
+CREATE INDEX "AuditLog_userId_idx" ON "AuditLog"("userId");
+
+-- AddForeignKey
+ALTER TABLE "User" ADD CONSTRAINT "User_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "Suite" ADD CONSTRAINT "Suite_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "Suite" ADD CONSTRAINT "Suite_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "Package" ADD CONSTRAINT "Package_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "Package" ADD CONSTRAINT "Package_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "PackageStatusHistory" ADD CONSTRAINT "PackageStatusHistory_packageId_fkey" FOREIGN KEY ("packageId") REFERENCES "Package"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "PreAlert" ADD CONSTRAINT "PreAlert_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "PreAlert" ADD CONSTRAINT "PreAlert_packageId_fkey" FOREIGN KEY ("packageId") REFERENCES "Package"("id") ON DELETE SET NULL ON UPDATE CASCADE;
diff --git a/packages/database/prisma/schema.prisma b/packages/database/prisma/schema.prisma
new file mode 100644
index 0000000..7c33240
--- /dev/null
+++ b/packages/database/prisma/schema.prisma
@@ -0,0 +1,179 @@
+// Moraworld Imports — Schema v0 (Fase 0–1)
+// Multi-tenant por tenant_id en todas las tablas de negocio
+
+generator client {
+ provider = "prisma-client-js"
+}
+
+datasource db {
+ provider = "postgresql"
+ url = env("DATABASE_URL")
+}
+
+// ─── Enums ───────────────────────────────────────────────────
+
+enum UserRole {
+ SUPER_ADMIN
+ ADMIN_EMPRESA
+ OPERADOR_BODEGA
+ AGENTE_ADUANERO
+ CLIENTE
+ SOPORTE
+}
+
+enum PackageStatus {
+ REGISTRADO
+ EN_TRANSITO_BODEGA
+ RECIBIDO_BODEGA
+ EN_VERIFICACION
+ VERIFICADO
+ DECLARACION_ADUANERA
+ EN_TRANSITO_ECUADOR
+ EN_ADUANA_ECUADOR
+ LISTO_ENTREGA
+ ENTREGADO
+ INCIDENCIA
+}
+
+enum PreAlertStatus {
+ PENDIENTE
+ VINCULADA
+ CANCELADA
+}
+
+// ─── Tenant (multi-tenant) ───────────────────────────────────
+
+model Tenant {
+ id String @id @default(cuid())
+ slug String @unique
+ name String
+ isActive Boolean @default(true)
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+
+ users User[]
+ suites Suite[]
+ packages Package[]
+ preAlerts PreAlert[]
+}
+
+// ─── Usuarios ────────────────────────────────────────────────
+
+model User {
+ id String @id @default(cuid())
+ tenantId String
+ email String
+ passwordHash String
+ firstName String
+ lastName String
+ phone String?
+ role UserRole @default(CLIENTE)
+ mfaEnabled Boolean @default(false)
+ mfaSecret String?
+ isActive Boolean @default(true)
+ lastLoginAt DateTime?
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+
+ tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
+ suite Suite?
+ packages Package[]
+
+ @@unique([tenantId, email])
+ @@index([tenantId])
+}
+
+// ─── Casillero / Suite ───────────────────────────────────────
+
+model Suite {
+ id String @id @default(cuid())
+ tenantId String
+ userId String @unique
+ code String // ej: EC-00345
+ createdAt DateTime @default(now())
+
+ tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+
+ @@unique([tenantId, code])
+ @@index([tenantId])
+}
+
+// ─── Paquetes ────────────────────────────────────────────────
+
+model Package {
+ id String @id @default(cuid())
+ tenantId String
+ userId String
+ trackingId String @unique // EC-YYYYMMDD-XXXXXX
+ status PackageStatus @default(REGISTRADO)
+ description String
+ store String?
+ declaredValue Decimal @db.Decimal(10, 2)
+ declaredWeight Decimal? @db.Decimal(8, 2)
+ actualWeight Decimal? @db.Decimal(8, 2)
+ vendorTracking String?
+ productUrl String?
+ paidAt DateTime?
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+
+ tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+ statusHistory PackageStatusHistory[]
+ preAlert PreAlert?
+
+ @@index([tenantId, status])
+ @@index([userId])
+}
+
+model PackageStatusHistory {
+ id String @id @default(cuid())
+ packageId String
+ status PackageStatus
+ note String?
+ createdBy String?
+ createdAt DateTime @default(now())
+
+ package Package @relation(fields: [packageId], references: [id], onDelete: Cascade)
+
+ @@index([packageId])
+}
+
+// ─── Pre-alertas ─────────────────────────────────────────────
+
+model PreAlert {
+ id String @id @default(cuid())
+ tenantId String
+ packageId String? @unique
+ store String
+ vendorTracking String?
+ description String
+ declaredValue Decimal @db.Decimal(10, 2)
+ invoiceKey String?
+ status PreAlertStatus @default(PENDIENTE)
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+
+ tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
+ package Package? @relation(fields: [packageId], references: [id])
+
+ @@index([tenantId])
+}
+
+// ─── Auditoría (append-only) ───────────────────────────────
+
+model AuditLog {
+ id String @id @default(cuid())
+ tenantId String?
+ userId String?
+ action String
+ resource String?
+ resourceId String?
+ metadata Json?
+ ipAddress String?
+ createdAt DateTime @default(now())
+
+ @@index([tenantId, createdAt])
+ @@index([userId])
+}
diff --git a/packages/database/prisma/seed.ts b/packages/database/prisma/seed.ts
new file mode 100644
index 0000000..9b20c89
--- /dev/null
+++ b/packages/database/prisma/seed.ts
@@ -0,0 +1,36 @@
+import { PrismaClient, UserRole } from "@prisma/client";
+
+const prisma = new PrismaClient();
+
+async function main() {
+ const tenant = await prisma.tenant.upsert({
+ where: { slug: "moraworld" },
+ update: {},
+ create: {
+ slug: "moraworld",
+ name: "Moraworld Imports",
+ },
+ });
+
+ console.log("✓ Tenant:", tenant.slug);
+
+ const suiteCode = "EC-00001";
+ const demoEmail = "demo@moraworld.test";
+
+ const existing = await prisma.user.findUnique({
+ where: { tenantId_email: { tenantId: tenant.id, email: demoEmail } },
+ });
+
+ if (!existing) {
+ console.log("ℹ Usuario demo se creará en Fase 1 (auth con bcrypt)");
+ }
+
+ console.log("✓ Seed completado");
+}
+
+main()
+ .catch((e) => {
+ console.error(e);
+ process.exit(1);
+ })
+ .finally(() => prisma.$disconnect());
diff --git a/packages/database/src/index.ts b/packages/database/src/index.ts
new file mode 100644
index 0000000..c3e942c
--- /dev/null
+++ b/packages/database/src/index.ts
@@ -0,0 +1,16 @@
+export { PrismaClient } from "@prisma/client";
+export * from "@prisma/client";
+
+import { PrismaClient } from "@prisma/client";
+
+const globalForPrisma = globalThis as unknown as { prisma: PrismaClient | undefined };
+
+export const prisma =
+ globalForPrisma.prisma ??
+ new PrismaClient({
+ log: process.env.NODE_ENV === "development" ? ["error", "warn"] : ["error"],
+ });
+
+if (process.env.NODE_ENV !== "production") {
+ globalForPrisma.prisma = prisma;
+}
diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json
new file mode 100644
index 0000000..442909d
--- /dev/null
+++ b/packages/database/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "module": "CommonJS",
+ "lib": ["ES2022"],
+ "declaration": true,
+ "outDir": "./dist",
+ "rootDir": "./src",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true
+ },
+ "include": ["src/**/*"]
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..8c351b7
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,3949 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ devDependencies:
+ turbo:
+ specifier: ^2.5.4
+ version: 2.9.14
+ typescript:
+ specifier: ^5.8.3
+ version: 5.9.3
+
+ apps/api:
+ dependencies:
+ '@moraworld/database':
+ specifier: workspace:*
+ version: link:../../packages/database
+ '@nestjs/common':
+ specifier: ^11.1.0
+ version: 11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/config':
+ specifier: ^4.0.2
+ version: 4.0.4(@nestjs/common@11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)
+ '@nestjs/core':
+ specifier: ^11.1.0
+ version: 11.1.21(@nestjs/common@11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.21)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/platform-express':
+ specifier: ^11.1.0
+ version: 11.1.21(@nestjs/common@11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)
+ reflect-metadata:
+ specifier: ^0.2.2
+ version: 0.2.2
+ rxjs:
+ specifier: ^7.8.2
+ version: 7.8.2
+ devDependencies:
+ '@nestjs/cli':
+ specifier: ^11.0.7
+ version: 11.0.21(@types/node@22.19.19)
+ '@nestjs/schematics':
+ specifier: ^11.0.5
+ version: 11.1.0(chokidar@4.0.3)(typescript@5.9.3)
+ '@types/express':
+ specifier: ^5.0.1
+ version: 5.0.6
+ '@types/node':
+ specifier: ^22.15.21
+ version: 22.19.19
+ typescript:
+ specifier: ^5.8.3
+ version: 5.9.3
+
+ apps/web:
+ dependencies:
+ next:
+ specifier: ^15.3.2
+ version: 15.5.18(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ react:
+ specifier: ^19.1.0
+ version: 19.2.6
+ react-dom:
+ specifier: ^19.1.0
+ version: 19.2.6(react@19.2.6)
+ devDependencies:
+ '@types/node':
+ specifier: ^22.15.21
+ version: 22.19.19
+ '@types/react':
+ specifier: ^19.1.4
+ version: 19.2.15
+ '@types/react-dom':
+ specifier: ^19.1.5
+ version: 19.2.3(@types/react@19.2.15)
+ typescript:
+ specifier: ^5.8.3
+ version: 5.9.3
+
+ packages/database:
+ dependencies:
+ '@prisma/client':
+ specifier: ^6.8.2
+ version: 6.19.3(prisma@6.19.3(typescript@5.9.3))(typescript@5.9.3)
+ devDependencies:
+ '@types/node':
+ specifier: ^22.15.21
+ version: 22.19.19
+ prisma:
+ specifier: ^6.8.2
+ version: 6.19.3(typescript@5.9.3)
+ tsx:
+ specifier: ^4.19.4
+ version: 4.22.3
+ typescript:
+ specifier: ^5.8.3
+ version: 5.9.3
+
+packages:
+
+ '@angular-devkit/core@19.2.24':
+ resolution: {integrity: sha512-Kd49warf6U/EyWe5BszF/eebN3zQ3bk7tgfEljAw8q/rX95UUtriJubWvp6pgzHfzBA4jwq8f+QiNZB8eBEXPA==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ peerDependencies:
+ chokidar: ^4.0.0
+ peerDependenciesMeta:
+ chokidar:
+ optional: true
+
+ '@angular-devkit/schematics-cli@19.2.24':
+ resolution: {integrity: sha512-bsStZQG67J1HBqTmWxtIcobvgrn32L4UOdL7hGyOru5VxDWPNA8pRnDYavT3hnJeBkJYPoQIw8u7Dm0ecoQprw==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ hasBin: true
+
+ '@angular-devkit/schematics@19.2.24':
+ resolution: {integrity: sha512-lnw+ZM1Io+cJAkReC0NPDjqObL8NtKzKIkdgEEKC8CUmkhurYhedbicN8Y8NYHgG1uLd2GozW3+/QqPRZaN+Lw==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+
+ '@babel/code-frame@7.29.0':
+ resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@borewit/text-codec@0.2.2':
+ resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==}
+
+ '@colors/colors@1.5.0':
+ resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
+ engines: {node: '>=0.1.90'}
+
+ '@emnapi/runtime@1.10.0':
+ resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==}
+
+ '@esbuild/aix-ppc64@0.28.0':
+ resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.28.0':
+ resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.28.0':
+ resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.28.0':
+ resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.28.0':
+ resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.28.0':
+ resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.28.0':
+ resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.28.0':
+ resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.28.0':
+ resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.28.0':
+ resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.28.0':
+ resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.28.0':
+ resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.28.0':
+ resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.28.0':
+ resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.28.0':
+ resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.28.0':
+ resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.28.0':
+ resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.28.0':
+ resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.28.0':
+ resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.28.0':
+ resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.28.0':
+ resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.28.0':
+ resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.28.0':
+ resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.28.0':
+ resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.28.0':
+ resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.28.0':
+ resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@img/colour@1.1.0':
+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
+ engines: {node: '>=18'}
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.34.5':
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linux-arm64@0.34.5':
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linux-arm@0.34.5':
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-linux-s390x@0.34.5':
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-linux-x64@0.34.5':
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-wasm32@0.34.5':
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-arm64@0.34.5':
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@img/sharp-win32-ia32@0.34.5':
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.34.5':
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@inquirer/ansi@1.0.2':
+ resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==}
+ engines: {node: '>=18'}
+
+ '@inquirer/checkbox@4.3.2':
+ resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/confirm@5.1.21':
+ resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/core@10.3.2':
+ resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/editor@4.2.23':
+ resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/expand@4.0.23':
+ resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/external-editor@1.0.3':
+ resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/figures@1.0.15':
+ resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==}
+ engines: {node: '>=18'}
+
+ '@inquirer/input@4.3.1':
+ resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/number@3.0.23':
+ resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/password@4.0.23':
+ resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/prompts@7.10.1':
+ resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/prompts@7.3.2':
+ resolution: {integrity: sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/rawlist@4.1.11':
+ resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/search@3.2.2':
+ resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/select@4.4.2':
+ resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/type@3.0.10':
+ resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@lukeed/csprng@1.1.0':
+ resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==}
+ engines: {node: '>=8'}
+
+ '@nestjs/cli@11.0.21':
+ resolution: {integrity: sha512-F8mV0Sj/zVEouzR3NxBuJy08YHTUOmC5Xdcx3qIIaJWzrm8Vw86CHkhkaPBJ5ewRMHPDCShPmhsfwhpCcjts3A==}
+ engines: {node: '>= 20.11'}
+ hasBin: true
+ peerDependencies:
+ '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0
+ '@swc/core': ^1.3.62
+ peerDependenciesMeta:
+ '@swc/cli':
+ optional: true
+ '@swc/core':
+ optional: true
+
+ '@nestjs/common@11.1.21':
+ resolution: {integrity: sha512-YV1HYDGsm2rnR0vrLKidtrG6jYX5yqiIjeur1j8++dKGqhhsJ6cjMs0RfQRSTUH7IjgDemA59/znQ8nRrE0D9g==}
+ peerDependencies:
+ class-transformer: '>=0.4.1'
+ class-validator: '>=0.13.2'
+ reflect-metadata: ^0.1.12 || ^0.2.0
+ rxjs: ^7.1.0
+ peerDependenciesMeta:
+ class-transformer:
+ optional: true
+ class-validator:
+ optional: true
+
+ '@nestjs/config@4.0.4':
+ resolution: {integrity: sha512-CJPjNitr0bAufSEnRe2N+JbnVmMmDoo6hvKCPzXgZoGwJSmp/dZPk9f/RMbuD/+Q1ZJPjwsRpq0vxna++Knwow==}
+ peerDependencies:
+ '@nestjs/common': ^10.0.0 || ^11.0.0
+ rxjs: ^7.1.0
+
+ '@nestjs/core@11.1.21':
+ resolution: {integrity: sha512-fqo0BHgny3MOuAL8GSfG3ZUKFVVBaBQD/0iyibnwTONT5vPexjQxJzu+945iloVvBDmrnAaRWxC1gqCDEs/AXQ==}
+ engines: {node: '>= 20'}
+ peerDependencies:
+ '@nestjs/common': ^11.0.0
+ '@nestjs/microservices': ^11.0.0
+ '@nestjs/platform-express': ^11.0.0
+ '@nestjs/websockets': ^11.0.0
+ reflect-metadata: ^0.1.12 || ^0.2.0
+ rxjs: ^7.1.0
+ peerDependenciesMeta:
+ '@nestjs/microservices':
+ optional: true
+ '@nestjs/platform-express':
+ optional: true
+ '@nestjs/websockets':
+ optional: true
+
+ '@nestjs/platform-express@11.1.21':
+ resolution: {integrity: sha512-lA3ViycOnz4Df3EstIKpuAVFhqxQixTnjAVk0M+LRyNBlGM6VSCaNJaAIrb9Pcry39T4hTHpNVbRqGLSvhL8gA==}
+ peerDependencies:
+ '@nestjs/common': ^11.0.0
+ '@nestjs/core': ^11.0.0
+
+ '@nestjs/schematics@11.1.0':
+ resolution: {integrity: sha512-lVxGZ46tcdItFMoXr6vyKWlnOsm1SZm/GUqAEDvy2RL4Q4O+3bkziAhrO7Y8JLssFUUvNFEGqAizI52WAxhjDw==}
+ peerDependencies:
+ prettier: ^3.0.0
+ typescript: '>=4.8.2'
+ peerDependenciesMeta:
+ prettier:
+ optional: true
+
+ '@next/env@15.5.18':
+ resolution: {integrity: sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==}
+
+ '@next/swc-darwin-arm64@15.5.18':
+ resolution: {integrity: sha512-w0WvQf1n+txiwns/9pwIQteCJpZTbxzO2SE0FLcwuD4v0WEh1JPOjdyxWL21XwJsdpx8cFRjyzxzCS/siP7HcQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@next/swc-darwin-x64@15.5.18':
+ resolution: {integrity: sha512-znn71QmDuxm+BOaglihMZfvyySMnNljkVIY5Z2TCssBmm+WqL6c19VhtH5ktFkHa8EZ2bnTUpcNcmNSQsg67og==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@next/swc-linux-arm64-gnu@15.5.18':
+ resolution: {integrity: sha512-yPPe5MNL+igZUa+OsqQJisqSfh6oarIuA1Q0BDxljGJhRQyZeP+WRHh7rs/jZUGMh5aY0YdIjXZG0VohkKkUdw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@next/swc-linux-arm64-musl@15.5.18':
+ resolution: {integrity: sha512-glaCczEWIrHsokFZ3pP08U4BpKxwIdnT+txdOM32OBgpL9Yw4aqx8NejmgtZQZOdstQ5f0L3CasIZudzCuD+nw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@next/swc-linux-x64-gnu@15.5.18':
+ resolution: {integrity: sha512-oUfg2EgJmU3R0OCOWiokGFUTvZiPfXtriXiuF3YNxRoROCdgvTedHIzYoeKH34gsZxS/V7mHbfq2hpAHwhH1/A==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@next/swc-linux-x64-musl@15.5.18':
+ resolution: {integrity: sha512-JLxSP3KTd9iu/bvUMQxH7RJo9xKSHf55/6RPE4a6FTSZygGn7uvZbCej0AHXydwkggQGSD9UddSjwv6Xz5ESfA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@next/swc-win32-arm64-msvc@15.5.18':
+ resolution: {integrity: sha512-ir1v7enP52K2HNz3tQQvwF+x7VNxBk1ciiZ18WBPvxf4C59IqdfmHPJYK3vH7rSxpuCVw/8C712wTXNAtEp+NA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@next/swc-win32-x64-msvc@15.5.18':
+ resolution: {integrity: sha512-LIu5me6QTANCd25E7I5uIEfvgQ06RK7tvHAbYo3zCb3VpxQEPvMcSpd87NwUABDT6MbGPdEGR5VRiK4PPTJhQg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@nuxt/opencollective@0.4.1':
+ resolution: {integrity: sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==}
+ engines: {node: ^14.18.0 || >=16.10.0, npm: '>=5.10.0'}
+ hasBin: true
+
+ '@prisma/client@6.19.3':
+ resolution: {integrity: sha512-mKq3jQFhjvko5LTJFHGilsuQs+W+T3Gm451NzuTDGQxwCzwXHYnIu2zGkRoW+Exq3Rob7yp2MfzSrdIiZVhrBg==}
+ engines: {node: '>=18.18'}
+ peerDependencies:
+ prisma: '*'
+ typescript: '>=5.1.0'
+ peerDependenciesMeta:
+ prisma:
+ optional: true
+ typescript:
+ optional: true
+
+ '@prisma/config@6.19.3':
+ resolution: {integrity: sha512-CBPT44BjlQxEt8kiMEauji2WHTDoVBOKl7UlewXmUgBPnr/oPRZC3psci5chJnYmH0ivEIog2OU9PGWoki3DLQ==}
+
+ '@prisma/debug@6.19.3':
+ resolution: {integrity: sha512-ljkJ+SgpXNktLG0Q/n4JGYCkKf0f8oYLyjImS2I8e2q2WCfdRRtWER062ZV/ixaNP2M2VKlWXVJiGzZaUgbKZw==}
+
+ '@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7':
+ resolution: {integrity: sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==}
+
+ '@prisma/engines@6.19.3':
+ resolution: {integrity: sha512-RSYxtlYFl5pJ8ZePgMv0lZ9IzVCOdTPOegrs2qcbAEFrBI1G33h6wyC9kjQvo0DnYEhEVY0X4LsuFHXLKQk88g==}
+
+ '@prisma/fetch-engine@6.19.3':
+ resolution: {integrity: sha512-tKtl/qco9Nt7LU5iKhpultD8O4vMCZcU2CHjNTnRrL1QvSUr5W/GcyFPjNL87GtRrwBc7ubXXD9xy4EvLvt8JA==}
+
+ '@prisma/get-platform@6.19.3':
+ resolution: {integrity: sha512-xFj1VcJ1N3MKooOQAGO0W5tsd0W2QzIvW7DD7c/8H14Zmp4jseeWAITm+w2LLoLrlhoHdPPh0NMZ8mfL6puoHA==}
+
+ '@standard-schema/spec@1.1.0':
+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+
+ '@swc/helpers@0.5.15':
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+
+ '@tokenizer/inflate@0.4.1':
+ resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==}
+ engines: {node: '>=18'}
+
+ '@tokenizer/token@0.3.0':
+ resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
+
+ '@turbo/darwin-64@2.9.14':
+ resolution: {integrity: sha512-t7QiPflaEyBE4oayeZtSmu4mEfjgIrcNlNNl1z1dmIVPqEdtA7+CfTf8d7KXsOGPh6aNgWjKxyvQg9uGfDQF+A==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@turbo/darwin-arm64@2.9.14':
+ resolution: {integrity: sha512-d23147mC9BsCPA9mJ0h/ubcpbRgcJBXbcG3+Vq7YLhjz3IXuvQsJ1UXH8f4MD76ZjJ4m/E4aRdJV+MW88CDfbw==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@turbo/linux-64@2.9.14':
+ resolution: {integrity: sha512-P3ZKB5tuUDdDQWuAsACGUR1qv9W7BNWxdxqVJ0kZNuNNPRaVYTPPikLcp79+GiEcW3npsR+KyP38lnQiBc5aSA==}
+ cpu: [x64]
+ os: [linux]
+
+ '@turbo/linux-arm64@2.9.14':
+ resolution: {integrity: sha512-ZRTlzcUMrrPv9ZuDzRF9n60Ym13bKeG9jDB8WjxyLhWNzV+AJQN+zdpIk3NJYf2zQsGUm1mNar2P0elRzLw25g==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@turbo/windows-64@2.9.14':
+ resolution: {integrity: sha512-exanwN6sIduZwykYeiTQj8kCmOhazP5WOz3bvXMcYtjhL6Z3iRWLewKrXCBq0bqwSP3iBMb/AerRCnHI4lx46A==}
+ cpu: [x64]
+ os: [win32]
+
+ '@turbo/windows-arm64@2.9.14':
+ resolution: {integrity: sha512-fVdCsnmYoKICsycbWuuGp6Jvi51/3G/UluFWuAUCvR8PIW5IJkAk5BM9UF8PSm0Q2IphWHFZjYEgjHsh3B9y/g==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@types/body-parser@1.19.6':
+ resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
+
+ '@types/connect@3.4.38':
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
+ '@types/eslint-scope@3.7.7':
+ resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
+
+ '@types/eslint@9.6.1':
+ resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
+
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+
+ '@types/express-serve-static-core@5.1.1':
+ resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==}
+
+ '@types/express@5.0.6':
+ resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==}
+
+ '@types/http-errors@2.0.5':
+ resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/node@22.19.19':
+ resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==}
+
+ '@types/qs@6.15.1':
+ resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==}
+
+ '@types/range-parser@1.2.7':
+ resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+
+ '@types/react-dom@19.2.3':
+ resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
+ peerDependencies:
+ '@types/react': ^19.2.0
+
+ '@types/react@19.2.15':
+ resolution: {integrity: sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==}
+
+ '@types/send@1.2.1':
+ resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==}
+
+ '@types/serve-static@2.2.0':
+ resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==}
+
+ '@webassemblyjs/ast@1.14.1':
+ resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2':
+ resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==}
+
+ '@webassemblyjs/helper-api-error@1.13.2':
+ resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==}
+
+ '@webassemblyjs/helper-buffer@1.14.1':
+ resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==}
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2':
+ resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==}
+
+ '@webassemblyjs/ieee754@1.13.2':
+ resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==}
+
+ '@webassemblyjs/leb128@1.13.2':
+ resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==}
+
+ '@webassemblyjs/utf8@1.13.2':
+ resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==}
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==}
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==}
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==}
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==}
+
+ '@xtuc/ieee754@1.2.0':
+ resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+ '@xtuc/long@4.2.2':
+ resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
+ accepts@2.0.0:
+ resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
+ engines: {node: '>= 0.6'}
+
+ acorn-import-phases@1.0.4:
+ resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==}
+ engines: {node: '>=10.13.0'}
+ peerDependencies:
+ acorn: ^8.14.0
+
+ acorn@8.16.0:
+ resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-keywords@3.5.2:
+ resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
+ peerDependencies:
+ ajv: ^6.9.1
+
+ ajv-keywords@5.1.0:
+ resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
+ peerDependencies:
+ ajv: ^8.8.2
+
+ ajv@6.15.0:
+ resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
+
+ ajv@8.18.0:
+ resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==}
+
+ ajv@8.20.0:
+ resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
+
+ ansi-colors@4.1.3:
+ resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+ engines: {node: '>=6'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansis@4.2.0:
+ resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==}
+ engines: {node: '>=14'}
+
+ append-field@1.0.0:
+ resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ array-timsort@1.0.3:
+ resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ balanced-match@4.0.4:
+ resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+ engines: {node: 18 || 20 || >=22}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ baseline-browser-mapping@2.10.31:
+ resolution: {integrity: sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+
+ body-parser@2.2.2:
+ resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==}
+ engines: {node: '>=18'}
+
+ brace-expansion@1.1.14:
+ resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==}
+
+ brace-expansion@5.0.6:
+ resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==}
+ engines: {node: 18 || 20 || >=22}
+
+ browserslist@4.28.2:
+ resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
+ busboy@1.6.0:
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+ engines: {node: '>=10.16.0'}
+
+ bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+
+ c12@3.1.0:
+ resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==}
+ peerDependencies:
+ magicast: ^0.3.5
+ peerDependenciesMeta:
+ magicast:
+ optional: true
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ caniuse-lite@1.0.30001793:
+ resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chardet@2.1.1:
+ resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==}
+
+ chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+ engines: {node: '>= 14.16.0'}
+
+ chrome-trace-event@1.0.4:
+ resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
+ engines: {node: '>=6.0'}
+
+ citty@0.1.6:
+ resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
+
+ citty@0.2.2:
+ resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==}
+
+ cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+
+ cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
+ cli-table3@0.6.5:
+ resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
+ engines: {node: 10.* || >= 12.*}
+
+ cli-width@4.1.0:
+ resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
+ engines: {node: '>= 12'}
+
+ client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+
+ clone@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+
+ comment-json@5.0.0:
+ resolution: {integrity: sha512-uiqLcOiVDJtBP8WGkZHEP+FZIhTzP1dxvn59EfoYUi9gqupjrBWVQkO2atDrbnKPwLeotFYDsuNb26uBMqB+hw==}
+ engines: {node: '>= 6'}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ concat-stream@2.0.0:
+ resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==}
+ engines: {'0': node >= 6.0}
+
+ confbox@0.2.4:
+ resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==}
+
+ consola@3.4.2:
+ resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
+ content-disposition@1.1.0:
+ resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==}
+ engines: {node: '>=18'}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ content-type@2.0.0:
+ resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==}
+ engines: {node: '>=18'}
+
+ cookie-signature@1.2.2:
+ resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
+ engines: {node: '>=6.6.0'}
+
+ cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+ engines: {node: '>= 0.6'}
+
+ cors@2.8.6:
+ resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==}
+ engines: {node: '>= 0.10'}
+
+ cosmiconfig@8.3.6:
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ deepmerge-ts@7.1.5:
+ resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==}
+ engines: {node: '>=16.0.0'}
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
+ defu@6.1.7:
+ resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==}
+
+ depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+
+ destr@2.0.5:
+ resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ dotenv-expand@12.0.3:
+ resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==}
+ engines: {node: '>=12'}
+
+ dotenv@16.6.1:
+ resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
+ engines: {node: '>=12'}
+
+ dotenv@17.4.1:
+ resolution: {integrity: sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw==}
+ engines: {node: '>=12'}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+ effect@3.21.0:
+ resolution: {integrity: sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==}
+
+ electron-to-chromium@1.5.360:
+ resolution: {integrity: sha512-GkcBt6YYAw9SxFWn+xVar4cLVGlXVuswwtRLBozi2zp0GjXs4ZnOrqV4zbXzg35n7w81hCkyJNYicgXlVHAmBA==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ empathic@2.0.0:
+ resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==}
+ engines: {node: '>=14'}
+
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
+ enhanced-resolve@5.21.5:
+ resolution: {integrity: sha512-mLCNbrQli11K1ySUmuNt4ZUB3OpGIDq4q2vTBTf5cL2lpsRjI9QKqSD0ndjW8FyvcW/Jj46gMe9syyHAsvMa/A==}
+ engines: {node: '>=10.13.0'}
+
+ error-ex@1.3.4:
+ resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-module-lexer@2.1.0:
+ resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.28.0:
+ resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ eslint-scope@5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ express@5.2.1:
+ resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}
+ engines: {node: '>= 18'}
+
+ exsolve@1.0.8:
+ resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==}
+
+ fast-check@3.23.2:
+ resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==}
+ engines: {node: '>=8.0.0'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-safe-stringify@2.1.1:
+ resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
+
+ fast-uri@3.1.2:
+ resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==}
+
+ file-type@21.3.4:
+ resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==}
+ engines: {node: '>=20'}
+
+ finalhandler@2.1.1:
+ resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==}
+ engines: {node: '>= 18.0.0'}
+
+ fork-ts-checker-webpack-plugin@9.1.0:
+ resolution: {integrity: sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==}
+ engines: {node: '>=14.21.3'}
+ peerDependencies:
+ typescript: '>3.6.0'
+ webpack: ^5.11.0
+
+ forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+
+ fresh@2.0.0:
+ resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
+ engines: {node: '>= 0.8'}
+
+ fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+
+ fs-monkey@1.1.0:
+ resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ giget@2.0.0:
+ resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==}
+ hasBin: true
+
+ glob-to-regexp@0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
+ glob@13.0.6:
+ resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==}
+ engines: {node: 18 || 20 || >=22}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.3:
+ resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==}
+ engines: {node: '>= 0.4'}
+
+ http-errors@2.0.1:
+ resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
+ engines: {node: '>= 0.8'}
+
+ iconv-lite@0.7.2:
+ resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+
+ is-promise@4.0.0:
+ resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
+
+ is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+
+ iterare@1.2.1:
+ resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==}
+ engines: {node: '>=6'}
+
+ jest-worker@27.5.1:
+ resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+ engines: {node: '>= 10.13.0'}
+
+ jiti@2.7.0:
+ resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
+ hasBin: true
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
+ hasBin: true
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonc-parser@3.3.1:
+ resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
+
+ jsonfile@6.2.1:
+ resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ load-esm@1.0.3:
+ resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==}
+ engines: {node: '>=13.2.0'}
+
+ loader-runner@4.3.2:
+ resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==}
+ engines: {node: '>=6.11.5'}
+
+ lodash@4.18.1:
+ resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==}
+
+ log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+
+ lru-cache@11.5.0:
+ resolution: {integrity: sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==}
+ engines: {node: 20 || >=22}
+
+ magic-string@0.30.17:
+ resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ media-typer@0.3.0:
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+ engines: {node: '>= 0.6'}
+
+ media-typer@1.1.0:
+ resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
+ engines: {node: '>= 0.8'}
+
+ memfs@3.5.3:
+ resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==}
+ engines: {node: '>= 4.0.0'}
+
+ merge-descriptors@2.0.0:
+ resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
+ engines: {node: '>=18'}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-db@1.54.0:
+ resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@3.0.2:
+ resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
+ engines: {node: '>=18'}
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ minimatch@10.2.5:
+ resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
+ engines: {node: 18 || 20 || >=22}
+
+ minimatch@3.1.5:
+ resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ minipass@7.1.3:
+ resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ multer@2.1.1:
+ resolution: {integrity: sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==}
+ engines: {node: '>= 10.16.0'}
+
+ mute-stream@2.0.0:
+ resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ nanoid@3.3.12:
+ resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ negotiator@1.0.0:
+ resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
+ engines: {node: '>= 0.6'}
+
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ next@15.5.18:
+ resolution: {integrity: sha512-eKL8zUJkX9Y5lE+RX/2YJoItVdGlIscyVyboeD9wSpp0PaGqjoA4tTpT2qPqz9ax+5IzGESyLSeZ/RCwbSZ2uQ==}
+ engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.51.1
+ babel-plugin-react-compiler: '*'
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
+ optional: true
+
+ node-abort-controller@3.1.1:
+ resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
+
+ node-emoji@1.11.0:
+ resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==}
+
+ node-fetch-native@1.6.7:
+ resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
+
+ node-releases@2.0.44:
+ resolution: {integrity: sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==}
+
+ nypm@0.6.6:
+ resolution: {integrity: sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ ohash@2.0.11:
+ resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
+
+ on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+
+ ora@5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
+ path-scurry@2.0.2:
+ resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==}
+ engines: {node: 18 || 20 || >=22}
+
+ path-to-regexp@8.4.2:
+ resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+ perfect-debounce@1.0.0:
+ resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@4.0.4:
+ resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
+ engines: {node: '>=12'}
+
+ pkg-types@2.3.1:
+ resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==}
+
+ pluralize@8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+
+ postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prisma@6.19.3:
+ resolution: {integrity: sha512-++ZJ0ijLrDJF6hNB4t4uxg2br3fC4H9Yc9tcbjr2fcNFP3rh/SBNrAgjhsqBU4Ght8JPrVofG/ZkXfnSfnYsFg==}
+ engines: {node: '>=18.18'}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=5.1.0'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ pure-rand@6.1.0:
+ resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
+
+ qs@6.15.2:
+ resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==}
+ engines: {node: '>=0.6'}
+
+ range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+
+ raw-body@3.0.2:
+ resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
+ engines: {node: '>= 0.10'}
+
+ rc9@2.1.2:
+ resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
+
+ react-dom@19.2.6:
+ resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==}
+ peerDependencies:
+ react: ^19.2.6
+
+ react@19.2.6:
+ resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==}
+ engines: {node: '>=0.10.0'}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+ engines: {node: '>= 14.18.0'}
+
+ reflect-metadata@0.2.2:
+ resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+
+ router@2.2.0:
+ resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
+ engines: {node: '>= 18'}
+
+ rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+
+ rxjs@7.8.2:
+ resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ scheduler@0.27.0:
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
+
+ schema-utils@3.3.0:
+ resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
+ engines: {node: '>= 10.13.0'}
+
+ schema-utils@4.3.3:
+ resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==}
+ engines: {node: '>= 10.13.0'}
+
+ semver@7.8.0:
+ resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ send@1.2.1:
+ resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
+ engines: {node: '>= 18'}
+
+ serve-static@2.2.1:
+ resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}
+ engines: {node: '>= 18'}
+
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+ sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
+ side-channel-list@1.0.1:
+ resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+
+ statuses@2.0.2:
+ resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
+ engines: {node: '>= 0.8'}
+
+ streamsearch@1.1.0:
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+ engines: {node: '>=10.0.0'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strtok3@10.3.5:
+ resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==}
+ engines: {node: '>=18'}
+
+ styled-jsx@5.1.6:
+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
+ symbol-observable@4.0.0:
+ resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==}
+ engines: {node: '>=0.10'}
+
+ tapable@2.3.3:
+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
+ engines: {node: '>=6'}
+
+ terser-webpack-plugin@5.6.0:
+ resolution: {integrity: sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ '@minify-html/node': '*'
+ '@swc/core': '*'
+ '@swc/css': '*'
+ '@swc/html': '*'
+ clean-css: '*'
+ cssnano: '*'
+ csso: '*'
+ esbuild: '*'
+ html-minifier-terser: '*'
+ lightningcss: '*'
+ postcss: '*'
+ uglify-js: '*'
+ webpack: ^5.1.0
+ peerDependenciesMeta:
+ '@minify-html/node':
+ optional: true
+ '@swc/core':
+ optional: true
+ '@swc/css':
+ optional: true
+ '@swc/html':
+ optional: true
+ clean-css:
+ optional: true
+ cssnano:
+ optional: true
+ csso:
+ optional: true
+ esbuild:
+ optional: true
+ html-minifier-terser:
+ optional: true
+ lightningcss:
+ optional: true
+ postcss:
+ optional: true
+ uglify-js:
+ optional: true
+
+ terser@5.47.1:
+ resolution: {integrity: sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ tinyexec@1.1.2:
+ resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==}
+ engines: {node: '>=18'}
+
+ toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+
+ token-types@6.1.2:
+ resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==}
+ engines: {node: '>=14.16'}
+
+ tsconfig-paths-webpack-plugin@4.2.0:
+ resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==}
+ engines: {node: '>=10.13.0'}
+
+ tsconfig-paths@4.2.0:
+ resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
+ engines: {node: '>=6'}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.22.3:
+ resolution: {integrity: sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ turbo@2.9.14:
+ resolution: {integrity: sha512-BQqXRr4UoWI3UPFrtznCLykYHxwxWh53iCB57x092jPMjIlW1wnm3N895g5irpiXmnxUhREBB0n6+y8BHhs4nw==}
+ hasBin: true
+
+ type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+
+ type-is@2.1.0:
+ resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==}
+ engines: {node: '>= 18'}
+
+ typedarray@0.0.6:
+ resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ uid@2.0.2:
+ resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==}
+ engines: {node: '>=8'}
+
+ uint8array-extras@1.5.0:
+ resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==}
+ engines: {node: '>=18'}
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
+ update-browserslist-db@1.2.3:
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
+ watchpack@2.5.1:
+ resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==}
+ engines: {node: '>=10.13.0'}
+
+ wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
+ webpack-node-externals@3.0.0:
+ resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==}
+ engines: {node: '>=6'}
+
+ webpack-sources@3.4.1:
+ resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==}
+ engines: {node: '>=10.13.0'}
+
+ webpack@5.106.0:
+ resolution: {integrity: sha512-Pkx5joZ9RrdgO5LBkyX1L2ZAJeK/Taz3vqZ9CbcP0wS5LEMx5QkKsEwLl29QJfihZ+DKRBFldzy1O30pJ1MDpA==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ peerDependencies:
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+
+ wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yoctocolors-cjs@2.1.3:
+ resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==}
+ engines: {node: '>=18'}
+
+snapshots:
+
+ '@angular-devkit/core@19.2.24(chokidar@4.0.3)':
+ dependencies:
+ ajv: 8.18.0
+ ajv-formats: 3.0.1(ajv@8.18.0)
+ jsonc-parser: 3.3.1
+ picomatch: 4.0.4
+ rxjs: 7.8.1
+ source-map: 0.7.4
+ optionalDependencies:
+ chokidar: 4.0.3
+
+ '@angular-devkit/schematics-cli@19.2.24(@types/node@22.19.19)(chokidar@4.0.3)':
+ dependencies:
+ '@angular-devkit/core': 19.2.24(chokidar@4.0.3)
+ '@angular-devkit/schematics': 19.2.24(chokidar@4.0.3)
+ '@inquirer/prompts': 7.3.2(@types/node@22.19.19)
+ ansi-colors: 4.1.3
+ symbol-observable: 4.0.0
+ yargs-parser: 21.1.1
+ transitivePeerDependencies:
+ - '@types/node'
+ - chokidar
+
+ '@angular-devkit/schematics@19.2.24(chokidar@4.0.3)':
+ dependencies:
+ '@angular-devkit/core': 19.2.24(chokidar@4.0.3)
+ jsonc-parser: 3.3.1
+ magic-string: 0.30.17
+ ora: 5.4.1
+ rxjs: 7.8.1
+ transitivePeerDependencies:
+ - chokidar
+
+ '@babel/code-frame@7.29.0':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/helper-validator-identifier@7.28.5': {}
+
+ '@borewit/text-codec@0.2.2': {}
+
+ '@colors/colors@1.5.0':
+ optional: true
+
+ '@emnapi/runtime@1.10.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@esbuild/aix-ppc64@0.28.0':
+ optional: true
+
+ '@esbuild/android-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/android-arm@0.28.0':
+ optional: true
+
+ '@esbuild/android-x64@0.28.0':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/darwin-x64@0.28.0':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.28.0':
+ optional: true
+
+ '@esbuild/linux-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/linux-arm@0.28.0':
+ optional: true
+
+ '@esbuild/linux-ia32@0.28.0':
+ optional: true
+
+ '@esbuild/linux-loong64@0.28.0':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.28.0':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.28.0':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.28.0':
+ optional: true
+
+ '@esbuild/linux-s390x@0.28.0':
+ optional: true
+
+ '@esbuild/linux-x64@0.28.0':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.28.0':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.28.0':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/sunos-x64@0.28.0':
+ optional: true
+
+ '@esbuild/win32-arm64@0.28.0':
+ optional: true
+
+ '@esbuild/win32-ia32@0.28.0':
+ optional: true
+
+ '@esbuild/win32-x64@0.28.0':
+ optional: true
+
+ '@img/colour@1.1.0':
+ optional: true
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-s390x@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-wasm32@0.34.5':
+ dependencies:
+ '@emnapi/runtime': 1.10.0
+ optional: true
+
+ '@img/sharp-win32-arm64@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.34.5':
+ optional: true
+
+ '@inquirer/ansi@1.0.2': {}
+
+ '@inquirer/checkbox@4.3.2(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@22.19.19)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@22.19.19)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/confirm@5.1.21(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.19)
+ '@inquirer/type': 3.0.10(@types/node@22.19.19)
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/core@10.3.2(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@22.19.19)
+ cli-width: 4.1.0
+ mute-stream: 2.0.0
+ signal-exit: 4.1.0
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/editor@4.2.23(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.19)
+ '@inquirer/external-editor': 1.0.3(@types/node@22.19.19)
+ '@inquirer/type': 3.0.10(@types/node@22.19.19)
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/expand@4.0.23(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.19)
+ '@inquirer/type': 3.0.10(@types/node@22.19.19)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/external-editor@1.0.3(@types/node@22.19.19)':
+ dependencies:
+ chardet: 2.1.1
+ iconv-lite: 0.7.2
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/figures@1.0.15': {}
+
+ '@inquirer/input@4.3.1(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.19)
+ '@inquirer/type': 3.0.10(@types/node@22.19.19)
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/number@3.0.23(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.19)
+ '@inquirer/type': 3.0.10(@types/node@22.19.19)
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/password@4.0.23(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@22.19.19)
+ '@inquirer/type': 3.0.10(@types/node@22.19.19)
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/prompts@7.10.1(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/checkbox': 4.3.2(@types/node@22.19.19)
+ '@inquirer/confirm': 5.1.21(@types/node@22.19.19)
+ '@inquirer/editor': 4.2.23(@types/node@22.19.19)
+ '@inquirer/expand': 4.0.23(@types/node@22.19.19)
+ '@inquirer/input': 4.3.1(@types/node@22.19.19)
+ '@inquirer/number': 3.0.23(@types/node@22.19.19)
+ '@inquirer/password': 4.0.23(@types/node@22.19.19)
+ '@inquirer/rawlist': 4.1.11(@types/node@22.19.19)
+ '@inquirer/search': 3.2.2(@types/node@22.19.19)
+ '@inquirer/select': 4.4.2(@types/node@22.19.19)
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/prompts@7.3.2(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/checkbox': 4.3.2(@types/node@22.19.19)
+ '@inquirer/confirm': 5.1.21(@types/node@22.19.19)
+ '@inquirer/editor': 4.2.23(@types/node@22.19.19)
+ '@inquirer/expand': 4.0.23(@types/node@22.19.19)
+ '@inquirer/input': 4.3.1(@types/node@22.19.19)
+ '@inquirer/number': 3.0.23(@types/node@22.19.19)
+ '@inquirer/password': 4.0.23(@types/node@22.19.19)
+ '@inquirer/rawlist': 4.1.11(@types/node@22.19.19)
+ '@inquirer/search': 3.2.2(@types/node@22.19.19)
+ '@inquirer/select': 4.4.2(@types/node@22.19.19)
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/rawlist@4.1.11(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.19)
+ '@inquirer/type': 3.0.10(@types/node@22.19.19)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/search@3.2.2(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.19)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@22.19.19)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/select@4.4.2(@types/node@22.19.19)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@22.19.19)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@22.19.19)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@inquirer/type@3.0.10(@types/node@22.19.19)':
+ optionalDependencies:
+ '@types/node': 22.19.19
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/source-map@0.3.11':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@lukeed/csprng@1.1.0': {}
+
+ '@nestjs/cli@11.0.21(@types/node@22.19.19)':
+ dependencies:
+ '@angular-devkit/core': 19.2.24(chokidar@4.0.3)
+ '@angular-devkit/schematics': 19.2.24(chokidar@4.0.3)
+ '@angular-devkit/schematics-cli': 19.2.24(@types/node@22.19.19)(chokidar@4.0.3)
+ '@inquirer/prompts': 7.10.1(@types/node@22.19.19)
+ '@nestjs/schematics': 11.1.0(chokidar@4.0.3)(typescript@5.9.3)
+ ansis: 4.2.0
+ chokidar: 4.0.3
+ cli-table3: 0.6.5
+ commander: 4.1.1
+ fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.106.0)
+ glob: 13.0.6
+ node-emoji: 1.11.0
+ ora: 5.4.1
+ tsconfig-paths: 4.2.0
+ tsconfig-paths-webpack-plugin: 4.2.0
+ typescript: 5.9.3
+ webpack: 5.106.0
+ webpack-node-externals: 3.0.0
+ transitivePeerDependencies:
+ - '@minify-html/node'
+ - '@swc/css'
+ - '@swc/html'
+ - '@types/node'
+ - clean-css
+ - cssnano
+ - csso
+ - esbuild
+ - html-minifier-terser
+ - lightningcss
+ - postcss
+ - prettier
+ - uglify-js
+ - webpack-cli
+
+ '@nestjs/common@11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2)':
+ dependencies:
+ file-type: 21.3.4
+ iterare: 1.2.1
+ load-esm: 1.0.3
+ reflect-metadata: 0.2.2
+ rxjs: 7.8.2
+ tslib: 2.8.1
+ uid: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@nestjs/config@4.0.4(@nestjs/common@11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)':
+ dependencies:
+ '@nestjs/common': 11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ dotenv: 17.4.1
+ dotenv-expand: 12.0.3
+ lodash: 4.18.1
+ rxjs: 7.8.2
+
+ '@nestjs/core@11.1.21(@nestjs/common@11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.21)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
+ dependencies:
+ '@nestjs/common': 11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nuxt/opencollective': 0.4.1
+ fast-safe-stringify: 2.1.1
+ iterare: 1.2.1
+ path-to-regexp: 8.4.2
+ reflect-metadata: 0.2.2
+ rxjs: 7.8.2
+ tslib: 2.8.1
+ uid: 2.0.2
+ optionalDependencies:
+ '@nestjs/platform-express': 11.1.21(@nestjs/common@11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)
+
+ '@nestjs/platform-express@11.1.21(@nestjs/common@11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)':
+ dependencies:
+ '@nestjs/common': 11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.21(@nestjs/common@11.1.21(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.21)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ cors: 2.8.6
+ express: 5.2.1
+ multer: 2.1.1
+ path-to-regexp: 8.4.2
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@nestjs/schematics@11.1.0(chokidar@4.0.3)(typescript@5.9.3)':
+ dependencies:
+ '@angular-devkit/core': 19.2.24(chokidar@4.0.3)
+ '@angular-devkit/schematics': 19.2.24(chokidar@4.0.3)
+ comment-json: 5.0.0
+ jsonc-parser: 3.3.1
+ pluralize: 8.0.0
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - chokidar
+
+ '@next/env@15.5.18': {}
+
+ '@next/swc-darwin-arm64@15.5.18':
+ optional: true
+
+ '@next/swc-darwin-x64@15.5.18':
+ optional: true
+
+ '@next/swc-linux-arm64-gnu@15.5.18':
+ optional: true
+
+ '@next/swc-linux-arm64-musl@15.5.18':
+ optional: true
+
+ '@next/swc-linux-x64-gnu@15.5.18':
+ optional: true
+
+ '@next/swc-linux-x64-musl@15.5.18':
+ optional: true
+
+ '@next/swc-win32-arm64-msvc@15.5.18':
+ optional: true
+
+ '@next/swc-win32-x64-msvc@15.5.18':
+ optional: true
+
+ '@nuxt/opencollective@0.4.1':
+ dependencies:
+ consola: 3.4.2
+
+ '@prisma/client@6.19.3(prisma@6.19.3(typescript@5.9.3))(typescript@5.9.3)':
+ optionalDependencies:
+ prisma: 6.19.3(typescript@5.9.3)
+ typescript: 5.9.3
+
+ '@prisma/config@6.19.3':
+ dependencies:
+ c12: 3.1.0
+ deepmerge-ts: 7.1.5
+ effect: 3.21.0
+ empathic: 2.0.0
+ transitivePeerDependencies:
+ - magicast
+
+ '@prisma/debug@6.19.3': {}
+
+ '@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7': {}
+
+ '@prisma/engines@6.19.3':
+ dependencies:
+ '@prisma/debug': 6.19.3
+ '@prisma/engines-version': 7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7
+ '@prisma/fetch-engine': 6.19.3
+ '@prisma/get-platform': 6.19.3
+
+ '@prisma/fetch-engine@6.19.3':
+ dependencies:
+ '@prisma/debug': 6.19.3
+ '@prisma/engines-version': 7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7
+ '@prisma/get-platform': 6.19.3
+
+ '@prisma/get-platform@6.19.3':
+ dependencies:
+ '@prisma/debug': 6.19.3
+
+ '@standard-schema/spec@1.1.0': {}
+
+ '@swc/helpers@0.5.15':
+ dependencies:
+ tslib: 2.8.1
+
+ '@tokenizer/inflate@0.4.1':
+ dependencies:
+ debug: 4.4.3
+ token-types: 6.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@tokenizer/token@0.3.0': {}
+
+ '@turbo/darwin-64@2.9.14':
+ optional: true
+
+ '@turbo/darwin-arm64@2.9.14':
+ optional: true
+
+ '@turbo/linux-64@2.9.14':
+ optional: true
+
+ '@turbo/linux-arm64@2.9.14':
+ optional: true
+
+ '@turbo/windows-64@2.9.14':
+ optional: true
+
+ '@turbo/windows-arm64@2.9.14':
+ optional: true
+
+ '@types/body-parser@1.19.6':
+ dependencies:
+ '@types/connect': 3.4.38
+ '@types/node': 22.19.19
+
+ '@types/connect@3.4.38':
+ dependencies:
+ '@types/node': 22.19.19
+
+ '@types/eslint-scope@3.7.7':
+ dependencies:
+ '@types/eslint': 9.6.1
+ '@types/estree': 1.0.9
+
+ '@types/eslint@9.6.1':
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/json-schema': 7.0.15
+
+ '@types/estree@1.0.9': {}
+
+ '@types/express-serve-static-core@5.1.1':
+ dependencies:
+ '@types/node': 22.19.19
+ '@types/qs': 6.15.1
+ '@types/range-parser': 1.2.7
+ '@types/send': 1.2.1
+
+ '@types/express@5.0.6':
+ dependencies:
+ '@types/body-parser': 1.19.6
+ '@types/express-serve-static-core': 5.1.1
+ '@types/serve-static': 2.2.0
+
+ '@types/http-errors@2.0.5': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/node@22.19.19':
+ dependencies:
+ undici-types: 6.21.0
+
+ '@types/qs@6.15.1': {}
+
+ '@types/range-parser@1.2.7': {}
+
+ '@types/react-dom@19.2.3(@types/react@19.2.15)':
+ dependencies:
+ '@types/react': 19.2.15
+
+ '@types/react@19.2.15':
+ dependencies:
+ csstype: 3.2.3
+
+ '@types/send@1.2.1':
+ dependencies:
+ '@types/node': 22.19.19
+
+ '@types/serve-static@2.2.0':
+ dependencies:
+ '@types/http-errors': 2.0.5
+ '@types/node': 22.19.19
+
+ '@webassemblyjs/ast@1.14.1':
+ dependencies:
+ '@webassemblyjs/helper-numbers': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2': {}
+
+ '@webassemblyjs/helper-api-error@1.13.2': {}
+
+ '@webassemblyjs/helper-buffer@1.14.1': {}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ dependencies:
+ '@webassemblyjs/floating-point-hex-parser': 1.13.2
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2': {}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/wasm-gen': 1.14.1
+
+ '@webassemblyjs/ieee754@1.13.2':
+ dependencies:
+ '@xtuc/ieee754': 1.2.0
+
+ '@webassemblyjs/leb128@1.13.2':
+ dependencies:
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/utf8@1.13.2': {}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/helper-wasm-section': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-opt': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ '@webassemblyjs/wast-printer': 1.14.1
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@xtuc/long': 4.2.2
+
+ '@xtuc/ieee754@1.2.0': {}
+
+ '@xtuc/long@4.2.2': {}
+
+ accepts@2.0.0:
+ dependencies:
+ mime-types: 3.0.2
+ negotiator: 1.0.0
+
+ acorn-import-phases@1.0.4(acorn@8.16.0):
+ dependencies:
+ acorn: 8.16.0
+
+ acorn@8.16.0: {}
+
+ ajv-formats@2.1.1(ajv@8.20.0):
+ optionalDependencies:
+ ajv: 8.20.0
+
+ ajv-formats@3.0.1(ajv@8.18.0):
+ optionalDependencies:
+ ajv: 8.18.0
+
+ ajv-keywords@3.5.2(ajv@6.15.0):
+ dependencies:
+ ajv: 6.15.0
+
+ ajv-keywords@5.1.0(ajv@8.20.0):
+ dependencies:
+ ajv: 8.20.0
+ fast-deep-equal: 3.1.3
+
+ ajv@6.15.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ajv@8.18.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.2
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ ajv@8.20.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.2
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ ansi-colors@4.1.3: {}
+
+ ansi-regex@5.0.1: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansis@4.2.0: {}
+
+ append-field@1.0.0: {}
+
+ argparse@2.0.1: {}
+
+ array-timsort@1.0.3: {}
+
+ balanced-match@1.0.2: {}
+
+ balanced-match@4.0.4: {}
+
+ base64-js@1.5.1: {}
+
+ baseline-browser-mapping@2.10.31: {}
+
+ bl@4.1.0:
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ body-parser@2.2.2:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 4.4.3
+ http-errors: 2.0.1
+ iconv-lite: 0.7.2
+ on-finished: 2.4.1
+ qs: 6.15.2
+ raw-body: 3.0.2
+ type-is: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ brace-expansion@1.1.14:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@5.0.6:
+ dependencies:
+ balanced-match: 4.0.4
+
+ browserslist@4.28.2:
+ dependencies:
+ baseline-browser-mapping: 2.10.31
+ caniuse-lite: 1.0.30001793
+ electron-to-chromium: 1.5.360
+ node-releases: 2.0.44
+ update-browserslist-db: 1.2.3(browserslist@4.28.2)
+
+ buffer-from@1.1.2: {}
+
+ buffer@5.7.1:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ busboy@1.6.0:
+ dependencies:
+ streamsearch: 1.1.0
+
+ bytes@3.1.2: {}
+
+ c12@3.1.0:
+ dependencies:
+ chokidar: 4.0.3
+ confbox: 0.2.4
+ defu: 6.1.7
+ dotenv: 16.6.1
+ exsolve: 1.0.8
+ giget: 2.0.0
+ jiti: 2.7.0
+ ohash: 2.0.11
+ pathe: 2.0.3
+ perfect-debounce: 1.0.0
+ pkg-types: 2.3.1
+ rc9: 2.1.2
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
+ callsites@3.1.0: {}
+
+ caniuse-lite@1.0.30001793: {}
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chardet@2.1.1: {}
+
+ chokidar@4.0.3:
+ dependencies:
+ readdirp: 4.1.2
+
+ chrome-trace-event@1.0.4: {}
+
+ citty@0.1.6:
+ dependencies:
+ consola: 3.4.2
+
+ citty@0.2.2: {}
+
+ cli-cursor@3.1.0:
+ dependencies:
+ restore-cursor: 3.1.0
+
+ cli-spinners@2.9.2: {}
+
+ cli-table3@0.6.5:
+ dependencies:
+ string-width: 4.2.3
+ optionalDependencies:
+ '@colors/colors': 1.5.0
+
+ cli-width@4.1.0: {}
+
+ client-only@0.0.1: {}
+
+ clone@1.0.4: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ commander@2.20.3: {}
+
+ commander@4.1.1: {}
+
+ comment-json@5.0.0:
+ dependencies:
+ array-timsort: 1.0.3
+ esprima: 4.0.1
+
+ concat-map@0.0.1: {}
+
+ concat-stream@2.0.0:
+ dependencies:
+ buffer-from: 1.1.2
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ typedarray: 0.0.6
+
+ confbox@0.2.4: {}
+
+ consola@3.4.2: {}
+
+ content-disposition@1.1.0: {}
+
+ content-type@1.0.5: {}
+
+ content-type@2.0.0: {}
+
+ cookie-signature@1.2.2: {}
+
+ cookie@0.7.2: {}
+
+ cors@2.8.6:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
+ cosmiconfig@8.3.6(typescript@5.9.3):
+ dependencies:
+ import-fresh: 3.3.1
+ js-yaml: 4.1.1
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ optionalDependencies:
+ typescript: 5.9.3
+
+ csstype@3.2.3: {}
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ deepmerge-ts@7.1.5: {}
+
+ deepmerge@4.3.1: {}
+
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
+ defu@6.1.7: {}
+
+ depd@2.0.0: {}
+
+ destr@2.0.5: {}
+
+ detect-libc@2.1.2:
+ optional: true
+
+ dotenv-expand@12.0.3:
+ dependencies:
+ dotenv: 16.6.1
+
+ dotenv@16.6.1: {}
+
+ dotenv@17.4.1: {}
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ ee-first@1.1.1: {}
+
+ effect@3.21.0:
+ dependencies:
+ '@standard-schema/spec': 1.1.0
+ fast-check: 3.23.2
+
+ electron-to-chromium@1.5.360: {}
+
+ emoji-regex@8.0.0: {}
+
+ empathic@2.0.0: {}
+
+ encodeurl@2.0.0: {}
+
+ enhanced-resolve@5.21.5:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.3
+
+ error-ex@1.3.4:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-module-lexer@2.1.0: {}
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ esbuild@0.28.0:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.28.0
+ '@esbuild/android-arm': 0.28.0
+ '@esbuild/android-arm64': 0.28.0
+ '@esbuild/android-x64': 0.28.0
+ '@esbuild/darwin-arm64': 0.28.0
+ '@esbuild/darwin-x64': 0.28.0
+ '@esbuild/freebsd-arm64': 0.28.0
+ '@esbuild/freebsd-x64': 0.28.0
+ '@esbuild/linux-arm': 0.28.0
+ '@esbuild/linux-arm64': 0.28.0
+ '@esbuild/linux-ia32': 0.28.0
+ '@esbuild/linux-loong64': 0.28.0
+ '@esbuild/linux-mips64el': 0.28.0
+ '@esbuild/linux-ppc64': 0.28.0
+ '@esbuild/linux-riscv64': 0.28.0
+ '@esbuild/linux-s390x': 0.28.0
+ '@esbuild/linux-x64': 0.28.0
+ '@esbuild/netbsd-arm64': 0.28.0
+ '@esbuild/netbsd-x64': 0.28.0
+ '@esbuild/openbsd-arm64': 0.28.0
+ '@esbuild/openbsd-x64': 0.28.0
+ '@esbuild/openharmony-arm64': 0.28.0
+ '@esbuild/sunos-x64': 0.28.0
+ '@esbuild/win32-arm64': 0.28.0
+ '@esbuild/win32-ia32': 0.28.0
+ '@esbuild/win32-x64': 0.28.0
+
+ escalade@3.2.0: {}
+
+ escape-html@1.0.3: {}
+
+ eslint-scope@5.1.1:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+
+ esprima@4.0.1: {}
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@4.3.0: {}
+
+ estraverse@5.3.0: {}
+
+ etag@1.8.1: {}
+
+ events@3.3.0: {}
+
+ express@5.2.1:
+ dependencies:
+ accepts: 2.0.0
+ body-parser: 2.2.2
+ content-disposition: 1.1.0
+ content-type: 1.0.5
+ cookie: 0.7.2
+ cookie-signature: 1.2.2
+ debug: 4.4.3
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 2.1.1
+ fresh: 2.0.0
+ http-errors: 2.0.1
+ merge-descriptors: 2.0.0
+ mime-types: 3.0.2
+ on-finished: 2.4.1
+ once: 1.4.0
+ parseurl: 1.3.3
+ proxy-addr: 2.0.7
+ qs: 6.15.2
+ range-parser: 1.2.1
+ router: 2.2.0
+ send: 1.2.1
+ serve-static: 2.2.1
+ statuses: 2.0.2
+ type-is: 2.1.0
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ exsolve@1.0.8: {}
+
+ fast-check@3.23.2:
+ dependencies:
+ pure-rand: 6.1.0
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-safe-stringify@2.1.1: {}
+
+ fast-uri@3.1.2: {}
+
+ file-type@21.3.4:
+ dependencies:
+ '@tokenizer/inflate': 0.4.1
+ strtok3: 10.3.5
+ token-types: 6.1.2
+ uint8array-extras: 1.5.0
+ transitivePeerDependencies:
+ - supports-color
+
+ finalhandler@2.1.1:
+ dependencies:
+ debug: 4.4.3
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.106.0):
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ chalk: 4.1.2
+ chokidar: 4.0.3
+ cosmiconfig: 8.3.6(typescript@5.9.3)
+ deepmerge: 4.3.1
+ fs-extra: 10.1.0
+ memfs: 3.5.3
+ minimatch: 3.1.5
+ node-abort-controller: 3.1.1
+ schema-utils: 3.3.0
+ semver: 7.8.0
+ tapable: 2.3.3
+ typescript: 5.9.3
+ webpack: 5.106.0
+
+ forwarded@0.2.0: {}
+
+ fresh@2.0.0: {}
+
+ fs-extra@10.1.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.2.1
+ universalify: 2.0.1
+
+ fs-monkey@1.1.0: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.3
+ math-intrinsics: 1.1.0
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ giget@2.0.0:
+ dependencies:
+ citty: 0.1.6
+ consola: 3.4.2
+ defu: 6.1.7
+ node-fetch-native: 1.6.7
+ nypm: 0.6.6
+ pathe: 2.0.3
+
+ glob-to-regexp@0.4.1: {}
+
+ glob@13.0.6:
+ dependencies:
+ minimatch: 10.2.5
+ minipass: 7.1.3
+ path-scurry: 2.0.2
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ has-flag@4.0.0: {}
+
+ has-symbols@1.1.0: {}
+
+ hasown@2.0.3:
+ dependencies:
+ function-bind: 1.1.2
+
+ http-errors@2.0.1:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.2
+ toidentifier: 1.0.1
+
+ iconv-lite@0.7.2:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ieee754@1.2.1: {}
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ inherits@2.0.4: {}
+
+ ipaddr.js@1.9.1: {}
+
+ is-arrayish@0.2.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-interactive@1.0.0: {}
+
+ is-promise@4.0.0: {}
+
+ is-unicode-supported@0.1.0: {}
+
+ iterare@1.2.1: {}
+
+ jest-worker@27.5.1:
+ dependencies:
+ '@types/node': 22.19.19
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ jiti@2.7.0: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.1.1:
+ dependencies:
+ argparse: 2.0.1
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json5@2.2.3: {}
+
+ jsonc-parser@3.3.1: {}
+
+ jsonfile@6.2.1:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ lines-and-columns@1.2.4: {}
+
+ load-esm@1.0.3: {}
+
+ loader-runner@4.3.2: {}
+
+ lodash@4.18.1: {}
+
+ log-symbols@4.1.0:
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+
+ lru-cache@11.5.0: {}
+
+ magic-string@0.30.17:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ math-intrinsics@1.1.0: {}
+
+ media-typer@0.3.0: {}
+
+ media-typer@1.1.0: {}
+
+ memfs@3.5.3:
+ dependencies:
+ fs-monkey: 1.1.0
+
+ merge-descriptors@2.0.0: {}
+
+ merge-stream@2.0.0: {}
+
+ mime-db@1.52.0: {}
+
+ mime-db@1.54.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mime-types@3.0.2:
+ dependencies:
+ mime-db: 1.54.0
+
+ mimic-fn@2.1.0: {}
+
+ minimatch@10.2.5:
+ dependencies:
+ brace-expansion: 5.0.6
+
+ minimatch@3.1.5:
+ dependencies:
+ brace-expansion: 1.1.14
+
+ minimist@1.2.8: {}
+
+ minipass@7.1.3: {}
+
+ ms@2.1.3: {}
+
+ multer@2.1.1:
+ dependencies:
+ append-field: 1.0.0
+ busboy: 1.6.0
+ concat-stream: 2.0.0
+ type-is: 1.6.18
+
+ mute-stream@2.0.0: {}
+
+ nanoid@3.3.12: {}
+
+ negotiator@1.0.0: {}
+
+ neo-async@2.6.2: {}
+
+ next@15.5.18(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
+ dependencies:
+ '@next/env': 15.5.18
+ '@swc/helpers': 0.5.15
+ caniuse-lite: 1.0.30001793
+ postcss: 8.4.31
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
+ styled-jsx: 5.1.6(react@19.2.6)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 15.5.18
+ '@next/swc-darwin-x64': 15.5.18
+ '@next/swc-linux-arm64-gnu': 15.5.18
+ '@next/swc-linux-arm64-musl': 15.5.18
+ '@next/swc-linux-x64-gnu': 15.5.18
+ '@next/swc-linux-x64-musl': 15.5.18
+ '@next/swc-win32-arm64-msvc': 15.5.18
+ '@next/swc-win32-x64-msvc': 15.5.18
+ sharp: 0.34.5
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+
+ node-abort-controller@3.1.1: {}
+
+ node-emoji@1.11.0:
+ dependencies:
+ lodash: 4.18.1
+
+ node-fetch-native@1.6.7: {}
+
+ node-releases@2.0.44: {}
+
+ nypm@0.6.6:
+ dependencies:
+ citty: 0.2.2
+ pathe: 2.0.3
+ tinyexec: 1.1.2
+
+ object-assign@4.1.1: {}
+
+ object-inspect@1.13.4: {}
+
+ ohash@2.0.11: {}
+
+ on-finished@2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ onetime@5.1.2:
+ dependencies:
+ mimic-fn: 2.1.0
+
+ ora@5.4.1:
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.9.2
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ error-ex: 1.3.4
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ parseurl@1.3.3: {}
+
+ path-scurry@2.0.2:
+ dependencies:
+ lru-cache: 11.5.0
+ minipass: 7.1.3
+
+ path-to-regexp@8.4.2: {}
+
+ path-type@4.0.0: {}
+
+ pathe@2.0.3: {}
+
+ perfect-debounce@1.0.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@4.0.4: {}
+
+ pkg-types@2.3.1:
+ dependencies:
+ confbox: 0.2.4
+ exsolve: 1.0.8
+ pathe: 2.0.3
+
+ pluralize@8.0.0: {}
+
+ postcss@8.4.31:
+ dependencies:
+ nanoid: 3.3.12
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ prisma@6.19.3(typescript@5.9.3):
+ dependencies:
+ '@prisma/config': 6.19.3
+ '@prisma/engines': 6.19.3
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - magicast
+
+ proxy-addr@2.0.7:
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+
+ punycode@2.3.1: {}
+
+ pure-rand@6.1.0: {}
+
+ qs@6.15.2:
+ dependencies:
+ side-channel: 1.1.0
+
+ range-parser@1.2.1: {}
+
+ raw-body@3.0.2:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.1
+ iconv-lite: 0.7.2
+ unpipe: 1.0.0
+
+ rc9@2.1.2:
+ dependencies:
+ defu: 6.1.7
+ destr: 2.0.5
+
+ react-dom@19.2.6(react@19.2.6):
+ dependencies:
+ react: 19.2.6
+ scheduler: 0.27.0
+
+ react@19.2.6: {}
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readdirp@4.1.2: {}
+
+ reflect-metadata@0.2.2: {}
+
+ require-from-string@2.0.2: {}
+
+ resolve-from@4.0.0: {}
+
+ restore-cursor@3.1.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
+ router@2.2.0:
+ dependencies:
+ debug: 4.4.3
+ depd: 2.0.0
+ is-promise: 4.0.0
+ parseurl: 1.3.3
+ path-to-regexp: 8.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ rxjs@7.8.1:
+ dependencies:
+ tslib: 2.8.1
+
+ rxjs@7.8.2:
+ dependencies:
+ tslib: 2.8.1
+
+ safe-buffer@5.2.1: {}
+
+ safer-buffer@2.1.2: {}
+
+ scheduler@0.27.0: {}
+
+ schema-utils@3.3.0:
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 6.15.0
+ ajv-keywords: 3.5.2(ajv@6.15.0)
+
+ schema-utils@4.3.3:
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 8.20.0
+ ajv-formats: 2.1.1(ajv@8.20.0)
+ ajv-keywords: 5.1.0(ajv@8.20.0)
+
+ semver@7.8.0: {}
+
+ send@1.2.1:
+ dependencies:
+ debug: 4.4.3
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 2.0.0
+ http-errors: 2.0.1
+ mime-types: 3.0.2
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ serve-static@2.2.1:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 1.2.1
+ transitivePeerDependencies:
+ - supports-color
+
+ setprototypeof@1.2.0: {}
+
+ sharp@0.34.5:
+ dependencies:
+ '@img/colour': 1.1.0
+ detect-libc: 2.1.2
+ semver: 7.8.0
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.34.5
+ '@img/sharp-darwin-x64': 0.34.5
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ '@img/sharp-linux-arm': 0.34.5
+ '@img/sharp-linux-arm64': 0.34.5
+ '@img/sharp-linux-ppc64': 0.34.5
+ '@img/sharp-linux-riscv64': 0.34.5
+ '@img/sharp-linux-s390x': 0.34.5
+ '@img/sharp-linux-x64': 0.34.5
+ '@img/sharp-linuxmusl-arm64': 0.34.5
+ '@img/sharp-linuxmusl-x64': 0.34.5
+ '@img/sharp-wasm32': 0.34.5
+ '@img/sharp-win32-arm64': 0.34.5
+ '@img/sharp-win32-ia32': 0.34.5
+ '@img/sharp-win32-x64': 0.34.5
+ optional: true
+
+ side-channel-list@1.0.1:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.1
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ signal-exit@3.0.7: {}
+
+ signal-exit@4.1.0: {}
+
+ source-map-js@1.2.1: {}
+
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map@0.6.1: {}
+
+ source-map@0.7.4: {}
+
+ statuses@2.0.2: {}
+
+ streamsearch@1.1.0: {}
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-bom@3.0.0: {}
+
+ strtok3@10.3.5:
+ dependencies:
+ '@tokenizer/token': 0.3.0
+
+ styled-jsx@5.1.6(react@19.2.6):
+ dependencies:
+ client-only: 0.0.1
+ react: 19.2.6
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
+ symbol-observable@4.0.0: {}
+
+ tapable@2.3.3: {}
+
+ terser-webpack-plugin@5.6.0(webpack@5.106.0):
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ jest-worker: 27.5.1
+ schema-utils: 4.3.3
+ terser: 5.47.1
+ webpack: 5.106.0
+
+ terser@5.47.1:
+ dependencies:
+ '@jridgewell/source-map': 0.3.11
+ acorn: 8.16.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ tinyexec@1.1.2: {}
+
+ toidentifier@1.0.1: {}
+
+ token-types@6.1.2:
+ dependencies:
+ '@borewit/text-codec': 0.2.2
+ '@tokenizer/token': 0.3.0
+ ieee754: 1.2.1
+
+ tsconfig-paths-webpack-plugin@4.2.0:
+ dependencies:
+ chalk: 4.1.2
+ enhanced-resolve: 5.21.5
+ tapable: 2.3.3
+ tsconfig-paths: 4.2.0
+
+ tsconfig-paths@4.2.0:
+ dependencies:
+ json5: 2.2.3
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tslib@2.8.1: {}
+
+ tsx@4.22.3:
+ dependencies:
+ esbuild: 0.28.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ turbo@2.9.14:
+ optionalDependencies:
+ '@turbo/darwin-64': 2.9.14
+ '@turbo/darwin-arm64': 2.9.14
+ '@turbo/linux-64': 2.9.14
+ '@turbo/linux-arm64': 2.9.14
+ '@turbo/windows-64': 2.9.14
+ '@turbo/windows-arm64': 2.9.14
+
+ type-is@1.6.18:
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.35
+
+ type-is@2.1.0:
+ dependencies:
+ content-type: 2.0.0
+ media-typer: 1.1.0
+ mime-types: 3.0.2
+
+ typedarray@0.0.6: {}
+
+ typescript@5.9.3: {}
+
+ uid@2.0.2:
+ dependencies:
+ '@lukeed/csprng': 1.1.0
+
+ uint8array-extras@1.5.0: {}
+
+ undici-types@6.21.0: {}
+
+ universalify@2.0.1: {}
+
+ unpipe@1.0.0: {}
+
+ update-browserslist-db@1.2.3(browserslist@4.28.2):
+ dependencies:
+ browserslist: 4.28.2
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ util-deprecate@1.0.2: {}
+
+ vary@1.1.2: {}
+
+ watchpack@2.5.1:
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
+ webpack-node-externals@3.0.0: {}
+
+ webpack-sources@3.4.1: {}
+
+ webpack@5.106.0:
+ dependencies:
+ '@types/eslint-scope': 3.7.7
+ '@types/estree': 1.0.9
+ '@types/json-schema': 7.0.15
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/wasm-edit': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ acorn: 8.16.0
+ acorn-import-phases: 1.0.4(acorn@8.16.0)
+ browserslist: 4.28.2
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 5.21.5
+ es-module-lexer: 2.1.0
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+ json-parse-even-better-errors: 2.3.1
+ loader-runner: 4.3.2
+ mime-types: 2.1.35
+ neo-async: 2.6.2
+ schema-utils: 4.3.3
+ tapable: 2.3.3
+ terser-webpack-plugin: 5.6.0(webpack@5.106.0)
+ watchpack: 2.5.1
+ webpack-sources: 3.4.1
+ transitivePeerDependencies:
+ - '@minify-html/node'
+ - '@swc/core'
+ - '@swc/css'
+ - '@swc/html'
+ - clean-css
+ - cssnano
+ - csso
+ - esbuild
+ - html-minifier-terser
+ - lightningcss
+ - postcss
+ - uglify-js
+
+ wrap-ansi@6.2.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrappy@1.0.2: {}
+
+ yargs-parser@21.1.1: {}
+
+ yoctocolors-cjs@2.1.3: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
new file mode 100644
index 0000000..3ff5faa
--- /dev/null
+++ b/pnpm-workspace.yaml
@@ -0,0 +1,3 @@
+packages:
+ - "apps/*"
+ - "packages/*"
diff --git a/portal-cliente.html b/portal-cliente.html
new file mode 100644
index 0000000..c7263aa
--- /dev/null
+++ b/portal-cliente.html
@@ -0,0 +1,682 @@
+
+
+
+
+
+ Mi Casillero — Moraworld Imports
+
+
+
+
+
+
+
+
+
Moraworld. Imports
+
Portal del Cliente
+
+
+
JP
+
+
Juan Pérez
+
Cliente · Suite EC-04512
+
+
+
+
Tu dirección en EE.UU.
+
+
150 N Day St,
+
Suite EC-04512,
+
City of Orange, NJ 07050
+
United States 🇺🇸
+
+
📋 Copiar dirección
+
+
+ Principal
+ 🏠 Dashboard
+ 📦 Mis paquetes3
+ 📬 Pre-alertas
+ 🔍 Tracking
+
+ Registro
+ ➕ Registrar compra
+ 📝 Nueva pre-alerta
+
+ Mi cuenta
+ 📋 Historial
+ 💰 Calculadora
+ 👤 Mi perfil
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
📦 En tránsito a bodega
+
2
+
paquetes en camino a NJ
+
+
+
🔵 En bodega NJ
+
1
+
recibido, en verificación
+
+
+
✈️ En tránsito a Ecuador
+
0
+
en camino a Ecuador
+
+
+
✅ Entregados
+
7
+
paquetes entregados
+
+
+
+
+
+
+
+
Paquetes recientes
+ Ver todos
+
+
+
+
📱
+
+
Auriculares Sony WH-1000XM5
+
EC-20260510-014523
+
+
En tránsito
+
+
+
👟
+
+
Zapatillas Nike Air Max
+
EC-20260508-009821
+
+
En bodega
+
+
+
💻
+
+
Laptop Dell XPS 13
+
EC-20260501-078234
+
+
Entregado
+
+
+
+
+
+
+
Acciones rápidas
+
+
+ ➕
+ Registrar nueva compra
Por enlace URL o ingreso manual
+
+
+ 📬
+ Crear pre-alerta
Avísanos antes de que llegue tu paquete
+
+
+ 🔍
+ Rastrear paquete
Ingresa tu Tracking ID
+
+
+
+
+
+
+
+
Notificaciones recientes
+
+
+
✅
+
Paquete verificado en bodega
EC-20260508-009821 · Nike Air Max · Peso confirmado: 2.3 lbs
Hace 2 horas
+
+
+
📦
+
Paquete recibido en bodega NJ
EC-20260508-009821 · Recibido en 150 N Day St, Orange NJ
Ayer a las 11:30 AM
+
+
+
🚚
+
Paquete en tránsito hacia la bodega
EC-20260510-014523 · Auriculares Sony · UPS tracking: 1Z999AA10123456784
Hace 3 días
+
+
+
+
+
+
+
+
+
Mis paquetes
+ + Registrar compra
+
+
+
+
+
+ Tracking ID
+ Producto
+ Tienda
+ Peso
+ Valor
+ Estado
+ Acciones
+
+
+
+
+ EC-20260510-014523
+ Auriculares Sony WH-1000XM5
+ Amazon
+ 0.6 lbs
+ $349.99
+ En tránsito a bodega
+ Ver Fotos
+
+
+ EC-20260508-009821
+ Zapatillas Nike Air Max 270
+ Nike.com
+ 2.3 lbs
+ $129.00
+ En verificación
+ Ver 📸 Fotos
+
+
+ EC-20260503-061004
+ Cámara GoPro HERO12
+ Best Buy
+ 1.8 lbs
+ $399.99
+ En tránsito a Ecuador
+ Ver
+
+
+ EC-20260501-078234
+ Laptop Dell XPS 13
+ Dell.com
+ 4.4 lbs
+ $1,299.00
+ Entregado
+ Ver
+
+
+
+
+
+
+
+
+
+
Pre-alertas de paquetes
+ + Nueva pre-alerta
+
+
+ 💡
+ Envíanos una pre-alerta antes de que llegue tu paquete a la bodega. El operador lo buscará y asignará a tu Suite más rápido.
+
+
+
+
+ Fecha Tienda Tracking vendedor Descripción Valor declarado Estado
+
+
+
+ 10 may 2026
+ Amazon
+ 1Z999AA10123456784
+ Auriculares Sony WH-1000XM5
+ $349.99
+ En espera
+
+
+
+
+
+
+
+
+
Rastrear paquete
+
+
+
+ Rastrear
+
+
+
📦 EC-20260508-009821 — En verificación en bodega NJ
+
+
✅ Registrado 08 may 2026, 09:14 AM ECT
+
✅ En tránsito a bodega NJ 09 may 2026, 10:00 AM EST
+
✅ Recibido en bodega NJ 10 may 2026, 11:30 AM EST
+
🔵 En verificación Operador verificando peso y dimensiones
+
⏳ Declaración SENAE Pendiente
+
⏳ En tránsito a Ecuador Pendiente
+
+
+
+
+
+
+
+
+
Historial de envíos
+
+
+ Tracking ID Producto Fecha entrega Peso Total pagado Estado
+
+ EC-20260501-078234
Laptop Dell XPS 13 15 may 2026 4.4 lbs $78.50 Entregado
+ EC-20260420-045001
Auriculares Bose 700 05 may 2026 0.8 lbs $23.40 Entregado
+ EC-20260410-033210
Cargador iPhone 15 Pro 25 abr 2026 0.2 lbs $8.90 Entregado
+
+
+
+
+
+
+
+
Calculadora de envío
+
+
+
📊 Datos del producto
+
Peso (lbs)
+
+
+
Categoría SENAE
+
+ 4x4 — Sin arancel (máx $400, 4 kg)
+ Cat. B — Consumo general (10%)
+ Cat. C — Textiles, calzado (20%)
+ Cat. D — Electrónicos (10%)
+
+
+
Calcular →
+
+
+
💰 Desglose estimado
+
+
Peso a cobrar —
+
Flete ($3.50/lb) $0.00
+
Seguro (2%) $0.00
+
FODINFA (0.5%) $0.00
+
Arancel $0.00
+
IVA (15%) $0.00
+
+
+ TOTAL ESTIMADO
+ $0.00
+
+
+
+
+
+
+
+
Mi perfil
+
+
+
+
Mi Suite asignada
+
+
Juan Pérez
+
150 N Day St,
+
Suite EC-04512,
+
City of Orange, NJ 07050
+
United States 🇺🇸
+
+
📋 Copiar dirección completa
+
+
Seguridad
+
Contraseña Cambiar
+
MFA (autenticación 2 pasos) Activo ✓
+
+
+
+
+
+
+
+
+
+
+
+
✕
+
➕ Registrar nueva compra
+
+ 🔗 Por enlace URL
+ ✏️ Ingreso manual
+
+
+
+
+
Auriculares Sony WH-1000XM5
+
Amazon · $349.99 · ~0.6 lbs
+
+
+
+
Nombre del producto
+
Tienda / Plataforma Amazon eBay Walmart Shein Otra
+
+
Categoría SENAE 4x4 — Sin arancel Cat. B — 10% Cat. C — 20% Cat. D — 10%
+
Cantidad
+
+
Registrar compra →
+
+
+
+
+
+
+
✕
+
📬 Nueva pre-alerta
+
Tienda / Plataforma Amazon eBay Walmart Shein Otra
+
Número de tracking del vendedor
+
+
Descripción del producto
+
Fecha estimada de llegada a NJ
+
+
Enviar pre-alerta →
+
+
+
+
+✅
+
+
+
+
diff --git a/presentacion.html b/presentacion.html
new file mode 100644
index 0000000..0bdb479
--- /dev/null
+++ b/presentacion.html
@@ -0,0 +1,957 @@
+
+
+
+
+
+Moraworld Imports — Presentación de Requerimientos v1.1
+
+
+
+
+
+
+‹
+›
+1 / 20
+← → para navegar | ESC para overview
+
+
+
+
+
+
+
Documento de Requerimientos v1.1
+
+ Moraworld Imports Sistema de Casillero Internacional
+
+
+ Arquitectura de Software · Requerimientos Funcionales · Flujos de Usuario y Sistema
+
+
+
+
+
+
+
+
02 / 20
Identidad
+
+
Las empresas
+
Dos empresas, un ecosistema
+
Operación transfronteriza legalmente constituida en Ecuador y EE.UU.
+
+
+
🇪🇨
+
Moraworld Imports S.A.S.
+
Constituida bajo las leyes de Ecuador . Representante legal en Cuenca . RUC activo · Permisos SENAE vigentes.
+
Ecuador · S.A.S. · SENAE
+
+
+
🇺🇸
+
Mora Global Import LLC
+
Registrada en el estado de New Jersey, EE.UU. Bodega operativa en:150 N Day St, City of Orange, NJ 07050
+
New Jersey · LLC · NJ 07050
+
+
+
+
+
+
+
+
03 / 20
Resumen Ejecutivo
+
+
¿Qué construimos?
+
El problema que resolvemos
+
+
+
🏭
+
La bodega en EE.UU.
+
Bodega física en 150 N Day St, NJ 07050 . Cada cliente recibe una Suite personalizada como dirección de entrega en tiendas online.
+
+ Dirección Suite: EC-XXXXX
+ Asignación automática al registrarse
+ Verificación física de peso y dimensiones
+ Fotos del paquete sincronizadas al portal
+
+
+
+
🛃
+
La logística a Ecuador
+
El sistema gestiona el reenvío, el cálculo de impuestos y la declaración automática ante la SENAE .
+
+ Calculadora SENAE integrada (categorías 4x4, B, C, D)
+ Declaración Simplificada (DSI) automática
+ Tracking ID único por paquete
+ Notificaciones por WhatsApp, SMS y correo
+
+
+
+
+
+
B2C
+
Casillero Personal
+
Compras pequeñas · Flujo automatizado
+
+
+
B2B
+
Carga Pesada / Pallets
+
Importación mayorista · Cotización especial
+
+
+
+
+
+
+
+
04 / 20
Arquitectura
+
+
Arquitectura de Software
+
Multi-Tenant · ISO/IEC 27001
+
+
🌐 INTERNET (HTTPS / TLS 1.3)
+
▼
+
⚡ Load Balancer / API Gateway
+
▼
+
+
Tenant AEmpresa 1
+
Tenant BEmpresa 2
+
Tenant NEmpresa N
+
+
▼
+
🗄️ PostgreSQL · Schema aislado por Tenant
+
+
+
+
Frontend
+
Next.js / React
+
SSR · SEO optimizado
+
+
+
Backend
+
Node.js + NestJS
+
REST / GraphQL
+
+
+
Seguridad
+
OAuth 2.0 + MFA
+
JWT · AES-256 · WAF
+
+
+
+
+
+
+
+
05 / 20
Seguridad
+
+
Seguridad de la Información
+
Controles ISO/IEC 27001:2022
+
+
A.5 Políticas Política de uso aceptable, manejo de datos y retención
+
A.9 Acceso Autenticación MFA obligatoria, RBAC por roles
+
A.6 Organización Roles definidos, segregación de funciones estricta
+
A.10 Criptografía TLS 1.3 en tránsito · AES-256 en reposo
+
A.8 Activos Inventario de datos personales y de paquetes (LOPDP)
+
A.12 Operaciones Logs de auditoría inmutables, monitoreo continuo (SIEM)
+
A.14 Desarrollo SDLC seguro, revisiones de código, OWASP Top 10
+
A.16 Incidentes Proceso de gestión y notificación de incidentes
+
A.7 RRHH Procedimientos de onboarding/offboarding de usuarios
+
A.18 Cumplimiento Declaración aduanera automática conforme a SENAE
+
+
+
+
+
+
+
06 / 20
Roles
+
+
Sistema de Roles
+
6 roles, acceso diferenciado
+
+
+
👑
+
Super Admin
+
Acceso total. Gestiona tenants, usuarios y configuración global
+
+
+
🏢
+
Admin Empresa
+
Administra su tenant: usuarios, tarifas, bodegas, reportes
+
+
+
📦
+
Operador Bodega
+
Verifica, pesa, fotografía y despacha paquetes en NJ
+
+
+
🛃
+
Agente Aduanero
+
Revisa y aprueba declaraciones antes de enviar a la SENAE
+
+
+
🧑💻
+
Cliente Final
+
Usuario ecuatoriano. Registra compras y da seguimiento
+
+
+
🎧
+
Soporte
+
Visualiza info de clientes y paquetes. Sin modificaciones
+
+
+
+
+
+
+
+
07 / 20
Permisos
+
+
Matriz de Acceso
+
¿Quién puede hacer qué ?
+
+
+
+
+ Acción
+ Super Admin
+ Admin
+ Bodega
+ Aduanero
+ Cliente
+ Soporte
+
+
+
+ Ver dashboard ✅ ✅ ✅ ✅ ✅ ✅
+ Crear / editar usuarios ✅ ✅ ❌ ❌ ❌ ❌
+ Configurar tarifas ✅ ✅ ❌ ❌ ❌ ❌
+ Registrar compra ❌ ❌ ❌ ❌ ✅ ❌
+ Ver mis paquetes ❌ ❌ ❌ ❌ ✅ ✅
+ Verificar en bodega ❌ ❌ ✅ ❌ ❌ ❌
+ Confirmar peso/dims. ❌ ❌ ✅ ❌ ❌ ❌
+ Generar DSI (aduana) ❌ ❌ ❌ ✅ ❌ ❌
+ Enviar datos a SENAE ✅ ✅ ❌ ✅ ❌ ❌
+ Logs de auditoría ✅ ✅ ❌ ❌ ❌ ❌
+
+
+
+
+
+
+
+
+
08 / 20
Módulos
+
+
Módulos del Sistema
+
8 módulos integrados
+
+
+
🌐
+
Landing Page
+
Pública, SEO, calculadora, WhatsApp flotante, legalidad
+
Público
+
+
+
👤
+
Portal Cliente
+
Casillero Suite, pre-alerta, registro por URL o manual, fotos
+
Cliente
+
+
+
🏭
+
Portal Bodega NJ
+
Recepción, verificación, peso real, fotos, despacho
+
Operador
+
+
+
⚙️
+
Portal Admin
+
Dashboard, métricas, tarifas, reportes, auditoría
+
Admin
+
+
+
🛃
+
Módulo SENAE
+
DSI automática, cálculo impuestos, WebService oficial
+
Aduanero
+
+
+
📍
+
Tracking
+
ID único EC-YYYYMMDD-XXXXXX, 11 estados, visible sin login
+
Todos
+
+
+
📄
+
Pre-alerta
+
Aviso previo + carga de factura PDF/imagen + tracking vendedor
+
Cliente
+
+
+
🚢
+
Carga Pesada B2B
+
Pallets, INEN, cotización especial, DAI
+
Mayorista
+
+
+
+
+
+
+
+
09 / 20
Tracking
+
+
Sistema de Tracking
+
11 estados · ID único por paquete
+
Formato: EC-YYYYMMDD-XXXXXX | Ej: EC-20260506-082341
+
+
Notificaciones automáticas al cliente en cada cambio de estado · WhatsApp · SMS · Email
+
+
+
+
+
+
10 / 20
Flujo de Usuario
+
+
Flujo del Cliente Final
+
Del click en Amazon a la puerta en Ecuador
+
+
1
Accede a la Landing Page y se registra (correo + MFA)
+
↓
+
2
Sistema asigna automáticamente: 150 N Day St, Suite EC-XXXXX, Orange NJ 07050
+
↓
+
3
Compra en Amazon/eBay/Walmart usando esa dirección Suite como destino
+
↓
+
4
⚡ PRE-ALERTA (opcional): carga tracking vendedor + factura PDF → La bodega se prepara
+
↓
+
+
5A
🔗 Pega el enlace de Amazon → Sistema extrae: nombre, precio, peso, imagen
+
5B
✏️ Ingreso manual: nombre, valor ($USD), tienda, peso estimado
+
+
↓
+
6
Sistema calcula costo total con desglose SENAE · Cliente ACEPTA y PAGA en línea
+
↓
+
7
🎉 Tracking ID generado · Notificaciones automáticas hasta entrega en Ecuador
+
+
+
+
+
+
+
11 / 20
Flujo de Usuario
+
+
Flujo del Operador de Bodega NJ
+
Verificación y despacho en bodega
+
+
1
Inicia sesión en el Portal de Bodega · Ve paquetes esperados con pre-alertas
+
↓
+
2
Llega paquete físico → Escanea código de barras o busca por tracking manual
+
↓
+
3
Confirma recepción → Estado: RECIBIDO_BODEGA · Pesa y mide · Toma fotos
+
↓
+
+
4A
✅ Sin discrepancia → Estado: VERIFICADO · Asigna a despacho
+
4B
⚠️ Discrepancia >10% → Notifica Admin y cliente · Ajuste de cobro
+
+
↓
+
5
Asigna a envío consolidado o individual · Genera orden de despacho a Ecuador
+
+
+
+
+
+
+
12 / 20
Flujo de Usuario
+
+
Flujo del Agente Aduanero
+
De la bodega a la SENAE
+
+
1
Ve paquetes con estado VERIFICADO · Revisa descripción, valor declarado y fotos
+
↓
+
+
2A
✅ Valor ≤ $400 y ≤ 4 kg → Proceso 4x4 simplificado · DSI automática
+
2B
⚠️ Supera límite → Notifica cliente · Proceso de importación formal (DAI)
+
+
↓
+
3
Sistema genera la Declaración Simplificada de Importación (DSI) automáticamente
+
↓
+
4
Agente REVISA y APRUEBA · Sistema envía DSI al WebService oficial de la SENAE
+
↓
+
5
🎉 SENAE devuelve número de autorización · Estado: DECLARACION_ADUANERA · Notificación al cliente
+
+
+
+
+
+
+
13 / 20
Flujo B2B
+
+
Flujo Importador Mayorista (B2B)
+
Carga Pesada · Pallets · INEN
+
+
1
Importador accede a la sección "Carga Pesada / Pallets" en la Landing Page
+
↓
+
2
Llena formulario de cotización especial: tipo de mercancía, peso, pallets, valor
+
↓
+
3
⚠️ Verificación INEN: calzado, textiles, electrónicos requieren certificación previa
+
↓
+
4
Equipo Moraworld prepara cotización · La envía por correo y WhatsApp
+
↓
+
5
Importador acepta → Se crea expediente con ID de seguimiento B2B propio
+
↓
+
6
🚢 Coordinación de embarque · DAI o DAS · Seguimiento hasta entrega en Ecuador
+
+
+
+
+
+
+
14 / 20
Flujo del Sistema
+
+
Flujo del Sistema
+
Registro por enlace de Amazon
+
+
1
Cliente pega URL del producto de Amazon en el portal
+
↓
+
2
Sistema llama Amazon SP-API (o scraping) · Extrae: nombre, precio, peso, imagen
+
↓
+
3
Pre-llena el formulario automáticamente con los datos extraídos
+
↓
+
4
Sistema calcula: flete + seguro 2% + FODINFA 0.5% + IVA 15% + Arancel por categoría
+
↓
+
5
Muestra desglose completo al cliente · Cliente confirma y paga en línea
+
↓
+
6
✅ Tracking ID generado · Correo de confirmación · Estado → REGISTRADO
+
+
+
+
+
+
+
15 / 20
Calculadora SENAE
+
+
Cálculo de Impuestos
+
Categorías SENAE · Fórmulas
+
+
+
Régimen 4×4
+
0% Arancel
+
Hasta 4 envíos/año · máx. $400 · máx. 4 kg · Proceso simplificado automático
+
+
+
Categoría B
+
10%
+
Bienes de consumo general fuera del régimen 4×4 · + FODINFA + IVA
+
+
+
Categoría C
+
20%
+
Textiles, calzado, artículos del hogar · + FODINFA + IVA
+
+
+
Categoría D
+
0–15%
+
Electrónicos, telecomunicaciones · Puede requerir certificación INEN
+
+
+
+
+Peso_final = MAX(peso_real, (largo × ancho × alto) / 139 )
+
+
+Flete = Peso_final × $3.50/lb
+Seguro = valor_declarado × 0.02
+FODINFA = valor_declarado × 0.005
+Arancel = valor_declarado × % categoría
+IVA = (valor + FODINFA + Arancel) × 0.15
+
+TOTAL = Flete + Seguro + FODINFA + Arancel + IVA
+
+
+
+
+
+
16 / 20
Flujo del Sistema
+
+
Flujo de Notificaciones
+
Notificaciones automáticas multicanal
+
+
+
1
Cambio de estado del paquete en base de datos
+
↓
+
2
Sistema detecta el evento y activa el motor de notificaciones
+
↓
+
3
Envío paralelo a todos los canales configurados del usuario
+
↓
+
4
Log de auditoría inmutable registra el evento con timestamp UTC
+
+
+
+
✉️
+
Correo electrónico Detalle completo del estado · SendGrid / SES
+
+
+
💬
+
WhatsApp Business API Mensaje directo al número del cliente
+
+
+
📱
+
SMS Resumen corto · SMS Gateway API
+
+
+
🔔
+
Push (portal web) Notificación en tiempo real en el dashboard
+
+
+
+
+
+
+
+
+
17 / 20
Integraciones
+
+
Integraciones Externas
+
9 integraciones clave
+
+
+
🛒
+
Amazon SP-API REST API · Datos del producto
+
+
+
🛃
+
WebService SENAE SOAP / REST · Declaraciones DSI/DAI
+
+
+
💳
+
Pasarela de Pagos REST API · Stripe / PayPhone
+
+
+
💬
+
WhatsApp Business REST API · Notificaciones + Soporte
+
+
+
✉️
+
Email (SendGrid/SES) SMTP / REST · Notificaciones
+
+
+
📱
+
SMS Gateway REST API · Notificaciones cortas
+
+
+
🚚
+
Courier (FedEx/DHL) REST API · Estado físico del envío
+
+
+
🏭
+
Software de Bodega REST API · Sync estados en tiempo real
+
+
+
🏷️
+
Normas INEN REST / Web · Certificaciones
+
+
+
+
+
+
+
+
18 / 20
Calidad
+
+
Requerimientos No Funcionales
+
Calidad y Rendimiento
+
+
Disponibilidad 99.9% uptime (SLA garantizado)
+
Tiempo de respuesta {"<"} 2 segundos para operaciones normales
+
Escalabilidad Multi-tenant · preparado para múltiples empresas y miles de usuarios
+
Seguridad ISO/IEC 27001 · OWASP Top 10 · TLS 1.3 · AES-256 · MFA obligatorio · WAF
+
Accesibilidad 100% web · responsive mobile-first · accesible desde cualquier dispositivo
+
Respaldo Backups automáticos diarios · retención mínima 90 días
+
Recuperación RTO {"<"} 4 horas · RPO {"<"} 1 hora
+
Auditoría Todos los eventos registrados con trazabilidad completa e inmutable
+
Multi-idioma Español (clientes Ecuador) · Inglés (operadores NJ)
+
Zona horaria EST (New Jersey) y ECT (Ecuador) — mostrado según ubicación del usuario
+
+
+
+
+
+
+
19 / 20
Estructura Web
+
+
Navegación del Sitio
+
Estructura de rutas
+
+
+
Área Pública
+
+ / Landing Page principal
+ /como-funciona
+ /calculadora
+ /tarifas
+ /quienes-somos
+ /casillero/ como-usar · calculadora · registro
+ /carga-pesada/ como-funciona · cotizacion · inen
+ /tracking ← sin login
+
+
+
+
Área Autenticada
+
+ /portal/dashboard
+ /portal/mi-casillero 📦
+ /portal/pre-alerta 📄
+ /portal/mis-paquetes 🔍
+ /portal/calculadora 💰
+ /portal/perfil
+ /admin/ usuarios · tarifas · reportes
+ /bodega/ paquetes · verificacion
+
+
+
+
+
+
+
+
+
20 / 20
+
+
Resumen
+
+ Un sistema completo, seguro y escalable
+
+
+ Diseñado para crecer con Moraworld Imports desde el primer día.
+
+
+
🏗️ Arquitectura Multi-Tenant ISO 27001
+
👥 6 roles con permisos granulares
+
+
🔁 5 flujos de usuario documentados
+
🛃 Integración directa con SENAE
+
📍 11 estados de tracking en tiempo real
+
🔗 9 integraciones externas
+
💰 Calculadora SENAE (4x4, B, C, D)
+
🌐 100% web · mobile-first · responsive
+
+
+ ISO/IEC 27001
+ SENAE Autorizado
+ Cumplimiento INEN
+ LOPDP Ecuador
+ Multi-Tenant
+
+
+ Moraworld Imports S.A.S. · Mora Global Import LLC · v1.1 · Mayo 2026
+
+
+
+
+
+
+
+
+
diff --git a/registro.html b/registro.html
new file mode 100644
index 0000000..60b26c9
--- /dev/null
+++ b/registro.html
@@ -0,0 +1,428 @@
+
+
+
+
+
+ Crear cuenta — Moraworld Imports
+
+
+
+
+
+
+ Moraworld. Imports
+ ← Volver al inicio
+
+
+
+
+
+
+
+
Registro gratuito — 2 minutos
+
Abre tu Suite en New Jersey hoy
+
Compra en Amazon, eBay, Walmart y más. Te asignamos una dirección personalizada en nuestra bodega de NJ y enviamos a Ecuador.
+
+
+
1
+
Crea tu cuenta Datos personales y contraseña segura
+
+
+
+
2
+
Verifica tu correo Código de 6 dígitos a tu bandeja
+
+
+
+
3
+
Configura MFA Activa la autenticación en dos pasos
+
+
+
+
4
+
¡Listo! Tu Suite queda disponible de inmediato
+
+
+
+
150 N Day St,
+
Suite EC-XXXXX,
+
City of Orange, NJ 07050
+
United States 🇺🇸
+
+
+
+
+
+
+
+
+
+
+
+ Datos personales
+ Verificación
+ Seguridad MFA
+
+
+
+ ⚠️
+
+
+
+
+
Crear cuenta gratis
+
¿Ya tienes cuenta? Inicia sesión aquí →
+
+
+
+ Correo electrónico
+
+
+
+ Teléfono (WhatsApp)
+
+
+
+ Ciudad en Ecuador
+
+ Selecciona tu ciudad
+ Cuenca
+ Quito
+ Guayaquil
+ Ambato
+ Loja
+ Riobamba
+ Manta
+ Otra ciudad
+
+
+
+ Cédula / Pasaporte
+
+
+
+
+
+
+ Acepto los Términos de uso y la Política de privacidad de Moraworld Imports (LOPDP Ecuador).
+
+
Continuar →
+
+
+
+
+
+
+
+
Activar MFA
+
Escanea este código QR con Google Authenticator o Authy para activar la verificación en dos pasos.
+
+
+
🔲
+
O ingresa esta clave manual:
+
MORA-XXXX-YYYY-ZZZZ
+
+
+
Activar MFA y abrir mi casillero →
+
← Volver
+
+
+
+
+
+
🎉
+
¡Tu casillero está listo!
+
Tu Suite personalizada en New Jersey ha sido creada. Usa esta dirección en tus compras online.
+
+
+
150 N Day St,
+
Suite EC-00001 ,
+
City of Orange, NJ 07050
+
United States 🇺🇸
+
+
Ir a mi portal →
+
Volver al inicio
+
+
+
+
+
+
+
+
+
+
+
diff --git a/requerimientos-sistema-casillero.md b/requerimientos-sistema-casillero.md
new file mode 100644
index 0000000..cd8aae9
--- /dev/null
+++ b/requerimientos-sistema-casillero.md
@@ -0,0 +1,716 @@
+# Moraworld Imports — Sistema de Casillero Internacional
+## Requerimientos y Arquitectura de Software
+
+**Empresas:**
+- **Moraworld Imports S.A.S.** — Constituida bajo las leyes de Ecuador (Cuenca)
+- **Mora Global Import LLC** — Constituida bajo las leyes de EE.UU. (New Jersey)
+
+**Versión:** 1.1
+**Fecha:** 6 de mayo de 2026
+**Estado:** Borrador — Levantamiento de Requerimientos
+
+---
+
+## 1. Resumen Ejecutivo
+
+**Moraworld Imports S.A.S.** (Ecuador) y **Mora Global Import LLC** (EE.UU.) operan un ecosistema logístico transfronterizo con bodega física ubicada en:
+
+> **150 N Day St, City of Orange, NJ 07050, EE.UU.**
+
+El sistema permite a usuarios ecuatorianos realizar compras en plataformas como **Amazon**, **eBay**, **Walmart**, entre otras, utilizando una Suite/casillero personalizado dentro de esa dirección como destino. Una vez que el paquete llega a la bodega en New Jersey, la plataforma gestiona el proceso logístico de reenvío hacia **Ecuador**, incluyendo la declaración automática ante la **Aduana Ecuatoriana** (SENAE).
+
+El negocio opera dos líneas de servicio claramente diferenciadas:
+
+| Servicio | Descripción | Flujo |
+|-----------------------|-----------------------------------------------------------------------------|:------------:|
+| **Casillero (B2C)** | Compras pequeñas: Amazon, eBay, ropa, tecnología. Clientes individuales. | Automatizado |
+| **Carga Pesada (B2B)**| Importación mayorista: pallets, contenedores (ej: 1,000 pares de zapatos). | Cotización |
+
+---
+
+## 2. Arquitectura del Sistema
+
+### 2.1 Modelo: Multi-Tenant
+
+El sistema estará desarrollado bajo una arquitectura **Multi-Tenant**, lo que permite operar bajo un único despliegue de software, pero con datos completamente aislados por organización o cliente empresa.
+
+```
+┌─────────────────────────────────────────────────────────┐
+│ INTERNET (HTTPS) │
+└──────────────────────────┬──────────────────────────────┘
+ │
+ ┌──────────▼──────────┐
+ │ Load Balancer / │
+ │ API Gateway │
+ └──────────┬──────────┘
+ │
+ ┌────────────────┼────────────────┐
+ │ │ │
+ ┌──────▼──────┐ ┌──────▼──────┐ ┌─────▼───────┐
+ │ Tenant A │ │ Tenant B │ │ Tenant N │
+ │ (Empresa 1) │ │ (Empresa 2) │ │ (Empresa N) │
+ └──────┬──────┘ └──────┬──────┘ └─────┬───────┘
+ │ │ │
+ └────────────────┼───────────────┘
+ │
+ ┌────────────▼────────────┐
+ │ Base de Datos │
+ │ (Schema por Tenant) │
+ └─────────────────────────┘
+```
+
+### 2.2 Cumplimiento ISO/IEC 27001
+
+El sistema deberá estar diseñado cumpliendo los controles del estándar **ISO/IEC 27001:2022** para la gestión de seguridad de la información:
+
+| Control ISO 27001 | Implementación en el sistema |
+|-------------------------|-------------------------------------------------------------------|
+| A.5 — Políticas | Política de uso aceptable, manejo de datos y retención |
+| A.6 — Organización | Roles definidos, segregación de funciones |
+| A.7 — RRHH | Procedimientos de onboarding/offboarding de usuarios internos |
+| A.8 — Gestión de activos| Inventario de datos personales y de paquetes (conforme a PDPA/LOPD) |
+| A.9 — Control de acceso | Autenticación MFA, RBAC (Role-Based Access Control) |
+| A.10 — Criptografía | TLS 1.3 en tránsito, AES-256 en reposo |
+| A.12 — Operaciones | Logs de auditoría inmutables, monitoreo continuo |
+| A.14 — Desarrollo seguro| SDLC seguro, revisiones de código, OWASP Top 10 |
+| A.16 — Incidentes | Proceso de gestión y notificación de incidentes de seguridad |
+| A.18 — Cumplimiento | Declaración aduanera automática conforme a normativa SENAE |
+
+### 2.3 Stack Tecnológico Sugerido
+
+| Capa | Tecnología sugerida |
+|-------------------|--------------------------------------------------|
+| Frontend | Next.js / React (SSR para SEO en landing page) |
+| Backend / API | Node.js + Express o NestJS (REST / GraphQL) |
+| Base de datos | PostgreSQL (multi-schema por tenant) |
+| Autenticación | OAuth 2.0 + JWT + MFA (TOTP) |
+| Almacenamiento | AWS S3 o similar (fotos de paquetes, documentos) |
+| Integración | API SENAE (Aduana Ecuador), Amazon SP-API |
+| Tracking | Webhooks + sistema propio de tracking IDs |
+| Infraestructura | AWS / GCP con ambientes: dev, staging, producción|
+| Seguridad | WAF, rate limiting, SIEM para auditoría |
+
+---
+
+## 3. Roles y Permisos del Sistema
+
+### 3.1 Definición de Roles
+
+| Rol | Descripción |
+|-----------------------|-----------------------------------------------------------------------------|
+| **Super Admin** | Acceso total al sistema. Gestiona tenants, usuarios globales y configuración|
+| **Admin Empresa** | Administra su propio tenant: usuarios, tarifas, bodegas asignadas |
+| **Operador Bodega** | Personal en EE.UU. que verifica, pesa y escanea paquetes físicamente |
+| **Agente Aduanero** | Revisa y confirma las declaraciones antes de enviarlas a la SENAE |
+| **Cliente Final** | Usuario ecuatoriano que registra compras y hace seguimiento |
+| **Soporte** | Puede ver información del cliente y paquetes, no puede modificar datos clave|
+
+### 3.2 Matriz de Permisos
+
+| Módulo / Acción | Super Admin | Admin Empresa | Operador Bodega | Agente Aduanero | Cliente | Soporte |
+|------------------------------|:-----------:|:-------------:|:---------------:|:---------------:|:-------:|:-------:|
+| Ver dashboard general | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
+| Crear/editar usuarios | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
+| Configurar tarifas y zonas | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
+| Registrar compra (link/manual)| ❌ | ❌ | ❌ | ❌ | ✅ | ❌ |
+| Ver mis paquetes | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
+| Verificar paquete en bodega | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ |
+| Confirmar peso/dimensiones | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ |
+| Generar declaración aduanera | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
+| Enviar datos a SENAE | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
+| Ver historial de envíos | ✅ | ✅ | ✅ | ✅ | ✅ (solo propios) | ✅ |
+| Acceder a logs de auditoría | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
+
+---
+
+## 4. Módulos del Sistema
+
+### 4.1 Landing Page (Pública)
+
+Página de presentación del servicio accesible desde cualquier dispositivo con internet.
+
+**Secciones de contenido:**
+- Hero con propuesta de valor: casillero en EE.UU. para Ecuador
+- **Cómo funciona** — pasos visuales diferenciados por tipo de servicio
+- **Calculadora de envío** visible en la landing (sin necesidad de registro)
+- Tarifas y categorías de SENAE
+- Sección **"Quiénes Somos"** — dos empresas constituidas legalmente:
+ - Moraworld Imports S.A.S. — RUC Ecuador, rep. legal en Cuenca
+ - Mora Global Import LLC — Registro EE.UU., rep. legal en New Jersey
+- **Sección de Legalidad:** Mostrar documentos de constitución, RUC, permisos aduaneros SENAE, cumplimiento normas INEN
+- Sección de servicios: **Casillero** vs **Carga Pesada/Pallets**
+- Preguntas frecuentes
+- Registro / inicio de sesión de clientes
+- Blog o noticias (opcional)
+
+**Elementos de contacto y confianza:**
+- **Botón de WhatsApp flotante** con opción de contactar:
+ - Representante en New Jersey (bodega / operaciones)
+ - Representante legal en Cuenca, Ecuador
+- Sección de certificaciones y normativas (ISO, INEN, SENAE)
+
+**Requisitos técnicos:**
+- SEO optimizado (Next.js SSR)
+- Responsive — mobile-first
+- HTTPS obligatorio
+- Carga < 3 segundos
+
+---
+
+### 4.2 Portal del Cliente Final (Panel de Casillero)
+
+Acceso mediante credenciales. El cliente ecuatoriano gestiona sus pedidos aquí.
+
+**Al registrarse, el sistema asigna automáticamente una Suite/casillero personalizado:**
+```
+150 N Day St, Suite [#CASILLERO], City of Orange, NJ 07050, EE.UU.
+Ejemplo: 150 N Day St, Suite EC-00345, City of Orange, NJ 07050
+```
+Esta dirección se muestra de forma destacada en el panel del cliente para que la use en sus compras en línea.
+
+**Funcionalidades:**
+- Registro y verificación de cuenta (correo + MFA)
+- Ver su **Suite/casillero asignado** con dirección completa y copiable
+- **Pre-alerta de compra (Gestión Documental):**
+ - El cliente notifica antes de que llegue el paquete: tienda, número de tracking del vendedor, valor, descripción
+ - Puede cargar la **factura comercial** (PDF, imagen) emitida por Amazon / eBay / tienda
+ - Esto permite a la bodega organizar y anticipar la llegada del paquete
+- Registrar una compra por:
+ - **Enlace (URL):** El sistema escanea el producto de Amazon u otra plataforma y pre-llena el formulario
+ - **Manual:** Nombre, descripción, valor declarado, tienda, cantidad, peso estimado
+- Ver **fotos del paquete** cuando éste llega a la bodega NJ
+- Ver cotización de envío con desglose por categoría SENAE antes del pago
+- Pagar el costo de envío anticipadamente
+- Ver historial de pedidos con **ID de Tracking único**
+- Seguimiento en tiempo real del estado del paquete
+- Notificaciones por correo / SMS / WhatsApp en cada etapa
+
+---
+
+### 4.3 Portal de Bodega (New Jersey, EE.UU.)
+
+Usado por los operadores físicos en la bodega de **150 N Day St, City of Orange, NJ**.
+
+**Funcionalidades:**
+- Ver paquetes esperados con pre-alertas enviadas por los clientes
+- Registrar llegada de paquete (escaneo de código de barras o QR)
+- Ver las facturas y documentos cargados por el cliente en la pre-alerta
+- Confirmar y corregir:
+ - Peso real (báscula)
+ - Dimensiones (largo, ancho, alto)
+ - **Fotos del paquete** (se sincronizan con el portal del cliente)
+- Alertar discrepancias entre peso declarado y real (diferencia > 10%)
+- Asignar paquete a su Suite/casillero correspondiente
+- Sincronización en tiempo real vía API con el software propio de bodega
+- Generar orden de despacho hacia Ecuador
+
+---
+
+### 4.4 Portal Administrativo
+
+Usado por Admin Empresa y Super Admin.
+
+**Funcionalidades:**
+- Dashboard con métricas: paquetes en tránsito, recibidos, enviados, con problemas
+- Gestión de usuarios y roles
+- Configuración de tarifas: precio por libra/kg, por zona geográfica en Ecuador
+- Gestión de bodegas (múltiples posibles)
+- Reportes: ingresos, volumen de envíos, tiempo promedio de entrega
+- Logs de auditoría (quién hizo qué y cuándo)
+- Configuración de notificaciones automáticas
+
+---
+
+### 4.5 Módulo de Integración con Aduanas (SENAE)
+
+**Funcionalidades:**
+- Generación automática de la **Declaración Simplificada de Importación (DSI)**
+- Cálculo automático de impuestos (fodinfa, IVA, arancel) según tabla SENAE
+- Envío electrónico de la declaración a la SENAE vía WebService oficial
+- Recepción de respuesta / número de autorización SENAE
+- Almacenamiento del documento aduanero asociado al tracking ID
+- Alerta si el valor del paquete supera el umbral de importación simplificada ($400 USD)
+
+---
+
+### 4.6 Módulo de Tracking en Tiempo Real
+
+Cada paquete tendrá un **ID de Tracking único** generado automáticamente al registrar la compra o la pre-alerta.
+
+**Formato sugerido:** `EC-YYYYMMDD-XXXXXX`
+Ejemplo: `EC-20260506-082341`
+
+El cliente puede buscar el estado de su paquete ingresando el Tracking ID en la landing page (sin necesidad de iniciar sesión) o en su panel de usuario.
+
+**Estados del paquete:**
+
+| # | Estado | Descripción |
+|---|-------------------------------|----------------------------------------------------------|
+| 1 | `REGISTRADO` | El cliente registró la compra en el sistema |
+| 2 | `EN_TRANSITO_BODEGA` | El pedido fue despachado por el vendedor hacia la bodega |
+| 3 | `RECIBIDO_BODEGA` | La bodega confirmó la recepción del paquete |
+| 4 | `EN_VERIFICACION` | El operador está pesando y revisando el paquete |
+| 5 | `VERIFICADO` | Peso y dimensiones confirmados, pago aplicado |
+| 6 | `DECLARACION_ADUANERA` | Declaración enviada a la SENAE |
+| 7 | `EN_TRANSITO_ECUADOR` | El paquete viaja desde EE.UU. hacia Ecuador |
+| 8 | `EN_ADUANA_ECUADOR` | El paquete está en proceso aduanero en Ecuador |
+| 9 | `LISTO_ENTREGA` | Paquete aprobado por aduana, listo para entrega |
+|10 | `ENTREGADO` | Paquete entregado al cliente final |
+|11 | `INCIDENCIA` | Problema reportado (daño, pérdida, retención en aduana) |
+
+---
+
+### 4.7 Módulo de Pre-alerta y Gestión Documental
+
+Permite al cliente avisar con anticipación sobre paquetes en camino hacia la bodega.
+
+**Formulario de pre-alerta:**
+- Tienda / plataforma de compra (Amazon, eBay, etc.)
+- Número de tracking del vendedor (ej: 1Z999AA10123456784 de UPS)
+- Descripción del producto
+- Valor declarado ($USD)
+- Carga de factura comercial (PDF o imagen)
+- Fecha estimada de llegada a la bodega
+
+**Resultado:**
+- La bodega recibe la pre-alerta y organiza el espacio
+- El sistema crea un registro asociado al Tracking ID interno
+- Cuando el paquete llega, el operador lo vincula a la pre-alerta existente
+
+---
+
+### 4.8 Servicio de Carga Pesada / Pallets (B2B)
+
+Diferenciado del casillero, este módulo atiende a importadores mayoristas.
+
+**Características:**
+- Flujo NO automatizado — requiere cotización especial
+- Formulario de "Solicitud de Cotización" con:
+ - Tipo de mercancía (ej: calzado al por mayor)
+ - Cantidad / peso estimado / número de pallets
+ - Valor comercial total
+ - Puerto/ciudad de origen en EE.UU.
+ - Destino en Ecuador
+ - Datos de contacto del importador
+- Verificación de cumplimiento de normas **INEN** (especialmente para calzado, textiles)
+- El equipo de Moraworld responde con cotización personalizada
+- Una vez aceptada, se genera un expediente con ID de seguimiento propio
+
+**Nota INEN:** Los productos que requieren certificación INEN (ej: calzado, productos eléctricos) deben declararse con el número de registro de certificación correspondiente en la declaración aduanera.
+
+---
+
+## 5. Flujos de Usuario
+
+### 5.1 Flujo del Cliente Final (Servicio Casillero)
+
+```
+[1] Accede a la Landing Page
+ │
+ ▼
+[2] Se registra / inicia sesión
+ (Correo + contraseña + MFA)
+ │
+ ▼
+[3] El sistema asigna automáticamente su Suite personalizada:
+ 150 N Day St, Suite EC-00345, City of Orange, NJ 07050
+ │
+ ▼
+[4] Hace su compra en Amazon / otra tienda,
+ usando la dirección de la Suite como destino
+ │
+ ▼
+[5A] OPCIONAL — Pre-alerta:
+ El cliente vuelve al portal y crea una pre-alerta:
+ - Tracking del vendedor, valor, descripción
+ - Carga la factura comercial de Amazon/eBay
+ → La bodega ya sabe que ese paquete viene
+ │
+ ▼
+[5B] Registra formalmente su compra en el portal:
+ ┌────────────────────────────┐
+ │ OPCIÓN A: Pega el enlace │──► El sistema escanea el producto:
+ │ de Amazon / tienda │ nombre, foto, precio, peso estimado
+ └────────────────────────────┘
+ ┌────────────────────────────┐
+ │ OPCIÓN B: Ingreso manual │──► Llena: nombre, descripción, valor,
+ │ │ tienda, cantidad, peso estimado
+ └────────────────────────────┘
+ │
+ ▼
+[6] El sistema calcula el costo de envío:
+ Peso (lbs/kg) × tarifa + seguro + tasas aduaneras estimadas
+ │
+ ▼
+[7] El cliente revisa y ACEPTA el costo
+ │
+ ▼
+[8] Realiza el PAGO del envío (en línea)
+ │
+ ▼
+[9] El sistema genera el TRACKING ID y confirma por correo
+ │
+ ▼
+[10] El cliente recibe notificaciones en cada cambio de estado
+ vía: correo, SMS y/o WhatsApp
+ │
+ ▼
+[11] Seguimiento en tiempo real desde el portal o la landing page
+ (ingresando el Tracking ID sin necesidad de login)
+ │
+ ▼
+[12] Recibe el paquete en Ecuador
+```
+
+---
+
+### 5.5 Flujo del Importador Mayorista (Carga Pesada B2B)
+
+```
+[1] Accede a la landing page, sección "Carga Pesada / Pallets"
+ │
+ ▼
+[2] Llena el formulario de "Solicitud de Cotización Especial":
+ - Tipo de mercancía, cantidad, peso, valor
+ - Verificación INEN si aplica (calzado, electrónicos, etc.)
+ │
+ ▼
+[3] El equipo Moraworld revisa y prepara cotización
+ │
+ ▼
+[4] El importador recibe la cotización por correo o WhatsApp
+ │
+ ▼
+[5] Si acepta → se crea expediente con ID de seguimiento B2B
+ │
+ ▼
+[6] Coordinación de embarque, documentos aduaneros,
+ certificación INEN, DAS o DAI según corresponda
+ │
+ ▼
+[7] Seguimiento del embarque hasta entrega en Ecuador
+```
+
+---
+
+### 5.2 Flujo del Operador de Bodega
+
+```
+[1] Inicia sesión en el Portal de Bodega
+ │
+ ▼
+[2] Ve la lista de paquetes esperados (con sus tracking IDs)
+ │
+ ▼
+[3] Llega un paquete físico a la bodega
+ │
+ ▼
+[4] Escanea el código del paquete o busca manual
+ │
+ ▼
+[5] Confirma recepción → Estado cambia a RECIBIDO_BODEGA
+ │
+ ▼
+[6] Verifica el paquete:
+ - Pesa en báscula (peso real)
+ - Mide dimensiones
+ - Toma fotos
+ - Compara con lo declarado por el cliente
+ │
+ ┌───┴────────────────────────────────┐
+ │ │
+[7A] Sin discrepancia [7B] Hay discrepancia (>10%)
+ │ │
+ ▼ ▼
+Estado: VERIFICADO Notificación al Admin y cliente
+ │ Se cobra diferencia o se ajusta
+ │ │
+ └──────────────┬─────────────────────┘
+ │
+ ▼
+[8] Asigna paquete a envío consolidado o individual
+ │
+ ▼
+[9] Genera orden de despacho hacia Ecuador
+```
+
+---
+
+### 5.3 Flujo del Agente Aduanero
+
+```
+[1] Inicia sesión en el Portal Administrativo
+ │
+ ▼
+[2] Ve paquetes con estado VERIFICADO
+ │
+ ▼
+[3] Revisa información del paquete:
+ - Descripción del producto
+ - Valor declarado
+ - Fotos
+ - Peso y dimensiones confirmados
+ │
+ ▼
+[4] Verifica que el valor esté dentro del límite
+ de importación simplificada ($400 USD)
+ │
+ ┌───┴──────────────────────┐
+ │ │
+[4A] Dentro del límite [4B] Supera el límite
+ │ │
+ ▼ ▼
+Sigue el proceso Notificación al cliente
+simplificado para proceso de importación
+ │ formal (diferente declaración)
+ │ │
+ └──────────┬───────────────┘
+ │
+ ▼
+[5] El sistema genera la Declaración Simplificada
+ de Importación (DSI) automáticamente
+ │
+ ▼
+[6] El agente revisa y APRUEBA la declaración
+ │
+ ▼
+[7] El sistema envía la DSI al WebService de la SENAE
+ │
+ ▼
+[8] SENAE devuelve número de autorización
+ │
+ ▼
+[9] Estado cambia a DECLARACION_ADUANERA
+ Notificación automática al cliente
+```
+
+---
+
+### 5.4 Flujo del Admin Empresa
+
+```
+[1] Inicia sesión en Portal Administrativo
+ │
+ ▼
+[2] Ve dashboard general:
+ - Paquetes por estado
+ - Ingresos del día/mes
+ - Alertas e incidencias
+ │
+ ├──► Gestiona usuarios y roles
+ ├──► Configura tarifas de envío
+ ├──► Genera reportes
+ ├──► Revisa logs de auditoría
+ └──► Gestiona configuración de bodega
+```
+
+---
+
+## 6. Flujos del Sistema
+
+### 6.1 Flujo de Registro de Compra (con enlace)
+
+```
+Cliente pega URL de Amazon
+ │
+ ▼
+Sistema hace scraping / llama API del producto
+(Amazon SP-API o equivalente)
+ │
+ ▼
+Extrae: nombre, descripción, precio, peso estimado, imagen
+ │
+ ▼
+Pre-llena el formulario de registro
+ │
+ ▼
+Sistema calcula costo de envío:
+ Peso (lbs) × tarifa_por_lb
+ + seguro (% del valor declarado)
+ + tasas aduaneras estimadas (FODINFA 0.5% + IVA 15%)
+ │
+ ▼
+Muestra resumen al cliente para confirmación
+ │
+ ▼
+Cliente confirma y paga
+ │
+ ▼
+Sistema genera Tracking ID único
+Sistema envía correo de confirmación
+Sistema actualiza estado → REGISTRADO
+```
+
+---
+
+### 6.2 Flujo de Calculadora Dinámica de Costos (SENAE)
+
+La calculadora estará disponible tanto en la **landing page** (acceso público) como dentro del portal del cliente.
+
+**Categorías de importación SENAE** (régimen 4x4 / simplificado):
+
+| Categoría | Descripción | Arancel | Observaciones |
+|-----------|---------------------------------------------------|:-------:|--------------------------------------|
+| **4x4** | Hasta 4 envíos/año, hasta $400 c/u y hasta 4 kg | 0% | Régimen simplificado sin arancel |
+| **Cat. B**| Bienes de consumo general fuera del 4x4 | 10% | + FODINFA + IVA |
+| **Cat. C**| Textiles, calzado, artículos del hogar | 20% | + FODINFA + IVA |
+| **Cat. D**| Electrónicos, equipos de telecomunicaciones | 0-15% | Puede requerir certificación INEN |
+
+**Variables de entrada:**
+```
+ - Peso declarado (lbs o kg)
+ - Dimensiones estimadas (para peso volumétrico)
+ - Valor declarado del producto ($USD)
+ - Categoría de producto (la calculadora sugiere la categoría)
+ - Destino en Ecuador (ciudad / zona)
+```
+
+**Fórmulas:**
+```
+ Peso a cobrar = MAX(peso_real, peso_volumétrico)
+ Peso_volumétrico = (largo × ancho × alto) / factor_dim (139 o 166)
+
+ Costo base de envío = Peso_a_cobrar × tarifa_zona
+ Seguro = valor_declarado × 0.02 (2% — configurable)
+
+ FODINFA = valor_declarado × 0.005 (0.5%)
+ Arancel = valor_declarado × % según categoría SENAE
+ IVA = (valor_declarado + FODINFA + Arancel) × 0.15
+
+ TOTAL = costo_envío + seguro + FODINFA + Arancel + IVA
+```
+
+**El sistema muestra el desglose completo al cliente antes de confirmar el pago.**
+
+---
+
+### 6.3 Flujo de Notificaciones Automáticas
+
+```
+Cambio de estado del paquete
+ │
+ ▼
+Sistema detecta el cambio en base de datos
+ │
+ ▼
+Dispara evento al motor de notificaciones
+ │
+ ├──► Correo electrónico (con detalle del estado)
+ ├──► SMS (resumen corto)
+ ├──► Notificación push en el portal web
+ └──► Mensaje de WhatsApp (vía WhatsApp Business API)
+```
+
+---
+
+### 6.4 Flujo de Seguridad y Auditoría (ISO 27001)
+
+```
+Cualquier acción en el sistema
+ │
+ ▼
+Se registra en Log de Auditoría:
+ - ID del usuario
+ - Rol
+ - Acción realizada
+ - Timestamp (UTC)
+ - IP de origen
+ - Recurso afectado (ej: Tracking ID)
+ │
+ ▼
+Log inmutable (no editable, ni por admins)
+ │
+ ▼
+Reportes de auditoría disponibles para Super Admin
+ │
+ ▼
+Alertas automáticas ante:
+ - Múltiples intentos de login fallidos
+ - Acceso desde IPs inusuales (geolocalización)
+ - Cambios masivos de datos
+```
+
+---
+
+## 7. Integraciones Externas
+
+| Integración | Propósito | Protocolo |
+|---------------------------|---------------------------------------------------------------------|-----------------|
+| Amazon SP-API | Obtener info del producto desde enlace (pre-llenar formulario) | REST API |
+| WebService SENAE | Enviar declaraciones simplificadas (DSI) / formales | SOAP / REST |
+| Pasarela de pagos | Cobro en línea (Stripe, PayPhone, PayPal, etc.) | REST API |
+| SMS Gateway | Notificaciones por SMS a clientes | REST API |
+| Servicio de correo | Notificaciones por email (SendGrid o AWS SES) | SMTP / REST |
+| Courier internacional | Estado de envío físico en EE.UU. (FedEx, DHL, UPS API) | REST API |
+| **WhatsApp Business API** | Notificaciones automáticas + botón flotante de contacto en la web | REST API |
+| **Software de bodega** | Sincronización en tiempo real de estados de tracking (propio) | REST API |
+| **Normas INEN** | Consulta de certificaciones para carga sujeta a reglamento técnico | REST API / Web |
+
+---
+
+## 8. Requerimientos No Funcionales
+
+| Requerimiento | Detalle |
+|----------------------|-----------------------------------------------------------------------|
+| Disponibilidad | 99.9% uptime (SLA) |
+| Tiempo de respuesta | < 2 segundos para operaciones normales |
+| Escalabilidad | Arquitectura multi-tenant preparada para múltiples empresas |
+| Seguridad | ISO/IEC 27001, OWASP Top 10, TLS 1.3, AES-256, MFA obligatorio |
+| Accesibilidad | 100% web, responsive, accesible desde cualquier dispositivo |
+| Respaldo de datos | Backups automáticos diarios, retención mínima 90 días |
+| Recuperación | RTO < 4 horas, RPO < 1 hora |
+| Auditoría | Todos los eventos registrados con trazabilidad completa |
+
+---
+
+## 9. Consideraciones Adicionales
+
+- **Identidad legal visible:** El sitio debe mostrar prominentemente que la operación está respaldada por dos empresas constituidas legalmente: Moraworld Imports S.A.S. (RUC Ecuador, Cuenca) y Mora Global Import LLC (New Jersey, EE.UU.).
+- **Representantes legales:** El botón de WhatsApp mostrará dos opciones de contacto: representante en NJ y representante legal en Cuenca.
+- **Protección de datos:** Los datos personales de clientes ecuatorianos están sujetos a la **Ley Orgánica de Protección de Datos Personales (LOPDP) de Ecuador** y, al procesarse en EE.UU., también a la normativa aplicable del estado de New Jersey.
+- **Umbral aduanero:** El régimen **4x4** aplica hasta 4 envíos por año, máximo $400 USD y 4 kg por envío. Todo paquete que exceda estos límites requiere proceso de importación formal (DAI).
+- **Categorías SENAE:** La calculadora debe actualizarse cuando el SENAE modifique las tablas arancelarias.
+- **Cumplimiento INEN:** Para carga pesada (calzado, textiles, electrónicos), verificar si el producto requiere Registro de Conformidad o Certificado INEN antes de importar.
+- **Consolidación:** El sistema soportará la consolidación de múltiples paquetes de un mismo cliente en un solo envío para optimizar costos.
+- **API propia de bodega:** El sistema se diseñará con una capa de integración que permita conectarse al software propietario de gestión de bodega en NJ.
+- **Multi-idioma:** Español e Inglés (para operadores en NJ).
+- **Zona horaria:** EST (New Jersey) y ECT (Ecuador) — el sistema mostrará los tiempos en la zona horaria del usuario.
+- **Estructura de navegación:** La web estará dividida claramente en dos servicios para no mezclarlos: **Casillero** y **Carga Pesada/Pallets**.
+
+---
+
+## 10. Estructura de Navegación del Sitio Web
+
+```
+main/
+├── / (Landing Page principal)
+│ ├── /como-funciona
+│ ├── /calculadora
+│ ├── /tarifas
+│ └── /quienes-somos (legalidad, RUC, permisos, representantes)
+│
+├── /casillero/ (Servicio B2C)
+│ ├── /casillero/como-usar
+│ ├── /casillero/calculadora
+│ └── /casillero/registro
+│
+├── /carga-pesada/ (Servicio B2B)
+│ ├── /carga-pesada/como-funciona
+│ ├── /carga-pesada/cotizacion ← Formulario de cotización especial
+│ └── /carga-pesada/inen ← Info sobre normas INEN
+│
+├── /tracking ← Búsqueda pública de paquete por Tracking ID
+│
+└── /portal/ (App autenticada)
+ ├── /portal/dashboard
+ ├── /portal/mi-casillero
+ ├── /portal/pre-alerta
+ ├── /portal/mis-paquetes
+ ├── /portal/calculadora
+ └── /portal/perfil
+```
+
+---
+
+*Documento generado el 6 de mayo de 2026 — Sujeto a revisión y validación con el cliente.*
+*Versión 1.1 — Merge con documento de objetivos sociales y funcionales de Moraworld Imports.*
diff --git a/turbo.json b/turbo.json
new file mode 100644
index 0000000..a10413c
--- /dev/null
+++ b/turbo.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://turbo.build/schema.json",
+ "tasks": {
+ "build": {
+ "dependsOn": ["^build"],
+ "outputs": ["dist/**", ".next/**", "!.next/cache/**"]
+ },
+ "dev": {
+ "cache": false,
+ "persistent": true
+ },
+ "lint": {
+ "dependsOn": ["^build"]
+ }
+ }
+}
diff --git a/txt.txt b/txt.txt
new file mode 100644
index 0000000..cb39fa0
--- /dev/null
+++ b/txt.txt
@@ -0,0 +1,34 @@
+Documento de Objetivos Sociales y Funcionales: Moraworld Imports S.A.S. y Mora Global Import LLC
+1. Misión del Proyecto Digital
+Establecer un ecosistema logístico transfronterizo que conecte físicamente la bodega en New Jersey con el mercado de Ecuador, ofreciendo soluciones automatizadas de casillero (B2C) y gestión de carga pesada (B2B).
+2. Objetivos Operativos (Acciones Requeridas)
+• Automatización de Identidad Logística: Al registrarse, el cliente debe recibir automáticamente su dirección personalizada: 150 N Day St, Suite [Número de Casillero], City of Orange, NJ 07050. Ejemplo!
+150 N Day St, Suite [Número de Casillero], City of Orange, NJ 07050.
+
+o Transparencia Tributaria: Implementar una calculadora que desglose el costo de flete y los impuestos de aduana en Ecuador según las categorías del SENAE (Categoría B/4x4, C, D, etc.).
+o Gestión Documental (Pre-alerta): Permitir que los usuarios carguen sus facturas comerciales de tiendas como Amazon o eBay antes de que el paquete llegue a la bodega.
+o Sincronización de Inventarios: El sistema debe estar preparado para conectarse vía API con el software de bodega para actualizar estados de rastreo (Tracking) en tiempo real.
+3. Objetivos Sociales y de Marca
+o Generación de Confianza: Destacar que somos una empresa constituida bajo las leyes de Ecuador (S.A.S.) y EE. UU. (LLC), con representantes legales visibles (Cuenca y New Jersey).
+o Accesibilidad: Facilitar canales de soporte directo (WhatsApp integrado) para asesoría en compras internacionales y cumplimiento de normas INEN (especialmente para carga de calzado al por mayor).
+
+2. Funcionalidades Clave
+La web incluya estos 4 módulos críticos:
+• Panel de Usuario (Casillero): Donde el cliente vea su "Suite" o número de casillero, suba sus facturas de compra y vea fotos de sus paquetes cuando lleguen a tu bodega en NJ.
+• Calculadora Dinámica: Una herramienta donde el usuario ponga el peso (libras) y el valor del producto, y la web le desglose automáticamente:
+o Costo del flete.
+o Impuestos estimados según la categoría de Aduana (4x4, Categoría C, etc.).
+• Sistema de Pre-alerta: Un formulario donde el cliente avise: "Compré unos zapatos en Amazon, el tracking es X y vale $100". Esto te permite a ti organizar tu bodega antes de que llegue el paquete.
+• Rastreo (Tracking) en Tiempo .Real: Un campo donde el cliente ponga su número de guía y vea si el paquete está "En Bodega NJ", "En Tránsito", "En Aduana Ecuador" o "Listo para entrega".
+3 La Integración con tu Software Propio
+Como planeas tener tu propio software, esto es lo más técnico que debes decirles:
+"La página web debe conectarse vía API con mi software de gestión de bodega. Necesito que el registro de la web cree un usuario en mi base de datos de logística de forma automática."
+
+4. Estructura de Navegación
+ La web debe estar dividida en dos grandes servicios para que no se mezclen:
+1. Servicio de Casillero: Para compras pequeñas (Amazon, eBay, ropa, tecnología).
+2. Servicio de Carga Pesada/Pallets: Para importadores mayoristas (como el caso de los 1,000 pares de zapatos). Aquí el flujo no es automático, sino un formulario de "Cotización Especial".
+5. Confianza y Contacto
+Para el mercado de Ecuador, la confianza es todo. Pide:
+• Botón de WhatsApp Flotante: Que dé la opción de hablar contigo en NJ o con tu padre (Representante Legal) en Cuenca.
+• Sección de Legalidad: Donde se muestre que son una empresa constituida (Moraworld Imports S.A.S.) con RUC y permisos de aduana.