[{"data":1,"prerenderedAt":1509},["ShallowReactive",2],{"navigation_docs":3,"-integrations-nuxthub":208,"-integrations-nuxthub-surround":1504},[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":121,"body":210,"description":1498,"extension":1499,"links":1500,"meta":1501,"navigation":429,"path":122,"seo":1502,"stem":123,"__hash__":1503},"docs\u002F4.integrations\u002F1.nuxthub.md",{"type":211,"value":212,"toc":1473},"minimark",[213,217,227,245,250,317,321,476,480,487,539,543,559,570,635,667,682,686,698,711,714,728,732,742,748,757,770,774,779,783,786,830,834,837,887,897,901,908,939,945,980,984,993,1055,1059,1070,1297,1301,1307,1343,1347,1350,1382,1388,1392,1395,1428,1438,1442,1456,1469],[214,215,216],"p",{},"Use this guide when you want the shortest path to database-backed auth with schema generation handled by the module.",[214,218,219,223,224,226],{},[220,221],"brand-badge",{"name":222},"nuxthub"," provides the easiest way to add database persistence to your authentication. Enable ",[220,225],{"name":222}," and this module generates and manages your database schema.",[228,229,230,232,233,236,237,240,241,244],"note",{},[220,231],{"name":222}," is vendor-agnostic. Deploy to ",[220,234],{"name":235},"cloudflare",", ",[220,238],{"name":239},"vercel",", or self-host. See ",[220,242],{"name":222,"to":243},"https:\u002F\u002Fhub.nuxt.com\u002Fdocs\u002Fgetting-started\u002Fdeploy"," deployment docs.",[246,247,249],"h2",{"id":248},"features","Features",[251,252,253,261,274,290,301,307],"ul",{},[254,255,256,260],"li",{},[257,258,259],"strong",{},"Auto Schema Generation"," - Tables for users, sessions, accounts created automatically",[254,262,263,266,267,236,271],{},[257,264,265],{},"Plugin-Aware"," - Schema updates when you add plugins like ",[268,269,270],"code",{},"twoFactor",[268,272,273],{},"passkey",[254,275,276,279,280,236,283,286,287],{},[257,277,278],{},"Multi-Dialect"," - ",[220,281],{"name":282},"sqlite",[220,284],{"name":285},"postgresql",", or ",[220,288],{"name":289},"mysql",[254,291,292,295,296,236,298,300],{},[257,293,294],{},"Multi-Cloud"," - Deploy to ",[220,297],{"name":235},[220,299],{"name":239},", or self-hosted infrastructure",[254,302,303,306],{},[257,304,305],{},"Custom Secondary Storage"," - Optional atomic storage for session caching",[254,308,309,312,313,316],{},[257,310,311],{},"Zero Config Migrations"," - Use ",[268,314,315],{},"npx nuxt db migrate"," for production",[246,318,320],{"id":319},"setup","Setup",[322,323,324,329,354,358,362,469,473],"steps",{},[325,326,328],"h3",{"id":327},"install-nuxthub","Install NuxtHub",[330,331,336],"pre",{"className":332,"code":333,"language":334,"meta":335,"style":335},"language-bash shiki shiki-themes one-light synthwave-84 synthwave-84","pnpm add @nuxthub\u002Fcore@^0.10.5\n","bash","",[268,337,338],{"__ignoreMap":335},[339,340,343,347,351],"span",{"class":341,"line":342},"line",1,[339,344,346],{"class":345},"siqUp","pnpm",[339,348,350],{"class":349},"sI3kV"," add",[339,352,353],{"class":349}," @nuxthub\u002Fcore@^0.10.5\n",[355,356,357],"important",{},"Version 0.10.5 or later is required. Earlier versions cause runtime errors in development mode.",[325,359,361],{"id":360},"configure-nuxtconfigts","Configure nuxt.config.ts",[330,363,368],{"className":364,"code":365,"filename":366,"language":367,"meta":335,"style":335},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","export default defineNuxtConfig({\n  modules: [\n    '@nuxthub\u002Fcore',\n    '@nuxtjs\u002Fbetter-auth'\n  ],\n\n  hub: {\n    db: 'sqlite' \u002F\u002F 'sqlite' | 'postgresql' | 'mysql'\n  }\n})\n","nuxt.config.ts","ts",[268,369,370,388,402,412,418,424,431,442,457,463],{"__ignoreMap":335},[339,371,372,376,380,384],{"class":341,"line":342},[339,373,375],{"class":374},"sqe1H","export",[339,377,379],{"class":378},"sKg8T"," default",[339,381,383],{"class":382},"sfT9l"," defineNuxtConfig",[339,385,387],{"class":386},"s17Py","({\n",[339,389,391,395,399],{"class":341,"line":390},2,[339,392,394],{"class":393},"sYvLG","  modules",[339,396,398],{"class":397},"sVnqq",":",[339,400,401],{"class":386}," [\n",[339,403,405,409],{"class":341,"line":404},3,[339,406,408],{"class":407},"sPAZv","    '@nuxthub\u002Fcore'",[339,410,411],{"class":386},",\n",[339,413,415],{"class":341,"line":414},4,[339,416,417],{"class":407},"    '@nuxtjs\u002Fbetter-auth'\n",[339,419,421],{"class":341,"line":420},5,[339,422,423],{"class":386},"  ],\n",[339,425,427],{"class":341,"line":426},6,[339,428,430],{"emptyLinePlaceholder":429},true,"\n",[339,432,434,437,439],{"class":341,"line":433},7,[339,435,436],{"class":393},"  hub",[339,438,398],{"class":397},[339,440,441],{"class":386}," {\n",[339,443,445,448,450,453],{"class":341,"line":444},8,[339,446,447],{"class":393},"    db",[339,449,398],{"class":397},[339,451,452],{"class":407}," 'sqlite'",[339,454,456],{"class":455},"st7cf"," \u002F\u002F 'sqlite' | 'postgresql' | 'mysql'\n",[339,458,460],{"class":341,"line":459},9,[339,461,462],{"class":386},"  }\n",[339,464,466],{"class":341,"line":465},10,[339,467,468],{"class":386},"})\n",[325,470,472],{"id":471},"restart-dev-server","Restart Dev Server",[214,474,475],{},"The schema is generated at build time. Restart after configuration changes.",[246,477,479],{"id":478},"configuration-options","Configuration Options",[214,481,482,483,486],{},"The ",[268,484,485],{},"hub.db"," option accepts a string shorthand or full object:",[330,488,490],{"className":364,"code":489,"filename":366,"language":367,"meta":335,"style":335},"export default defineNuxtConfig({\n  hub: {\n    db: 'sqlite' \u002F\u002F shorthand: 'sqlite' | 'postgresql' | 'mysql'\n    \u002F\u002F or full object:\n    \u002F\u002F db: { dialect: 'postgresql', \u002F* additional options *\u002F }\n  }\n})\n",[268,491,492,502,510,521,526,531,535],{"__ignoreMap":335},[339,493,494,496,498,500],{"class":341,"line":342},[339,495,375],{"class":374},[339,497,379],{"class":378},[339,499,383],{"class":382},[339,501,387],{"class":386},[339,503,504,506,508],{"class":341,"line":390},[339,505,436],{"class":393},[339,507,398],{"class":397},[339,509,441],{"class":386},[339,511,512,514,516,518],{"class":341,"line":404},[339,513,447],{"class":393},[339,515,398],{"class":397},[339,517,452],{"class":407},[339,519,520],{"class":455}," \u002F\u002F shorthand: 'sqlite' | 'postgresql' | 'mysql'\n",[339,522,523],{"class":341,"line":414},[339,524,525],{"class":455},"    \u002F\u002F or full object:\n",[339,527,528],{"class":341,"line":420},[339,529,530],{"class":455},"    \u002F\u002F db: { dialect: 'postgresql', \u002F* additional options *\u002F }\n",[339,532,533],{"class":341,"line":426},[339,534,462],{"class":386},[339,536,537],{"class":341,"line":433},[339,538,468],{"class":386},[246,540,542],{"id":541},"secondary-storage","Secondary Storage",[214,544,545,547,548,551,552,555,556,558],{},[220,546],{"name":222}," KV cannot be used as Better Auth 1.7 secondary storage. Better Auth requires atomic ",[268,549,550],{},"getAndDelete"," for one-time verification values and atomic ",[268,553,554],{},"increment"," for rate limiting. ",[220,557],{"name":222}," KV exposes neither operation.",[214,560,561,562,565,566,569],{},"Use a custom backend such as ",[220,563],{"name":564},"redis"," or ",[220,567],{"name":568},"upstash"," that implements the complete atomic contract:",[330,571,573],{"className":364,"code":572,"filename":366,"language":367,"meta":335,"style":335},"export default defineNuxtConfig({\n  hub: { db: 'sqlite' },\n\n  auth: {\n    hubSecondaryStorage: 'custom'\n  }\n})\n",[268,574,575,585,604,608,617,627,631],{"__ignoreMap":335},[339,576,577,579,581,583],{"class":341,"line":342},[339,578,375],{"class":374},[339,580,379],{"class":378},[339,582,383],{"class":382},[339,584,387],{"class":386},[339,586,587,589,591,594,597,599,601],{"class":341,"line":390},[339,588,436],{"class":393},[339,590,398],{"class":397},[339,592,593],{"class":386}," { ",[339,595,596],{"class":393},"db",[339,598,398],{"class":397},[339,600,452],{"class":407},[339,602,603],{"class":386}," },\n",[339,605,606],{"class":341,"line":404},[339,607,430],{"emptyLinePlaceholder":429},[339,609,610,613,615],{"class":341,"line":414},[339,611,612],{"class":393},"  auth",[339,614,398],{"class":397},[339,616,441],{"class":386},[339,618,619,622,624],{"class":341,"line":420},[339,620,621],{"class":393},"    hubSecondaryStorage",[339,623,398],{"class":397},[339,625,626],{"class":407}," 'custom'\n",[339,628,629],{"class":341,"line":426},[339,630,462],{"class":386},[339,632,633],{"class":341,"line":433},[339,634,468],{"class":386},[214,636,637,638,641,642,645,646,236,649,236,651,236,653,656,657,660,661,663,664,666],{},"Then provide ",[268,639,640],{},"secondaryStorage"," in ",[268,643,644],{},"defineServerAuth()"," with ",[268,647,648],{},"get",[268,650,550],{},[268,652,554],{},[268,654,655],{},"set",", and ",[268,658,659],{},"delete"," methods. ",[268,662,550],{}," and ",[268,665,554],{}," must use the backend's atomic operations.",[668,669,670,673,674,677,678,681],"warning",{},[268,671,672],{},"hubSecondaryStorage: true"," currently logs a setup warning and continues without injecting secondary storage. Without a custom secondary store, sessions use the configured database when one exists and rate limiting defaults to process-local memory. Set the option to ",[268,675,676],{},"false"," to silence the warning, or switch to ",[268,679,680],{},"'custom'"," with an atomic backend.",[325,683,685],{"id":684},"temporary-compatibility-fallback","Temporary compatibility fallback",[214,687,688,689,692,693,663,695,697],{},"The warning keeps existing applications running while ",[220,690],{"name":222,"to":691},"https:\u002F\u002Fgithub.com\u002Fnuxt-hub\u002Fcore\u002Fpull\u002F927"," adds atomic KV operations. That work is driver-specific. The module can only restore automatic integration for drivers that provide both ",[268,694,550],{},[268,696,554],{},".",[214,699,700,701,703,704,707,708,710],{},"This fallback does not pretend ",[220,702],{"name":222}," KV is active. The module records ",[268,705,706],{},"hubSecondaryStorage"," as ",[268,709,676],{}," at runtime and generates the database-backed session schema.",[214,712,713],{},"Sessions and verification values stored only in KV will no longer be found after deploying this fallback. Users may need to sign in again, and you may need to reissue pending verification links or codes.",[214,715,716,717,720,721,724,725,697],{},"In-memory rate-limit counters are not shared between server processes. For shared limits in serverless or multi-instance deployments, set Better Auth's ",[268,718,719],{},"rateLimit.storage"," to ",[268,722,723],{},"'database'"," or provide ",[268,726,727],{},"rateLimit.customStorage",[246,729,731],{"id":730},"choosing-secondary-storage","Choosing Secondary Storage",[214,733,734,735,738,739,741],{},"Set ",[268,736,737],{},"hubSecondaryStorage: 'custom'"," only when session-read traffic is a measured bottleneck and your backend implements the atomic Better Auth contract. Keep the default ",[268,740,676],{}," for database-backed sessions.",[214,743,744,745,697],{},"This setup can introduce a short propagation window after session invalidation events, such as sign-out or permission-sensitive updates. For critical authorization paths, keep server-side checks in place with ",[268,746,747],{},"requireUserSession",[214,749,750,751,720,754,756],{},"To return to DB-only session reads, set ",[268,752,753],{},"auth.hubSecondaryStorage",[268,755,676],{}," and deploy.",[228,758,759,760,762,763,766,767,769],{},"If you previously generated migrations while ",[268,761,672],{}," omitted ",[268,764,765],{},"session",", upgrading may produce a one-time migration that reintroduces ",[268,768,765],{}," to match stable schema output.",[246,771,773],{"id":772},"production-migrations","Production Migrations",[214,775,776,778],{},[220,777],{"name":222}," handles migrations automatically in most deployments. For manual control:",[325,780,782],{"id":781},"manual-migration","Manual Migration",[214,784,785],{},"If you need to run migrations manually:",[330,787,789],{"className":332,"code":788,"language":334,"meta":335,"style":335},"# Generate migrations from schema changes\nnpx nuxt db generate\n\n# Apply pending migrations\nnpx nuxt db migrate\n",[268,790,791,796,810,814,819],{"__ignoreMap":335},[339,792,793],{"class":341,"line":342},[339,794,795],{"class":455},"# Generate migrations from schema changes\n",[339,797,798,801,804,807],{"class":341,"line":390},[339,799,800],{"class":345},"npx",[339,802,803],{"class":349}," nuxt",[339,805,806],{"class":349}," db",[339,808,809],{"class":349}," generate\n",[339,811,812],{"class":341,"line":404},[339,813,430],{"emptyLinePlaceholder":429},[339,815,816],{"class":341,"line":414},[339,817,818],{"class":455},"# Apply pending migrations\n",[339,820,821,823,825,827],{"class":341,"line":420},[339,822,800],{"class":345},[339,824,803],{"class":349},[339,826,806],{"class":349},[339,828,829],{"class":349}," migrate\n",[325,831,833],{"id":832},"cicd-integration","CI\u002FCD Integration",[214,835,836],{},"Add to your GitHub Actions workflow:",[330,838,842],{"className":839,"code":840,"language":841,"meta":335,"style":335},"language-yaml shiki shiki-themes one-light synthwave-84 synthwave-84","- name: Run migrations\n  run: npx nuxt db migrate\n  env:\n    NUXT_HUB_PROJECT_KEY: ${{ secrets.NUXTHUB_PROJECT_KEY }}\n","yaml",[268,843,844,859,869,877],{"__ignoreMap":335},[339,845,846,849,853,856],{"class":341,"line":342},[339,847,848],{"class":386},"- ",[339,850,852],{"class":851},"stweg","name",[339,854,398],{"class":855},"sNM9w",[339,857,858],{"class":349}," Run migrations\n",[339,860,861,864,866],{"class":341,"line":390},[339,862,863],{"class":851},"  run",[339,865,398],{"class":855},[339,867,868],{"class":349}," npx nuxt db migrate\n",[339,870,871,874],{"class":341,"line":404},[339,872,873],{"class":851},"  env",[339,875,876],{"class":855},":\n",[339,878,879,882,884],{"class":341,"line":414},[339,880,881],{"class":851},"    NUXT_HUB_PROJECT_KEY",[339,883,398],{"class":855},[339,885,886],{"class":349}," ${{ secrets.NUXTHUB_PROJECT_KEY }}\n",[888,889,892,893,896],"callout",{"icon":890,"to":891},"i-lucide-book","https:\u002F\u002Fhub.nuxt.com\u002Fdocs\u002Ffeatures\u002Fdatabase","See ",[220,894],{"name":222,":unlinked":895},"true"," Database docs for more details.",[246,898,900],{"id":899},"schema-generation-details","Schema Generation Details",[214,902,903,904,907],{},"The module analyzes your ",[268,905,906],{},"server\u002Fauth.config.ts"," at build time:",[909,910,911,917,927],"ol",{},[254,912,913,916],{},[257,914,915],{},"Reads plugins"," from your config",[254,918,919,926],{},[257,920,921,922,925],{},"Generates ",[220,923],{"name":924},"drizzle"," schema"," matching your dialect",[254,928,929,934,935,938],{},[257,930,931,932],{},"Injects into ",[220,933],{"name":222}," via ",[268,936,937],{},"hub:db:schema:extend"," hook",[668,940,941,944],{},[257,942,943],{},"Restart Required",": After adding\u002Fremoving plugins that affect database structure, restart the dev server to regenerate the schema.",[228,946,947,948,720,951,954,955,958,959,962,963,965,966,969,970,973,974,976,977,697],{},"When Nuxt resolves ",[268,949,950],{},"buildDir",[268,952,953],{},"node_modules\u002F.cache\u002Fnuxt\u002F.nuxt",", the module mirrors ",[268,956,957],{},"schema.\u003Cdialect>.ts"," to root ",[268,960,961],{},".nuxt\u002Fbetter-auth\u002F"," and uses that mirrored path for ",[220,964],{"name":222}," schema extension. This avoids Node type-stripping failures for ",[268,967,968],{},".ts"," files under ",[268,971,972],{},"node_modules",". In normal buildDir layouts, the hook prefers ",[268,975,957],{}," and falls back to ",[268,978,979],{},"schema.\u003Cdialect>.mjs",[246,981,983],{"id":982},"accessing-the-database","Accessing the Database",[214,985,986,987,989,990,992],{},"With ",[220,988],{"name":222},", you get access to the ",[220,991],{"name":924}," database instance in your server config:",[330,994,996],{"className":364,"code":995,"filename":906,"language":367,"meta":335,"style":335},"import { defineServerAuth } from '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n\nexport default defineServerAuth(({ db }) => ({\n  \u002F\u002F db is the Drizzle instance from NuxtHub\n}))\n",[268,997,998,1017,1021,1045,1050],{"__ignoreMap":335},[339,999,1000,1003,1005,1008,1011,1014],{"class":341,"line":342},[339,1001,1002],{"class":374},"import",[339,1004,593],{"class":386},[339,1006,1007],{"class":393},"defineServerAuth",[339,1009,1010],{"class":386}," } ",[339,1012,1013],{"class":374},"from",[339,1015,1016],{"class":407}," '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n",[339,1018,1019],{"class":341,"line":390},[339,1020,430],{"emptyLinePlaceholder":429},[339,1022,1023,1025,1027,1030,1033,1036,1039,1042],{"class":341,"line":404},[339,1024,375],{"class":374},[339,1026,379],{"class":378},[339,1028,1029],{"class":382}," defineServerAuth",[339,1031,1032],{"class":386},"(({ ",[339,1034,596],{"class":1035},"sgisi",[339,1037,1038],{"class":386}," }) ",[339,1040,1041],{"class":374},"=>",[339,1043,1044],{"class":386}," ({\n",[339,1046,1047],{"class":341,"line":414},[339,1048,1049],{"class":455},"  \u002F\u002F db is the Drizzle instance from NuxtHub\n",[339,1051,1052],{"class":341,"line":420},[339,1053,1054],{"class":386},"}))\n",[246,1056,1058],{"id":1057},"creating-custom-tables-with-foreign-keys","Creating Custom Tables with Foreign Keys",[214,1060,1061,1062,1065,1066,1069],{},"Create application tables that reference auth tables by importing ",[268,1063,1064],{},"schema"," from ",[268,1067,1068],{},"#auth\u002Fschema",". This is the stable Better Auth schema export for app queries.",[330,1071,1074],{"className":364,"code":1072,"filename":1073,"language":367,"meta":335,"style":335},"import { sqliteTable, text, integer } from 'drizzle-orm\u002Fsqlite-core'\nimport { schema } from '#auth\u002Fschema'\n\nexport const posts = sqliteTable('posts', {\n  id: text('id').primaryKey(),\n  title: text('title').notNull(),\n  authorId: text('author_id').notNull()\n    .references(() => schema.user.id),\n  createdAt: integer('created_at', { mode: 'timestamp' })\n    .$defaultFn(() => new Date()),\n})\n","server\u002Fdb\u002Fschema.ts",[268,1075,1076,1102,1117,1121,1148,1172,1193,1214,1243,1272,1292],{"__ignoreMap":335},[339,1077,1078,1080,1082,1085,1087,1090,1092,1095,1097,1099],{"class":341,"line":342},[339,1079,1002],{"class":374},[339,1081,593],{"class":386},[339,1083,1084],{"class":393},"sqliteTable",[339,1086,236],{"class":386},[339,1088,1089],{"class":393},"text",[339,1091,236],{"class":386},[339,1093,1094],{"class":393},"integer",[339,1096,1010],{"class":386},[339,1098,1013],{"class":374},[339,1100,1101],{"class":407}," 'drizzle-orm\u002Fsqlite-core'\n",[339,1103,1104,1106,1108,1110,1112,1114],{"class":341,"line":390},[339,1105,1002],{"class":374},[339,1107,593],{"class":386},[339,1109,1064],{"class":393},[339,1111,1010],{"class":386},[339,1113,1013],{"class":374},[339,1115,1116],{"class":407}," '#auth\u002Fschema'\n",[339,1118,1119],{"class":341,"line":404},[339,1120,430],{"emptyLinePlaceholder":429},[339,1122,1123,1125,1128,1132,1136,1139,1142,1145],{"class":341,"line":414},[339,1124,375],{"class":374},[339,1126,1127],{"class":374}," const",[339,1129,1131],{"class":1130},"s6Rhl"," posts",[339,1133,1135],{"class":1134},"sQBpM"," =",[339,1137,1138],{"class":382}," sqliteTable",[339,1140,1141],{"class":386},"(",[339,1143,1144],{"class":407},"'posts'",[339,1146,1147],{"class":386},", {\n",[339,1149,1150,1153,1155,1158,1160,1163,1166,1169],{"class":341,"line":420},[339,1151,1152],{"class":393},"  id",[339,1154,398],{"class":397},[339,1156,1157],{"class":382}," text",[339,1159,1141],{"class":386},[339,1161,1162],{"class":407},"'id'",[339,1164,1165],{"class":386},").",[339,1167,1168],{"class":382},"primaryKey",[339,1170,1171],{"class":386},"(),\n",[339,1173,1174,1177,1179,1181,1183,1186,1188,1191],{"class":341,"line":426},[339,1175,1176],{"class":393},"  title",[339,1178,398],{"class":397},[339,1180,1157],{"class":382},[339,1182,1141],{"class":386},[339,1184,1185],{"class":407},"'title'",[339,1187,1165],{"class":386},[339,1189,1190],{"class":382},"notNull",[339,1192,1171],{"class":386},[339,1194,1195,1198,1200,1202,1204,1207,1209,1211],{"class":341,"line":433},[339,1196,1197],{"class":393},"  authorId",[339,1199,398],{"class":397},[339,1201,1157],{"class":382},[339,1203,1141],{"class":386},[339,1205,1206],{"class":407},"'author_id'",[339,1208,1165],{"class":386},[339,1210,1190],{"class":382},[339,1212,1213],{"class":386},"()\n",[339,1215,1216,1219,1222,1225,1227,1230,1232,1235,1237,1240],{"class":341,"line":444},[339,1217,1218],{"class":386},"    .",[339,1220,1221],{"class":382},"references",[339,1223,1224],{"class":386},"(() ",[339,1226,1041],{"class":374},[339,1228,925],{"class":1229},"svFNh",[339,1231,697],{"class":386},[339,1233,1234],{"class":393},"user",[339,1236,697],{"class":386},[339,1238,1239],{"class":393},"id",[339,1241,1242],{"class":386},"),\n",[339,1244,1245,1248,1250,1253,1255,1258,1261,1264,1266,1269],{"class":341,"line":459},[339,1246,1247],{"class":393},"  createdAt",[339,1249,398],{"class":397},[339,1251,1252],{"class":382}," integer",[339,1254,1141],{"class":386},[339,1256,1257],{"class":407},"'created_at'",[339,1259,1260],{"class":386},", { ",[339,1262,1263],{"class":393},"mode",[339,1265,398],{"class":397},[339,1267,1268],{"class":407}," 'timestamp'",[339,1270,1271],{"class":386}," })\n",[339,1273,1274,1276,1279,1281,1283,1286,1289],{"class":341,"line":465},[339,1275,1218],{"class":386},[339,1277,1278],{"class":382},"$defaultFn",[339,1280,1224],{"class":386},[339,1282,1041],{"class":374},[339,1284,1285],{"class":374}," new",[339,1287,1288],{"class":382}," Date",[339,1290,1291],{"class":386},"()),\n",[339,1293,1295],{"class":341,"line":1294},11,[339,1296,468],{"class":386},[325,1298,1300],{"id":1299},"available-auth-tables","Available Auth Tables",[214,1302,1303,1304,1306],{},"Reference these tables via the ",[268,1305,1064],{}," object:",[251,1308,1309,1315,1321,1327,1333],{},[254,1310,1311,1314],{},[268,1312,1313],{},"schema.user"," - User accounts",[254,1316,1317,1320],{},[268,1318,1319],{},"schema.session"," - Active sessions",[254,1322,1323,1326],{},[268,1324,1325],{},"schema.account"," - OAuth provider accounts",[254,1328,1329,1332],{},[268,1330,1331],{},"schema.verification"," - Email verification tokens",[254,1334,1335,1336,236,1339,1342],{},"Plugin tables: ",[268,1337,1338],{},"schema.passkey",[268,1340,1341],{},"schema.twoFactor",", etc. (based on enabled plugins)",[325,1344,1346],{"id":1345},"id-type-matching","ID Type Matching",[214,1348,1349],{},"Match your auth table ID types in foreign keys:",[251,1351,1352,1368],{},[254,1353,1354,1361,1362,565,1365],{},[257,1355,1356,1358,1359],{},[220,1357],{"name":282}," \u002F ",[220,1360],{"name":289},": Use ",[268,1363,1364],{},"text()",[268,1366,1367],{},"varchar()",[254,1369,1370,1361,1375,1378,1379],{},[257,1371,1372,1374],{},[220,1373],{"name":285}," with UUID",[268,1376,1377],{},"uuid()"," when ",[268,1380,1381],{},"advanced.database.generateId = 'uuid'",[888,1383,892,1385,1387],{"icon":890,"to":1384},"https:\u002F\u002Form.drizzle.team\u002Fdocs\u002Fschemas",[220,1386],{"name":924,":unlinked":895}," schemas for the full schema definition guide.",[325,1389,1391],{"id":1390},"migrations","Migrations",[214,1393,1394],{},"Generate and apply migrations after schema changes:",[330,1396,1398],{"className":332,"code":1397,"language":334,"meta":335,"style":335},"npx nuxt db generate  # Generate migrations\nnpx nuxt db migrate   # Apply (automatic in dev)\n",[268,1399,1400,1414],{"__ignoreMap":335},[339,1401,1402,1404,1406,1408,1411],{"class":341,"line":342},[339,1403,800],{"class":345},[339,1405,803],{"class":349},[339,1407,806],{"class":349},[339,1409,1410],{"class":349}," generate",[339,1412,1413],{"class":455},"  # Generate migrations\n",[339,1415,1416,1418,1420,1422,1425],{"class":341,"line":390},[339,1417,800],{"class":345},[339,1419,803],{"class":349},[339,1421,806],{"class":349},[339,1423,1424],{"class":349}," migrate",[339,1426,1427],{"class":455},"   # Apply (automatic in dev)\n",[668,1429,1430,1431,1434,1435,1437],{},"Restart dev server after adding schemas in ",[268,1432,1433],{},"server\u002Fdb\u002F"," for ",[220,1436],{"name":222}," to discover them.",[325,1439,1441],{"id":1440},"adding-columns-to-auth-tables","Adding Columns to Auth Tables",[214,1443,1444,1445,1448,1449,1451,1452,1455],{},"To add fields to existing auth tables (e.g., ",[268,1446,1447],{},"role"," on ",[268,1450,1234],{},"), use Better Auth's ",[268,1453,1454],{},"additionalFields"," instead of custom schemas.",[888,1457,892,1460,697],{"icon":1458,"to":1459},"i-lucide-plus","https:\u002F\u002Fbetter-auth.com\u002Fdocs\u002Fconcepts\u002Fdatabase#additional-fields",[1461,1462,1466,1467],"a",{"href":1463,"rel":1464},"https:\u002F\u002Fbetter-auth.com\u002Fdocs\u002Fconcepts\u002Fdatabase#extending-core-schema",[1465],"nofollow","Better Auth ",[268,1468,1454],{},[1470,1471,1472],"style",{},"html pre.shiki code .sqe1H, html code.shiki .sqe1H{--shiki-light:#A626A4;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sKg8T, html code.shiki .sKg8T{--shiki-light:#E45649;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sfT9l, html code.shiki .sfT9l{--shiki-light:#4078F2;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}html pre.shiki code .s17Py, html code.shiki .s17Py{--shiki-light:#383A42;--shiki-default:#BBBBBB;--shiki-dark:#BBBBBB}html pre.shiki code .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 .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 .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 .svFNh, html code.shiki .svFNh{--shiki-light:#383A42;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .siqUp, html code.shiki .siqUp{--shiki-light:#4078F2;--shiki-default:#FE4450;--shiki-dark:#FE4450}html pre.shiki code .sI3kV, html code.shiki .sI3kV{--shiki-light:#50A14F;--shiki-default:#BBBBBB;--shiki-dark:#BBBBBB}html pre.shiki code .stweg, html code.shiki .stweg{--shiki-light:#E45649;--shiki-default:#72F1B8;--shiki-dark:#72F1B8}html pre.shiki code .sNM9w, html code.shiki .sNM9w{--shiki-light:#383A42;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}",{"title":335,"searchDepth":390,"depth":390,"links":1474},[1475,1476,1481,1482,1485,1486,1490,1491,1492],{"id":248,"depth":390,"text":249},{"id":319,"depth":390,"text":320,"children":1477},[1478,1479,1480],{"id":327,"depth":404,"text":328},{"id":360,"depth":404,"text":361},{"id":471,"depth":404,"text":472},{"id":478,"depth":390,"text":479},{"id":541,"depth":390,"text":542,"children":1483},[1484],{"id":684,"depth":404,"text":685},{"id":730,"depth":390,"text":731},{"id":772,"depth":390,"text":773,"children":1487},[1488,1489],{"id":781,"depth":404,"text":782},{"id":832,"depth":404,"text":833},{"id":899,"depth":390,"text":900},{"id":982,"depth":390,"text":983},{"id":1057,"depth":390,"text":1058,"children":1493},[1494,1495,1496,1497],{"id":1299,"depth":404,"text":1300},{"id":1345,"depth":404,"text":1346},{"id":1390,"depth":404,"text":1391},{"id":1440,"depth":404,"text":1441},"Automatic database setup with schema generation and Drizzle ORM integration.","md",null,{},{"title":121,"description":1498},"i7OtNnGMYEBiBVL666X5aZbHPvXGL-WdwIUSOxlcuWI",[1505,1507],{"title":112,"path":113,"stem":114,"description":1506,"children":-1},"Checklist and best practices for deploying Nuxt Better Auth in production.",{"title":125,"path":126,"stem":127,"description":1508,"children":-1},"Inspect auth configuration and manage users\u002Fsessions during development.",1791214951676]