mirror of
https://github.com/MaksTinyWorkshop/_Assistant_Lead_Tech
synced 2026-04-06 21:41:42 +02:00
- backend/risques/nestjs : guard multi-statut READ_METHODS avant statut - backend/patterns/nestjs : fusionner lastSeenAt dans la réconciliation - backend/risques/contracts : pas de process.env dans services/helpers - backend/risques/nextjs : self-request Server Action + EXDEV atomic write - backend/risques/prisma : champ enum-like stocké en String - frontend/risques/general : Alert.prompt iOS-only - frontend/risques/tests : 3 anti-patterns (helpers copiés, test indirect, test façade) - workflow/risques/story-tracking : 2 entrées (hors périmètre, File List approximative) - skill capitalisation-triage : nouveau format de rapport (tableaux par domaine) - 95_a_capitaliser.md : purgé
87 lines
3.0 KiB
Markdown
87 lines
3.0 KiB
Markdown
# Frontend — Risques & vigilance : Général
|
|
|
|
> Extrait de la base de connaissance Lead_tech. Voir `knowledge/frontend/risques/README.md` pour l'index complet.
|
|
|
|
---
|
|
|
|
<a id="risque-accessibilite-oubliee"></a>
|
|
## Accessibilité oubliée (a11y)
|
|
|
|
### Risques
|
|
|
|
- App inutilisable au clavier/lecteur d'écran
|
|
- Régressions silencieuses sur focus/labels
|
|
|
|
### Symptômes
|
|
|
|
- Modales impossibles à fermer au clavier
|
|
- Inputs sans labels/erreurs non annoncées
|
|
- Focus "perdu"
|
|
|
|
### Bonnes pratiques / mitigations
|
|
|
|
- Checklist a11y minimale sur chaque écran clé
|
|
- Gestion de focus (modales, erreurs formulaire)
|
|
- Labels/aria cohérents + tests simples
|
|
|
|
---
|
|
|
|
<a id="risque-regex-globale-singleton-lastindex"></a>
|
|
## Regex globale `/g` en singleton — bug `lastIndex` stateful
|
|
|
|
### Risques
|
|
|
|
- Une regex avec flag `/g` ou `/y` définie comme constante au niveau module maintient un état `lastIndex` entre les appels
|
|
- `String.prototype.replace()` réinitialise `lastIndex`, mais `.test()` ou `.exec()` ne le font pas → bug stateful difficile à détecter, souvent introduit par un refactor ultérieur
|
|
|
|
### Symptômes
|
|
|
|
- `.test(str)` retourne alternativement `true` / `false` sur la même chaîne selon l'ordre d'appel
|
|
- Bug non reproductible en isolation, uniquement en séquence d'appels
|
|
|
|
### Bonnes pratiques / mitigations
|
|
|
|
```typescript
|
|
// ❌ RISQUÉ — regex globale partagée entre tous les appels
|
|
const LINK_PATTERN = /https?:\/\/\S+/gi;
|
|
function processLinks(content: string) {
|
|
return content.replace(LINK_PATTERN, ...); // OK today
|
|
// Mais si quelqu'un ajoute LINK_PATTERN.test(x) ailleurs → bug lastIndex
|
|
}
|
|
|
|
// ✅ SÛR — nouvelle instance à chaque appel, aucun état partagé
|
|
function makeLinkPattern(): RegExp {
|
|
return /https?:\/\/\S+/gi;
|
|
}
|
|
function processLinks(content: string) {
|
|
return content.replace(makeLinkPattern(), ...);
|
|
}
|
|
```
|
|
|
|
- **Règle** : les regex avec flag `/g` ou `/y` utilisées pour transformation de strings → toujours créer via une factory, jamais en singleton de module
|
|
|
|
- Contexte technique : TypeScript / React Native — app-alexandrie 24-03-2026
|
|
|
|
---
|
|
|
|
<a id="risque-alert-prompt-ios-only"></a>
|
|
## `Alert.prompt` iOS-only — fonctionnalité silencieusement cassée sur Android
|
|
|
|
### Risques
|
|
|
|
- `Alert.prompt` ne déclenche rien sur Android (retourne `undefined` silencieusement).
|
|
- Les tests unitaires passent (mock), mais le flux ne s'exécute jamais sur 50 % des devices en production.
|
|
|
|
### Symptômes
|
|
|
|
- Flux de saisie utilisateur qui fonctionne sur simulateur iOS mais est inactif sur Android
|
|
- Aucun message d'erreur côté dev ni côté utilisateur
|
|
|
|
### Bonnes pratiques / mitigations
|
|
|
|
1. Ne jamais utiliser `Alert.prompt` dans un projet Expo cross-platform.
|
|
2. Remplacer par une modale custom : `Modal` + `TextInput` React Native — portable, accessible, testable.
|
|
3. Wrapper le `TextInput` dans `KeyboardAvoidingView` avec `behavior={Platform.OS === 'ios' ? 'padding' : 'height'}`.
|
|
|
|
- Contexte technique : React Native / Expo cross-platform — app-alexandrie 31-03-2026
|