[{"data":1,"prerenderedAt":1770},["ShallowReactive",2],{"navigation_docs":3,"-guides-testing":208,"-guides-testing-surround":1765},[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":108,"body":210,"description":1759,"extension":1760,"links":1761,"meta":1762,"navigation":383,"path":109,"seo":1763,"stem":110,"__hash__":1764},"docs\u002F3.guides\u002F8.testing.md",{"type":211,"value":212,"toc":1755},"minimark",[213,230,235,265,274,930,945,975,979,1021,1024,1109,1112,1677,1691,1701,1736,1747,1751],[214,215,216,217,224,225,229],"p",{},"The module provides separate helpers for Nuxt's runtime and end-to-end test environments. Follow ",[218,219,223],"a",{"href":220,"rel":221},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002Fgetting-started\u002Ftesting",[222],"nofollow","Nuxt's testing setup"," to configure Vitest and install ",[226,227,228],"code",{},"@nuxt\u002Ftest-utils",".",[231,232,234],"h2",{"id":233},"mocking-useusersession","Mocking useUserSession",[214,236,237,238,241,242,245,246,249,250,253,254,253,257,260,261,264],{},"Use ",[226,239,240],{},"createUserSessionMock"," with ",[226,243,244],{},"mockNuxtImport"," to replace ",[226,247,248],{},"useUserSession",". It provides reactive ",[226,251,252],{},"user",", ",[226,255,256],{},"session",[226,258,259],{},"loggedIn",", and ",[226,262,263],{},"ready"," refs, plus the composable's session methods.",[214,266,267,269,270,273],{},[226,268,244],{}," is hoisted, so create the mock inside ",[226,271,272],{},"vi.hoisted",":",[275,276,282],"pre",{"className":277,"code":278,"filename":279,"language":280,"meta":281,"style":281},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","import { mockNuxtImport, mountSuspended } from '@nuxt\u002Ftest-utils\u002Fruntime'\nimport { beforeEach, expect, it, vi } from 'vitest'\nimport { nextTick } from 'vue'\nimport AuthStatus from '~\u002Fcomponents\u002FAuthStatus.vue'\n\nconst { auth } = await vi.hoisted(async () => {\n  const { createUserSessionMock } = await import('@nuxtjs\u002Fbetter-auth\u002Ftest-utils\u002Fruntime')\n  return { auth: createUserSessionMock() }\n})\n\nmockNuxtImport('useUserSession', () => () => auth)\nbeforeEach(() => auth.reset())\n\nit('reacts to session changes', async () => {\n  const component = await mountSuspended(AuthStatus)\n  expect(component.text()).toContain('Signed out')\n\n  const now = new Date()\n  auth.setSession({\n    user: {\n      id: 'user-1', name: 'Viewer', email: 'viewer@example.test',\n      emailVerified: true, createdAt: now, updatedAt: now,\n    },\n    session: {\n      id: 'session-1', userId: 'user-1',\n      createdAt: now, updatedAt: now,\n      expiresAt: new Date(Date.now() + 3600_000),\n    },\n  })\n  await nextTick()\n  expect(component.text()).toContain('Signed in')\n\n  await auth.signOut()\n  await nextTick()\n  expect(component.text()).toContain('Signed out')\n  component.unmount()\n})\n","tests\u002Fnuxt\u002Fauth-status.nuxt.spec.ts","ts","",[226,283,284,315,347,364,378,385,431,459,478,484,489,513,533,538,558,581,610,615,634,648,658,692,724,730,740,761,781,815,820,826,837,861,866,880,889,912,925],{"__ignoreMap":281},[285,286,289,293,297,300,302,305,308,311],"span",{"class":287,"line":288},"line",1,[285,290,292],{"class":291},"sqe1H","import",[285,294,296],{"class":295},"s17Py"," { ",[285,298,244],{"class":299},"sYvLG",[285,301,253],{"class":295},[285,303,304],{"class":299},"mountSuspended",[285,306,307],{"class":295}," } ",[285,309,310],{"class":291},"from",[285,312,314],{"class":313},"sPAZv"," '@nuxt\u002Ftest-utils\u002Fruntime'\n",[285,316,318,320,322,325,327,330,332,335,337,340,342,344],{"class":287,"line":317},2,[285,319,292],{"class":291},[285,321,296],{"class":295},[285,323,324],{"class":299},"beforeEach",[285,326,253],{"class":295},[285,328,329],{"class":299},"expect",[285,331,253],{"class":295},[285,333,334],{"class":299},"it",[285,336,253],{"class":295},[285,338,339],{"class":299},"vi",[285,341,307],{"class":295},[285,343,310],{"class":291},[285,345,346],{"class":313}," 'vitest'\n",[285,348,350,352,354,357,359,361],{"class":287,"line":349},3,[285,351,292],{"class":291},[285,353,296],{"class":295},[285,355,356],{"class":299},"nextTick",[285,358,307],{"class":295},[285,360,310],{"class":291},[285,362,363],{"class":313}," 'vue'\n",[285,365,367,369,372,375],{"class":287,"line":366},4,[285,368,292],{"class":291},[285,370,371],{"class":299}," AuthStatus",[285,373,374],{"class":291}," from",[285,376,377],{"class":313}," '~\u002Fcomponents\u002FAuthStatus.vue'\n",[285,379,381],{"class":287,"line":380},5,[285,382,384],{"emptyLinePlaceholder":383},true,"\n",[285,386,388,391,393,397,399,403,406,410,412,416,419,422,425,428],{"class":287,"line":387},6,[285,389,390],{"class":291},"const",[285,392,296],{"class":295},[285,394,396],{"class":395},"s6Rhl","auth",[285,398,307],{"class":295},[285,400,402],{"class":401},"sQBpM","=",[285,404,405],{"class":291}," await",[285,407,409],{"class":408},"svFNh"," vi",[285,411,229],{"class":295},[285,413,415],{"class":414},"sfT9l","hoisted",[285,417,418],{"class":295},"(",[285,420,421],{"class":291},"async",[285,423,424],{"class":295}," () ",[285,426,427],{"class":291},"=>",[285,429,430],{"class":295}," {\n",[285,432,434,437,439,441,443,445,447,451,453,456],{"class":287,"line":433},7,[285,435,436],{"class":291},"  const",[285,438,296],{"class":295},[285,440,240],{"class":395},[285,442,307],{"class":295},[285,444,402],{"class":401},[285,446,405],{"class":291},[285,448,450],{"class":449},"sn-Jc"," import",[285,452,418],{"class":295},[285,454,455],{"class":313},"'@nuxtjs\u002Fbetter-auth\u002Ftest-utils\u002Fruntime'",[285,457,458],{"class":295},")\n",[285,460,462,465,467,469,472,475],{"class":287,"line":461},8,[285,463,464],{"class":291},"  return",[285,466,296],{"class":295},[285,468,396],{"class":299},[285,470,273],{"class":471},"sVnqq",[285,473,474],{"class":414}," createUserSessionMock",[285,476,477],{"class":295},"() }\n",[285,479,481],{"class":287,"line":480},9,[285,482,483],{"class":295},"})\n",[285,485,487],{"class":287,"line":486},10,[285,488,384],{"emptyLinePlaceholder":383},[285,490,492,494,496,499,502,504,506,508,511],{"class":287,"line":491},11,[285,493,244],{"class":414},[285,495,418],{"class":295},[285,497,498],{"class":313},"'useUserSession'",[285,500,501],{"class":295},", () ",[285,503,427],{"class":291},[285,505,424],{"class":295},[285,507,427],{"class":291},[285,509,510],{"class":408}," auth",[285,512,458],{"class":295},[285,514,516,518,521,523,525,527,530],{"class":287,"line":515},12,[285,517,324],{"class":414},[285,519,520],{"class":295},"(() ",[285,522,427],{"class":291},[285,524,510],{"class":408},[285,526,229],{"class":295},[285,528,529],{"class":414},"reset",[285,531,532],{"class":295},"())\n",[285,534,536],{"class":287,"line":535},13,[285,537,384],{"emptyLinePlaceholder":383},[285,539,541,543,545,548,550,552,554,556],{"class":287,"line":540},14,[285,542,334],{"class":414},[285,544,418],{"class":295},[285,546,547],{"class":313},"'reacts to session changes'",[285,549,253],{"class":295},[285,551,421],{"class":291},[285,553,424],{"class":295},[285,555,427],{"class":291},[285,557,430],{"class":295},[285,559,561,563,566,569,571,574,576,579],{"class":287,"line":560},15,[285,562,436],{"class":291},[285,564,565],{"class":395}," component",[285,567,568],{"class":401}," =",[285,570,405],{"class":291},[285,572,573],{"class":414}," mountSuspended",[285,575,418],{"class":295},[285,577,578],{"class":408},"AuthStatus",[285,580,458],{"class":295},[285,582,584,587,589,592,594,597,600,603,605,608],{"class":287,"line":583},16,[285,585,586],{"class":414},"  expect",[285,588,418],{"class":295},[285,590,591],{"class":408},"component",[285,593,229],{"class":295},[285,595,596],{"class":414},"text",[285,598,599],{"class":295},"()).",[285,601,602],{"class":414},"toContain",[285,604,418],{"class":295},[285,606,607],{"class":313},"'Signed out'",[285,609,458],{"class":295},[285,611,613],{"class":287,"line":612},17,[285,614,384],{"emptyLinePlaceholder":383},[285,616,618,620,623,625,628,631],{"class":287,"line":617},18,[285,619,436],{"class":291},[285,621,622],{"class":395}," now",[285,624,568],{"class":401},[285,626,627],{"class":291}," new",[285,629,630],{"class":414}," Date",[285,632,633],{"class":295},"()\n",[285,635,637,640,642,645],{"class":287,"line":636},19,[285,638,639],{"class":408},"  auth",[285,641,229],{"class":295},[285,643,644],{"class":414},"setSession",[285,646,647],{"class":295},"({\n",[285,649,651,654,656],{"class":287,"line":650},20,[285,652,653],{"class":299},"    user",[285,655,273],{"class":471},[285,657,430],{"class":295},[285,659,661,664,666,669,671,674,676,679,681,684,686,689],{"class":287,"line":660},21,[285,662,663],{"class":299},"      id",[285,665,273],{"class":471},[285,667,668],{"class":313}," 'user-1'",[285,670,253],{"class":295},[285,672,673],{"class":299},"name",[285,675,273],{"class":471},[285,677,678],{"class":313}," 'Viewer'",[285,680,253],{"class":295},[285,682,683],{"class":299},"email",[285,685,273],{"class":471},[285,687,688],{"class":313}," 'viewer@example.test'",[285,690,691],{"class":295},",\n",[285,693,695,698,700,704,706,709,711,713,715,718,720,722],{"class":287,"line":694},22,[285,696,697],{"class":299},"      emailVerified",[285,699,273],{"class":471},[285,701,703],{"class":702},"s3ZNE"," true",[285,705,253],{"class":295},[285,707,708],{"class":299},"createdAt",[285,710,273],{"class":471},[285,712,622],{"class":408},[285,714,253],{"class":295},[285,716,717],{"class":299},"updatedAt",[285,719,273],{"class":471},[285,721,622],{"class":408},[285,723,691],{"class":295},[285,725,727],{"class":287,"line":726},23,[285,728,729],{"class":295},"    },\n",[285,731,733,736,738],{"class":287,"line":732},24,[285,734,735],{"class":299},"    session",[285,737,273],{"class":471},[285,739,430],{"class":295},[285,741,743,745,747,750,752,755,757,759],{"class":287,"line":742},25,[285,744,663],{"class":299},[285,746,273],{"class":471},[285,748,749],{"class":313}," 'session-1'",[285,751,253],{"class":295},[285,753,754],{"class":299},"userId",[285,756,273],{"class":471},[285,758,668],{"class":313},[285,760,691],{"class":295},[285,762,764,767,769,771,773,775,777,779],{"class":287,"line":763},26,[285,765,766],{"class":299},"      createdAt",[285,768,273],{"class":471},[285,770,622],{"class":408},[285,772,253],{"class":295},[285,774,717],{"class":299},[285,776,273],{"class":471},[285,778,622],{"class":408},[285,780,691],{"class":295},[285,782,784,787,789,791,793,795,798,800,803,806,809,812],{"class":287,"line":783},27,[285,785,786],{"class":299},"      expiresAt",[285,788,273],{"class":471},[285,790,627],{"class":291},[285,792,630],{"class":414},[285,794,418],{"class":295},[285,796,797],{"class":408},"Date",[285,799,229],{"class":295},[285,801,802],{"class":414},"now",[285,804,805],{"class":295},"() ",[285,807,808],{"class":449},"+",[285,810,811],{"class":702}," 3600_000",[285,813,814],{"class":295},"),\n",[285,816,818],{"class":287,"line":817},28,[285,819,729],{"class":295},[285,821,823],{"class":287,"line":822},29,[285,824,825],{"class":295},"  })\n",[285,827,829,832,835],{"class":287,"line":828},30,[285,830,831],{"class":291},"  await",[285,833,834],{"class":414}," nextTick",[285,836,633],{"class":295},[285,838,840,842,844,846,848,850,852,854,856,859],{"class":287,"line":839},31,[285,841,586],{"class":414},[285,843,418],{"class":295},[285,845,591],{"class":408},[285,847,229],{"class":295},[285,849,596],{"class":414},[285,851,599],{"class":295},[285,853,602],{"class":414},[285,855,418],{"class":295},[285,857,858],{"class":313},"'Signed in'",[285,860,458],{"class":295},[285,862,864],{"class":287,"line":863},32,[285,865,384],{"emptyLinePlaceholder":383},[285,867,869,871,873,875,878],{"class":287,"line":868},33,[285,870,831],{"class":291},[285,872,510],{"class":408},[285,874,229],{"class":295},[285,876,877],{"class":414},"signOut",[285,879,633],{"class":295},[285,881,883,885,887],{"class":287,"line":882},34,[285,884,831],{"class":291},[285,886,834],{"class":414},[285,888,633],{"class":295},[285,890,892,894,896,898,900,902,904,906,908,910],{"class":287,"line":891},35,[285,893,586],{"class":414},[285,895,418],{"class":295},[285,897,591],{"class":408},[285,899,229],{"class":295},[285,901,596],{"class":414},[285,903,599],{"class":295},[285,905,602],{"class":414},[285,907,418],{"class":295},[285,909,607],{"class":313},[285,911,458],{"class":295},[285,913,915,918,920,923],{"class":287,"line":914},36,[285,916,917],{"class":408},"  component",[285,919,229],{"class":295},[285,921,922],{"class":414},"unmount",[285,924,633],{"class":295},[285,926,928],{"class":287,"line":927},37,[285,929,483],{"class":295},[214,931,932,933,936,937,940,941,944],{},"Supply any required additional fields from your auth configuration. ",[226,934,935],{},"reset()"," restores a copy of the initial session passed to the factory, or the signed-out state when omitted. ",[226,938,939],{},"setSession(null, { ready: false })"," models a pending session; ",[226,942,943],{},"waitForSession()"," waits until the mock is logged in, or for five seconds, just like the real composable. Use Vitest fake timers to test the timeout.",[214,946,947,950,951,954,955,958,959,962,963,966,967,970,971,974],{},[226,948,949],{},"updateUser()"," merges fields into the mock user. ",[226,952,953],{},"signOut()"," clears the session and calls an optional ",[226,956,957],{},"onSuccess"," callback. ",[226,960,961],{},"fetchSession()"," does nothing by default; replace it with ",[226,964,965],{},"vi.fn()"," when testing refresh behavior. These methods make no network requests. Mock ",[226,968,969],{},"useSignIn"," and ",[226,972,973],{},"useSignUp"," separately when testing login forms.",[231,976,978],{"id":977},"creating-sessions-for-end-to-end-tests","Creating sessions for end-to-end tests",[214,980,237,981,984,985,988,989,992,993,253,996,260,999,1002,1003,1006,1007,970,1010,1013,1014,1017,1018,229],{},[226,982,983],{},"createAuthTestContext"," with the server started by ",[226,986,987],{},"@nuxt\u002Ftest-utils\u002Fe2e",". It installs Better Auth's ",[226,990,991],{},"testUtils"," plugin and exposes ",[226,994,995],{},"createUser",[226,997,998],{},"login",[226,1000,1001],{},"clear"," through a private test route. Pass your usual Nuxt ",[226,1004,1005],{},"setup()"," options to the factory. It merges your ",[226,1008,1009],{},"nuxtConfig",[226,1011,1012],{},"env"," with the test module, selects a local port or uses your ",[226,1015,1016],{},"port",", and configures the matching ",[226,1019,1020],{},"siteUrl",[214,1022,1023],{},"Configure a local Better Auth server and an isolated test database in your fixture. For example:",[275,1025,1028],{"className":277,"code":1026,"filename":1027,"language":280,"meta":281,"style":281},"import { memoryAdapter } from 'better-auth\u002Fadapters\u002Fmemory'\n\nexport default defineServerAuth({\n  database: memoryAdapter({ user: [], session: [], account: [], verification: [] }),\n})\n","tests\u002Ffixtures\u002Fauth\u002Fserver\u002Fauth.config.ts",[226,1029,1030,1046,1050,1064,1105],{"__ignoreMap":281},[285,1031,1032,1034,1036,1039,1041,1043],{"class":287,"line":288},[285,1033,292],{"class":291},[285,1035,296],{"class":295},[285,1037,1038],{"class":299},"memoryAdapter",[285,1040,307],{"class":295},[285,1042,310],{"class":291},[285,1044,1045],{"class":313}," 'better-auth\u002Fadapters\u002Fmemory'\n",[285,1047,1048],{"class":287,"line":317},[285,1049,384],{"emptyLinePlaceholder":383},[285,1051,1052,1055,1059,1062],{"class":287,"line":349},[285,1053,1054],{"class":291},"export",[285,1056,1058],{"class":1057},"sKg8T"," default",[285,1060,1061],{"class":414}," defineServerAuth",[285,1063,647],{"class":295},[285,1065,1066,1069,1071,1074,1077,1079,1081,1084,1086,1088,1090,1093,1095,1097,1100,1102],{"class":287,"line":366},[285,1067,1068],{"class":299},"  database",[285,1070,273],{"class":471},[285,1072,1073],{"class":414}," memoryAdapter",[285,1075,1076],{"class":295},"({ ",[285,1078,252],{"class":299},[285,1080,273],{"class":471},[285,1082,1083],{"class":295}," [], ",[285,1085,256],{"class":299},[285,1087,273],{"class":471},[285,1089,1083],{"class":295},[285,1091,1092],{"class":299},"account",[285,1094,273],{"class":471},[285,1096,1083],{"class":295},[285,1098,1099],{"class":299},"verification",[285,1101,273],{"class":471},[285,1103,1104],{"class":295}," [] }),\n",[285,1106,1107],{"class":287,"line":380},[285,1108,483],{"class":295},[214,1110,1111],{},"Use the login result's headers for HTTP tests and its cookies for Playwright:",[275,1113,1116],{"className":277,"code":1114,"filename":1115,"language":280,"meta":281,"style":281},"import { fileURLToPath } from 'node:url'\nimport { $fetch, getBrowser, setup, url } from '@nuxt\u002Ftest-utils\u002Fe2e'\nimport { createAuthTestContext } from '@nuxtjs\u002Fbetter-auth\u002Ftest-utils\u002Fe2e'\nimport { afterEach, describe, expect, it } from 'vitest'\n\nconst auth = await createAuthTestContext({\n  rootDir: fileURLToPath(new URL('..\u002Ffixtures\u002Fauth', import.meta.url)),\n  browser: true,\n})\n\ndescribe('Authenticated access', async () => {\n  await setup(auth.setupOptions)\n  afterEach(() => auth.clear())\n\n  it('uses the same session for API requests and pages', async () => {\n    const user = await auth.createUser({ name: 'Test viewer' })\n    const { headers, cookies } = await auth.login({ userId: user.id })\n    const me = await $fetch('\u002Fapi\u002Fme', { headers })\n    expect(me.user.id).toBe(user.id)\n\n    const browser = await getBrowser()\n    const context = await browser.newContext()\n    try {\n      await context.addCookies(cookies)\n      const page = await context.newPage()\n      await page.goto(url('\u002Fprotected'))\n      expect(await page.getByText('Test viewer').textContent()).toBe('Test viewer')\n    }\n    finally {\n      await context.close()\n    }\n  })\n})\n","tests\u002Fe2e\u002Fauth.test.ts",[226,1117,1118,1134,1165,1180,1208,1212,1227,1266,1277,1281,1285,1304,1322,1339,1343,1363,1393,1434,1460,1494,1498,1514,1534,1541,1559,1580,1603,1640,1645,1652,1665,1669,1673],{"__ignoreMap":281},[285,1119,1120,1122,1124,1127,1129,1131],{"class":287,"line":288},[285,1121,292],{"class":291},[285,1123,296],{"class":295},[285,1125,1126],{"class":299},"fileURLToPath",[285,1128,307],{"class":295},[285,1130,310],{"class":291},[285,1132,1133],{"class":313}," 'node:url'\n",[285,1135,1136,1138,1140,1143,1145,1148,1150,1153,1155,1158,1160,1162],{"class":287,"line":317},[285,1137,292],{"class":291},[285,1139,296],{"class":295},[285,1141,1142],{"class":299},"$fetch",[285,1144,253],{"class":295},[285,1146,1147],{"class":299},"getBrowser",[285,1149,253],{"class":295},[285,1151,1152],{"class":299},"setup",[285,1154,253],{"class":295},[285,1156,1157],{"class":299},"url",[285,1159,307],{"class":295},[285,1161,310],{"class":291},[285,1163,1164],{"class":313}," '@nuxt\u002Ftest-utils\u002Fe2e'\n",[285,1166,1167,1169,1171,1173,1175,1177],{"class":287,"line":349},[285,1168,292],{"class":291},[285,1170,296],{"class":295},[285,1172,983],{"class":299},[285,1174,307],{"class":295},[285,1176,310],{"class":291},[285,1178,1179],{"class":313}," '@nuxtjs\u002Fbetter-auth\u002Ftest-utils\u002Fe2e'\n",[285,1181,1182,1184,1186,1189,1191,1194,1196,1198,1200,1202,1204,1206],{"class":287,"line":366},[285,1183,292],{"class":291},[285,1185,296],{"class":295},[285,1187,1188],{"class":299},"afterEach",[285,1190,253],{"class":295},[285,1192,1193],{"class":299},"describe",[285,1195,253],{"class":295},[285,1197,329],{"class":299},[285,1199,253],{"class":295},[285,1201,334],{"class":299},[285,1203,307],{"class":295},[285,1205,310],{"class":291},[285,1207,346],{"class":313},[285,1209,1210],{"class":287,"line":380},[285,1211,384],{"emptyLinePlaceholder":383},[285,1213,1214,1216,1218,1220,1222,1225],{"class":287,"line":387},[285,1215,390],{"class":291},[285,1217,510],{"class":395},[285,1219,568],{"class":401},[285,1221,405],{"class":291},[285,1223,1224],{"class":414}," createAuthTestContext",[285,1226,647],{"class":295},[285,1228,1229,1232,1234,1237,1239,1242,1245,1247,1250,1252,1254,1256,1259,1261,1263],{"class":287,"line":433},[285,1230,1231],{"class":299},"  rootDir",[285,1233,273],{"class":471},[285,1235,1236],{"class":414}," fileURLToPath",[285,1238,418],{"class":295},[285,1240,1241],{"class":291},"new",[285,1243,1244],{"class":414}," URL",[285,1246,418],{"class":295},[285,1248,1249],{"class":313},"'..\u002Ffixtures\u002Fauth'",[285,1251,253],{"class":295},[285,1253,292],{"class":291},[285,1255,229],{"class":295},[285,1257,1258],{"class":299},"meta",[285,1260,229],{"class":295},[285,1262,1157],{"class":299},[285,1264,1265],{"class":295},")),\n",[285,1267,1268,1271,1273,1275],{"class":287,"line":461},[285,1269,1270],{"class":299},"  browser",[285,1272,273],{"class":471},[285,1274,703],{"class":702},[285,1276,691],{"class":295},[285,1278,1279],{"class":287,"line":480},[285,1280,483],{"class":295},[285,1282,1283],{"class":287,"line":486},[285,1284,384],{"emptyLinePlaceholder":383},[285,1286,1287,1289,1291,1294,1296,1298,1300,1302],{"class":287,"line":491},[285,1288,1193],{"class":414},[285,1290,418],{"class":295},[285,1292,1293],{"class":313},"'Authenticated access'",[285,1295,253],{"class":295},[285,1297,421],{"class":291},[285,1299,424],{"class":295},[285,1301,427],{"class":291},[285,1303,430],{"class":295},[285,1305,1306,1308,1311,1313,1315,1317,1320],{"class":287,"line":515},[285,1307,831],{"class":291},[285,1309,1310],{"class":414}," setup",[285,1312,418],{"class":295},[285,1314,396],{"class":408},[285,1316,229],{"class":295},[285,1318,1319],{"class":299},"setupOptions",[285,1321,458],{"class":295},[285,1323,1324,1327,1329,1331,1333,1335,1337],{"class":287,"line":535},[285,1325,1326],{"class":414},"  afterEach",[285,1328,520],{"class":295},[285,1330,427],{"class":291},[285,1332,510],{"class":408},[285,1334,229],{"class":295},[285,1336,1001],{"class":414},[285,1338,532],{"class":295},[285,1340,1341],{"class":287,"line":540},[285,1342,384],{"emptyLinePlaceholder":383},[285,1344,1345,1348,1350,1353,1355,1357,1359,1361],{"class":287,"line":560},[285,1346,1347],{"class":414},"  it",[285,1349,418],{"class":295},[285,1351,1352],{"class":313},"'uses the same session for API requests and pages'",[285,1354,253],{"class":295},[285,1356,421],{"class":291},[285,1358,424],{"class":295},[285,1360,427],{"class":291},[285,1362,430],{"class":295},[285,1364,1365,1368,1371,1373,1375,1377,1379,1381,1383,1385,1387,1390],{"class":287,"line":583},[285,1366,1367],{"class":291},"    const",[285,1369,1370],{"class":395}," user",[285,1372,568],{"class":401},[285,1374,405],{"class":291},[285,1376,510],{"class":408},[285,1378,229],{"class":295},[285,1380,995],{"class":414},[285,1382,1076],{"class":295},[285,1384,673],{"class":299},[285,1386,273],{"class":471},[285,1388,1389],{"class":313}," 'Test viewer'",[285,1391,1392],{"class":295}," })\n",[285,1394,1395,1397,1399,1402,1404,1407,1409,1411,1413,1415,1417,1419,1421,1423,1425,1427,1429,1432],{"class":287,"line":612},[285,1396,1367],{"class":291},[285,1398,296],{"class":295},[285,1400,1401],{"class":395},"headers",[285,1403,253],{"class":295},[285,1405,1406],{"class":395},"cookies",[285,1408,307],{"class":295},[285,1410,402],{"class":401},[285,1412,405],{"class":291},[285,1414,510],{"class":408},[285,1416,229],{"class":295},[285,1418,998],{"class":414},[285,1420,1076],{"class":295},[285,1422,754],{"class":299},[285,1424,273],{"class":471},[285,1426,1370],{"class":408},[285,1428,229],{"class":295},[285,1430,1431],{"class":299},"id",[285,1433,1392],{"class":295},[285,1435,1436,1438,1441,1443,1445,1448,1450,1453,1456,1458],{"class":287,"line":617},[285,1437,1367],{"class":291},[285,1439,1440],{"class":395}," me",[285,1442,568],{"class":401},[285,1444,405],{"class":291},[285,1446,1447],{"class":414}," $fetch",[285,1449,418],{"class":295},[285,1451,1452],{"class":313},"'\u002Fapi\u002Fme'",[285,1454,1455],{"class":295},", { ",[285,1457,1401],{"class":408},[285,1459,1392],{"class":295},[285,1461,1462,1465,1467,1470,1472,1474,1476,1478,1481,1484,1486,1488,1490,1492],{"class":287,"line":636},[285,1463,1464],{"class":414},"    expect",[285,1466,418],{"class":295},[285,1468,1469],{"class":408},"me",[285,1471,229],{"class":295},[285,1473,252],{"class":299},[285,1475,229],{"class":295},[285,1477,1431],{"class":299},[285,1479,1480],{"class":295},").",[285,1482,1483],{"class":414},"toBe",[285,1485,418],{"class":295},[285,1487,252],{"class":408},[285,1489,229],{"class":295},[285,1491,1431],{"class":299},[285,1493,458],{"class":295},[285,1495,1496],{"class":287,"line":650},[285,1497,384],{"emptyLinePlaceholder":383},[285,1499,1500,1502,1505,1507,1509,1512],{"class":287,"line":660},[285,1501,1367],{"class":291},[285,1503,1504],{"class":395}," browser",[285,1506,568],{"class":401},[285,1508,405],{"class":291},[285,1510,1511],{"class":414}," getBrowser",[285,1513,633],{"class":295},[285,1515,1516,1518,1521,1523,1525,1527,1529,1532],{"class":287,"line":694},[285,1517,1367],{"class":291},[285,1519,1520],{"class":395}," context",[285,1522,568],{"class":401},[285,1524,405],{"class":291},[285,1526,1504],{"class":408},[285,1528,229],{"class":295},[285,1530,1531],{"class":414},"newContext",[285,1533,633],{"class":295},[285,1535,1536,1539],{"class":287,"line":726},[285,1537,1538],{"class":291},"    try",[285,1540,430],{"class":295},[285,1542,1543,1546,1548,1550,1553,1555,1557],{"class":287,"line":732},[285,1544,1545],{"class":291},"      await",[285,1547,1520],{"class":408},[285,1549,229],{"class":295},[285,1551,1552],{"class":414},"addCookies",[285,1554,418],{"class":295},[285,1556,1406],{"class":408},[285,1558,458],{"class":295},[285,1560,1561,1564,1567,1569,1571,1573,1575,1578],{"class":287,"line":742},[285,1562,1563],{"class":291},"      const",[285,1565,1566],{"class":395}," page",[285,1568,568],{"class":401},[285,1570,405],{"class":291},[285,1572,1520],{"class":408},[285,1574,229],{"class":295},[285,1576,1577],{"class":414},"newPage",[285,1579,633],{"class":295},[285,1581,1582,1584,1586,1588,1591,1593,1595,1597,1600],{"class":287,"line":763},[285,1583,1545],{"class":291},[285,1585,1566],{"class":408},[285,1587,229],{"class":295},[285,1589,1590],{"class":414},"goto",[285,1592,418],{"class":295},[285,1594,1157],{"class":414},[285,1596,418],{"class":295},[285,1598,1599],{"class":313},"'\u002Fprotected'",[285,1601,1602],{"class":295},"))\n",[285,1604,1605,1608,1610,1613,1615,1617,1620,1622,1625,1627,1630,1632,1634,1636,1638],{"class":287,"line":783},[285,1606,1607],{"class":414},"      expect",[285,1609,418],{"class":295},[285,1611,1612],{"class":291},"await",[285,1614,1566],{"class":408},[285,1616,229],{"class":295},[285,1618,1619],{"class":414},"getByText",[285,1621,418],{"class":295},[285,1623,1624],{"class":313},"'Test viewer'",[285,1626,1480],{"class":295},[285,1628,1629],{"class":414},"textContent",[285,1631,599],{"class":295},[285,1633,1483],{"class":414},[285,1635,418],{"class":295},[285,1637,1624],{"class":313},[285,1639,458],{"class":295},[285,1641,1642],{"class":287,"line":817},[285,1643,1644],{"class":295},"    }\n",[285,1646,1647,1650],{"class":287,"line":822},[285,1648,1649],{"class":291},"    finally",[285,1651,430],{"class":295},[285,1653,1654,1656,1658,1660,1663],{"class":287,"line":828},[285,1655,1545],{"class":291},[285,1657,1520],{"class":408},[285,1659,229],{"class":295},[285,1661,1662],{"class":414},"close",[285,1664,633],{"class":295},[285,1666,1667],{"class":287,"line":839},[285,1668,1644],{"class":295},[285,1670,1671],{"class":287,"line":863},[285,1672,825],{"class":295},[285,1674,1675],{"class":287,"line":868},[285,1676,483],{"class":295},[214,1678,1679,1680,1683,1684,970,1687,1690],{},"This example assumes ",[226,1681,1682],{},"\u002Fapi\u002Fme"," returns ",[226,1685,1686],{},"requireUserSession(event)",[226,1688,1689],{},"\u002Fprotected"," displays the user's name. These are real persisted sessions, so server middleware, SSR, hydration, and sign-out use normal authentication. The helpers skip signup and password entry.",[214,1692,1693,1694,1697,1698,1700],{},"Create one auth context per test suite. ",[226,1695,1696],{},"clear()"," deletes users created by that context and their sessions; call it after each test, and do not run tests sharing that context concurrently. ",[226,1699,998],{}," only accepts users created through the same context. Close browser contexts separately.",[214,1702,1703,1704,1707,1708,1711,1712,1715,1716,1719,1720,1722,1723,253,1726,253,1729,260,1732,1735],{},"The bridge is installed only by ",[226,1705,1706],{},"auth.setupOptions"," in a test build and requires a random token kept in private runtime config. Ordinary builds do not register it. Use this setup for local test fixtures, not deployed previews or production. It requires a local server and does not support ",[226,1709,1710],{},"clientOnly"," mode. The helper overrides ",[226,1713,1714],{},"NUXT_PUBLIC_SITE_URL"," for the test server, so an inherited application URL cannot change the cookie domain. Pass setup overrides to ",[226,1717,1718],{},"createAuthTestContext(options)",", then pass ",[226,1721,1706],{}," unchanged to Nuxt. It requires the built-server mode and rejects ",[226,1724,1725],{},"dev: true",[226,1727,1728],{},"host",[226,1730,1731],{},"build: false",[226,1733,1734],{},"server: false",". Nuxt Test Utils starts dev servers in a separate CLI process without these module overrides.",[214,1737,1738,1740,1741,1746],{},[226,1739,998],{}," forwards Better Auth's supported login options. Custom session field overrides depend on ",[218,1742,1745],{"href":1743,"rel":1744},"https:\u002F\u002Fgithub.com\u002Fbetter-auth\u002Fbetter-auth\u002Fpull\u002F11217",[222],"Better Auth #11217","; they are not available in Better Auth 1.7.3. Session fields with configured defaults work with the current release.",[1748,1749],"read-more",{"title":1750,"to":220},"Nuxt Testing Guide",[1752,1753,1754],"style",{},"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 .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 .sfT9l, html code.shiki .sfT9l{--shiki-light:#4078F2;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}html pre.shiki code .sn-Jc, html code.shiki .sn-Jc{--shiki-light:#0184BC;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sVnqq, html code.shiki .sVnqq{--shiki-light:#0184BC;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}html pre.shiki code .s3ZNE, html code.shiki .s3ZNE{--shiki-light:#986801;--shiki-default:#F97E72;--shiki-dark:#F97E72}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 .sKg8T, html code.shiki .sKg8T{--shiki-light:#E45649;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}",{"title":281,"searchDepth":317,"depth":317,"links":1756},[1757,1758],{"id":233,"depth":317,"text":234},{"id":977,"depth":317,"text":978},"Mock reactive sessions in Nuxt component tests and create real sessions for end-to-end tests.","md",null,{},{"title":108,"description":1759},"DJeEw0ikOXERSjyHHpfUlSP3-0C-ir-Bx0__OjU1hAw",[1766,1768],{"title":104,"path":105,"stem":106,"description":1767,"children":-1},"Enable two-factor auth using the Better Auth two-factor plugin.",{"title":112,"path":113,"stem":114,"description":1769,"children":-1},"Checklist and best practices for deploying Nuxt Better Auth in production.",1791215141444]