[{"data":1,"prerenderedAt":1838},["ShallowReactive",2],{"navigation_docs":3,"-guide-validation":91,"-guide-validation-surround":1833},[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":52,"body":93,"description":1827,"extension":1828,"links":1829,"meta":1830,"navigation":255,"path":53,"seo":1831,"stem":54,"__hash__":1832},"docs/2.guide/6.validation.md",{"type":94,"value":95,"toc":1819},"minimark",[96,100,112,174,177,409,548,553,568,901,928,943,976,981,1286,1289,1309,1312,1316,1576,1591,1595,1775,1781,1785,1788,1815],[97,98,52],"h1",{"id":99},"validation",[101,102,103,107,108,111],"p",{},[104,105,106],"code",{},".schema()"," and ",[104,109,110],{},".outputSchema()"," accept Standard Schema v1 validators. Zod 3.20+ remains supported through async legacy parsing when Standard Schema is unavailable. The module does not bundle a validator runtime.",[113,114,115,128],"table",{},[116,117,118],"thead",{},[119,120,121,125],"tr",{},[122,123,124],"th",{},"Validator",[122,126,127],{},"Integration",[129,130,131,143,151,158,166],"tbody",{},[119,132,133,137],{},[134,135,136],"td",{},"Zod 3.20–3.23",[134,138,139,140],{},"Legacy ",[104,141,142],{},"safeParseAsync",[119,144,145,148],{},[134,146,147],{},"Zod 3.24+ / Zod 4",[134,149,150],{},"Standard Schema v1",[119,152,153,156],{},[134,154,155],{},"Valibot / ArkType",[134,157,150],{},[119,159,160,163],{},[134,161,162],{},"Yup 1.7+",[134,164,165],{},"Native Standard Schema v1",[119,167,168,171],{},[134,169,170],{},"Other validators",[134,172,173],{},"Must implement Standard Schema v1",[101,175,176],{},"Install the validator separately. CI includes real Zod, Valibot, ArkType, and Yup schema tests; a custom Standard Schema implementation should preserve its declared input/output types and return issues rather than throw for expected validation failures.",[178,179,184],"pre",{"className":180,"code":181,"language":182,"meta":183,"style":183},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// pnpm add valibot\nimport * as v from 'valibot'\nimport { createSafeActionClient } from '#safe-action'\n\nexport default createSafeActionClient()\n  .schema(v.object({ name: v.pipe(v.string(), v.minLength(1)) }))\n  .action(({ parsedInput }) => ({ greeting: `Hello, ${parsedInput.name}!` }))\n","ts","",[104,185,186,195,226,250,257,272,346],{"__ignoreMap":183},[187,188,191],"span",{"class":189,"line":190},"line",1,[187,192,194],{"class":193},"sHwdD","// pnpm add valibot\n",[187,196,198,202,206,209,213,216,219,223],{"class":189,"line":197},2,[187,199,201],{"class":200},"s7zQu","import",[187,203,205],{"class":204},"sMK4o"," *",[187,207,208],{"class":200}," as",[187,210,212],{"class":211},"sTEyZ"," v ",[187,214,215],{"class":200},"from",[187,217,218],{"class":204}," '",[187,220,222],{"class":221},"sfazB","valibot",[187,224,225],{"class":204},"'\n",[187,227,229,231,234,237,240,243,245,248],{"class":189,"line":228},3,[187,230,201],{"class":200},[187,232,233],{"class":204}," {",[187,235,236],{"class":211}," createSafeActionClient",[187,238,239],{"class":204}," }",[187,241,242],{"class":200}," from",[187,244,218],{"class":204},[187,246,247],{"class":221},"#safe-action",[187,249,225],{"class":204},[187,251,253],{"class":189,"line":252},4,[187,254,256],{"emptyLinePlaceholder":255},true,"\n",[187,258,260,263,266,269],{"class":189,"line":259},5,[187,261,262],{"class":200},"export",[187,264,265],{"class":200}," default",[187,267,236],{"class":268},"s2Zo4",[187,270,271],{"class":211},"()\n",[187,273,275,278,281,284,287,290,293,296,300,303,306,308,311,313,315,318,321,324,326,328,331,333,337,340,343],{"class":189,"line":274},6,[187,276,277],{"class":204},"  .",[187,279,280],{"class":268},"schema",[187,282,283],{"class":211},"(v",[187,285,286],{"class":204},".",[187,288,289],{"class":268},"object",[187,291,292],{"class":211},"(",[187,294,295],{"class":204},"{",[187,297,299],{"class":298},"swJcz"," name",[187,301,302],{"class":204},":",[187,304,305],{"class":211}," v",[187,307,286],{"class":204},[187,309,310],{"class":268},"pipe",[187,312,283],{"class":211},[187,314,286],{"class":204},[187,316,317],{"class":268},"string",[187,319,320],{"class":211},"()",[187,322,323],{"class":204},",",[187,325,305],{"class":211},[187,327,286],{"class":204},[187,329,330],{"class":268},"minLength",[187,332,292],{"class":211},[187,334,336],{"class":335},"sbssI","1",[187,338,339],{"class":211},")) ",[187,341,342],{"class":204},"}",[187,344,345],{"class":211},"))\n",[187,347,349,351,354,356,359,363,366,370,373,375,378,380,383,386,389,392,394,397,399,402,405,407],{"class":189,"line":348},7,[187,350,277],{"class":204},[187,352,353],{"class":268},"action",[187,355,292],{"class":211},[187,357,358],{"class":204},"({",[187,360,362],{"class":361},"sHdIc"," parsedInput",[187,364,365],{"class":204}," })",[187,367,369],{"class":368},"spNyl"," =>",[187,371,372],{"class":211}," (",[187,374,295],{"class":204},[187,376,377],{"class":298}," greeting",[187,379,302],{"class":204},[187,381,382],{"class":204}," `",[187,384,385],{"class":221},"Hello, ",[187,387,388],{"class":204},"${",[187,390,391],{"class":211},"parsedInput",[187,393,286],{"class":204},[187,395,396],{"class":211},"name",[187,398,342],{"class":204},[187,400,401],{"class":221},"!",[187,403,404],{"class":204},"`",[187,406,239],{"class":204},[187,408,345],{"class":211},[178,410,412],{"className":180,"code":411,"language":182,"meta":183,"style":183},"// pnpm add arktype\nimport { type } from 'arktype'\nimport { createSafeActionClient } from '#safe-action'\n\nexport default createSafeActionClient()\n  .schema(type({ name: 'string > 0' }))\n  .action(({ parsedInput }) => ({ greeting: `Hello, ${parsedInput.name}!` }))\n",[104,413,414,419,439,457,461,471,502],{"__ignoreMap":183},[187,415,416],{"class":189,"line":190},[187,417,418],{"class":193},"// pnpm add arktype\n",[187,420,421,423,425,428,430,432,434,437],{"class":189,"line":197},[187,422,201],{"class":200},[187,424,233],{"class":204},[187,426,427],{"class":211}," type",[187,429,239],{"class":204},[187,431,242],{"class":200},[187,433,218],{"class":204},[187,435,436],{"class":221},"arktype",[187,438,225],{"class":204},[187,440,441,443,445,447,449,451,453,455],{"class":189,"line":228},[187,442,201],{"class":200},[187,444,233],{"class":204},[187,446,236],{"class":211},[187,448,239],{"class":204},[187,450,242],{"class":200},[187,452,218],{"class":204},[187,454,247],{"class":221},[187,456,225],{"class":204},[187,458,459],{"class":189,"line":252},[187,460,256],{"emptyLinePlaceholder":255},[187,462,463,465,467,469],{"class":189,"line":259},[187,464,262],{"class":200},[187,466,265],{"class":200},[187,468,236],{"class":268},[187,470,271],{"class":211},[187,472,473,475,477,479,482,484,486,488,490,492,495,498,500],{"class":189,"line":274},[187,474,277],{"class":204},[187,476,280],{"class":268},[187,478,292],{"class":211},[187,480,481],{"class":268},"type",[187,483,292],{"class":211},[187,485,295],{"class":204},[187,487,299],{"class":298},[187,489,302],{"class":204},[187,491,218],{"class":204},[187,493,494],{"class":221},"string > 0",[187,496,497],{"class":204},"'",[187,499,239],{"class":204},[187,501,345],{"class":211},[187,503,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546],{"class":189,"line":348},[187,505,277],{"class":204},[187,507,353],{"class":268},[187,509,292],{"class":211},[187,511,358],{"class":204},[187,513,362],{"class":361},[187,515,365],{"class":204},[187,517,369],{"class":368},[187,519,372],{"class":211},[187,521,295],{"class":204},[187,523,377],{"class":298},[187,525,302],{"class":204},[187,527,382],{"class":204},[187,529,385],{"class":221},[187,531,388],{"class":204},[187,533,391],{"class":211},[187,535,286],{"class":204},[187,537,396],{"class":211},[187,539,342],{"class":204},[187,541,401],{"class":221},[187,543,404],{"class":204},[187,545,239],{"class":204},[187,547,345],{"class":211},[549,550,552],"h2",{"id":551},"yup","Yup",[101,554,555,556,559,560,567],{},"Install ",[104,557,558],{},"yup@^1.7.0"," or newer. ",[561,562,566],"a",{"href":563,"rel":564},"https://github.com/jquense/yup/blob/master/CHANGELOG.md#170-2025-08-01",[565],"nofollow","Yup 1.7.0 introduced native Standard Schema support",", so pass Yup schemas directly to the existing builder. No adapter, global validator setting, or mandatory module dependency is needed.",[178,569,572],{"className":180,"code":570,"filename":571,"language":182,"meta":183,"style":183},"import * as yup from 'yup'\nimport { createSafeActionClient } from '#safe-action'\n\nexport default createSafeActionClient()\n  .schema(yup.object({\n    name: yup.string().trim().min(2).required(),\n    age: yup.number().integer().min(18).required(),\n  }).required())\n  .outputSchema(yup.object({\n    name: yup.string().trim().required(),\n    age: yup.number().integer().required(),\n  }).stripUnknown().required())\n  .action(({ parsedInput }) => ({\n    name: parsedInput.name,\n    age: parsedInput.age,\n  }))\n","server/actions/update-account.ts",[104,573,574,593,611,615,625,643,689,731,746,764,793,822,842,863,878,894],{"__ignoreMap":183},[187,575,576,578,580,582,585,587,589,591],{"class":189,"line":190},[187,577,201],{"class":200},[187,579,205],{"class":204},[187,581,208],{"class":200},[187,583,584],{"class":211}," yup ",[187,586,215],{"class":200},[187,588,218],{"class":204},[187,590,551],{"class":221},[187,592,225],{"class":204},[187,594,595,597,599,601,603,605,607,609],{"class":189,"line":197},[187,596,201],{"class":200},[187,598,233],{"class":204},[187,600,236],{"class":211},[187,602,239],{"class":204},[187,604,242],{"class":200},[187,606,218],{"class":204},[187,608,247],{"class":221},[187,610,225],{"class":204},[187,612,613],{"class":189,"line":228},[187,614,256],{"emptyLinePlaceholder":255},[187,616,617,619,621,623],{"class":189,"line":252},[187,618,262],{"class":200},[187,620,265],{"class":200},[187,622,236],{"class":268},[187,624,271],{"class":211},[187,626,627,629,631,634,636,638,640],{"class":189,"line":259},[187,628,277],{"class":204},[187,630,280],{"class":268},[187,632,633],{"class":211},"(yup",[187,635,286],{"class":204},[187,637,289],{"class":268},[187,639,292],{"class":211},[187,641,642],{"class":204},"{\n",[187,644,645,648,650,653,655,657,659,661,664,666,668,671,673,676,679,681,684,686],{"class":189,"line":274},[187,646,647],{"class":298},"    name",[187,649,302],{"class":204},[187,651,652],{"class":211}," yup",[187,654,286],{"class":204},[187,656,317],{"class":268},[187,658,320],{"class":211},[187,660,286],{"class":204},[187,662,663],{"class":268},"trim",[187,665,320],{"class":211},[187,667,286],{"class":204},[187,669,670],{"class":268},"min",[187,672,292],{"class":211},[187,674,675],{"class":335},"2",[187,677,678],{"class":211},")",[187,680,286],{"class":204},[187,682,683],{"class":268},"required",[187,685,320],{"class":211},[187,687,688],{"class":204},",\n",[187,690,691,694,696,698,700,703,705,707,710,712,714,716,718,721,723,725,727,729],{"class":189,"line":348},[187,692,693],{"class":298},"    age",[187,695,302],{"class":204},[187,697,652],{"class":211},[187,699,286],{"class":204},[187,701,702],{"class":268},"number",[187,704,320],{"class":211},[187,706,286],{"class":204},[187,708,709],{"class":268},"integer",[187,711,320],{"class":211},[187,713,286],{"class":204},[187,715,670],{"class":268},[187,717,292],{"class":211},[187,719,720],{"class":335},"18",[187,722,678],{"class":211},[187,724,286],{"class":204},[187,726,683],{"class":268},[187,728,320],{"class":211},[187,730,688],{"class":204},[187,732,734,737,739,741,743],{"class":189,"line":733},8,[187,735,736],{"class":204},"  }",[187,738,678],{"class":211},[187,740,286],{"class":204},[187,742,683],{"class":268},[187,744,745],{"class":211},"())\n",[187,747,749,751,754,756,758,760,762],{"class":189,"line":748},9,[187,750,277],{"class":204},[187,752,753],{"class":268},"outputSchema",[187,755,633],{"class":211},[187,757,286],{"class":204},[187,759,289],{"class":268},[187,761,292],{"class":211},[187,763,642],{"class":204},[187,765,767,769,771,773,775,777,779,781,783,785,787,789,791],{"class":189,"line":766},10,[187,768,647],{"class":298},[187,770,302],{"class":204},[187,772,652],{"class":211},[187,774,286],{"class":204},[187,776,317],{"class":268},[187,778,320],{"class":211},[187,780,286],{"class":204},[187,782,663],{"class":268},[187,784,320],{"class":211},[187,786,286],{"class":204},[187,788,683],{"class":268},[187,790,320],{"class":211},[187,792,688],{"class":204},[187,794,796,798,800,802,804,806,808,810,812,814,816,818,820],{"class":189,"line":795},11,[187,797,693],{"class":298},[187,799,302],{"class":204},[187,801,652],{"class":211},[187,803,286],{"class":204},[187,805,702],{"class":268},[187,807,320],{"class":211},[187,809,286],{"class":204},[187,811,709],{"class":268},[187,813,320],{"class":211},[187,815,286],{"class":204},[187,817,683],{"class":268},[187,819,320],{"class":211},[187,821,688],{"class":204},[187,823,825,827,829,831,834,836,838,840],{"class":189,"line":824},12,[187,826,736],{"class":204},[187,828,678],{"class":211},[187,830,286],{"class":204},[187,832,833],{"class":268},"stripUnknown",[187,835,320],{"class":211},[187,837,286],{"class":204},[187,839,683],{"class":268},[187,841,745],{"class":211},[187,843,845,847,849,851,853,855,857,859,861],{"class":189,"line":844},13,[187,846,277],{"class":204},[187,848,353],{"class":268},[187,850,292],{"class":211},[187,852,358],{"class":204},[187,854,362],{"class":361},[187,856,365],{"class":204},[187,858,369],{"class":368},[187,860,372],{"class":211},[187,862,642],{"class":204},[187,864,866,868,870,872,874,876],{"class":189,"line":865},14,[187,867,647],{"class":298},[187,869,302],{"class":204},[187,871,362],{"class":211},[187,873,286],{"class":204},[187,875,396],{"class":211},[187,877,688],{"class":204},[187,879,881,883,885,887,889,892],{"class":189,"line":880},15,[187,882,693],{"class":298},[187,884,302],{"class":204},[187,886,362],{"class":211},[187,888,286],{"class":204},[187,890,891],{"class":211},"age",[187,893,688],{"class":204},[187,895,897,899],{"class":189,"line":896},16,[187,898,736],{"class":204},[187,900,345],{"class":211},[101,902,903,904,908,909,107,912,915,916,919,920,923,924,927],{},"The client and handler use Yup's ",[905,906,907],"strong",{},"declared"," types: in this example, ",[104,910,911],{},"name: string",[104,913,914],{},"age: number",". Yup casts/transforms values during normal validation, so a raw HTTP numeric string may be accepted and cast at runtime. That does ",[905,917,918],{},"not"," widen the inferred typed client input to ",[104,921,922],{},"string | number","; send a number from typed client code. Arbitrary Yup ",[104,925,926],{},".transform()"," callbacks also do not automatically advertise a different TypeScript output type. Use schema-declared input/output types when assessing inference.",[101,929,930,931,934,935,938,939,942],{},"The output schema trims the name and removes unknown output properties with ",[104,932,933],{},".stripUnknown()",". Yup also supports ",[104,936,937],{},".strip()"," on individual object fields. Unknown-key behavior is schema-specific: use an explicit public return allowlist as above, rather than assuming every validator strips fields. ",[104,940,941],{},".strict()"," disables normal casting/transforms/default application; choose it when you want to require already-parsed values.",[101,944,945,946,949,950,953,954,956,957,960,961,964,965,968,969,971,972,975],{},"In strict mode, do not rely on a default or its inferred non-optional type to guarantee a value exists: ",[104,947,948],{},"yup.number().default(2).strict()"," can validate ",[104,951,952],{},"undefined"," to ",[104,955,952],{}," while declaring a number output. Use ",[104,958,959],{},".defined()"," or ",[104,962,963],{},".required()"," when existence is required, for example ",[104,966,967],{},"yup.number().strict().defined()",". Strict validation also skips stripping transforms such as ",[104,970,933],{},"; use ",[104,973,974],{},".noUnknown().strict()"," to reject extra object keys rather than expecting them to be removed. These are Yup schema semantics, so select an explicit schema contract instead of adding an adapter.",[977,978,980],"h3",{"id":979},"defaults-and-asynchronous-tests","Defaults and asynchronous tests",[178,982,985],{"className":180,"code":983,"filename":984,"language":182,"meta":183,"style":183},"import * as yup from 'yup'\nimport { createSafeActionClient } from '#safe-action'\n\nexport default createSafeActionClient()\n  .schema(yup.object({\n    name: yup.string().trim().required().test(\n      'available',\n      'This name is reserved',\n      async (name) => {\n        // Demonstration rule; replace with your own application lookup.\n        await Promise.resolve()\n        return name.toLowerCase() !== 'admin'\n      },\n    ),\n    newsletter: yup.boolean().default(false),\n  }).required())\n  .action(({ parsedInput }) => ({\n    name: parsedInput.name,\n    newsletter: parsedInput.newsletter,\n  }))\n","server/actions/check-name.ts",[104,986,987,1005,1023,1027,1037,1053,1087,1099,1110,1126,1131,1147,1172,1177,1184,1215,1227,1248,1263,1279],{"__ignoreMap":183},[187,988,989,991,993,995,997,999,1001,1003],{"class":189,"line":190},[187,990,201],{"class":200},[187,992,205],{"class":204},[187,994,208],{"class":200},[187,996,584],{"class":211},[187,998,215],{"class":200},[187,1000,218],{"class":204},[187,1002,551],{"class":221},[187,1004,225],{"class":204},[187,1006,1007,1009,1011,1013,1015,1017,1019,1021],{"class":189,"line":197},[187,1008,201],{"class":200},[187,1010,233],{"class":204},[187,1012,236],{"class":211},[187,1014,239],{"class":204},[187,1016,242],{"class":200},[187,1018,218],{"class":204},[187,1020,247],{"class":221},[187,1022,225],{"class":204},[187,1024,1025],{"class":189,"line":228},[187,1026,256],{"emptyLinePlaceholder":255},[187,1028,1029,1031,1033,1035],{"class":189,"line":252},[187,1030,262],{"class":200},[187,1032,265],{"class":200},[187,1034,236],{"class":268},[187,1036,271],{"class":211},[187,1038,1039,1041,1043,1045,1047,1049,1051],{"class":189,"line":259},[187,1040,277],{"class":204},[187,1042,280],{"class":268},[187,1044,633],{"class":211},[187,1046,286],{"class":204},[187,1048,289],{"class":268},[187,1050,292],{"class":211},[187,1052,642],{"class":204},[187,1054,1055,1057,1059,1061,1063,1065,1067,1069,1071,1073,1075,1077,1079,1081,1084],{"class":189,"line":274},[187,1056,647],{"class":298},[187,1058,302],{"class":204},[187,1060,652],{"class":211},[187,1062,286],{"class":204},[187,1064,317],{"class":268},[187,1066,320],{"class":211},[187,1068,286],{"class":204},[187,1070,663],{"class":268},[187,1072,320],{"class":211},[187,1074,286],{"class":204},[187,1076,683],{"class":268},[187,1078,320],{"class":211},[187,1080,286],{"class":204},[187,1082,1083],{"class":268},"test",[187,1085,1086],{"class":211},"(\n",[187,1088,1089,1092,1095,1097],{"class":189,"line":348},[187,1090,1091],{"class":204},"      '",[187,1093,1094],{"class":221},"available",[187,1096,497],{"class":204},[187,1098,688],{"class":204},[187,1100,1101,1103,1106,1108],{"class":189,"line":733},[187,1102,1091],{"class":204},[187,1104,1105],{"class":221},"This name is reserved",[187,1107,497],{"class":204},[187,1109,688],{"class":204},[187,1111,1112,1115,1117,1119,1121,1123],{"class":189,"line":748},[187,1113,1114],{"class":368},"      async",[187,1116,372],{"class":204},[187,1118,396],{"class":361},[187,1120,678],{"class":204},[187,1122,369],{"class":368},[187,1124,1125],{"class":204}," {\n",[187,1127,1128],{"class":189,"line":766},[187,1129,1130],{"class":193},"        // Demonstration rule; replace with your own application lookup.\n",[187,1132,1133,1136,1140,1142,1145],{"class":189,"line":795},[187,1134,1135],{"class":200},"        await",[187,1137,1139],{"class":1138},"sBMFI"," Promise",[187,1141,286],{"class":204},[187,1143,1144],{"class":268},"resolve",[187,1146,271],{"class":298},[187,1148,1149,1152,1154,1156,1159,1162,1165,1167,1170],{"class":189,"line":824},[187,1150,1151],{"class":200},"        return",[187,1153,299],{"class":211},[187,1155,286],{"class":204},[187,1157,1158],{"class":268},"toLowerCase",[187,1160,1161],{"class":298},"() ",[187,1163,1164],{"class":204},"!==",[187,1166,218],{"class":204},[187,1168,1169],{"class":221},"admin",[187,1171,225],{"class":204},[187,1173,1174],{"class":189,"line":844},[187,1175,1176],{"class":204},"      },\n",[187,1178,1179,1182],{"class":189,"line":865},[187,1180,1181],{"class":211},"    )",[187,1183,688],{"class":204},[187,1185,1186,1189,1191,1193,1195,1198,1200,1202,1205,1207,1211,1213],{"class":189,"line":880},[187,1187,1188],{"class":298},"    newsletter",[187,1190,302],{"class":204},[187,1192,652],{"class":211},[187,1194,286],{"class":204},[187,1196,1197],{"class":268},"boolean",[187,1199,320],{"class":211},[187,1201,286],{"class":204},[187,1203,1204],{"class":268},"default",[187,1206,292],{"class":211},[187,1208,1210],{"class":1209},"sfNiH","false",[187,1212,678],{"class":211},[187,1214,688],{"class":204},[187,1216,1217,1219,1221,1223,1225],{"class":189,"line":896},[187,1218,736],{"class":204},[187,1220,678],{"class":211},[187,1222,286],{"class":204},[187,1224,683],{"class":268},[187,1226,745],{"class":211},[187,1228,1230,1232,1234,1236,1238,1240,1242,1244,1246],{"class":189,"line":1229},17,[187,1231,277],{"class":204},[187,1233,353],{"class":268},[187,1235,292],{"class":211},[187,1237,358],{"class":204},[187,1239,362],{"class":361},[187,1241,365],{"class":204},[187,1243,369],{"class":368},[187,1245,372],{"class":211},[187,1247,642],{"class":204},[187,1249,1251,1253,1255,1257,1259,1261],{"class":189,"line":1250},18,[187,1252,647],{"class":298},[187,1254,302],{"class":204},[187,1256,362],{"class":211},[187,1258,286],{"class":204},[187,1260,396],{"class":211},[187,1262,688],{"class":204},[187,1264,1266,1268,1270,1272,1274,1277],{"class":189,"line":1265},19,[187,1267,1188],{"class":298},[187,1269,302],{"class":204},[187,1271,362],{"class":211},[187,1273,286],{"class":204},[187,1275,1276],{"class":211},"newsletter",[187,1278,688],{"class":204},[187,1280,1282,1284],{"class":189,"line":1281},20,[187,1283,736],{"class":204},[187,1285,345],{"class":211},[101,1287,1288],{},"Native Yup validation awaits async tests and collects issues across fields. Defaults are applied during non-strict parsing. Requiredness/default flags can make Yup's declared input and output types differ; follow the generated action input type when choosing form initial values.",[101,1290,1291,1292,107,1295,1298,1299,1302,1303,1305,1306,1308],{},"Nested object/array issues map to the same dotted field errors used by the other validators, for example ",[104,1293,1294],{},"profile.name",[104,1296,1297],{},"addresses.0.city","; root issues use ",[104,1300,1301],{},"_root",". Existing ",[104,1304,40],{},", ",[104,1307,84],{},", and error handling require no validator-specific changes.",[101,1310,1311],{},"Each action may use its own validator. Input and output schemas can also come from different Standard Schema libraries; the handler receives the input schema's parsed output, and the client receives the output schema's parsed output. Existing middleware and metadata APIs remain unchanged.",[549,1313,1315],{"id":1314},"transforms-and-defaults","Transforms and defaults",[178,1317,1320],{"className":180,"code":1318,"filename":1319,"language":182,"meta":183,"style":183},"import { z } from 'zod'\nimport { createSafeActionClient } from '#safe-action'\n\nexport default createSafeActionClient()\n  .schema(z.object({ count: z.string().regex(/^\\d+$/).default('1').transform(Number) }))\n  .outputSchema(z.object({ count: z.number().finite() })\n    .transform(value => ({ label: `Count: ${value.count}` })))\n  .action(({ parsedInput }) => ({ count: parsedInput.count }))\n","server/actions/count.ts",[104,1321,1322,1342,1360,1364,1374,1456,1496,1541],{"__ignoreMap":183},[187,1323,1324,1326,1328,1331,1333,1335,1337,1340],{"class":189,"line":190},[187,1325,201],{"class":200},[187,1327,233],{"class":204},[187,1329,1330],{"class":211}," z",[187,1332,239],{"class":204},[187,1334,242],{"class":200},[187,1336,218],{"class":204},[187,1338,1339],{"class":221},"zod",[187,1341,225],{"class":204},[187,1343,1344,1346,1348,1350,1352,1354,1356,1358],{"class":189,"line":197},[187,1345,201],{"class":200},[187,1347,233],{"class":204},[187,1349,236],{"class":211},[187,1351,239],{"class":204},[187,1353,242],{"class":200},[187,1355,218],{"class":204},[187,1357,247],{"class":221},[187,1359,225],{"class":204},[187,1361,1362],{"class":189,"line":228},[187,1363,256],{"emptyLinePlaceholder":255},[187,1365,1366,1368,1370,1372],{"class":189,"line":252},[187,1367,262],{"class":200},[187,1369,265],{"class":200},[187,1371,236],{"class":268},[187,1373,271],{"class":211},[187,1375,1376,1378,1380,1383,1385,1387,1389,1391,1394,1396,1398,1400,1402,1404,1406,1409,1411,1414,1417,1420,1423,1426,1428,1430,1432,1434,1436,1438,1440,1442,1444,1446,1449,1452,1454],{"class":189,"line":259},[187,1377,277],{"class":204},[187,1379,280],{"class":268},[187,1381,1382],{"class":211},"(z",[187,1384,286],{"class":204},[187,1386,289],{"class":268},[187,1388,292],{"class":211},[187,1390,295],{"class":204},[187,1392,1393],{"class":298}," count",[187,1395,302],{"class":204},[187,1397,1330],{"class":211},[187,1399,286],{"class":204},[187,1401,317],{"class":268},[187,1403,320],{"class":211},[187,1405,286],{"class":204},[187,1407,1408],{"class":268},"regex",[187,1410,292],{"class":211},[187,1412,1413],{"class":204},"/",[187,1415,1416],{"class":200},"^",[187,1418,1419],{"class":221},"\\d",[187,1421,1422],{"class":204},"+",[187,1424,1425],{"class":200},"$",[187,1427,1413],{"class":204},[187,1429,678],{"class":211},[187,1431,286],{"class":204},[187,1433,1204],{"class":268},[187,1435,292],{"class":211},[187,1437,497],{"class":204},[187,1439,336],{"class":221},[187,1441,497],{"class":204},[187,1443,678],{"class":211},[187,1445,286],{"class":204},[187,1447,1448],{"class":268},"transform",[187,1450,1451],{"class":211},"(Number) ",[187,1453,342],{"class":204},[187,1455,345],{"class":211},[187,1457,1458,1460,1462,1464,1466,1468,1470,1472,1474,1476,1478,1480,1482,1484,1486,1489,1491,1493],{"class":189,"line":274},[187,1459,277],{"class":204},[187,1461,753],{"class":268},[187,1463,1382],{"class":211},[187,1465,286],{"class":204},[187,1467,289],{"class":268},[187,1469,292],{"class":211},[187,1471,295],{"class":204},[187,1473,1393],{"class":298},[187,1475,302],{"class":204},[187,1477,1330],{"class":211},[187,1479,286],{"class":204},[187,1481,702],{"class":268},[187,1483,320],{"class":211},[187,1485,286],{"class":204},[187,1487,1488],{"class":268},"finite",[187,1490,1161],{"class":211},[187,1492,342],{"class":204},[187,1494,1495],{"class":211},")\n",[187,1497,1498,1501,1503,1505,1508,1510,1512,1514,1517,1519,1521,1524,1526,1528,1530,1533,1536,1538],{"class":189,"line":348},[187,1499,1500],{"class":204},"    .",[187,1502,1448],{"class":268},[187,1504,292],{"class":211},[187,1506,1507],{"class":361},"value",[187,1509,369],{"class":368},[187,1511,372],{"class":211},[187,1513,295],{"class":204},[187,1515,1516],{"class":298}," label",[187,1518,302],{"class":204},[187,1520,382],{"class":204},[187,1522,1523],{"class":221},"Count: ",[187,1525,388],{"class":204},[187,1527,1507],{"class":211},[187,1529,286],{"class":204},[187,1531,1532],{"class":211},"count",[187,1534,1535],{"class":204},"}`",[187,1537,239],{"class":204},[187,1539,1540],{"class":211},")))\n",[187,1542,1543,1545,1547,1549,1551,1553,1555,1557,1559,1561,1563,1565,1567,1569,1572,1574],{"class":189,"line":733},[187,1544,277],{"class":204},[187,1546,353],{"class":268},[187,1548,292],{"class":211},[187,1550,358],{"class":204},[187,1552,362],{"class":361},[187,1554,365],{"class":204},[187,1556,369],{"class":368},[187,1558,372],{"class":211},[187,1560,295],{"class":204},[187,1562,1393],{"class":298},[187,1564,302],{"class":204},[187,1566,362],{"class":211},[187,1568,286],{"class":204},[187,1570,1571],{"class":211},"count ",[187,1573,342],{"class":204},[187,1575,345],{"class":211},[101,1577,1578,1579,1582,1583,1586,1587,1590],{},"The client sends ",[104,1580,1581],{},"{ count?: string }","; the handler receives ",[104,1584,1585],{},"{ count: number }",". The client output is ",[104,1588,1589],{},"{ label: string }",", reflecting the output-schema transform. Defaults make client input optional while guaranteeing parsed values. Output-validation failure returns a generic server error by default. Handlers should return values accepted by the output schema; runtime output validation enforces that contract.",[549,1592,1594],{"id":1593},"asynchronous-refinements","Asynchronous refinements",[178,1596,1598],{"className":180,"code":1597,"language":182,"meta":183,"style":183},"const nameSchema = z.string().refine(async (name) => {\n  // Demonstration rule; replace with an appropriate application lookup.\n  await Promise.resolve()\n  return name.toLowerCase() !== 'admin'\n}, { message: 'This name is reserved' })\n\nexport default createSafeActionClient()\n  .schema(z.object({ name: nameSchema }))\n  .action(({ parsedInput }) => ({ name: parsedInput.name }))\n",[104,1599,1600,1639,1644,1657,1678,1700,1704,1714,1740],{"__ignoreMap":183},[187,1601,1602,1605,1608,1611,1613,1615,1617,1619,1621,1624,1626,1629,1631,1633,1635,1637],{"class":189,"line":190},[187,1603,1604],{"class":368},"const",[187,1606,1607],{"class":211}," nameSchema ",[187,1609,1610],{"class":204},"=",[187,1612,1330],{"class":211},[187,1614,286],{"class":204},[187,1616,317],{"class":268},[187,1618,320],{"class":211},[187,1620,286],{"class":204},[187,1622,1623],{"class":268},"refine",[187,1625,292],{"class":211},[187,1627,1628],{"class":368},"async",[187,1630,372],{"class":204},[187,1632,396],{"class":361},[187,1634,678],{"class":204},[187,1636,369],{"class":368},[187,1638,1125],{"class":204},[187,1640,1641],{"class":189,"line":197},[187,1642,1643],{"class":193},"  // Demonstration rule; replace with an appropriate application lookup.\n",[187,1645,1646,1649,1651,1653,1655],{"class":189,"line":228},[187,1647,1648],{"class":200},"  await",[187,1650,1139],{"class":1138},[187,1652,286],{"class":204},[187,1654,1144],{"class":268},[187,1656,271],{"class":298},[187,1658,1659,1662,1664,1666,1668,1670,1672,1674,1676],{"class":189,"line":252},[187,1660,1661],{"class":200},"  return",[187,1663,299],{"class":211},[187,1665,286],{"class":204},[187,1667,1158],{"class":268},[187,1669,1161],{"class":298},[187,1671,1164],{"class":204},[187,1673,218],{"class":204},[187,1675,1169],{"class":221},[187,1677,225],{"class":204},[187,1679,1680,1683,1685,1688,1690,1692,1694,1696,1698],{"class":189,"line":259},[187,1681,1682],{"class":204},"},",[187,1684,233],{"class":204},[187,1686,1687],{"class":298}," message",[187,1689,302],{"class":204},[187,1691,218],{"class":204},[187,1693,1105],{"class":221},[187,1695,497],{"class":204},[187,1697,239],{"class":204},[187,1699,1495],{"class":211},[187,1701,1702],{"class":189,"line":274},[187,1703,256],{"emptyLinePlaceholder":255},[187,1705,1706,1708,1710,1712],{"class":189,"line":348},[187,1707,262],{"class":200},[187,1709,265],{"class":200},[187,1711,236],{"class":268},[187,1713,271],{"class":211},[187,1715,1716,1718,1720,1722,1724,1726,1728,1730,1732,1734,1736,1738],{"class":189,"line":733},[187,1717,277],{"class":204},[187,1719,280],{"class":268},[187,1721,1382],{"class":211},[187,1723,286],{"class":204},[187,1725,289],{"class":268},[187,1727,292],{"class":211},[187,1729,295],{"class":204},[187,1731,299],{"class":298},[187,1733,302],{"class":204},[187,1735,1607],{"class":211},[187,1737,342],{"class":204},[187,1739,345],{"class":211},[187,1741,1742,1744,1746,1748,1750,1752,1754,1756,1758,1760,1762,1764,1766,1768,1771,1773],{"class":189,"line":748},[187,1743,277],{"class":204},[187,1745,353],{"class":268},[187,1747,292],{"class":211},[187,1749,358],{"class":204},[187,1751,362],{"class":361},[187,1753,365],{"class":204},[187,1755,369],{"class":368},[187,1757,372],{"class":211},[187,1759,295],{"class":204},[187,1761,299],{"class":298},[187,1763,302],{"class":204},[187,1765,362],{"class":211},[187,1767,286],{"class":204},[187,1769,1770],{"class":211},"name ",[187,1772,342],{"class":204},[187,1774,345],{"class":211},[101,1776,1777,1778,1780],{},"Both input and output validation await asynchronous results. Expected validation issues become dotted field errors; root issues use ",[104,1779,1301],{},". Exceptions thrown by a schema are unexpected server errors.",[549,1782,1784],{"id":1783},"json-transport","JSON transport",[101,1786,1787],{},"Type inference describes schema contracts; it cannot make arbitrary JavaScript values survive JSON. Send plain serializable values. Represent Dates as ISO strings with matching schemas. Functions, cyclic objects, bigint, and file objects require an explicit application transport rather than ordinary action JSON.",[101,1789,1790,1795,1796,1795,1801,1795,1806,1795,1811],{},[561,1791,1794],{"href":1792,"rel":1793},"https://standardschema.dev/",[565],"Standard Schema specification"," · ",[561,1797,1800],{"href":1798,"rel":1799},"https://zod.dev/",[565],"Zod",[561,1802,1805],{"href":1803,"rel":1804},"https://valibot.dev/",[565],"Valibot",[561,1807,1810],{"href":1808,"rel":1809},"https://arktype.io/",[565],"ArkType",[561,1812,552],{"href":1813,"rel":1814},"https://github.com/jquense/yup#standard-schema-support",[565],[1816,1817,1818],"style",{},"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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":183,"searchDepth":197,"depth":197,"links":1820},[1821,1824,1825,1826],{"id":551,"depth":197,"text":552,"children":1822},[1823],{"id":979,"depth":228,"text":980},{"id":1314,"depth":197,"text":1315},{"id":1593,"depth":197,"text":1594},{"id":1783,"depth":197,"text":1784},"Use Standard Schema validators, preserve Zod compatibility, and infer transformed inputs and outputs.","md",null,{},{"title":52,"description":1827},"GCveRtJHgZZb6SEjpalhJ7uJSgKad226acOC0SgM-Sk",[1834,1836],{"title":48,"path":49,"stem":50,"description":1835,"children":-1},"Handle intentional action errors, generic unexpected failures, nested validation errors, and root errors.",{"title":56,"path":57,"stem":58,"description":1837,"children":-1},"Typed HTML forms, nested field errors, root errors, and Nuxt UI integration.",1791798654128]