@eqs/auth/client n'expose pas rolesDuChamp : tout front qui affiche des rôles doit le réécrire #116

Closed
opened 2026-10-06 10:33:03 +00:00 by nicolas-fryder · 0 comments

Le manque

Le socle définit le format du champ role de better-auth : des rôles séparés par des virgules. Il fournit le lecteur qui va avec :

export const rolesDuChamp = (role) => (role ?? '').split(',').map(r => r.trim()).filter(Boolean)

Mais il vit dans @eqs/auth, dont l'entrée commence par :

import { createHash, randomBytes, timingSafeEqual } from 'node:crypto'
import { createRemoteJWKSet, jwtVerify } from 'jose'
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml'

Un composant navigateur ne peut pas l'importer sans faire entrer toute la couche serveur dans son bundle. Et @eqs/auth/client, la seule entrée navigateur, n'exporte que peut, chargerMoi, deconnecter et le type Moi.

Pourquoi c'est gênant

Un écran d'administration qui liste des comptes reçoit role — c'est le champ du contrat, CompteDto.role chez nous — et doit le découper pour l'afficher ou en dériver quoi que ce soit. Il n'a pas le choix : il réécrit les trois lignes.

C'est exactement le motif que peut évite déjà pour les jokers de permissions, et pour la même raison. Le commentaire de lib/session.ts côté socle le dit bien : « Réimplémenter *, ressource.* et *.action à la main aurait été la façon sûre de les faire diverger. » Le découpage du champ role est le même genre de contrat implicite, en plus discret : si le socle passait un jour à un séparateur différent, ou décidait de normaliser la casse, les fronts ne le sauraient pas.

Ce que je propose

Déplacer rolesDuChamp dans un module pur — à côté de permissions.js, qui est déjà sans dépendance Node — et le réexporter depuis ./client comme depuis la racine. C'est une fonction sans effet, sans import, et sans raison d'être derrière node:crypto.

Tant que c'est ainsi, nuage la recopie dans apps/front/src/lib/session.ts, avec un commentaire qui renvoie ici.

Contexte

Relevé pendant le rétrofit du socle sur nuage (0.14.0), sur un écran d'administration qui devait afficher les rôles d'un compte — voir aussi #115 posté le même jour.

## Le manque Le socle définit le format du champ `role` de better-auth : des rôles séparés par des virgules. Il fournit le lecteur qui va avec : ```js export const rolesDuChamp = (role) => (role ?? '').split(',').map(r => r.trim()).filter(Boolean) ``` Mais il vit dans `@eqs/auth`, dont l'entrée commence par : ```js import { createHash, randomBytes, timingSafeEqual } from 'node:crypto' import { createRemoteJWKSet, jwtVerify } from 'jose' import { parse as parseYaml, stringify as stringifyYaml } from 'yaml' ``` Un composant navigateur ne peut pas l'importer sans faire entrer toute la couche serveur dans son bundle. Et `@eqs/auth/client`, la seule entrée navigateur, n'exporte que `peut`, `chargerMoi`, `deconnecter` et le type `Moi`. ## Pourquoi c'est gênant Un écran d'administration qui liste des comptes reçoit `role` — c'est le champ du contrat, `CompteDto.role` chez nous — et doit le découper pour l'afficher ou en dériver quoi que ce soit. Il n'a pas le choix : il réécrit les trois lignes. C'est exactement le motif que `peut` évite déjà pour les jokers de permissions, et pour la même raison. Le commentaire de `lib/session.ts` côté socle le dit bien : « Réimplémenter `*`, `ressource.*` et `*.action` à la main aurait été la façon sûre de les faire diverger. » Le découpage du champ `role` est le même genre de contrat implicite, en plus discret : si le socle passait un jour à un séparateur différent, ou décidait de normaliser la casse, les fronts ne le sauraient pas. ## Ce que je propose Déplacer `rolesDuChamp` dans un module pur — à côté de `permissions.js`, qui est déjà sans dépendance Node — et le réexporter depuis `./client` comme depuis la racine. C'est une fonction sans effet, sans import, et sans raison d'être derrière `node:crypto`. Tant que c'est ainsi, nuage la recopie dans `apps/front/src/lib/session.ts`, avec un commentaire qui renvoie ici. ## Contexte Relevé pendant le rétrofit du socle sur nuage (0.14.0), sur un écran d'administration qui devait afficher les rôles d'un compte — voir aussi #115 posté le même jour.
Sign in to join this conversation.
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#116
No description provided.