But: construire une extension Chrome/Chromium pour Vinted (Manifest V3) en TypeScript, avec lisibilité, sécurité et testabilité élevées. Copilot doit proposer une architecture claire, un typage strict et le principe du moindre privilège.
- Plateformes: Chrome/Chromium (Manifest V3)
- Langage: TypeScript strict (
noImplicitAny,strictNullChecks) - Bundler: Vite + plugin web extension (ex.
vite-plugin-web-extension) - API navigateur: utiliser
webextension-polyfillet l’espace de nomsbrowser.* - Qualité: ESLint + @typescript-eslint + Prettier (format on save)
- Tests: Vitest (unitaires). E2E optionnels (Playwright)
- Sécurité: CSP stricte, pas d’
eval, pas d’innerHTMLnon maîtrisé - Confidentialité: aucune télémétrie sans opt‑in explicite
public/manifest.json(MV3)icons/(16, 32, 48, 128 px)_locales/(i18n, ex.fr/messages.json)
src/background/service worker (index.ts)content/scripts injectés (vinted.ts)popup/UI popup (main.tsx,index.html)options/page d’options (main.tsx,index.html)lib/utilitaires (storage.ts,messaging.ts)types/types globaux (messages.ts,domain.ts)styles/CSS/SCSS
tests/(Vitest)vite.config.ts,tsconfig.json,.eslintrc.cjs,.prettierrc
- Permissions minimales et ciblées (notamment
host_permissionsvers Vinted) - Background: service worker (pas de DOM)
- Content scripts: logique DOM spécifique au site, pas de secrets
- UI (popup/options): composants simples, pas de logique métier lourde
- Messaging: bus typé entre content <-> background <-> UI
- Schémas (ex. Zod) pour requêtes/réponses/erreurs
sendMessage<TReq, TRes>()avec validation runtime + types TS- Gestion d’erreurs: timeouts, permissions manquantes, onglet inactif
- Enveloppe
storageau‑dessus dechrome.storage.{local,sync}avec clés typées - Versionner le schéma (ex.
schemaVersion) et migrations idempotentes
import/order, pas deany, unions discriminées, fonctions pures- Effets aux bords (content/background/UI)
- Logs verbeux en dev, silencieux en prod
- Commits: Conventional Commits
- Vitest pour utilitaires, parsers, storage, messaging
- Mock de
webextension-polyfill - E2E (optionnel) Playwright
- Clés en anglais, valeurs traduites en
_locales/{lang}/messages.json - Aucun texte en dur dans le code UI
- CSP par défaut MV3; éviter les sources distantes non nécessaires
- Sanitize HTML dynamique (DOMPurify) ou utiliser
textContent - Pas de collecte de données sans consentement explicite
- Proposer TypeScript strict, petites fonctions testables
- Utiliser
browser.*viawebextension-polyfill - Produire du code avec JSDoc concis pour APIs publiques
- Pour content scripts: APIs DOM natives (pas de dépendances lourdes)
- Pour background: pas d’accès DOM; privilégier messaging
- Pour UI: composants fonctionnels (si React), hooks, état local minimal
- Permissions trop larges (
<all_urls>sans justification) any, désactivation globale ESLint- Mélanger logique métier et DOM
- Accéder à
windowdans le service worker eval/Function/innerHTMLnon sécurisé
tsconfig: mode strict, moduleResolutionbundler- ESLint:
@typescript-eslint/recommended,import/order,no-console(sauf dev) - Prettier: 2 espaces, 100 colonnes, trailing commas
- Vite: entrées multiples (background, content, popup, options)
- Linter/Typecheck OK
- Tests Vitest OK
- Permissions minimales et justifiées
- i18n pour textes UI
- Commits conventionnels
Astuce: Toujours préciser dans les prompts le rôle du fichier, les permissions, les types attendus et les contraintes de sécurité.