[{"data":1,"prerenderedAt":1361},["ShallowReactive",2],{"navigation_docs":3,"-integrations-nuxthub":152,"-integrations-nuxthub-surround":1356},[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":116,"body":154,"description":1350,"extension":1351,"links":1352,"meta":1353,"navigation":343,"path":117,"seo":1354,"stem":118,"__hash__":1355},"docs/4.integrations/1.nuxthub.md",{"type":155,"value":156,"toc":1327},"minimark",[157,161,173,178,231,235,390,394,401,453,457,460,539,542,565,569,575,594,612,618,627,638,650,654,657,661,664,708,712,715,765,776,780,787,812,818,850,854,857,921,925,936,1163,1167,1173,1209,1213,1216,1242,1250,1254,1257,1290,1297,1301,1315,1323],[158,159,160],"p",{},"NuxtHub provides the easiest way to add database persistence to your authentication. Enable NuxtHub and this module generates and manages your database schema.",[162,163,164,165,172],"note",{},"NuxtHub is vendor-agnostic. Deploy to Cloudflare, Vercel, or self-host. See ",[166,167,171],"a",{"href":168,"rel":169},"https://hub.nuxt.com/docs/getting-started/deploy",[170],"nofollow","NuxtHub deployment docs",".",[174,175,177],"h2",{"id":176},"features","Features",[179,180,181,189,203,209,215,221],"ul",{},[182,183,184,188],"li",{},[185,186,187],"strong",{},"Auto Schema Generation"," - Tables for users, sessions, accounts created automatically",[182,190,191,194,195,199,200],{},[185,192,193],{},"Plugin-Aware"," - Schema updates when you add plugins like ",[196,197,198],"code",{},"twoFactor",", ",[196,201,202],{},"passkey",[182,204,205,208],{},[185,206,207],{},"Multi-Dialect"," - SQLite, PostgreSQL, or MySQL",[182,210,211,214],{},[185,212,213],{},"Multi-Cloud"," - Deploy to Cloudflare, Vercel, or self-hosted infrastructure",[182,216,217,220],{},[185,218,219],{},"Secondary Storage"," - Optional KV storage for session caching",[182,222,223,226,227,230],{},[185,224,225],{},"Zero Config Migrations"," - Use ",[196,228,229],{},"npx nuxt db migrate"," for production",[174,232,234],{"id":233},"setup","Setup",[236,237,238,243,268,272,276,383,387],"steps",{},[239,240,242],"h3",{"id":241},"install-nuxthub","Install NuxtHub",[244,245,250],"pre",{"className":246,"code":247,"language":248,"meta":249,"style":249},"language-bash shiki shiki-themes one-light synthwave-84 synthwave-84","pnpm add @nuxthub/core@^0.10.5\n","bash","",[196,251,252],{"__ignoreMap":249},[253,254,257,261,265],"span",{"class":255,"line":256},"line",1,[253,258,260],{"class":259},"siqUp","pnpm",[253,262,264],{"class":263},"sI3kV"," add",[253,266,267],{"class":263}," @nuxthub/core@^0.10.5\n",[269,270,271],"important",{},"Version 0.10.5 or later is required. Earlier versions cause runtime errors in development mode.",[239,273,275],{"id":274},"configure-nuxtconfigts","Configure nuxt.config.ts",[244,277,282],{"className":278,"code":279,"filename":280,"language":281,"meta":249,"style":249},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","export default defineNuxtConfig({\n  modules: [\n    '@nuxthub/core',\n    '@onmax/nuxt-better-auth'\n  ],\n\n  hub: {\n    db: 'sqlite' // 'sqlite' | 'postgresql' | 'mysql'\n  }\n})\n","nuxt.config.ts","ts",[196,283,284,302,316,326,332,338,345,356,371,377],{"__ignoreMap":249},[253,285,286,290,294,298],{"class":255,"line":256},[253,287,289],{"class":288},"sqe1H","export",[253,291,293],{"class":292},"sKg8T"," default",[253,295,297],{"class":296},"sfT9l"," defineNuxtConfig",[253,299,301],{"class":300},"s17Py","({\n",[253,303,305,309,313],{"class":255,"line":304},2,[253,306,308],{"class":307},"sYvLG","  modules",[253,310,312],{"class":311},"sVnqq",":",[253,314,315],{"class":300}," [\n",[253,317,319,323],{"class":255,"line":318},3,[253,320,322],{"class":321},"sPAZv","    '@nuxthub/core'",[253,324,325],{"class":300},",\n",[253,327,329],{"class":255,"line":328},4,[253,330,331],{"class":321},"    '@onmax/nuxt-better-auth'\n",[253,333,335],{"class":255,"line":334},5,[253,336,337],{"class":300},"  ],\n",[253,339,341],{"class":255,"line":340},6,[253,342,344],{"emptyLinePlaceholder":343},true,"\n",[253,346,348,351,353],{"class":255,"line":347},7,[253,349,350],{"class":307},"  hub",[253,352,312],{"class":311},[253,354,355],{"class":300}," {\n",[253,357,359,362,364,367],{"class":255,"line":358},8,[253,360,361],{"class":307},"    db",[253,363,312],{"class":311},[253,365,366],{"class":321}," 'sqlite'",[253,368,370],{"class":369},"st7cf"," // 'sqlite' | 'postgresql' | 'mysql'\n",[253,372,374],{"class":255,"line":373},9,[253,375,376],{"class":300},"  }\n",[253,378,380],{"class":255,"line":379},10,[253,381,382],{"class":300},"})\n",[239,384,386],{"id":385},"restart-dev-server","Restart Dev Server",[158,388,389],{},"The schema is generated at build time. Restart after configuration changes.",[174,391,393],{"id":392},"configuration-options","Configuration Options",[158,395,396,397,400],{},"The ",[196,398,399],{},"hub.db"," option accepts a string shorthand or full object:",[244,402,404],{"className":278,"code":403,"filename":280,"language":281,"meta":249,"style":249},"export default defineNuxtConfig({\n  hub: {\n    db: 'sqlite' // shorthand: 'sqlite' | 'postgresql' | 'mysql'\n    // or full object:\n    // db: { dialect: 'postgresql', /* additional options */ }\n  }\n})\n",[196,405,406,416,424,435,440,445,449],{"__ignoreMap":249},[253,407,408,410,412,414],{"class":255,"line":256},[253,409,289],{"class":288},[253,411,293],{"class":292},[253,413,297],{"class":296},[253,415,301],{"class":300},[253,417,418,420,422],{"class":255,"line":304},[253,419,350],{"class":307},[253,421,312],{"class":311},[253,423,355],{"class":300},[253,425,426,428,430,432],{"class":255,"line":318},[253,427,361],{"class":307},[253,429,312],{"class":311},[253,431,366],{"class":321},[253,433,434],{"class":369}," // shorthand: 'sqlite' | 'postgresql' | 'mysql'\n",[253,436,437],{"class":255,"line":328},[253,438,439],{"class":369},"    // or full object:\n",[253,441,442],{"class":255,"line":334},[253,443,444],{"class":369},"    // db: { dialect: 'postgresql', /* additional options */ }\n",[253,446,447],{"class":255,"line":340},[253,448,376],{"class":300},[253,450,451],{"class":255,"line":347},[253,452,382],{"class":300},[174,454,456],{"id":455},"secondary-storage-kv","Secondary Storage (KV)",[158,458,459],{},"Enable KV storage for faster session lookups:",[244,461,463],{"className":278,"code":462,"filename":280,"language":281,"meta":249,"style":249},"export default defineNuxtConfig({\n  hub: {\n    db: 'sqlite',\n    kv: true\n  },\n\n  auth: {\n    hubSecondaryStorage: true\n  }\n})\n",[196,464,465,475,483,493,504,509,513,522,531,535],{"__ignoreMap":249},[253,466,467,469,471,473],{"class":255,"line":256},[253,468,289],{"class":288},[253,470,293],{"class":292},[253,472,297],{"class":296},[253,474,301],{"class":300},[253,476,477,479,481],{"class":255,"line":304},[253,478,350],{"class":307},[253,480,312],{"class":311},[253,482,355],{"class":300},[253,484,485,487,489,491],{"class":255,"line":318},[253,486,361],{"class":307},[253,488,312],{"class":311},[253,490,366],{"class":321},[253,492,325],{"class":300},[253,494,495,498,500],{"class":255,"line":328},[253,496,497],{"class":307},"    kv",[253,499,312],{"class":311},[253,501,503],{"class":502},"s3ZNE"," true\n",[253,505,506],{"class":255,"line":334},[253,507,508],{"class":300},"  },\n",[253,510,511],{"class":255,"line":340},[253,512,344],{"emptyLinePlaceholder":343},[253,514,515,518,520],{"class":255,"line":347},[253,516,517],{"class":307},"  auth",[253,519,312],{"class":311},[253,521,355],{"class":300},[253,523,524,527,529],{"class":255,"line":358},[253,525,526],{"class":307},"    hubSecondaryStorage",[253,528,312],{"class":311},[253,530,503],{"class":502},[253,532,533],{"class":255,"line":373},[253,534,376],{"class":300},[253,536,537],{"class":255,"line":379},[253,538,382],{"class":300},[158,540,541],{},"Sessions are cached in NuxtHub KV, reducing database queries.",[543,544,545,546,549,550,553,554,557,558,561,562,172],"warning",{},"Both ",[196,547,548],{},"hub.kv: true"," and ",[196,551,552],{},"auth.hubSecondaryStorage: true"," must be set together. The build will fail with a clear error if ",[196,555,556],{},"hubSecondaryStorage"," is ",[196,559,560],{},"true"," without ",[196,563,564],{},"hub.kv",[174,566,568],{"id":567},"choosing-secondary-storage","Choosing Secondary Storage",[158,570,571,574],{},[196,572,573],{},"hubSecondaryStorage: true"," stores session lookups in NuxtHub KV and can reduce repeated database reads on session validation. SSR requests still resolve session state per request, but lookups can hit KV instead of the database.",[158,576,577,578,580,581,199,584,199,587,590,591,172],{},"With ",[196,579,573],{},", generated auth schema remains stable and still includes core tables: ",[196,582,583],{},"user",[196,585,586],{},"account",[196,588,589],{},"session",", and ",[196,592,593],{},"verification",[158,595,596,597,600,601,604,605,608,609,611],{},"If you want to use a different KV backend (Redis, Upstash, etc.), set ",[196,598,599],{},"hubSecondaryStorage: 'custom'"," and provide your own ",[196,602,603],{},"secondaryStorage"," in ",[196,606,607],{},"defineServerAuth()"," (required; the build fails in production if missing). This is the mode where the module can omit the ",[196,610,589],{}," table from generated schema and it will not inject NuxtHub KV code.",[158,613,614,615,172],{},"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 ",[196,616,617],{},"requireUserSession",[158,619,620,621,623,624,626],{},"Enable ",[196,622,556],{}," when ",[196,625,564],{}," is enabled and session-read traffic is a measurable bottleneck. Keep DB-only sessions when your traffic is moderate or when you prioritize stricter read-after-write consistency.",[158,628,629,630,633,634,637],{},"To return to DB-only session reads, set ",[196,631,632],{},"auth.hubSecondaryStorage"," to ",[196,635,636],{},"false"," and deploy.",[162,639,640,641,643,644,646,647,649],{},"If you previously generated migrations while ",[196,642,573],{}," omitted ",[196,645,589],{},", upgrading may produce a one-time migration that reintroduces ",[196,648,589],{}," to match stable schema output.",[174,651,653],{"id":652},"production-migrations","Production Migrations",[158,655,656],{},"NuxtHub handles migrations automatically in most deployments. For manual control:",[239,658,660],{"id":659},"manual-migration","Manual Migration",[158,662,663],{},"If you need to run migrations manually:",[244,665,667],{"className":246,"code":666,"language":248,"meta":249,"style":249},"# Generate migrations from schema changes\nnpx nuxt db generate\n\n# Apply pending migrations\nnpx nuxt db migrate\n",[196,668,669,674,688,692,697],{"__ignoreMap":249},[253,670,671],{"class":255,"line":256},[253,672,673],{"class":369},"# Generate migrations from schema changes\n",[253,675,676,679,682,685],{"class":255,"line":304},[253,677,678],{"class":259},"npx",[253,680,681],{"class":263}," nuxt",[253,683,684],{"class":263}," db",[253,686,687],{"class":263}," generate\n",[253,689,690],{"class":255,"line":318},[253,691,344],{"emptyLinePlaceholder":343},[253,693,694],{"class":255,"line":328},[253,695,696],{"class":369},"# Apply pending migrations\n",[253,698,699,701,703,705],{"class":255,"line":334},[253,700,678],{"class":259},[253,702,681],{"class":263},[253,704,684],{"class":263},[253,706,707],{"class":263}," migrate\n",[239,709,711],{"id":710},"cicd-integration","CI/CD Integration",[158,713,714],{},"Add to your GitHub Actions workflow:",[244,716,720],{"className":717,"code":718,"language":719,"meta":249,"style":249},"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",[196,721,722,737,747,755],{"__ignoreMap":249},[253,723,724,727,731,734],{"class":255,"line":256},[253,725,726],{"class":300},"- ",[253,728,730],{"class":729},"stweg","name",[253,732,312],{"class":733},"sNM9w",[253,735,736],{"class":263}," Run migrations\n",[253,738,739,742,744],{"class":255,"line":304},[253,740,741],{"class":729},"  run",[253,743,312],{"class":733},[253,745,746],{"class":263}," npx nuxt db migrate\n",[253,748,749,752],{"class":255,"line":318},[253,750,751],{"class":729},"  env",[253,753,754],{"class":733},":\n",[253,756,757,760,762],{"class":255,"line":328},[253,758,759],{"class":729},"    NUXT_HUB_PROJECT_KEY",[253,761,312],{"class":733},[253,763,764],{"class":263}," ${{ secrets.NUXTHUB_PROJECT_KEY }}\n",[766,767,770,771,775],"callout",{"icon":768,"to":769},"i-lucide-book","https://hub.nuxt.com/docs/features/database","See ",[166,772,774],{"href":769,"rel":773},[170],"NuxtHub Database docs"," for more details.",[174,777,779],{"id":778},"schema-generation-details","Schema Generation Details",[158,781,782,783,786],{},"The module analyzes your ",[196,784,785],{},"server/auth.config.ts"," at build time:",[788,789,790,796,802],"ol",{},[182,791,792,795],{},[185,793,794],{},"Reads plugins"," from your config",[182,797,798,801],{},[185,799,800],{},"Generates Drizzle schema"," matching your dialect",[182,803,804,807,808,811],{},[185,805,806],{},"Injects into NuxtHub"," via ",[196,809,810],{},"hub:db:schema:extend"," hook",[543,813,814,817],{},[185,815,816],{},"Restart Required",": After adding/removing plugins that affect database structure, restart the dev server to regenerate the schema.",[162,819,820,821,633,824,827,828,831,832,835,836,839,840,843,844,846,847,172],{},"When Nuxt resolves ",[196,822,823],{},"buildDir",[196,825,826],{},"node_modules/.cache/nuxt/.nuxt",", the module mirrors ",[196,829,830],{},"schema.\u003Cdialect>.ts"," to root ",[196,833,834],{},".nuxt/better-auth/"," and uses that mirrored path for NuxtHub schema extension. This avoids Node type-stripping failures for ",[196,837,838],{},".ts"," files under ",[196,841,842],{},"node_modules",". In normal buildDir layouts, the hook prefers ",[196,845,830],{}," and falls back to ",[196,848,849],{},"schema.\u003Cdialect>.mjs",[174,851,853],{"id":852},"accessing-the-database","Accessing the Database",[158,855,856],{},"With NuxtHub, you get access to the Drizzle database instance in your server config:",[244,858,860],{"className":278,"code":859,"filename":785,"language":281,"meta":249,"style":249},"import { defineServerAuth } from '@onmax/nuxt-better-auth/config'\n\nexport default defineServerAuth(({ db }) => ({\n  // db is the Drizzle instance from NuxtHub\n}))\n",[196,861,862,882,886,911,916],{"__ignoreMap":249},[253,863,864,867,870,873,876,879],{"class":255,"line":256},[253,865,866],{"class":288},"import",[253,868,869],{"class":300}," { ",[253,871,872],{"class":307},"defineServerAuth",[253,874,875],{"class":300}," } ",[253,877,878],{"class":288},"from",[253,880,881],{"class":321}," '@onmax/nuxt-better-auth/config'\n",[253,883,884],{"class":255,"line":304},[253,885,344],{"emptyLinePlaceholder":343},[253,887,888,890,892,895,898,902,905,908],{"class":255,"line":318},[253,889,289],{"class":288},[253,891,293],{"class":292},[253,893,894],{"class":296}," defineServerAuth",[253,896,897],{"class":300},"(({ ",[253,899,901],{"class":900},"sgisi","db",[253,903,904],{"class":300}," }) ",[253,906,907],{"class":288},"=>",[253,909,910],{"class":300}," ({\n",[253,912,913],{"class":255,"line":328},[253,914,915],{"class":369},"  // db is the Drizzle instance from NuxtHub\n",[253,917,918],{"class":255,"line":334},[253,919,920],{"class":300},"}))\n",[174,922,924],{"id":923},"creating-custom-tables-with-foreign-keys","Creating Custom Tables with Foreign Keys",[158,926,927,928,931,932,935],{},"Create application tables that reference auth tables by importing ",[196,929,930],{},"schema"," from ",[196,933,934],{},"#auth/schema",". This is the stable Better Auth schema export for app queries.",[244,937,940],{"className":278,"code":938,"filename":939,"language":281,"meta":249,"style":249},"import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'\nimport { schema } from '#auth/schema'\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/db/schema.ts",[196,941,942,968,983,987,1014,1038,1059,1080,1109,1138,1158],{"__ignoreMap":249},[253,943,944,946,948,951,953,956,958,961,963,965],{"class":255,"line":256},[253,945,866],{"class":288},[253,947,869],{"class":300},[253,949,950],{"class":307},"sqliteTable",[253,952,199],{"class":300},[253,954,955],{"class":307},"text",[253,957,199],{"class":300},[253,959,960],{"class":307},"integer",[253,962,875],{"class":300},[253,964,878],{"class":288},[253,966,967],{"class":321}," 'drizzle-orm/sqlite-core'\n",[253,969,970,972,974,976,978,980],{"class":255,"line":304},[253,971,866],{"class":288},[253,973,869],{"class":300},[253,975,930],{"class":307},[253,977,875],{"class":300},[253,979,878],{"class":288},[253,981,982],{"class":321}," '#auth/schema'\n",[253,984,985],{"class":255,"line":318},[253,986,344],{"emptyLinePlaceholder":343},[253,988,989,991,994,998,1002,1005,1008,1011],{"class":255,"line":328},[253,990,289],{"class":288},[253,992,993],{"class":288}," const",[253,995,997],{"class":996},"s6Rhl"," posts",[253,999,1001],{"class":1000},"sQBpM"," =",[253,1003,1004],{"class":296}," sqliteTable",[253,1006,1007],{"class":300},"(",[253,1009,1010],{"class":321},"'posts'",[253,1012,1013],{"class":300},", {\n",[253,1015,1016,1019,1021,1024,1026,1029,1032,1035],{"class":255,"line":334},[253,1017,1018],{"class":307},"  id",[253,1020,312],{"class":311},[253,1022,1023],{"class":296}," text",[253,1025,1007],{"class":300},[253,1027,1028],{"class":321},"'id'",[253,1030,1031],{"class":300},").",[253,1033,1034],{"class":296},"primaryKey",[253,1036,1037],{"class":300},"(),\n",[253,1039,1040,1043,1045,1047,1049,1052,1054,1057],{"class":255,"line":340},[253,1041,1042],{"class":307},"  title",[253,1044,312],{"class":311},[253,1046,1023],{"class":296},[253,1048,1007],{"class":300},[253,1050,1051],{"class":321},"'title'",[253,1053,1031],{"class":300},[253,1055,1056],{"class":296},"notNull",[253,1058,1037],{"class":300},[253,1060,1061,1064,1066,1068,1070,1073,1075,1077],{"class":255,"line":347},[253,1062,1063],{"class":307},"  authorId",[253,1065,312],{"class":311},[253,1067,1023],{"class":296},[253,1069,1007],{"class":300},[253,1071,1072],{"class":321},"'author_id'",[253,1074,1031],{"class":300},[253,1076,1056],{"class":296},[253,1078,1079],{"class":300},"()\n",[253,1081,1082,1085,1088,1091,1093,1097,1099,1101,1103,1106],{"class":255,"line":358},[253,1083,1084],{"class":300},"    .",[253,1086,1087],{"class":296},"references",[253,1089,1090],{"class":300},"(() ",[253,1092,907],{"class":288},[253,1094,1096],{"class":1095},"svFNh"," schema",[253,1098,172],{"class":300},[253,1100,583],{"class":307},[253,1102,172],{"class":300},[253,1104,1105],{"class":307},"id",[253,1107,1108],{"class":300},"),\n",[253,1110,1111,1114,1116,1119,1121,1124,1127,1130,1132,1135],{"class":255,"line":373},[253,1112,1113],{"class":307},"  createdAt",[253,1115,312],{"class":311},[253,1117,1118],{"class":296}," integer",[253,1120,1007],{"class":300},[253,1122,1123],{"class":321},"'created_at'",[253,1125,1126],{"class":300},", { ",[253,1128,1129],{"class":307},"mode",[253,1131,312],{"class":311},[253,1133,1134],{"class":321}," 'timestamp'",[253,1136,1137],{"class":300}," })\n",[253,1139,1140,1142,1145,1147,1149,1152,1155],{"class":255,"line":379},[253,1141,1084],{"class":300},[253,1143,1144],{"class":296},"$defaultFn",[253,1146,1090],{"class":300},[253,1148,907],{"class":288},[253,1150,1151],{"class":288}," new",[253,1153,1154],{"class":296}," Date",[253,1156,1157],{"class":300},"()),\n",[253,1159,1161],{"class":255,"line":1160},11,[253,1162,382],{"class":300},[239,1164,1166],{"id":1165},"available-auth-tables","Available Auth Tables",[158,1168,1169,1170,1172],{},"Reference these tables via the ",[196,1171,930],{}," object:",[179,1174,1175,1181,1187,1193,1199],{},[182,1176,1177,1180],{},[196,1178,1179],{},"schema.user"," - User accounts",[182,1182,1183,1186],{},[196,1184,1185],{},"schema.session"," - Active sessions",[182,1188,1189,1192],{},[196,1190,1191],{},"schema.account"," - OAuth provider accounts",[182,1194,1195,1198],{},[196,1196,1197],{},"schema.verification"," - Email verification tokens",[182,1200,1201,1202,199,1205,1208],{},"Plugin tables: ",[196,1203,1204],{},"schema.passkey",[196,1206,1207],{},"schema.twoFactor",", etc. (based on enabled plugins)",[239,1210,1212],{"id":1211},"id-type-matching","ID Type Matching",[158,1214,1215],{},"Match your auth table ID types in foreign keys:",[179,1217,1218,1231],{},[182,1219,1220,1223,1224,1227,1228],{},[185,1221,1222],{},"SQLite/MySQL",": Use ",[196,1225,1226],{},"text()"," or ",[196,1229,1230],{},"varchar()",[182,1232,1233,1223,1236,623,1239],{},[185,1234,1235],{},"PostgreSQL with UUID",[196,1237,1238],{},"uuid()",[196,1240,1241],{},"advanced.database.generateId = 'uuid'",[766,1243,770,1245,1249],{"icon":768,"to":1244},"https://orm.drizzle.team/docs/schemas",[166,1246,1248],{"href":1244,"rel":1247},[170],"Drizzle schemas"," for full schema definition guide.",[239,1251,1253],{"id":1252},"migrations","Migrations",[158,1255,1256],{},"Generate and apply migrations after schema changes:",[244,1258,1260],{"className":246,"code":1259,"language":248,"meta":249,"style":249},"npx nuxt db generate  # Generate migrations\nnpx nuxt db migrate   # Apply (automatic in dev)\n",[196,1261,1262,1276],{"__ignoreMap":249},[253,1263,1264,1266,1268,1270,1273],{"class":255,"line":256},[253,1265,678],{"class":259},[253,1267,681],{"class":263},[253,1269,684],{"class":263},[253,1271,1272],{"class":263}," generate",[253,1274,1275],{"class":369},"  # Generate migrations\n",[253,1277,1278,1280,1282,1284,1287],{"class":255,"line":304},[253,1279,678],{"class":259},[253,1281,681],{"class":263},[253,1283,684],{"class":263},[253,1285,1286],{"class":263}," migrate",[253,1288,1289],{"class":369},"   # Apply (automatic in dev)\n",[543,1291,1292,1293,1296],{},"Restart dev server after adding schemas in ",[196,1294,1295],{},"server/db/"," for NuxtHub to discover them.",[239,1298,1300],{"id":1299},"adding-columns-to-auth-tables","Adding Columns to Auth Tables",[158,1302,1303,1304,1307,1308,1310,1311,1314],{},"To add fields to existing auth tables (e.g., ",[196,1305,1306],{},"role"," on ",[196,1309,583],{},"), use Better Auth's ",[196,1312,1313],{},"additionalFields"," instead of custom schemas.",[766,1316,770,1319,172],{"icon":1317,"to":1318},"i-lucide-plus","https://better-auth.com/docs/concepts/database#additional-fields",[166,1320,1322],{"href":1318,"rel":1321},[170],"Better Auth Additional Fields",[1324,1325,1326],"style",{},"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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sqe1H, html code.shiki .sqe1H{--shiki-light:#A626A4;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sKg8T, html code.shiki .sKg8T{--shiki-light:#E45649;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sfT9l, html code.shiki .sfT9l{--shiki-light:#4078F2;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}html pre.shiki code .s17Py, html code.shiki .s17Py{--shiki-light:#383A42;--shiki-default:#BBBBBB;--shiki-dark:#BBBBBB}html pre.shiki code .sYvLG, html code.shiki .sYvLG{--shiki-light:#E45649;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sVnqq, html code.shiki .sVnqq{--shiki-light:#0184BC;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}html pre.shiki code .sPAZv, html code.shiki .sPAZv{--shiki-light:#50A14F;--shiki-default:#FF8B39;--shiki-dark:#FF8B39}html pre.shiki code .st7cf, html code.shiki .st7cf{--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-default:#848BBD;--shiki-default-font-style:italic;--shiki-dark:#848BBD;--shiki-dark-font-style:italic}html pre.shiki code .s3ZNE, html code.shiki .s3ZNE{--shiki-light:#986801;--shiki-default:#F97E72;--shiki-dark:#F97E72}html pre.shiki code .sgisi, html code.shiki .sgisi{--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-default:#FF7EDB;--shiki-default-font-style:italic;--shiki-dark:#FF7EDB;--shiki-dark-font-style:italic}html pre.shiki code .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 .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":249,"searchDepth":304,"depth":304,"links":1328},[1329,1330,1335,1336,1337,1338,1342,1343,1344],{"id":176,"depth":304,"text":177},{"id":233,"depth":304,"text":234,"children":1331},[1332,1333,1334],{"id":241,"depth":318,"text":242},{"id":274,"depth":318,"text":275},{"id":385,"depth":318,"text":386},{"id":392,"depth":304,"text":393},{"id":455,"depth":304,"text":456},{"id":567,"depth":304,"text":568},{"id":652,"depth":304,"text":653,"children":1339},[1340,1341],{"id":659,"depth":318,"text":660},{"id":710,"depth":318,"text":711},{"id":778,"depth":304,"text":779},{"id":852,"depth":304,"text":853},{"id":923,"depth":304,"text":924,"children":1345},[1346,1347,1348,1349],{"id":1165,"depth":318,"text":1166},{"id":1211,"depth":318,"text":1212},{"id":1252,"depth":318,"text":1253},{"id":1299,"depth":318,"text":1300},"Automatic database setup with schema generation and Drizzle ORM integration.","md",null,{},{"title":116,"description":1350},"_A_MZXGRNPIypgeDOg51GANs3QW1Cth5LWvqeEufw3U",[1357,1359],{"title":107,"path":108,"stem":109,"description":1358,"children":-1},"Checklist and best practices for deploying Nuxt Better Auth in production.",{"title":120,"path":121,"stem":122,"description":1360,"children":-1},"Inspect auth configuration and manage users/sessions during development.",1774627854052]