My App

Code style

TypeScript strict, imports, Biome, Tailwind

TypeScript

  • Strict mode activé — strict: true dans tsconfig
  • Pas de any — utiliser unknown si le type est inconnu
  • Inférence maximale — ne pas annoter quand TypeScript peut inférer
  • Pas de as sauf nécessité — les assertions de type masquent les bugs
// ✅ Bon — inférence
const count = reports.length;

// ❌ Mauvais — annotation inutile
const count: number = reports.length;

// ✅ Bon — type guard
function isEstablishmentAdmin(user: User): user is EstablishmentAdmin {
  return user.role === "establishment_admin";
}

// ❌ Mauvais — assertion
const admin = user as EstablishmentAdmin;

Imports

  • Imports auto-organisés par Biome (organizeImports: "on")
  • Ordre : packages externes → packages internes (@wcare/*) → imports relatifs
  • Pas d'index barrels dans les modules — importer le fichier directement
// ✅ Bon
import { Button } from "@wcare/ui/components/button";
import { createEstablishmentSchema } from "../schemas/establishment.schema";

// ❌ Mauvais — barrel import
import { Button } from "@wcare/ui";

Biome

Configuration dans biome.json à la racine :

  • Formatter : tabs, double quotes
  • Linter : recommended rules + strictes
  • Tailwind : useSortedClasses avec cn, clsx, cva
# Vérifier et auto-fix
bun run check

Tailwind CSS

  • Classes triées automatiquement par Biome
  • Utiliser cn() pour combiner des classes conditionnelles
  • Design system Neo-brutalism — respecter les tokens définis dans globals.css
  • Pas de styles inline — tout passe par les classes Tailwind
  • Pas de @apply sauf dans globals.css pour les styles de base

Commentaires

  • Pas de commentaires évidents — le code doit être auto-documenté
  • Commenter le pourquoi, pas le quoi
  • Pas de TODO/FIXME sans issue associée
// ✅ Bon — explique le pourquoi
// Fenêtre de 24h pour le redirect graceful : le temps que les QR
// physiques avec l'ancien token soient re-scannés
const REDIRECT_GRACE_PERIOD_HOURS = 24;

// ❌ Mauvais — commente l'évidence
// Vérifie si le token est expiré
if (token.expiresAt < new Date()) { ... }

Erreurs

  • Errors explicites avec des messages clairs
  • Pas de catch vide — toujours logger ou remonter
  • TRPCError pour les erreurs API avec le bon code HTTP
  • Pas de console.log en prod — utiliser un logger structuré

On this page