Biome
Biome est le seul formateur et linter pour JS, TS, JSX, JSON et CSS. SCSS est l'exception : Biome 2.5 ne le parse pas, donc stylelint gère les .scss (voir scss-bem). Pas d'ESLint, pas de Prettier.
Le biome.json racine du modèle est la source de vérité. Un hook du plugin exécute pnpm exec biome check --write <fichier> après chaque fichier édité par Claude, lorsqu'un biome.json existe au-dessus.
Règles
-
Un seul
biome.jsonracine, schéma épinglé à la version installée."$schema": "https://biomejs.dev/schemas/2.5.15/schema.json", et@biomejs/biomeépinglé à la même version dans le catalogue du workspace. Un schéma décalé masque les options inconnues ou renommées dans l'éditeur. Lors d'une mise à niveau, exécutezpnpm exec biome migrate --writeet mettez à jour les deux. -
Laissez git décider ce qui est ignoré :
vcs.useIgnoreFile: true. Forcez ensuite l'ignorance des sorties de build avec!!dansfiles.includes(!!**/.next,!!**/.turbo,!!**/dist,!!**/coverage), ce qui empêche également Biome de scanner ces dossiers. Un seul!exclut du traitement mais indexe quand même.files.ignoreUnknown: trueempêche les fichiers.scsset autres fichiers non supportés d'être signalés. -
Formateur : 2 espaces, largeur 100, LF, guillemets doubles, points-virgules, virgules finales. Ceux-ci sont fixes pour chaque dépôt, afin que les diffs ne se battent pas pour le style. N'ajoutez pas de surcharges de formateur par paquet.
-
Linter :
preset: "recommended",a11y: "error", domainesreactetnextau niveaurecommended.rules.recommended: trueest l'ancienne orthographe et est dépréciée : utilisezrules.preset.a11yenerrorcar nuvui gère lui-même l'accessibilité de ses composants, donc ce qui reste (alt, labels, types de boutons dans votre propre balisage) doit être correct. Le domainenextajoute des règles commenoImgElement;reactajoute les règles des hooks. -
Nursery reste désactivée. Les règles Nursery changent entre les versions de patch et peuvent casser la CI lors d'une mise à niveau de Biome. Activez-en une délibérément, par son nom, avec un commentaire expliquant pourquoi, et revérifiez à chaque mise à niveau.
-
noConsoleavertit, en autorisanterroretwarn. Les logs d'erreur structurés (instrumentation.ts) utilisentconsole.error; lesconsole.logintempestifs sont détectés. -
Triez les imports avec l'assistant, pas à la main.
assist.actions.source.organizeImports: "on".biome check --writel'applique ;biome ciéchoue en cas d'imports non triés. -
Surcharges par glob, pour les fichiers de test et autres. Le modèle active le domaine
testuniquement pour*.test.ts(x)/*.test-d.ts. Mettez-y aussi les autres différences de type de fichier, pas dans des configurations séparées. -
Configurations imbriquées uniquement pour les paquets qui diffèrent vraiment, et elles héritent de la racine.
// packages/legacy-widget/biome.json { "extends": "//", "linter": { "rules": { "style": { "noNonNullAssertion": "off" } } } }"extends": "//"signifie "la configuration racine" et implique"root": false. Toute autre configuration imbriquée doit définir"root": false. Nous n'utilisons pas de paquet@repo/biome-configpartagé : le fichier racine plus//suffit sans build ni dépendance. -
Localement
biome check --write; en CIbiome ci.pnpm lintexécutebiome check .(sans écriture) ;pnpm lint:fixexécutebiome check --write .. La CI exécutepnpm exec biome ci --reporter=github ., qui n'écrit jamais, échoue en cas de problèmes de formatage, de lint et d'ordre des imports, et annote la PR. Ajoutez--changed --since=origin/mainseulement si l'exécution complète devient lente ; c'est en millisecondes aujourd'hui. -
Supprimez une ligne, avec une raison.
// biome-ignore lint/suspicious/noExplicitAny: third-party callback typed as any upstreamNe désactivez jamais une règle à l'échelle du dépôt pour faire passer un seul fichier. Si une règle est incorrecte pour le dépôt, modifiez
biome.jsondans son propre commit avec la raison. -
Corrigez, ne masquez pas, les plus courantes.
useImportType: exécutez la correction ; elle est requise parverbatimModuleSyntax.noExplicitAny: utilisezunknownet parsez (voirtypescript-production).useButtonType,noSvgWithoutTitle,useAltText: de véritables bugs d'accessibilité.noImgElement: utiliseznext/image.useExhaustiveDependencies: corrigez la liste des dépendances ou déplacez la valeur hors du composant.
-
VS Code : Biome est le formateur par défaut, correction à la sauvegarde. Le
.vscode/settings.jsondu modèle définiteditor.defaultFormatter: "biomejs.biome",source.fixAll.biomeetsource.organizeImports.biomeà la sauvegarde, etbiome.requireConfiguration: truepour que l'extension reste silencieuse dans les dépôts sans Biome. SCSS conserve l'extension stylelint. Recommandez les deux dans.vscode/extensions.json. -
Migrer depuis ESLint/Prettier : migrez, puis supprimez. Voir references/migration.md. État final : aucun paquet
eslint*,prettier*ou@typescript-eslint/*, aucun fichier.eslintrc*,eslint.config.*,.prettierrc*,.prettierignore.
Ce que Biome ne couvre pas
| Fichier | Outil |
|---|---|
.scss | stylelint (scss-bem) |
.yaml (workflows, Helm) | actionlint pour les workflows ; helm lint + kubeconform pour les charts |
.md | rien d'imposé |
| Erreurs de type | tsc --noEmit (pnpm typecheck) |
Vérifier
pnpm lint # biome check . && stylelint
pnpm exec biome ci --reporter=github . # ce que la CI exécute
pnpm exec biome rage # affiche la configuration résolue si quelque chose semble ignoré
Sources
- https://biomejs.dev/reference/configuration/
- https://biomejs.dev/guides/big-projects/
- https://biomejs.dev/linter/domains/
- https://biomejs.dev/linter/rules/
- https://biomejs.dev/reference/cli/
- https://biomejs.dev/reference/vscode/
- https://biomejs.dev/guides/migrate-eslint-prettier/
- https://biomejs.dev/internals/language-support/