Trois marqueurs d'autorisation que Prettier rendait impossibles a poser #112

Merged
nicolas-fryder merged 1 commit from nicolas-fryder/dev into main 2026-10-06 08:17:59 +00:00 AGit

Corrige #110 et ses deux jumeaux non signales (eqs-config, eqs-telemetry). Le marqueur est accepte dans le bloc de commentaires au-dessus ou n'importe ou dans l'expression. Tests qui rejouent le vrai Prettier. Chasse 24.

Corrige #110 et ses deux jumeaux non signales (eqs-config, eqs-telemetry). Le marqueur est accepte dans le bloc de commentaires au-dessus ou n'importe ou dans l'expression. Tests qui rejouent le vrai Prettier. Chasse 24.
`http.fetch-brut` cherchait `// eqs-http:autorise` sur la seule ligne du `fetch`
(#110). Prettier déplace un commentaire de fin de ligne dès que l'appel tient sur
plusieurs lignes, et la règle ne le voyait plus. Dans un dépôt qui met en forme
son code — tous, `format` est une tâche de la porte — le marqueur était
impossible à poser de façon stable.

## Ce que la mesure a ajouté au ticket

Le ticket décrivait un déplacement : le marqueur descend dans l'objet. Mesuré
avec Prettier 3.9, il y en a deux :

    fetch(url, { // m              →  fetch(url, {
                                        // m
    fetch('…long…', init) // m     →  fetch(
                                        '…long…',
                                        init,
                                      ); // m

Ma première version suivait le ticket et acceptait la ligne de commentaire juste
en dessous. Elle ratait la seconde forme — la plus naturelle pour un
`console.error`. Elle est sortie en mesurant ce que Prettier fait des jumeaux,
AVANT d'écrire leurs tests au lieu d'après.

Le critère retenu est plus simple que trois positions : le marqueur est accepté
dans le bloc de commentaires qui précède (position recommandée, celle
d'`eslint-disable-next-line`, que Prettier ne déplace jamais), ou n'importe où
dans l'expression qui commence sur la ligne signalée — trouvée en comptant
parenthèses, accolades et crochets.

La remontée s'arrête au premier code : un marqueur posé plus haut autorise autre
chose. Sans cet arrêt, un seul marqueur deviendrait une dispense de fichier.

## La chasse : trois instances, même code

`eqs-config:autorise` et `eqs-telemetry:autorise` avaient exactement le même
défaut, non signalé. Les trois portent le même helper — recopié, parce
qu'`@eqs/testing` dépend déjà de `@eqs/config` et qu'aucune dépendance commune ne
le permet sans cycle.

C'est la forme de #100 (`porter` recopié trois fois avec la même faute), et la
parade est différente : chaque copie a son test, qui rejoue SON marqueur à
travers le vrai Prettier, et chaque test a été éprouvé en cassant SA copie — pas
celle d'à côté. Les trois copies sont identiques à l'octet près au moment du
commit. C'est une parade, pas une suppression, et la chasse 24 le dit.

## Les tests mesurent Prettier, ils ne le supposent pas

`http.fetch-brut` n'avait AUCUN test. Il en a huit. Les cas centraux écrivent le
marqueur comme un humain le ferait, passent le vrai Prettier dessus, vérifient
que le marqueur a bien quitté la ligne de l'appel, puis jouent la règle. Écrire à
la main la forme « après Prettier » aurait supposé ce que Prettier fait — et ma
première tentative d'entrée de test a montré que je le supposais mal : Prettier a
gardé le marqueur sur la ligne, le test le disait, j'ai mesuré puis corrigé
l'entrée.

Éprouvé trois fois : retour au comportement d'avant (trois refus), expression
réduite à sa première ligne (les deux scénarios Prettier rougissent), remontée
qui ne s'arrête plus au code (seul le test d'arrêt rougit).

## Et deux erreurs à moi en chemin

- mon test de config passait sous Vitest et pas sous `tsc` : `ContexteConfig`
  exige `schema`. Vitest ne vérifie pas les types ; la porte, si ;
- le heredoc a encore avalé des antislashs dans un script d'édition. C'est le
  piège que ma mémoire porte, et je l'ai refait : le script est passé par l'outil
  d'écriture.

Les trois README nomment désormais leur marqueur et où le poser : jusqu'ici on ne
le découvrait que par le message de la règle qui refuse.

Closes #110

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Infrastructure/eqs-platform!112
No description provided.