[{"data":1,"prerenderedAt":3854},["ShallowReactive",2],{"navigation_docs":3,"-client-client-flow":195,"-client-client-flow-surround":3849},[4,27,61,75,100,126,147,177],{"title":5,"icon":6,"redirect":7,"path":8,"stem":9,"children":10,"page":26},"Introduction","icon-park-outline:home","\u002Fintroduction\u002Fabout-mion","\u002Fintroduction","1.introduction",[11,14,18,22],{"title":12,"path":7,"stem":13},"About mion","1.introduction\u002F1.about-mion",{"title":15,"path":16,"stem":17},"Quick Start","\u002Fintroduction\u002Fquick-start","1.introduction\u002F2.quick-start",{"title":19,"path":20,"stem":21},"Manual Install","\u002Fintroduction\u002Fmanual-install","1.introduction\u002F3.manual-install",{"title":23,"path":24,"stem":25},"What's Next","\u002Fintroduction\u002Fwhat-is-next","1.introduction\u002F4.what-is-next",false,{"title":28,"icon":29,"path":30,"stem":31,"children":32,"page":26},"Server","icon-park-outline:server","\u002Fserver","20.server",[33,37,41,45,49,53,57],{"title":34,"path":35,"stem":36},"Router Overview","\u002Fserver\u002Foverview","20.server\u002F0.overview",{"title":38,"path":39,"stem":40},"Routes","\u002Fserver\u002Froutes","20.server\u002F1.routes",{"title":42,"path":43,"stem":44},"Middleware","\u002Fserver\u002Fmiddle-fns","20.server\u002F2.middle-fns",{"title":46,"path":47,"stem":48},"Request & Response","\u002Fserver\u002Frequest-and-response","20.server\u002F5.request-and-response",{"title":50,"path":51,"stem":52},"Error Handling","\u002Fserver\u002Ferror-handling","20.server\u002F6.error-handling",{"title":54,"path":55,"stem":56},"Validation","\u002Fserver\u002Fvalidation","20.server\u002F7.validation",{"title":58,"path":59,"stem":60},"Serialization","\u002Fserver\u002Fserialization","20.server\u002F8.serialization",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":26},"Drizzle ORM","i-lineicons-drizzle","\u002Fdrizzle-orm","21.drizzle-orm",[67,71],{"title":68,"path":69,"stem":70},"Drizzle Overview","\u002Fdrizzle-orm\u002Fdrizzle-overview","21.drizzle-orm\u002F0.drizzle-overview",{"title":72,"path":73,"stem":74},"Column Mapping","\u002Fdrizzle-orm\u002Fcolumn-mapping","21.drizzle-orm\u002F1.column-mapping",{"title":76,"icon":77,"path":78,"stem":79,"children":80,"page":26},"Client","icon-park-outline:computer","\u002Fclient","3.client",[81,85,88,92,96],{"title":82,"path":83,"stem":84},"Client Overview","\u002Fclient\u002Fclient-overview","3.client\u002F0.client-overview",{"title":50,"path":86,"stem":87},"\u002Fclient\u002Ferror-handling","3.client\u002F1.error-handling",{"title":89,"path":90,"stem":91},"Validation Errors","\u002Fclient\u002Fvalidation-errors","3.client\u002F2.validation-errors",{"title":93,"path":94,"stem":95},"Routes Flow","\u002Fclient\u002Fclient-flow","3.client\u002F3.client-flow",{"title":97,"path":98,"stem":99},"Cancellation & Timeouts","\u002Fclient\u002Fcancellation-timeouts","3.client\u002F4.cancellation-timeouts",{"title":101,"icon":102,"redirect":103,"path":104,"stem":105,"children":106,"page":26},"RunTypes","i-lucide-scan-text","\u002Frun-types\u002Foverview","\u002Frun-types","4.run-types",[107,110,114,118,122],{"title":108,"path":103,"stem":109},"RunTypes Overview","4.run-types\u002F0.overview",{"title":111,"path":112,"stem":113},"Supported Types","\u002Frun-types\u002Ffeatures","4.run-types\u002F1.features",{"title":115,"path":116,"stem":117},"Type Formats","\u002Frun-types\u002Ftype-formats","4.run-types\u002F2.type-formats",{"title":119,"path":120,"stem":121},"Built-in Formats","\u002Frun-types\u002Fbuilt-in-formats","4.run-types\u002F3.built-in-formats",{"title":123,"path":124,"stem":125},"Caveats","\u002Frun-types\u002Fcaveats","4.run-types\u002F4.caveats",{"title":127,"path":128,"stem":129,"children":130,"page":26},"Devtools","\u002Fdevtools","5.devtools",[131,135,139,143],{"title":132,"path":133,"stem":134},"AOT Compilation","\u002Fdevtools\u002Faot-compilation","5.devtools\u002F0.aot-compilation",{"title":136,"path":137,"stem":138},"Pure Functions","\u002Fdevtools\u002Fpure-functions","5.devtools\u002F1.pure-functions",{"title":140,"path":141,"stem":142},"ESLint Rules","\u002Fdevtools\u002Feslint-rules","5.devtools\u002F2.eslint-rules",{"title":144,"path":145,"stem":146},"Vite Configuration","\u002Fdevtools\u002Fvite-config","5.devtools\u002F3.vite-config",{"title":148,"redirect":149,"icon":150,"path":151,"stem":152,"children":153,"page":26},"Platforms","\u002Fplatforms\u002Fnode-js","icon-park-outline:play","\u002Fplatforms","6.platforms",[154,157,161,165,169,173],{"title":155,"path":149,"stem":156},"Node.js","6.platforms\u002F1.node-js",{"title":158,"path":159,"stem":160},"Bun","\u002Fplatforms\u002Fbun","6.platforms\u002F2.bun",{"title":162,"path":163,"stem":164},"AWS Lambda","\u002Fplatforms\u002Faws-lambda","6.platforms\u002F3.aws-lambda",{"title":166,"path":167,"stem":168},"Google Cloud Functions","\u002Fplatforms\u002Fgoogle-cloud-functions","6.platforms\u002F4.google-cloud-functions",{"title":170,"path":171,"stem":172},"Cloudflare Workers","\u002Fplatforms\u002Fcloudflare","6.platforms\u002F5.cloudflare",{"title":174,"path":175,"stem":176},"Vercel","\u002Fplatforms\u002Fvercel","6.platforms\u002F6.vercel",{"title":178,"icon":179,"redirect":180,"path":181,"stem":182,"children":183,"page":26},"Benchmarks","icon-park-outline:chart-line","\u002Fbenchmarks\u002Fhello-world","\u002Fbenchmarks","7.benchmarks",[184,187,191],{"title":185,"path":180,"stem":186},"Hello World","7.benchmarks\u002F1.hello-world",{"title":188,"path":189,"stem":190},"Light Validation","\u002Fbenchmarks\u002Flight-validation","7.benchmarks\u002F2.light-validation",{"title":192,"path":193,"stem":194},"Heavy Validation","\u002Fbenchmarks\u002Fheavy-validation","7.benchmarks\u002F3.heavy-validation",{"id":196,"title":93,"body":197,"description":3843,"extension":3844,"links":3845,"meta":3846,"navigation":331,"path":94,"seo":3847,"stem":95,"__hash__":3848},"docs\u002F3.client\u002F3.client-flow.md",{"type":198,"value":199},"minimark",[200,218,237,242,249,655,661,676,1025,1030,1062,1066,1076,1202,1206,1219,1377,1433,1436,1440,1450,1523,2140,2144,2261,2280,2282,2286,2289,2717,2721,2723,2727,2737,3141,3150,3152,3156,3159,3346,3350,3352,3356,3371,3548,3550,3554,3575,3837,3839],[201,202,203,204,208,209,213,214,217],"p",{},"A ",[205,206,207],"code",{},"routesFlow"," is a client-orchestrated query that executes multiple routes in a single HTTP request. You can batch independent calls together ",[210,211,212],"strong",{},"and"," map results between them using ",[205,215,216],{},"serverMapFrom"," — resolving relationships server-side without extra round trips.",[219,220,221,224,227,228,230,231,233,234,236],"tip",{},[210,222,223],{},"GraphQL alternative:",[225,226],"br",{},"\nInstead of defining a schema and resolvers, just use your existing routes and compose them from the client using ",[205,229,207],{}," and  ",[205,232,216],{},".\n",[225,235],{},"\nYou get the same data-fetching efficiency — fetching related data in a single request — with full type safety and zero boilerplate.",[238,239,241],"h2",{"id":240},"basic-usage","Basic Usage",[201,243,244,245,248],{},"Use the ",[205,246,247],{},"routesFlow()"," function to execute multiple routes together:",[250,251,256],"pre",{"className":252,"code":253,"language":254,"meta":255,"style":255},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {initClient, routesFlow} from '@mionjs\u002Fclient';\nimport type {MyApi} from '.\u002Fserver.routes.ts';\n\nconst {routes, middleFns} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\n\u002F\u002F Execute multiple routes in a single HTTP request\nconst [[sum, user], [sumError, userError]] = await routesFlow([routes.utils.sum(5, 2), routes.users.getById('USER-123')]).call();\n\n\u002F\u002F Results are returned as arrays in the same order as the routes\nif (sumError) console.log('Sum error:', sumError.publicMessage);\nelse console.log('Sum:', sum); \u002F\u002F 7\n\nif (userError) console.log('User error:', userError.publicMessage);\nelse console.log('User:', user); \u002F\u002F {id: 'USER-123', name: 'John', surname: 'Smith'}\n","ts","",[205,257,258,300,326,333,395,400,407,510,515,521,556,589,594,625],{"__ignoreMap":255},[259,260,263,267,271,275,278,281,284,287,290,294,297],"span",{"class":261,"line":262},"line",1,[259,264,266],{"class":265},"s7zQu","import",[259,268,270],{"class":269},"sMK4o"," {",[259,272,274],{"class":273},"sTEyZ","initClient",[259,276,277],{"class":269},",",[259,279,280],{"class":273}," routesFlow",[259,282,283],{"class":269},"}",[259,285,286],{"class":265}," from",[259,288,289],{"class":269}," '",[259,291,293],{"class":292},"sfazB","@mionjs\u002Fclient",[259,295,296],{"class":269},"'",[259,298,299],{"class":269},";\n",[259,301,303,305,308,310,313,315,317,319,322,324],{"class":261,"line":302},2,[259,304,266],{"class":265},[259,306,307],{"class":265}," type",[259,309,270],{"class":269},[259,311,312],{"class":273},"MyApi",[259,314,283],{"class":269},[259,316,286],{"class":265},[259,318,289],{"class":269},[259,320,321],{"class":292},".\u002Fserver.routes.ts",[259,323,296],{"class":269},[259,325,299],{"class":269},[259,327,329],{"class":261,"line":328},3,[259,330,332],{"emptyLinePlaceholder":331},true,"\n",[259,334,336,340,342,345,347,350,352,355,359,362,365,368,371,374,378,381,383,386,388,390,393],{"class":261,"line":335},4,[259,337,339],{"class":338},"spNyl","const",[259,341,270],{"class":269},[259,343,344],{"class":273},"routes",[259,346,277],{"class":269},[259,348,349],{"class":273}," middleFns",[259,351,283],{"class":269},[259,353,354],{"class":269}," =",[259,356,358],{"class":357},"s2Zo4"," initClient",[259,360,361],{"class":269},"\u003C",[259,363,312],{"class":364},"sBMFI",[259,366,367],{"class":269},">",[259,369,370],{"class":273},"(",[259,372,373],{"class":269},"{",[259,375,377],{"class":376},"swJcz","baseURL",[259,379,380],{"class":269},":",[259,382,289],{"class":269},[259,384,385],{"class":292},"http:\u002F\u002Flocalhost:3000",[259,387,296],{"class":269},[259,389,283],{"class":269},[259,391,392],{"class":273},")",[259,394,299],{"class":269},[259,396,398],{"class":261,"line":397},5,[259,399,332],{"emptyLinePlaceholder":331},[259,401,403],{"class":261,"line":402},6,[259,404,406],{"class":405},"sHwdD","\u002F\u002F Execute multiple routes in a single HTTP request\n",[259,408,410,412,415,418,420,423,426,429,432,434,437,440,442,445,447,450,453,456,458,460,462,466,468,471,473,475,478,480,483,485,488,490,492,495,497,500,502,505,508],{"class":261,"line":409},7,[259,411,339],{"class":338},[259,413,414],{"class":269}," [[",[259,416,417],{"class":273},"sum",[259,419,277],{"class":269},[259,421,422],{"class":273}," user",[259,424,425],{"class":269},"],",[259,427,428],{"class":269}," [",[259,430,431],{"class":273},"sumError",[259,433,277],{"class":269},[259,435,436],{"class":273}," userError",[259,438,439],{"class":269},"]]",[259,441,354],{"class":269},[259,443,444],{"class":265}," await",[259,446,280],{"class":357},[259,448,449],{"class":273},"([routes",[259,451,452],{"class":269},".",[259,454,455],{"class":273},"utils",[259,457,452],{"class":269},[259,459,417],{"class":357},[259,461,370],{"class":273},[259,463,465],{"class":464},"sbssI","5",[259,467,277],{"class":269},[259,469,470],{"class":464}," 2",[259,472,392],{"class":273},[259,474,277],{"class":269},[259,476,477],{"class":273}," routes",[259,479,452],{"class":269},[259,481,482],{"class":273},"users",[259,484,452],{"class":269},[259,486,487],{"class":357},"getById",[259,489,370],{"class":273},[259,491,296],{"class":269},[259,493,494],{"class":292},"USER-123",[259,496,296],{"class":269},[259,498,499],{"class":273},")])",[259,501,452],{"class":269},[259,503,504],{"class":357},"call",[259,506,507],{"class":273},"()",[259,509,299],{"class":269},[259,511,513],{"class":261,"line":512},8,[259,514,332],{"emptyLinePlaceholder":331},[259,516,518],{"class":261,"line":517},9,[259,519,520],{"class":405},"\u002F\u002F Results are returned as arrays in the same order as the routes\n",[259,522,524,527,530,532,535,537,539,542,544,546,549,551,554],{"class":261,"line":523},10,[259,525,526],{"class":265},"if",[259,528,529],{"class":273}," (sumError) console",[259,531,452],{"class":269},[259,533,534],{"class":357},"log",[259,536,370],{"class":273},[259,538,296],{"class":269},[259,540,541],{"class":292},"Sum error:",[259,543,296],{"class":269},[259,545,277],{"class":269},[259,547,548],{"class":273}," sumError",[259,550,452],{"class":269},[259,552,553],{"class":273},"publicMessage)",[259,555,299],{"class":269},[259,557,559,562,565,567,569,571,573,576,578,580,583,586],{"class":261,"line":558},11,[259,560,561],{"class":265},"else",[259,563,564],{"class":273}," console",[259,566,452],{"class":269},[259,568,534],{"class":357},[259,570,370],{"class":273},[259,572,296],{"class":269},[259,574,575],{"class":292},"Sum:",[259,577,296],{"class":269},[259,579,277],{"class":269},[259,581,582],{"class":273}," sum)",[259,584,585],{"class":269},";",[259,587,588],{"class":405}," \u002F\u002F 7\n",[259,590,592],{"class":261,"line":591},12,[259,593,332],{"emptyLinePlaceholder":331},[259,595,597,599,602,604,606,608,610,613,615,617,619,621,623],{"class":261,"line":596},13,[259,598,526],{"class":265},[259,600,601],{"class":273}," (userError) console",[259,603,452],{"class":269},[259,605,534],{"class":357},[259,607,370],{"class":273},[259,609,296],{"class":269},[259,611,612],{"class":292},"User error:",[259,614,296],{"class":269},[259,616,277],{"class":269},[259,618,436],{"class":273},[259,620,452],{"class":269},[259,622,553],{"class":273},[259,624,299],{"class":269},[259,626,628,630,632,634,636,638,640,643,645,647,650,652],{"class":261,"line":627},14,[259,629,561],{"class":265},[259,631,564],{"class":273},[259,633,452],{"class":269},[259,635,534],{"class":357},[259,637,370],{"class":273},[259,639,296],{"class":269},[259,641,642],{"class":292},"User:",[259,644,296],{"class":269},[259,646,277],{"class":269},[259,648,649],{"class":273}," user)",[259,651,585],{"class":269},[259,653,654],{"class":405}," \u002F\u002F {id: 'USER-123', name: 'John', surname: 'Smith'}\n",[238,656,658,659],{"id":657},"result-mapping-with-servermapfrom","Result Mapping with ",[205,660,216],{},[201,662,663,664,667,668,671,672,675],{},"Use ",[205,665,666],{},"serverMapFrom()"," to map the output of one route to the input of another — all resolved ",[210,669,670],{},"server-side"," in a single HTTP request. This enables ",[210,673,674],{},"GraphQL-like data composition"," with the simplicity and type safety of RPC.",[250,677,679],{"className":252,"code":678,"language":254,"meta":255,"style":255},"import {initClient, routesFlow, serverMapFrom} from '@mionjs\u002Fclient';\nimport type {MyApi} from '.\u002Fserver.routes.ts';\nconst {routes, middleFns} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\n\u002F\u002F Fetch an order\nconst orderReq = routes.orders.getById('ORDER-123');\n\u002F\u002F serverMapFrom maps order.userId → getById input, (runs server-side)\nconst mapping = serverMapFrom(orderReq, (order) => order!.userId);\n\u002F\u002F fake is just used for faking the expected type of users.getById in the client\nconst userReq = routes.users.getById(mapping.asArg());\n\nconst [[orderData, userData]] = await routesFlow([orderReq, userReq]).call();\nif (orderData && userData) {\n    console.log(`Order ${orderData.id} placed by ${userData.name} ${userData.surname}`);\n}\n",[205,680,681,710,732,776,780,785,819,824,863,868,900,904,942,958,1019],{"__ignoreMap":255},[259,682,683,685,687,689,691,693,695,698,700,702,704,706,708],{"class":261,"line":262},[259,684,266],{"class":265},[259,686,270],{"class":269},[259,688,274],{"class":273},[259,690,277],{"class":269},[259,692,280],{"class":273},[259,694,277],{"class":269},[259,696,697],{"class":273}," serverMapFrom",[259,699,283],{"class":269},[259,701,286],{"class":265},[259,703,289],{"class":269},[259,705,293],{"class":292},[259,707,296],{"class":269},[259,709,299],{"class":269},[259,711,712,714,716,718,720,722,724,726,728,730],{"class":261,"line":302},[259,713,266],{"class":265},[259,715,307],{"class":265},[259,717,270],{"class":269},[259,719,312],{"class":273},[259,721,283],{"class":269},[259,723,286],{"class":265},[259,725,289],{"class":269},[259,727,321],{"class":292},[259,729,296],{"class":269},[259,731,299],{"class":269},[259,733,734,736,738,740,742,744,746,748,750,752,754,756,758,760,762,764,766,768,770,772,774],{"class":261,"line":328},[259,735,339],{"class":338},[259,737,270],{"class":269},[259,739,344],{"class":273},[259,741,277],{"class":269},[259,743,349],{"class":273},[259,745,283],{"class":269},[259,747,354],{"class":269},[259,749,358],{"class":357},[259,751,361],{"class":269},[259,753,312],{"class":364},[259,755,367],{"class":269},[259,757,370],{"class":273},[259,759,373],{"class":269},[259,761,377],{"class":376},[259,763,380],{"class":269},[259,765,289],{"class":269},[259,767,385],{"class":292},[259,769,296],{"class":269},[259,771,283],{"class":269},[259,773,392],{"class":273},[259,775,299],{"class":269},[259,777,778],{"class":261,"line":335},[259,779,332],{"emptyLinePlaceholder":331},[259,781,782],{"class":261,"line":397},[259,783,784],{"class":405},"\u002F\u002F Fetch an order\n",[259,786,787,789,792,795,797,799,802,804,806,808,810,813,815,817],{"class":261,"line":402},[259,788,339],{"class":338},[259,790,791],{"class":273}," orderReq ",[259,793,794],{"class":269},"=",[259,796,477],{"class":273},[259,798,452],{"class":269},[259,800,801],{"class":273},"orders",[259,803,452],{"class":269},[259,805,487],{"class":357},[259,807,370],{"class":273},[259,809,296],{"class":269},[259,811,812],{"class":292},"ORDER-123",[259,814,296],{"class":269},[259,816,392],{"class":273},[259,818,299],{"class":269},[259,820,821],{"class":261,"line":409},[259,822,823],{"class":405},"\u002F\u002F serverMapFrom maps order.userId → getById input, (runs server-side)\n",[259,825,826,828,831,833,835,838,840,843,847,849,852,855,858,861],{"class":261,"line":512},[259,827,339],{"class":338},[259,829,830],{"class":273}," mapping ",[259,832,794],{"class":269},[259,834,697],{"class":357},[259,836,837],{"class":273},"(orderReq",[259,839,277],{"class":269},[259,841,842],{"class":269}," (",[259,844,846],{"class":845},"sHdIc","order",[259,848,392],{"class":269},[259,850,851],{"class":338}," =>",[259,853,854],{"class":273}," order",[259,856,857],{"class":269},"!.",[259,859,860],{"class":273},"userId)",[259,862,299],{"class":269},[259,864,865],{"class":261,"line":517},[259,866,867],{"class":405},"\u002F\u002F fake is just used for faking the expected type of users.getById in the client\n",[259,869,870,872,875,877,879,881,883,885,887,890,892,895,898],{"class":261,"line":523},[259,871,339],{"class":338},[259,873,874],{"class":273}," userReq ",[259,876,794],{"class":269},[259,878,477],{"class":273},[259,880,452],{"class":269},[259,882,482],{"class":273},[259,884,452],{"class":269},[259,886,487],{"class":357},[259,888,889],{"class":273},"(mapping",[259,891,452],{"class":269},[259,893,894],{"class":357},"asArg",[259,896,897],{"class":273},"())",[259,899,299],{"class":269},[259,901,902],{"class":261,"line":558},[259,903,332],{"emptyLinePlaceholder":331},[259,905,906,908,910,913,915,918,920,922,924,926,929,931,934,936,938,940],{"class":261,"line":591},[259,907,339],{"class":338},[259,909,414],{"class":269},[259,911,912],{"class":273},"orderData",[259,914,277],{"class":269},[259,916,917],{"class":273}," userData",[259,919,439],{"class":269},[259,921,354],{"class":269},[259,923,444],{"class":265},[259,925,280],{"class":357},[259,927,928],{"class":273},"([orderReq",[259,930,277],{"class":269},[259,932,933],{"class":273}," userReq])",[259,935,452],{"class":269},[259,937,504],{"class":357},[259,939,507],{"class":273},[259,941,299],{"class":269},[259,943,944,946,949,952,955],{"class":261,"line":596},[259,945,526],{"class":265},[259,947,948],{"class":273}," (orderData ",[259,950,951],{"class":269},"&&",[259,953,954],{"class":273}," userData) ",[259,956,957],{"class":269},"{\n",[259,959,960,963,965,967,969,972,975,978,980,982,985,987,990,992,995,997,1000,1002,1005,1007,1009,1012,1015,1017],{"class":261,"line":627},[259,961,962],{"class":273},"    console",[259,964,452],{"class":269},[259,966,534],{"class":357},[259,968,370],{"class":376},[259,970,971],{"class":269},"`",[259,973,974],{"class":292},"Order ",[259,976,977],{"class":269},"${",[259,979,912],{"class":273},[259,981,452],{"class":269},[259,983,984],{"class":273},"id",[259,986,283],{"class":269},[259,988,989],{"class":292}," placed by ",[259,991,977],{"class":269},[259,993,994],{"class":273},"userData",[259,996,452],{"class":269},[259,998,999],{"class":273},"name",[259,1001,283],{"class":269},[259,1003,1004],{"class":269}," ${",[259,1006,994],{"class":273},[259,1008,452],{"class":269},[259,1010,1011],{"class":273},"surname",[259,1013,1014],{"class":269},"}`",[259,1016,392],{"class":376},[259,1018,299],{"class":269},[259,1020,1022],{"class":261,"line":1021},15,[259,1023,1024],{"class":269},"}\n",[1026,1027,1029],"h3",{"id":1028},"how-it-works","How it works",[1031,1032,1033,1040,1046,1056],"ol",{},[1034,1035,1036,1039],"li",{},[205,1037,1038],{},"serverMapFrom(sourceRoute, mapperFn)"," creates a reference to the source route's output",[1034,1041,1042,1045],{},[205,1043,1044],{},".fake()"," provides a type-safe placeholder so TypeScript can infer the result types",[1034,1047,1048,1049,1052,1053],{},"At ",[210,1050,1051],{},"build time",", the mion vite plugin extracts the mapper function from your client source and bundles it into the ",[210,1054,1055],{},"server",[1034,1057,1048,1058,1061],{},[210,1059,1060],{},"runtime",", the server executes the first route, runs the mapper function, and passes the mapped value as input to the second route",[1026,1063,1065],{"id":1064},"pure-functions-requirement","Pure functions requirement",[201,1067,1068,1069,1071,1072,1075],{},"The mapper function passed to ",[205,1070,216],{}," must be a ",[210,1073,1074],{},"pure function"," — no closures, no external variables, no side effects. This is because the function body is extracted at compile time by the mion vite plugin and bundled into the server. The server executes the function in its own context, so it has no access to your client-side scope.",[250,1077,1079],{"className":252,"code":1078,"language":254,"meta":255,"style":255},"\u002F\u002F ✅ Pure function — only uses the input parameter\nserverMapFrom(order, (o) => o!.userId)\n\n\u002F\u002F ✅ Pure function — inline computation is fine\nserverMapFrom(order, (o) => o!.totalUSD * 100)\n\n\u002F\u002F ❌ NOT pure — references external variable\nconst multiplier = 2;\nserverMapFrom(order, (o) => o!.totalUSD * multiplier)\n",[205,1080,1081,1086,1112,1116,1121,1153,1157,1162,1175],{"__ignoreMap":255},[259,1082,1083],{"class":261,"line":262},[259,1084,1085],{"class":405},"\u002F\u002F ✅ Pure function — only uses the input parameter\n",[259,1087,1088,1090,1093,1095,1097,1100,1102,1104,1107,1109],{"class":261,"line":302},[259,1089,216],{"class":357},[259,1091,1092],{"class":273},"(order",[259,1094,277],{"class":269},[259,1096,842],{"class":269},[259,1098,1099],{"class":845},"o",[259,1101,392],{"class":269},[259,1103,851],{"class":338},[259,1105,1106],{"class":273}," o",[259,1108,857],{"class":269},[259,1110,1111],{"class":273},"userId)\n",[259,1113,1114],{"class":261,"line":328},[259,1115,332],{"emptyLinePlaceholder":331},[259,1117,1118],{"class":261,"line":335},[259,1119,1120],{"class":405},"\u002F\u002F ✅ Pure function — inline computation is fine\n",[259,1122,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1144,1147,1150],{"class":261,"line":397},[259,1124,216],{"class":357},[259,1126,1092],{"class":273},[259,1128,277],{"class":269},[259,1130,842],{"class":269},[259,1132,1099],{"class":845},[259,1134,392],{"class":269},[259,1136,851],{"class":338},[259,1138,1106],{"class":273},[259,1140,857],{"class":269},[259,1142,1143],{"class":273},"totalUSD ",[259,1145,1146],{"class":269},"*",[259,1148,1149],{"class":464}," 100",[259,1151,1152],{"class":273},")\n",[259,1154,1155],{"class":261,"line":402},[259,1156,332],{"emptyLinePlaceholder":331},[259,1158,1159],{"class":261,"line":409},[259,1160,1161],{"class":405},"\u002F\u002F ❌ NOT pure — references external variable\n",[259,1163,1164,1166,1169,1171,1173],{"class":261,"line":512},[259,1165,339],{"class":338},[259,1167,1168],{"class":273}," multiplier ",[259,1170,794],{"class":269},[259,1172,470],{"class":464},[259,1174,299],{"class":269},[259,1176,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199],{"class":261,"line":517},[259,1178,216],{"class":357},[259,1180,1092],{"class":273},[259,1182,277],{"class":269},[259,1184,842],{"class":269},[259,1186,1099],{"class":845},[259,1188,392],{"class":269},[259,1190,851],{"class":338},[259,1192,1106],{"class":273},[259,1194,857],{"class":269},[259,1196,1143],{"class":273},[259,1198,1146],{"class":269},[259,1200,1201],{"class":273}," multiplier)\n",[1026,1203,1205],{"id":1204},"vite-plugin-configuration","Vite plugin configuration",[201,1207,1208,1209,1211,1212,1214,1215,1218],{},"To enable ",[205,1210,216],{},", the ",[210,1213,1055],{}," vite config must include the ",[205,1216,1217],{},"serverPureFunctions"," option pointing to your client source directory. This tells the plugin where to scan for mapper functions to bundle into the server:",[250,1220,1222],{"className":252,"code":1221,"language":254,"meta":255,"style":255},"\u002F\u002F server vite.config.ts\nimport {mionPlugin} from '@mionjs\u002Fdevtools\u002Fvite-plugin';\nimport {resolve} from 'path';\n\nexport default defineConfig({\n    plugins: [\n        mionPlugin({\n            serverPureFunctions: {\n                clientSrcPath: resolve(__dirname, '..\u002Fclient\u002Fsrc'),\n            },\n        }),\n    ],\n});\n",[205,1223,1224,1229,1251,1273,1277,1292,1302,1311,1321,1348,1353,1362,1369],{"__ignoreMap":255},[259,1225,1226],{"class":261,"line":262},[259,1227,1228],{"class":405},"\u002F\u002F server vite.config.ts\n",[259,1230,1231,1233,1235,1238,1240,1242,1244,1247,1249],{"class":261,"line":302},[259,1232,266],{"class":265},[259,1234,270],{"class":269},[259,1236,1237],{"class":273},"mionPlugin",[259,1239,283],{"class":269},[259,1241,286],{"class":265},[259,1243,289],{"class":269},[259,1245,1246],{"class":292},"@mionjs\u002Fdevtools\u002Fvite-plugin",[259,1248,296],{"class":269},[259,1250,299],{"class":269},[259,1252,1253,1255,1257,1260,1262,1264,1266,1269,1271],{"class":261,"line":328},[259,1254,266],{"class":265},[259,1256,270],{"class":269},[259,1258,1259],{"class":273},"resolve",[259,1261,283],{"class":269},[259,1263,286],{"class":265},[259,1265,289],{"class":269},[259,1267,1268],{"class":292},"path",[259,1270,296],{"class":269},[259,1272,299],{"class":269},[259,1274,1275],{"class":261,"line":335},[259,1276,332],{"emptyLinePlaceholder":331},[259,1278,1279,1282,1285,1288,1290],{"class":261,"line":397},[259,1280,1281],{"class":265},"export",[259,1283,1284],{"class":265}," default",[259,1286,1287],{"class":357}," defineConfig",[259,1289,370],{"class":273},[259,1291,957],{"class":269},[259,1293,1294,1297,1299],{"class":261,"line":402},[259,1295,1296],{"class":376},"    plugins",[259,1298,380],{"class":269},[259,1300,1301],{"class":273}," [\n",[259,1303,1304,1307,1309],{"class":261,"line":409},[259,1305,1306],{"class":357},"        mionPlugin",[259,1308,370],{"class":273},[259,1310,957],{"class":269},[259,1312,1313,1316,1318],{"class":261,"line":512},[259,1314,1315],{"class":376},"            serverPureFunctions",[259,1317,380],{"class":269},[259,1319,1320],{"class":269}," {\n",[259,1322,1323,1326,1328,1331,1334,1336,1338,1341,1343,1345],{"class":261,"line":517},[259,1324,1325],{"class":376},"                clientSrcPath",[259,1327,380],{"class":269},[259,1329,1330],{"class":357}," resolve",[259,1332,1333],{"class":273},"(__dirname",[259,1335,277],{"class":269},[259,1337,289],{"class":269},[259,1339,1340],{"class":292},"..\u002Fclient\u002Fsrc",[259,1342,296],{"class":269},[259,1344,392],{"class":273},[259,1346,1347],{"class":269},",\n",[259,1349,1350],{"class":261,"line":523},[259,1351,1352],{"class":269},"            },\n",[259,1354,1355,1358,1360],{"class":261,"line":558},[259,1356,1357],{"class":269},"        }",[259,1359,392],{"class":273},[259,1361,1347],{"class":269},[259,1363,1364,1367],{"class":261,"line":591},[259,1365,1366],{"class":273},"    ]",[259,1368,1347],{"class":269},[259,1370,1371,1373,1375],{"class":261,"line":596},[259,1372,283],{"class":269},[259,1374,392],{"class":273},[259,1376,299],{"class":269},[1378,1379,1380,1393],"table",{},[1381,1382,1383],"thead",{},[1384,1385,1386,1390],"tr",{},[1387,1388,1389],"th",{},"Option",[1387,1391,1392],{},"Description",[1394,1395,1396,1410,1423],"tbody",{},[1384,1397,1398,1404],{},[1399,1400,1401],"td",{},[205,1402,1403],{},"clientSrcPath",[1399,1405,1406,1407,1409],{},"Path to the client source directory containing ",[205,1408,666],{}," calls",[1384,1411,1412,1417],{},[1399,1413,1414],{},[205,1415,1416],{},"include",[1399,1418,1419,1420,392],{},"Glob patterns for files to scan (defaults to ",[205,1421,1422],{},"['**\u002F*.ts', '**\u002F*.tsx']",[1384,1424,1425,1430],{},[1399,1426,1427],{},[205,1428,1429],{},"exclude",[1399,1431,1432],{},"Glob patterns for files to exclude from scanning",[1434,1435],"hr",{},[238,1437,1439],{"id":1438},"routesflow-vs-single-route-call","RoutesFlow vs Single Route Call",[201,1441,1442,1443,1446,1447,1449],{},"The key difference between ",[205,1444,1445],{},"call()"," and ",[205,1448,247],{}," is in the response structure:",[1378,1451,1452,1469],{},[1381,1453,1454],{},[1384,1455,1456,1459,1464],{},[1387,1457,1458],{},"Aspect",[1387,1460,1461],{},[205,1462,1463],{},"route.call()",[1387,1465,1466],{},[205,1467,1468],{},"routesFlow([routes...]).call()",[1394,1470,1471,1484,1497,1510],{},[1384,1472,1473,1478,1481],{},[1399,1474,1475],{},[210,1476,1477],{},"HTTP Requests",[1399,1479,1480],{},"One per route",[1399,1482,1483],{},"One for all routes",[1384,1485,1486,1491,1494],{},[1399,1487,1488],{},[210,1489,1490],{},"Result",[1399,1492,1493],{},"Single value",[1399,1495,1496],{},"Array of values",[1384,1498,1499,1504,1507],{},[1399,1500,1501],{},[210,1502,1503],{},"Error",[1399,1505,1506],{},"Single error",[1399,1508,1509],{},"Array of errors",[1384,1511,1512,1517,1520],{},[1399,1513,1514],{},[210,1515,1516],{},"Position",[1399,1518,1519],{},"Direct access",[1399,1521,1522],{},"Index-based access",[250,1524,1526],{"className":252,"code":1525,"language":254,"meta":255,"style":255},"import {initClient, routesFlow} from '@mionjs\u002Fclient';\nimport type {MyApi} from '.\u002Fserver.routes.ts';\n\nconst {routes} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\n\u002F\u002F ============================================\n\u002F\u002F SINGLE ROUTE CALL - call()\n\u002F\u002F ============================================\n\u002F\u002F Result and error are the direct types from the route\n\u002F\u002F Returns: [result, error, middleFnResults, middleFnErrors]\nconst [user, error] = await routes.users.getById('USER-123').call();\n\n\u002F\u002F `user` is User | undefined\n\u002F\u002F `error` is RpcError\u003C'user-not-found', UserNotFoundData> | ValidationError | undefined\nif (error) {\n    if (error.type === 'user-not-found') {\n        console.log('User not found:', error.errorData?.requestedId);\n    }\n} else {\n    console.log('User:', user?.name);\n}\n\n\u002F\u002F ============================================\n\u002F\u002F ROUTES_FLOW - Multiple routes in one request\n\u002F\u002F ============================================\n\u002F\u002F Results and errors are ARRAYS in the same order as the routes\n\u002F\u002F Returns: [[results...], [errors...], middleFnResults, middleFnErrors]\nconst [[user2, order], [userError, orderError]] = await routesFlow([\n    routes.users.getById('USER-123'),\n    routes.orders.getById('ORDER-1'),\n]).call();\n\n\u002F\u002F `user2` is User | undefined (first route result)\n\u002F\u002F `order` is Order | undefined (second route result)\n\u002F\u002F `userError` is RpcError\u003C'user-not-found'> | ValidationError | undefined\n\u002F\u002F `orderError` is RpcError\u003C'order-not-found'> | ValidationError | undefined\n\n\u002F\u002F Each result\u002Ferror corresponds to its route by position\nif (userError) console.log('User error:', userError.publicMessage);\nelse console.log('User:', user2?.name);\n\nif (orderError) console.log('Order error:', orderError.publicMessage);\nelse console.log('Order:', order?.id);\n",[205,1527,1528,1552,1574,1578,1618,1622,1627,1632,1636,1641,1646,1695,1699,1704,1709,1718,1749,1787,1793,1803,1832,1837,1842,1847,1853,1858,1864,1870,1907,1933,1959,1973,1978,1984,1990,1996,2002,2007,2013,2042,2073,2078,2109],{"__ignoreMap":255},[259,1529,1530,1532,1534,1536,1538,1540,1542,1544,1546,1548,1550],{"class":261,"line":262},[259,1531,266],{"class":265},[259,1533,270],{"class":269},[259,1535,274],{"class":273},[259,1537,277],{"class":269},[259,1539,280],{"class":273},[259,1541,283],{"class":269},[259,1543,286],{"class":265},[259,1545,289],{"class":269},[259,1547,293],{"class":292},[259,1549,296],{"class":269},[259,1551,299],{"class":269},[259,1553,1554,1556,1558,1560,1562,1564,1566,1568,1570,1572],{"class":261,"line":302},[259,1555,266],{"class":265},[259,1557,307],{"class":265},[259,1559,270],{"class":269},[259,1561,312],{"class":273},[259,1563,283],{"class":269},[259,1565,286],{"class":265},[259,1567,289],{"class":269},[259,1569,321],{"class":292},[259,1571,296],{"class":269},[259,1573,299],{"class":269},[259,1575,1576],{"class":261,"line":328},[259,1577,332],{"emptyLinePlaceholder":331},[259,1579,1580,1582,1584,1586,1588,1590,1592,1594,1596,1598,1600,1602,1604,1606,1608,1610,1612,1614,1616],{"class":261,"line":335},[259,1581,339],{"class":338},[259,1583,270],{"class":269},[259,1585,344],{"class":273},[259,1587,283],{"class":269},[259,1589,354],{"class":269},[259,1591,358],{"class":357},[259,1593,361],{"class":269},[259,1595,312],{"class":364},[259,1597,367],{"class":269},[259,1599,370],{"class":273},[259,1601,373],{"class":269},[259,1603,377],{"class":376},[259,1605,380],{"class":269},[259,1607,289],{"class":269},[259,1609,385],{"class":292},[259,1611,296],{"class":269},[259,1613,283],{"class":269},[259,1615,392],{"class":273},[259,1617,299],{"class":269},[259,1619,1620],{"class":261,"line":397},[259,1621,332],{"emptyLinePlaceholder":331},[259,1623,1624],{"class":261,"line":402},[259,1625,1626],{"class":405},"\u002F\u002F ============================================\n",[259,1628,1629],{"class":261,"line":409},[259,1630,1631],{"class":405},"\u002F\u002F SINGLE ROUTE CALL - call()\n",[259,1633,1634],{"class":261,"line":512},[259,1635,1626],{"class":405},[259,1637,1638],{"class":261,"line":517},[259,1639,1640],{"class":405},"\u002F\u002F Result and error are the direct types from the route\n",[259,1642,1643],{"class":261,"line":523},[259,1644,1645],{"class":405},"\u002F\u002F Returns: [result, error, middleFnResults, middleFnErrors]\n",[259,1647,1648,1650,1652,1655,1657,1660,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685,1687,1689,1691,1693],{"class":261,"line":558},[259,1649,339],{"class":338},[259,1651,428],{"class":269},[259,1653,1654],{"class":273},"user",[259,1656,277],{"class":269},[259,1658,1659],{"class":273}," error",[259,1661,1662],{"class":269},"]",[259,1664,354],{"class":269},[259,1666,444],{"class":265},[259,1668,477],{"class":273},[259,1670,452],{"class":269},[259,1672,482],{"class":273},[259,1674,452],{"class":269},[259,1676,487],{"class":357},[259,1678,370],{"class":273},[259,1680,296],{"class":269},[259,1682,494],{"class":292},[259,1684,296],{"class":269},[259,1686,392],{"class":273},[259,1688,452],{"class":269},[259,1690,504],{"class":357},[259,1692,507],{"class":273},[259,1694,299],{"class":269},[259,1696,1697],{"class":261,"line":591},[259,1698,332],{"emptyLinePlaceholder":331},[259,1700,1701],{"class":261,"line":596},[259,1702,1703],{"class":405},"\u002F\u002F `user` is User | undefined\n",[259,1705,1706],{"class":261,"line":627},[259,1707,1708],{"class":405},"\u002F\u002F `error` is RpcError\u003C'user-not-found', UserNotFoundData> | ValidationError | undefined\n",[259,1710,1711,1713,1716],{"class":261,"line":1021},[259,1712,526],{"class":265},[259,1714,1715],{"class":273}," (error) ",[259,1717,957],{"class":269},[259,1719,1721,1724,1726,1729,1731,1734,1737,1739,1742,1744,1747],{"class":261,"line":1720},16,[259,1722,1723],{"class":265},"    if",[259,1725,842],{"class":376},[259,1727,1728],{"class":273},"error",[259,1730,452],{"class":269},[259,1732,1733],{"class":273},"type",[259,1735,1736],{"class":269}," ===",[259,1738,289],{"class":269},[259,1740,1741],{"class":292},"user-not-found",[259,1743,296],{"class":269},[259,1745,1746],{"class":376},") ",[259,1748,957],{"class":269},[259,1750,1752,1755,1757,1759,1761,1763,1766,1768,1770,1772,1774,1777,1780,1783,1785],{"class":261,"line":1751},17,[259,1753,1754],{"class":273},"        console",[259,1756,452],{"class":269},[259,1758,534],{"class":357},[259,1760,370],{"class":376},[259,1762,296],{"class":269},[259,1764,1765],{"class":292},"User not found:",[259,1767,296],{"class":269},[259,1769,277],{"class":269},[259,1771,1659],{"class":273},[259,1773,452],{"class":269},[259,1775,1776],{"class":273},"errorData",[259,1778,1779],{"class":269},"?.",[259,1781,1782],{"class":273},"requestedId",[259,1784,392],{"class":376},[259,1786,299],{"class":269},[259,1788,1790],{"class":261,"line":1789},18,[259,1791,1792],{"class":269},"    }\n",[259,1794,1796,1798,1801],{"class":261,"line":1795},19,[259,1797,283],{"class":269},[259,1799,1800],{"class":265}," else",[259,1802,1320],{"class":269},[259,1804,1806,1808,1810,1812,1814,1816,1818,1820,1822,1824,1826,1828,1830],{"class":261,"line":1805},20,[259,1807,962],{"class":273},[259,1809,452],{"class":269},[259,1811,534],{"class":357},[259,1813,370],{"class":376},[259,1815,296],{"class":269},[259,1817,642],{"class":292},[259,1819,296],{"class":269},[259,1821,277],{"class":269},[259,1823,422],{"class":273},[259,1825,1779],{"class":269},[259,1827,999],{"class":273},[259,1829,392],{"class":376},[259,1831,299],{"class":269},[259,1833,1835],{"class":261,"line":1834},21,[259,1836,1024],{"class":269},[259,1838,1840],{"class":261,"line":1839},22,[259,1841,332],{"emptyLinePlaceholder":331},[259,1843,1845],{"class":261,"line":1844},23,[259,1846,1626],{"class":405},[259,1848,1850],{"class":261,"line":1849},24,[259,1851,1852],{"class":405},"\u002F\u002F ROUTES_FLOW - Multiple routes in one request\n",[259,1854,1856],{"class":261,"line":1855},25,[259,1857,1626],{"class":405},[259,1859,1861],{"class":261,"line":1860},26,[259,1862,1863],{"class":405},"\u002F\u002F Results and errors are ARRAYS in the same order as the routes\n",[259,1865,1867],{"class":261,"line":1866},27,[259,1868,1869],{"class":405},"\u002F\u002F Returns: [[results...], [errors...], middleFnResults, middleFnErrors]\n",[259,1871,1873,1875,1877,1880,1882,1884,1886,1888,1891,1893,1896,1898,1900,1902,1904],{"class":261,"line":1872},28,[259,1874,339],{"class":338},[259,1876,414],{"class":269},[259,1878,1879],{"class":273},"user2",[259,1881,277],{"class":269},[259,1883,854],{"class":273},[259,1885,425],{"class":269},[259,1887,428],{"class":269},[259,1889,1890],{"class":273},"userError",[259,1892,277],{"class":269},[259,1894,1895],{"class":273}," orderError",[259,1897,439],{"class":269},[259,1899,354],{"class":269},[259,1901,444],{"class":265},[259,1903,280],{"class":357},[259,1905,1906],{"class":273},"([\n",[259,1908,1910,1913,1915,1917,1919,1921,1923,1925,1927,1929,1931],{"class":261,"line":1909},29,[259,1911,1912],{"class":273},"    routes",[259,1914,452],{"class":269},[259,1916,482],{"class":273},[259,1918,452],{"class":269},[259,1920,487],{"class":357},[259,1922,370],{"class":273},[259,1924,296],{"class":269},[259,1926,494],{"class":292},[259,1928,296],{"class":269},[259,1930,392],{"class":273},[259,1932,1347],{"class":269},[259,1934,1936,1938,1940,1942,1944,1946,1948,1950,1953,1955,1957],{"class":261,"line":1935},30,[259,1937,1912],{"class":273},[259,1939,452],{"class":269},[259,1941,801],{"class":273},[259,1943,452],{"class":269},[259,1945,487],{"class":357},[259,1947,370],{"class":273},[259,1949,296],{"class":269},[259,1951,1952],{"class":292},"ORDER-1",[259,1954,296],{"class":269},[259,1956,392],{"class":273},[259,1958,1347],{"class":269},[259,1960,1962,1965,1967,1969,1971],{"class":261,"line":1961},31,[259,1963,1964],{"class":273},"])",[259,1966,452],{"class":269},[259,1968,504],{"class":357},[259,1970,507],{"class":273},[259,1972,299],{"class":269},[259,1974,1976],{"class":261,"line":1975},32,[259,1977,332],{"emptyLinePlaceholder":331},[259,1979,1981],{"class":261,"line":1980},33,[259,1982,1983],{"class":405},"\u002F\u002F `user2` is User | undefined (first route result)\n",[259,1985,1987],{"class":261,"line":1986},34,[259,1988,1989],{"class":405},"\u002F\u002F `order` is Order | undefined (second route result)\n",[259,1991,1993],{"class":261,"line":1992},35,[259,1994,1995],{"class":405},"\u002F\u002F `userError` is RpcError\u003C'user-not-found'> | ValidationError | undefined\n",[259,1997,1999],{"class":261,"line":1998},36,[259,2000,2001],{"class":405},"\u002F\u002F `orderError` is RpcError\u003C'order-not-found'> | ValidationError | undefined\n",[259,2003,2005],{"class":261,"line":2004},37,[259,2006,332],{"emptyLinePlaceholder":331},[259,2008,2010],{"class":261,"line":2009},38,[259,2011,2012],{"class":405},"\u002F\u002F Each result\u002Ferror corresponds to its route by position\n",[259,2014,2016,2018,2020,2022,2024,2026,2028,2030,2032,2034,2036,2038,2040],{"class":261,"line":2015},39,[259,2017,526],{"class":265},[259,2019,601],{"class":273},[259,2021,452],{"class":269},[259,2023,534],{"class":357},[259,2025,370],{"class":273},[259,2027,296],{"class":269},[259,2029,612],{"class":292},[259,2031,296],{"class":269},[259,2033,277],{"class":269},[259,2035,436],{"class":273},[259,2037,452],{"class":269},[259,2039,553],{"class":273},[259,2041,299],{"class":269},[259,2043,2045,2047,2049,2051,2053,2055,2057,2059,2061,2063,2066,2068,2071],{"class":261,"line":2044},40,[259,2046,561],{"class":265},[259,2048,564],{"class":273},[259,2050,452],{"class":269},[259,2052,534],{"class":357},[259,2054,370],{"class":273},[259,2056,296],{"class":269},[259,2058,642],{"class":292},[259,2060,296],{"class":269},[259,2062,277],{"class":269},[259,2064,2065],{"class":273}," user2",[259,2067,1779],{"class":269},[259,2069,2070],{"class":273},"name)",[259,2072,299],{"class":269},[259,2074,2076],{"class":261,"line":2075},41,[259,2077,332],{"emptyLinePlaceholder":331},[259,2079,2081,2083,2086,2088,2090,2092,2094,2097,2099,2101,2103,2105,2107],{"class":261,"line":2080},42,[259,2082,526],{"class":265},[259,2084,2085],{"class":273}," (orderError) console",[259,2087,452],{"class":269},[259,2089,534],{"class":357},[259,2091,370],{"class":273},[259,2093,296],{"class":269},[259,2095,2096],{"class":292},"Order error:",[259,2098,296],{"class":269},[259,2100,277],{"class":269},[259,2102,1895],{"class":273},[259,2104,452],{"class":269},[259,2106,553],{"class":273},[259,2108,299],{"class":269},[259,2110,2112,2114,2116,2118,2120,2122,2124,2127,2129,2131,2133,2135,2138],{"class":261,"line":2111},43,[259,2113,561],{"class":265},[259,2115,564],{"class":273},[259,2117,452],{"class":269},[259,2119,534],{"class":357},[259,2121,370],{"class":273},[259,2123,296],{"class":269},[259,2125,2126],{"class":292},"Order:",[259,2128,296],{"class":269},[259,2130,277],{"class":269},[259,2132,854],{"class":273},[259,2134,1779],{"class":269},[259,2136,2137],{"class":273},"id)",[259,2139,299],{"class":269},[1026,2141,2143],{"id":2142},"response-pattern-comparison","Response Pattern Comparison",[250,2145,2147],{"className":252,"code":2146,"language":254,"meta":255,"style":255},"\u002F\u002F Single route call - direct result\u002Ferror\nconst [result, error, middleFnResults, middleFnErrors] = await route.call();\n\n\u002F\u002F RoutesFlow - arrays of results\u002Ferrors\nconst [[result1, result2], [error1, error2], middleFnResults, middleFnErrors] = await routesFlow([route1, route2]).call();\n",[205,2148,2149,2154,2194,2198,2203],{"__ignoreMap":255},[259,2150,2151],{"class":261,"line":262},[259,2152,2153],{"class":405},"\u002F\u002F Single route call - direct result\u002Ferror\n",[259,2155,2156,2158,2160,2163,2165,2167,2169,2172,2174,2177,2179,2181,2183,2186,2188,2190,2192],{"class":261,"line":302},[259,2157,339],{"class":338},[259,2159,428],{"class":269},[259,2161,2162],{"class":273},"result",[259,2164,277],{"class":269},[259,2166,1659],{"class":273},[259,2168,277],{"class":269},[259,2170,2171],{"class":273}," middleFnResults",[259,2173,277],{"class":269},[259,2175,2176],{"class":273}," middleFnErrors",[259,2178,1662],{"class":269},[259,2180,354],{"class":269},[259,2182,444],{"class":265},[259,2184,2185],{"class":273}," route",[259,2187,452],{"class":269},[259,2189,504],{"class":357},[259,2191,507],{"class":273},[259,2193,299],{"class":269},[259,2195,2196],{"class":261,"line":328},[259,2197,332],{"emptyLinePlaceholder":331},[259,2199,2200],{"class":261,"line":335},[259,2201,2202],{"class":405},"\u002F\u002F RoutesFlow - arrays of results\u002Ferrors\n",[259,2204,2205,2207,2209,2212,2214,2217,2219,2221,2224,2226,2229,2231,2233,2235,2237,2239,2241,2243,2245,2248,2250,2253,2255,2257,2259],{"class":261,"line":397},[259,2206,339],{"class":338},[259,2208,414],{"class":269},[259,2210,2211],{"class":273},"result1",[259,2213,277],{"class":269},[259,2215,2216],{"class":273}," result2",[259,2218,425],{"class":269},[259,2220,428],{"class":269},[259,2222,2223],{"class":273},"error1",[259,2225,277],{"class":269},[259,2227,2228],{"class":273}," error2",[259,2230,425],{"class":269},[259,2232,2171],{"class":273},[259,2234,277],{"class":269},[259,2236,2176],{"class":273},[259,2238,1662],{"class":269},[259,2240,354],{"class":269},[259,2242,444],{"class":265},[259,2244,280],{"class":357},[259,2246,2247],{"class":273},"([route1",[259,2249,277],{"class":269},[259,2251,2252],{"class":273}," route2])",[259,2254,452],{"class":269},[259,2256,504],{"class":357},[259,2258,507],{"class":273},[259,2260,299],{"class":269},[219,2262,2263,2268],{},[201,2264,2265],{},[210,2266,2267],{},"When to use routesFlow:",[2269,2270,2271,2274,2277],"ul",{},[1034,2272,2273],{},"Fetching data for a page that needs multiple API calls",[1034,2275,2276],{},"Batch operations that don't depend on each other",[1034,2278,2279],{},"Reducing network latency in high-latency environments",[1434,2281],{},[238,2283,2285],{"id":2284},"using-middlefns-with-routesflow","Using MiddleFns with RoutesFlow",[201,2287,2288],{},"You can include middleFns (like authentication) in your routesFlow:",[250,2290,2292],{"className":252,"code":2291,"language":254,"meta":255,"style":255},"import {initClient, routesFlow} from '@mionjs\u002Fclient';\nimport {HeadersSubset} from '@mionjs\u002Fcore';\nimport type {MyApi} from '.\u002Fserver.routes.ts';\n\nconst {routes, middleFns} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\nconst authHeaders = new HeadersSubset({Authorization: 'my-token'});\n\n\u002F\u002F Execute routesFlow with explicit middleFns\nconst [[sum, user], [sumError, userError], middleFnResults, middleFnErrors] = await routesFlow([\n    routes.utils.sum(5, 2),\n    routes.users.getById('USER-123'),\n]).call({middleFns: {auth: middleFns.auth(authHeaders)}});\n\n\u002F\u002F Check middleFn errors\nif (middleFnErrors?.auth) {\n    console.log('Auth failed:', middleFnErrors.auth.publicMessage);\n}\n\n\u002F\u002F Handle route results\nif (!sumError) console.log('Sum:', sum);\nif (!userError) console.log('User:', user);\n",[205,2293,2294,2318,2340,2362,2366,2410,2414,2451,2455,2460,2500,2524,2548,2588,2592,2597,2611,2645,2649,2653,2658,2688],{"__ignoreMap":255},[259,2295,2296,2298,2300,2302,2304,2306,2308,2310,2312,2314,2316],{"class":261,"line":262},[259,2297,266],{"class":265},[259,2299,270],{"class":269},[259,2301,274],{"class":273},[259,2303,277],{"class":269},[259,2305,280],{"class":273},[259,2307,283],{"class":269},[259,2309,286],{"class":265},[259,2311,289],{"class":269},[259,2313,293],{"class":292},[259,2315,296],{"class":269},[259,2317,299],{"class":269},[259,2319,2320,2322,2324,2327,2329,2331,2333,2336,2338],{"class":261,"line":302},[259,2321,266],{"class":265},[259,2323,270],{"class":269},[259,2325,2326],{"class":273},"HeadersSubset",[259,2328,283],{"class":269},[259,2330,286],{"class":265},[259,2332,289],{"class":269},[259,2334,2335],{"class":292},"@mionjs\u002Fcore",[259,2337,296],{"class":269},[259,2339,299],{"class":269},[259,2341,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360],{"class":261,"line":328},[259,2343,266],{"class":265},[259,2345,307],{"class":265},[259,2347,270],{"class":269},[259,2349,312],{"class":273},[259,2351,283],{"class":269},[259,2353,286],{"class":265},[259,2355,289],{"class":269},[259,2357,321],{"class":292},[259,2359,296],{"class":269},[259,2361,299],{"class":269},[259,2363,2364],{"class":261,"line":335},[259,2365,332],{"emptyLinePlaceholder":331},[259,2367,2368,2370,2372,2374,2376,2378,2380,2382,2384,2386,2388,2390,2392,2394,2396,2398,2400,2402,2404,2406,2408],{"class":261,"line":397},[259,2369,339],{"class":338},[259,2371,270],{"class":269},[259,2373,344],{"class":273},[259,2375,277],{"class":269},[259,2377,349],{"class":273},[259,2379,283],{"class":269},[259,2381,354],{"class":269},[259,2383,358],{"class":357},[259,2385,361],{"class":269},[259,2387,312],{"class":364},[259,2389,367],{"class":269},[259,2391,370],{"class":273},[259,2393,373],{"class":269},[259,2395,377],{"class":376},[259,2397,380],{"class":269},[259,2399,289],{"class":269},[259,2401,385],{"class":292},[259,2403,296],{"class":269},[259,2405,283],{"class":269},[259,2407,392],{"class":273},[259,2409,299],{"class":269},[259,2411,2412],{"class":261,"line":402},[259,2413,332],{"emptyLinePlaceholder":331},[259,2415,2416,2418,2421,2423,2426,2429,2431,2433,2436,2438,2440,2443,2445,2447,2449],{"class":261,"line":409},[259,2417,339],{"class":338},[259,2419,2420],{"class":273}," authHeaders ",[259,2422,794],{"class":269},[259,2424,2425],{"class":269}," new",[259,2427,2428],{"class":357}," HeadersSubset",[259,2430,370],{"class":273},[259,2432,373],{"class":269},[259,2434,2435],{"class":376},"Authorization",[259,2437,380],{"class":269},[259,2439,289],{"class":269},[259,2441,2442],{"class":292},"my-token",[259,2444,296],{"class":269},[259,2446,283],{"class":269},[259,2448,392],{"class":273},[259,2450,299],{"class":269},[259,2452,2453],{"class":261,"line":512},[259,2454,332],{"emptyLinePlaceholder":331},[259,2456,2457],{"class":261,"line":517},[259,2458,2459],{"class":405},"\u002F\u002F Execute routesFlow with explicit middleFns\n",[259,2461,2462,2464,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490,2492,2494,2496,2498],{"class":261,"line":523},[259,2463,339],{"class":338},[259,2465,414],{"class":269},[259,2467,417],{"class":273},[259,2469,277],{"class":269},[259,2471,422],{"class":273},[259,2473,425],{"class":269},[259,2475,428],{"class":269},[259,2477,431],{"class":273},[259,2479,277],{"class":269},[259,2481,436],{"class":273},[259,2483,425],{"class":269},[259,2485,2171],{"class":273},[259,2487,277],{"class":269},[259,2489,2176],{"class":273},[259,2491,1662],{"class":269},[259,2493,354],{"class":269},[259,2495,444],{"class":265},[259,2497,280],{"class":357},[259,2499,1906],{"class":273},[259,2501,2502,2504,2506,2508,2510,2512,2514,2516,2518,2520,2522],{"class":261,"line":558},[259,2503,1912],{"class":273},[259,2505,452],{"class":269},[259,2507,455],{"class":273},[259,2509,452],{"class":269},[259,2511,417],{"class":357},[259,2513,370],{"class":273},[259,2515,465],{"class":464},[259,2517,277],{"class":269},[259,2519,470],{"class":464},[259,2521,392],{"class":273},[259,2523,1347],{"class":269},[259,2525,2526,2528,2530,2532,2534,2536,2538,2540,2542,2544,2546],{"class":261,"line":591},[259,2527,1912],{"class":273},[259,2529,452],{"class":269},[259,2531,482],{"class":273},[259,2533,452],{"class":269},[259,2535,487],{"class":357},[259,2537,370],{"class":273},[259,2539,296],{"class":269},[259,2541,494],{"class":292},[259,2543,296],{"class":269},[259,2545,392],{"class":273},[259,2547,1347],{"class":269},[259,2549,2550,2552,2554,2556,2558,2560,2563,2565,2567,2570,2572,2574,2576,2578,2581,2584,2586],{"class":261,"line":596},[259,2551,1964],{"class":273},[259,2553,452],{"class":269},[259,2555,504],{"class":357},[259,2557,370],{"class":273},[259,2559,373],{"class":269},[259,2561,2562],{"class":376},"middleFns",[259,2564,380],{"class":269},[259,2566,270],{"class":269},[259,2568,2569],{"class":376},"auth",[259,2571,380],{"class":269},[259,2573,349],{"class":273},[259,2575,452],{"class":269},[259,2577,2569],{"class":357},[259,2579,2580],{"class":273},"(authHeaders)",[259,2582,2583],{"class":269},"}}",[259,2585,392],{"class":273},[259,2587,299],{"class":269},[259,2589,2590],{"class":261,"line":627},[259,2591,332],{"emptyLinePlaceholder":331},[259,2593,2594],{"class":261,"line":1021},[259,2595,2596],{"class":405},"\u002F\u002F Check middleFn errors\n",[259,2598,2599,2601,2604,2606,2609],{"class":261,"line":1720},[259,2600,526],{"class":265},[259,2602,2603],{"class":273}," (middleFnErrors",[259,2605,1779],{"class":269},[259,2607,2608],{"class":273},"auth) ",[259,2610,957],{"class":269},[259,2612,2613,2615,2617,2619,2621,2623,2626,2628,2630,2632,2634,2636,2638,2641,2643],{"class":261,"line":1751},[259,2614,962],{"class":273},[259,2616,452],{"class":269},[259,2618,534],{"class":357},[259,2620,370],{"class":376},[259,2622,296],{"class":269},[259,2624,2625],{"class":292},"Auth failed:",[259,2627,296],{"class":269},[259,2629,277],{"class":269},[259,2631,2176],{"class":273},[259,2633,452],{"class":269},[259,2635,2569],{"class":273},[259,2637,452],{"class":269},[259,2639,2640],{"class":273},"publicMessage",[259,2642,392],{"class":376},[259,2644,299],{"class":269},[259,2646,2647],{"class":261,"line":1789},[259,2648,1024],{"class":269},[259,2650,2651],{"class":261,"line":1795},[259,2652,332],{"emptyLinePlaceholder":331},[259,2654,2655],{"class":261,"line":1805},[259,2656,2657],{"class":405},"\u002F\u002F Handle route results\n",[259,2659,2660,2662,2664,2667,2670,2672,2674,2676,2678,2680,2682,2684,2686],{"class":261,"line":1834},[259,2661,526],{"class":265},[259,2663,842],{"class":273},[259,2665,2666],{"class":269},"!",[259,2668,2669],{"class":273},"sumError) console",[259,2671,452],{"class":269},[259,2673,534],{"class":357},[259,2675,370],{"class":273},[259,2677,296],{"class":269},[259,2679,575],{"class":292},[259,2681,296],{"class":269},[259,2683,277],{"class":269},[259,2685,582],{"class":273},[259,2687,299],{"class":269},[259,2689,2690,2692,2694,2696,2699,2701,2703,2705,2707,2709,2711,2713,2715],{"class":261,"line":1839},[259,2691,526],{"class":265},[259,2693,842],{"class":273},[259,2695,2666],{"class":269},[259,2697,2698],{"class":273},"userError) console",[259,2700,452],{"class":269},[259,2702,534],{"class":357},[259,2704,370],{"class":273},[259,2706,296],{"class":269},[259,2708,642],{"class":292},[259,2710,296],{"class":269},[259,2712,277],{"class":269},[259,2714,649],{"class":273},[259,2716,299],{"class":269},[2718,2719,2720],"note",{},"MiddleFns are executed once for the entire routesFlow, not once per route. This is more efficient than making separate calls.",[1434,2722],{},[238,2724,2726],{"id":2725},"alternative-syntax-call-with-otherroutes","Alternative Syntax: call with otherRoutes",[201,2728,2729,2730,2732,2733,2736],{},"If you prefer starting from a route, use ",[205,2731,1445],{}," with the ",[205,2734,2735],{},"otherRoutes"," option to add more routes:",[250,2738,2740],{"className":252,"code":2739,"language":254,"meta":255,"style":255},"import {initClient} from '@mionjs\u002Fclient';\nimport {HeadersSubset} from '@mionjs\u002Fcore';\nimport type {MyApi} from '.\u002Fserver.routes.ts';\n\nconst {routes, middleFns} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\nconst authHeaders = new HeadersSubset({Authorization: 'my-token'});\n\n\u002F\u002F Alternative syntax: start from a route and add more routes to the routesFlow\nconst [[sum, user, order], [sumError, userError, orderError]] = await routes.utils.sum(5, 2).call({\n    otherRoutes: [routes.users.getById('USER-123'), routes.orders.getById('ORDER-1')],\n    middleFns: {auth: middleFns.auth(authHeaders)},\n});\n\n\u002F\u002F Handle results - same array pattern as routesFlow()\nif (!sumError) console.log('Sum:', sum);\nif (!userError) console.log('User:', user);\nif (!orderError) console.log('Order:', order);\n",[205,2741,2742,2762,2782,2804,2808,2852,2856,2888,2892,2897,2961,3014,3038,3046,3050,3055,3083,3111],{"__ignoreMap":255},[259,2743,2744,2746,2748,2750,2752,2754,2756,2758,2760],{"class":261,"line":262},[259,2745,266],{"class":265},[259,2747,270],{"class":269},[259,2749,274],{"class":273},[259,2751,283],{"class":269},[259,2753,286],{"class":265},[259,2755,289],{"class":269},[259,2757,293],{"class":292},[259,2759,296],{"class":269},[259,2761,299],{"class":269},[259,2763,2764,2766,2768,2770,2772,2774,2776,2778,2780],{"class":261,"line":302},[259,2765,266],{"class":265},[259,2767,270],{"class":269},[259,2769,2326],{"class":273},[259,2771,283],{"class":269},[259,2773,286],{"class":265},[259,2775,289],{"class":269},[259,2777,2335],{"class":292},[259,2779,296],{"class":269},[259,2781,299],{"class":269},[259,2783,2784,2786,2788,2790,2792,2794,2796,2798,2800,2802],{"class":261,"line":328},[259,2785,266],{"class":265},[259,2787,307],{"class":265},[259,2789,270],{"class":269},[259,2791,312],{"class":273},[259,2793,283],{"class":269},[259,2795,286],{"class":265},[259,2797,289],{"class":269},[259,2799,321],{"class":292},[259,2801,296],{"class":269},[259,2803,299],{"class":269},[259,2805,2806],{"class":261,"line":335},[259,2807,332],{"emptyLinePlaceholder":331},[259,2809,2810,2812,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832,2834,2836,2838,2840,2842,2844,2846,2848,2850],{"class":261,"line":397},[259,2811,339],{"class":338},[259,2813,270],{"class":269},[259,2815,344],{"class":273},[259,2817,277],{"class":269},[259,2819,349],{"class":273},[259,2821,283],{"class":269},[259,2823,354],{"class":269},[259,2825,358],{"class":357},[259,2827,361],{"class":269},[259,2829,312],{"class":364},[259,2831,367],{"class":269},[259,2833,370],{"class":273},[259,2835,373],{"class":269},[259,2837,377],{"class":376},[259,2839,380],{"class":269},[259,2841,289],{"class":269},[259,2843,385],{"class":292},[259,2845,296],{"class":269},[259,2847,283],{"class":269},[259,2849,392],{"class":273},[259,2851,299],{"class":269},[259,2853,2854],{"class":261,"line":402},[259,2855,332],{"emptyLinePlaceholder":331},[259,2857,2858,2860,2862,2864,2866,2868,2870,2872,2874,2876,2878,2880,2882,2884,2886],{"class":261,"line":409},[259,2859,339],{"class":338},[259,2861,2420],{"class":273},[259,2863,794],{"class":269},[259,2865,2425],{"class":269},[259,2867,2428],{"class":357},[259,2869,370],{"class":273},[259,2871,373],{"class":269},[259,2873,2435],{"class":376},[259,2875,380],{"class":269},[259,2877,289],{"class":269},[259,2879,2442],{"class":292},[259,2881,296],{"class":269},[259,2883,283],{"class":269},[259,2885,392],{"class":273},[259,2887,299],{"class":269},[259,2889,2890],{"class":261,"line":512},[259,2891,332],{"emptyLinePlaceholder":331},[259,2893,2894],{"class":261,"line":517},[259,2895,2896],{"class":405},"\u002F\u002F Alternative syntax: start from a route and add more routes to the routesFlow\n",[259,2898,2899,2901,2903,2905,2907,2909,2911,2913,2915,2917,2919,2921,2923,2925,2927,2929,2931,2933,2935,2937,2939,2941,2943,2945,2947,2949,2951,2953,2955,2957,2959],{"class":261,"line":523},[259,2900,339],{"class":338},[259,2902,414],{"class":269},[259,2904,417],{"class":273},[259,2906,277],{"class":269},[259,2908,422],{"class":273},[259,2910,277],{"class":269},[259,2912,854],{"class":273},[259,2914,425],{"class":269},[259,2916,428],{"class":269},[259,2918,431],{"class":273},[259,2920,277],{"class":269},[259,2922,436],{"class":273},[259,2924,277],{"class":269},[259,2926,1895],{"class":273},[259,2928,439],{"class":269},[259,2930,354],{"class":269},[259,2932,444],{"class":265},[259,2934,477],{"class":273},[259,2936,452],{"class":269},[259,2938,455],{"class":273},[259,2940,452],{"class":269},[259,2942,417],{"class":357},[259,2944,370],{"class":273},[259,2946,465],{"class":464},[259,2948,277],{"class":269},[259,2950,470],{"class":464},[259,2952,392],{"class":273},[259,2954,452],{"class":269},[259,2956,504],{"class":357},[259,2958,370],{"class":273},[259,2960,957],{"class":269},[259,2962,2963,2966,2968,2971,2973,2975,2977,2979,2981,2983,2985,2987,2989,2991,2993,2995,2997,2999,3001,3003,3005,3007,3009,3012],{"class":261,"line":558},[259,2964,2965],{"class":376},"    otherRoutes",[259,2967,380],{"class":269},[259,2969,2970],{"class":273}," [routes",[259,2972,452],{"class":269},[259,2974,482],{"class":273},[259,2976,452],{"class":269},[259,2978,487],{"class":357},[259,2980,370],{"class":273},[259,2982,296],{"class":269},[259,2984,494],{"class":292},[259,2986,296],{"class":269},[259,2988,392],{"class":273},[259,2990,277],{"class":269},[259,2992,477],{"class":273},[259,2994,452],{"class":269},[259,2996,801],{"class":273},[259,2998,452],{"class":269},[259,3000,487],{"class":357},[259,3002,370],{"class":273},[259,3004,296],{"class":269},[259,3006,1952],{"class":292},[259,3008,296],{"class":269},[259,3010,3011],{"class":273},")]",[259,3013,1347],{"class":269},[259,3015,3016,3019,3021,3023,3025,3027,3029,3031,3033,3035],{"class":261,"line":591},[259,3017,3018],{"class":376},"    middleFns",[259,3020,380],{"class":269},[259,3022,270],{"class":269},[259,3024,2569],{"class":376},[259,3026,380],{"class":269},[259,3028,349],{"class":273},[259,3030,452],{"class":269},[259,3032,2569],{"class":357},[259,3034,2580],{"class":273},[259,3036,3037],{"class":269},"},\n",[259,3039,3040,3042,3044],{"class":261,"line":596},[259,3041,283],{"class":269},[259,3043,392],{"class":273},[259,3045,299],{"class":269},[259,3047,3048],{"class":261,"line":627},[259,3049,332],{"emptyLinePlaceholder":331},[259,3051,3052],{"class":261,"line":1021},[259,3053,3054],{"class":405},"\u002F\u002F Handle results - same array pattern as routesFlow()\n",[259,3056,3057,3059,3061,3063,3065,3067,3069,3071,3073,3075,3077,3079,3081],{"class":261,"line":1720},[259,3058,526],{"class":265},[259,3060,842],{"class":273},[259,3062,2666],{"class":269},[259,3064,2669],{"class":273},[259,3066,452],{"class":269},[259,3068,534],{"class":357},[259,3070,370],{"class":273},[259,3072,296],{"class":269},[259,3074,575],{"class":292},[259,3076,296],{"class":269},[259,3078,277],{"class":269},[259,3080,582],{"class":273},[259,3082,299],{"class":269},[259,3084,3085,3087,3089,3091,3093,3095,3097,3099,3101,3103,3105,3107,3109],{"class":261,"line":1751},[259,3086,526],{"class":265},[259,3088,842],{"class":273},[259,3090,2666],{"class":269},[259,3092,2698],{"class":273},[259,3094,452],{"class":269},[259,3096,534],{"class":357},[259,3098,370],{"class":273},[259,3100,296],{"class":269},[259,3102,642],{"class":292},[259,3104,296],{"class":269},[259,3106,277],{"class":269},[259,3108,649],{"class":273},[259,3110,299],{"class":269},[259,3112,3113,3115,3117,3119,3122,3124,3126,3128,3130,3132,3134,3136,3139],{"class":261,"line":1789},[259,3114,526],{"class":265},[259,3116,842],{"class":273},[259,3118,2666],{"class":269},[259,3120,3121],{"class":273},"orderError) console",[259,3123,452],{"class":269},[259,3125,534],{"class":357},[259,3127,370],{"class":273},[259,3129,296],{"class":269},[259,3131,2126],{"class":292},[259,3133,296],{"class":269},[259,3135,277],{"class":269},[259,3137,3138],{"class":273}," order)",[259,3140,299],{"class":269},[201,3142,3143,3144,1446,3146,3149],{},"Both ",[205,3145,247],{},[205,3147,3148],{},"call({otherRoutes: [...]})"," produce the same result - choose the syntax that fits your code style.",[1434,3151],{},[238,3153,3155],{"id":3154},"error-handling-in-routesflows","Error Handling in RoutesFlows",[201,3157,3158],{},"In a routesFlow, each route can succeed or fail independently. The error array contains errors at the same index as their corresponding routes:",[250,3160,3162],{"className":252,"code":3161,"language":254,"meta":255,"style":255},"const [[user, order, sum], [userError, orderError, sumError]] = await routesFlow([\n    routes.users.getById('USER-123'),    \u002F\u002F index 0\n    routes.orders.getById('ORDER-404'),  \u002F\u002F index 1 - this will fail\n    routes.utils.sum(5, 2),              \u002F\u002F index 2\n]).call();\n\n\u002F\u002F Results:\n\u002F\u002F user = {id: 'USER-123', ...}  - success\n\u002F\u002F userError = undefined\n\n\u002F\u002F order = undefined              - failed\n\u002F\u002F orderError = RpcError\u003C'order-not-found'>\n\n\u002F\u002F sum = 7                        - success\n\u002F\u002F sumError = undefined\n",[205,3163,3164,3205,3232,3260,3287,3299,3303,3308,3313,3318,3322,3327,3332,3336,3341],{"__ignoreMap":255},[259,3165,3166,3168,3170,3172,3174,3176,3178,3181,3183,3185,3187,3189,3191,3193,3195,3197,3199,3201,3203],{"class":261,"line":262},[259,3167,339],{"class":338},[259,3169,414],{"class":269},[259,3171,1654],{"class":273},[259,3173,277],{"class":269},[259,3175,854],{"class":273},[259,3177,277],{"class":269},[259,3179,3180],{"class":273}," sum",[259,3182,425],{"class":269},[259,3184,428],{"class":269},[259,3186,1890],{"class":273},[259,3188,277],{"class":269},[259,3190,1895],{"class":273},[259,3192,277],{"class":269},[259,3194,548],{"class":273},[259,3196,439],{"class":269},[259,3198,354],{"class":269},[259,3200,444],{"class":265},[259,3202,280],{"class":357},[259,3204,1906],{"class":273},[259,3206,3207,3209,3211,3213,3215,3217,3219,3221,3223,3225,3227,3229],{"class":261,"line":302},[259,3208,1912],{"class":273},[259,3210,452],{"class":269},[259,3212,482],{"class":273},[259,3214,452],{"class":269},[259,3216,487],{"class":357},[259,3218,370],{"class":273},[259,3220,296],{"class":269},[259,3222,494],{"class":292},[259,3224,296],{"class":269},[259,3226,392],{"class":273},[259,3228,277],{"class":269},[259,3230,3231],{"class":405},"    \u002F\u002F index 0\n",[259,3233,3234,3236,3238,3240,3242,3244,3246,3248,3251,3253,3255,3257],{"class":261,"line":328},[259,3235,1912],{"class":273},[259,3237,452],{"class":269},[259,3239,801],{"class":273},[259,3241,452],{"class":269},[259,3243,487],{"class":357},[259,3245,370],{"class":273},[259,3247,296],{"class":269},[259,3249,3250],{"class":292},"ORDER-404",[259,3252,296],{"class":269},[259,3254,392],{"class":273},[259,3256,277],{"class":269},[259,3258,3259],{"class":405},"  \u002F\u002F index 1 - this will fail\n",[259,3261,3262,3264,3266,3268,3270,3272,3274,3276,3278,3280,3282,3284],{"class":261,"line":335},[259,3263,1912],{"class":273},[259,3265,452],{"class":269},[259,3267,455],{"class":273},[259,3269,452],{"class":269},[259,3271,417],{"class":357},[259,3273,370],{"class":273},[259,3275,465],{"class":464},[259,3277,277],{"class":269},[259,3279,470],{"class":464},[259,3281,392],{"class":273},[259,3283,277],{"class":269},[259,3285,3286],{"class":405},"              \u002F\u002F index 2\n",[259,3288,3289,3291,3293,3295,3297],{"class":261,"line":397},[259,3290,1964],{"class":273},[259,3292,452],{"class":269},[259,3294,504],{"class":357},[259,3296,507],{"class":273},[259,3298,299],{"class":269},[259,3300,3301],{"class":261,"line":402},[259,3302,332],{"emptyLinePlaceholder":331},[259,3304,3305],{"class":261,"line":409},[259,3306,3307],{"class":405},"\u002F\u002F Results:\n",[259,3309,3310],{"class":261,"line":512},[259,3311,3312],{"class":405},"\u002F\u002F user = {id: 'USER-123', ...}  - success\n",[259,3314,3315],{"class":261,"line":517},[259,3316,3317],{"class":405},"\u002F\u002F userError = undefined\n",[259,3319,3320],{"class":261,"line":523},[259,3321,332],{"emptyLinePlaceholder":331},[259,3323,3324],{"class":261,"line":558},[259,3325,3326],{"class":405},"\u002F\u002F order = undefined              - failed\n",[259,3328,3329],{"class":261,"line":591},[259,3330,3331],{"class":405},"\u002F\u002F orderError = RpcError\u003C'order-not-found'>\n",[259,3333,3334],{"class":261,"line":596},[259,3335,332],{"emptyLinePlaceholder":331},[259,3337,3338],{"class":261,"line":627},[259,3339,3340],{"class":405},"\u002F\u002F sum = 7                        - success\n",[259,3342,3343],{"class":261,"line":1021},[259,3344,3345],{"class":405},"\u002F\u002F sumError = undefined\n",[3347,3348,3349],"warning",{},"A failing route does NOT stop other routes from executing. Each route in the routesFlow is processed independently.",[1434,3351],{},[238,3353,3355],{"id":3354},"serialization-in-routesflows","Serialization in RoutesFlows",[201,3357,3358,3359,3362,3363,3366,3367,3370],{},"Complex types like ",[205,3360,3361],{},"Date",", ",[205,3364,3365],{},"Map",", and ",[205,3368,3369],{},"Set"," are automatically serialized and deserialized in routesFlows, just like single route calls:",[250,3372,3374],{"className":252,"code":3373,"language":254,"meta":255,"style":255},"const testDate = new Date('2024-06-15T12:30:00.000Z');\nconst testMap = new Map([['a', 1], ['b', 2]]);\n\nconst [[date, map], [dateError, mapError]] = await routesFlow([\n    routes.getSameDate(testDate),\n    routes.getSameMap(testMap),\n]).call();\n\n\u002F\u002F date is a Date instance\n\u002F\u002F map is a Map instance\n",[205,3375,3376,3403,3454,3458,3494,3508,3522,3534,3538,3543],{"__ignoreMap":255},[259,3377,3378,3380,3383,3385,3387,3390,3392,3394,3397,3399,3401],{"class":261,"line":262},[259,3379,339],{"class":338},[259,3381,3382],{"class":273}," testDate ",[259,3384,794],{"class":269},[259,3386,2425],{"class":269},[259,3388,3389],{"class":357}," Date",[259,3391,370],{"class":273},[259,3393,296],{"class":269},[259,3395,3396],{"class":292},"2024-06-15T12:30:00.000Z",[259,3398,296],{"class":269},[259,3400,392],{"class":273},[259,3402,299],{"class":269},[259,3404,3405,3407,3410,3412,3414,3417,3420,3422,3425,3427,3429,3432,3434,3436,3438,3440,3443,3445,3447,3449,3452],{"class":261,"line":302},[259,3406,339],{"class":338},[259,3408,3409],{"class":273}," testMap ",[259,3411,794],{"class":269},[259,3413,2425],{"class":269},[259,3415,3416],{"class":357}," Map",[259,3418,3419],{"class":273},"([[",[259,3421,296],{"class":269},[259,3423,3424],{"class":292},"a",[259,3426,296],{"class":269},[259,3428,277],{"class":269},[259,3430,3431],{"class":464}," 1",[259,3433,1662],{"class":273},[259,3435,277],{"class":269},[259,3437,428],{"class":273},[259,3439,296],{"class":269},[259,3441,3442],{"class":292},"b",[259,3444,296],{"class":269},[259,3446,277],{"class":269},[259,3448,470],{"class":464},[259,3450,3451],{"class":273},"]])",[259,3453,299],{"class":269},[259,3455,3456],{"class":261,"line":328},[259,3457,332],{"emptyLinePlaceholder":331},[259,3459,3460,3462,3464,3467,3469,3472,3474,3476,3479,3481,3484,3486,3488,3490,3492],{"class":261,"line":335},[259,3461,339],{"class":338},[259,3463,414],{"class":269},[259,3465,3466],{"class":273},"date",[259,3468,277],{"class":269},[259,3470,3471],{"class":273}," map",[259,3473,425],{"class":269},[259,3475,428],{"class":269},[259,3477,3478],{"class":273},"dateError",[259,3480,277],{"class":269},[259,3482,3483],{"class":273}," mapError",[259,3485,439],{"class":269},[259,3487,354],{"class":269},[259,3489,444],{"class":265},[259,3491,280],{"class":357},[259,3493,1906],{"class":273},[259,3495,3496,3498,3500,3503,3506],{"class":261,"line":397},[259,3497,1912],{"class":273},[259,3499,452],{"class":269},[259,3501,3502],{"class":357},"getSameDate",[259,3504,3505],{"class":273},"(testDate)",[259,3507,1347],{"class":269},[259,3509,3510,3512,3514,3517,3520],{"class":261,"line":402},[259,3511,1912],{"class":273},[259,3513,452],{"class":269},[259,3515,3516],{"class":357},"getSameMap",[259,3518,3519],{"class":273},"(testMap)",[259,3521,1347],{"class":269},[259,3523,3524,3526,3528,3530,3532],{"class":261,"line":409},[259,3525,1964],{"class":273},[259,3527,452],{"class":269},[259,3529,504],{"class":357},[259,3531,507],{"class":273},[259,3533,299],{"class":269},[259,3535,3536],{"class":261,"line":512},[259,3537,332],{"emptyLinePlaceholder":331},[259,3539,3540],{"class":261,"line":517},[259,3541,3542],{"class":405},"\u002F\u002F date is a Date instance\n",[259,3544,3545],{"class":261,"line":523},[259,3546,3547],{"class":405},"\u002F\u002F map is a Map instance\n",[1434,3549],{},[238,3551,3553],{"id":3552},"constraints","Constraints",[3555,3556,3558],"stylish-list",{"type":3557},"x",[2269,3559,3560,3568],{},[1034,3561,3562,3567],{},[259,3563,3566],{"className":3564},[3565],"text-highlighted","Same client instance:"," All routes in a routesFlow must use the same client",[1034,3569,3570,3574],{},[259,3571,3573],{"className":3572},[3565],"At least one route:"," RoutesFlow requires at least one route subrequest",[250,3576,3578],{"className":252,"code":3577,"language":254,"meta":255,"style":255},"\u002F\u002F ❌ This will throw an error\nconst {routes: routes1} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Fserver1.com'});\nconst {routes: routes2} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Fserver2.com'});\n\nawait routesFlow([routes1.getUser('1'), routes2.getOrder('1')]).call(); \u002F\u002F Error!\n\n\u002F\u002F ✅ Use routes from the same client\nconst {routes} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\nawait routesFlow([routes.getUser('1'), routes.getOrder('1')]).call(); \u002F\u002F Works!\n",[205,3579,3580,3585,3631,3677,3681,3737,3741,3746,3786],{"__ignoreMap":255},[259,3581,3582],{"class":261,"line":262},[259,3583,3584],{"class":405},"\u002F\u002F ❌ This will throw an error\n",[259,3586,3587,3589,3591,3593,3595,3598,3600,3602,3604,3606,3608,3610,3612,3614,3616,3618,3620,3623,3625,3627,3629],{"class":261,"line":302},[259,3588,339],{"class":338},[259,3590,270],{"class":269},[259,3592,344],{"class":376},[259,3594,380],{"class":269},[259,3596,3597],{"class":273}," routes1",[259,3599,283],{"class":269},[259,3601,354],{"class":269},[259,3603,358],{"class":357},[259,3605,361],{"class":269},[259,3607,312],{"class":364},[259,3609,367],{"class":269},[259,3611,370],{"class":273},[259,3613,373],{"class":269},[259,3615,377],{"class":376},[259,3617,380],{"class":269},[259,3619,289],{"class":269},[259,3621,3622],{"class":292},"http:\u002F\u002Fserver1.com",[259,3624,296],{"class":269},[259,3626,283],{"class":269},[259,3628,392],{"class":273},[259,3630,299],{"class":269},[259,3632,3633,3635,3637,3639,3641,3644,3646,3648,3650,3652,3654,3656,3658,3660,3662,3664,3666,3669,3671,3673,3675],{"class":261,"line":328},[259,3634,339],{"class":338},[259,3636,270],{"class":269},[259,3638,344],{"class":376},[259,3640,380],{"class":269},[259,3642,3643],{"class":273}," routes2",[259,3645,283],{"class":269},[259,3647,354],{"class":269},[259,3649,358],{"class":357},[259,3651,361],{"class":269},[259,3653,312],{"class":364},[259,3655,367],{"class":269},[259,3657,370],{"class":273},[259,3659,373],{"class":269},[259,3661,377],{"class":376},[259,3663,380],{"class":269},[259,3665,289],{"class":269},[259,3667,3668],{"class":292},"http:\u002F\u002Fserver2.com",[259,3670,296],{"class":269},[259,3672,283],{"class":269},[259,3674,392],{"class":273},[259,3676,299],{"class":269},[259,3678,3679],{"class":261,"line":335},[259,3680,332],{"emptyLinePlaceholder":331},[259,3682,3683,3686,3688,3691,3693,3696,3698,3700,3703,3705,3707,3709,3711,3713,3716,3718,3720,3722,3724,3726,3728,3730,3732,3734],{"class":261,"line":397},[259,3684,3685],{"class":265},"await",[259,3687,280],{"class":357},[259,3689,3690],{"class":273},"([routes1",[259,3692,452],{"class":269},[259,3694,3695],{"class":357},"getUser",[259,3697,370],{"class":273},[259,3699,296],{"class":269},[259,3701,3702],{"class":292},"1",[259,3704,296],{"class":269},[259,3706,392],{"class":273},[259,3708,277],{"class":269},[259,3710,3643],{"class":273},[259,3712,452],{"class":269},[259,3714,3715],{"class":357},"getOrder",[259,3717,370],{"class":273},[259,3719,296],{"class":269},[259,3721,3702],{"class":292},[259,3723,296],{"class":269},[259,3725,499],{"class":273},[259,3727,452],{"class":269},[259,3729,504],{"class":357},[259,3731,507],{"class":273},[259,3733,585],{"class":269},[259,3735,3736],{"class":405}," \u002F\u002F Error!\n",[259,3738,3739],{"class":261,"line":402},[259,3740,332],{"emptyLinePlaceholder":331},[259,3742,3743],{"class":261,"line":409},[259,3744,3745],{"class":405},"\u002F\u002F ✅ Use routes from the same client\n",[259,3747,3748,3750,3752,3754,3756,3758,3760,3762,3764,3766,3768,3770,3772,3774,3776,3778,3780,3782,3784],{"class":261,"line":512},[259,3749,339],{"class":338},[259,3751,270],{"class":269},[259,3753,344],{"class":273},[259,3755,283],{"class":269},[259,3757,354],{"class":269},[259,3759,358],{"class":357},[259,3761,361],{"class":269},[259,3763,312],{"class":364},[259,3765,367],{"class":269},[259,3767,370],{"class":273},[259,3769,373],{"class":269},[259,3771,377],{"class":376},[259,3773,380],{"class":269},[259,3775,289],{"class":269},[259,3777,385],{"class":292},[259,3779,296],{"class":269},[259,3781,283],{"class":269},[259,3783,392],{"class":273},[259,3785,299],{"class":269},[259,3787,3788,3790,3792,3794,3796,3798,3800,3802,3804,3806,3808,3810,3812,3814,3816,3818,3820,3822,3824,3826,3828,3830,3832,3834],{"class":261,"line":517},[259,3789,3685],{"class":265},[259,3791,280],{"class":357},[259,3793,449],{"class":273},[259,3795,452],{"class":269},[259,3797,3695],{"class":357},[259,3799,370],{"class":273},[259,3801,296],{"class":269},[259,3803,3702],{"class":292},[259,3805,296],{"class":269},[259,3807,392],{"class":273},[259,3809,277],{"class":269},[259,3811,477],{"class":273},[259,3813,452],{"class":269},[259,3815,3715],{"class":357},[259,3817,370],{"class":273},[259,3819,296],{"class":269},[259,3821,3702],{"class":292},[259,3823,296],{"class":269},[259,3825,499],{"class":273},[259,3827,452],{"class":269},[259,3829,504],{"class":357},[259,3831,507],{"class":273},[259,3833,585],{"class":269},[259,3835,3836],{"class":405}," \u002F\u002F Works!\n",[1434,3838],{},[3840,3841,3842],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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}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 .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}","Client-orchestrated queries that batch and compose API calls in a single request — a type-safe, deterministic alternative to GraphQL.","md",null,{"toc":26},{"title":93,"description":3843},"spf-fam6WHZDIuy2M3f6yw3d-GAjeZHVQooTAYwNTbY",[3850,3852],{"title":89,"path":90,"stem":91,"description":3851,"children":-1},"Transform validation errors into user-friendly messages for frontend applications.",{"title":97,"path":98,"stem":99,"description":3853,"children":-1},"Cancel in-flight requests and enforce timeouts using AbortSignal.",1778674524008]