Développement
Gestionnaire de paquets : npm (.npmrc avec legacy-peer-deps=true pour
le conflit de peer de openapi-typescript vs TypeScript 6 — à conserver).
Commandes
Section intitulée « Commandes »npm install # installation (reproductible grâce à package-lock.json)npm run dev # serveur de dev sur http://localhost:3000npm run typecheck # tsc --noEmitnpm run check # biome check + typecheck (à passer avant de finir une tâche)npm run format # biome formatnpm run lint # biome lintnpm run build # build client + SSR de productionnpm run preview # sert le build de productionnpm test # vitest runGénération de code
Section intitulée « Génération de code »npm run api:gen # télécharge /docs-json → scripts/openapi.latest.json (gitignoré) # → openapi-typescript → src/core/api/generated/schema.ts (commité)npm run generate-routes # tsr generate → src/routeTree.gen.ts (après chaque changement de routes)Environnement
Section intitulée « Environnement »Copier .env.example vers .env si nécessaire :
VITE_API_URL=/api/v1La valeur par défaut /api/v1 est relative (même origine) : en dev, le
proxy du vite.config.ts relaie /api/* vers le backend
https://dev.sim.strife-cyber.org (le CORS de ce backend refuse
localhost:*). Une URL absolue (https://host/api/v1) reste possible si le
frontend est hébergé sur un autre domaine.
VITE_API_URL est non secret (exposé au navigateur). Les tokens JWT ne
sont jamais mis dans un .env ni dans le bundle comme constantes.
Production (Docker)
Section intitulée « Production (Docker) »docker compose up --build # build + run → http://localhost:3004Le port hôte du compose est 3004 (3000 est capturé par WSL sur cette machine) ;
le port interne du container reste 3000 (PORT).
L’image (Dockerfile multi-stage) construit dist/ puis l’exécute via
prod-server.mjs : hôte node:http qui fait le rendu SSR (dist/server/server.js),
sert les assets (dist/client/), et relaie /api/* vers le backend défini
par la variable d’env API_TARGET (même pattern que le proxy Vite en dev —
le navigateur n’appelle que la même origine, le CORS du backend ne s’applique
pas). Sans API_TARGET, /api/* répond 404.
VITE_API_URLest inliné au build (défaut/api/v1, même origine).PORT(défaut3000) etAPI_TARGETsont des variables du container.docker composeconfigureAPI_TARGETsur l’instance de dev par défaut — la remplacer par l’URL du backend de production au déploiement.npm run build && node prod-server.mjsreproduit le runtime en local (sans Docker).
Workflow type
Section intitulée « Workflow type »npm run devpour développer (HMR : routes, tailwind).- Avant de terminer :
npm run checkpuisnpm test.
À ne pas faire
Section intitulée « À ne pas faire »- ❌ Utiliser
pnpmouyarn(le lockfile npm doit rester la source de vérité). - ❌ Commiter
scripts/openapi.latest.json(gitignoré). - ❌ Retirer
legacy-peer-depsdu.npmrc.
