UPGRADE.md dependency-debt table and PENDIENTE.md updated to reflect the 5 shipped phases and the two deferred sub-projects (react-leaflet 1.8->4 and the Bootstrap 4->5 CSS/JS jump), with rationale for each deferral. Final state: helmet/i18next/react-bootstrap/react-router warnings all gone from the console; only react-leaflet (deferred) and our own defaultProps/findDOMNode remain. REST smoke byte-identical.
5.4 KiB
Pendiente — web "Todos contra el fuego" (rama meteor3-wip)
Estado a 2026-07-18. La migración Meteor 1.6 → 3.1 + MongoDB 7 está completa
y verificada (server async, React 18, web renderiza, smoke REST byte-idéntico).
Lo que falta, agrupado. Ver UPGRADE.md para el detalle de lo ya hecho.
1. Modernización de librerías react-* antiguas (deuda de front grande)
Funcionan en React 18 por compatibilidad heredada, pero ensucian la consola en desarrollo (no en producción) y bloquean el salto a React 19. Estado:
| Lib | De → A | Estado |
|---|---|---|
| react-helmet | 5.2 → react-helmet-async 2 | ✅ hecho |
| react-i18next + i18next | 7.4/10.5 → 14/23 | ✅ hecho |
| react-bootstrap | 0.31 → 2 | ✅ hecho (CSS sigue en Bootstrap 4) |
| reactstrap + 3 deps muertas | — | ✅ eliminadas (0 usos) |
| react-router-dom | 4.2 → 6.30 | ✅ hecho (history 5, HOC withRouterCompat) |
| react-leaflet + leaflet | 1.8/1.3 → 4/1.9 | ⏸️ diferida (mapa = feature central; 4 plugins v1-only sin equivalente v4; ver UPGRADE.md) |
| Bootstrap CSS/JS | 4.1 → 5 | ⏸️ diferida (carrusel/navbar jQuery BS4; ver UPGRADE.md) |
Lo verificado en navegador tras cada lib: /, /fires, /fire/archive/<hex>,
/login, /subscriptions + consola. Los warnings de librería que bloqueaban
React 19 quedan reducidos a: react-leaflet (diferida) y código propio
(defaultProps en componentes función, un findDOMNode en blaze-react-component).
El smoke REST siguió byte-idéntico en cada paso.
2. Deuda funcional / de calidad de la web (independiente de prod)
- Comentarios (feature React nueva): verificación manual en staging. No la cubre el smoke. Probar en una página de fuego: publicar/editar/borrar, like/dislike, embed de imagen y YouTube, y el email a otros comentaristas.
FireContainerusaFiresCollection.findOne()sin selector (imports/ui/pages/Fires/Fires.js): puede devolver un doc de una suscripción previa. Endurecer filtrando por el_idde la URL. (Preexistente, no bloquea, pero conviene antes de prod.)- Suite de tests sin runner. El stack de test (meteortesting:mocha, chai…)
se eliminó en la migración 2.x (arrastraba coffeescript que crasheaba el build).
Quedan tests Jest en
test/(rest.test.js,email.test.js, …) ynpm test → jest, pero hay que verificar/actualizar que pasan sobre el código async de Meteor 3. Hoy la ÚNICA red automática essmoke/. - Rate-limit de publications pendiente (
imports/startup/server/api.js:18). - Google Maps se carga sin
loading=async(aviso de rendimiento); el loadergoogle-mapsnpm es viejo → valorar el loader async moderno. - i18n de cuentas (
meteor-accounts-t9n, T9n): paquete antiguo aún usado (Login, VerifyEmail, i18n). Verificar que funciona en Meteor 3; traducción gallega (gl) incompleta (varios TODO eni18n.js). - Salto Bootstrap 4→5 (CSS/JS) pendiente: react-bootstrap ya está en v2 y
corre sobre el CSS Bootstrap 4 actual (
alexwine:bootstrap-4) con un único shim.form-labelenforms.scss. El salto a Bootstrap 5 npm está diferido porque el carrusel del home (bootstrap-carousel-swipe, jQuery/BS4) y el collapse del navbar dependen del JS jQuery de BS4 (data-toggle,data-slide). Al hacerlo: importarbootstrap@5SCSS+JS, reescribir el carrusel (BS5 trae swipe nativo → quitar el plugin),data-toggle→data-bs-toggle,ml-auto→ms-auto, revisarnew-age.scss/custom.scss/bootstrap-overrides.scss. - Limpieza menor: migración 217
// TODO remove falsepositives lowercase collection;prerender.jsgating comentado; sección per-fire del sitemap eliminada (era código muerto trasfiresMapEnabled=false).
3. Observabilidad (Sentry/GlitchTip) — casi cerrado
- ✅ Server-side reporta a GlitchTip; ✅ cliente vía túnel
/sentry-tunnel(esquiva el 503 de Cloudflare). DSN ensettings-development.json(gitignored). - Pendiente: poner el DSN en el
METEOR_SETTINGSde producción y confirmar que el servidor de prod alcanza GlitchTip (IPv4). Nota: el túnel es un relay acotado al proyecto propio (aceptable, documentado). - Consola de dev: warnings de librería restantes solo se van con el punto 1.
4. Cutover a producción (infra — fase 3, es lo grande)
- Migrar datos Mongo 3.2 → 7 (mongodump/restore) en el servidor real.
- Desplegar el stack (Docker) al servidor limpio vía el ansible de
Comunes — NO al viejo shiva. Ver
RUNBOOK.md(stack compose local validado). - Coordinar orden con notificaciones: la web NO debe desplegarse antes de que
el microservicio
tcef-notificationsemita en prod (si no, los usuarios dejan de recibir avisos). Ver dependencia enUPGRADE.md. - Secretos de prod (
METEOR_SETTINGS, no el fichero gitignored), cron del GeoLite2 City (MaxMind) en el nuevo host, proxy/TLS por el ansible compartido.
5. Fuera del repo web (bloquean el "hecho" global, pistas aparte)
- tcef-notifications: rollout por canal shadow→canary→full (FCM en canary superado; email y telegram pendientes) y redeploy del servicio actualizado.
- App móvil
fires_flutter: republicación en Play Store.
Regla de trabajo en todo lo anterior: commits locales atómicos en meteor3-wip,
smoke REST byte-idéntico tras cada cambio, verificación visual en navegador,
y NUNCA git push.