[{"data":1,"prerenderedAt":816},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Fclient\u002Fsession":137},[4],{"title":5,"path":6,"stem":7,"children":8,"page":44},"Fr","\u002Ffr","fr",[9],{"title":10,"path":11,"stem":12,"children":13},"Qu'est-ce que Fougere","\u002Ffr\u002Fdocs","fr\u002Fdocs\u002Findex",[14,15,19,23,27,45,66,95,116],{"title":10,"path":11,"stem":12},{"title":16,"path":17,"stem":18},"Démarrer","\u002Ffr\u002Fdocs\u002Fgetting-started","fr\u002Fdocs\u002F01.getting-started",{"title":20,"path":21,"stem":22},"App Nuxt existante","\u002Ffr\u002Fdocs\u002Fexisting-app","fr\u002Fdocs\u002F02.existing-app",{"title":24,"path":25,"stem":26},"La CLI","\u002Ffr\u002Fdocs\u002Fcli","fr\u002Fdocs\u002F03.cli",{"title":28,"path":29,"stem":30,"children":31,"page":44},"Concepts","\u002Ffr\u002Fdocs\u002Fconcepts","fr\u002Fdocs\u002F2.concepts",[32,36,40],{"title":33,"path":34,"stem":35},"Philosophie","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fphilosophy","fr\u002Fdocs\u002F2.concepts\u002F1.philosophy",{"title":37,"path":38,"stem":39},"La Frond","\u002Ffr\u002Fdocs\u002Fconcepts\u002Ffrond","fr\u002Fdocs\u002F2.concepts\u002F2.frond",{"title":41,"path":42,"stem":43},"Le chemin le plus court","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fshortest-path","fr\u002Fdocs\u002F2.concepts\u002F3.shortest-path",false,{"title":46,"path":47,"stem":48,"children":49,"page":44},"Schéma","\u002Ffr\u002Fdocs\u002Fschema","fr\u002Fdocs\u002F3.schema",[50,54,58,62],{"title":51,"path":52,"stem":53},"Entités","\u002Ffr\u002Fdocs\u002Fschema\u002Fentities","fr\u002Fdocs\u002F3.schema\u002F1.entities",{"title":55,"path":56,"stem":57},"Vues","\u002Ffr\u002Fdocs\u002Fschema\u002Fviews","fr\u002Fdocs\u002F3.schema\u002F2.views",{"title":59,"path":60,"stem":61},"La carte d'identité","\u002Ffr\u002Fdocs\u002Fschema\u002Fcard","fr\u002Fdocs\u002F3.schema\u002F3.card",{"title":63,"path":64,"stem":65},"Standard Schema","\u002Ffr\u002Fdocs\u002Fschema\u002Fstandard-schema","fr\u002Fdocs\u002F3.schema\u002F4.standard-schema",{"title":67,"path":68,"stem":69,"children":70,"page":44},"Métier","\u002Ffr\u002Fdocs\u002Fbusiness","fr\u002Fdocs\u002F4.business",[71,75,79,83,87,91],{"title":72,"path":73,"stem":74},"Handlers","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers","fr\u002Fdocs\u002F4.business\u002F1.handlers",{"title":76,"path":77,"stem":78},"Presenters","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fpresenters","fr\u002Fdocs\u002F4.business\u002F2.presenters",{"title":80,"path":81,"stem":82},"Collectors","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fcollectors","fr\u002Fdocs\u002F4.business\u002F3.collectors",{"title":84,"path":85,"stem":86},"Erreurs","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ferrors","fr\u002Fdocs\u002F4.business\u002F4.errors",{"title":88,"path":89,"stem":90},"Seeds","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fseeds","fr\u002Fdocs\u002F4.business\u002F5.seeds",{"title":92,"path":93,"stem":94},"Les faits","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ffacts","fr\u002Fdocs\u002F4.business\u002F6.facts",{"title":96,"path":97,"stem":98,"children":99,"page":44},"Client","\u002Ffr\u002Fdocs\u002Fclient","fr\u002Fdocs\u002F5.client",[100,104,108,112],{"title":101,"path":102,"stem":103},"Queries & commands","\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands","fr\u002Fdocs\u002F5.client\u002F1.queries-commands",{"title":105,"path":106,"stem":107},"Formulaires","\u002Ffr\u002Fdocs\u002Fclient\u002Fforms","fr\u002Fdocs\u002F5.client\u002F2.forms",{"title":109,"path":110,"stem":111},"Session","\u002Ffr\u002Fdocs\u002Fclient\u002Fsession","fr\u002Fdocs\u002F5.client\u002F3.session",{"title":113,"path":114,"stem":115},"invoke","\u002Ffr\u002Fdocs\u002Fclient\u002Finvoke","fr\u002Fdocs\u002F5.client\u002F4.invoke",{"title":117,"path":118,"stem":119,"children":120,"page":44},"Infrastructure","\u002Ffr\u002Fdocs\u002Finfra","fr\u002Fdocs\u002F6.infra",[121,125,129,133],{"title":122,"path":123,"stem":124},"Le gradient","\u002Ffr\u002Fdocs\u002Finfra\u002Fgradient","fr\u002Fdocs\u002F6.infra\u002F1.gradient",{"title":126,"path":127,"stem":128},"Surfaces — REST & GraphQL","\u002Ffr\u002Fdocs\u002Finfra\u002Fsurfaces","fr\u002Fdocs\u002F6.infra\u002F2.surfaces",{"title":130,"path":131,"stem":132},"Déploiement","\u002Ffr\u002Fdocs\u002Finfra\u002Fdeployment","fr\u002Fdocs\u002F6.infra\u002F3.deployment",{"title":134,"path":135,"stem":136},"Hôtes","\u002Ffr\u002Fdocs\u002Finfra\u002Fhosts","fr\u002Fdocs\u002F6.infra\u002F4.hosts",{"id":138,"title":109,"body":139,"description":811,"extension":812,"meta":813,"navigation":608,"path":110,"seo":814,"stem":111,"__hash__":815},"docs_fr\u002Ffr\u002Fdocs\u002F5.client\u002F3.session.md",{"type":140,"value":141,"toc":806},"minimark",[142,146,150,155,219,333,336,340,360,537,548,700,710,731,735,789,796,802],[143,144,109],"h1",{"id":145},"session",[147,148,149],"p",{},"La session est résolue côté serveur. Elle est ensuite hydratée dans la page, injectée dans\nles handlers et transmise aux Fronds distantes.",[151,152,154],"h2",{"id":153},"usecurrentuser","useCurrentUser",[156,157,162],"pre",{"className":158,"code":159,"language":160,"meta":161,"style":161},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","const { user, refresh } = useCurrentUser();\n\u002F\u002F user:    Ref\u003CUser | null> — résolu en SSR, hydraté avec la page : zéro requête en plus\n\u002F\u002F refresh: () => Promise\u003Cvoid> — relire après sign-in\u002Fout\n","ts","",[163,164,165,206,213],"code",{"__ignoreMap":161},[166,167,170,174,178,182,185,188,191,195,199,203],"span",{"class":168,"line":169},"line",1,[166,171,173],{"class":172},"sbsja","const",[166,175,177],{"class":176},"sP7_E"," {",[166,179,181],{"class":180},"s_hVV"," user",[166,183,184],{"class":176},",",[166,186,187],{"class":180}," refresh",[166,189,190],{"class":176}," }",[166,192,194],{"class":193},"smGrS"," =",[166,196,198],{"class":197},"sGLFI"," useCurrentUser",[166,200,202],{"class":201},"su5hD","()",[166,204,205],{"class":176},";\n",[166,207,209],{"class":168,"line":208},2,[166,210,212],{"class":211},"sutJx","\u002F\u002F user:    Ref\u003CUser | null> — résolu en SSR, hydraté avec la page : zéro requête en plus\n",[166,214,216],{"class":168,"line":215},3,[166,217,218],{"class":211},"\u002F\u002F refresh: () => Promise\u003Cvoid> — relire après sign-in\u002Fout\n",[156,220,224],{"className":221,"code":222,"language":223,"meta":161,"style":161},"language-vue shiki shiki-themes material-theme-lighter github-light github-dark","\u003Ctemplate>\n  \u003CUButton v-if=\"user\" :to=\"localePath('\u002Fblog\u002Fnew')\" :label=\"$t('nav.write')\" \u002F>\n  \u003CUButton v-else :to=\"localePath('\u002Flogin')\" :label=\"$t('nav.signIn')\" \u002F>\n\u003C\u002Ftemplate>\n","vue",[163,225,226,238,290,323],{"__ignoreMap":161},[166,227,228,231,235],{"class":168,"line":169},[166,229,230],{"class":176},"\u003C",[166,232,234],{"class":233},"sQzsp","template",[166,236,237],{"class":176},">\n",[166,239,240,243,246,250,253,257,261,263,266,268,270,273,275,278,280,282,285,287],{"class":168,"line":208},[166,241,242],{"class":176},"  \u003C",[166,244,245],{"class":233},"UButton",[166,247,249],{"class":248},"s9AJx"," v-if",[166,251,252],{"class":176},"=",[166,254,256],{"class":255},"sjJ54","\"",[166,258,260],{"class":259},"s_sjI","user",[166,262,256],{"class":255},[166,264,265],{"class":248}," :to",[166,267,252],{"class":176},[166,269,256],{"class":255},[166,271,272],{"class":259},"localePath('\u002Fblog\u002Fnew')",[166,274,256],{"class":255},[166,276,277],{"class":248}," :label",[166,279,252],{"class":176},[166,281,256],{"class":255},[166,283,284],{"class":259},"$t('nav.write')",[166,286,256],{"class":255},[166,288,289],{"class":176}," \u002F>\n",[166,291,292,294,296,299,301,303,305,308,310,312,314,316,319,321],{"class":168,"line":215},[166,293,242],{"class":176},[166,295,245],{"class":233},[166,297,298],{"class":248}," v-else",[166,300,265],{"class":248},[166,302,252],{"class":176},[166,304,256],{"class":255},[166,306,307],{"class":259},"localePath('\u002Flogin')",[166,309,256],{"class":255},[166,311,277],{"class":248},[166,313,252],{"class":176},[166,315,256],{"class":255},[166,317,318],{"class":259},"$t('nav.signIn')",[166,320,256],{"class":255},[166,322,289],{"class":176},[166,324,326,329,331],{"class":168,"line":325},4,[166,327,328],{"class":176},"\u003C\u002F",[166,330,234],{"class":233},[166,332,237],{"class":176},[147,334,335],{},"La protection de route est un middleware Nuxt ordinaire qui lit la même session — Fougere\nn'ajoute pas de système de gardes parallèle.",[151,337,339],{"id":338},"la-surface-auth","La surface auth",[147,341,342,345,346,349,350,355,356,359],{},[163,343,344],{},"auth: betterAuth({ … })"," dans ",[163,347,348],{},"fougere.config.ts","\n(",[351,352,354],"a",{"href":353},"\u002Ffr\u002Fdocs\u002Fgetting-started#fougereconfigts-r%C3%A9f%C3%A9rence","référence",") monte better-auth sous\n",[163,357,358],{},"basePath"," — les endpoints que vos pages appellent directement :",[156,361,363],{"className":158,"code":362,"language":160,"meta":161,"style":161},"await $fetch('\u002Fauth\u002Fsign-up\u002Femail', { method: 'POST', body: { name, email, password } });\nawait $fetch('\u002Fauth\u002Fsign-in\u002Femail', { method: 'POST', body: { email, password } });\nawait $fetch('\u002Fauth\u002Fsign-out',      { method: 'POST', body: {} });\n\u002F\u002F puis : await refresh()\n",[163,364,365,436,487,532],{"__ignoreMap":161},[166,366,367,371,374,377,380,383,385,387,389,393,396,399,402,404,406,409,411,413,416,418,421,423,426,429,431,434],{"class":168,"line":169},[166,368,370],{"class":369},"sVHd0","await",[166,372,373],{"class":197}," $fetch",[166,375,376],{"class":201},"(",[166,378,379],{"class":255},"'",[166,381,382],{"class":259},"\u002Fauth\u002Fsign-up\u002Femail",[166,384,379],{"class":255},[166,386,184],{"class":176},[166,388,177],{"class":176},[166,390,392],{"class":391},"skxfh"," method",[166,394,395],{"class":176},":",[166,397,398],{"class":255}," '",[166,400,401],{"class":259},"POST",[166,403,379],{"class":255},[166,405,184],{"class":176},[166,407,408],{"class":391}," body",[166,410,395],{"class":176},[166,412,177],{"class":176},[166,414,415],{"class":201}," name",[166,417,184],{"class":176},[166,419,420],{"class":201}," email",[166,422,184],{"class":176},[166,424,425],{"class":201}," password ",[166,427,428],{"class":176},"}",[166,430,190],{"class":176},[166,432,433],{"class":201},")",[166,435,205],{"class":176},[166,437,438,440,442,444,446,449,451,453,455,457,459,461,463,465,467,469,471,473,475,477,479,481,483,485],{"class":168,"line":208},[166,439,370],{"class":369},[166,441,373],{"class":197},[166,443,376],{"class":201},[166,445,379],{"class":255},[166,447,448],{"class":259},"\u002Fauth\u002Fsign-in\u002Femail",[166,450,379],{"class":255},[166,452,184],{"class":176},[166,454,177],{"class":176},[166,456,392],{"class":391},[166,458,395],{"class":176},[166,460,398],{"class":255},[166,462,401],{"class":259},[166,464,379],{"class":255},[166,466,184],{"class":176},[166,468,408],{"class":391},[166,470,395],{"class":176},[166,472,177],{"class":176},[166,474,420],{"class":201},[166,476,184],{"class":176},[166,478,425],{"class":201},[166,480,428],{"class":176},[166,482,190],{"class":176},[166,484,433],{"class":201},[166,486,205],{"class":176},[166,488,489,491,493,495,497,500,502,504,507,509,511,513,515,517,519,521,523,526,528,530],{"class":168,"line":215},[166,490,370],{"class":369},[166,492,373],{"class":197},[166,494,376],{"class":201},[166,496,379],{"class":255},[166,498,499],{"class":259},"\u002Fauth\u002Fsign-out",[166,501,379],{"class":255},[166,503,184],{"class":176},[166,505,506],{"class":176},"      {",[166,508,392],{"class":391},[166,510,395],{"class":176},[166,512,398],{"class":255},[166,514,401],{"class":259},[166,516,379],{"class":255},[166,518,184],{"class":176},[166,520,408],{"class":391},[166,522,395],{"class":176},[166,524,525],{"class":176}," {}",[166,527,190],{"class":176},[166,529,433],{"class":201},[166,531,205],{"class":176},[166,533,534],{"class":168,"line":325},[166,535,536],{"class":211},"\u002F\u002F puis : await refresh()\n",[147,538,539,540,543,544,547],{},"Votre entité ",[163,541,542],{},"User"," étend ",[163,545,546],{},"AuthUser"," — les champs better-auth plus les vôtres :",[156,549,551],{"className":158,"code":550,"language":160,"meta":161,"style":161},"import { AuthUser } from '@fougere\u002Fauth-better';\nimport { oneOf, optional } from '@fougere\u002Fschema';\n\nexport default class User extends AuthUser.extend({\n  role: optional(oneOf('admin', 'editor', 'reader')),\n}) {}\n",[163,552,553,577,604,610,641,689],{"__ignoreMap":161},[166,554,555,558,560,563,565,568,570,573,575],{"class":168,"line":169},[166,556,557],{"class":369},"import",[166,559,177],{"class":176},[166,561,562],{"class":201}," AuthUser",[166,564,190],{"class":176},[166,566,567],{"class":369}," from",[166,569,398],{"class":255},[166,571,572],{"class":259},"@fougere\u002Fauth-better",[166,574,379],{"class":255},[166,576,205],{"class":176},[166,578,579,581,583,586,588,591,593,595,597,600,602],{"class":168,"line":208},[166,580,557],{"class":369},[166,582,177],{"class":176},[166,584,585],{"class":201}," oneOf",[166,587,184],{"class":176},[166,589,590],{"class":201}," optional",[166,592,190],{"class":176},[166,594,567],{"class":369},[166,596,398],{"class":255},[166,598,599],{"class":259},"@fougere\u002Fschema",[166,601,379],{"class":255},[166,603,205],{"class":176},[166,605,606],{"class":168,"line":215},[166,607,609],{"emptyLinePlaceholder":608},true,"\n",[166,611,612,615,618,621,625,628,630,633,636,638],{"class":168,"line":325},[166,613,614],{"class":369},"export",[166,616,617],{"class":369}," default",[166,619,620],{"class":172}," class",[166,622,624],{"class":623},"sbgvK"," User",[166,626,627],{"class":172}," extends",[166,629,562],{"class":201},[166,631,632],{"class":176},".",[166,634,635],{"class":197},"extend",[166,637,376],{"class":201},[166,639,640],{"class":176},"{\n",[166,642,644,647,649,651,653,656,658,660,663,665,667,669,672,674,676,678,681,683,686],{"class":168,"line":643},5,[166,645,646],{"class":391},"  role",[166,648,395],{"class":176},[166,650,590],{"class":197},[166,652,376],{"class":201},[166,654,655],{"class":197},"oneOf",[166,657,376],{"class":201},[166,659,379],{"class":255},[166,661,662],{"class":259},"admin",[166,664,379],{"class":255},[166,666,184],{"class":176},[166,668,398],{"class":255},[166,670,671],{"class":259},"editor",[166,673,379],{"class":255},[166,675,184],{"class":176},[166,677,398],{"class":255},[166,679,680],{"class":259},"reader",[166,682,379],{"class":255},[166,684,685],{"class":201},"))",[166,687,688],{"class":176},",\n",[166,690,692,694,697],{"class":168,"line":691},6,[166,693,428],{"class":176},[166,695,696],{"class":201},") ",[166,698,699],{"class":176},"{}\n",[147,701,702,703,705,706,709],{},"La sous-classe nommée compte : le scanner enregistre l'entité comme ",[163,704,542],{},", et la DI\nmatche ",[163,707,708],{},"user: User | null"," par ce nom.",[711,712,713],"blockquote",{},[147,714,715,716,718,719,722,723,726,727,730],{},"Ne placez pas de pages sous le ",[163,717,358],{}," auth : le catch-all serveur utilise ",[163,720,721],{},"\u002Fauth\u002F**",".\nCe site sert ses formulaires à ",[163,724,725],{},"\u002Flogin"," et ",[163,728,729],{},"\u002Fregister"," pour cette raison.",[151,732,734],{"id":733},"une-résolution-trois-lecteurs","Une résolution, trois lecteurs",[736,737,738,751],"table",{},[739,740,741],"thead",{},[742,743,744,748],"tr",{},[745,746,747],"th",{},"Lecteur",[745,749,750],{},"Comment l'identité arrive",[752,753,754,767,781],"tbody",{},[742,755,756,760],{},[757,758,759],"td",{},"la page",[757,761,762,763,766],{},"hydratation — ",[163,764,765],{},"useCurrentUser()",", zéro requête",[742,768,769,772],{},[757,770,771],{},"un handler",[757,773,774,775,778,779],{},"state d'invocation → un ",[351,776,777],{"href":81},"Collector"," remplit ",[163,780,708],{},[742,782,783,786],{},[757,784,785],{},"une Frond distante",[757,787,788],{},"le state est transmis avec l'appel — ses collectors reçoivent le même user",[147,790,791,792,795],{},"Le navigateur ne peut pas écrire ce state : il est construit côté serveur depuis le\ncontexte de requête\n(",[351,793,101],{"href":794},"\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands#le-fil-et-le-ssr",").",[147,797,798,799,801],{},"Suite : ",[351,800,113],{"href":114}," — appeler une opération côté serveur.",[803,804,805],"style",{},"html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s9AJx, html code.shiki .s9AJx{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":161,"searchDepth":208,"depth":208,"links":807},[808,809,810],{"id":153,"depth":208,"text":154},{"id":338,"depth":208,"text":339},{"id":733,"depth":208,"text":734},"useCurrentUser, la surface auth, et comment l'identité atteint handlers et remotes.","md",{},{"title":109,"description":811},"4SmWc_mI9zSbQC5et4d54ITS_h1vuWe3oiC6JrjKNmY",1786637819956]