Application web pour le Fonds de Prévention des Risques liés au Retrait-Gonflement des Argiles (RGA).
- Node.js 22.x
- pnpm 10.13.1
- Git pour cloner le repository
git clone https://github.com/MTES-MCT/fonds-prevention-argile
cd fonds-prevention-argile
pnpm installCopiez le fichier .env.example vers .env.local :
cp .env.example .env.localConfigurez les variables selon votre environnement. Les principales variables incluent :
NODE_ENV: Environnement d'exécution (developmentouproduction)NEXT_PUBLIC_MATOMO_SITE_ID: ID Matomo pour l'analyticsNEXT_PUBLIC_MATOMO_URL: URL de l'instance MatomoDEMARCHES_SIMPLIFIEES_GRAPHQL_API_KEY: Clé d'API pour récupérer les informations de la plateforme Démarches Simplifiées via GraphQLDEMARCHES_SIMPLIFIEES_GRAPHQL_API_URL: URL de l'API GRAPHQL de la plateforme Démarches SimplifiéesDEMARCHES_SIMPLIFIEES_REST_API_URL: URL de l'API Rest de la plateforme Démarches SimplifiéesDEMARCHES_SIMPLIFIEES_ID_DEMARCHE: Identifiant de la démarche liée au Fonds prévention argile dans la plateforme Démarches SimplifiéesDEMARCHES_SIMPLIFIEES_NOM_DEMARCHE: Nom de la démarche liée au Fonds prévention argile dans la plateforme Démarches Simplifiées
pnpm start:devL'application sera disponible sur http://localhost:3000
| Commande | Description |
|---|---|
pnpm start:dev |
Lance le serveur de développement |
pnpm build |
Construit l'application pour la production |
pnpm start |
Démarre le serveur de production |
pnpm lint |
Vérifie le code avec ESLint |
pnpm typecheck |
Vérifie les types TypeScript |
pnpm test |
Lance les tests unitaires |
pnpm test:watch |
Lance les tests en mode watch |
pnpm test:coverage |
Lance les tests avec couverture |
pnpm format |
Formate le code avec Prettier |
pnpm validate |
Lance toutes les vérifications (types, lint, tests) |
pnpm clean |
Nettoie le cache Next.js |
pnpm fresh |
Réinstallation complète des dépendances |
# Lancer les tests une fois
pnpm test
# Mode watch pour le développement
pnpm test:watch
# Avec rapport de couverture
pnpm test:coverage
# Interface graphique des tests
pnpm test:uipnpm validateCette commande exécute :
- Vérification des types TypeScript
- Linting avec ESLint
- Tests unitaires
pnpm ciInstalle les dépendances avec lockfile et lance la validation complète.
src/
├── app/ # Pages et routes Next.js (App Router)
│ ├── accessibilite/
│ ├── admin/
│ ├── connexion/
│ ├── dashboard/
│ ├── mentions-legales/
│ ├── simulateur/
│ └── statistiques/
├── components/ # Composants React réutilisables
│ ├── DsfrProvider/ # Provider DSFR
│ ├── Header/
│ ├── Footer/
│ └── Matomo/ # Analytics
├── content/ # Contenus textuels (wording) de l'application
│ ├── accessibilityPage.json # Textes page accessibilité
│ ├── components.json # Textes composants réutilisables
│ ├── connexion.json # Textes page connexion
│ ├── homePage.json # Textes page d'accueil
│ ├── layout.json # Textes layout (header, footer)
│ ├── legalNoticePage.json # Textes mentions légales
│ ├── notFoundPage.json # Textes page 404
│ ├── simulationPage.json # Textes page simulateur
│ ├── statisticsPage.json # Textes page statistiques
│ └── index.ts # Export centralisé
├── hooks/ # Hooks React personnalisés
├── lib/ # Utilitaires et configuration
│ ├── api/ # Clients API (Démarches Simplifiées)
│ ├── config/ # Configuration environnement
│ └── utils/ # Fonctions utilitaires
├── page-sections/ # Sections spécifiques aux pages
│ └── home/ # Sections page d'accueil
├── styles/ # Styles globaux et fonts
└── types/ # Types TypeScript (si nécessaire)
Le dossier src/content/ contient tous les textes de l'application sous forme de fichiers JSON. Cette architecture permet :
- Modification facile des textes : Les contenus peuvent être modifiés sans toucher au code React
- Centralisation : Tous les textes sont regroupés au même endroit
- Collaboration simplifiée : Les contributeurs non-techniques peuvent proposer des modifications via des Pull Requests sur ces fichiers JSON uniquement
- Maintenabilité : Séparation claire entre la logique d'affichage et le contenu éditorial
Chaque fichier JSON correspond à une page ou un groupe de composants : Exemple : homePage.json
{
"hero": {
"title": "Fonds de prévention des risques liés au retrait-gonflement des argiles",
"subtitle": "Protégez votre logement contre les effets de la sécheresse",
"description": "Le service public qui vous accompagne..."
},
"sections": {
"whatIsRGA": {
"title": "Qu'est-ce que le RGA ?",
"content": "Le retrait-gonflement des argiles..."
}
}
}Pour modifier un texte de l'application :
- Identifiez le fichier JSON correspondant dans
src/content/ - Modifiez le texte souhaité
- Créez une Pull Request avec vos modifications
- Les modifications seront visibles après le déploiement
Note pour les contributeurs : Il n'est pas nécessaire de connaître React ou TypeScript pour modifier les contenus textuels. Seuls les fichiers JSON dans le dossier
/content/doivent être édités.
- Next.js 15.x - Framework React avec App Router
- React 19.x - Bibliothèque UI
- TypeScript 5.x - Typage statique
- Tailwind CSS 4.x - Framework CSS utilitaire
- DSFR 1.14.x - Design System de l'État
- Vitest - Tests unitaires
- Matomo - Analytics
pnpm build
pnpm startBuild et lancement avec Docker Compose :
docker-compose up --build# Nettoyer le cache Next.js
pnpm clean
# Réinstallation complète
pnpm fresh- Variables d'environnement manquantes : Vérifiez que
.env.localexiste et contient toutes les variables requises - Erreurs TypeScript : Lancez
pnpm typecheckpour identifier les problèmes - Tests qui échouent : Utilisez
pnpm test:watchpour débugger
Le projet utilise Husky pour automatiser les vérifications avant chaque commit :
- Installation automatique lors du
pnpm install - Exécute les validations définies dans
.husky/pre-commit - Empêche les commits si les tests ou le linting échouent
Talisman protège contre la fuite accidentelle de secrets dans le code :
# Vérifier manuellement tout le repository
pnpm talisman:check
# Exécuté automatiquement avant chaque commit
pnpm precommitConfiguration dans .talismanrc pour les exceptions et les fichiers à ignorer.
Important : Ne jamais contourner Talisman sans vérification. Si un fichier est bloqué, vérifiez qu'il ne contient pas de données sensibles avant de l'ajouter aux exceptions.
Le simulateur RGA peut être intégré en iframe sur des sites partenaires. Lorsque l'utilisateur termine sa simulation, il doit être redirigé vers notre page de connexion pour créer son compte. Problème : window.open() crée un nouveau contexte avec un localStorage vide, les données de la simulation sont donc perdues.
Flow en mode embed :
1. Iframe → Simulation terminée
└─ Chiffrement AES-256-GCM côté serveur (Server Action)
└─ URL générée : /connexion#d=abc123:def456:ghi789...
2. Nouvel onglet → Page /connexion
└─ Déchiffrement des données (Server Action)
└─ Sauvegarde en localStorage
└─ Nettoyage de l'URL (hash fragment)
3. Après connexion FranceConnect
└─ Migration automatique localStorage → Base de données
└─ Nettoyage du localStorage
Sécurité :
- ✅ Chiffrement AES-256-GCM avec clé secrète côté serveur
- ✅ Hash fragment (
#d=...) jamais envoyé au serveur - ✅ URL nettoyée immédiatement après lecture
- ✅ Données temporaires uniquement
Fichiers concernés :
src/features/simulateur-rga/services/encryption.service.ts- Service de chiffrement/déchiffrementsrc/features/simulateur-rga/actions/encrypt-rga-data.actions.ts- Server Action chiffrementsrc/features/simulateur-rga/actions/decrypt-rga-data.actions.ts- Server Action déchiffrementsrc/features/simulateur-rga/components/SimulateurClient.tsx- Gestion mode embedsrc/features/parcours/core/context/ParcoursProvider.tsx- Déchiffrement et migration BDD
Variables d'environnement :
# Clé de chiffrement (32 bytes en hexadécimal - 64 caractères)
# Générer avec : node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
RGA_ENCRYPTION_KEY=a1b2c3d4e5f6...Note : En mode normal (sans iframe), les données transitent directement via localStorage sans passer par l'URL, le chiffrement n'est donc pas utilisé.
- Créez une branche pour votre fonctionnalité
- Assurez-vous que
pnpm validatepasse sans erreurs - Formatez votre code avec
pnpm format - Créez une Pull Request avec une description claire
Note : Les hooks Husky et Talisman s'exécutent automatiquement lors du commit pour garantir la qualité et la sécurité du code.
Si vous souhaitez uniquement modifier des textes de l'application :
- Créez une branche pour vos modifications
- Éditez les fichiers JSON dans
src/content/ - Créez une Pull Request en décrivant les changements apportés
- Aucune connaissance technique n'est requise pour ce type de contribution
Ce projet applique des mesures de protection contre les attaques de type supply chain (ex: shai-hulud).
| Option | Valeur | Protection |
|---|---|---|
ignore-scripts |
true |
Bloque l'exécution automatique des scripts postinstall, preinstall, etc. Empêche l'exécution de code malveillant lors de l'installation |
auto-install-peers |
false |
Désactive l'installation automatique des peer dependencies, évitant l'ajout silencieux de packages non audités |
| Option | Valeur | Protection |
|---|---|---|
savePrefix |
~ |
Limite les mises à jour automatiques aux versions patch uniquement (ex: 5.1.x). Évite les breaking changes inattendus |
minimumReleaseAge |
10080 |
Refuse les packages publiés depuis moins de 7 jours. Laisse le temps à la communauté de détecter des versions compromises |
trustPolicy |
no-downgrade |
Empêche la republication d'une version existante avec un contenu différent (attaque par remplacement) |
onlyBuiltDependencies |
whitelist | Seuls les packages listés peuvent exécuter des scripts de build natifs. Tous les autres sont bloqués |
@next/swc-*: Compilateur SWC de Next.js (binaires Rust)esbuild: Bundler (binaire Go)sharp: Traitement d'images (bindings C++)