[{"data":1,"prerenderedAt":1099},["ShallowReactive",2],{"navigation_docs":3,"-guides-production-deployment":152,"-guides-production-deployment-surround":1094},[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":107,"body":154,"description":1088,"extension":1089,"links":1090,"meta":1091,"navigation":196,"path":108,"seo":1092,"stem":109,"__hash__":1093},"docs/3.guides/9.production-deployment.md",{"type":155,"value":156,"toc":1070},"minimark",[157,162,166,233,238,259,262,266,270,322,325,336,438,442,445,831,834,838,845,917,920,924,927,947,999,1003,1007,1017,1021,1027,1031,1034,1049,1052,1066],[158,159,161],"h2",{"id":160},"environment-variables","Environment Variables",[163,164,165],"p",{},"Production requires these environment variables:",[167,168,174],"pre",{"className":169,"code":170,"filename":171,"language":172,"meta":173,"style":173},"language-ini shiki shiki-themes one-light synthwave-84 synthwave-84","# Required: 32+ character secret for session encryption\nNUXT_BETTER_AUTH_SECRET=\"your-32-character-secret-here-minimum\"\n\n# Optional: Auto-detected on Vercel/Cloudflare/Netlify\nNUXT_PUBLIC_SITE_URL=\"https://your-app.com\"\n\n# OAuth provider credentials (if using)\nGOOGLE_CLIENT_ID=\"...\"\nGOOGLE_CLIENT_SECRET=\"...\"\n",".env.production","ini","",[175,176,177,185,191,198,204,210,215,221,227],"code",{"__ignoreMap":173},[178,179,182],"span",{"class":180,"line":181},"line",1,[178,183,184],{},"# Required: 32+ character secret for session encryption\n",[178,186,188],{"class":180,"line":187},2,[178,189,190],{},"NUXT_BETTER_AUTH_SECRET=\"your-32-character-secret-here-minimum\"\n",[178,192,194],{"class":180,"line":193},3,[178,195,197],{"emptyLinePlaceholder":196},true,"\n",[178,199,201],{"class":180,"line":200},4,[178,202,203],{},"# Optional: Auto-detected on Vercel/Cloudflare/Netlify\n",[178,205,207],{"class":180,"line":206},5,[178,208,209],{},"NUXT_PUBLIC_SITE_URL=\"https://your-app.com\"\n",[178,211,213],{"class":180,"line":212},6,[178,214,197],{"emptyLinePlaceholder":196},[178,216,218],{"class":180,"line":217},7,[178,219,220],{},"# OAuth provider credentials (if using)\n",[178,222,224],{"class":180,"line":223},8,[178,225,226],{},"GOOGLE_CLIENT_ID=\"...\"\n",[178,228,230],{"class":180,"line":229},9,[178,231,232],{},"GOOGLE_CLIENT_SECRET=\"...\"\n",[234,235,237],"h3",{"id":236},"generate-a-secure-secret","Generate a Secure Secret",[167,239,243],{"className":240,"code":241,"language":242,"meta":173,"style":173},"language-bash shiki shiki-themes one-light synthwave-84 synthwave-84","node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"\n","bash",[175,244,245],{"__ignoreMap":173},[178,246,247,251,255],{"class":180,"line":181},[178,248,250],{"class":249},"siqUp","node",[178,252,254],{"class":253},"s3ZNE"," -e",[178,256,258],{"class":257},"sPAZv"," \"console.log(require('crypto').randomBytes(32).toString('hex'))\"\n",[163,260,261],{},"The secret must be at least 32 characters. Shorter secrets will cause the module to throw an error.",[158,263,265],{"id":264},"security-checklist","Security Checklist",[234,267,269],{"id":268},"before-deploying","Before Deploying",[271,272,275,289,298,307,313],"ul",{"className":273},[274],"contains-task-list",[276,277,280,284,285,288],"li",{"className":278},[279],"task-list-item",[281,282],"input",{"disabled":196,"type":283},"checkbox"," ",[175,286,287],{},"NUXT_BETTER_AUTH_SECRET"," is set and 32+ characters",[276,290,292,284,294,297],{"className":291},[279],[281,293],{"disabled":196,"type":283},[175,295,296],{},"NUXT_PUBLIC_SITE_URL"," set (or using Vercel/Cloudflare/Netlify auto-detection)",[276,299,301,284,303,306],{"className":300},[279],[281,302],{"disabled":196,"type":283},[175,304,305],{},"trustedOrigins"," includes every active frontend origin (primary domain and preview domain, if used)",[276,308,310,312],{"className":309},[279],[281,311],{"disabled":196,"type":283}," OAuth redirect URIs configured for production domain",[276,314,316,284,318,321],{"className":315},[279],[281,317],{"disabled":196,"type":283},[175,319,320],{},"NODE_ENV=production"," is set (disables devtools)",[234,323,56],{"id":324},"route-protection",[163,326,327,328,331,332,335],{},"Route rules and ",[175,329,330],{},"definePageMeta"," are for UX (redirects). Always protect API endpoints with ",[175,333,334],{},"requireUserSession",":",[167,337,342],{"className":338,"code":339,"filename":340,"language":341,"meta":173,"style":173},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","export default defineEventHandler(async (event) => {\n  const { user } = await requireUserSession(event)\n  return { data: 'protected' }\n})\n","server/api/protected.get.ts","ts",[175,343,344,381,414,433],{"__ignoreMap":173},[178,345,346,350,354,358,362,365,368,372,375,378],{"class":180,"line":181},[178,347,349],{"class":348},"sqe1H","export",[178,351,353],{"class":352},"sKg8T"," default",[178,355,357],{"class":356},"sfT9l"," defineEventHandler",[178,359,361],{"class":360},"s17Py","(",[178,363,364],{"class":348},"async",[178,366,367],{"class":360}," (",[178,369,371],{"class":370},"sgisi","event",[178,373,374],{"class":360},") ",[178,376,377],{"class":348},"=>",[178,379,380],{"class":360}," {\n",[178,382,383,386,389,393,396,400,403,406,408,411],{"class":180,"line":187},[178,384,385],{"class":348},"  const",[178,387,388],{"class":360}," { ",[178,390,392],{"class":391},"s6Rhl","user",[178,394,395],{"class":360}," } ",[178,397,399],{"class":398},"sQBpM","=",[178,401,402],{"class":348}," await",[178,404,405],{"class":356}," requireUserSession",[178,407,361],{"class":360},[178,409,371],{"class":410},"sYvLG",[178,412,413],{"class":360},")\n",[178,415,416,419,421,424,427,430],{"class":180,"line":193},[178,417,418],{"class":348},"  return",[178,420,388],{"class":360},[178,422,423],{"class":410},"data",[178,425,335],{"class":426},"sVnqq",[178,428,429],{"class":257}," 'protected'",[178,431,432],{"class":360}," }\n",[178,434,435],{"class":180,"line":200},[178,436,437],{"class":360},"})\n",[234,439,441],{"id":440},"rate-limiting","Rate Limiting",[163,443,444],{},"The module does not include built-in rate limiting. Implement rate limiting at the infrastructure level or use a middleware:",[167,446,449],{"className":338,"code":447,"filename":448,"language":341,"meta":173,"style":173},"import { getRequestIP } from 'h3'\n\nconst requests = new Map\u003Cstring, number[]>()\nconst WINDOW_MS = 60_000 // 1 minute\nconst MAX_REQUESTS = 100\n\nexport default defineEventHandler((event) => {\n  if (!event.path.startsWith('/api/auth'))\n    return\n\n  const ip = getRequestIP(event) || 'unknown'\n  const now = Date.now()\n  const windowStart = now - WINDOW_MS\n\n  const timestamps = (requests.get(ip) || []).filter(t => t > windowStart)\n  timestamps.push(now)\n  requests.set(ip, timestamps)\n\n  if (timestamps.length > MAX_REQUESTS) {\n    throw createError({ statusCode: 429, message: 'Too many requests' })\n  }\n})\n","server/middleware/rate-limit.ts",[175,450,451,469,473,506,522,534,538,557,590,595,600,625,646,664,669,722,739,761,766,787,820,826],{"__ignoreMap":173},[178,452,453,456,458,461,463,466],{"class":180,"line":181},[178,454,455],{"class":348},"import",[178,457,388],{"class":360},[178,459,460],{"class":410},"getRequestIP",[178,462,395],{"class":360},[178,464,465],{"class":348},"from",[178,467,468],{"class":257}," 'h3'\n",[178,470,471],{"class":180,"line":187},[178,472,197],{"emptyLinePlaceholder":196},[178,474,475,478,481,484,487,490,493,497,500,503],{"class":180,"line":193},[178,476,477],{"class":348},"const",[178,479,480],{"class":391}," requests",[178,482,483],{"class":398}," =",[178,485,486],{"class":348}," new",[178,488,489],{"class":356}," Map",[178,491,492],{"class":360},"\u003C",[178,494,496],{"class":495},"sivOE","string",[178,498,499],{"class":360},", ",[178,501,502],{"class":495},"number",[178,504,505],{"class":360},"[]>()\n",[178,507,508,510,513,515,518],{"class":180,"line":200},[178,509,477],{"class":348},[178,511,512],{"class":391}," WINDOW_MS",[178,514,483],{"class":398},[178,516,517],{"class":253}," 60_000",[178,519,521],{"class":520},"st7cf"," // 1 minute\n",[178,523,524,526,529,531],{"class":180,"line":206},[178,525,477],{"class":348},[178,527,528],{"class":391}," MAX_REQUESTS",[178,530,483],{"class":398},[178,532,533],{"class":253}," 100\n",[178,535,536],{"class":180,"line":212},[178,537,197],{"emptyLinePlaceholder":196},[178,539,540,542,544,546,549,551,553,555],{"class":180,"line":217},[178,541,349],{"class":348},[178,543,353],{"class":352},[178,545,357],{"class":356},[178,547,548],{"class":360},"((",[178,550,371],{"class":370},[178,552,374],{"class":360},[178,554,377],{"class":348},[178,556,380],{"class":360},[178,558,559,562,564,568,571,574,577,579,582,584,587],{"class":180,"line":223},[178,560,561],{"class":348},"  if",[178,563,367],{"class":360},[178,565,567],{"class":566},"sn-Jc","!",[178,569,371],{"class":570},"svFNh",[178,572,573],{"class":360},".",[178,575,576],{"class":410},"path",[178,578,573],{"class":360},[178,580,581],{"class":356},"startsWith",[178,583,361],{"class":360},[178,585,586],{"class":257},"'/api/auth'",[178,588,589],{"class":360},"))\n",[178,591,592],{"class":180,"line":229},[178,593,594],{"class":348},"    return\n",[178,596,598],{"class":180,"line":597},10,[178,599,197],{"emptyLinePlaceholder":196},[178,601,603,605,608,610,613,615,617,619,622],{"class":180,"line":602},11,[178,604,385],{"class":348},[178,606,607],{"class":391}," ip",[178,609,483],{"class":398},[178,611,612],{"class":356}," getRequestIP",[178,614,361],{"class":360},[178,616,371],{"class":410},[178,618,374],{"class":360},[178,620,621],{"class":566},"||",[178,623,624],{"class":257}," 'unknown'\n",[178,626,628,630,633,635,638,640,643],{"class":180,"line":627},12,[178,629,385],{"class":348},[178,631,632],{"class":391}," now",[178,634,483],{"class":398},[178,636,637],{"class":570}," Date",[178,639,573],{"class":360},[178,641,642],{"class":356},"now",[178,644,645],{"class":360},"()\n",[178,647,649,651,654,656,658,661],{"class":180,"line":648},13,[178,650,385],{"class":348},[178,652,653],{"class":391}," windowStart",[178,655,483],{"class":398},[178,657,632],{"class":410},[178,659,660],{"class":566}," -",[178,662,663],{"class":391}," WINDOW_MS\n",[178,665,667],{"class":180,"line":666},14,[178,668,197],{"emptyLinePlaceholder":196},[178,670,672,674,677,679,681,684,686,689,691,694,696,698,701,704,706,709,712,715,718,720],{"class":180,"line":671},15,[178,673,385],{"class":348},[178,675,676],{"class":391}," timestamps",[178,678,483],{"class":398},[178,680,367],{"class":360},[178,682,683],{"class":570},"requests",[178,685,573],{"class":360},[178,687,688],{"class":356},"get",[178,690,361],{"class":360},[178,692,693],{"class":410},"ip",[178,695,374],{"class":360},[178,697,621],{"class":566},[178,699,700],{"class":360}," []).",[178,702,703],{"class":356},"filter",[178,705,361],{"class":360},[178,707,708],{"class":370},"t",[178,710,711],{"class":348}," =>",[178,713,714],{"class":410}," t",[178,716,717],{"class":566}," >",[178,719,653],{"class":410},[178,721,413],{"class":360},[178,723,725,728,730,733,735,737],{"class":180,"line":724},16,[178,726,727],{"class":570},"  timestamps",[178,729,573],{"class":360},[178,731,732],{"class":356},"push",[178,734,361],{"class":360},[178,736,642],{"class":410},[178,738,413],{"class":360},[178,740,742,745,747,750,752,754,756,759],{"class":180,"line":741},17,[178,743,744],{"class":570},"  requests",[178,746,573],{"class":360},[178,748,749],{"class":356},"set",[178,751,361],{"class":360},[178,753,693],{"class":410},[178,755,499],{"class":360},[178,757,758],{"class":410},"timestamps",[178,760,413],{"class":360},[178,762,764],{"class":180,"line":763},18,[178,765,197],{"emptyLinePlaceholder":196},[178,767,769,771,773,775,777,780,782,784],{"class":180,"line":768},19,[178,770,561],{"class":348},[178,772,367],{"class":360},[178,774,758],{"class":570},[178,776,573],{"class":360},[178,778,779],{"class":410},"length",[178,781,717],{"class":566},[178,783,528],{"class":391},[178,785,786],{"class":360},") {\n",[178,788,790,793,796,799,802,804,807,809,812,814,817],{"class":180,"line":789},20,[178,791,792],{"class":348},"    throw",[178,794,795],{"class":356}," createError",[178,797,798],{"class":360},"({ ",[178,800,801],{"class":410},"statusCode",[178,803,335],{"class":426},[178,805,806],{"class":253}," 429",[178,808,499],{"class":360},[178,810,811],{"class":410},"message",[178,813,335],{"class":426},[178,815,816],{"class":257}," 'Too many requests'",[178,818,819],{"class":360}," })\n",[178,821,823],{"class":180,"line":822},21,[178,824,825],{"class":360},"  }\n",[178,827,829],{"class":180,"line":828},22,[178,830,437],{"class":360},[163,832,833],{},"For production, consider using Cloudflare rate limiting or a Redis-backed solution.",[234,835,837],{"id":836},"trusted-origins-for-preview-environments","Trusted Origins for Preview Environments",[163,839,840,841,844],{},"If your workflow uses preview URLs (for example, ",[175,842,843],{},"*.workers.dev","), include those origins in your Better Auth server config.",[167,846,849],{"className":338,"code":847,"filename":848,"language":341,"meta":173,"style":173},"import { defineServerAuth } from '@onmax/nuxt-better-auth/config'\n\nexport default defineServerAuth({\n  trustedOrigins: [\n    'https://your-app.com',\n    'https://your-preview.workers.dev',\n  ],\n})\n","server/auth.config.ts",[175,850,851,867,871,883,893,901,908,913],{"__ignoreMap":173},[178,852,853,855,857,860,862,864],{"class":180,"line":181},[178,854,455],{"class":348},[178,856,388],{"class":360},[178,858,859],{"class":410},"defineServerAuth",[178,861,395],{"class":360},[178,863,465],{"class":348},[178,865,866],{"class":257}," '@onmax/nuxt-better-auth/config'\n",[178,868,869],{"class":180,"line":187},[178,870,197],{"emptyLinePlaceholder":196},[178,872,873,875,877,880],{"class":180,"line":193},[178,874,349],{"class":348},[178,876,353],{"class":352},[178,878,879],{"class":356}," defineServerAuth",[178,881,882],{"class":360},"({\n",[178,884,885,888,890],{"class":180,"line":200},[178,886,887],{"class":410},"  trustedOrigins",[178,889,335],{"class":426},[178,891,892],{"class":360}," [\n",[178,894,895,898],{"class":180,"line":206},[178,896,897],{"class":257},"    'https://your-app.com'",[178,899,900],{"class":360},",\n",[178,902,903,906],{"class":180,"line":212},[178,904,905],{"class":257},"    'https://your-preview.workers.dev'",[178,907,900],{"class":360},[178,909,910],{"class":180,"line":217},[178,911,912],{"class":360},"  ],\n",[178,914,915],{"class":180,"line":223},[178,916,437],{"class":360},[163,918,919],{},"Without the preview origin, browser auth flows can fail because Better Auth rejects cookie-based requests from unknown origins.",[158,921,923],{"id":922},"nuxthub-deployment","NuxtHub Deployment",[163,925,926],{},"When deploying with NuxtHub:",[928,929,930,933,936],"ol",{},[276,931,932],{},"Database migrations run automatically during build",[276,934,935],{},"Set environment variables in your deployment platform",[276,937,938,939,942,943,946],{},"Ensure ",[175,940,941],{},"@nuxthub/core"," is listed before ",[175,944,945],{},"@onmax/nuxt-better-auth"," in modules",[167,948,951],{"className":338,"code":949,"filename":950,"language":341,"meta":173,"style":173},"export default defineNuxtConfig({\n  modules: [\n    '@nuxthub/core',  // Must be first\n    '@onmax/nuxt-better-auth',\n  ],\n})\n","nuxt.config.ts",[175,952,953,964,973,984,991,995],{"__ignoreMap":173},[178,954,955,957,959,962],{"class":180,"line":181},[178,956,349],{"class":348},[178,958,353],{"class":352},[178,960,961],{"class":356}," defineNuxtConfig",[178,963,882],{"class":360},[178,965,966,969,971],{"class":180,"line":187},[178,967,968],{"class":410},"  modules",[178,970,335],{"class":426},[178,972,892],{"class":360},[178,974,975,978,981],{"class":180,"line":193},[178,976,977],{"class":257},"    '@nuxthub/core'",[178,979,980],{"class":360},",  ",[178,982,983],{"class":520},"// Must be first\n",[178,985,986,989],{"class":180,"line":200},[178,987,988],{"class":257},"    '@onmax/nuxt-better-auth'",[178,990,900],{"class":360},[178,992,993],{"class":180,"line":206},[178,994,912],{"class":360},[178,996,997],{"class":180,"line":212},[178,998,437],{"class":360},[158,1000,1002],{"id":1001},"common-issues","Common Issues",[234,1004,1006],{"id":1005},"nuxt_better_auth_secret-must-be-at-least-32-characters","\"NUXT_BETTER_AUTH_SECRET must be at least 32 characters\"",[163,1008,1009,1010,1013,1014,1016],{},"Your secret is too short. Generate a new one using the command above. ",[175,1011,1012],{},"BETTER_AUTH_SECRET"," is still accepted as a fallback, but ",[175,1015,287],{}," is the recommended variable.",[234,1018,1020],{"id":1019},"siteurl-required-in-production","\"siteUrl required in production\"",[163,1022,1023,1024,1026],{},"The module auto-detects URLs on Vercel, Cloudflare Pages, and Netlify. For other platforms, set ",[175,1025,296],{}," to your production domain.",[234,1028,1030],{"id":1029},"oauth-redirects-fail","OAuth Redirects Fail",[163,1032,1033],{},"Ensure your OAuth provider's authorized redirect URIs include:",[271,1035,1036,1041,1046],{},[276,1037,1038],{},[175,1039,1040],{},"https://your-app.com/api/auth/callback/google",[276,1042,1043],{},[175,1044,1045],{},"https://your-app.com/api/auth/callback/github",[276,1047,1048],{},"(Replace with your domain and providers)",[158,1050,120],{"id":1051},"devtools",[163,1053,1054,1055,1057,1058,1061,1062,1065],{},"DevTools are automatically disabled in production (",[175,1056,320],{},"). The ",[175,1059,1060],{},"/api/_better-auth/*"," endpoints and ",[175,1063,1064],{},"/__better-auth-devtools"," page are not registered.",[1067,1068,1069],"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 .siqUp, html code.shiki .siqUp{--shiki-light:#4078F2;--shiki-default:#FE4450;--shiki-dark:#FE4450}html pre.shiki code .s3ZNE, html code.shiki .s3ZNE{--shiki-light:#986801;--shiki-default:#F97E72;--shiki-dark:#F97E72}html pre.shiki code .sPAZv, html code.shiki .sPAZv{--shiki-light:#50A14F;--shiki-default:#FF8B39;--shiki-dark:#FF8B39}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 .sVnqq, html code.shiki .sVnqq{--shiki-light:#0184BC;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}html pre.shiki code .sivOE, html code.shiki .sivOE{--shiki-light:#383A42;--shiki-default:#FE4450;--shiki-dark:#FE4450}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 .sn-Jc, html code.shiki .sn-Jc{--shiki-light:#0184BC;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .svFNh, html code.shiki .svFNh{--shiki-light:#383A42;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}",{"title":173,"searchDepth":187,"depth":187,"links":1071},[1072,1075,1081,1082,1087],{"id":160,"depth":187,"text":161,"children":1073},[1074],{"id":236,"depth":193,"text":237},{"id":264,"depth":187,"text":265,"children":1076},[1077,1078,1079,1080],{"id":268,"depth":193,"text":269},{"id":324,"depth":193,"text":56},{"id":440,"depth":193,"text":441},{"id":836,"depth":193,"text":837},{"id":922,"depth":187,"text":923},{"id":1001,"depth":187,"text":1002,"children":1083},[1084,1085,1086],{"id":1005,"depth":193,"text":1006},{"id":1019,"depth":193,"text":1020},{"id":1029,"depth":193,"text":1030},{"id":1051,"depth":187,"text":120},"Checklist and best practices for deploying Nuxt Better Auth in production.","md",null,{},{"title":107,"description":1088},"8WKs_BotVNXxx3vtaU3AH2JKmDTS2kBkt8DUM_3qa1w",[1095,1097],{"title":103,"path":104,"stem":105,"description":1096,"children":-1},"Mock authentication in tests.",{"title":116,"path":117,"stem":118,"description":1098,"children":-1},"Automatic database setup with schema generation and Drizzle ORM integration.",1774189124069]