[{"data":1,"prerenderedAt":2456},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-configuration":208,"-getting-started-configuration-surround":2451},[4,42,68,115,136,157],{"title":5,"path":6,"stem":7,"children":8,"icon":11},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.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","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F1.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Configuration","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F2.configuration","i-lucide-settings",{"title":23,"path":24,"stem":25,"icon":26},"Client Setup","\u002Fgetting-started\u002Fclient-setup","1.getting-started\u002F3.client-setup","i-lucide-monitor",{"title":28,"path":29,"stem":30,"icon":31},"Type Augmentation","\u002Fgetting-started\u002Ftype-augmentation","1.getting-started\u002F4.type-augmentation","i-lucide-type",{"title":33,"path":34,"stem":35,"icon":36},"Schema Generation (NuxtHub)","\u002Fgetting-started\u002Fschema-generation","1.getting-started\u002F5.schema-generation","i-lucide-database",{"title":38,"path":39,"stem":40,"icon":41},"How It Works","\u002Fgetting-started\u002Fhow-it-works","1.getting-started\u002F6.how-it-works","i-lucide-workflow",{"title":43,"path":44,"stem":45,"children":46,"page":67},"Core Concepts","\u002Fcore-concepts","2.core-concepts",[47,51,55,59,63],{"title":48,"path":49,"stem":50},"serverAuth()","\u002Fcore-concepts\u002Fserver-auth","2.core-concepts\u002F1.server-auth",{"title":52,"path":53,"stem":54},"Sessions","\u002Fcore-concepts\u002Fsessions","2.core-concepts\u002F2.sessions",{"title":56,"path":57,"stem":58},"Route Protection","\u002Fcore-concepts\u002Froute-protection","2.core-concepts\u002F3.route-protection",{"title":60,"path":61,"stem":62},"Auto‑Imports and Aliases","\u002Fcore-concepts\u002Fauto-imports-aliases","2.core-concepts\u002F4.auto-imports-aliases",{"title":64,"path":65,"stem":66},"Security & Caveats","\u002Fcore-concepts\u002Fsecurity-caveats","2.core-concepts\u002F5.security-caveats",false,{"title":69,"path":70,"stem":71,"children":72,"page":67},"Guides","\u002Fguides","3.guides",[73,77,82,86,90,94,99,103,107,111],{"title":74,"path":75,"stem":76},"Role‑Based Access","\u002Fguides\u002Frole-based-access","3.guides\u002F1.role-based-access",{"title":78,"path":79,"stem":80,"icon":81},"Setup diagnostics","\u002Fguides\u002Fdiagnostics","3.guides\u002F10.diagnostics","i-lucide-circle-alert",{"title":83,"path":84,"stem":85},"OAuth Providers","\u002Fguides\u002Foauth-providers","3.guides\u002F2.oauth-providers",{"title":87,"path":88,"stem":89},"Custom Database","\u002Fguides\u002Fcustom-database","3.guides\u002F3.custom-database",{"title":91,"path":92,"stem":93},"Database-less Mode","\u002Fguides\u002Fdatabase-less-mode","3.guides\u002F4.database-less-mode",{"title":95,"path":96,"stem":97,"icon":98},"External Auth Backend","\u002Fguides\u002Fexternal-auth-backend","3.guides\u002F5.external-auth-backend","i-lucide-server",{"title":100,"path":101,"stem":102},"Migrating from nuxt-auth-utils","\u002Fguides\u002Fmigrate-from-nuxt-auth-utils","3.guides\u002F6.migrate-from-nuxt-auth-utils",{"title":104,"path":105,"stem":106},"Two-Factor Authentication (TOTP + Backup Codes)","\u002Fguides\u002Ftwo-factor-auth","3.guides\u002F7.two-factor-auth",{"title":108,"path":109,"stem":110},"Testing","\u002Fguides\u002Ftesting","3.guides\u002F8.testing",{"title":112,"path":113,"stem":114},"Production Deployment","\u002Fguides\u002Fproduction-deployment","3.guides\u002F9.production-deployment",{"title":116,"path":117,"stem":118,"children":119,"page":67},"Integrations","\u002Fintegrations","4.integrations",[120,124,128,132],{"title":121,"path":122,"stem":123},"NuxtHub","\u002Fintegrations\u002Fnuxthub","4.integrations\u002F1.nuxthub",{"title":125,"path":126,"stem":127},"DevTools","\u002Fintegrations\u002Fdevtools","4.integrations\u002F2.devtools",{"title":129,"path":130,"stem":131},"Convex","\u002Fintegrations\u002Fconvex","4.integrations\u002F3.convex",{"title":133,"path":134,"stem":135},"i18n","\u002Fintegrations\u002Fi18n","4.integrations\u002F4.i18n",{"title":137,"path":138,"stem":139,"children":140,"page":67},"API Reference","\u002Fapi","5.api",[141,145,149,153],{"title":142,"path":143,"stem":144},"Composables","\u002Fapi\u002Fcomposables","5.api\u002F1.composables",{"title":146,"path":147,"stem":148},"Server Utilities","\u002Fapi\u002Fserver-utils","5.api\u002F2.server-utils",{"title":150,"path":151,"stem":152},"Components","\u002Fapi\u002Fcomponents","5.api\u002F3.components",{"title":154,"path":155,"stem":156},"Types","\u002Fapi\u002Ftypes","5.api\u002F4.types",{"title":158,"path":159,"stem":160,"children":161,"icon":81},"Errors","\u002Ferrors","6.errors\u002F0.index",[162,164,168,172,176,180,184,188,192,196,200,204],{"title":163,"path":159,"stem":160},"Overview",{"title":165,"path":166,"stem":167},"Auth configuration failed to load","\u002Ferrors\u002Fnuxt-auth-config-load-failed","6.errors\u002Fnuxt-auth-config-load-failed",{"title":169,"path":170,"stem":171},"Schema generator returned no code","\u002Ferrors\u002Fnuxt-auth-empty-schema","6.errors\u002Fnuxt-auth-empty-schema",{"title":173,"path":174,"stem":175},"Invalid server auth config export","\u002Ferrors\u002Fnuxt-auth-invalid-config-export","6.errors\u002Fnuxt-auth-invalid-config-export",{"title":177,"path":178,"stem":179},"Auth plugin path must be absolute","\u002Ferrors\u002Fnuxt-auth-invalid-plugin-source","6.errors\u002Fnuxt-auth-invalid-plugin-source",{"title":181,"path":182,"stem":183},"Missing auth configuration","\u002Ferrors\u002Fnuxt-auth-missing-config","6.errors\u002Fnuxt-auth-missing-config",{"title":185,"path":186,"stem":187},"NuxtHub database alias is missing","\u002Ferrors\u002Fnuxt-auth-missing-hub-db","6.errors\u002Fnuxt-auth-missing-hub-db",{"title":189,"path":190,"stem":191},"No database provider is enabled","\u002Ferrors\u002Fnuxt-auth-no-database-provider","6.errors\u002Fnuxt-auth-no-database-provider",{"title":193,"path":194,"stem":195},"Auth schema generation failed","\u002Ferrors\u002Fnuxt-auth-schema-generation-failed","6.errors\u002Fnuxt-auth-schema-generation-failed",{"title":197,"path":198,"stem":199},"Custom session storage is missing","\u002Ferrors\u002Fnuxt-auth-schema-storage-required","6.errors\u002Fnuxt-auth-schema-storage-required",{"title":201,"path":202,"stem":203},"Secondary storage in client-only mode","\u002Ferrors\u002Fnuxt-auth-storage-client-only","6.errors\u002Fnuxt-auth-storage-client-only",{"title":205,"path":206,"stem":207},"Unsupported database dialect","\u002Ferrors\u002Fnuxt-auth-unsupported-dialect","6.errors\u002Fnuxt-auth-unsupported-dialect",{"id":209,"title":18,"body":210,"description":2444,"extension":2445,"links":2446,"meta":2447,"navigation":2448,"path":19,"seo":2449,"stem":20,"__hash__":2450},"docs\u002F1.getting-started\u002F2.configuration.md",{"type":211,"value":212,"toc":2429},"minimark",[213,284,300,305,541,555,814,818,821,912,917,1024,1030,1049,1055,1058,1082,1086,1092,1097,1103,1223,1295,1299,1305,1412,1446,1457,1508,1524,1528,1545,1551,1555,1561,1635,1645,1658,1671,1677,1737,1743,1755,1767,1777,1781,1788,1803,1812,1823,1827,1830,1890,1934,1972,1975,1978,1982,2008,2012,2015,2026,2030,2044,2262,2265,2272,2342,2352,2355,2425],[214,215,216],"code-collapse",{},[217,218,224],"pre",{"className":219,"code":220,"filename":221,"language":222,"meta":223,"style":223},"language-txt shiki shiki-themes one-light synthwave-84 synthwave-84","Configure @nuxtjs\u002Fbetter-auth module options and server auth.\n\n- In `nuxt.config.ts`, set `auth.redirects` (login, guest, authenticated, logout, sessionExpired) and `auth.preserveRedirect`\n- Use `routeRules` or `nitro.routeRules` to define per-route auth: `{ auth: { only: 'user', redirectTo: '\u002Flogin' } }`\n- In `server\u002Fauth.config.ts`, use `defineServerAuth` (object or function syntax) to configure plugins and providers\n- The function syntax receives `ctx` with `runtimeConfig` and `db` (NuxtHub)\n- The module auto-injects `secret` and `baseURL` — do not set them in defineServerAuth\n- Production base URL: runtimeConfig > platform env vars. Request URL inference is development-only.\n- Set `NUXT_PUBLIC_SITE_URL` for Cloudflare Workers, custom domains, and production hosts without a supported platform URL variable\n","Prompt","txt","",[225,226,227,235,242,248,254,260,266,272,278],"code",{"__ignoreMap":223},[228,229,232],"span",{"class":230,"line":231},"line",1,[228,233,234],{},"Configure @nuxtjs\u002Fbetter-auth module options and server auth.\n",[228,236,238],{"class":230,"line":237},2,[228,239,241],{"emptyLinePlaceholder":240},true,"\n",[228,243,245],{"class":230,"line":244},3,[228,246,247],{},"- In `nuxt.config.ts`, set `auth.redirects` (login, guest, authenticated, logout, sessionExpired) and `auth.preserveRedirect`\n",[228,249,251],{"class":230,"line":250},4,[228,252,253],{},"- Use `routeRules` or `nitro.routeRules` to define per-route auth: `{ auth: { only: 'user', redirectTo: '\u002Flogin' } }`\n",[228,255,257],{"class":230,"line":256},5,[228,258,259],{},"- In `server\u002Fauth.config.ts`, use `defineServerAuth` (object or function syntax) to configure plugins and providers\n",[228,261,263],{"class":230,"line":262},6,[228,264,265],{},"- The function syntax receives `ctx` with `runtimeConfig` and `db` (NuxtHub)\n",[228,267,269],{"class":230,"line":268},7,[228,270,271],{},"- The module auto-injects `secret` and `baseURL` — do not set them in defineServerAuth\n",[228,273,275],{"class":230,"line":274},8,[228,276,277],{},"- Production base URL: runtimeConfig > platform env vars. Request URL inference is development-only.\n",[228,279,281],{"class":230,"line":280},9,[228,282,283],{},"- Set `NUXT_PUBLIC_SITE_URL` for Cloudflare Workers, custom domains, and production hosts without a supported platform URL variable\n",[285,286,287,288,291,292,295,296,299],"p",{},"Use this page when the module is installed and you want to control runtime behavior in ",[225,289,290],{},"nuxt.config.ts",", ",[225,293,294],{},"server\u002Fauth.config.ts",", and ",[225,297,298],{},"app\u002Fauth.config.ts",".",[301,302,304],"h2",{"id":303},"module-configuration","Module Configuration",[217,306,310],{"className":307,"code":308,"filename":290,"language":309,"meta":223,"style":223},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","export default defineNuxtConfig({\n  modules: ['@nuxtjs\u002Fbetter-auth'],\n  auth: {\n    redirects: {\n      login: '\u002Flogin',\n      guest: '\u002F',\n      \u002F\u002F authenticated: '\u002Fapp', \u002F\u002F optional\n      \u002F\u002F logout: '\u002Fgoodbye', \u002F\u002F optional\n    },\n    preserveRedirect: true,\n    redirectQueryKey: 'redirect',\n  },\n  routeRules: {\n    '\u002Fapp\u002F**': { auth: { only: 'user', redirectTo: '\u002Flogin' } },\n    '\u002Flogin': { auth: { only: 'guest', redirectTo: '\u002Fapp' } },\n  },\n})\n","ts",[225,311,312,330,350,360,369,382,394,403,410,415,429,442,448,458,496,530,535],{"__ignoreMap":223},[228,313,314,318,322,326],{"class":230,"line":231},[228,315,317],{"class":316},"sqe1H","export",[228,319,321],{"class":320},"sKg8T"," default",[228,323,325],{"class":324},"sfT9l"," defineNuxtConfig",[228,327,329],{"class":328},"s17Py","({\n",[228,331,332,336,340,343,347],{"class":230,"line":237},[228,333,335],{"class":334},"sYvLG","  modules",[228,337,339],{"class":338},"sVnqq",":",[228,341,342],{"class":328}," [",[228,344,346],{"class":345},"sPAZv","'@nuxtjs\u002Fbetter-auth'",[228,348,349],{"class":328},"],\n",[228,351,352,355,357],{"class":230,"line":244},[228,353,354],{"class":334},"  auth",[228,356,339],{"class":338},[228,358,359],{"class":328}," {\n",[228,361,362,365,367],{"class":230,"line":250},[228,363,364],{"class":334},"    redirects",[228,366,339],{"class":338},[228,368,359],{"class":328},[228,370,371,374,376,379],{"class":230,"line":256},[228,372,373],{"class":334},"      login",[228,375,339],{"class":338},[228,377,378],{"class":345}," '\u002Flogin'",[228,380,381],{"class":328},",\n",[228,383,384,387,389,392],{"class":230,"line":262},[228,385,386],{"class":334},"      guest",[228,388,339],{"class":338},[228,390,391],{"class":345}," '\u002F'",[228,393,381],{"class":328},[228,395,396,400],{"class":230,"line":268},[228,397,399],{"class":398},"st7cf","      \u002F\u002F authenticated: '\u002Fapp',",[228,401,402],{"class":398}," \u002F\u002F optional\n",[228,404,405,408],{"class":230,"line":274},[228,406,407],{"class":398},"      \u002F\u002F logout: '\u002Fgoodbye',",[228,409,402],{"class":398},[228,411,412],{"class":230,"line":280},[228,413,414],{"class":328},"    },\n",[228,416,418,421,423,427],{"class":230,"line":417},10,[228,419,420],{"class":334},"    preserveRedirect",[228,422,339],{"class":338},[228,424,426],{"class":425},"s3ZNE"," true",[228,428,381],{"class":328},[228,430,432,435,437,440],{"class":230,"line":431},11,[228,433,434],{"class":334},"    redirectQueryKey",[228,436,339],{"class":338},[228,438,439],{"class":345}," 'redirect'",[228,441,381],{"class":328},[228,443,445],{"class":230,"line":444},12,[228,446,447],{"class":328},"  },\n",[228,449,451,454,456],{"class":230,"line":450},13,[228,452,453],{"class":334},"  routeRules",[228,455,339],{"class":338},[228,457,359],{"class":328},[228,459,461,464,466,469,472,474,476,479,481,484,486,489,491,493],{"class":230,"line":460},14,[228,462,463],{"class":345},"    '\u002Fapp\u002F**'",[228,465,339],{"class":338},[228,467,468],{"class":328}," { ",[228,470,471],{"class":334},"auth",[228,473,339],{"class":338},[228,475,468],{"class":328},[228,477,478],{"class":334},"only",[228,480,339],{"class":338},[228,482,483],{"class":345}," 'user'",[228,485,291],{"class":328},[228,487,488],{"class":334},"redirectTo",[228,490,339],{"class":338},[228,492,378],{"class":345},[228,494,495],{"class":328}," } },\n",[228,497,499,502,504,506,508,510,512,514,516,519,521,523,525,528],{"class":230,"line":498},15,[228,500,501],{"class":345},"    '\u002Flogin'",[228,503,339],{"class":338},[228,505,468],{"class":328},[228,507,471],{"class":334},[228,509,339],{"class":338},[228,511,468],{"class":328},[228,513,478],{"class":334},[228,515,339],{"class":338},[228,517,518],{"class":345}," 'guest'",[228,520,291],{"class":328},[228,522,488],{"class":334},[228,524,339],{"class":338},[228,526,527],{"class":345}," '\u002Fapp'",[228,529,495],{"class":328},[228,531,533],{"class":230,"line":532},16,[228,534,447],{"class":328},[228,536,538],{"class":230,"line":537},17,[228,539,540],{"class":328},"})\n",[542,543,544,545,548,549,552,553,299],"note",{},"You can define auth route rules in either ",[225,546,547],{},"routeRules"," or ",[225,550,551],{},"nitro.routeRules",". The module supports both. If both are set, it uses ",[225,554,551],{},[556,557,558,601,613,624,686,705,719,781,791,807],"field-group",{},[559,560,563,569,575,591,594],"field",{"name":561,"type":562},"clientOnly","boolean",[285,564,565,566],{},"Default: ",[225,567,568],{},"false",[285,570,571,572,339],{},"Enable client-only mode for external auth backends. When ",[225,573,574],{},"true",[576,577,578,585,588],"ul",{},[579,580,581,582,584],"li",{},"Skips ",[225,583,294],{}," requirement",[579,586,587],{},"Skips server-side setup (API handlers, middleware, schema generation, devtools)",[579,589,590],{},"Skips secret validation",[285,592,593],{},"Use this when your Better Auth server runs on a separate backend (e.g., standalone h3\u002FNitro project).",[285,595,596,597,600],{},"See ",[598,599,95],"a",{"href":96}," guide.",[559,602,605,610],{"name":603,"type":604},"serverConfig","string",[285,606,565,607],{},[225,608,609],{},"'server\u002Fauth.config'",[285,611,612],{},"Path to the server auth config file. Relative paths resolve from the Nuxt layer that declares this option. Paths declared by the app resolve from the project root.",[559,614,616,621],{"name":615,"type":604},"clientConfig",[285,617,565,618],{},[225,619,620],{},"'app\u002Fauth.config'",[285,622,623],{},"Path to the client auth config file. Relative paths resolve from the Nuxt layer that declares this option. Paths declared by the app resolve from the project root.",[559,625,628,633,636,680],{"name":626,"type":627},"redirects","{ login?: string, guest?: string, authenticated?: string, logout?: string, sessionExpired?: string }",[285,629,565,630],{},[225,631,632],{},"{ login: '\u002Flogin', guest: '\u002F' }",[285,634,635],{},"Global redirect fallbacks:",[576,637,638,644,650,668,674],{},[579,639,640,643],{},[225,641,642],{},"login",": where to redirect unauthenticated users",[579,645,646,649],{},[225,647,648],{},"guest",": where to redirect authenticated users trying to access guest-only routes",[579,651,652,655,656,659,660,663,664,667],{},[225,653,654],{},"authenticated",": where to navigate after successful authenticated ",[225,657,658],{},"signIn"," \u002F ",[225,661,662],{},"signUp"," when no ",[225,665,666],{},"onSuccess"," callback is provided",[579,669,670,673],{},[225,671,672],{},"logout",": where to navigate after logout (no default)",[579,675,676,679],{},[225,677,678],{},"sessionExpired",": where to navigate when a previously authenticated session expires or is revoked (no default)",[285,681,682,683,685],{},"Per-route ",[225,684,488],{}," takes precedence when set.",[559,687,689,693,696],{"name":688,"type":562},"preserveRedirect",[285,690,565,691],{},[225,692,574],{},[285,694,695],{},"When redirecting unauthenticated users to a login route, append the original requested path as a query param.",[285,697,698,699,548,702,299],{},"Configure redirect targets per-route with ",[225,700,701],{},"routeRules.auth.redirectTo",[225,703,704],{},"definePageMeta({ auth: { redirectTo } })",[559,706,708,713],{"name":707,"type":604},"redirectQueryKey",[285,709,565,710],{},[225,711,712],{},"'redirect'",[285,714,715,716,718],{},"Query param key used when ",[225,717,688],{}," is enabled.",[559,720,723,727,730],{"name":721,"type":722},"hubSecondaryStorage","boolean | 'custom'",[285,724,565,725],{},[225,726,568],{},[285,728,729],{},"Configure secondary storage for sessions.",[576,731,732,750,771],{},[579,733,734,736,737,741,742,745,746,749],{},[225,735,574],{}," — Temporarily logs a setup warning and continues without module-provided secondary storage because ",[738,739],"brand-badge",{"name":740},"nuxthub"," KV cannot implement the required atomic ",[225,743,744],{},"getAndDelete"," and ",[225,747,748],{},"increment"," operations. Sessions use the configured database when one exists, and Better Auth rate limiting uses process-local memory by default.",[579,751,752,755,756,759,760,763,764,766,767,770],{},[225,753,754],{},"'custom'"," — You provide an atomic ",[225,757,758],{},"secondaryStorage"," in ",[225,761,762],{},"defineServerAuth()"," (required; the build fails in production if missing). The module won't inject ",[738,765],{"name":740}," KV, and this mode can omit the ",[225,768,769],{},"session"," table from generated schema.",[579,772,773,775,776,759,778,780],{},[225,774,568],{}," (default) — No secondary storage from the module. User-provided ",[225,777,758],{},[225,779,762],{}," is not overridden.",[559,782,784,788],{"name":783,"type":562},"schema.usePlural",[285,785,565,786],{},[225,787,568],{},[285,789,790],{},"Pluralize table names (user → users)",[559,792,795,800],{"name":793,"type":794},"schema.casing","'camelCase' | 'snake_case'",[285,796,565,797],{},[225,798,799],{},"camelCase",[285,801,802,803,806],{},"Column\u002Ftable name casing. Falls back to ",[225,804,805],{},"hub.db.casing"," when not specified.",[559,808,810,813],{"name":809,"type":604},"schema.schemaName",[738,811],{"name":812},"postgresql"," schema namespace for generated auth tables.",[301,815,817],{"id":816},"redirect-targets-routerules-first","Redirect Targets (RouteRules-First)",[285,819,820],{},"Prefer redirect paths on route-level auth config:",[217,822,824],{"className":307,"code":823,"filename":290,"language":309,"meta":223,"style":223},"export default defineNuxtConfig({\n  routeRules: {\n    '\u002Fapp\u002F**': { auth: { only: 'user', redirectTo: '\u002Flogin' } },\n    '\u002Flogin': { auth: { only: 'guest', redirectTo: '\u002Fapp' } },\n  },\n})\n",[225,825,826,836,844,874,904,908],{"__ignoreMap":223},[228,827,828,830,832,834],{"class":230,"line":231},[228,829,317],{"class":316},[228,831,321],{"class":320},[228,833,325],{"class":324},[228,835,329],{"class":328},[228,837,838,840,842],{"class":230,"line":237},[228,839,453],{"class":334},[228,841,339],{"class":338},[228,843,359],{"class":328},[228,845,846,848,850,852,854,856,858,860,862,864,866,868,870,872],{"class":230,"line":244},[228,847,463],{"class":345},[228,849,339],{"class":338},[228,851,468],{"class":328},[228,853,471],{"class":334},[228,855,339],{"class":338},[228,857,468],{"class":328},[228,859,478],{"class":334},[228,861,339],{"class":338},[228,863,483],{"class":345},[228,865,291],{"class":328},[228,867,488],{"class":334},[228,869,339],{"class":338},[228,871,378],{"class":345},[228,873,495],{"class":328},[228,875,876,878,880,882,884,886,888,890,892,894,896,898,900,902],{"class":230,"line":250},[228,877,501],{"class":345},[228,879,339],{"class":338},[228,881,468],{"class":328},[228,883,471],{"class":334},[228,885,339],{"class":338},[228,887,468],{"class":328},[228,889,478],{"class":334},[228,891,339],{"class":338},[228,893,518],{"class":345},[228,895,291],{"class":328},[228,897,488],{"class":334},[228,899,339],{"class":338},[228,901,527],{"class":345},[228,903,495],{"class":328},[228,905,906],{"class":230,"line":256},[228,907,447],{"class":328},[228,909,910],{"class":230,"line":262},[228,911,540],{"class":328},[285,913,914,915,339],{},"You can use the same auth route rules under ",[225,916,551],{},[217,918,920],{"className":307,"code":919,"filename":290,"language":309,"meta":223,"style":223},"export default defineNuxtConfig({\n  nitro: {\n    routeRules: {\n      '\u002Fapp\u002F**': { auth: { only: 'user', redirectTo: '\u002Flogin' } },\n      '\u002Flogin': { auth: { only: 'guest', redirectTo: '\u002Fapp' } },\n    },\n  },\n})\n",[225,921,922,932,941,950,981,1012,1016,1020],{"__ignoreMap":223},[228,923,924,926,928,930],{"class":230,"line":231},[228,925,317],{"class":316},[228,927,321],{"class":320},[228,929,325],{"class":324},[228,931,329],{"class":328},[228,933,934,937,939],{"class":230,"line":237},[228,935,936],{"class":334},"  nitro",[228,938,339],{"class":338},[228,940,359],{"class":328},[228,942,943,946,948],{"class":230,"line":244},[228,944,945],{"class":334},"    routeRules",[228,947,339],{"class":338},[228,949,359],{"class":328},[228,951,952,955,957,959,961,963,965,967,969,971,973,975,977,979],{"class":230,"line":250},[228,953,954],{"class":345},"      '\u002Fapp\u002F**'",[228,956,339],{"class":338},[228,958,468],{"class":328},[228,960,471],{"class":334},[228,962,339],{"class":338},[228,964,468],{"class":328},[228,966,478],{"class":334},[228,968,339],{"class":338},[228,970,483],{"class":345},[228,972,291],{"class":328},[228,974,488],{"class":334},[228,976,339],{"class":338},[228,978,378],{"class":345},[228,980,495],{"class":328},[228,982,983,986,988,990,992,994,996,998,1000,1002,1004,1006,1008,1010],{"class":230,"line":256},[228,984,985],{"class":345},"      '\u002Flogin'",[228,987,339],{"class":338},[228,989,468],{"class":328},[228,991,471],{"class":334},[228,993,339],{"class":338},[228,995,468],{"class":328},[228,997,478],{"class":334},[228,999,339],{"class":338},[228,1001,518],{"class":345},[228,1003,291],{"class":328},[228,1005,488],{"class":334},[228,1007,339],{"class":338},[228,1009,527],{"class":345},[228,1011,495],{"class":328},[228,1013,1014],{"class":230,"line":262},[228,1015,414],{"class":328},[228,1017,1018],{"class":230,"line":268},[228,1019,447],{"class":328},[228,1021,1022],{"class":230,"line":274},[228,1023,540],{"class":328},[285,1025,1026,1027,1029],{},"If ",[225,1028,488],{}," is omitted, shorthand fallbacks apply:",[576,1031,1032,1041],{},[579,1033,1034,1037,1038],{},[225,1035,1036],{},"auth: 'user'"," falls back to ",[225,1039,1040],{},"\u002Flogin",[579,1042,1043,1037,1046],{},[225,1044,1045],{},"auth: 'guest'",[225,1047,1048],{},"\u002F",[285,1050,1051,1052,299],{},"If you want global defaults for those fallbacks, use ",[225,1053,1054],{},"auth.redirects",[285,1056,1057],{},"Default post-auth navigation:",[576,1059,1060,1073],{},[579,1061,1062,1065,1066,659,1068,1070,1071,299],{},[225,1063,1064],{},"auth.redirects.authenticated"," is used when ",[225,1067,658],{},[225,1069,662],{}," complete with an authenticated session and no explicit ",[225,1072,666],{},[579,1074,1075,1076,1079,1080,299],{},"If a preserved redirect query param is present and safe (",[225,1077,1078],{},"?redirect=","), it takes precedence over ",[225,1081,1064],{},[301,1083,1085],{"id":1084},"server-configuration","Server Configuration",[285,1087,1088,1089,1091],{},"Define your authentication logic in ",[225,1090,294],{},", including plugins, providers, and settings.",[1093,1094,1096],"h3",{"id":1095},"defineserverauth","defineServerAuth",[285,1098,1099,1100,1102],{},"Use the ",[225,1101,1096],{}," helper to ensure type safety and access context. It accepts an object or function syntax.",[217,1104,1106],{"className":307,"code":1105,"filename":294,"language":309,"meta":223,"style":223},"import { defineServerAuth } from '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n\n\u002F\u002F Object syntax (simplest)\nexport default defineServerAuth({\n  emailAndPassword: { enabled: true }\n})\n\n\u002F\u002F Function syntax (access context)\nexport default defineServerAuth((ctx) => ({\n  emailAndPassword: { enabled: true }\n}))\n",[225,1107,1108,1126,1130,1135,1146,1165,1169,1173,1178,1202,1218],{"__ignoreMap":223},[228,1109,1110,1113,1115,1117,1120,1123],{"class":230,"line":231},[228,1111,1112],{"class":316},"import",[228,1114,468],{"class":328},[228,1116,1096],{"class":334},[228,1118,1119],{"class":328}," } ",[228,1121,1122],{"class":316},"from",[228,1124,1125],{"class":345}," '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n",[228,1127,1128],{"class":230,"line":237},[228,1129,241],{"emptyLinePlaceholder":240},[228,1131,1132],{"class":230,"line":244},[228,1133,1134],{"class":398},"\u002F\u002F Object syntax (simplest)\n",[228,1136,1137,1139,1141,1144],{"class":230,"line":250},[228,1138,317],{"class":316},[228,1140,321],{"class":320},[228,1142,1143],{"class":324}," defineServerAuth",[228,1145,329],{"class":328},[228,1147,1148,1151,1153,1155,1158,1160,1162],{"class":230,"line":256},[228,1149,1150],{"class":334},"  emailAndPassword",[228,1152,339],{"class":338},[228,1154,468],{"class":328},[228,1156,1157],{"class":334},"enabled",[228,1159,339],{"class":338},[228,1161,426],{"class":425},[228,1163,1164],{"class":328}," }\n",[228,1166,1167],{"class":230,"line":262},[228,1168,540],{"class":328},[228,1170,1171],{"class":230,"line":268},[228,1172,241],{"emptyLinePlaceholder":240},[228,1174,1175],{"class":230,"line":274},[228,1176,1177],{"class":398},"\u002F\u002F Function syntax (access context)\n",[228,1179,1180,1182,1184,1186,1189,1193,1196,1199],{"class":230,"line":280},[228,1181,317],{"class":316},[228,1183,321],{"class":320},[228,1185,1143],{"class":324},[228,1187,1188],{"class":328},"((",[228,1190,1192],{"class":1191},"sgisi","ctx",[228,1194,1195],{"class":328},") ",[228,1197,1198],{"class":316},"=>",[228,1200,1201],{"class":328}," ({\n",[228,1203,1204,1206,1208,1210,1212,1214,1216],{"class":230,"line":417},[228,1205,1150],{"class":334},[228,1207,339],{"class":338},[228,1209,468],{"class":328},[228,1211,1157],{"class":334},[228,1213,339],{"class":338},[228,1215,426],{"class":425},[228,1217,1164],{"class":328},[228,1219,1220],{"class":230,"line":431},[228,1221,1222],{"class":328},"}))\n",[542,1224,1225,1239],{},[285,1226,1227,1228,745,1231,1234,1235,1238],{},"The module automatically injects the singular ",[225,1229,1230],{},"secret",[225,1232,1233],{},"baseURL",". Use Better Auth's ",[225,1236,1237],{},"secrets"," option only when you need versioned rotation.",[576,1240,1241,1258,1273],{},[579,1242,1243,1247,1248,1250,1251,1254,1255],{},[1244,1245,1246],"strong",{},"Secret",": Priority: ",[225,1249,290],{}," runtimeConfig > ",[225,1252,1253],{},"NUXT_BETTER_AUTH_SECRET"," > ",[225,1256,1257],{},"BETTER_AUTH_SECRET",[579,1259,1260,1263,1264,759,1266,1268,1269,1272],{},[1244,1261,1262],{},"Versioned secrets",": Set ",[225,1265,1237],{},[225,1267,1096],{}," or use ",[225,1270,1271],{},"BETTER_AUTH_SECRETS",". When present, the singular secret is a legacy decryption fallback.",[579,1274,1275,1278,1279,1282,1283,1286,1287,1290,1291,1294],{},[1244,1276,1277],{},"Base URL",": The module can use ",[225,1280,1281],{},"VERCEL_URL"," (Vercel), ",[225,1284,1285],{},"CF_PAGES_URL"," (Cloudflare Pages), or ",[225,1288,1289],{},"URL"," (Netlify) at runtime. Set ",[225,1292,1293],{},"NUXT_PUBLIC_SITE_URL"," for Cloudflare Workers, custom domains, and hosts without one of these variables",[1093,1296,1298],{"id":1297},"context-options","Context Options",[285,1300,1301,1302,1304],{},"When using the function syntax, ",[225,1303,1096],{}," callback receives a context object with useful properties:",[217,1306,1308],{"className":307,"code":1307,"filename":294,"language":309,"meta":223,"style":223},"import { defineServerAuth } from '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n\nexport default defineServerAuth((ctx) => ({\n  emailAndPassword: { enabled: true },\n\n  appName: ctx.runtimeConfig.public.siteUrl ? 'Better Auth App' : 'Better Auth',\n}))\n",[225,1309,1310,1324,1328,1346,1363,1367,1408],{"__ignoreMap":223},[228,1311,1312,1314,1316,1318,1320,1322],{"class":230,"line":231},[228,1313,1112],{"class":316},[228,1315,468],{"class":328},[228,1317,1096],{"class":334},[228,1319,1119],{"class":328},[228,1321,1122],{"class":316},[228,1323,1125],{"class":345},[228,1325,1326],{"class":230,"line":237},[228,1327,241],{"emptyLinePlaceholder":240},[228,1329,1330,1332,1334,1336,1338,1340,1342,1344],{"class":230,"line":244},[228,1331,317],{"class":316},[228,1333,321],{"class":320},[228,1335,1143],{"class":324},[228,1337,1188],{"class":328},[228,1339,1192],{"class":1191},[228,1341,1195],{"class":328},[228,1343,1198],{"class":316},[228,1345,1201],{"class":328},[228,1347,1348,1350,1352,1354,1356,1358,1360],{"class":230,"line":250},[228,1349,1150],{"class":334},[228,1351,339],{"class":338},[228,1353,468],{"class":328},[228,1355,1157],{"class":334},[228,1357,339],{"class":338},[228,1359,426],{"class":425},[228,1361,1362],{"class":328}," },\n",[228,1364,1365],{"class":230,"line":256},[228,1366,241],{"emptyLinePlaceholder":240},[228,1368,1369,1372,1374,1378,1380,1383,1385,1388,1390,1393,1397,1400,1403,1406],{"class":230,"line":262},[228,1370,1371],{"class":334},"  appName",[228,1373,339],{"class":338},[228,1375,1377],{"class":1376},"svFNh"," ctx",[228,1379,299],{"class":328},[228,1381,1382],{"class":334},"runtimeConfig",[228,1384,299],{"class":328},[228,1386,1387],{"class":334},"public",[228,1389,299],{"class":328},[228,1391,1392],{"class":334},"siteUrl",[228,1394,1396],{"class":1395},"sn-Jc"," ?",[228,1398,1399],{"class":345}," 'Better Auth App'",[228,1401,1402],{"class":1395}," :",[228,1404,1405],{"class":345}," 'Better Auth'",[228,1407,381],{"class":328},[228,1409,1410],{"class":230,"line":268},[228,1411,1222],{"class":328},[576,1413,1414,1420,1436],{},[579,1415,1416,1419],{},[225,1417,1418],{},"ctx.runtimeConfig",": Nuxt runtime config.",[579,1421,1422,1425,1426,1428,1429,1431,1432,1435],{},[225,1423,1424],{},"ctx.db",": ",[738,1427],{"name":740}," database connection when ",[738,1430],{"name":740}," DB is enabled. Do not set ",[225,1433,1434],{},"database"," when using module-managed adapters.",[579,1437,1438,1441,1442,1445],{},[225,1439,1440],{},"ctx.requestOrigin",": Current request origin when auth is created with ",[225,1443,1444],{},"serverAuth(event)",". This is request-controlled context, not a validated canonical URL.",[285,1447,1448,1449,1452,1453,1456],{},"Configure additional trusted origins explicitly. Do not copy ",[225,1450,1451],{},"requestOrigin"," into ",[225,1454,1455],{},"trustedOrigins"," without validating it against application-owned origins:",[217,1458,1460],{"className":307,"code":1459,"filename":294,"language":309,"meta":223,"style":223},"import { defineServerAuth } from '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n\nexport default defineServerAuth({\n  trustedOrigins: ['https:\u002F\u002Fapp.example.com'],\n})\n",[225,1461,1462,1476,1480,1490,1504],{"__ignoreMap":223},[228,1463,1464,1466,1468,1470,1472,1474],{"class":230,"line":231},[228,1465,1112],{"class":316},[228,1467,468],{"class":328},[228,1469,1096],{"class":334},[228,1471,1119],{"class":328},[228,1473,1122],{"class":316},[228,1475,1125],{"class":345},[228,1477,1478],{"class":230,"line":237},[228,1479,241],{"emptyLinePlaceholder":240},[228,1481,1482,1484,1486,1488],{"class":230,"line":244},[228,1483,317],{"class":316},[228,1485,321],{"class":320},[228,1487,1143],{"class":324},[228,1489,329],{"class":328},[228,1491,1492,1495,1497,1499,1502],{"class":230,"line":250},[228,1493,1494],{"class":334},"  trustedOrigins",[228,1496,339],{"class":338},[228,1498,342],{"class":328},[228,1500,1501],{"class":345},"'https:\u002F\u002Fapp.example.com'",[228,1503,349],{"class":328},[228,1505,1506],{"class":230,"line":256},[228,1507,540],{"class":328},[542,1509,1510,1511,1514,1515,1517,1518,1520,1521,1523],{},"For configured canonical URLs, read ",[225,1512,1513],{},"runtimeConfig.public.siteUrl",". ",[225,1516,1451],{}," is optional and only available when auth is created from a request event. The auth instance can be cached for its canonical URL, so ",[225,1519,1451],{}," describes the request that created it. If allowed origins vary per request, use Better Auth's ",[225,1522,1455],{}," function form with your own origin validation.",[1093,1525,1527],{"id":1526},"session-enrichment","Session Enrichment",[285,1529,1530,1531,1534,1535,759,1538,1540,1541,1544],{},"You can enrich session payloads with Better Auth's ",[225,1532,1533],{},"custom-session"," plugin through ",[225,1536,1537],{},"plugins",[225,1539,1096],{},". This module does not provide a separate ",[225,1542,1543],{},"requestSession.enrich"," option.",[285,1546,1547,1548,299],{},"See the full recipe in ",[598,1549,146],{"href":1550},"\u002Fapi\u002Fserver-utils#session-enrichment-with-custom-session",[301,1552,1554],{"id":1553},"base-url-configuration","Base URL Configuration",[285,1556,1557,1558,1560],{},"The module resolves ",[225,1559,1392],{}," using this priority:",[1562,1563,1564,1580],"table",{},[1565,1566,1567],"thead",{},[1568,1569,1570,1574,1577],"tr",{},[1571,1572,1573],"th",{},"Priority",[1571,1575,1576],{},"Source",[1571,1578,1579],{},"When Used",[1581,1582,1583,1596,1607,1623],"tbody",{},[1568,1584,1585,1589,1593],{},[1586,1587,1588],"td",{},"1",[1586,1590,1591],{},[225,1592,1513],{},[1586,1594,1595],{},"Explicit config (always wins)",[1568,1597,1598,1601,1604],{},[1586,1599,1600],{},"2",[1586,1602,1603],{},"Request URL, then Nitro development environment",[1586,1605,1606],{},"Development only",[1568,1608,1609,1612,1620],{},[1586,1610,1611],{},"3",[1586,1613,1614,291,1616,291,1618],{},[225,1615,1281],{},[225,1617,1285],{},[225,1619,1289],{},[1586,1621,1622],{},"Runtime platform env vars (Vercel, Cloudflare Pages, Netlify)",[1568,1624,1625,1628,1633],{},[1586,1626,1627],{},"4",[1586,1629,1630],{},[225,1631,1632],{},"http:\u002F\u002Flocalhost:3000",[1586,1634,1606],{},[285,1636,1637,1638,745,1641,1644],{},"In production, request headers and listener settings such as ",[225,1639,1640],{},"HOST",[225,1642,1643],{},"NITRO_HOST"," never select the auth base URL. Set a public URL explicitly or use a platform environment variable. Without either, auth initialization fails with a configuration error.",[285,1646,1647,1648,1650,1651,1653,1654,1657],{},"Cloudflare Workers does not supply ",[225,1649,1285],{},". Set ",[225,1652,1293],{}," in the Worker's runtime variables, including when using a ",[225,1655,1656],{},"workers.dev"," domain.",[285,1659,1660,1661,1664,1665,1667,1668,1670],{},"Continue passing ",[225,1662,1663],{},"event"," to ",[225,1666,1444],{}," for request-scoped database access and the optional ",[225,1669,1440],{}," context.",[285,1672,1673,1674,1676],{},"Set an explicit site URL in ",[225,1675,290],{}," for deterministic OAuth callbacks and origin checks:",[217,1678,1680],{"className":307,"code":1679,"filename":290,"language":309,"meta":223,"style":223},"export default defineNuxtConfig({\n  runtimeConfig: {\n    public: {\n      siteUrl: '', \u002F\u002F Set NUXT_PUBLIC_SITE_URL at runtime.\n    },\n  },\n})\n",[225,1681,1682,1692,1701,1710,1725,1729,1733],{"__ignoreMap":223},[228,1683,1684,1686,1688,1690],{"class":230,"line":231},[228,1685,317],{"class":316},[228,1687,321],{"class":320},[228,1689,325],{"class":324},[228,1691,329],{"class":328},[228,1693,1694,1697,1699],{"class":230,"line":237},[228,1695,1696],{"class":334},"  runtimeConfig",[228,1698,339],{"class":338},[228,1700,359],{"class":328},[228,1702,1703,1706,1708],{"class":230,"line":244},[228,1704,1705],{"class":334},"    public",[228,1707,339],{"class":338},[228,1709,359],{"class":328},[228,1711,1712,1715,1717,1720,1722],{"class":230,"line":250},[228,1713,1714],{"class":334},"      siteUrl",[228,1716,339],{"class":338},[228,1718,1719],{"class":345}," ''",[228,1721,291],{"class":328},[228,1723,1724],{"class":398},"\u002F\u002F Set NUXT_PUBLIC_SITE_URL at runtime.\n",[228,1726,1727],{"class":230,"line":256},[228,1728,414],{"class":328},[228,1730,1731],{"class":230,"line":262},[228,1732,447],{"class":328},[228,1734,1735],{"class":230,"line":268},[228,1736,540],{"class":328},[285,1738,1739,1740,1742],{},"Use ",[225,1741,1293],{}," to provide this value per environment.",[285,1744,1745,1748,1749,1751,1752,1754],{},[1244,1746,1747],{},"Custom domains or self-hosted",": You should set ",[225,1750,1513],{}," (or ",[225,1753,1293],{},") when using custom domains or deploying to your own VPS\u002Fserver. Platform env vars return auto-generated URLs, not your custom domain.",[217,1756,1761],{"className":1757,"code":1758,"filename":1759,"language":1760,"meta":223,"style":223},"language-ini shiki shiki-themes one-light synthwave-84 synthwave-84","NUXT_PUBLIC_SITE_URL=\"https:\u002F\u002Fyour-domain.com\"\n",".env","ini",[225,1762,1763],{"__ignoreMap":223},[228,1764,1765],{"class":230,"line":231},[228,1766,1758],{},[542,1768,1769,1770,1773,1774,1776],{},"Migration: deployments that previously inferred the URL from ",[225,1771,1772],{},"Host"," or forwarded headers must set ",[225,1775,1293],{},", unless a platform URL is available. This prevents a supplied host from changing password-reset links or OAuth callbacks. Development still infers the request URL. Custom domains need an explicit URL because platform variables name the platform domain.",[301,1778,1780],{"id":1779},"runtime-config","Runtime Config",[285,1782,1783,1784,1787],{},"Configure secrets using environment variables (see ",[598,1785,13],{"href":1786},"\u002Fgetting-started\u002Finstallation#set-environment-variables",").",[217,1789,1791],{"className":1757,"code":1790,"filename":1759,"language":1760,"meta":223,"style":223},"NUXT_BETTER_AUTH_SECRET=\"your-super-secret-key\"\nNUXT_PUBLIC_SITE_URL=\"https:\u002F\u002Fyour-domain.com\" # Required on Workers, custom domains, and hosts without a platform URL\n",[225,1792,1793,1798],{"__ignoreMap":223},[228,1794,1795],{"class":230,"line":231},[228,1796,1797],{},"NUXT_BETTER_AUTH_SECRET=\"your-super-secret-key\"\n",[228,1799,1800],{"class":230,"line":237},[228,1801,1802],{},"NUXT_PUBLIC_SITE_URL=\"https:\u002F\u002Fyour-domain.com\" # Required on Workers, custom domains, and hosts without a platform URL\n",[1804,1805,1739,1806,1808,1809,1811],"tip",{},[225,1807,1253],{}," as the primary secret variable. ",[225,1810,1257],{}," remains supported as a fallback for existing setups.",[285,1813,1814,1815,1818,1819,759,1821,299],{},"For non-destructive rotation, use ",[225,1816,1817],{},"BETTER_AUTH_SECRETS=2:current-secret-must-be-at-least-32-characters,1:previous-secret-must-be-at-least-32-characters"," or configure ",[225,1820,1237],{},[225,1822,1096],{},[301,1824,1826],{"id":1825},"add-plugins-from-a-nuxt-layer","Add plugins from a Nuxt layer",[285,1828,1829],{},"A layer can add server and client plugins without changing the app's auth config. Export each plugin as the default value of its own module, then list those modules in the layer config.",[217,1831,1834],{"className":307,"code":1832,"filename":1833,"language":309,"meta":223,"style":223},"export default defineNuxtConfig({\n  auth: {\n    serverPluginSources: ['.\u002Fserver\u002Fpolar-auth-plugin'],\n    clientPluginSources: ['.\u002Fapp\u002Fpolar-auth-plugin'],\n  },\n})\n","layers\u002Fpayments\u002Fnuxt.config.ts",[225,1835,1836,1846,1854,1868,1882,1886],{"__ignoreMap":223},[228,1837,1838,1840,1842,1844],{"class":230,"line":231},[228,1839,317],{"class":316},[228,1841,321],{"class":320},[228,1843,325],{"class":324},[228,1845,329],{"class":328},[228,1847,1848,1850,1852],{"class":230,"line":237},[228,1849,354],{"class":334},[228,1851,339],{"class":338},[228,1853,359],{"class":328},[228,1855,1856,1859,1861,1863,1866],{"class":230,"line":244},[228,1857,1858],{"class":334},"    serverPluginSources",[228,1860,339],{"class":338},[228,1862,342],{"class":328},[228,1864,1865],{"class":345},"'.\u002Fserver\u002Fpolar-auth-plugin'",[228,1867,349],{"class":328},[228,1869,1870,1873,1875,1877,1880],{"class":230,"line":250},[228,1871,1872],{"class":334},"    clientPluginSources",[228,1874,339],{"class":338},[228,1876,342],{"class":328},[228,1878,1879],{"class":345},"'.\u002Fapp\u002Fpolar-auth-plugin'",[228,1881,349],{"class":328},[228,1883,1884],{"class":230,"line":256},[228,1885,447],{"class":328},[228,1887,1888],{"class":230,"line":262},[228,1889,540],{"class":328},[217,1891,1894],{"className":307,"code":1892,"filename":1893,"language":309,"meta":223,"style":223},"import { polar } from '@polar-sh\u002Fbetter-auth'\n\nexport default polar({ \u002F* Polar options *\u002F })\n","layers\u002Fpayments\u002Fserver\u002Fpolar-auth-plugin.ts",[225,1895,1896,1912,1916],{"__ignoreMap":223},[228,1897,1898,1900,1902,1905,1907,1909],{"class":230,"line":231},[228,1899,1112],{"class":316},[228,1901,468],{"class":328},[228,1903,1904],{"class":334},"polar",[228,1906,1119],{"class":328},[228,1908,1122],{"class":316},[228,1910,1911],{"class":345}," '@polar-sh\u002Fbetter-auth'\n",[228,1913,1914],{"class":230,"line":237},[228,1915,241],{"emptyLinePlaceholder":240},[228,1917,1918,1920,1922,1925,1928,1931],{"class":230,"line":244},[228,1919,317],{"class":316},[228,1921,321],{"class":320},[228,1923,1924],{"class":324}," polar",[228,1926,1927],{"class":328},"({ ",[228,1929,1930],{"class":398},"\u002F* Polar options *\u002F",[228,1932,1933],{"class":328}," })\n",[217,1935,1938],{"className":307,"code":1936,"filename":1937,"language":309,"meta":223,"style":223},"import { polarClient } from '@polar-sh\u002Fbetter-auth\u002Fclient'\n\nexport default polarClient()\n","layers\u002Fpayments\u002Fapp\u002Fpolar-auth-plugin.ts",[225,1939,1940,1956,1960],{"__ignoreMap":223},[228,1941,1942,1944,1946,1949,1951,1953],{"class":230,"line":231},[228,1943,1112],{"class":316},[228,1945,468],{"class":328},[228,1947,1948],{"class":334},"polarClient",[228,1950,1119],{"class":328},[228,1952,1122],{"class":316},[228,1954,1955],{"class":345}," '@polar-sh\u002Fbetter-auth\u002Fclient'\n",[228,1957,1958],{"class":230,"line":237},[228,1959,241],{"emptyLinePlaceholder":240},[228,1961,1962,1964,1966,1969],{"class":230,"line":244},[228,1963,317],{"class":316},[228,1965,321],{"class":320},[228,1967,1968],{"class":324}," polarClient",[228,1970,1971],{"class":328},"()\n",[285,1973,1974],{},"Relative source paths resolve from the layer that declares them. The module appends project sources, then extended-layer sources in Nuxt priority order, after the plugins in the app's selected auth config.",[285,1976,1977],{},"Contributions are additive and are not deduplicated. Declare each plugin in one place. Do not repeat a plugin in the app auth config, a layer source, or a module registration.",[301,1979,1981],{"id":1980},"recommended-order","Recommended order",[1983,1984,1985,1990,1995,2000],"ol",{},[579,1986,1987,1988,299],{},"Configure the module in ",[225,1989,290],{},[579,1991,1992,1993,299],{},"Configure Better Auth behavior in ",[225,1994,294],{},[579,1996,1997,1998,299],{},"Configure client plugins in ",[225,1999,298],{},[579,2001,2002,2003,548,2005,299],{},"Add route protection with ",[225,2004,547],{},[225,2006,2007],{},"definePageMeta({ auth })",[301,2009,2011],{"id":2010},"verify-the-result","Verify the result",[285,2013,2014],{},"After configuration changes:",[576,2016,2017,2020,2023],{},[579,2018,2019],{},"restart the Nuxt dev server if you changed schema- or plugin-related settings",[579,2021,2022],{},"confirm your app boots without missing-config errors",[579,2024,2025],{},"confirm route protection works on at least one protected page and one protected API route",[301,2027,2029],{"id":2028},"for-module-authors","For module authors",[285,2031,2032,2033,2036,2037,2040,2041,2043],{},"Other Nuxt modules can register plugin source files. Register the hook during the module's ",[225,2034,2035],{},"setup"," function and resolve each file to an absolute path. Registering the hook from ",[225,2038,2039],{},"modules:done"," is too late because Better Auth collects the sources from its own ",[225,2042,2039],{}," callback.",[217,2045,2047],{"className":307,"code":2046,"language":309,"meta":223,"style":223},"import { fileURLToPath } from 'node:url'\n\nexport default defineNuxtModule({\n  setup(_options, nuxt) {\n    nuxt.hook('better-auth:plugins:extend', (sources) => {\n      sources.server ||= []\n      sources.client ||= []\n      sources.server.push(fileURLToPath(new URL('.\u002Fruntime\u002Fserver-plugin', import.meta.url)))\n      sources.client.push(fileURLToPath(new URL('.\u002Fruntime\u002Fclient-plugin', import.meta.url)))\n    })\n  },\n})\n",[225,2048,2049,2065,2069,2080,2099,2126,2146,2161,2208,2249,2254,2258],{"__ignoreMap":223},[228,2050,2051,2053,2055,2058,2060,2062],{"class":230,"line":231},[228,2052,1112],{"class":316},[228,2054,468],{"class":328},[228,2056,2057],{"class":334},"fileURLToPath",[228,2059,1119],{"class":328},[228,2061,1122],{"class":316},[228,2063,2064],{"class":345}," 'node:url'\n",[228,2066,2067],{"class":230,"line":237},[228,2068,241],{"emptyLinePlaceholder":240},[228,2070,2071,2073,2075,2078],{"class":230,"line":244},[228,2072,317],{"class":316},[228,2074,321],{"class":320},[228,2076,2077],{"class":324}," defineNuxtModule",[228,2079,329],{"class":328},[228,2081,2082,2085,2088,2091,2093,2096],{"class":230,"line":250},[228,2083,2084],{"class":324},"  setup",[228,2086,2087],{"class":328},"(",[228,2089,2090],{"class":1191},"_options",[228,2092,291],{"class":328},[228,2094,2095],{"class":1191},"nuxt",[228,2097,2098],{"class":328},") {\n",[228,2100,2101,2104,2106,2109,2111,2114,2117,2120,2122,2124],{"class":230,"line":256},[228,2102,2103],{"class":1376},"    nuxt",[228,2105,299],{"class":328},[228,2107,2108],{"class":324},"hook",[228,2110,2087],{"class":328},[228,2112,2113],{"class":345},"'better-auth:plugins:extend'",[228,2115,2116],{"class":328},", (",[228,2118,2119],{"class":1191},"sources",[228,2121,1195],{"class":328},[228,2123,1198],{"class":316},[228,2125,359],{"class":328},[228,2127,2128,2131,2133,2136,2139,2143],{"class":230,"line":262},[228,2129,2130],{"class":1376},"      sources",[228,2132,299],{"class":328},[228,2134,2135],{"class":334},"server",[228,2137,2138],{"class":1395}," ||",[228,2140,2142],{"class":2141},"sQBpM","=",[228,2144,2145],{"class":328}," []\n",[228,2147,2148,2150,2152,2155,2157,2159],{"class":230,"line":268},[228,2149,2130],{"class":1376},[228,2151,299],{"class":328},[228,2153,2154],{"class":334},"client",[228,2156,2138],{"class":1395},[228,2158,2142],{"class":2141},[228,2160,2145],{"class":328},[228,2162,2163,2165,2167,2169,2171,2174,2176,2178,2180,2183,2186,2188,2191,2193,2195,2197,2200,2202,2205],{"class":230,"line":274},[228,2164,2130],{"class":1376},[228,2166,299],{"class":328},[228,2168,2135],{"class":334},[228,2170,299],{"class":328},[228,2172,2173],{"class":324},"push",[228,2175,2087],{"class":328},[228,2177,2057],{"class":324},[228,2179,2087],{"class":328},[228,2181,2182],{"class":316},"new",[228,2184,2185],{"class":324}," URL",[228,2187,2087],{"class":328},[228,2189,2190],{"class":345},"'.\u002Fruntime\u002Fserver-plugin'",[228,2192,291],{"class":328},[228,2194,1112],{"class":316},[228,2196,299],{"class":328},[228,2198,2199],{"class":334},"meta",[228,2201,299],{"class":328},[228,2203,2204],{"class":334},"url",[228,2206,2207],{"class":328},")))\n",[228,2209,2210,2212,2214,2216,2218,2220,2222,2224,2226,2228,2230,2232,2235,2237,2239,2241,2243,2245,2247],{"class":230,"line":280},[228,2211,2130],{"class":1376},[228,2213,299],{"class":328},[228,2215,2154],{"class":334},[228,2217,299],{"class":328},[228,2219,2173],{"class":324},[228,2221,2087],{"class":328},[228,2223,2057],{"class":324},[228,2225,2087],{"class":328},[228,2227,2182],{"class":316},[228,2229,2185],{"class":324},[228,2231,2087],{"class":328},[228,2233,2234],{"class":345},"'.\u002Fruntime\u002Fclient-plugin'",[228,2236,291],{"class":328},[228,2238,1112],{"class":316},[228,2240,299],{"class":328},[228,2242,2199],{"class":334},[228,2244,299],{"class":328},[228,2246,2204],{"class":334},[228,2248,2207],{"class":328},[228,2250,2251],{"class":230,"line":417},[228,2252,2253],{"class":328},"    })\n",[228,2255,2256],{"class":230,"line":431},[228,2257,447],{"class":328},[228,2259,2260],{"class":230,"line":444},[228,2261,540],{"class":328},[285,2263,2264],{},"The module collects registrations after all Nuxt modules install, then appends them after layer sources. Schema generation, the running auth instances, and generated types import the same ordered plugin modules. Module registrations are additive and are not deduplicated.",[285,2266,2267,2268,2271],{},"The existing ",[225,2269,2270],{},"better-auth:config:extend"," hook remains available for schema-only contributions:",[217,2273,2275],{"className":307,"code":2274,"language":309,"meta":223,"style":223},"nuxt.hook('better-auth:config:extend', (config) => {\n  config.plugins = [...(config.plugins || []), schemaPlugin]\n})\n",[225,2276,2277,2301,2338],{"__ignoreMap":223},[228,2278,2279,2281,2283,2285,2287,2290,2292,2295,2297,2299],{"class":230,"line":231},[228,2280,2095],{"class":1376},[228,2282,299],{"class":328},[228,2284,2108],{"class":324},[228,2286,2087],{"class":328},[228,2288,2289],{"class":345},"'better-auth:config:extend'",[228,2291,2116],{"class":328},[228,2293,2294],{"class":1191},"config",[228,2296,1195],{"class":328},[228,2298,1198],{"class":316},[228,2300,359],{"class":328},[228,2302,2303,2306,2308,2310,2313,2315,2318,2320,2322,2324,2327,2329,2332,2335],{"class":230,"line":237},[228,2304,2305],{"class":1376},"  config",[228,2307,299],{"class":328},[228,2309,1537],{"class":334},[228,2311,2312],{"class":2141}," =",[228,2314,342],{"class":328},[228,2316,2317],{"class":1395},"...",[228,2319,2087],{"class":328},[228,2321,2294],{"class":1376},[228,2323,299],{"class":328},[228,2325,1537],{"class":2326},"sjaJz",[228,2328,2138],{"class":1395},[228,2330,2331],{"class":328}," []), ",[228,2333,2334],{"class":1376},"schemaPlugin",[228,2336,2337],{"class":328},"]\n",[228,2339,2340],{"class":230,"line":244},[228,2341,540],{"class":328},[285,2343,2344,2345,2347,2348,2351],{},"This build-time hook accepts only ",[225,2346,1537],{}," and does not install them in the running Better Auth instance. Use ",[225,2349,2350],{},"better-auth:plugins:extend"," when the plugin must also affect runtime behavior or generated types.",[285,2353,2354],{},"Access sessions from server handlers:",[217,2356,2358],{"className":307,"code":2357,"language":309,"meta":223,"style":223},"const { user, session } = await getUserSession(event)\nif (!user) throw createError({ statusCode: 401 })\n",[225,2359,2360,2392],{"__ignoreMap":223},[228,2361,2362,2365,2367,2371,2373,2375,2377,2379,2382,2385,2387,2389],{"class":230,"line":231},[228,2363,2364],{"class":316},"const",[228,2366,468],{"class":328},[228,2368,2370],{"class":2369},"s6Rhl","user",[228,2372,291],{"class":328},[228,2374,769],{"class":2369},[228,2376,1119],{"class":328},[228,2378,2142],{"class":2141},[228,2380,2381],{"class":316}," await",[228,2383,2384],{"class":324}," getUserSession",[228,2386,2087],{"class":328},[228,2388,1663],{"class":1376},[228,2390,2391],{"class":328},")\n",[228,2393,2394,2397,2400,2403,2405,2407,2410,2413,2415,2418,2420,2423],{"class":230,"line":237},[228,2395,2396],{"class":316},"if",[228,2398,2399],{"class":328}," (",[228,2401,2402],{"class":1395},"!",[228,2404,2370],{"class":1376},[228,2406,1195],{"class":328},[228,2408,2409],{"class":316},"throw",[228,2411,2412],{"class":324}," createError",[228,2414,1927],{"class":328},[228,2416,2417],{"class":334},"statusCode",[228,2419,339],{"class":338},[228,2421,2422],{"class":425}," 401",[228,2424,1933],{"class":328},[2426,2427,2428],"style",{},"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 .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 .sYvLG, html code.shiki .sYvLG{--shiki-light:#E45649;--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 .sPAZv, html code.shiki .sPAZv{--shiki-light:#50A14F;--shiki-default:#FF8B39;--shiki-dark:#FF8B39}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 .s3ZNE, html code.shiki .s3ZNE{--shiki-light:#986801;--shiki-default:#F97E72;--shiki-dark:#F97E72}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 .svFNh, html code.shiki .svFNh{--shiki-light:#383A42;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sn-Jc, html code.shiki .sn-Jc{--shiki-light:#0184BC;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sQBpM, html code.shiki .sQBpM{--shiki-light:#0184BC;--shiki-default:#FFFFFFEE;--shiki-dark:#FFFFFFEE}html pre.shiki code .sjaJz, html code.shiki .sjaJz{--shiki-light:#C18401;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .s6Rhl, html code.shiki .s6Rhl{--shiki-light:#986801;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}",{"title":223,"searchDepth":237,"depth":237,"links":2430},[2431,2432,2433,2438,2439,2440,2441,2442,2443],{"id":303,"depth":237,"text":304},{"id":816,"depth":237,"text":817},{"id":1084,"depth":237,"text":1085,"children":2434},[2435,2436,2437],{"id":1095,"depth":244,"text":1096},{"id":1297,"depth":244,"text":1298},{"id":1526,"depth":244,"text":1527},{"id":1553,"depth":237,"text":1554},{"id":1779,"depth":237,"text":1780},{"id":1825,"depth":237,"text":1826},{"id":1980,"depth":237,"text":1981},{"id":2010,"depth":237,"text":2011},{"id":2028,"depth":237,"text":2029},"Configure the module options and your Better Auth server instance.","md",null,{},{"icon":21},{"title":18,"description":2444},"JCqODc6rAq6fUjLirCdHsLH5kq6yTP0261Ig6gxW3wk",[2452,2454],{"title":13,"path":14,"stem":15,"description":2453,"icon":16,"children":-1},"Learn how to add Nuxt Better Auth to your Nuxt project.",{"title":23,"path":24,"stem":25,"description":2455,"icon":26,"children":-1},"Configure the client-side authentication client.",1791215139965]