[{"data":1,"prerenderedAt":813},["ShallowReactive",2],{"docs-nav:en":3,"docs:\u002Fdocs\u002Fclient\u002Fsession":134},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,16,20,24,42,63,92,113],{"title":10,"path":6,"stem":11},"What is Fougere","docs\u002Findex",{"title":13,"path":14,"stem":15},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",{"title":17,"path":18,"stem":19},"Existing Nuxt app","\u002Fdocs\u002Fexisting-app","docs\u002F02.existing-app",{"title":21,"path":22,"stem":23},"The CLI","\u002Fdocs\u002Fcli","docs\u002F03.cli",{"title":25,"path":26,"stem":27,"children":28,"page":41},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[29,33,37],{"title":30,"path":31,"stem":32},"Philosophy","\u002Fdocs\u002Fconcepts\u002Fphilosophy","docs\u002F2.concepts\u002F1.philosophy",{"title":34,"path":35,"stem":36},"The Frond","\u002Fdocs\u002Fconcepts\u002Ffrond","docs\u002F2.concepts\u002F2.frond",{"title":38,"path":39,"stem":40},"The shortest path","\u002Fdocs\u002Fconcepts\u002Fshortest-path","docs\u002F2.concepts\u002F3.shortest-path",false,{"title":43,"path":44,"stem":45,"children":46,"page":41},"Schema","\u002Fdocs\u002Fschema","docs\u002F3.schema",[47,51,55,59],{"title":48,"path":49,"stem":50},"Entities","\u002Fdocs\u002Fschema\u002Fentities","docs\u002F3.schema\u002F1.entities",{"title":52,"path":53,"stem":54},"Views","\u002Fdocs\u002Fschema\u002Fviews","docs\u002F3.schema\u002F2.views",{"title":56,"path":57,"stem":58},"The identity card","\u002Fdocs\u002Fschema\u002Fcard","docs\u002F3.schema\u002F3.card",{"title":60,"path":61,"stem":62},"Standard Schema","\u002Fdocs\u002Fschema\u002Fstandard-schema","docs\u002F3.schema\u002F4.standard-schema",{"title":64,"path":65,"stem":66,"children":67,"page":41},"Business","\u002Fdocs\u002Fbusiness","docs\u002F4.business",[68,72,76,80,84,88],{"title":69,"path":70,"stem":71},"Handlers","\u002Fdocs\u002Fbusiness\u002Fhandlers","docs\u002F4.business\u002F1.handlers",{"title":73,"path":74,"stem":75},"Presenters","\u002Fdocs\u002Fbusiness\u002Fpresenters","docs\u002F4.business\u002F2.presenters",{"title":77,"path":78,"stem":79},"Collectors","\u002Fdocs\u002Fbusiness\u002Fcollectors","docs\u002F4.business\u002F3.collectors",{"title":81,"path":82,"stem":83},"Errors","\u002Fdocs\u002Fbusiness\u002Ferrors","docs\u002F4.business\u002F4.errors",{"title":85,"path":86,"stem":87},"Seeds","\u002Fdocs\u002Fbusiness\u002Fseeds","docs\u002F4.business\u002F5.seeds",{"title":89,"path":90,"stem":91},"Facts","\u002Fdocs\u002Fbusiness\u002Ffacts","docs\u002F4.business\u002F6.facts",{"title":93,"path":94,"stem":95,"children":96,"page":41},"Client","\u002Fdocs\u002Fclient","docs\u002F5.client",[97,101,105,109],{"title":98,"path":99,"stem":100},"Queries & commands","\u002Fdocs\u002Fclient\u002Fqueries-commands","docs\u002F5.client\u002F1.queries-commands",{"title":102,"path":103,"stem":104},"Forms","\u002Fdocs\u002Fclient\u002Fforms","docs\u002F5.client\u002F2.forms",{"title":106,"path":107,"stem":108},"Session","\u002Fdocs\u002Fclient\u002Fsession","docs\u002F5.client\u002F3.session",{"title":110,"path":111,"stem":112},"invoke","\u002Fdocs\u002Fclient\u002Finvoke","docs\u002F5.client\u002F4.invoke",{"title":114,"path":115,"stem":116,"children":117,"page":41},"Infrastructure","\u002Fdocs\u002Finfra","docs\u002F6.infra",[118,122,126,130],{"title":119,"path":120,"stem":121},"The gradient","\u002Fdocs\u002Finfra\u002Fgradient","docs\u002F6.infra\u002F1.gradient",{"title":123,"path":124,"stem":125},"Surfaces — REST & GraphQL","\u002Fdocs\u002Finfra\u002Fsurfaces","docs\u002F6.infra\u002F2.surfaces",{"title":127,"path":128,"stem":129},"Deployment","\u002Fdocs\u002Finfra\u002Fdeployment","docs\u002F6.infra\u002F3.deployment",{"title":131,"path":132,"stem":133},"Hosts","\u002Fdocs\u002Finfra\u002Fhosts","docs\u002F6.infra\u002F4.hosts",{"id":135,"title":106,"body":136,"description":808,"extension":809,"meta":810,"navigation":605,"path":107,"seo":811,"stem":108,"__hash__":812},"docs_en\u002Fdocs\u002F5.client\u002F3.session.md",{"type":137,"value":138,"toc":803},"minimark",[139,143,147,152,216,330,333,337,357,534,545,697,707,728,732,786,793,799],[140,141,106],"h1",{"id":142},"session",[144,145,146],"p",{},"The session is resolved server-side. It is then hydrated into the page, injected into\nhandlers, and sent to remote Fronds.",[148,149,151],"h2",{"id":150},"usecurrentuser","useCurrentUser",[153,154,159],"pre",{"className":155,"code":156,"language":157,"meta":158,"style":158},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","const { user, refresh } = useCurrentUser();\n\u002F\u002F user:    Ref\u003CUser | null> — resolved during SSR, hydrated with the page: zero extra requests\n\u002F\u002F refresh: () => Promise\u003Cvoid> — re-read after sign-in\u002Fout\n","ts","",[160,161,162,203,210],"code",{"__ignoreMap":158},[163,164,167,171,175,179,182,185,188,192,196,200],"span",{"class":165,"line":166},"line",1,[163,168,170],{"class":169},"sbsja","const",[163,172,174],{"class":173},"sP7_E"," {",[163,176,178],{"class":177},"s_hVV"," user",[163,180,181],{"class":173},",",[163,183,184],{"class":177}," refresh",[163,186,187],{"class":173}," }",[163,189,191],{"class":190},"smGrS"," =",[163,193,195],{"class":194},"sGLFI"," useCurrentUser",[163,197,199],{"class":198},"su5hD","()",[163,201,202],{"class":173},";\n",[163,204,206],{"class":165,"line":205},2,[163,207,209],{"class":208},"sutJx","\u002F\u002F user:    Ref\u003CUser | null> — resolved during SSR, hydrated with the page: zero extra requests\n",[163,211,213],{"class":165,"line":212},3,[163,214,215],{"class":208},"\u002F\u002F refresh: () => Promise\u003Cvoid> — re-read after sign-in\u002Fout\n",[153,217,221],{"className":218,"code":219,"language":220,"meta":158,"style":158},"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",[160,222,223,235,287,320],{"__ignoreMap":158},[163,224,225,228,232],{"class":165,"line":166},[163,226,227],{"class":173},"\u003C",[163,229,231],{"class":230},"sQzsp","template",[163,233,234],{"class":173},">\n",[163,236,237,240,243,247,250,254,258,260,263,265,267,270,272,275,277,279,282,284],{"class":165,"line":205},[163,238,239],{"class":173},"  \u003C",[163,241,242],{"class":230},"UButton",[163,244,246],{"class":245},"s9AJx"," v-if",[163,248,249],{"class":173},"=",[163,251,253],{"class":252},"sjJ54","\"",[163,255,257],{"class":256},"s_sjI","user",[163,259,253],{"class":252},[163,261,262],{"class":245}," :to",[163,264,249],{"class":173},[163,266,253],{"class":252},[163,268,269],{"class":256},"localePath('\u002Fblog\u002Fnew')",[163,271,253],{"class":252},[163,273,274],{"class":245}," :label",[163,276,249],{"class":173},[163,278,253],{"class":252},[163,280,281],{"class":256},"$t('nav.write')",[163,283,253],{"class":252},[163,285,286],{"class":173}," \u002F>\n",[163,288,289,291,293,296,298,300,302,305,307,309,311,313,316,318],{"class":165,"line":212},[163,290,239],{"class":173},[163,292,242],{"class":230},[163,294,295],{"class":245}," v-else",[163,297,262],{"class":245},[163,299,249],{"class":173},[163,301,253],{"class":252},[163,303,304],{"class":256},"localePath('\u002Flogin')",[163,306,253],{"class":252},[163,308,274],{"class":245},[163,310,249],{"class":173},[163,312,253],{"class":252},[163,314,315],{"class":256},"$t('nav.signIn')",[163,317,253],{"class":252},[163,319,286],{"class":173},[163,321,323,326,328],{"class":165,"line":322},4,[163,324,325],{"class":173},"\u003C\u002F",[163,327,231],{"class":230},[163,329,234],{"class":173},[144,331,332],{},"Route protection is an ordinary Nuxt middleware reading the same session — Fougere does\nnot add a parallel guard system.",[148,334,336],{"id":335},"the-auth-surface","The auth surface",[144,338,339,342,343,346,347,352,353,356],{},[160,340,341],{},"auth: betterAuth({ … })"," in ",[160,344,345],{},"fougere.config.ts"," (",[348,349,351],"a",{"href":350},"\u002Fdocs\u002Fgetting-started#fougereconfigts-reference","reference",")\nmounts better-auth under ",[160,354,355],{},"basePath"," — the endpoints your pages call directly:",[153,358,360],{"className":155,"code":359,"language":157,"meta":158,"style":158},"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 then: await refresh()\n",[160,361,362,433,484,529],{"__ignoreMap":158},[163,363,364,368,371,374,377,380,382,384,386,390,393,396,399,401,403,406,408,410,413,415,418,420,423,426,428,431],{"class":165,"line":166},[163,365,367],{"class":366},"sVHd0","await",[163,369,370],{"class":194}," $fetch",[163,372,373],{"class":198},"(",[163,375,376],{"class":252},"'",[163,378,379],{"class":256},"\u002Fauth\u002Fsign-up\u002Femail",[163,381,376],{"class":252},[163,383,181],{"class":173},[163,385,174],{"class":173},[163,387,389],{"class":388},"skxfh"," method",[163,391,392],{"class":173},":",[163,394,395],{"class":252}," '",[163,397,398],{"class":256},"POST",[163,400,376],{"class":252},[163,402,181],{"class":173},[163,404,405],{"class":388}," body",[163,407,392],{"class":173},[163,409,174],{"class":173},[163,411,412],{"class":198}," name",[163,414,181],{"class":173},[163,416,417],{"class":198}," email",[163,419,181],{"class":173},[163,421,422],{"class":198}," password ",[163,424,425],{"class":173},"}",[163,427,187],{"class":173},[163,429,430],{"class":198},")",[163,432,202],{"class":173},[163,434,435,437,439,441,443,446,448,450,452,454,456,458,460,462,464,466,468,470,472,474,476,478,480,482],{"class":165,"line":205},[163,436,367],{"class":366},[163,438,370],{"class":194},[163,440,373],{"class":198},[163,442,376],{"class":252},[163,444,445],{"class":256},"\u002Fauth\u002Fsign-in\u002Femail",[163,447,376],{"class":252},[163,449,181],{"class":173},[163,451,174],{"class":173},[163,453,389],{"class":388},[163,455,392],{"class":173},[163,457,395],{"class":252},[163,459,398],{"class":256},[163,461,376],{"class":252},[163,463,181],{"class":173},[163,465,405],{"class":388},[163,467,392],{"class":173},[163,469,174],{"class":173},[163,471,417],{"class":198},[163,473,181],{"class":173},[163,475,422],{"class":198},[163,477,425],{"class":173},[163,479,187],{"class":173},[163,481,430],{"class":198},[163,483,202],{"class":173},[163,485,486,488,490,492,494,497,499,501,504,506,508,510,512,514,516,518,520,523,525,527],{"class":165,"line":212},[163,487,367],{"class":366},[163,489,370],{"class":194},[163,491,373],{"class":198},[163,493,376],{"class":252},[163,495,496],{"class":256},"\u002Fauth\u002Fsign-out",[163,498,376],{"class":252},[163,500,181],{"class":173},[163,502,503],{"class":173},"      {",[163,505,389],{"class":388},[163,507,392],{"class":173},[163,509,395],{"class":252},[163,511,398],{"class":256},[163,513,376],{"class":252},[163,515,181],{"class":173},[163,517,405],{"class":388},[163,519,392],{"class":173},[163,521,522],{"class":173}," {}",[163,524,187],{"class":173},[163,526,430],{"class":198},[163,528,202],{"class":173},[163,530,531],{"class":165,"line":322},[163,532,533],{"class":208},"\u002F\u002F then: await refresh()\n",[144,535,536,537,540,541,544],{},"Your ",[160,538,539],{},"User"," entity extends ",[160,542,543],{},"AuthUser"," — better-auth's fields plus yours:",[153,546,548],{"className":155,"code":547,"language":157,"meta":158,"style":158},"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",[160,549,550,574,601,607,638,686],{"__ignoreMap":158},[163,551,552,555,557,560,562,565,567,570,572],{"class":165,"line":166},[163,553,554],{"class":366},"import",[163,556,174],{"class":173},[163,558,559],{"class":198}," AuthUser",[163,561,187],{"class":173},[163,563,564],{"class":366}," from",[163,566,395],{"class":252},[163,568,569],{"class":256},"@fougere\u002Fauth-better",[163,571,376],{"class":252},[163,573,202],{"class":173},[163,575,576,578,580,583,585,588,590,592,594,597,599],{"class":165,"line":205},[163,577,554],{"class":366},[163,579,174],{"class":173},[163,581,582],{"class":198}," oneOf",[163,584,181],{"class":173},[163,586,587],{"class":198}," optional",[163,589,187],{"class":173},[163,591,564],{"class":366},[163,593,395],{"class":252},[163,595,596],{"class":256},"@fougere\u002Fschema",[163,598,376],{"class":252},[163,600,202],{"class":173},[163,602,603],{"class":165,"line":212},[163,604,606],{"emptyLinePlaceholder":605},true,"\n",[163,608,609,612,615,618,622,625,627,630,633,635],{"class":165,"line":322},[163,610,611],{"class":366},"export",[163,613,614],{"class":366}," default",[163,616,617],{"class":169}," class",[163,619,621],{"class":620},"sbgvK"," User",[163,623,624],{"class":169}," extends",[163,626,559],{"class":198},[163,628,629],{"class":173},".",[163,631,632],{"class":194},"extend",[163,634,373],{"class":198},[163,636,637],{"class":173},"{\n",[163,639,641,644,646,648,650,653,655,657,660,662,664,666,669,671,673,675,678,680,683],{"class":165,"line":640},5,[163,642,643],{"class":388},"  role",[163,645,392],{"class":173},[163,647,587],{"class":194},[163,649,373],{"class":198},[163,651,652],{"class":194},"oneOf",[163,654,373],{"class":198},[163,656,376],{"class":252},[163,658,659],{"class":256},"admin",[163,661,376],{"class":252},[163,663,181],{"class":173},[163,665,395],{"class":252},[163,667,668],{"class":256},"editor",[163,670,376],{"class":252},[163,672,181],{"class":173},[163,674,395],{"class":252},[163,676,677],{"class":256},"reader",[163,679,376],{"class":252},[163,681,682],{"class":198},"))",[163,684,685],{"class":173},",\n",[163,687,689,691,694],{"class":165,"line":688},6,[163,690,425],{"class":173},[163,692,693],{"class":198},") ",[163,695,696],{"class":173},"{}\n",[144,698,699,700,702,703,706],{},"The named subclass matters: the scanner registers the entity as ",[160,701,539],{},", and DI matches\n",[160,704,705],{},"user: User | null"," by that name.",[708,709,710],"blockquote",{},[144,711,712,713,715,716,719,720,723,724,727],{},"Do not place pages under the auth ",[160,714,355],{},": the server catch-all uses ",[160,717,718],{},"\u002Fauth\u002F**",".\nThis site serves its forms at ",[160,721,722],{},"\u002Flogin"," and ",[160,725,726],{},"\u002Fregister"," for that reason.",[148,729,731],{"id":730},"one-resolution-three-readers","One resolution, three readers",[733,734,735,748],"table",{},[736,737,738],"thead",{},[739,740,741,745],"tr",{},[742,743,744],"th",{},"Reader",[742,746,747],{},"How identity arrives",[749,750,751,764,778],"tbody",{},[739,752,753,757],{},[754,755,756],"td",{},"the page",[754,758,759,760,763],{},"hydration — ",[160,761,762],{},"useCurrentUser()",", zero requests",[739,765,766,769],{},[754,767,768],{},"a handler",[754,770,771,772,775,776],{},"invocation state → a ",[348,773,774],{"href":78},"Collector"," fills ",[160,777,705],{},[739,779,780,783],{},[754,781,782],{},"a remote Frond",[754,784,785],{},"state is sent with the call — its collectors receive the same user",[144,787,788,789,792],{},"The browser cannot write this state: it is built server-side from the request context\n(",[348,790,98],{"href":791},"\u002Fdocs\u002Fclient\u002Fqueries-commands#the-wire-and-ssr",").",[144,794,795,796,798],{},"Next: ",[348,797,110],{"href":111}," — calling an operation server-side.",[800,801,802],"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 .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 .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 .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}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}",{"title":158,"searchDepth":205,"depth":205,"links":804},[805,806,807],{"id":150,"depth":205,"text":151},{"id":335,"depth":205,"text":336},{"id":730,"depth":205,"text":731},"useCurrentUser, the auth surface, and how identity reaches handlers and remotes.","md",{},{"title":106,"description":808},"pM_3tP8Twe-1b0dbQfSPMSkmwk8oWHUYm9NiGtXFpPg",1786637819504]