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