Skip to content

Frontends: dependencias y configuración ​

Dependencias comunes ​

Presentes en los siete frontends, con la misma versión.

PaqueteVersiónUso
vue3.5.32Framework de interfaz
vue-router5.0.4Enrutamiento
pinia3.0.4Estado global
@vueuse/core14.3.0Composables utilitarios
tailwindcss4.3.0Estilos por clases utilitarias
@tailwindcss/vite4.3.0Integración de Tailwind con Vite
reka-ui2.9.8Componentes accesibles sin estilo (base de shadcn-vue)
class-variance-authority0.7.1Variantes de estilos de componentes
clsx · tailwind-merge2.1.1 · 3.6.0Combinación de clases CSS
@lucide/vue1.16.0Iconos

Dependencias por función ​

PaqueteVersiónUsoProyectos
@apollo/client · @vue/apollo-composable · @vue/apollo-util3.11.8 · 4.2.1 · 4.2.2Cliente GraphQLTodos excepto auth-authorization-frontend
graphql · graphql-tag16.12.0 · 2.12.6Definición de operaciones GraphQLÍdem
apollo-upload-client18.0.1Subida de archivos por GraphQLÍdem
date-fns4.3.0Manejo de fechasÍdem
vee-validate · @vee-validate/zod · zod4.15.1 · 4.15.1 · 4.6.7Validación de formulariosTodos excepto auth-authorization-frontend y la estación
@embedpdf/* (core, engines y plugins)2.14.4Visor de PDF embebidofrontend-public-auth y los tres portales del SPS
js-sha10.7.0Hash SHA-1 en el clientefrontend-public-auth y los tres portales del SPS
@tiptap/* (vue-3, starter-kit, pm y extensiones)3.33.1Editor de texto enriquecidoLos tres portales del SPS
@tiptap/extension-mention3.33.1Menciones en el editorPortales administrativo y de comisiones
tiptap-pagination-plus3.1.0Paginación en el editorPortal administrativo
echarts6.1.0GráficosPortales administrativo y de comisiones

auth-authorization-frontend no usa GraphQL de forma general: consume los endpoints REST del flujo de login con Fetch.

Herramientas de desarrollo ​

PaqueteVersiónUso
vite8.3.8Servidor de desarrollo y empaquetado
@vitejs/plugin-vue6.0.6Soporte de componentes .vue
vite-plugin-vue-devtools8.1.1Vue DevTools integradas en desarrollo
eslint · @eslint/js · eslint-plugin-vue · globals10.2.1 · 10.0.1 · 10.8.0 · 17.5.0Linter
oxlint · eslint-plugin-oxlint1.60.0Linter rápido (se ejecuta antes de ESLint)
prettier · eslint-config-prettier3.8.3 · 10.1.8Formato de código
npm-run-all28.0.4Ejecución de scripts lint:* en serie
tw-animate-css1.4.0Animaciones para Tailwind
@types/node25.9.1Tipos de Node para el editor
cypress · eslint-plugin-cypress · start-server-and-test15.16.0 · 6.3.1 · 3.0.5Pruebas end-to-end (solo auth-frontend-admin)

Componentes de interfaz (shadcn-vue) ​

Los componentes de src/components/ui/ siguen shadcn-vue: su código fuente vive en el repositorio (no es una librería instalada) y se construye sobre Reka UI y Tailwind. La configuración está en components.json (estilo new-york, iconos lucide, CSS en src/assets/css/tailwind.css).

Configuración de Tailwind CSS ​

Los frontends usan Tailwind CSS v4 sin archivo tailwind.config.js. Toda la integración se reparte entre el plugin de Vite y la hoja de estilos principal:

  1. Plugin en vite.config.js: se registra @tailwindcss/vite junto al plugin de Vue:

    js
    import { defineConfig } from 'vite'
    import tailwindcss from '@tailwindcss/vite'
    import vue from '@vitejs/plugin-vue'
    
    export default defineConfig({
       plugins: [vue(), tailwindcss()],
    })
  2. Hoja de estilos en src/assets/css/tailwind.css (importada desde src/main.js y referenciada por components.json):

    • Carga Tailwind v4 y animaciones con @import 'tailwindcss'; y @import 'tw-animate-css';, además de la variante oscura @custom-variant dark (&:is(.dark *));.
    • Define las variables CSS del tema en :root y .dark (paleta --background, --foreground, --primary, --secondary, --muted, --accent, --destructive, --border, --chart-*, --sidebar-*, tipografías --font-sans / --font-serif / --font-mono, radios y sombras).
    • Expone esos tokens como utilidades de Tailwind mediante @theme inline (--color-primary: var(--primary), --radius-*, --shadow-*) y aplica los estilos base en @layer base (border-border, bg-background text-foreground).

Variables de entorno ​

Las variables VITE_* se definen en .env (plantilla .env.example) y se incrustan en el bundle al compilar. La lista por proyecto está en Imágenes Docker.

VariableDescripción
VITE_TITLE_APPTítulo de la aplicación
VITE_API_ENDPOINTURL base del backend
VITE_API_ENDPOINT_PATHPath del schema GraphQL (por ejemplo /admin-schema/)
VITE_API_ENDPOINT_FILESURL base de archivos públicos
VITE_API_FILES_PRIVATEURL base de archivos privados
VITE_AUTH_ORIGIN_PORTALPortal de origen enviado al iniciar sesión (por ejemplo PORTAL_ADMINISTRATIVO)
VITE_AUTH_PUBLIC_URLURL del portal de cuenta del IDP ("Mi cuenta")
VITE_LOGIN_REDIRECT_URLURL del portal de login del IDP (el logout usa <url>/logout)
VITE_PUBLIC_AUTH_PORTAL · VITE_ADMIN_AUTH_PORTALURLs de los portales del IDP
VITE_DOMAIN_PUBLIC_URLSe recibe en el build; sin uso en el código actual
VITE_JACOBITUS_API_URLURL del servicio Jacobitus (firma digital con token)
VITE_MANUAL_TECNICO_URL · VITE_MANUAL_USUARIO_URLEnlaces a los manuales

Scripts y ejecución local ​

sh
corepack enable pnpm
pnpm install
cp .env.example .env   # completar valores
pnpm run dev
ScriptAcción
pnpm run devServidor de desarrollo
pnpm run buildBuild de producción en dist/
pnpm run previewSirve el build localmente
pnpm run lintOxlint + ESLint con corrección automática
pnpm run formatPrettier sobre src/
pnpm run test:e2ePruebas Cypress (solo auth-frontend-admin)

Dominios locales para desarrollo ​

Para levantar los frontends en modo desarrollo usando dominios locales (en lugar de acceder directamente por localhost:<puerto>), se requiere combinar tres configuraciones: permitir el host en Vite, registrarlo en el archivo hosts del sistema y redirigir el tráfico mediante un proxy inverso local como Caddy (o herramientas similares como Nginx o Traefik).

1. Hosts permitidos en vite.config.js ​

Vite bloquea peticiones cuyo encabezado Host no sea localhost a menos que estén declarados en server.allowedHosts:

js
export default defineConfig({
   // ...
   server: {
      allowedHosts: ['mi-portal-local.ejemplo.bo'],
   },
})

2. Registro en el archivo hosts ​

En el archivo hosts del sistema operativo (/etc/hosts en Linux/macOS o C:\Windows\System32\drivers\etc\hosts en Windows), debes agregar el dominio apuntando a 127.0.0.1:

text
127.0.0.1 mi-portal-local.ejemplo.bo

3. Proxy inverso con Caddy (o similar) ​

En un archivo de configuración como ~/caddy/Caddyfile, redirige el dominio local hacia el puerto en el que corre pnpm run dev (puedes hacer el equivalente con Nginx, Traefik u otro proxy inverso):

text
mi-portal-local.ejemplo.bo {
   reverse_proxy localhost:9090
}

Luego inicia Caddy apuntando a ese archivo de configuración y levanta el frontend con pnpm run dev:

sh
caddy run --config ~/caddy/Caddyfile

Puertos y hosts por proyecto ​

Referencia de puertos (package.json) y server.allowedHosts (vite.config.js) configurados en cada frontend:

FrontendPuertoHost local
auth-authorization-frontend8080login-auth-eje-local.app.com.bo
auth-frontend-admin7070admin-auth-eje-local.app.com.bo, auth-admin-eje-local.app.com.bo
frontend-public-auth9092auth-public-eje-local.app.com.bo
frontend-portal-admin-seleccion-postulantes9090admin-portal-seleccion-eje-local.app.com.bo
frontend-portal-postulantes-seleccion-postulantes9091postulantes-portal-seleccion-eje-local.app.com.bo
frontend-portal-comisiones-seleccion-postulantes9093comisiones-portal-seleccion-eje-local.app.com.bo
frontend-estacion-examen9094estacion-examen-eje-local.app.com.bo