[{"data":1,"prerenderedAt":808},["ShallowReactive",2],{"navigation_docs":3,"-guide-queries":91,"-guide-queries-surround":803},[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":28,"body":93,"description":797,"extension":798,"links":799,"meta":800,"navigation":162,"path":29,"seo":801,"stem":30,"__hash__":802},"docs/2.guide/10.queries.md",{"type":94,"value":95,"toc":795},"minimark",[96,101,114,220,757,764,773,776,791],[97,98,100],"h1",{"id":99},"get-queries-with-nuxt","GET queries with Nuxt",[102,103,104,105,109,110,113],"p",{},"Use a ",[106,107,108],"code",{},".get.ts"," action for reads, and compose it with Nuxt's existing ",[106,111,112],{},"useAsyncData"," for SSR payload reuse, refresh, and hydration. The module does not introduce a separate cache.",[115,116,122],"pre",{"className":117,"code":118,"filename":119,"language":120,"meta":121,"style":121},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createSafeActionClient } from '#safe-action'\n\nexport default createSafeActionClient().action(() => ({ status: 'ready' }))\n","server/actions/get-stats.get.ts","ts","",[106,123,124,157,164],{"__ignoreMap":121},[125,126,129,133,137,141,144,147,150,154],"span",{"class":127,"line":128},"line",1,[125,130,132],{"class":131},"s7zQu","import",[125,134,136],{"class":135},"sMK4o"," {",[125,138,140],{"class":139},"sTEyZ"," createSafeActionClient",[125,142,143],{"class":135}," }",[125,145,146],{"class":131}," from",[125,148,149],{"class":135}," '",[125,151,153],{"class":152},"sfazB","#safe-action",[125,155,156],{"class":135},"'\n",[125,158,160],{"class":127,"line":159},2,[125,161,163],{"emptyLinePlaceholder":162},true,"\n",[125,165,167,170,173,176,179,182,185,188,190,194,197,200,204,207,209,212,215,217],{"class":127,"line":166},3,[125,168,169],{"class":131},"export",[125,171,172],{"class":131}," default",[125,174,140],{"class":175},"s2Zo4",[125,177,178],{"class":139},"()",[125,180,181],{"class":135},".",[125,183,184],{"class":175},"action",[125,186,187],{"class":139},"(",[125,189,178],{"class":135},[125,191,193],{"class":192},"spNyl"," =>",[125,195,196],{"class":139}," (",[125,198,199],{"class":135},"{",[125,201,203],{"class":202},"swJcz"," status",[125,205,206],{"class":135},":",[125,208,149],{"class":135},[125,210,211],{"class":152},"ready",[125,213,214],{"class":135},"'",[125,216,143],{"class":135},[125,218,219],{"class":139},"))\n",[115,221,225],{"className":222,"code":223,"language":224,"meta":121,"style":121},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { getStats } from '#safe-action/actions'\n\n// During SSR, forward only the headers the action needs. On the client this is {}.\nconst headers = useRequestHeaders(['cookie'])\nconst action = useAction(getStats, { headers })\n\nconst { data, error, status, refresh } = await useAsyncData('action:stats', async () => {\n  const result = await action.executeAsync(undefined)\n  if (result.serverError !== undefined || result.validationErrors !== undefined) {\n    throw createError({ statusCode: 500, statusMessage: 'Unable to load stats' })\n  }\n  // This read action returns an object; useAsyncData handlers should return defined data.\n  if (result.data === undefined) throw createError({ statusCode: 500, statusMessage: 'Missing stats' })\n  return result.data\n})\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cp v-if=\"status === 'pending'\">Loading…\u003C/p>\n  \u003Cp v-else-if=\"error\" role=\"alert\">Unable to load stats\u003C/p>\n  \u003Cp v-else>{{ data?.status }}\u003C/p>\n  \u003Cbutton @click=\"refresh()\">Refresh\u003C/button>\n\u003C/template>\n","vue",[106,226,227,254,274,278,285,312,341,346,403,431,473,513,519,525,578,591,598,608,613,623,655,696,717,748],{"__ignoreMap":121},[125,228,229,232,235,238,241,244,247,249,251],{"class":127,"line":128},[125,230,231],{"class":135},"\u003C",[125,233,234],{"class":202},"script",[125,236,237],{"class":192}," setup",[125,239,240],{"class":192}," lang",[125,242,243],{"class":135},"=",[125,245,246],{"class":135},"\"",[125,248,120],{"class":152},[125,250,246],{"class":135},[125,252,253],{"class":135},">\n",[125,255,256,258,260,263,265,267,269,272],{"class":127,"line":159},[125,257,132],{"class":131},[125,259,136],{"class":135},[125,261,262],{"class":139}," getStats",[125,264,143],{"class":135},[125,266,146],{"class":131},[125,268,149],{"class":135},[125,270,271],{"class":152},"#safe-action/actions",[125,273,156],{"class":135},[125,275,276],{"class":127,"line":166},[125,277,163],{"emptyLinePlaceholder":162},[125,279,281],{"class":127,"line":280},4,[125,282,284],{"class":283},"sHwdD","// During SSR, forward only the headers the action needs. On the client this is {}.\n",[125,286,288,291,294,296,299,302,304,307,309],{"class":127,"line":287},5,[125,289,290],{"class":192},"const",[125,292,293],{"class":139}," headers ",[125,295,243],{"class":135},[125,297,298],{"class":175}," useRequestHeaders",[125,300,301],{"class":139},"([",[125,303,214],{"class":135},[125,305,306],{"class":152},"cookie",[125,308,214],{"class":135},[125,310,311],{"class":139},"])\n",[125,313,315,317,320,322,325,328,331,333,335,338],{"class":127,"line":314},6,[125,316,290],{"class":192},[125,318,319],{"class":139}," action ",[125,321,243],{"class":135},[125,323,324],{"class":175}," useAction",[125,326,327],{"class":139},"(getStats",[125,329,330],{"class":135},",",[125,332,136],{"class":135},[125,334,293],{"class":139},[125,336,337],{"class":135},"}",[125,339,340],{"class":139},")\n",[125,342,344],{"class":127,"line":343},7,[125,345,163],{"emptyLinePlaceholder":162},[125,347,349,351,353,356,358,361,363,365,367,370,372,375,378,381,383,385,388,390,392,395,398,400],{"class":127,"line":348},8,[125,350,290],{"class":192},[125,352,136],{"class":135},[125,354,355],{"class":139}," data",[125,357,330],{"class":135},[125,359,360],{"class":139}," error",[125,362,330],{"class":135},[125,364,203],{"class":139},[125,366,330],{"class":135},[125,368,369],{"class":139}," refresh ",[125,371,337],{"class":135},[125,373,374],{"class":135}," =",[125,376,377],{"class":131}," await",[125,379,380],{"class":175}," useAsyncData",[125,382,187],{"class":139},[125,384,214],{"class":135},[125,386,387],{"class":152},"action:stats",[125,389,214],{"class":135},[125,391,330],{"class":135},[125,393,394],{"class":192}," async",[125,396,397],{"class":135}," ()",[125,399,193],{"class":192},[125,401,402],{"class":135}," {\n",[125,404,406,409,412,414,416,419,421,424,426,429],{"class":127,"line":405},9,[125,407,408],{"class":192},"  const",[125,410,411],{"class":139}," result",[125,413,374],{"class":135},[125,415,377],{"class":131},[125,417,418],{"class":139}," action",[125,420,181],{"class":135},[125,422,423],{"class":175},"executeAsync",[125,425,187],{"class":202},[125,427,428],{"class":135},"undefined",[125,430,340],{"class":202},[125,432,434,437,439,442,444,447,450,453,456,458,460,463,465,467,470],{"class":127,"line":433},10,[125,435,436],{"class":131},"  if",[125,438,196],{"class":202},[125,440,441],{"class":139},"result",[125,443,181],{"class":135},[125,445,446],{"class":139},"serverError",[125,448,449],{"class":135}," !==",[125,451,452],{"class":135}," undefined",[125,454,455],{"class":135}," ||",[125,457,411],{"class":139},[125,459,181],{"class":135},[125,461,462],{"class":139},"validationErrors",[125,464,449],{"class":135},[125,466,452],{"class":135},[125,468,469],{"class":202},") ",[125,471,472],{"class":135},"{\n",[125,474,476,479,482,484,486,489,491,495,497,500,502,504,507,509,511],{"class":127,"line":475},11,[125,477,478],{"class":131},"    throw",[125,480,481],{"class":175}," createError",[125,483,187],{"class":202},[125,485,199],{"class":135},[125,487,488],{"class":202}," statusCode",[125,490,206],{"class":135},[125,492,494],{"class":493},"sbssI"," 500",[125,496,330],{"class":135},[125,498,499],{"class":202}," statusMessage",[125,501,206],{"class":135},[125,503,149],{"class":135},[125,505,506],{"class":152},"Unable to load stats",[125,508,214],{"class":135},[125,510,143],{"class":135},[125,512,340],{"class":202},[125,514,516],{"class":127,"line":515},12,[125,517,518],{"class":135},"  }\n",[125,520,522],{"class":127,"line":521},13,[125,523,524],{"class":283},"  // This read action returns an object; useAsyncData handlers should return defined data.\n",[125,526,528,530,532,534,536,539,542,544,546,549,551,553,555,557,559,561,563,565,567,569,572,574,576],{"class":127,"line":527},14,[125,529,436],{"class":131},[125,531,196],{"class":202},[125,533,441],{"class":139},[125,535,181],{"class":135},[125,537,538],{"class":139},"data",[125,540,541],{"class":135}," ===",[125,543,452],{"class":135},[125,545,469],{"class":202},[125,547,548],{"class":131},"throw",[125,550,481],{"class":175},[125,552,187],{"class":202},[125,554,199],{"class":135},[125,556,488],{"class":202},[125,558,206],{"class":135},[125,560,494],{"class":493},[125,562,330],{"class":135},[125,564,499],{"class":202},[125,566,206],{"class":135},[125,568,149],{"class":135},[125,570,571],{"class":152},"Missing stats",[125,573,214],{"class":135},[125,575,143],{"class":135},[125,577,340],{"class":202},[125,579,581,584,586,588],{"class":127,"line":580},15,[125,582,583],{"class":131},"  return",[125,585,411],{"class":139},[125,587,181],{"class":135},[125,589,590],{"class":139},"data\n",[125,592,594,596],{"class":127,"line":593},16,[125,595,337],{"class":135},[125,597,340],{"class":139},[125,599,601,604,606],{"class":127,"line":600},17,[125,602,603],{"class":135},"\u003C/",[125,605,234],{"class":202},[125,607,253],{"class":135},[125,609,611],{"class":127,"line":610},18,[125,612,163],{"emptyLinePlaceholder":162},[125,614,616,618,621],{"class":127,"line":615},19,[125,617,231],{"class":135},[125,619,620],{"class":202},"template",[125,622,253],{"class":135},[125,624,626,629,631,634,636,638,641,643,646,649,651,653],{"class":127,"line":625},20,[125,627,628],{"class":135},"  \u003C",[125,630,102],{"class":202},[125,632,633],{"class":192}," v-if",[125,635,243],{"class":135},[125,637,246],{"class":135},[125,639,640],{"class":152},"status === 'pending'",[125,642,246],{"class":135},[125,644,645],{"class":135},">",[125,647,648],{"class":139},"Loading…",[125,650,603],{"class":135},[125,652,102],{"class":202},[125,654,253],{"class":135},[125,656,658,660,662,665,667,669,672,674,677,679,681,684,686,688,690,692,694],{"class":127,"line":657},21,[125,659,628],{"class":135},[125,661,102],{"class":202},[125,663,664],{"class":192}," v-else-if",[125,666,243],{"class":135},[125,668,246],{"class":135},[125,670,671],{"class":152},"error",[125,673,246],{"class":135},[125,675,676],{"class":192}," role",[125,678,243],{"class":135},[125,680,246],{"class":135},[125,682,683],{"class":152},"alert",[125,685,246],{"class":135},[125,687,645],{"class":135},[125,689,506],{"class":139},[125,691,603],{"class":135},[125,693,102],{"class":202},[125,695,253],{"class":135},[125,697,699,701,703,706,708,711,713,715],{"class":127,"line":698},22,[125,700,628],{"class":135},[125,702,102],{"class":202},[125,704,705],{"class":192}," v-else",[125,707,645],{"class":135},[125,709,710],{"class":139},"{{ data?.status }}",[125,712,603],{"class":135},[125,714,102],{"class":202},[125,716,253],{"class":135},[125,718,720,722,725,728,730,732,735,737,739,742,744,746],{"class":127,"line":719},23,[125,721,628],{"class":135},[125,723,724],{"class":202},"button",[125,726,727],{"class":192}," @click",[125,729,243],{"class":135},[125,731,246],{"class":135},[125,733,734],{"class":152},"refresh()",[125,736,246],{"class":135},[125,738,645],{"class":135},[125,740,741],{"class":139},"Refresh",[125,743,603],{"class":135},[125,745,724],{"class":202},[125,747,253],{"class":135},[125,749,751,753,755],{"class":127,"line":750},24,[125,752,603],{"class":135},[125,754,620],{"class":202},[125,756,253],{"class":135},[102,758,759,760,763],{},"The example is an unauthenticated read, but the allowlisted cookie-forwarding pattern also applies to authenticated actions. Server-side global ",[106,761,762],{},"$fetch"," does not automatically forward the current browser request's cookies. Do not forward all incoming headers wholesale. Use the default transport on the server; detached browser fetch cannot resolve a relative URL in every server runtime.",[102,765,766,767,769,770,772],{},"For input-dependent reads, include stable serialized input in the ",[106,768,112],{}," key or use Nuxt's reactive key/watch options. Return only defined successful data. A void mutation is not a useful query handler. Nuxt owns the cached query data; ",[106,771,40],{}," state is execution-local and is not hydrated query state.",[102,774,775],{},"Keep mutations POST/PUT/PATCH/DELETE and refresh relevant Nuxt keys after success. This module disables automatic transport retries; application retry policy and idempotency remain explicit.",[102,777,778,785,786],{},[779,780,784],"a",{"href":781,"rel":782},"https://nuxt.com/docs/4.x/api/composables/use-async-data",[783],"nofollow","Nuxt useAsyncData"," · ",[779,787,790],{"href":788,"rel":789},"https://nuxt.com/docs/4.x/api/composables/use-request-headers",[783],"Nuxt request headers",[792,793,794],"style",{},"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 pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":121,"searchDepth":159,"depth":159,"links":796},[],"Compose GET actions with Nuxt useAsyncData and forward needed authentication headers during SSR.","md",null,{},{"title":28,"description":797},"LMNy-yMTdcS3Z7mSWjX-gUFyWmLpcSVL1lkp2A_Mqq0",[804,806],{"title":24,"path":25,"stem":26,"description":805,"children":-1},"Compose immutable action builders with generic unexpected-error handling and typed middleware.",{"title":32,"path":33,"stem":34,"description":807,"children":-1},"Choose between direct Nuxt HTTP routes, nuxt-safe-action, and the broader nuxt-actions toolkit.",1791798654376]