Session

La session est résolue côté serveur. Elle est ensuite hydratée dans la page, injectée dans les handlers et transmise aux Fronds distantes.

useCurrentUser

const { user, refresh } = useCurrentUser();
// user:    Ref<User | null> — résolu en SSR, hydraté avec la page : zéro requête en plus
// refresh: () => Promise<void> — relire après sign-in/out
<template>
  <UButton v-if="user" :to="localePath('/blog/new')" :label="$t('nav.write')" />
  <UButton v-else :to="localePath('/login')" :label="$t('nav.signIn')" />
</template>

La protection de route est un middleware Nuxt ordinaire qui lit la même session — Fougere n'ajoute pas de système de gardes parallèle.

La surface auth

auth: betterAuth({ … }) dans fougere.config.ts (référence) monte better-auth sous basePath — les endpoints que vos pages appellent directement :

await $fetch('/auth/sign-up/email', { method: 'POST', body: { name, email, password } });
await $fetch('/auth/sign-in/email', { method: 'POST', body: { email, password } });
await $fetch('/auth/sign-out',      { method: 'POST', body: {} });
// puis : await refresh()

Votre entité User étend AuthUser — les champs better-auth plus les vôtres :

import { AuthUser } from '@fougere/auth-better';
import { oneOf, optional } from '@fougere/schema';

export default class User extends AuthUser.extend({
  role: optional(oneOf('admin', 'editor', 'reader')),
}) {}

La sous-classe nommée compte : le scanner enregistre l'entité comme User, et la DI matche user: User | null par ce nom.

Ne placez pas de pages sous le basePath auth : le catch-all serveur utilise /auth/**. Ce site sert ses formulaires à /login et /register pour cette raison.

Une résolution, trois lecteurs

LecteurComment l'identité arrive
la pagehydratation — useCurrentUser(), zéro requête
un handlerstate d'invocation → un Collector remplit user: User | null
une Frond distantele state est transmis avec l'appel — ses collectors reçoivent le même user

Le navigateur ne peut pas écrire ce state : il est construit côté serveur depuis le contexte de requête (Queries & commands).

Suite : invoke — appeler une opération côté serveur.

Construit avec Fougere — ce site tourne sur le framework qu'il documente.