[{"data":1,"prerenderedAt":1150},["ShallowReactive",2],{"navigation_docs":3,"-guide-authentication":91,"-guide-authentication-surround":1145},[4,18,67],{"title":5,"path":6,"stem":7,"children":8,"page":17},"Getting Started","/getting-started","1.getting-started",[9,13],{"title":10,"path":11,"stem":12},"Installation","/getting-started/installation","1.getting-started/1.installation",{"title":14,"path":15,"stem":16},"Usage","/getting-started/usage","1.getting-started/2.usage",false,{"title":19,"path":20,"stem":21,"children":22,"page":17},"Guide","/guide","2.guide",[23,27,31,35,39,43,47,51,55,59,63],{"title":24,"path":25,"stem":26},"Action Client","/guide/action-client","2.guide/1.action-client",{"title":28,"path":29,"stem":30},"Queries","/guide/queries","2.guide/10.queries",{"title":32,"path":33,"stem":34},"Comparison","/guide/comparison","2.guide/11.comparison",{"title":36,"path":37,"stem":38},"Defining Actions","/guide/defining-actions","2.guide/2.defining-actions",{"title":40,"path":41,"stem":42},"useAction","/guide/use-action","2.guide/3.use-action",{"title":44,"path":45,"stem":46},"Middleware","/guide/middleware","2.guide/4.middleware",{"title":48,"path":49,"stem":50},"Error Handling","/guide/error-handling","2.guide/5.error-handling",{"title":52,"path":53,"stem":54},"Validation","/guide/validation","2.guide/6.validation",{"title":56,"path":57,"stem":58},"Forms","/guide/forms","2.guide/7.forms",{"title":60,"path":61,"stem":62},"Authentication","/guide/authentication","2.guide/8.authentication",{"title":64,"path":65,"stem":66},"Optimistic Updates","/guide/optimistic-updates","2.guide/9.optimistic-updates",{"title":68,"path":69,"stem":70,"children":71,"page":17},"Api","/api","3.api",[72,76,80,83,87],{"title":73,"path":74,"stem":75},"createSafeActionClient","/api/create-safe-action-client","3.api/1.create-safe-action-client",{"title":77,"path":78,"stem":79},"Builder Chain","/api/builder-chain","3.api/2.builder-chain",{"title":40,"path":81,"stem":82},"/api/use-action","3.api/3.use-action",{"title":84,"path":85,"stem":86},"useFormAction","/api/use-form-action","3.api/4.use-form-action",{"title":88,"path":89,"stem":90},"useOptimisticAction","/api/use-optimistic-action","3.api/5.use-optimistic-action",{"id":92,"title":60,"body":93,"description":1139,"extension":1140,"links":1141,"meta":1142,"navigation":250,"path":61,"seo":1143,"stem":62,"__hash__":1144},"docs/2.guide/8.authentication.md",{"type":94,"value":95,"toc":1135},"minimark",[96,101,105,116,195,209,548,553,556,1104,1107,1111,1125,1131],[97,98,100],"h1",{"id":99},"authentication-and-authorization","Authentication and authorization",[102,103,104],"p",{},"Every generated action is an HTTP endpoint. Validation does not authenticate users or prove they may access a resource.",[102,106,107,108,115],{},"This recipe assumes you have installed and configured ",[109,110,114],"a",{"href":111,"rel":112},"https://github.com/atinux/nuxt-auth-utils",[113],"nofollow","nuxt-auth-utils",", including its session password and a trusted sign-in flow. Do not create a session by trusting a client-submitted user ID.",[117,118,124],"pre",{"className":119,"code":120,"filename":121,"language":122,"meta":123,"style":123},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","declare module '#auth-utils' {\n  interface User { id: string }\n}\nexport {}\n","shared/types/auth.d.ts","ts","",[125,126,127,153,179,185],"code",{"__ignoreMap":123},[128,129,132,136,139,143,147,150],"span",{"class":130,"line":131},"line",1,[128,133,135],{"class":134},"spNyl","declare",[128,137,138],{"class":134}," module",[128,140,142],{"class":141},"sMK4o"," '",[128,144,146],{"class":145},"sfazB","#auth-utils",[128,148,149],{"class":141},"'",[128,151,152],{"class":141}," {\n",[128,154,156,159,163,166,170,173,176],{"class":130,"line":155},2,[128,157,158],{"class":134},"  interface",[128,160,162],{"class":161},"sBMFI"," User",[128,164,165],{"class":141}," {",[128,167,169],{"class":168},"swJcz"," id",[128,171,172],{"class":141},":",[128,174,175],{"class":161}," string",[128,177,178],{"class":141}," }\n",[128,180,182],{"class":130,"line":181},3,[128,183,184],{"class":141},"}\n",[128,186,188,192],{"class":130,"line":187},4,[128,189,191],{"class":190},"s7zQu","export",[128,193,194],{"class":141}," {}\n",[102,196,197,200,201,204,205,208],{},[125,198,199],{},"getUserSession()"," can return a session without a user; testing session truthiness is insufficient. ",[125,202,203],{},"requireUserSession()"," checks for the user key. Its H3 exception is caught by the action builder; wrap it in ",[125,206,207],{},"ActionError"," when you want an intentional public sign-in message instead of the generic unexpected-error fallback.",[117,210,213],{"className":119,"code":211,"filename":212,"language":122,"meta":123,"style":123},"import { createSafeActionClient, ActionError } from '#safe-action'\n\nexport const authActionClient = createSafeActionClient({\n  handleServerError(error) {\n    console.error('Authenticated action failed:', error)\n    return 'Something went wrong. Please try again.'\n  },\n}).use(async ({ ctx, event, next }) => {\n  const session = await requireUserSession(event).catch(() => {\n    throw new ActionError('Please sign in to continue')\n  })\n  if (!session.user.id) throw new ActionError('Please sign in to continue')\n  return next({ ctx: { ...ctx, userId: session.user.id } })\n})\n","server/utils/auth-action-client.ts",[125,214,215,246,252,274,290,318,331,337,379,418,440,448,493,541],{"__ignoreMap":123},[128,216,217,220,222,226,229,232,235,238,240,243],{"class":130,"line":131},[128,218,219],{"class":190},"import",[128,221,165],{"class":141},[128,223,225],{"class":224},"sTEyZ"," createSafeActionClient",[128,227,228],{"class":141},",",[128,230,231],{"class":224}," ActionError",[128,233,234],{"class":141}," }",[128,236,237],{"class":190}," from",[128,239,142],{"class":141},[128,241,242],{"class":145},"#safe-action",[128,244,245],{"class":141},"'\n",[128,247,248],{"class":130,"line":155},[128,249,251],{"emptyLinePlaceholder":250},true,"\n",[128,253,254,256,259,262,265,268,271],{"class":130,"line":181},[128,255,191],{"class":190},[128,257,258],{"class":134}," const",[128,260,261],{"class":224}," authActionClient ",[128,263,264],{"class":141},"=",[128,266,225],{"class":267},"s2Zo4",[128,269,270],{"class":224},"(",[128,272,273],{"class":141},"{\n",[128,275,276,279,281,285,288],{"class":130,"line":187},[128,277,278],{"class":168},"  handleServerError",[128,280,270],{"class":141},[128,282,284],{"class":283},"sHdIc","error",[128,286,287],{"class":141},")",[128,289,152],{"class":141},[128,291,293,296,299,301,303,305,308,310,312,315],{"class":130,"line":292},5,[128,294,295],{"class":224},"    console",[128,297,298],{"class":141},".",[128,300,284],{"class":267},[128,302,270],{"class":168},[128,304,149],{"class":141},[128,306,307],{"class":145},"Authenticated action failed:",[128,309,149],{"class":141},[128,311,228],{"class":141},[128,313,314],{"class":224}," error",[128,316,317],{"class":168},")\n",[128,319,321,324,326,329],{"class":130,"line":320},6,[128,322,323],{"class":190},"    return",[128,325,142],{"class":141},[128,327,328],{"class":145},"Something went wrong. Please try again.",[128,330,245],{"class":141},[128,332,334],{"class":130,"line":333},7,[128,335,336],{"class":141},"  },\n",[128,338,340,343,345,347,350,352,355,358,361,363,366,368,371,374,377],{"class":130,"line":339},8,[128,341,342],{"class":141},"}",[128,344,287],{"class":224},[128,346,298],{"class":141},[128,348,349],{"class":267},"use",[128,351,270],{"class":224},[128,353,354],{"class":134},"async",[128,356,357],{"class":141}," ({",[128,359,360],{"class":283}," ctx",[128,362,228],{"class":141},[128,364,365],{"class":283}," event",[128,367,228],{"class":141},[128,369,370],{"class":283}," next",[128,372,373],{"class":141}," })",[128,375,376],{"class":134}," =>",[128,378,152],{"class":141},[128,380,382,385,388,391,394,397,399,402,404,406,409,411,414,416],{"class":130,"line":381},9,[128,383,384],{"class":134},"  const",[128,386,387],{"class":224}," session",[128,389,390],{"class":141}," =",[128,392,393],{"class":190}," await",[128,395,396],{"class":267}," requireUserSession",[128,398,270],{"class":168},[128,400,401],{"class":224},"event",[128,403,287],{"class":168},[128,405,298],{"class":141},[128,407,408],{"class":267},"catch",[128,410,270],{"class":168},[128,412,413],{"class":141},"()",[128,415,376],{"class":134},[128,417,152],{"class":141},[128,419,421,424,427,429,431,433,436,438],{"class":130,"line":420},10,[128,422,423],{"class":190},"    throw",[128,425,426],{"class":141}," new",[128,428,231],{"class":267},[128,430,270],{"class":168},[128,432,149],{"class":141},[128,434,435],{"class":145},"Please sign in to continue",[128,437,149],{"class":141},[128,439,317],{"class":168},[128,441,443,446],{"class":130,"line":442},11,[128,444,445],{"class":141},"  }",[128,447,317],{"class":168},[128,449,451,454,457,460,463,465,468,470,473,476,479,481,483,485,487,489,491],{"class":130,"line":450},12,[128,452,453],{"class":190},"  if",[128,455,456],{"class":168}," (",[128,458,459],{"class":141},"!",[128,461,462],{"class":224},"session",[128,464,298],{"class":141},[128,466,467],{"class":224},"user",[128,469,298],{"class":141},[128,471,472],{"class":224},"id",[128,474,475],{"class":168},") ",[128,477,478],{"class":190},"throw",[128,480,426],{"class":141},[128,482,231],{"class":267},[128,484,270],{"class":168},[128,486,149],{"class":141},[128,488,435],{"class":145},[128,490,149],{"class":141},[128,492,317],{"class":168},[128,494,496,499,501,503,506,508,510,512,515,518,520,523,525,527,529,531,533,535,537,539],{"class":130,"line":495},13,[128,497,498],{"class":190},"  return",[128,500,370],{"class":267},[128,502,270],{"class":168},[128,504,505],{"class":141},"{",[128,507,360],{"class":168},[128,509,172],{"class":141},[128,511,165],{"class":141},[128,513,514],{"class":141}," ...",[128,516,517],{"class":224},"ctx",[128,519,228],{"class":141},[128,521,522],{"class":168}," userId",[128,524,172],{"class":141},[128,526,387],{"class":224},[128,528,298],{"class":141},[128,530,467],{"class":224},[128,532,298],{"class":141},[128,534,472],{"class":224},[128,536,234],{"class":141},[128,538,234],{"class":141},[128,540,317],{"class":168},[128,542,544,546],{"class":130,"line":543},14,[128,545,342],{"class":141},[128,547,317],{"class":224},[549,550,552],"h2",{"id":551},"authorize-the-resource","Authorize the resource",[102,554,555],{},"The following uses Nitro storage as a repository example. It assumes existing profiles created by trusted server code; configure a persistent driver or replace storage with your database for production. Default development storage is not a durable multi-instance database.",[117,557,560],{"className":119,"code":558,"filename":559,"language":122,"meta":123,"style":123},"import { z } from 'zod'\nimport { ActionError } from '#safe-action'\nimport { authActionClient } from '../utils/auth-action-client'\n\ntype StoredProfile = {\n  id: string\n  ownerId: string\n  name: string\n  email: string\n  internalNote?: string\n}\n\nexport default authActionClient\n  .schema(z.object({ profileId: z.string().uuid(), name: z.string().trim().min(2) }))\n  .outputSchema(z.object({ id: z.string(), name: z.string() }))\n  .action(async ({ parsedInput, ctx }) => {\n    const storage = useStorage('data')\n    const key = `profiles:${parsedInput.profileId}`\n    const profile = await storage.getItem\u003CStoredProfile>(key)\n    if (!profile || profile.ownerId !== ctx.userId) {\n      throw new ActionError('Profile not found')\n    }\n    const updated = { ...profile, name: parsedInput.name }\n    await storage.setItem(key, updated)\n    return { id: updated.id, name: updated.name }\n  })\n","server/actions/update-owned-profile.ts",[125,561,562,582,600,620,624,636,646,655,664,673,683,687,691,701,782,831,858,883,913,948,985,1006,1012,1043,1066,1097],{"__ignoreMap":123},[128,563,564,566,568,571,573,575,577,580],{"class":130,"line":131},[128,565,219],{"class":190},[128,567,165],{"class":141},[128,569,570],{"class":224}," z",[128,572,234],{"class":141},[128,574,237],{"class":190},[128,576,142],{"class":141},[128,578,579],{"class":145},"zod",[128,581,245],{"class":141},[128,583,584,586,588,590,592,594,596,598],{"class":130,"line":155},[128,585,219],{"class":190},[128,587,165],{"class":141},[128,589,231],{"class":224},[128,591,234],{"class":141},[128,593,237],{"class":190},[128,595,142],{"class":141},[128,597,242],{"class":145},[128,599,245],{"class":141},[128,601,602,604,606,609,611,613,615,618],{"class":130,"line":181},[128,603,219],{"class":190},[128,605,165],{"class":141},[128,607,608],{"class":224}," authActionClient",[128,610,234],{"class":141},[128,612,237],{"class":190},[128,614,142],{"class":141},[128,616,617],{"class":145},"../utils/auth-action-client",[128,619,245],{"class":141},[128,621,622],{"class":130,"line":187},[128,623,251],{"emptyLinePlaceholder":250},[128,625,626,629,632,634],{"class":130,"line":292},[128,627,628],{"class":134},"type",[128,630,631],{"class":161}," StoredProfile",[128,633,390],{"class":141},[128,635,152],{"class":141},[128,637,638,641,643],{"class":130,"line":320},[128,639,640],{"class":168},"  id",[128,642,172],{"class":141},[128,644,645],{"class":161}," string\n",[128,647,648,651,653],{"class":130,"line":333},[128,649,650],{"class":168},"  ownerId",[128,652,172],{"class":141},[128,654,645],{"class":161},[128,656,657,660,662],{"class":130,"line":339},[128,658,659],{"class":168},"  name",[128,661,172],{"class":141},[128,663,645],{"class":161},[128,665,666,669,671],{"class":130,"line":381},[128,667,668],{"class":168},"  email",[128,670,172],{"class":141},[128,672,645],{"class":161},[128,674,675,678,681],{"class":130,"line":420},[128,676,677],{"class":168},"  internalNote",[128,679,680],{"class":141},"?:",[128,682,645],{"class":161},[128,684,685],{"class":130,"line":442},[128,686,184],{"class":141},[128,688,689],{"class":130,"line":450},[128,690,251],{"emptyLinePlaceholder":250},[128,692,693,695,698],{"class":130,"line":495},[128,694,191],{"class":190},[128,696,697],{"class":190}," default",[128,699,700],{"class":224}," authActionClient\n",[128,702,703,706,709,712,714,717,719,721,724,726,728,730,733,735,737,740,742,744,747,749,751,753,755,757,759,762,764,766,769,771,775,777,779],{"class":130,"line":543},[128,704,705],{"class":141},"  .",[128,707,708],{"class":267},"schema",[128,710,711],{"class":224},"(z",[128,713,298],{"class":141},[128,715,716],{"class":267},"object",[128,718,270],{"class":224},[128,720,505],{"class":141},[128,722,723],{"class":168}," profileId",[128,725,172],{"class":141},[128,727,570],{"class":224},[128,729,298],{"class":141},[128,731,732],{"class":267},"string",[128,734,413],{"class":224},[128,736,298],{"class":141},[128,738,739],{"class":267},"uuid",[128,741,413],{"class":224},[128,743,228],{"class":141},[128,745,746],{"class":168}," name",[128,748,172],{"class":141},[128,750,570],{"class":224},[128,752,298],{"class":141},[128,754,732],{"class":267},[128,756,413],{"class":224},[128,758,298],{"class":141},[128,760,761],{"class":267},"trim",[128,763,413],{"class":224},[128,765,298],{"class":141},[128,767,768],{"class":267},"min",[128,770,270],{"class":224},[128,772,774],{"class":773},"sbssI","2",[128,776,475],{"class":224},[128,778,342],{"class":141},[128,780,781],{"class":224},"))\n",[128,783,785,787,790,792,794,796,798,800,802,804,806,808,810,812,814,816,818,820,822,824,827,829],{"class":130,"line":784},15,[128,786,705],{"class":141},[128,788,789],{"class":267},"outputSchema",[128,791,711],{"class":224},[128,793,298],{"class":141},[128,795,716],{"class":267},[128,797,270],{"class":224},[128,799,505],{"class":141},[128,801,169],{"class":168},[128,803,172],{"class":141},[128,805,570],{"class":224},[128,807,298],{"class":141},[128,809,732],{"class":267},[128,811,413],{"class":224},[128,813,228],{"class":141},[128,815,746],{"class":168},[128,817,172],{"class":141},[128,819,570],{"class":224},[128,821,298],{"class":141},[128,823,732],{"class":267},[128,825,826],{"class":224},"() ",[128,828,342],{"class":141},[128,830,781],{"class":224},[128,832,834,836,839,841,843,845,848,850,852,854,856],{"class":130,"line":833},16,[128,835,705],{"class":141},[128,837,838],{"class":267},"action",[128,840,270],{"class":224},[128,842,354],{"class":134},[128,844,357],{"class":141},[128,846,847],{"class":283}," parsedInput",[128,849,228],{"class":141},[128,851,360],{"class":283},[128,853,373],{"class":141},[128,855,376],{"class":134},[128,857,152],{"class":141},[128,859,861,864,867,869,872,874,876,879,881],{"class":130,"line":860},17,[128,862,863],{"class":134},"    const",[128,865,866],{"class":224}," storage",[128,868,390],{"class":141},[128,870,871],{"class":267}," useStorage",[128,873,270],{"class":168},[128,875,149],{"class":141},[128,877,878],{"class":145},"data",[128,880,149],{"class":141},[128,882,317],{"class":168},[128,884,886,888,891,893,896,899,902,905,907,910],{"class":130,"line":885},18,[128,887,863],{"class":134},[128,889,890],{"class":224}," key",[128,892,390],{"class":141},[128,894,895],{"class":141}," `",[128,897,898],{"class":145},"profiles:",[128,900,901],{"class":141},"${",[128,903,904],{"class":224},"parsedInput",[128,906,298],{"class":141},[128,908,909],{"class":224},"profileId",[128,911,912],{"class":141},"}`\n",[128,914,916,918,921,923,925,927,929,932,935,938,941,943,946],{"class":130,"line":915},19,[128,917,863],{"class":134},[128,919,920],{"class":224}," profile",[128,922,390],{"class":141},[128,924,393],{"class":190},[128,926,866],{"class":224},[128,928,298],{"class":141},[128,930,931],{"class":267},"getItem",[128,933,934],{"class":141},"\u003C",[128,936,937],{"class":161},"StoredProfile",[128,939,940],{"class":141},">",[128,942,270],{"class":168},[128,944,945],{"class":224},"key",[128,947,317],{"class":168},[128,949,951,954,956,958,961,964,966,968,971,974,976,978,981,983],{"class":130,"line":950},20,[128,952,953],{"class":190},"    if",[128,955,456],{"class":168},[128,957,459],{"class":141},[128,959,960],{"class":224},"profile",[128,962,963],{"class":141}," ||",[128,965,920],{"class":224},[128,967,298],{"class":141},[128,969,970],{"class":224},"ownerId",[128,972,973],{"class":141}," !==",[128,975,360],{"class":224},[128,977,298],{"class":141},[128,979,980],{"class":224},"userId",[128,982,475],{"class":168},[128,984,273],{"class":141},[128,986,988,991,993,995,997,999,1002,1004],{"class":130,"line":987},21,[128,989,990],{"class":190},"      throw",[128,992,426],{"class":141},[128,994,231],{"class":267},[128,996,270],{"class":168},[128,998,149],{"class":141},[128,1000,1001],{"class":145},"Profile not found",[128,1003,149],{"class":141},[128,1005,317],{"class":168},[128,1007,1009],{"class":130,"line":1008},22,[128,1010,1011],{"class":141},"    }\n",[128,1013,1015,1017,1020,1022,1024,1026,1028,1030,1032,1034,1036,1038,1041],{"class":130,"line":1014},23,[128,1016,863],{"class":134},[128,1018,1019],{"class":224}," updated",[128,1021,390],{"class":141},[128,1023,165],{"class":141},[128,1025,514],{"class":141},[128,1027,960],{"class":224},[128,1029,228],{"class":141},[128,1031,746],{"class":168},[128,1033,172],{"class":141},[128,1035,847],{"class":224},[128,1037,298],{"class":141},[128,1039,1040],{"class":224},"name",[128,1042,178],{"class":141},[128,1044,1046,1049,1051,1053,1056,1058,1060,1062,1064],{"class":130,"line":1045},24,[128,1047,1048],{"class":190},"    await",[128,1050,866],{"class":224},[128,1052,298],{"class":141},[128,1054,1055],{"class":267},"setItem",[128,1057,270],{"class":168},[128,1059,945],{"class":224},[128,1061,228],{"class":141},[128,1063,1019],{"class":224},[128,1065,317],{"class":168},[128,1067,1069,1071,1073,1075,1077,1079,1081,1083,1085,1087,1089,1091,1093,1095],{"class":130,"line":1068},25,[128,1070,323],{"class":190},[128,1072,165],{"class":141},[128,1074,169],{"class":168},[128,1076,172],{"class":141},[128,1078,1019],{"class":224},[128,1080,298],{"class":141},[128,1082,472],{"class":224},[128,1084,228],{"class":141},[128,1086,746],{"class":168},[128,1088,172],{"class":141},[128,1090,1019],{"class":224},[128,1092,298],{"class":141},[128,1094,1040],{"class":224},[128,1096,178],{"class":141},[128,1098,1100,1102],{"class":130,"line":1099},26,[128,1101,445],{"class":141},[128,1103,317],{"class":224},[102,1105,1106],{},"The owner comes from the verified session, not client input. Return an explicit public allowlist; output schemas validate the response but their unknown-key behavior depends on the validator/schema you choose. Persistent implementations should combine ownership and update in an atomic database operation to avoid authorization races.",[549,1108,1110],{"id":1109},"ssr-and-application-policy","SSR and application policy",[102,1112,1113,1114,1117,1118,1121,1122,298],{},"For authenticated SSR GET queries, forward only needed request headers, such as ",[125,1115,1116],{},"cookie",", with ",[125,1119,1120],{},"useRequestHeaders(['cookie'])",". Browser fetch sends same-origin cookies normally. See ",[109,1123,1124],{"href":29},"queries",[102,1126,1127,1128,1130],{},"The module does not install a CSRF strategy or rate limiter. Configure those for your application's cookie/session/deployment model. ",[125,1129,207],{}," produces an application error envelope, not a promise of a particular HTTP status. Never expose session secrets or raw database failures to the client.",[1132,1133,1134],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":123,"searchDepth":155,"depth":155,"links":1136},[1137,1138],{"id":551,"depth":155,"text":552},{"id":1109,"depth":155,"text":1110},"Authenticate actions with nuxt-auth-utils, enforce ownership, and return public output fields.","md",null,{},{"title":60,"description":1139},"UnqIWa1Tesc9tr1I5ARLVHzoq5mRilHveMPvHqGTVSU",[1146,1148],{"title":56,"path":57,"stem":58,"description":1147,"children":-1},"Typed HTML forms, nested field errors, root errors, and Nuxt UI integration.",{"title":64,"path":65,"stem":66,"description":1149,"children":-1},"Apply immutable optimistic state, replace pending mutations, and reconcile authoritative data.",1791798655230]