[{"data":1,"prerenderedAt":1720},["ShallowReactive",2],{"navigation_docs":3,"-api-server-utils":152,"-api-server-utils-surround":1715},[4,42,68,110,131],{"title":5,"path":6,"stem":7,"children":8,"icon":11},"Getting Started","/getting-started","1.getting-started/0.index",[9,12,17,22,27,32,37],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-sparkles",{"title":13,"path":14,"stem":15,"icon":16},"Installation","/getting-started/installation","1.getting-started/1.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Configuration","/getting-started/configuration","1.getting-started/2.configuration","i-lucide-settings",{"title":23,"path":24,"stem":25,"icon":26},"Client Setup","/getting-started/client-setup","1.getting-started/3.client-setup","i-lucide-monitor",{"title":28,"path":29,"stem":30,"icon":31},"Type Augmentation","/getting-started/type-augmentation","1.getting-started/4.type-augmentation","i-lucide-type",{"title":33,"path":34,"stem":35,"icon":36},"Schema Generation (NuxtHub)","/getting-started/schema-generation","1.getting-started/5.schema-generation","i-lucide-database",{"title":38,"path":39,"stem":40,"icon":41},"How It Works","/getting-started/how-it-works","1.getting-started/6.how-it-works","i-lucide-workflow",{"title":43,"path":44,"stem":45,"children":46,"page":67},"Core Concepts","/core-concepts","2.core-concepts",[47,51,55,59,63],{"title":48,"path":49,"stem":50},"serverAuth()","/core-concepts/server-auth","2.core-concepts/1.server-auth",{"title":52,"path":53,"stem":54},"Sessions","/core-concepts/sessions","2.core-concepts/2.sessions",{"title":56,"path":57,"stem":58},"Route Protection","/core-concepts/route-protection","2.core-concepts/3.route-protection",{"title":60,"path":61,"stem":62},"Auto‑Imports and Aliases","/core-concepts/auto-imports-aliases","2.core-concepts/4.auto-imports-aliases",{"title":64,"path":65,"stem":66},"Security & Caveats","/core-concepts/security-caveats","2.core-concepts/5.security-caveats",false,{"title":69,"path":70,"stem":71,"children":72,"page":67},"Guides","/guides","3.guides",[73,77,81,85,89,94,98,102,106],{"title":74,"path":75,"stem":76},"Role‑Based Access","/guides/role-based-access","3.guides/1.role-based-access",{"title":78,"path":79,"stem":80},"OAuth Providers","/guides/oauth-providers","3.guides/2.oauth-providers",{"title":82,"path":83,"stem":84},"Custom Database","/guides/custom-database","3.guides/3.custom-database",{"title":86,"path":87,"stem":88},"Database-less Mode","/guides/database-less-mode","3.guides/4.database-less-mode",{"title":90,"path":91,"stem":92,"icon":93},"External Auth Backend","/guides/external-auth-backend","3.guides/5.external-auth-backend","i-lucide-server",{"title":95,"path":96,"stem":97},"Migrating from nuxt-auth-utils","/guides/migrate-from-nuxt-auth-utils","3.guides/6.migrate-from-nuxt-auth-utils",{"title":99,"path":100,"stem":101},"Two-Factor Authentication (TOTP + Backup Codes)","/guides/two-factor-auth","3.guides/7.two-factor-auth",{"title":103,"path":104,"stem":105},"Testing","/guides/testing","3.guides/8.testing",{"title":107,"path":108,"stem":109},"Production Deployment","/guides/production-deployment","3.guides/9.production-deployment",{"title":111,"path":112,"stem":113,"children":114,"page":67},"Integrations","/integrations","4.integrations",[115,119,123,127],{"title":116,"path":117,"stem":118},"NuxtHub","/integrations/nuxthub","4.integrations/1.nuxthub",{"title":120,"path":121,"stem":122},"DevTools","/integrations/devtools","4.integrations/2.devtools",{"title":124,"path":125,"stem":126},"Convex","/integrations/convex","4.integrations/3.convex",{"title":128,"path":129,"stem":130},"i18n","/integrations/i18n","4.integrations/4.i18n",{"title":132,"path":133,"stem":134,"children":135,"page":67},"API Reference","/api","5.api",[136,140,144,148],{"title":137,"path":138,"stem":139},"Composables","/api/composables","5.api/1.composables",{"title":141,"path":142,"stem":143},"Server Utilities","/api/server-utils","5.api/2.server-utils",{"title":145,"path":146,"stem":147},"Components","/api/components","5.api/3.components",{"title":149,"path":150,"stem":151},"Types","/api/types","5.api/4.types",{"id":153,"title":141,"body":154,"description":1709,"extension":1710,"links":1711,"meta":1712,"navigation":311,"path":142,"seo":1713,"stem":143,"__hash__":1714},"docs/5.api/2.server-utils.md",{"type":155,"value":156,"toc":1693},"minimark",[157,161,175,180,183,393,396,459,470,474,477,553,562,567,583,587,593,666,673,689,693,698,776,789,792,798,813,1026,1029,1033,1036,1158,1161,1165,1168,1258,1261,1267,1271,1281,1322,1346,1349,1361,1365,1370,1412,1417,1477,1481,1669,1673,1689],[158,159,160],"p",{},"Use this page when you need exact behavior for the auto-imported server helpers registered by the module.",[162,163,164,165,169,170,174],"warning",{},"These utilities are only available in ",[166,167,168],"strong",{},"full mode",". In ",[171,172,173],"a",{"href":91},"clientOnly mode",", there is no local auth server, so these utilities are not registered.",[176,177,179],"h2",{"id":178},"serverauth","serverAuth",[158,181,182],{},"Returns the initialized Better Auth instance (module-level singleton). Pass the event for accurate URL detection on first initialization.",[184,185,191],"pre",{"className":186,"code":187,"filename":188,"language":189,"meta":190,"style":190},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","export default defineEventHandler(async (event) => {\n  const auth = serverAuth(event)\n  const session = await auth.api.getSession({ headers: event.headers })\n\n  if (!session) {\n    throw createError({ statusCode: 401 })\n  }\n\n  return { user: session.user }\n})\n","server/api/admin/users.get.ts","ts","",[192,193,194,234,259,306,313,331,353,359,364,387],"code",{"__ignoreMap":190},[195,196,199,203,207,211,215,218,221,225,228,231],"span",{"class":197,"line":198},"line",1,[195,200,202],{"class":201},"sqe1H","export",[195,204,206],{"class":205},"sKg8T"," default",[195,208,210],{"class":209},"sfT9l"," defineEventHandler",[195,212,214],{"class":213},"s17Py","(",[195,216,217],{"class":201},"async",[195,219,220],{"class":213}," (",[195,222,224],{"class":223},"sgisi","event",[195,226,227],{"class":213},") ",[195,229,230],{"class":201},"=>",[195,232,233],{"class":213}," {\n",[195,235,237,240,244,248,251,253,256],{"class":197,"line":236},2,[195,238,239],{"class":201},"  const",[195,241,243],{"class":242},"s6Rhl"," auth",[195,245,247],{"class":246},"sQBpM"," =",[195,249,250],{"class":209}," serverAuth",[195,252,214],{"class":213},[195,254,224],{"class":255},"sYvLG",[195,257,258],{"class":213},")\n",[195,260,262,264,267,269,272,275,278,281,283,286,289,292,296,299,301,303],{"class":197,"line":261},3,[195,263,239],{"class":201},[195,265,266],{"class":242}," session",[195,268,247],{"class":246},[195,270,271],{"class":201}," await",[195,273,243],{"class":274},"svFNh",[195,276,277],{"class":213},".",[195,279,280],{"class":255},"api",[195,282,277],{"class":213},[195,284,285],{"class":209},"getSession",[195,287,288],{"class":213},"({ ",[195,290,291],{"class":255},"headers",[195,293,295],{"class":294},"sVnqq",":",[195,297,298],{"class":274}," event",[195,300,277],{"class":213},[195,302,291],{"class":255},[195,304,305],{"class":213}," })\n",[195,307,309],{"class":197,"line":308},4,[195,310,312],{"emptyLinePlaceholder":311},true,"\n",[195,314,316,319,321,325,328],{"class":197,"line":315},5,[195,317,318],{"class":201},"  if",[195,320,220],{"class":213},[195,322,324],{"class":323},"sn-Jc","!",[195,326,327],{"class":255},"session",[195,329,330],{"class":213},") {\n",[195,332,334,337,340,342,345,347,351],{"class":197,"line":333},6,[195,335,336],{"class":201},"    throw",[195,338,339],{"class":209}," createError",[195,341,288],{"class":213},[195,343,344],{"class":255},"statusCode",[195,346,295],{"class":294},[195,348,350],{"class":349},"s3ZNE"," 401",[195,352,305],{"class":213},[195,354,356],{"class":197,"line":355},7,[195,357,358],{"class":213},"  }\n",[195,360,362],{"class":197,"line":361},8,[195,363,312],{"emptyLinePlaceholder":311},[195,365,367,370,373,376,378,380,382,384],{"class":197,"line":366},9,[195,368,369],{"class":201},"  return",[195,371,372],{"class":213}," { ",[195,374,375],{"class":255},"user",[195,377,295],{"class":294},[195,379,266],{"class":274},[195,381,277],{"class":213},[195,383,375],{"class":255},[195,385,386],{"class":213}," }\n",[195,388,390],{"class":197,"line":389},10,[195,391,392],{"class":213},"})\n",[158,394,395],{},"You can also pass query options to bypass cookie cache / refresh behavior:",[184,397,399],{"className":186,"code":398,"language":189,"meta":190,"style":190},"await auth.api.getSession({\n  headers: event.headers,\n  query: { disableCookieCache: true },\n})\n",[192,400,401,419,435,455],{"__ignoreMap":190},[195,402,403,406,408,410,412,414,416],{"class":197,"line":198},[195,404,405],{"class":201},"await",[195,407,243],{"class":274},[195,409,277],{"class":213},[195,411,280],{"class":255},[195,413,277],{"class":213},[195,415,285],{"class":209},[195,417,418],{"class":213},"({\n",[195,420,421,424,426,428,430,432],{"class":197,"line":236},[195,422,423],{"class":255},"  headers",[195,425,295],{"class":294},[195,427,298],{"class":274},[195,429,277],{"class":213},[195,431,291],{"class":255},[195,433,434],{"class":213},",\n",[195,436,437,440,442,444,447,449,452],{"class":197,"line":261},[195,438,439],{"class":255},"  query",[195,441,295],{"class":294},[195,443,372],{"class":213},[195,445,446],{"class":255},"disableCookieCache",[195,448,295],{"class":294},[195,450,451],{"class":349}," true",[195,453,454],{"class":213}," },\n",[195,456,457],{"class":197,"line":308},[195,458,392],{"class":213},[460,461,462,463,466,467,469],"note",{},"Use ",[192,464,465],{},"serverAuth(event)"," in request handlers to access advanced Better Auth features not exposed by the helper wrappers. In non-request contexts, you can call ",[192,468,48],{}," without an event.",[176,471,473],{"id":472},"getusersession","getUserSession",[158,475,476],{},"Retrieves the current session from the request context without throwing an error if unauthenticated.",[184,478,481],{"className":186,"code":479,"filename":480,"language":189,"meta":190,"style":190},"export default defineEventHandler(async (event) => {\n  const session = await getUserSession(event)\n  \n  if (session) {\n    // ...\n  }\n})\n","server/api/example.ts",[192,482,483,505,524,529,539,545,549],{"__ignoreMap":190},[195,484,485,487,489,491,493,495,497,499,501,503],{"class":197,"line":198},[195,486,202],{"class":201},[195,488,206],{"class":205},[195,490,210],{"class":209},[195,492,214],{"class":213},[195,494,217],{"class":201},[195,496,220],{"class":213},[195,498,224],{"class":223},[195,500,227],{"class":213},[195,502,230],{"class":201},[195,504,233],{"class":213},[195,506,507,509,511,513,515,518,520,522],{"class":197,"line":236},[195,508,239],{"class":201},[195,510,266],{"class":242},[195,512,247],{"class":246},[195,514,271],{"class":201},[195,516,517],{"class":209}," getUserSession",[195,519,214],{"class":213},[195,521,224],{"class":255},[195,523,258],{"class":213},[195,525,526],{"class":197,"line":261},[195,527,528],{"class":213},"  \n",[195,530,531,533,535,537],{"class":197,"line":308},[195,532,318],{"class":201},[195,534,220],{"class":213},[195,536,327],{"class":255},[195,538,330],{"class":213},[195,540,541],{"class":197,"line":315},[195,542,544],{"class":543},"st7cf","    // ...\n",[195,546,547],{"class":197,"line":333},[195,548,358],{"class":213},[195,550,551],{"class":197,"line":355},[195,552,392],{"class":213},[158,554,555,557,558,561],{},[192,556,473],{}," does not create request-cache entries by itself. Use ",[192,559,560],{},"getRequestSession(event)"," when you need request-lifetime caching across middleware/handlers.",[158,563,564],{},[166,565,566],{},"Returns:",[568,569,570,577],"ul",{},[571,572,573,576],"li",{},[192,574,575],{},"{ user: AuthUser, session: AuthSession }"," if authenticated.",[571,578,579,582],{},[192,580,581],{},"null"," if unauthenticated.",[176,584,586],{"id":585},"getrequestsession","getRequestSession",[158,588,589,590,277],{},"Retrieves the current session and memoizes it for the lifetime of the current request. In Nuxt and Nitro handlers, the helper stores the memoized value on ",[192,591,592],{},"event.context.requestSession",[184,594,596],{"className":186,"code":595,"filename":480,"language":189,"meta":190,"style":190},"export default defineEventHandler(async (event) => {\n  const requestSession = await getRequestSession(event)\n  const sameRequestSession = await getRequestSession(event) // cached\n})\n",[192,597,598,620,640,662],{"__ignoreMap":190},[195,599,600,602,604,606,608,610,612,614,616,618],{"class":197,"line":198},[195,601,202],{"class":201},[195,603,206],{"class":205},[195,605,210],{"class":209},[195,607,214],{"class":213},[195,609,217],{"class":201},[195,611,220],{"class":213},[195,613,224],{"class":223},[195,615,227],{"class":213},[195,617,230],{"class":201},[195,619,233],{"class":213},[195,621,622,624,627,629,631,634,636,638],{"class":197,"line":236},[195,623,239],{"class":201},[195,625,626],{"class":242}," requestSession",[195,628,247],{"class":246},[195,630,271],{"class":201},[195,632,633],{"class":209}," getRequestSession",[195,635,214],{"class":213},[195,637,224],{"class":255},[195,639,258],{"class":213},[195,641,642,644,647,649,651,653,655,657,659],{"class":197,"line":261},[195,643,239],{"class":201},[195,645,646],{"class":242}," sameRequestSession",[195,648,247],{"class":246},[195,650,271],{"class":201},[195,652,633],{"class":209},[195,654,214],{"class":213},[195,656,224],{"class":255},[195,658,227],{"class":213},[195,660,661],{"class":543},"// cached\n",[195,663,664],{"class":197,"line":308},[195,665,392],{"class":213},[158,667,668,669,672],{},"Use this helper when multiple handlers/middleware in the same request need session access without repeating ",[192,670,671],{},"auth.api.getSession()"," calls.",[460,674,675,677,678,681,682,685,686,277],{},[192,676,586],{}," stays type-compatible in projects that use narrowed ",[192,679,680],{},"h3"," typings where ",[192,683,684],{},"H3Event"," does not explicitly declare ",[192,687,688],{},"context",[176,690,692],{"id":691},"refreshsessioncookiecache","refreshSessionCookieCache",[158,694,695,696,277],{},"Refreshes Better Auth's cached session cookie on the current response, then refreshes the request-cached session used by ",[192,697,560],{},[184,699,702],{"className":186,"code":700,"filename":701,"language":189,"meta":190,"style":190},"export default defineEventHandler(async (event) => {\n  await updateCurrentUserProfile(event)\n  await refreshSessionCookieCache(event)\n\n  return { ok: true }\n})\n","server/api/profile.patch.ts",[192,703,704,726,740,753,757,772],{"__ignoreMap":190},[195,705,706,708,710,712,714,716,718,720,722,724],{"class":197,"line":198},[195,707,202],{"class":201},[195,709,206],{"class":205},[195,711,210],{"class":209},[195,713,214],{"class":213},[195,715,217],{"class":201},[195,717,220],{"class":213},[195,719,224],{"class":223},[195,721,227],{"class":213},[195,723,230],{"class":201},[195,725,233],{"class":213},[195,727,728,731,734,736,738],{"class":197,"line":236},[195,729,730],{"class":201},"  await",[195,732,733],{"class":209}," updateCurrentUserProfile",[195,735,214],{"class":213},[195,737,224],{"class":255},[195,739,258],{"class":213},[195,741,742,744,747,749,751],{"class":197,"line":261},[195,743,730],{"class":201},[195,745,746],{"class":209}," refreshSessionCookieCache",[195,748,214],{"class":213},[195,750,224],{"class":255},[195,752,258],{"class":213},[195,754,755],{"class":197,"line":308},[195,756,312],{"emptyLinePlaceholder":311},[195,758,759,761,763,766,768,770],{"class":197,"line":315},[195,760,369],{"class":201},[195,762,372],{"class":213},[195,764,765],{"class":255},"ok",[195,767,295],{"class":294},[195,769,451],{"class":349},[195,771,386],{"class":213},[195,773,774],{"class":197,"line":333},[195,775,392],{"class":213},[158,777,778,779,781,782,784,785,788],{},"Use this helper after server-side code changes data returned by ",[192,780,671],{}," or ",[192,783,560],{},", such as user fields added through Better Auth's ",[192,786,787],{},"custom-session"," plugin.",[460,790,791],{},"This refreshes the cached session cookie. It does not update the session or user record; perform that update first.",[176,793,795,796],{"id":794},"session-enrichment-with-custom-session","Session Enrichment with ",[192,797,787],{},[158,799,800,801,803,804,807,808,781,810,812],{},"Use Better Auth's ",[192,802,787],{}," plugin when your app needs computed fields in the session payload returned by server helpers. Define the enrichment in ",[192,805,806],{},"server/auth.config.ts",", and ",[192,809,473],{},[192,811,586],{}," will return the enriched shape.",[184,814,816],{"className":186,"code":815,"filename":806,"language":189,"meta":190,"style":190},"import { customSession } from 'better-auth/plugins'\nimport { defineServerAuth } from '@onmax/nuxt-better-auth/config'\n\nexport default defineServerAuth({\n  plugins: [\n    customSession(async ({ user, session }) => {\n      return {\n        user: {\n          ...user,\n          role: user.email?.endsWith('@company.com') ? 'member' : 'guest',\n        },\n        session: {\n          ...session,\n        },\n      }\n    }),\n  ],\n})\n",[192,817,818,838,854,858,869,879,905,912,921,930,973,979,989,998,1003,1009,1015,1021],{"__ignoreMap":190},[195,819,820,823,825,828,831,834],{"class":197,"line":198},[195,821,822],{"class":201},"import",[195,824,372],{"class":213},[195,826,827],{"class":255},"customSession",[195,829,830],{"class":213}," } ",[195,832,833],{"class":201},"from",[195,835,837],{"class":836},"sPAZv"," 'better-auth/plugins'\n",[195,839,840,842,844,847,849,851],{"class":197,"line":236},[195,841,822],{"class":201},[195,843,372],{"class":213},[195,845,846],{"class":255},"defineServerAuth",[195,848,830],{"class":213},[195,850,833],{"class":201},[195,852,853],{"class":836}," '@onmax/nuxt-better-auth/config'\n",[195,855,856],{"class":197,"line":261},[195,857,312],{"emptyLinePlaceholder":311},[195,859,860,862,864,867],{"class":197,"line":308},[195,861,202],{"class":201},[195,863,206],{"class":205},[195,865,866],{"class":209}," defineServerAuth",[195,868,418],{"class":213},[195,870,871,874,876],{"class":197,"line":315},[195,872,873],{"class":255},"  plugins",[195,875,295],{"class":294},[195,877,878],{"class":213}," [\n",[195,880,881,884,886,888,891,893,896,898,901,903],{"class":197,"line":333},[195,882,883],{"class":209},"    customSession",[195,885,214],{"class":213},[195,887,217],{"class":201},[195,889,890],{"class":213}," ({ ",[195,892,375],{"class":223},[195,894,895],{"class":213},", ",[195,897,327],{"class":223},[195,899,900],{"class":213}," }) ",[195,902,230],{"class":201},[195,904,233],{"class":213},[195,906,907,910],{"class":197,"line":355},[195,908,909],{"class":201},"      return",[195,911,233],{"class":213},[195,913,914,917,919],{"class":197,"line":361},[195,915,916],{"class":255},"        user",[195,918,295],{"class":294},[195,920,233],{"class":213},[195,922,923,926,928],{"class":197,"line":366},[195,924,925],{"class":323},"          ...",[195,927,375],{"class":255},[195,929,434],{"class":213},[195,931,932,935,937,940,942,946,949,952,954,957,959,962,965,968,971],{"class":197,"line":389},[195,933,934],{"class":255},"          role",[195,936,295],{"class":294},[195,938,939],{"class":274}," user",[195,941,277],{"class":213},[195,943,945],{"class":944},"sjaJz","email",[195,947,948],{"class":213},"?.",[195,950,951],{"class":209},"endsWith",[195,953,214],{"class":213},[195,955,956],{"class":836},"'@company.com'",[195,958,227],{"class":213},[195,960,961],{"class":323},"?",[195,963,964],{"class":836}," 'member'",[195,966,967],{"class":323}," :",[195,969,970],{"class":836}," 'guest'",[195,972,434],{"class":213},[195,974,976],{"class":197,"line":975},11,[195,977,978],{"class":213},"        },\n",[195,980,982,985,987],{"class":197,"line":981},12,[195,983,984],{"class":255},"        session",[195,986,295],{"class":294},[195,988,233],{"class":213},[195,990,992,994,996],{"class":197,"line":991},13,[195,993,925],{"class":323},[195,995,327],{"class":255},[195,997,434],{"class":213},[195,999,1001],{"class":197,"line":1000},14,[195,1002,978],{"class":213},[195,1004,1006],{"class":197,"line":1005},15,[195,1007,1008],{"class":213},"      }\n",[195,1010,1012],{"class":197,"line":1011},16,[195,1013,1014],{"class":213},"    }),\n",[195,1016,1018],{"class":197,"line":1017},17,[195,1019,1020],{"class":213},"  ],\n",[195,1022,1024],{"class":197,"line":1023},18,[195,1025,392],{"class":213},[460,1027,1028],{},"This uses Better Auth's plugin API and does not require a module-specific option.",[176,1030,1032],{"id":1031},"createsession","createSession",[158,1034,1035],{},"Creates a Better Auth session for a user and returns the created session record. Use this helper in custom server-side authentication flows after your handler verifies the user identity.",[184,1037,1040],{"className":186,"code":1038,"filename":1039,"language":189,"meta":190,"style":190},"export default defineEventHandler(async (event) => {\n  const userId = await verifyCustomLoginAndReturnUserId(event)\n  const session = await createSession(event, userId)\n\n  return {\n    sessionId: session.id,\n    token: session.token,\n  }\n})\n","server/api/custom-auth.post.ts",[192,1041,1042,1064,1084,1108,1112,1118,1134,1150,1154],{"__ignoreMap":190},[195,1043,1044,1046,1048,1050,1052,1054,1056,1058,1060,1062],{"class":197,"line":198},[195,1045,202],{"class":201},[195,1047,206],{"class":205},[195,1049,210],{"class":209},[195,1051,214],{"class":213},[195,1053,217],{"class":201},[195,1055,220],{"class":213},[195,1057,224],{"class":223},[195,1059,227],{"class":213},[195,1061,230],{"class":201},[195,1063,233],{"class":213},[195,1065,1066,1068,1071,1073,1075,1078,1080,1082],{"class":197,"line":236},[195,1067,239],{"class":201},[195,1069,1070],{"class":242}," userId",[195,1072,247],{"class":246},[195,1074,271],{"class":201},[195,1076,1077],{"class":209}," verifyCustomLoginAndReturnUserId",[195,1079,214],{"class":213},[195,1081,224],{"class":255},[195,1083,258],{"class":213},[195,1085,1086,1088,1090,1092,1094,1097,1099,1101,1103,1106],{"class":197,"line":261},[195,1087,239],{"class":201},[195,1089,266],{"class":242},[195,1091,247],{"class":246},[195,1093,271],{"class":201},[195,1095,1096],{"class":209}," createSession",[195,1098,214],{"class":213},[195,1100,224],{"class":255},[195,1102,895],{"class":213},[195,1104,1105],{"class":255},"userId",[195,1107,258],{"class":213},[195,1109,1110],{"class":197,"line":308},[195,1111,312],{"emptyLinePlaceholder":311},[195,1113,1114,1116],{"class":197,"line":315},[195,1115,369],{"class":201},[195,1117,233],{"class":213},[195,1119,1120,1123,1125,1127,1129,1132],{"class":197,"line":333},[195,1121,1122],{"class":255},"    sessionId",[195,1124,295],{"class":294},[195,1126,266],{"class":274},[195,1128,277],{"class":213},[195,1130,1131],{"class":255},"id",[195,1133,434],{"class":213},[195,1135,1136,1139,1141,1143,1145,1148],{"class":197,"line":355},[195,1137,1138],{"class":255},"    token",[195,1140,295],{"class":294},[195,1142,266],{"class":274},[195,1144,277],{"class":213},[195,1146,1147],{"class":255},"token",[195,1149,434],{"class":213},[195,1151,1152],{"class":197,"line":361},[195,1153,358],{"class":213},[195,1155,1156],{"class":197,"line":366},[195,1157,392],{"class":213},[158,1159,1160],{},"Pair this helper with your preferred cookie strategy. When you also use the module cookie helper, you can set the returned token on the response after creating the session.",[176,1162,1164],{"id":1163},"setsessioncookie","setSessionCookie",[158,1166,1167],{},"Sets the Better Auth session token cookie on the current response. Use this helper in custom server-side authentication flows after you obtain or create a valid Better Auth session token.",[184,1169,1171],{"className":186,"code":1170,"filename":1039,"language":189,"meta":190,"style":190},"export default defineEventHandler(async (event) => {\n  const token = await verifyCustomLoginAndReturnSessionToken(event)\n\n  await setSessionCookie(event, token)\n\n  return { ok: true }\n})\n",[192,1172,1173,1195,1215,1219,1236,1240,1254],{"__ignoreMap":190},[195,1174,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193],{"class":197,"line":198},[195,1176,202],{"class":201},[195,1178,206],{"class":205},[195,1180,210],{"class":209},[195,1182,214],{"class":213},[195,1184,217],{"class":201},[195,1186,220],{"class":213},[195,1188,224],{"class":223},[195,1190,227],{"class":213},[195,1192,230],{"class":201},[195,1194,233],{"class":213},[195,1196,1197,1199,1202,1204,1206,1209,1211,1213],{"class":197,"line":236},[195,1198,239],{"class":201},[195,1200,1201],{"class":242}," token",[195,1203,247],{"class":246},[195,1205,271],{"class":201},[195,1207,1208],{"class":209}," verifyCustomLoginAndReturnSessionToken",[195,1210,214],{"class":213},[195,1212,224],{"class":255},[195,1214,258],{"class":213},[195,1216,1217],{"class":197,"line":261},[195,1218,312],{"emptyLinePlaceholder":311},[195,1220,1221,1223,1226,1228,1230,1232,1234],{"class":197,"line":308},[195,1222,730],{"class":201},[195,1224,1225],{"class":209}," setSessionCookie",[195,1227,214],{"class":213},[195,1229,224],{"class":255},[195,1231,895],{"class":213},[195,1233,1147],{"class":255},[195,1235,258],{"class":213},[195,1237,1238],{"class":197,"line":315},[195,1239,312],{"emptyLinePlaceholder":311},[195,1241,1242,1244,1246,1248,1250,1252],{"class":197,"line":333},[195,1243,369],{"class":201},[195,1245,372],{"class":213},[195,1247,765],{"class":255},[195,1249,295],{"class":294},[195,1251,451],{"class":349},[195,1253,386],{"class":213},[195,1255,1256],{"class":197,"line":355},[195,1257,392],{"class":213},[158,1259,1260],{},"The helper signs the cookie with your Better Auth secret and uses the configured cookie name and attributes from your server auth config.",[460,1262,1263,1266],{},[192,1264,1265],{},"setSessionCookie(event, token)"," sets the session token cookie only. It does not try to recreate every internal Better Auth sign-in side effect.",[176,1268,1270],{"id":1269},"requireusersession","requireUserSession",[158,1272,1273,1274,781,1277,1280],{},"Ensures the user is authenticated and optionally matches specific criteria. Throws a ",[192,1275,1276],{},"401 Unauthorized",[192,1278,1279],{},"403 Forbidden"," error if checks fail.",[184,1282,1284],{"className":186,"code":1283,"language":189,"meta":190,"style":190},"const { user, session } = await requireUserSession(event, options?)\n",[192,1285,1286],{"__ignoreMap":190},[195,1287,1288,1291,1293,1295,1297,1299,1301,1304,1306,1309,1311,1313,1315,1318,1320],{"class":197,"line":198},[195,1289,1290],{"class":201},"const",[195,1292,372],{"class":213},[195,1294,375],{"class":242},[195,1296,895],{"class":213},[195,1298,327],{"class":242},[195,1300,830],{"class":213},[195,1302,1303],{"class":246},"=",[195,1305,271],{"class":201},[195,1307,1308],{"class":209}," requireUserSession",[195,1310,214],{"class":213},[195,1312,224],{"class":274},[195,1314,895],{"class":213},[195,1316,1317],{"class":274},"options",[195,1319,961],{"class":323},[195,1321,258],{"class":213},[460,1323,1324,1326,1327,1330,1331,1334,1335,1338,1339,1341,1342,1345],{},[192,1325,1270],{}," uses ",[192,1328,1329],{},"AuthUser"," and ",[192,1332,1333],{},"AuthSession"," from ",[192,1336,1337],{},"#nuxt-better-auth"," for both the returned value and option callbacks (",[192,1340,375],{}," match + ",[192,1343,1344],{},"rule",").",[680,1347,1348],{"id":1317},"Options",[1350,1351,1352,1357],"field-group",{},[1353,1354,1356],"field",{"name":375,"type":1355},"UserMatch","Object matching user properties (see Route Protection).",[1353,1358,1360],{"name":1344,"type":1359},"(ctx) => boolean | Promise\u003Cboolean>","Custom validation callback.",[680,1362,1364],{"id":1363},"examples","Examples",[158,1366,1367],{},[166,1368,1369],{},"Role Check:",[184,1371,1374],{"className":186,"code":1372,"filename":1373,"language":189,"meta":190,"style":190},"await requireUserSession(event, {\n  user: { role: 'admin' }\n})\n","server/api/admin/dashboard.ts",[192,1375,1376,1389,1408],{"__ignoreMap":190},[195,1377,1378,1380,1382,1384,1386],{"class":197,"line":198},[195,1379,405],{"class":201},[195,1381,1308],{"class":209},[195,1383,214],{"class":213},[195,1385,224],{"class":274},[195,1387,1388],{"class":213},", {\n",[195,1390,1391,1394,1396,1398,1401,1403,1406],{"class":197,"line":236},[195,1392,1393],{"class":255},"  user",[195,1395,295],{"class":294},[195,1397,372],{"class":213},[195,1399,1400],{"class":255},"role",[195,1402,295],{"class":294},[195,1404,1405],{"class":836}," 'admin'",[195,1407,386],{"class":213},[195,1409,1410],{"class":197,"line":261},[195,1411,392],{"class":213},[158,1413,1414],{},[166,1415,1416],{},"Custom Rule:",[184,1418,1420],{"className":186,"code":1419,"filename":1373,"language":189,"meta":190,"style":190},"await requireUserSession(event, {\n  rule: ({ user }) => {\n    return user.points > 100\n  }\n})\n",[192,1421,1422,1434,1451,1469,1473],{"__ignoreMap":190},[195,1423,1424,1426,1428,1430,1432],{"class":197,"line":198},[195,1425,405],{"class":201},[195,1427,1308],{"class":209},[195,1429,214],{"class":213},[195,1431,224],{"class":274},[195,1433,1388],{"class":213},[195,1435,1436,1439,1441,1443,1445,1447,1449],{"class":197,"line":236},[195,1437,1438],{"class":209},"  rule",[195,1440,295],{"class":294},[195,1442,890],{"class":213},[195,1444,375],{"class":223},[195,1446,900],{"class":213},[195,1448,230],{"class":201},[195,1450,233],{"class":213},[195,1452,1453,1456,1458,1460,1463,1466],{"class":197,"line":261},[195,1454,1455],{"class":201},"    return",[195,1457,939],{"class":274},[195,1459,277],{"class":213},[195,1461,1462],{"class":255},"points",[195,1464,1465],{"class":323}," >",[195,1467,1468],{"class":349}," 100\n",[195,1470,1471],{"class":197,"line":308},[195,1472,358],{"class":213},[195,1474,1475],{"class":197,"line":315},[195,1476,392],{"class":213},[176,1478,1480],{"id":1479},"combining-user-matching-with-rules","Combining User Matching with Rules",[184,1482,1485],{"className":186,"code":1483,"filename":1484,"language":189,"meta":190,"style":190},"export default defineEventHandler(async (event) => {\n  const { teamId } = getRouterParams(event)\n\n  // Require admin role AND membership in the specific team\n  await requireUserSession(event, {\n    user: { role: 'admin' },\n    rule: async (session) => {\n      const membership = await getTeamMembership(session.user.id, teamId)\n      return membership?.role === 'owner'\n    }\n  })\n\n  return getTeamSettings(teamId)\n})\n","server/api/team/[teamId]/settings.ts",[192,1486,1487,1509,1531,1535,1540,1552,1569,1589,1622,1638,1643,1648,1652,1665],{"__ignoreMap":190},[195,1488,1489,1491,1493,1495,1497,1499,1501,1503,1505,1507],{"class":197,"line":198},[195,1490,202],{"class":201},[195,1492,206],{"class":205},[195,1494,210],{"class":209},[195,1496,214],{"class":213},[195,1498,217],{"class":201},[195,1500,220],{"class":213},[195,1502,224],{"class":223},[195,1504,227],{"class":213},[195,1506,230],{"class":201},[195,1508,233],{"class":213},[195,1510,1511,1513,1515,1518,1520,1522,1525,1527,1529],{"class":197,"line":236},[195,1512,239],{"class":201},[195,1514,372],{"class":213},[195,1516,1517],{"class":242},"teamId",[195,1519,830],{"class":213},[195,1521,1303],{"class":246},[195,1523,1524],{"class":209}," getRouterParams",[195,1526,214],{"class":213},[195,1528,224],{"class":255},[195,1530,258],{"class":213},[195,1532,1533],{"class":197,"line":261},[195,1534,312],{"emptyLinePlaceholder":311},[195,1536,1537],{"class":197,"line":308},[195,1538,1539],{"class":543},"  // Require admin role AND membership in the specific team\n",[195,1541,1542,1544,1546,1548,1550],{"class":197,"line":315},[195,1543,730],{"class":201},[195,1545,1308],{"class":209},[195,1547,214],{"class":213},[195,1549,224],{"class":255},[195,1551,1388],{"class":213},[195,1553,1554,1557,1559,1561,1563,1565,1567],{"class":197,"line":333},[195,1555,1556],{"class":255},"    user",[195,1558,295],{"class":294},[195,1560,372],{"class":213},[195,1562,1400],{"class":255},[195,1564,295],{"class":294},[195,1566,1405],{"class":836},[195,1568,454],{"class":213},[195,1570,1571,1574,1576,1579,1581,1583,1585,1587],{"class":197,"line":355},[195,1572,1573],{"class":209},"    rule",[195,1575,295],{"class":294},[195,1577,1578],{"class":201}," async",[195,1580,220],{"class":213},[195,1582,327],{"class":223},[195,1584,227],{"class":213},[195,1586,230],{"class":201},[195,1588,233],{"class":213},[195,1590,1591,1594,1597,1599,1601,1604,1606,1608,1610,1612,1614,1616,1618,1620],{"class":197,"line":361},[195,1592,1593],{"class":201},"      const",[195,1595,1596],{"class":242}," membership",[195,1598,247],{"class":246},[195,1600,271],{"class":201},[195,1602,1603],{"class":209}," getTeamMembership",[195,1605,214],{"class":213},[195,1607,327],{"class":274},[195,1609,277],{"class":213},[195,1611,375],{"class":255},[195,1613,277],{"class":213},[195,1615,1131],{"class":255},[195,1617,895],{"class":213},[195,1619,1517],{"class":255},[195,1621,258],{"class":213},[195,1623,1624,1626,1628,1630,1632,1635],{"class":197,"line":366},[195,1625,909],{"class":201},[195,1627,1596],{"class":274},[195,1629,948],{"class":213},[195,1631,1400],{"class":255},[195,1633,1634],{"class":323}," ===",[195,1636,1637],{"class":836}," 'owner'\n",[195,1639,1640],{"class":197,"line":389},[195,1641,1642],{"class":213},"    }\n",[195,1644,1645],{"class":197,"line":975},[195,1646,1647],{"class":213},"  })\n",[195,1649,1650],{"class":197,"line":981},[195,1651,312],{"emptyLinePlaceholder":311},[195,1653,1654,1656,1659,1661,1663],{"class":197,"line":991},[195,1655,369],{"class":201},[195,1657,1658],{"class":209}," getTeamSettings",[195,1660,214],{"class":213},[195,1662,1517],{"class":255},[195,1664,258],{"class":213},[195,1666,1667],{"class":197,"line":1000},[195,1668,392],{"class":213},[176,1670,1672],{"id":1671},"related-pages","Related pages",[568,1674,1675,1680,1685],{},[571,1676,1677],{},[171,1678,1679],{"href":49},"Server auth concept",[571,1681,1682],{},[171,1683,1684],{"href":57},"Route protection",[571,1686,1687],{},[171,1688,149],{"href":150},[1690,1691,1692],"style",{},"html pre.shiki code .sqe1H, html code.shiki .sqe1H{--shiki-light:#A626A4;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sKg8T, html code.shiki .sKg8T{--shiki-light:#E45649;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sfT9l, html code.shiki .sfT9l{--shiki-light:#4078F2;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}html pre.shiki code .s17Py, html code.shiki .s17Py{--shiki-light:#383A42;--shiki-default:#BBBBBB;--shiki-dark:#BBBBBB}html pre.shiki code .sgisi, html code.shiki .sgisi{--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-default:#FF7EDB;--shiki-default-font-style:italic;--shiki-dark:#FF7EDB;--shiki-dark-font-style:italic}html pre.shiki code .s6Rhl, html code.shiki .s6Rhl{--shiki-light:#986801;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sQBpM, html code.shiki .sQBpM{--shiki-light:#0184BC;--shiki-default:#FFFFFFEE;--shiki-dark:#FFFFFFEE}html pre.shiki code .sYvLG, html code.shiki .sYvLG{--shiki-light:#E45649;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .svFNh, html code.shiki .svFNh{--shiki-light:#383A42;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sVnqq, html code.shiki .sVnqq{--shiki-light:#0184BC;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}html pre.shiki code .sn-Jc, html code.shiki .sn-Jc{--shiki-light:#0184BC;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .s3ZNE, html code.shiki .s3ZNE{--shiki-light:#986801;--shiki-default:#F97E72;--shiki-dark:#F97E72}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 .st7cf, html code.shiki .st7cf{--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-default:#848BBD;--shiki-default-font-style:italic;--shiki-dark:#848BBD;--shiki-dark-font-style:italic}html pre.shiki code .sPAZv, html code.shiki .sPAZv{--shiki-light:#50A14F;--shiki-default:#FF8B39;--shiki-dark:#FF8B39}html pre.shiki code .sjaJz, html code.shiki .sjaJz{--shiki-light:#C18401;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}",{"title":190,"searchDepth":236,"depth":236,"links":1694},[1695,1696,1697,1698,1699,1701,1702,1703,1707,1708],{"id":178,"depth":236,"text":179},{"id":472,"depth":236,"text":473},{"id":585,"depth":236,"text":586},{"id":691,"depth":236,"text":692},{"id":794,"depth":236,"text":1700},"Session Enrichment with custom-session",{"id":1031,"depth":236,"text":1032},{"id":1163,"depth":236,"text":1164},{"id":1269,"depth":236,"text":1270,"children":1704},[1705,1706],{"id":1317,"depth":261,"text":1348},{"id":1363,"depth":261,"text":1364},{"id":1479,"depth":236,"text":1480},{"id":1671,"depth":236,"text":1672},"API reference for server-side helpers available in Nitro event handlers.","md",null,{},{"title":141,"description":1709},"khEXFCE7yXJejXfUbxVhs-sjvyz-XzNbK-DN-tY9TA4",[1716,1718],{"title":137,"path":138,"stem":139,"description":1717,"children":-1},"API reference for client-side composables.",{"title":145,"path":146,"stem":147,"description":1719,"children":-1},"Built‑in UI helpers.",1782807286882]