Version 0.19.0 : tickets du rétrofit d'ATLAS (#128, #130 à #134), la 0.18.0 avec #135

Merged
nicolas-fryder merged 8 commits from nicolas-fryder/dev into main 2026-10-12 08:02:51 +00:00 AGit

La 0.18.0 (#127) n'a jamais été publiée : ces tickets partent avec elle en 0.19.0. #134 les modules JS de @eqs/tooling livrent leurs types, prouvé sur le tarball hors du dépôt. #130 @eqs/auth devient un pair facultatif de @eqs/http, chargé à la demande : le mutator ne tire plus better-auth ni vitest en production (deux autres chemins restent ouverts, chasse 40). #128 CODES_DELEGATION, un code par refus délégué (+ on-behalf-of trouvé en chasse). #131 appel() résout un chemin relatif dans le navigateur. #132 appel() accepte timeoutMs: null. #133 eqsFetch, transport brut d'une cible ; le message de délai cite celui qui a joué ; en chasse, une annulation n'est plus un 504 et un corps non chaîne garde son type. Chasses 39 à 43, D-062. pnpm check vert. Closes #128, closes #130, closes #131, closes #132, closes #133, closes #134. 🤖 Generated with Claude Code

La 0.18.0 (#127) n'a jamais été publiée : ces tickets partent avec elle en 0.19.0. #134 les modules JS de @eqs/tooling livrent leurs types, prouvé sur le tarball hors du dépôt. #130 @eqs/auth devient un pair facultatif de @eqs/http, chargé à la demande : le mutator ne tire plus better-auth ni vitest en production (deux autres chemins restent ouverts, chasse 40). #128 CODES_DELEGATION, un code par refus délégué (+ on-behalf-of trouvé en chasse). #131 appel() résout un chemin relatif dans le navigateur. #132 appel() accepte timeoutMs: null. #133 eqsFetch, transport brut d'une cible ; le message de délai cite celui qui a joué ; en chasse, une annulation n'est plus un 504 et un corps non chaîne garde son type. Chasses 39 à 43, D-062. pnpm check vert. Closes #128, closes #130, closes #131, closes #132, closes #133, closes #134. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
`knip-satellite.js` était publié sans déclaration : le `knip.ts` d'ATLAS
— seul format TypeScript que knip lise — tombait en TS7016 sous le
tsconfig du satellite, et ATLAS recopiait un `.d.ts` à la main.

La classe : tout module JS exporté de `@eqs/tooling`. Quatre instances
sur cinq étaient sans types — `knip-satellite`, `orval`, `conformite`,
`eslint` ; seul `vitest-reprise-reseau` en avait. Les quatre ont leur
`.d.ts` et leur condition `types`.

Garde-fou, dans la porte du paquet :
- un export JS sans condition `types` est refusé ;
- un consommateur TypeScript (`test/types/consommateur.ts`) compile contre
  le TARBALL installé hors du dépôt, avec des `@ts-expect-error` qui
  prouvent que les types sont réels et pas un `any` muet.

Hors du dépôt, et c'est le point : sous `packages/tooling`, l'auto-référence
résout vers l'arbre de travail ; ailleurs dans le dépôt, TypeScript remonte
au `node_modules` de la racine et y trouve le lien du workspace. Les deux
premières versions du banc passaient SANS les déclarations. Rouge mesuré
(TS7016, identique à ATLAS) en retirant le `.d.ts`, vert avec.

L'en-tête de `knip-satellite.js` montrait un `require` dans un `knip.js` :
le module est ESM. Le README montrait la base étendue à la main : il montre
`knipSatellite()`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`@eqs/http` dépendait de `@eqs/auth` pour quatre fonctions (appelant,
assertion, jeton de service, on-behalf-of) dont une cible à clé d'API n'a
aucun usage. Cette dépendance amenait better-auth, et par son pair
facultatif le vitest du satellite, dans l'arbre de production d'ATLAS :
deux avis critiques sous `pnpm audit --prod`, vitest dans l'image.

- `@eqs/auth` est un pair facultatif (`>=0.18`, pas `workspace:^` : avec
  le groupe `fixed`, un pair en `workspace:` ferait monter tout le monde en
  majeur au prochain mineur) ;
- il est importé dynamiquement par les seules branches qui s'en servent ;
- `defineTarget` vérifie sa présence pour une cible déléguée ou Entra, au
  démarrage et pas au premier appel.

Test : `@eqs/auth` rendu introuvable dans le processus — une cible à clé
d'API se déclare et s'appelle, une cible déléguée ou Entra refuse à sa
déclaration. Rouge sur l'ancien code (l'import de tête lève).

Ce que ça ne règle pas, consigné en chasse : `platform-nest` et
`platform-next` déclarent `vitest` et `@eqs/testing` en pairs facultatifs
pour leur entrée `/testing`, et better-auth déclare `vitest` en pair —
mesuré dans eqs-demo, vitest est dans l'arbre de production par ces trois
autres chemins.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`jetonDeLAppelant` levait `INTERNAL` ou `FORBIDDEN` pour trois refus que
le satellite doit traiter différemment (compte à lier, route à refuser,
défaut de l'application) ; seul le message les distinguait, et nuage
comparait des textes. `CODES_DELEGATION` exporte un code par cas, porté
par `ApiError.code`, statut inchangé.

Chasse : le quatrième refus de la même famille — l'on-behalf-of sans
jeton Entra à échanger — portait aussi `FORBIDDEN` nu. Il a son code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#131 — `new URL(adresse)` sans base, pour nommer le span, levait « Invalid
URL » sur `appel('/api/x')` depuis un composant client : 37 appels d'ATLAS
vers ses propres routes ne pouvaient pas passer par `appel`. L'adresse se
résout contre `location.href` quand il y a une page ; l'appel part tel quel,
c'est `fetch` qui le résout. Côté serveur, refus explicite.

Chasse : les autres `new URL(` sans base atteignables depuis le navigateur —
`apiBaseUrl` (base configurée, sous try) et `matcherOrigine` de la
télémétrie (échec fermé voulu). Aucune autre instance.

#132 — `AbortSignal.timeout(30 s)` reste lié au flux de la `Response` : le
délai couvre la lecture du corps. `timeoutMs: null` ne pose aucun signal ;
une valeur non finie ou nulle lève avant l'appel, en disant d'écrire `null`.
Éprouvé contre un vrai serveur qui envoie son corps lentement : un délai
court coupe la LECTURE après les en-têtes, `null` la laisse aller au bout.

Chasse : le mutator serveur et le mutator navigateur lisent le corps en
entier sous leur délai — ils ne servent pas de flux, le délai y borne bien
la réponse entière. Rien à changer.

Rouge sur l'ancien code : 4 cas sur 12.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1. Sous la base d'une cible déclarée, aucune voie ne rendait la
   `Response` : le mutator lève sur un statut d'erreur et lit du JSON,
   `appel` refuse une cible. ATLAS reconstruisait sa réponse HQ, le refus
   OAuth du point de jeton et la sonde de santé à partir de l'`ApiError`.
   Le mutator est découpé : `creerEnvoi` porte tout jusqu'à la
   `Response`, le mutator lit et valide le corps, `eqsFetch` la rend
   telle quelle. Il refuse une adresse hors cible (rôle d'`appel`).

2. Avec le signal de l'appelant, le message citait le délai de la cible.
   Il dit désormais « le délai fixé par l'appelant » — celui d'un signal
   ne se relit pas, et le ticket attendait un chiffre qu'on ne peut pas
   connaître : on le dit plutôt que de l'inventer.

Chasse, même endroit :
- une ANNULATION de l'appelant (`abort()`) devenait un 504 « n'a pas
  répondu » — dans le mutator serveur ET le navigateur. Elle repart telle
  quelle ;
- `content-type: application/json` était imposé à tout corps non
  `FormData` : un `URLSearchParams` (le point de jeton OAuth, celui-là
  même de #133) ou un `Blob` partait mal typé. Posé sur un corps chaîne
  seulement, des deux côtés.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Une classe par ticket, avec ses instances : types des modules JS (39),
outil de test dans l'arbre de production (40, deux instances ouvertes
dans les plateformes, une hors socle), refus distingués par le seul
message (41), adresse relative sans base (42), délai / annulation /
type de contenu confondus dans le transport (43).

D-062 consigne les trois changements du cahier de @eqs/http.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
La 0.18.0, versionnée et fusionnée (#127), n'a jamais été publiée : les
tickets du rétrofit d'ATLAS (#130 à #134) et #128 ont été traités avant
sa candidate, et partent avec elle. ETAT le dit.

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!135
No description provided.