Serveur TypeScript (Fastify 5) permettant de déposer des fichiers médias
dans des dossiers nommés, via une page web de glisser-déposer.
- Authentification OpenID Connect gérée côté serveur (Authorization Code +
PKCE, client confidentiel, openid-client) ; session via cookie chiffré
(@fastify/secure-session).
- Configuration dans un fichier JSON (schéma fourni) ; l'environnement ne
porte que le pointeur MEDIADROP_CONFIG.
- Cibles de dépôt nommées : liste { name, label, dir }, sélection par
?target=, première cible par défaut.
- Upload multipart en streaming : nom de fichier dérivé côté serveur (pas
de path traversal), liste blanche de types MIME, plafond de taille.
- TypeScript strict, ESLint + Prettier sans warning, 46 tests Vitest.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
43 lines
No EOL
2.3 KiB
Markdown
43 lines
No EOL
2.3 KiB
Markdown
# Directives de Développement TypeScript & Qualité
|
|
|
|
## 1. Principes Généraux
|
|
- **Qualité & Solidité** : Code propre, explicite, auto-documenté. Pas de hacks ou de contournements temporaires.
|
|
- **DRY & KISS** : Préférer la lisibilité et la simplicité à l'abstraction prématurée.
|
|
- **Sécurité** : Validation systématique des données aux frontières de l'application (pas de données non vérifiées). Aucune clé ou secret en dur.
|
|
|
|
## 2. Standards TypeScript & Typage Strict
|
|
- **Typage strict** :
|
|
- `noImplicitAny` et `strictNullChecks` activés.
|
|
- Interdiction d'utiliser le type `any`. Utiliser `unknown` avec du narrowing (type guards) si le type est incertain.
|
|
- Préférer les `interface` pour les objets publics/extensibles et les `type` pour les unions, intersections et tuples.
|
|
- Expliciter les types de retour des fonctions publiques et des méthodes d'API.
|
|
- **Conventions de nommage** :
|
|
- `PascalCase` pour les types, interfaces, classes et composants React/Vue.
|
|
- `camelCase` pour les variables, fonctions et méthodes.
|
|
- `SNAKE_CASE` pour les constantes globales.
|
|
- Interfaces : Ne pas utiliser le préfixe `I` (écrire `User`, pas `IUser`).
|
|
- **Gestion de l'asynchronisme** :
|
|
- Préférer `async/await` aux promesses chaînées (`.then()`).
|
|
- Toujours typer le retour des fonctions asynchrones : `Promise<T>`.
|
|
|
|
## 3. Qualité, Linting & Formattage
|
|
- **Structure** : Fichiers ciblés et courts (< 200-300 lignes). Découper en modules si nécessaire.
|
|
- **Linter & Formateur** : Le code doit passer sans aucun warning ni erreur sous **ESLint** et **Prettier**.
|
|
- **Gestion des erreurs** :
|
|
- Pas de `try/catch` vides.
|
|
- Utiliser des classes d'erreur personnalisées dérivant de `Error`.
|
|
|
|
## 4. Tests
|
|
- **Règle absolue** : Tout nouveau code ou correctif doit être accompagné de ses tests (ex. **Vitest** ou **Jest**).
|
|
- Exécuter la suite de tests avant toute validation.
|
|
|
|
## 5. Commandes du Projet
|
|
- **Installation** : `npm install` (ou `pnpm install` / `yarn install`)
|
|
- **Vérification de type** : `npx tsc --noEmit`
|
|
- **Linter** : `npm run lint`
|
|
- **Tests** : `npm test`
|
|
- **Build** : `npm run build`
|
|
|
|
## 6. Format des Réponses de Claude
|
|
- Proposer du code complet et directement exploitable.
|
|
- Expliciter les choix de typage ou de refactorisation complexes. |