[{"data":1,"prerenderedAt":735},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-schema-generation":208,"-getting-started-schema-generation-surround":730},[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":210,"body":211,"description":723,"extension":724,"links":725,"meta":726,"navigation":727,"path":34,"seo":728,"stem":35,"__hash__":729},"docs\u002F1.getting-started\u002F5.schema-generation.md","Schema Generation",{"type":212,"value":213,"toc":716},"minimark",[214,279,288,298,308,313,328,370,377,381,388,450,496,500,506,522,528,598,602,608,665,669,672,689,696,705,712],[215,216,217],"code-collapse",{},[218,219,225],"pre",{"className":220,"code":221,"filename":222,"language":223,"meta":224,"style":224},"language-txt shiki shiki-themes one-light synthwave-84 synthwave-84","Set up auto schema generation for @nuxtjs\u002Fbetter-auth with NuxtHub.\n\n- Requires NuxtHub integration — the module generates Drizzle ORM schemas at build time\n- Supports sqlite (default), postgresql, and mysql dialects via `hub.db.dialect` in `nuxt.config.ts`\n- The module reads `server\u002Fauth.config.ts` plugins to determine required tables (user, session, account, verification + plugin tables)\n- After adding\u002Fremoving plugins: restart the dev server to regenerate schemas\n- For production (Cloudflare D1): run `npx nuxt db migrate`\n- No manual Drizzle schema writing needed for auth tables\n","Prompt","txt","",[226,227,228,236,243,249,255,261,267,273],"code",{"__ignoreMap":224},[229,230,233],"span",{"class":231,"line":232},"line",1,[229,234,235],{},"Set up auto schema generation for @nuxtjs\u002Fbetter-auth with NuxtHub.\n",[229,237,239],{"class":231,"line":238},2,[229,240,242],{"emptyLinePlaceholder":241},true,"\n",[229,244,246],{"class":231,"line":245},3,[229,247,248],{},"- Requires NuxtHub integration — the module generates Drizzle ORM schemas at build time\n",[229,250,252],{"class":231,"line":251},4,[229,253,254],{},"- Supports sqlite (default), postgresql, and mysql dialects via `hub.db.dialect` in `nuxt.config.ts`\n",[229,256,258],{"class":231,"line":257},5,[229,259,260],{},"- The module reads `server\u002Fauth.config.ts` plugins to determine required tables (user, session, account, verification + plugin tables)\n",[229,262,264],{"class":231,"line":263},6,[229,265,266],{},"- After adding\u002Fremoving plugins: restart the dev server to regenerate schemas\n",[229,268,270],{"class":231,"line":269},7,[229,271,272],{},"- For production (Cloudflare D1): run `npx nuxt db migrate`\n",[229,274,276],{"class":231,"line":275},8,[229,277,278],{},"- No manual Drizzle schema writing needed for auth tables\n",[280,281,282,283,287],"p",{},"Use this page when you are using ",[284,285],"brand-badge",{"name":286},"nuxthub"," and want the module to generate auth tables from your Better Auth configuration.",[289,290,291,292,294,295,297],"note",{},"This feature requires ",[284,293],{"name":286},". See ",[284,296],{"name":286,"to":122}," for setup.",[280,299,300,301,303,304,307],{},"Better Auth requires tables for users, sessions, accounts. This module creates them automatically with ",[284,302],{"name":286}," and ",[284,305],{"name":306},"drizzle"," ORM.",[309,310,312],"h2",{"id":311},"how-it-works","How it works",[280,314,315,316,319,320,323,324,327],{},"The module analyzes your ",[226,317,318],{},"server\u002Fauth.config.ts"," at build time to determine which tables are required by your core configuration and enabled plugins (e.g., ",[226,321,322],{},"twoFactor",", ",[226,325,326],{},"passkey",").",[329,330,331,343,361],"ol",{},[332,333,334,338,339,342],"li",{},[335,336,337],"strong",{},"Analysis",": Reads ",[226,340,341],{},"plugins"," from your config.",[332,344,345,348,349,351,352,323,355,323,358,327],{},[335,346,347],{},"Generation",": Generates a ",[284,350],{"name":306}," schema file corresponding to your database dialect (",[284,353],{"name":354},"sqlite",[284,356],{"name":357},"postgresql",[284,359],{"name":360},"mysql",[332,362,363,366,367,369],{},[335,364,365],{},"Integration",": Automatically injects this schema into ",[284,368],{"name":286},"'s database configuration.",[371,372,373,374,376],"tip",{},"You do not need to manually write ",[284,375],{"name":306}," schemas for authentication tables.",[309,378,380],{"id":379},"importing-generated-tables","Importing generated tables",[280,382,383,384,387],{},"Import generated tables through ",[226,385,386],{},"#auth\u002Fschema"," in server code. The exports retain their Drizzle types, including configured additional fields and plugin tables.",[218,389,393],{"className":390,"code":391,"language":392,"meta":224,"style":224},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","import { user } from '#auth\u002Fschema'\n\ntype User = typeof user.$inferSelect\n","ts",[226,394,395,419,423],{"__ignoreMap":224},[229,396,397,401,405,409,412,415],{"class":231,"line":232},[229,398,400],{"class":399},"sqe1H","import",[229,402,404],{"class":403},"s17Py"," { ",[229,406,408],{"class":407},"sYvLG","user",[229,410,411],{"class":403}," } ",[229,413,414],{"class":399},"from",[229,416,418],{"class":417},"sPAZv"," '#auth\u002Fschema'\n",[229,420,421],{"class":231,"line":238},[229,422,242],{"emptyLinePlaceholder":241},[229,424,425,428,432,436,440,444,447],{"class":231,"line":245},[229,426,427],{"class":399},"type",[229,429,431],{"class":430},"s8RlJ"," User",[229,433,435],{"class":434},"sQBpM"," =",[229,437,439],{"class":438},"sn-Jc"," typeof",[229,441,443],{"class":442},"svFNh"," user",[229,445,446],{"class":403},".",[229,448,449],{"class":407},"$inferSelect\n",[280,451,452,453,323,455,323,458,461,462,465,466,469,470,473,474,477,478,481,482,485,486,488,489,492,493,446],{},"The stable ",[226,454,408],{},[226,456,457],{},"session",[226,459,460],{},"account",", and ",[226,463,464],{},"verification"," exports also work with ",[226,467,468],{},"auth.schema.usePlural"," and custom Better Auth ",[226,471,472],{},"modelName"," values. For example, ",[226,475,476],{},"user: { modelName: 'person' }"," generates ",[226,479,480],{},"person",", or ",[226,483,484],{},"persons"," with plural names, while ",[226,487,408],{}," still refers to that table. The ",[226,490,491],{},"schema"," export contains both the generated names and these stable aliases. Tables omitted by your auth configuration are ",[226,494,495],{},"undefined",[309,497,499],{"id":498},"supported-dialects","Supported Dialects",[280,501,502,503,505],{},"The module supports all dialects compatible with ",[284,504],{"name":286},":",[507,508,509,514,518],"ul",{},[332,510,511,513],{},[226,512,354],{}," (Default)",[332,515,516],{},[226,517,357],{},[332,519,520],{},[226,521,360],{},[280,523,524,525,505],{},"Ensure you have configured the dialect in ",[226,526,527],{},"nuxt.config.ts",[218,529,531],{"className":390,"code":530,"filename":527,"language":392,"meta":224,"style":224},"export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'postgresql' \u002F\u002F or 'sqlite', 'mysql'\n    }\n  }\n})\n",[226,532,533,549,560,569,583,588,593],{"__ignoreMap":224},[229,534,535,538,542,546],{"class":231,"line":232},[229,536,537],{"class":399},"export",[229,539,541],{"class":540},"sKg8T"," default",[229,543,545],{"class":544},"sfT9l"," defineNuxtConfig",[229,547,548],{"class":403},"({\n",[229,550,551,554,557],{"class":231,"line":238},[229,552,553],{"class":407},"  hub",[229,555,505],{"class":556},"sVnqq",[229,558,559],{"class":403}," {\n",[229,561,562,565,567],{"class":231,"line":245},[229,563,564],{"class":407},"    db",[229,566,505],{"class":556},[229,568,559],{"class":403},[229,570,571,574,576,579],{"class":231,"line":251},[229,572,573],{"class":407},"      dialect",[229,575,505],{"class":556},[229,577,578],{"class":417}," 'postgresql'",[229,580,582],{"class":581},"st7cf"," \u002F\u002F or 'sqlite', 'mysql'\n",[229,584,585],{"class":231,"line":257},[229,586,587],{"class":403},"    }\n",[229,589,590],{"class":231,"line":263},[229,591,592],{"class":403},"  }\n",[229,594,595],{"class":231,"line":269},[229,596,597],{"class":403},"})\n",[309,599,601],{"id":600},"workflow","Workflow",[280,603,604,605,607],{},"When you add a new plugin that requires database tables (e.g., adding ",[226,606,322],{},"):",[329,609,610,615,618,621,627],{},[332,611,612,613,446],{},"Update ",[226,614,318],{},[332,616,617],{},"Restart your development server.",[332,619,620],{},"The module regenerates the schema.",[332,622,623,624,626],{},"If using ",[284,625],{"name":286}," local development, the tables are ready.",[332,628,629,632,635,636,638,639,607,642],{},[335,630,631],{},"Deploy with migrations:",[633,634],"br",{},"For local development, migrations run automatically when you start the dev server.",[633,637],{},"For production (",[284,640],{"name":641},"cloudflare-d1",[218,643,647],{"className":644,"code":645,"language":646,"meta":224,"style":224},"language-bash shiki shiki-themes one-light synthwave-84 synthwave-84","npx nuxt db migrate\n","bash",[226,648,649],{"__ignoreMap":224},[229,650,651,655,659,662],{"class":231,"line":232},[229,652,654],{"class":653},"siqUp","npx",[229,656,658],{"class":657},"sI3kV"," nuxt",[229,660,661],{"class":657}," db",[229,663,664],{"class":657}," migrate\n",[309,666,668],{"id":667},"when-not-to-use-this","When not to use this",[280,670,671],{},"Do not rely on this flow if:",[507,673,674,679,686],{},[332,675,676,677],{},"you are not using ",[284,678],{"name":286},[332,680,681,682,685],{},"you are in ",[226,683,684],{},"clientOnly"," mode",[332,687,688],{},"you manage Better Auth tables with a separate adapter and migration pipeline",[280,690,691,692,446],{},"In those cases, use ",[693,694,695],"a",{"href":88},"custom database setup",[697,698,701,702,704],"callout",{":external":699,"to":700},"true","https:\u002F\u002Fhub.nuxt.com\u002Fdocs\u002Fgetting-started\u002Fdeploy","See ",[284,703],{"name":286,":unlinked":699}," deployment documentation.",[706,707,708,711],"warning",{},[335,709,710],{},"Restart Required",": Because schema generation happens at build\u002Fmodule-setup time, you must restart the dev server after adding or removing plugins that affect the database structure.",[713,714,715],"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 .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 .sPAZv, html code.shiki .sPAZv{--shiki-light:#50A14F;--shiki-default:#FF8B39;--shiki-dark:#FF8B39}html pre.shiki code .s8RlJ, html code.shiki .s8RlJ{--shiki-light:#C18401;--shiki-default:#FE4450;--shiki-dark:#FE4450}html pre.shiki code .sQBpM, html code.shiki .sQBpM{--shiki-light:#0184BC;--shiki-default:#FFFFFFEE;--shiki-dark:#FFFFFFEE}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}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 .sVnqq, html code.shiki .sVnqq{--shiki-light:#0184BC;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}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 .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}",{"title":224,"searchDepth":238,"depth":238,"links":717},[718,719,720,721,722],{"id":311,"depth":238,"text":312},{"id":379,"depth":238,"text":380},{"id":498,"depth":238,"text":499},{"id":600,"depth":238,"text":601},{"id":667,"depth":238,"text":668},"Auto-generate Drizzle ORM schemas for Better Auth tables when using NuxtHub.","md",null,{},{"title":33,"icon":36},{"title":210,"description":723},"b0Ls-ESGJkfn5rIznVdWWIPHkhtXhIC2Vy-0w3OE3PU",[731,733],{"title":28,"path":29,"stem":30,"description":732,"icon":31,"children":-1},"Learn how the module automatically infers types from your configuration.",{"title":38,"path":39,"stem":40,"description":734,"icon":41,"children":-1},"Understand the architecture after completing setup.",1791215140291]