feat/platform-next #9

Merged
nicolas-fryder merged 5 commits from feat/platform-next into main 2026-09-07 06:12:14 +00:00
No description provided.
- cœur sans framework : permet() avec jokers, roles.yaml (validation,
  héritage, groupes Entra → rôles, squelette depuis la spec, opérations
  inconnues), clés API (SHA-256 stocké, préfixe affichable, scopes bornés par
  le propriétaire, révocation, expiration), jetons de service Entra (JWKS du
  locataire, émetteur, audience → 403, app roles → permissions, azp),
  acquireServiceToken via MSAL en cache, principal depuis un utilisateur
  (rôles du champ, ADMIN_EMAILS réaffirmé, banni refusé)
- ./better-auth : creerAuth (local toujours, inscription fermée, Entra
  conditionnel au locataire nommé, liaison en confiance, session sans cache
  de cookie, limite de débit explicite, cookies selon https),
  amorcerCompteDeSecours, porteAuth (routes de bibliothèque fermées),
  monterBetterAuth
- ./nest : EqsAuthModule (garde globale par operationId, @Public(),
  @Permission(), @CurrentPrincipal(), canAccess), DecisionsService (chaque
  route et sa décision), moi()
- ./next : garder() ; ./client : peut(), chargerMoi()
- neuf contrôles de conformité prouvés contre une application Nest réelle
  avec et sans le module ; schémas Prisma et JSON de roles.yaml
- 28 tests ; valeurs de test générées pour ne pas ressembler à des secrets

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- eqsMutator : Authorization selon la cible (clé API, ou jeton de service
  Entra via acquireServiceToken), traceparent depuis le contexte OTel,
  X-Client-Name/X-Client-Version, X-Request-Id, timeout par cible
  (AbortSignal.timeout), redirect: 'error', chemin validé sur l'URL brute
  (.., %2e, //), plafond de réponse, ApiError avec code/statut/requestId ;
  fetchImpl injectable
- defineTarget / identiteClient / cheminSur
- ./browser : mutator navigateur (cookies, hôte loopback suivi comme HQ)
- huit contrôles de conformité ; les six dynamiques lèvent leur propre
  serveur de test et bornent leur attente ; prouvés sur le mutator (rend [])
  et sur un fetch nu (six règles déclenchées)
- 11 tests

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- createEqsApp : télémétrie avant tout import instrumenté (assemblage importé
  dynamiquement), environnement validé (@eqs/config), Nest sans body parser +
  parseur JSON plafonné hors better-auth, trust proxy, Helmet sans CSP, CORS
  depuis les origines de confiance avec traceparent/x-request-id/X-Client-*,
  ValidationPipe strict sans conversion implicite, request-id et enveloppe
  d'erreur y compris corps illisible et route inconnue, garde par operationId
  avec roles.yaml obligatoire, throttler trois paliers par identité,
  OperationIdInterceptor, /health (503 réel), /version (SHA, packages @eqs/*),
  /api/moi, Swagger 3.1 avec operationId = <tag>.<méthode>, /openapi.json
  public et /docs derrière session en production, schéma Error partout,
  SIGTERM qui laisse finir les requêtes et sort en 0
- exportOpenApi : le même document hors ligne
- ./testing : runPlatformConformance (un test par package assemblé, les
  contrôles non exécutables listés, jamais tus), contexteDe, routesMontees
- ./conformite : douze contrôles ; prouvés sur une application conforme
  (tous à []), une fautive (trois écarts nommés) et une Nest nue
- 18 tests

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Une application dans apps/api d'un monorepo n'a pas son propre node_modules :
packagesEqs remonte jusqu'au plus proche, et rend {} seulement s'il n'y en a
aucun jusqu'à la racine du disque.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- ./server : creerApi() sans état global (environnement chargé à la première
  requête, jamais à l'import : next build importe les route.ts) ; withApi() :
  x-request-id, span eqs.operation_id, garde par operationId (@eqs/auth/next,
  ou public), params/query/corps validés par zod (422 avec les contraintes),
  corps plafonné (413), réponse JSON au status déclaré, toute exception →
  enveloppe (@eqs/errors/next) ; routes standard marquées : health (503
  réel), version (SHA, packages @eqs/*), moi, openapi (sert
  contracts/openapi.json, D-020), découverte ?mine=1, better-auth derrière
  sa porte, 404 enveloppé (la page HTML de Next n'en est pas une) ;
  registerEqs() pour instrumentation.ts, hors Edge
- exportOpenApi() : importe chaque route.ts, dérive OpenAPI 3.1 des schémas
  zod (z.toJSONSchema), erreurs standard et schéma Error, liste les handlers
  nus ; ce qui remplace le catalogue manuel d'ATLAS
- ./server/proxy : CSP par nonce, en-têtes de sécurité, garde de session sur
  préfixes protégés ; Edge, sans import Node
- ./client : EqsProvider, useSession, useCan (le même test que la garde),
  EqsErrorBoundary et EqsErreurAffichee (code, message, requestId), SignIn
  (local + Microsoft), réexports télémétrie et mutator navigateur
- ./conformite : dix contrôles ; ./testing : runNextConformance, contexteDe
- fixture (lib/api.ts, onze route.ts, proxy.ts) tout à [], fautif nommé,
  sans démarrer Next : un mini-serveur enchaîne proxy et handlers
- 19 tests

Co-Authored-By: Claude Fable 5.1 <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!9
No description provided.