macro/route.ts :
- Eurostat EUR CPI : ajout unit=RCH_MOM, freq=M pour que chaque dimension
ait une seule valeur → position value[]=timeIndex correcte (bug de mapping
multi-dimensionnel corrigé)
- Eurostat EUR GDP : passage de CLV10_MEUR (niveaux) à CLV_PCH_PRE (QoQ%
directement) + toIndicator au lieu de toIndicatorPct
- Eurostat EUR chômage : ajout freq=M pour unicité de dimension
- eurostatSorted : fallback automatique EA20 → EA19 si données vides
- BoE (GBP taux) : ajout User-Agent + Accept → évite la redirection HTML
- PMI : ForexFactory JSON (semaine courante, données structurées) en source
primaire + TE scraping enrichi (Accept, Sec-Fetch-*, Pragma) en fallback
- toPmiIndicator : extrait en fonction globale réutilisable
CurrencyCard.tsx :
- Préservation des valeurs PMI précédentes du cache localStorage si le
serveur renvoie null (PMI publié le mois dernier, pas cette semaine)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Client — lib/localCache.ts (nouveau) :
- saveCache / loadCache : wrapper localStorage préfixé "forex_v1_"
- formatCacheDate : affiche l'âge du cache (< 1h, 2h, 3j…)
Client — CurrencyCard.tsx :
- Sauvegarde chaque réponse macro réussie dans localStorage (clé macro_{currency})
- Si l'API échoue → charge la dernière valeur connue depuis localStorage
- Badge 🗄 "cache Xh" visible dans le header de la carte quand données stale
Client — page.tsx :
- Même logique pour drivers, expectations, yields
- Badge cache affiché dans le header à côté de l'heure
- Footer : Bytez → Groq
Serveur — macro/route.ts :
- stale-if-error : si tous les indicateurs reviennent null (panne API)
et qu'un cache serveur précédent existe → le renvoie avec stale:true
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>