[{"data":1,"prerenderedAt":5966},["ShallowReactive",2],{"navigation_docs":3,"-client-client-overview":195,"-client-client-overview-surround":5961},[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":82,"body":197,"description":5955,"extension":5956,"links":5957,"meta":5958,"navigation":298,"path":83,"seo":5959,"stem":84,"__hash__":5960},"docs\u002F3.client\u002F0.client-overview.md",{"type":198,"value":199},"minimark",[200,205,232,236,248,401,405,410,426,448,695,699,705,1047,1051,1062,1068,1087,1696,1705,1720,1724,5826,5829,5833,5836,5844,5852,5855,5861,5923,5927,5933,5936,5942,5945,5951],[201,202,204],"h2",{"id":203},"features","Features",[206,207,208,212,215,223,226,229],"ul",{},[209,210,211],"li",{},"✅ Strongly typed APIs with autocompletion and static type checking.",[209,213,214],{},"✅ Fully typed list of remote methods with its parameters and return values.",[209,216,217,218,222],{},"✅ Result pattern with 4-tuple ",[219,220,221],"code",{},"[routeResult, routeError, middleFnsResults, middleFnsErrors]"," - never throws, always returns.",[209,224,225],{},"✅ Automatic Validation and Serialization out of the box.",[209,227,228],{},"✅ Local Validation (no need to make a server request to validate parameters)",[209,230,231],{},"✅ Prefill request data to persist across multiple calls.",[201,233,235],{"id":234},"using-the-client","Using the client",[237,238,239,240,243,244,247],"p",{},"To use mion client we just need to initialize the client using the ",[219,241,242],{},"RemoteApi"," type returned from ",[219,245,246],{},"registerRoutes",".\nIt is important to just import the type so we don't import any of the actual routes or backend code into the client.",[249,250,255],"pre",{"className":251,"code":252,"language":253,"meta":254,"style":254},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {initClient} from '@mionjs\u002Fclient';\n\n\u002F\u002F importing only the RemoteApi type from server\nimport type {MyApi} from '.\u002Fserver.routes.ts';\n\nconst {routes, middleFns} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n","ts","",[219,256,257,293,300,307,333,338],{"__ignoreMap":254},[258,259,262,266,270,274,277,280,283,287,290],"span",{"class":260,"line":261},"line",1,[258,263,265],{"class":264},"s7zQu","import",[258,267,269],{"class":268},"sMK4o"," {",[258,271,273],{"class":272},"sTEyZ","initClient",[258,275,276],{"class":268},"}",[258,278,279],{"class":264}," from",[258,281,282],{"class":268}," '",[258,284,286],{"class":285},"sfazB","@mionjs\u002Fclient",[258,288,289],{"class":268},"'",[258,291,292],{"class":268},";\n",[258,294,296],{"class":260,"line":295},2,[258,297,299],{"emptyLinePlaceholder":298},true,"\n",[258,301,303],{"class":260,"line":302},3,[258,304,306],{"class":305},"sHwdD","\u002F\u002F importing only the RemoteApi type from server\n",[258,308,310,312,315,317,320,322,324,326,329,331],{"class":260,"line":309},4,[258,311,265],{"class":264},[258,313,314],{"class":264}," type",[258,316,269],{"class":268},[258,318,319],{"class":272},"MyApi",[258,321,276],{"class":268},[258,323,279],{"class":264},[258,325,282],{"class":268},[258,327,328],{"class":285},".\u002Fserver.routes.ts",[258,330,289],{"class":268},[258,332,292],{"class":268},[258,334,336],{"class":260,"line":335},5,[258,337,299],{"emptyLinePlaceholder":298},[258,339,341,345,347,350,353,356,358,361,365,368,371,374,377,380,384,387,389,392,394,396,399],{"class":260,"line":340},6,[258,342,344],{"class":343},"spNyl","const",[258,346,269],{"class":268},[258,348,349],{"class":272},"routes",[258,351,352],{"class":268},",",[258,354,355],{"class":272}," middleFns",[258,357,276],{"class":268},[258,359,360],{"class":268}," =",[258,362,364],{"class":363},"s2Zo4"," initClient",[258,366,367],{"class":268},"\u003C",[258,369,319],{"class":370},"sBMFI",[258,372,373],{"class":268},">",[258,375,376],{"class":272},"(",[258,378,379],{"class":268},"{",[258,381,383],{"class":382},"swJcz","baseURL",[258,385,386],{"class":268},":",[258,388,282],{"class":268},[258,390,391],{"class":285},"http:\u002F\u002Flocalhost:3000",[258,393,289],{"class":268},[258,395,276],{"class":268},[258,397,398],{"class":272},")",[258,400,292],{"class":268},[402,403,404],"note",{},"The client fetches routes and middleFns metadata from the server for local validation and serialization. This uses optimistic updates so API calls can proceed while metadata is being fetched in the background.",[406,407,409],"h3",{"id":408},"calling-routes","Calling Routes",[237,411,412,413,415,416,419,420,422,423,425],{},"The ",[219,414,349],{}," and ",[219,417,418],{},"middleFns"," objects returned from ",[219,421,273],{}," contain all remote routes and middleFns.\nIf a middleFn is not public (does not expect any parameters and can't return data) then it is not included within the ",[219,424,418],{}," object.",[237,427,428,429,432,433,436,437,439,440,442,443,447],{},"Calling routes in the client generates a ",[219,430,431],{},"RouteSubRequest",". We use the ",[219,434,435],{},"call()"," method to perform the remote call.\nThe ",[219,438,435],{}," method returns a 4-tuple ",[219,441,221],{}," - it ",[444,445,446],"strong",{},"never throws",".",[249,449,451],{"className":251,"code":450,"language":253,"meta":254,"style":254},"import {initClient} from '@mionjs\u002Fclient';\nimport type {MyApi} from '.\u002Fserver.routes.ts';\n\nconst {routes} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\n\u002F\u002F calls sum route in the server\nconst [sum, error] = await routes.utils.sum(5, 2).call();\n\nif (error) {\n    console.log('Error:', error.publicMessage);\n} else {\n    console.log(sum); \u002F\u002F 7\n}\n",[219,452,453,473,495,499,539,543,548,607,612,624,657,668,689],{"__ignoreMap":254},[258,454,455,457,459,461,463,465,467,469,471],{"class":260,"line":261},[258,456,265],{"class":264},[258,458,269],{"class":268},[258,460,273],{"class":272},[258,462,276],{"class":268},[258,464,279],{"class":264},[258,466,282],{"class":268},[258,468,286],{"class":285},[258,470,289],{"class":268},[258,472,292],{"class":268},[258,474,475,477,479,481,483,485,487,489,491,493],{"class":260,"line":295},[258,476,265],{"class":264},[258,478,314],{"class":264},[258,480,269],{"class":268},[258,482,319],{"class":272},[258,484,276],{"class":268},[258,486,279],{"class":264},[258,488,282],{"class":268},[258,490,328],{"class":285},[258,492,289],{"class":268},[258,494,292],{"class":268},[258,496,497],{"class":260,"line":302},[258,498,299],{"emptyLinePlaceholder":298},[258,500,501,503,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537],{"class":260,"line":309},[258,502,344],{"class":343},[258,504,269],{"class":268},[258,506,349],{"class":272},[258,508,276],{"class":268},[258,510,360],{"class":268},[258,512,364],{"class":363},[258,514,367],{"class":268},[258,516,319],{"class":370},[258,518,373],{"class":268},[258,520,376],{"class":272},[258,522,379],{"class":268},[258,524,383],{"class":382},[258,526,386],{"class":268},[258,528,282],{"class":268},[258,530,391],{"class":285},[258,532,289],{"class":268},[258,534,276],{"class":268},[258,536,398],{"class":272},[258,538,292],{"class":268},[258,540,541],{"class":260,"line":335},[258,542,299],{"emptyLinePlaceholder":298},[258,544,545],{"class":260,"line":340},[258,546,547],{"class":305},"\u002F\u002F calls sum route in the server\n",[258,549,551,553,556,559,561,564,567,569,572,575,577,580,582,584,586,590,592,595,597,599,602,605],{"class":260,"line":550},7,[258,552,344],{"class":343},[258,554,555],{"class":268}," [",[258,557,558],{"class":272},"sum",[258,560,352],{"class":268},[258,562,563],{"class":272}," error",[258,565,566],{"class":268},"]",[258,568,360],{"class":268},[258,570,571],{"class":264}," await",[258,573,574],{"class":272}," routes",[258,576,447],{"class":268},[258,578,579],{"class":272},"utils",[258,581,447],{"class":268},[258,583,558],{"class":363},[258,585,376],{"class":272},[258,587,589],{"class":588},"sbssI","5",[258,591,352],{"class":268},[258,593,594],{"class":588}," 2",[258,596,398],{"class":272},[258,598,447],{"class":268},[258,600,601],{"class":363},"call",[258,603,604],{"class":272},"()",[258,606,292],{"class":268},[258,608,610],{"class":260,"line":609},8,[258,611,299],{"emptyLinePlaceholder":298},[258,613,615,618,621],{"class":260,"line":614},9,[258,616,617],{"class":264},"if",[258,619,620],{"class":272}," (error) ",[258,622,623],{"class":268},"{\n",[258,625,627,630,632,635,637,639,642,644,646,648,650,653,655],{"class":260,"line":626},10,[258,628,629],{"class":272},"    console",[258,631,447],{"class":268},[258,633,634],{"class":363},"log",[258,636,376],{"class":382},[258,638,289],{"class":268},[258,640,641],{"class":285},"Error:",[258,643,289],{"class":268},[258,645,352],{"class":268},[258,647,563],{"class":272},[258,649,447],{"class":268},[258,651,652],{"class":272},"publicMessage",[258,654,398],{"class":382},[258,656,292],{"class":268},[258,658,660,662,665],{"class":260,"line":659},11,[258,661,276],{"class":268},[258,663,664],{"class":264}," else",[258,666,667],{"class":268}," {\n",[258,669,671,673,675,677,679,681,683,686],{"class":260,"line":670},12,[258,672,629],{"class":272},[258,674,447],{"class":268},[258,676,634],{"class":363},[258,678,376],{"class":382},[258,680,558],{"class":272},[258,682,398],{"class":382},[258,684,685],{"class":268},";",[258,687,688],{"class":305}," \u002F\u002F 7\n",[258,690,692],{"class":260,"line":691},13,[258,693,694],{"class":268},"}\n",[406,696,698],{"id":697},"using-middlefns","Using MiddleFns",[237,700,701,702,704],{},"For routes that require middleFns, use ",[219,703,435],{}," with a setup object to pass middleFn data alongside the route call:",[249,706,708],{"className":251,"code":707,"language":253,"meta":254,"style":254},"import {initClient} from '@mionjs\u002Fclient';\nimport type {MyApi} from '.\u002Fserver.routes.ts';\nimport {HeadersSubset} from '@mionjs\u002Fcore';\n\nconst {routes, middleFns} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\n\u002F\u002F calls route with auth middleFn\n\u002F\u002F Returns 4-tuple: [routeResult, routeError, middleFnsResults, middleFnsErrors]\nconst [user, routeError, middleFnResults, middleFnErrors] = await routes.users.getById('123').call({\n    middleFns: {\n        auth: middleFns.auth(new HeadersSubset({Authorization: 'myToken-XYZ'})),\n    },\n});\n\nif (routeError || middleFnErrors?.auth) {\n    console.log('Something failed');\n} else {\n    console.log(user); \u002F\u002F User object\n}\n",[219,709,710,730,752,774,778,822,826,831,836,897,906,952,957,965,970,991,1013,1022,1042],{"__ignoreMap":254},[258,711,712,714,716,718,720,722,724,726,728],{"class":260,"line":261},[258,713,265],{"class":264},[258,715,269],{"class":268},[258,717,273],{"class":272},[258,719,276],{"class":268},[258,721,279],{"class":264},[258,723,282],{"class":268},[258,725,286],{"class":285},[258,727,289],{"class":268},[258,729,292],{"class":268},[258,731,732,734,736,738,740,742,744,746,748,750],{"class":260,"line":295},[258,733,265],{"class":264},[258,735,314],{"class":264},[258,737,269],{"class":268},[258,739,319],{"class":272},[258,741,276],{"class":268},[258,743,279],{"class":264},[258,745,282],{"class":268},[258,747,328],{"class":285},[258,749,289],{"class":268},[258,751,292],{"class":268},[258,753,754,756,758,761,763,765,767,770,772],{"class":260,"line":302},[258,755,265],{"class":264},[258,757,269],{"class":268},[258,759,760],{"class":272},"HeadersSubset",[258,762,276],{"class":268},[258,764,279],{"class":264},[258,766,282],{"class":268},[258,768,769],{"class":285},"@mionjs\u002Fcore",[258,771,289],{"class":268},[258,773,292],{"class":268},[258,775,776],{"class":260,"line":309},[258,777,299],{"emptyLinePlaceholder":298},[258,779,780,782,784,786,788,790,792,794,796,798,800,802,804,806,808,810,812,814,816,818,820],{"class":260,"line":335},[258,781,344],{"class":343},[258,783,269],{"class":268},[258,785,349],{"class":272},[258,787,352],{"class":268},[258,789,355],{"class":272},[258,791,276],{"class":268},[258,793,360],{"class":268},[258,795,364],{"class":363},[258,797,367],{"class":268},[258,799,319],{"class":370},[258,801,373],{"class":268},[258,803,376],{"class":272},[258,805,379],{"class":268},[258,807,383],{"class":382},[258,809,386],{"class":268},[258,811,282],{"class":268},[258,813,391],{"class":285},[258,815,289],{"class":268},[258,817,276],{"class":268},[258,819,398],{"class":272},[258,821,292],{"class":268},[258,823,824],{"class":260,"line":340},[258,825,299],{"emptyLinePlaceholder":298},[258,827,828],{"class":260,"line":550},[258,829,830],{"class":305},"\u002F\u002F calls route with auth middleFn\n",[258,832,833],{"class":260,"line":609},[258,834,835],{"class":305},"\u002F\u002F Returns 4-tuple: [routeResult, routeError, middleFnsResults, middleFnsErrors]\n",[258,837,838,840,842,845,847,850,852,855,857,860,862,864,866,868,870,873,875,878,880,882,885,887,889,891,893,895],{"class":260,"line":614},[258,839,344],{"class":343},[258,841,555],{"class":268},[258,843,844],{"class":272},"user",[258,846,352],{"class":268},[258,848,849],{"class":272}," routeError",[258,851,352],{"class":268},[258,853,854],{"class":272}," middleFnResults",[258,856,352],{"class":268},[258,858,859],{"class":272}," middleFnErrors",[258,861,566],{"class":268},[258,863,360],{"class":268},[258,865,571],{"class":264},[258,867,574],{"class":272},[258,869,447],{"class":268},[258,871,872],{"class":272},"users",[258,874,447],{"class":268},[258,876,877],{"class":363},"getById",[258,879,376],{"class":272},[258,881,289],{"class":268},[258,883,884],{"class":285},"123",[258,886,289],{"class":268},[258,888,398],{"class":272},[258,890,447],{"class":268},[258,892,601],{"class":363},[258,894,376],{"class":272},[258,896,623],{"class":268},[258,898,899,902,904],{"class":260,"line":626},[258,900,901],{"class":382},"    middleFns",[258,903,386],{"class":268},[258,905,667],{"class":268},[258,907,908,911,913,915,917,920,922,925,928,930,932,935,937,939,942,944,946,949],{"class":260,"line":659},[258,909,910],{"class":382},"        auth",[258,912,386],{"class":268},[258,914,355],{"class":272},[258,916,447],{"class":268},[258,918,919],{"class":363},"auth",[258,921,376],{"class":272},[258,923,924],{"class":268},"new",[258,926,927],{"class":363}," HeadersSubset",[258,929,376],{"class":272},[258,931,379],{"class":268},[258,933,934],{"class":382},"Authorization",[258,936,386],{"class":268},[258,938,282],{"class":268},[258,940,941],{"class":285},"myToken-XYZ",[258,943,289],{"class":268},[258,945,276],{"class":268},[258,947,948],{"class":272},"))",[258,950,951],{"class":268},",\n",[258,953,954],{"class":260,"line":670},[258,955,956],{"class":268},"    },\n",[258,958,959,961,963],{"class":260,"line":691},[258,960,276],{"class":268},[258,962,398],{"class":272},[258,964,292],{"class":268},[258,966,968],{"class":260,"line":967},14,[258,969,299],{"emptyLinePlaceholder":298},[258,971,973,975,978,981,983,986,989],{"class":260,"line":972},15,[258,974,617],{"class":264},[258,976,977],{"class":272}," (routeError ",[258,979,980],{"class":268},"||",[258,982,859],{"class":272},[258,984,985],{"class":268},"?.",[258,987,988],{"class":272},"auth) ",[258,990,623],{"class":268},[258,992,994,996,998,1000,1002,1004,1007,1009,1011],{"class":260,"line":993},16,[258,995,629],{"class":272},[258,997,447],{"class":268},[258,999,634],{"class":363},[258,1001,376],{"class":382},[258,1003,289],{"class":268},[258,1005,1006],{"class":285},"Something failed",[258,1008,289],{"class":268},[258,1010,398],{"class":382},[258,1012,292],{"class":268},[258,1014,1016,1018,1020],{"class":260,"line":1015},17,[258,1017,276],{"class":268},[258,1019,664],{"class":264},[258,1021,667],{"class":268},[258,1023,1025,1027,1029,1031,1033,1035,1037,1039],{"class":260,"line":1024},18,[258,1026,629],{"class":272},[258,1028,447],{"class":268},[258,1030,634],{"class":363},[258,1032,376],{"class":382},[258,1034,844],{"class":272},[258,1036,398],{"class":382},[258,1038,685],{"class":268},[258,1040,1041],{"class":305}," \u002F\u002F User object\n",[258,1043,1045],{"class":260,"line":1044},19,[258,1046,694],{"class":268},[406,1048,1050],{"id":1049},"prefilling-middlefns-data","Prefilling MiddleFns data",[237,1052,1053,1054,1057,1058,1061],{},"For cases like authorization middleFns that are required for all requests, we can use the ",[219,1055,1056],{},"prefill()"," method of ",[219,1059,1060],{},"MiddleFnSubRequest",". This will automatically prefill any future route calls that require that middleFn.",[237,1063,1064,1065,386],{},"When using prefilled middleFns, middleFn results and errors are available in ",[444,1066,1067],{},"two ways",[1069,1070,1071,1077],"ol",{},[209,1072,1073,1076],{},[444,1074,1075],{},"TypedEvent handlers"," - Strongly typed by errors",[209,1078,1079,1082,1083,1086],{},[444,1080,1081],{},"tuple results"," - Generic ",[219,1084,1085],{},"RpcError"," types",[249,1088,1090],{"className":251,"code":1089,"language":253,"meta":254,"style":254},"import {initClient} from '@mionjs\u002Fclient';\nimport type {MyApi} from '.\u002Fserver.routes.ts';\nimport {HeadersSubset} from '@mionjs\u002Fcore';\n\nconst {routes, middleFns} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\ndeclare function redirectToLogin(): void;\ndeclare function refreshToken(): Promise\u003Cstring>;\n\n\u002F\u002F prefill() returns a TypedEvent for registering persistent handlers\n\u002F\u002F TypedEvent handlers are STRONGLY TYPED by the error.type string\nmiddleFns\n    .auth(new HeadersSubset({Authorization: 'myToken-XYZ'}))\n    .prefill()\n    .onSuccess((session) => {\n        \u002F\u002F Called after every successful auth\n        console.log('Authenticated as:', session?.userId);\n    })\n    .onError('not-authorized', (error) => {\n        \u002F\u002F TypeScript knows error.type is 'invalid-token'\n        console.log('Auth failed:', error.publicMessage);\n        redirectToLogin();\n    });\n\n\u002F\u002F call() returns a 4-tuple with middleFnResults and middleFnErrors\n\u002F\u002F These are NOT strongly typed - they contain generic RpcError types\nconst [sum, error, middleFnResults, middleFnErrors] = await routes.utils.sum(5, 2).call();\n\n\u002F\u002F Both TypedEvent handlers AND 4-tuple receive the same middleFn data:\n\u002F\u002F - TypedEvent handlers were already called above (if auth succeeded\u002Ffailed)\n\u002F\u002F - middleFnResults\u002FmiddleFnErrors also contain the auth result\u002Ferror\nif (middleFnErrors?.auth) {\n    console.log('Auth error (generic type):', middleFnErrors.auth.publicMessage);\n}\nif (middleFnResults?.auth) {\n    console.log('Session from tuple:', middleFnResults.auth);\n}\nif (!error) {\n    console.log(sum); \u002F\u002F 7\n}\n",[219,1091,1092,1112,1134,1154,1158,1202,1206,1225,1247,1251,1256,1261,1266,1298,1308,1330,1335,1367,1375,1405,1411,1441,1451,1460,1465,1471,1477,1532,1537,1543,1549,1555,1569,1603,1608,1622,1652,1657,1672,1691],{"__ignoreMap":254},[258,1093,1094,1096,1098,1100,1102,1104,1106,1108,1110],{"class":260,"line":261},[258,1095,265],{"class":264},[258,1097,269],{"class":268},[258,1099,273],{"class":272},[258,1101,276],{"class":268},[258,1103,279],{"class":264},[258,1105,282],{"class":268},[258,1107,286],{"class":285},[258,1109,289],{"class":268},[258,1111,292],{"class":268},[258,1113,1114,1116,1118,1120,1122,1124,1126,1128,1130,1132],{"class":260,"line":295},[258,1115,265],{"class":264},[258,1117,314],{"class":264},[258,1119,269],{"class":268},[258,1121,319],{"class":272},[258,1123,276],{"class":268},[258,1125,279],{"class":264},[258,1127,282],{"class":268},[258,1129,328],{"class":285},[258,1131,289],{"class":268},[258,1133,292],{"class":268},[258,1135,1136,1138,1140,1142,1144,1146,1148,1150,1152],{"class":260,"line":302},[258,1137,265],{"class":264},[258,1139,269],{"class":268},[258,1141,760],{"class":272},[258,1143,276],{"class":268},[258,1145,279],{"class":264},[258,1147,282],{"class":268},[258,1149,769],{"class":285},[258,1151,289],{"class":268},[258,1153,292],{"class":268},[258,1155,1156],{"class":260,"line":309},[258,1157,299],{"emptyLinePlaceholder":298},[258,1159,1160,1162,1164,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198,1200],{"class":260,"line":335},[258,1161,344],{"class":343},[258,1163,269],{"class":268},[258,1165,349],{"class":272},[258,1167,352],{"class":268},[258,1169,355],{"class":272},[258,1171,276],{"class":268},[258,1173,360],{"class":268},[258,1175,364],{"class":363},[258,1177,367],{"class":268},[258,1179,319],{"class":370},[258,1181,373],{"class":268},[258,1183,376],{"class":272},[258,1185,379],{"class":268},[258,1187,383],{"class":382},[258,1189,386],{"class":268},[258,1191,282],{"class":268},[258,1193,391],{"class":285},[258,1195,289],{"class":268},[258,1197,276],{"class":268},[258,1199,398],{"class":272},[258,1201,292],{"class":268},[258,1203,1204],{"class":260,"line":340},[258,1205,299],{"emptyLinePlaceholder":298},[258,1207,1208,1211,1214,1217,1220,1223],{"class":260,"line":550},[258,1209,1210],{"class":343},"declare",[258,1212,1213],{"class":343}," function",[258,1215,1216],{"class":363}," redirectToLogin",[258,1218,1219],{"class":268},"():",[258,1221,1222],{"class":370}," void",[258,1224,292],{"class":268},[258,1226,1227,1229,1231,1234,1236,1239,1241,1244],{"class":260,"line":609},[258,1228,1210],{"class":343},[258,1230,1213],{"class":343},[258,1232,1233],{"class":363}," refreshToken",[258,1235,1219],{"class":268},[258,1237,1238],{"class":370}," Promise",[258,1240,367],{"class":268},[258,1242,1243],{"class":370},"string",[258,1245,1246],{"class":268},">;\n",[258,1248,1249],{"class":260,"line":614},[258,1250,299],{"emptyLinePlaceholder":298},[258,1252,1253],{"class":260,"line":626},[258,1254,1255],{"class":305},"\u002F\u002F prefill() returns a TypedEvent for registering persistent handlers\n",[258,1257,1258],{"class":260,"line":659},[258,1259,1260],{"class":305},"\u002F\u002F TypedEvent handlers are STRONGLY TYPED by the error.type string\n",[258,1262,1263],{"class":260,"line":670},[258,1264,1265],{"class":272},"middleFns\n",[258,1267,1268,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295],{"class":260,"line":691},[258,1269,1270],{"class":268},"    .",[258,1272,919],{"class":363},[258,1274,376],{"class":272},[258,1276,924],{"class":268},[258,1278,927],{"class":363},[258,1280,376],{"class":272},[258,1282,379],{"class":268},[258,1284,934],{"class":382},[258,1286,386],{"class":268},[258,1288,282],{"class":268},[258,1290,941],{"class":285},[258,1292,289],{"class":268},[258,1294,276],{"class":268},[258,1296,1297],{"class":272},"))\n",[258,1299,1300,1302,1305],{"class":260,"line":967},[258,1301,1270],{"class":268},[258,1303,1304],{"class":363},"prefill",[258,1306,1307],{"class":272},"()\n",[258,1309,1310,1312,1315,1317,1319,1323,1325,1328],{"class":260,"line":972},[258,1311,1270],{"class":268},[258,1313,1314],{"class":363},"onSuccess",[258,1316,376],{"class":272},[258,1318,376],{"class":268},[258,1320,1322],{"class":1321},"sHdIc","session",[258,1324,398],{"class":268},[258,1326,1327],{"class":343}," =>",[258,1329,667],{"class":268},[258,1331,1332],{"class":260,"line":993},[258,1333,1334],{"class":305},"        \u002F\u002F Called after every successful auth\n",[258,1336,1337,1340,1342,1344,1346,1348,1351,1353,1355,1358,1360,1363,1365],{"class":260,"line":1015},[258,1338,1339],{"class":272},"        console",[258,1341,447],{"class":268},[258,1343,634],{"class":363},[258,1345,376],{"class":382},[258,1347,289],{"class":268},[258,1349,1350],{"class":285},"Authenticated as:",[258,1352,289],{"class":268},[258,1354,352],{"class":268},[258,1356,1357],{"class":272}," session",[258,1359,985],{"class":268},[258,1361,1362],{"class":272},"userId",[258,1364,398],{"class":382},[258,1366,292],{"class":268},[258,1368,1369,1372],{"class":260,"line":1024},[258,1370,1371],{"class":268},"    }",[258,1373,1374],{"class":272},")\n",[258,1376,1377,1379,1382,1384,1386,1389,1391,1393,1396,1399,1401,1403],{"class":260,"line":1044},[258,1378,1270],{"class":268},[258,1380,1381],{"class":363},"onError",[258,1383,376],{"class":272},[258,1385,289],{"class":268},[258,1387,1388],{"class":285},"not-authorized",[258,1390,289],{"class":268},[258,1392,352],{"class":268},[258,1394,1395],{"class":268}," (",[258,1397,1398],{"class":1321},"error",[258,1400,398],{"class":268},[258,1402,1327],{"class":343},[258,1404,667],{"class":268},[258,1406,1408],{"class":260,"line":1407},20,[258,1409,1410],{"class":305},"        \u002F\u002F TypeScript knows error.type is 'invalid-token'\n",[258,1412,1414,1416,1418,1420,1422,1424,1427,1429,1431,1433,1435,1437,1439],{"class":260,"line":1413},21,[258,1415,1339],{"class":272},[258,1417,447],{"class":268},[258,1419,634],{"class":363},[258,1421,376],{"class":382},[258,1423,289],{"class":268},[258,1425,1426],{"class":285},"Auth failed:",[258,1428,289],{"class":268},[258,1430,352],{"class":268},[258,1432,563],{"class":272},[258,1434,447],{"class":268},[258,1436,652],{"class":272},[258,1438,398],{"class":382},[258,1440,292],{"class":268},[258,1442,1444,1447,1449],{"class":260,"line":1443},22,[258,1445,1446],{"class":363},"        redirectToLogin",[258,1448,604],{"class":382},[258,1450,292],{"class":268},[258,1452,1454,1456,1458],{"class":260,"line":1453},23,[258,1455,1371],{"class":268},[258,1457,398],{"class":272},[258,1459,292],{"class":268},[258,1461,1463],{"class":260,"line":1462},24,[258,1464,299],{"emptyLinePlaceholder":298},[258,1466,1468],{"class":260,"line":1467},25,[258,1469,1470],{"class":305},"\u002F\u002F call() returns a 4-tuple with middleFnResults and middleFnErrors\n",[258,1472,1474],{"class":260,"line":1473},26,[258,1475,1476],{"class":305},"\u002F\u002F These are NOT strongly typed - they contain generic RpcError types\n",[258,1478,1480,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1526,1528,1530],{"class":260,"line":1479},27,[258,1481,344],{"class":343},[258,1483,555],{"class":268},[258,1485,558],{"class":272},[258,1487,352],{"class":268},[258,1489,563],{"class":272},[258,1491,352],{"class":268},[258,1493,854],{"class":272},[258,1495,352],{"class":268},[258,1497,859],{"class":272},[258,1499,566],{"class":268},[258,1501,360],{"class":268},[258,1503,571],{"class":264},[258,1505,574],{"class":272},[258,1507,447],{"class":268},[258,1509,579],{"class":272},[258,1511,447],{"class":268},[258,1513,558],{"class":363},[258,1515,376],{"class":272},[258,1517,589],{"class":588},[258,1519,352],{"class":268},[258,1521,594],{"class":588},[258,1523,398],{"class":272},[258,1525,447],{"class":268},[258,1527,601],{"class":363},[258,1529,604],{"class":272},[258,1531,292],{"class":268},[258,1533,1535],{"class":260,"line":1534},28,[258,1536,299],{"emptyLinePlaceholder":298},[258,1538,1540],{"class":260,"line":1539},29,[258,1541,1542],{"class":305},"\u002F\u002F Both TypedEvent handlers AND 4-tuple receive the same middleFn data:\n",[258,1544,1546],{"class":260,"line":1545},30,[258,1547,1548],{"class":305},"\u002F\u002F - TypedEvent handlers were already called above (if auth succeeded\u002Ffailed)\n",[258,1550,1552],{"class":260,"line":1551},31,[258,1553,1554],{"class":305},"\u002F\u002F - middleFnResults\u002FmiddleFnErrors also contain the auth result\u002Ferror\n",[258,1556,1558,1560,1563,1565,1567],{"class":260,"line":1557},32,[258,1559,617],{"class":264},[258,1561,1562],{"class":272}," (middleFnErrors",[258,1564,985],{"class":268},[258,1566,988],{"class":272},[258,1568,623],{"class":268},[258,1570,1572,1574,1576,1578,1580,1582,1585,1587,1589,1591,1593,1595,1597,1599,1601],{"class":260,"line":1571},33,[258,1573,629],{"class":272},[258,1575,447],{"class":268},[258,1577,634],{"class":363},[258,1579,376],{"class":382},[258,1581,289],{"class":268},[258,1583,1584],{"class":285},"Auth error (generic type):",[258,1586,289],{"class":268},[258,1588,352],{"class":268},[258,1590,859],{"class":272},[258,1592,447],{"class":268},[258,1594,919],{"class":272},[258,1596,447],{"class":268},[258,1598,652],{"class":272},[258,1600,398],{"class":382},[258,1602,292],{"class":268},[258,1604,1606],{"class":260,"line":1605},34,[258,1607,694],{"class":268},[258,1609,1611,1613,1616,1618,1620],{"class":260,"line":1610},35,[258,1612,617],{"class":264},[258,1614,1615],{"class":272}," (middleFnResults",[258,1617,985],{"class":268},[258,1619,988],{"class":272},[258,1621,623],{"class":268},[258,1623,1625,1627,1629,1631,1633,1635,1638,1640,1642,1644,1646,1648,1650],{"class":260,"line":1624},36,[258,1626,629],{"class":272},[258,1628,447],{"class":268},[258,1630,634],{"class":363},[258,1632,376],{"class":382},[258,1634,289],{"class":268},[258,1636,1637],{"class":285},"Session from tuple:",[258,1639,289],{"class":268},[258,1641,352],{"class":268},[258,1643,854],{"class":272},[258,1645,447],{"class":268},[258,1647,919],{"class":272},[258,1649,398],{"class":382},[258,1651,292],{"class":268},[258,1653,1655],{"class":260,"line":1654},37,[258,1656,694],{"class":268},[258,1658,1660,1662,1664,1667,1670],{"class":260,"line":1659},38,[258,1661,617],{"class":264},[258,1663,1395],{"class":272},[258,1665,1666],{"class":268},"!",[258,1668,1669],{"class":272},"error) ",[258,1671,623],{"class":268},[258,1673,1675,1677,1679,1681,1683,1685,1687,1689],{"class":260,"line":1674},39,[258,1676,629],{"class":272},[258,1678,447],{"class":268},[258,1680,634],{"class":363},[258,1682,376],{"class":382},[258,1684,558],{"class":272},[258,1686,398],{"class":382},[258,1688,685],{"class":268},[258,1690,688],{"class":305},[258,1692,1694],{"class":260,"line":1693},40,[258,1695,694],{"class":268},[402,1697,1698,1700,1701,1704],{},[444,1699,1075],{}," are called after ",[444,1702,1703],{},"every"," API request that includes the middleFn.",[1706,1707,1708,1709,1711,1712,1715,1716,1719],"tip",{},"Use ",[444,1710,1075],{}," for global error handling with prefilled middleFns. They provide ",[444,1713,1714],{},"strongly typed"," error handling based on the error ",[219,1717,1718],{},"type"," string.",[201,1721,1723],{"id":1722},"full-example","Full example",[1725,1726,1727,4065],"code-group",{},[249,1728,1730],{"className":251,"code":1729,"filename":76,"language":253,"meta":254,"style":254},"\u002F* eslint-disable @typescript-eslint\u002Fno-unused-vars *\u002F\nimport {initClient} from '@mionjs\u002Fclient';\nimport {HeadersSubset} from '@mionjs\u002Fcore';\n\u002F\u002F importing only the RemoteApi type from server\nimport type {MyApi} from '.\u002Fserver.routes.ts';\n\nconst john = {id: '123', name: 'John', surname: 'Doe'};\nconst {routes, middleFns} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\n\u002F\u002F ========== MiddleFn with Typed Success Return and Error Handling ==========\n\u002F\u002F prefills auth token for any future requests, value is stored in localStorage by default\n\u002F\u002F Returns TypedEvent for registering persistent success and error handlers\n\u002F\u002F The auth middleFn returns SessionInfo on success (when returnSession=true) or RpcError\u003C'not-authorized', NotAuthorizedData>\nconst authHeaders = new HeadersSubset({Authorization: 'Bearer myToken-XYZ'});\nmiddleFns\n    .auth(authHeaders, true) \u002F\u002F returnSession=true to get SessionInfo back\n    .prefill()\n    \u002F\u002F onSuccess receives the strongly typed SessionInfo (or void when returnSession=false)\n    .onSuccess((sessionInfo) => {\n        \u002F\u002F Since we passed returnSession=true, we know sessionInfo is SessionInfo\n        \u002F\u002F TypeScript infers: sessionInfo is SessionInfo | void, so we narrow it\n        if (!sessionInfo) return;\n        \u002F\u002F Now TypeScript knows sessionInfo is SessionInfo!\n        \u002F\u002F sessionInfo.role is 'admin' | 'user' | 'guest'\n        console.log('Logged in as:', sessionInfo.userId);\n        console.log('Role:', sessionInfo.role);\n        \u002F\u002F Use session info to configure app state\n        if (sessionInfo.role === 'admin') {\n            console.log('Admin features enabled');\n        }\n    })\n    .onError('not-authorized', (error) => {\n        \u002F\u002F error.errorData is strongly typed as NotAuthorizedData!\n        \u002F\u002F TypeScript knows: error.errorData?.reason is 'missing-token' | 'invalid-token' | 'expired-token'\n        const reason = error.errorData?.reason;\n        if (reason === 'expired-token') {\n            console.log('Token expired, refreshing...');\n        } else if (reason === 'missing-token') {\n            console.log('No token provided, redirecting to login...');\n        } else {\n            console.log('Invalid token:', error.publicMessage);\n        }\n    })\n    .onError('validation-error', (error) => {\n        console.log('Validation error:', error.errorData?.typeErrors);\n    });\n\n\u002F\u002F ========== Example 1: Route with strongly-typed errorData ==========\n\u002F\u002F getById returns User | RpcError\u003C'user-not-found', UserNotFoundData>\n\u002F\u002F call() returns 4-tuple: [routeResult, routeError, middleFnsResults, middleFnsErrors]\nconst [user1, error1] = await routes.users.getById('USER-123').call();\nif (error1 && error1.type === 'user-not-found') {\n    \u002F\u002F error1.errorData is strongly typed as UserNotFoundData!\n    console.log('User not found. Requested ID:', error1.errorData?.requestedId);\n    if (error1.errorData?.suggestedIds?.length) {\n        console.log('Did you mean one of these?', error1.errorData.suggestedIds.join(', '));\n    }\n} else if (error1) {\n    \u002F\u002F Catches any other errors (network errors, middleFn errors, etc.)\n    console.log('Unexpected error:', error1.publicMessage);\n}\n\u002F\u002F After error check, user is guaranteed to be User here\n\u002F\u002F Use optional chaining for TypeScript strictness\nconsole.log('Found user:', user1?.name, user1?.surname);\n\n\u002F\u002F ========== Example 2: Order error with typed errorData ==========\n\u002F\u002F Order getById returns Order | RpcError\u003C'order-not-found', OrderNotFoundData>\nconst [order, error2] = await routes.orders.getById('ORDER-404').call();\nif (error2 && error2.type === 'order-not-found') {\n    \u002F\u002F error2.errorData is strongly typed as OrderNotFoundData!\n    console.log('Order not found. Requested ID:', error2.errorData?.requestedId);\n}\n\u002F\u002F After error check, order is guaranteed to be Order here\nconsole.log('Order total:', order?.totalUSD);\n\n\u002F\u002F ========== Example 3: Route that always succeeds ==========\n\u002F\u002F sayHello returns just string (no error type), so error is always undefined\nconst [result, error3] = await routes.users.sayHello(john).call();\n\u002F\u002F sayHello never has an error type, so we can use the result directly\nconsole.log(result); \u002F\u002F Hello John Doe\n\n\u002F\u002F ========== Example 5: Using call() with middleFns for per-request middleFns ==========\n\u002F\u002F Use call({middleFns: {...}}) when you need to pass middleFns for a SINGLE request\n\u002F\u002F Returns 4-tuple: [routeResult, routeError, middleFnsResults, middleFnsErrors]\n\n\u002F\u002F Create a middleFn with temporary credentials for this specific request\nconst tempAuthHeaders: HeadersSubset\u003C'Authorization'> = {headers: {Authorization: 'Bearer temp-token-ABC'}};\n\n\u002F\u002F call({middleFns: {...}}) takes a record of middleFns and returns a typed 4-tuple\nconst [user4, routeError4, middleFnResults4, middleFnErrors4] = await routes.users.getById('USER-123').call({\n    middleFns: {\n        auth: middleFns.auth(tempAuthHeaders, true),\n    },\n});\n\u002F\u002F Check for route errors\nif (routeError4?.type === 'user-not-found') {\n    console.log('User not found:', routeError4.errorData?.requestedId);\n}\n\u002F\u002F Check middleFn errors\nif (middleFnErrors4?.auth?.type === 'not-authorized') {\n    const authError = middleFnErrors4.auth;\n    const reason = authError.errorData?.reason;\n    if (reason === 'expired-token') {\n        console.log('Temp token expired, requesting new one...');\n    }\n}\n\u002F\u002F Access success data\nif (user4) console.log('Found user:', user4.name);\nif (middleFnResults4?.auth) console.log('Authenticated as:', middleFnResults4.auth.userId);\n\n\u002F\u002F ========== Example 6: Multiple MiddleFns with call({middleFns: {...}}) ==========\n\u002F\u002F Pass multiple middleFns in the record - each gets its own typed result\nconst [user5, routeError5, middleFnResults5, middleFnErrors5] = await routes.users.getById('USER-123').call({\n    middleFns: {\n        auth: middleFns.auth(tempAuthHeaders),\n        \u002F\u002F session: middleFns.session('session-token'), \u002F\u002F If you have a session middleFn\n    },\n});\n\u002F\u002F Handle each middleFn's errors independently\nif (middleFnErrors5?.auth) {\n    console.log('Auth failed:', middleFnErrors5.auth.publicMessage);\n}\n\u002F\u002F Access success data\nif (user5) console.log('User:', user5.name);\n\n\u002F\u002F ========== Example 7: Using call() with async\u002Fawait (recommended) ==========\n\u002F\u002F call() returns 4-tuple: [routeResult, routeError, middleFnsResults, middleFnsErrors]\n\u002F\u002F This is the standard pattern for all route calls\n\u002F\u002F call() never throws - returns a 4-tuple\n\u002F\u002F Partial destructuring still works for backward compatibility\nconst [user6, error6] = await routes.users.getById('USER-999').call();\nif (error6) {\n    \u002F\u002F TypeScript knows error is the typed error here\n    \u002F\u002F Each error type can be checked\n    if (error6.type === 'user-not-found') {\n        \u002F\u002F error6.errorData is still strongly typed!\n        console.log('User not found:', error6.errorData?.requestedId);\n    } else {\n        console.log('Other error:', error6.publicMessage);\n    }\n}\n\u002F\u002F After error check, user is guaranteed to be User here\n\u002F\u002F Use optional chaining for TypeScript strictness\nconsole.log('User:', user6?.name, user6?.surname);\n\u002F\u002F validate parameters locally without calling the server\nconst validationResp = await routes.users.sayHello(john).typeErrors();\nconsole.log(validationResp); \u002F\u002F []\n",[219,1731,1732,1737,1757,1777,1781,1803,1807,1861,1905,1909,1914,1919,1924,1929,1964,1968,1989,1997,2002,2021,2026,2031,2049,2054,2059,2089,2119,2124,2150,2172,2177,2183,2209,2214,2219,2243,2264,2285,2312,2333,2341,2371,2376,2383,2411,2446,2455,2460,2466,2472,2478,2528,2560,2566,2601,2630,2678,2684,2698,2704,2734,2739,2745,2751,2791,2796,2802,2808,2859,2888,2894,2928,2933,2939,2969,2974,2980,2986,3029,3035,3052,3057,3063,3069,3074,3079,3085,3132,3137,3143,3202,3211,3235,3240,3249,3255,3279,3313,3318,3324,3352,3371,3392,3413,3435,3440,3445,3451,3483,3523,3528,3534,3540,3599,3608,3626,3635,3640,3649,3655,3669,3702,3707,3712,3744,3749,3755,3760,3766,3772,3778,3828,3838,3844,3850,3876,3882,3915,3924,3954,3959,3964,3969,3974,4010,4016,4048],{"__ignoreMap":254},[258,1733,1734],{"class":260,"line":261},[258,1735,1736],{"class":305},"\u002F* eslint-disable @typescript-eslint\u002Fno-unused-vars *\u002F\n",[258,1738,1739,1741,1743,1745,1747,1749,1751,1753,1755],{"class":260,"line":295},[258,1740,265],{"class":264},[258,1742,269],{"class":268},[258,1744,273],{"class":272},[258,1746,276],{"class":268},[258,1748,279],{"class":264},[258,1750,282],{"class":268},[258,1752,286],{"class":285},[258,1754,289],{"class":268},[258,1756,292],{"class":268},[258,1758,1759,1761,1763,1765,1767,1769,1771,1773,1775],{"class":260,"line":302},[258,1760,265],{"class":264},[258,1762,269],{"class":268},[258,1764,760],{"class":272},[258,1766,276],{"class":268},[258,1768,279],{"class":264},[258,1770,282],{"class":268},[258,1772,769],{"class":285},[258,1774,289],{"class":268},[258,1776,292],{"class":268},[258,1778,1779],{"class":260,"line":309},[258,1780,306],{"class":305},[258,1782,1783,1785,1787,1789,1791,1793,1795,1797,1799,1801],{"class":260,"line":335},[258,1784,265],{"class":264},[258,1786,314],{"class":264},[258,1788,269],{"class":268},[258,1790,319],{"class":272},[258,1792,276],{"class":268},[258,1794,279],{"class":264},[258,1796,282],{"class":268},[258,1798,328],{"class":285},[258,1800,289],{"class":268},[258,1802,292],{"class":268},[258,1804,1805],{"class":260,"line":340},[258,1806,299],{"emptyLinePlaceholder":298},[258,1808,1809,1811,1814,1817,1819,1822,1824,1826,1828,1830,1832,1835,1837,1839,1842,1844,1846,1849,1851,1853,1856,1858],{"class":260,"line":550},[258,1810,344],{"class":343},[258,1812,1813],{"class":272}," john ",[258,1815,1816],{"class":268},"=",[258,1818,269],{"class":268},[258,1820,1821],{"class":382},"id",[258,1823,386],{"class":268},[258,1825,282],{"class":268},[258,1827,884],{"class":285},[258,1829,289],{"class":268},[258,1831,352],{"class":268},[258,1833,1834],{"class":382}," name",[258,1836,386],{"class":268},[258,1838,282],{"class":268},[258,1840,1841],{"class":285},"John",[258,1843,289],{"class":268},[258,1845,352],{"class":268},[258,1847,1848],{"class":382}," surname",[258,1850,386],{"class":268},[258,1852,282],{"class":268},[258,1854,1855],{"class":285},"Doe",[258,1857,289],{"class":268},[258,1859,1860],{"class":268},"};\n",[258,1862,1863,1865,1867,1869,1871,1873,1875,1877,1879,1881,1883,1885,1887,1889,1891,1893,1895,1897,1899,1901,1903],{"class":260,"line":609},[258,1864,344],{"class":343},[258,1866,269],{"class":268},[258,1868,349],{"class":272},[258,1870,352],{"class":268},[258,1872,355],{"class":272},[258,1874,276],{"class":268},[258,1876,360],{"class":268},[258,1878,364],{"class":363},[258,1880,367],{"class":268},[258,1882,319],{"class":370},[258,1884,373],{"class":268},[258,1886,376],{"class":272},[258,1888,379],{"class":268},[258,1890,383],{"class":382},[258,1892,386],{"class":268},[258,1894,282],{"class":268},[258,1896,391],{"class":285},[258,1898,289],{"class":268},[258,1900,276],{"class":268},[258,1902,398],{"class":272},[258,1904,292],{"class":268},[258,1906,1907],{"class":260,"line":614},[258,1908,299],{"emptyLinePlaceholder":298},[258,1910,1911],{"class":260,"line":626},[258,1912,1913],{"class":305},"\u002F\u002F ========== MiddleFn with Typed Success Return and Error Handling ==========\n",[258,1915,1916],{"class":260,"line":659},[258,1917,1918],{"class":305},"\u002F\u002F prefills auth token for any future requests, value is stored in localStorage by default\n",[258,1920,1921],{"class":260,"line":670},[258,1922,1923],{"class":305},"\u002F\u002F Returns TypedEvent for registering persistent success and error handlers\n",[258,1925,1926],{"class":260,"line":691},[258,1927,1928],{"class":305},"\u002F\u002F The auth middleFn returns SessionInfo on success (when returnSession=true) or RpcError\u003C'not-authorized', NotAuthorizedData>\n",[258,1930,1931,1933,1936,1938,1941,1943,1945,1947,1949,1951,1953,1956,1958,1960,1962],{"class":260,"line":967},[258,1932,344],{"class":343},[258,1934,1935],{"class":272}," authHeaders ",[258,1937,1816],{"class":268},[258,1939,1940],{"class":268}," new",[258,1942,927],{"class":363},[258,1944,376],{"class":272},[258,1946,379],{"class":268},[258,1948,934],{"class":382},[258,1950,386],{"class":268},[258,1952,282],{"class":268},[258,1954,1955],{"class":285},"Bearer myToken-XYZ",[258,1957,289],{"class":268},[258,1959,276],{"class":268},[258,1961,398],{"class":272},[258,1963,292],{"class":268},[258,1965,1966],{"class":260,"line":972},[258,1967,1265],{"class":272},[258,1969,1970,1972,1974,1977,1979,1983,1986],{"class":260,"line":993},[258,1971,1270],{"class":268},[258,1973,919],{"class":363},[258,1975,1976],{"class":272},"(authHeaders",[258,1978,352],{"class":268},[258,1980,1982],{"class":1981},"sfNiH"," true",[258,1984,1985],{"class":272},") ",[258,1987,1988],{"class":305},"\u002F\u002F returnSession=true to get SessionInfo back\n",[258,1990,1991,1993,1995],{"class":260,"line":1015},[258,1992,1270],{"class":268},[258,1994,1304],{"class":363},[258,1996,1307],{"class":272},[258,1998,1999],{"class":260,"line":1024},[258,2000,2001],{"class":305},"    \u002F\u002F onSuccess receives the strongly typed SessionInfo (or void when returnSession=false)\n",[258,2003,2004,2006,2008,2010,2012,2015,2017,2019],{"class":260,"line":1044},[258,2005,1270],{"class":268},[258,2007,1314],{"class":363},[258,2009,376],{"class":272},[258,2011,376],{"class":268},[258,2013,2014],{"class":1321},"sessionInfo",[258,2016,398],{"class":268},[258,2018,1327],{"class":343},[258,2020,667],{"class":268},[258,2022,2023],{"class":260,"line":1407},[258,2024,2025],{"class":305},"        \u002F\u002F Since we passed returnSession=true, we know sessionInfo is SessionInfo\n",[258,2027,2028],{"class":260,"line":1413},[258,2029,2030],{"class":305},"        \u002F\u002F TypeScript infers: sessionInfo is SessionInfo | void, so we narrow it\n",[258,2032,2033,2036,2038,2040,2042,2044,2047],{"class":260,"line":1443},[258,2034,2035],{"class":264},"        if",[258,2037,1395],{"class":382},[258,2039,1666],{"class":268},[258,2041,2014],{"class":272},[258,2043,1985],{"class":382},[258,2045,2046],{"class":264},"return",[258,2048,292],{"class":268},[258,2050,2051],{"class":260,"line":1453},[258,2052,2053],{"class":305},"        \u002F\u002F Now TypeScript knows sessionInfo is SessionInfo!\n",[258,2055,2056],{"class":260,"line":1462},[258,2057,2058],{"class":305},"        \u002F\u002F sessionInfo.role is 'admin' | 'user' | 'guest'\n",[258,2060,2061,2063,2065,2067,2069,2071,2074,2076,2078,2081,2083,2085,2087],{"class":260,"line":1467},[258,2062,1339],{"class":272},[258,2064,447],{"class":268},[258,2066,634],{"class":363},[258,2068,376],{"class":382},[258,2070,289],{"class":268},[258,2072,2073],{"class":285},"Logged in as:",[258,2075,289],{"class":268},[258,2077,352],{"class":268},[258,2079,2080],{"class":272}," sessionInfo",[258,2082,447],{"class":268},[258,2084,1362],{"class":272},[258,2086,398],{"class":382},[258,2088,292],{"class":268},[258,2090,2091,2093,2095,2097,2099,2101,2104,2106,2108,2110,2112,2115,2117],{"class":260,"line":1473},[258,2092,1339],{"class":272},[258,2094,447],{"class":268},[258,2096,634],{"class":363},[258,2098,376],{"class":382},[258,2100,289],{"class":268},[258,2102,2103],{"class":285},"Role:",[258,2105,289],{"class":268},[258,2107,352],{"class":268},[258,2109,2080],{"class":272},[258,2111,447],{"class":268},[258,2113,2114],{"class":272},"role",[258,2116,398],{"class":382},[258,2118,292],{"class":268},[258,2120,2121],{"class":260,"line":1479},[258,2122,2123],{"class":305},"        \u002F\u002F Use session info to configure app state\n",[258,2125,2126,2128,2130,2132,2134,2136,2139,2141,2144,2146,2148],{"class":260,"line":1534},[258,2127,2035],{"class":264},[258,2129,1395],{"class":382},[258,2131,2014],{"class":272},[258,2133,447],{"class":268},[258,2135,2114],{"class":272},[258,2137,2138],{"class":268}," ===",[258,2140,282],{"class":268},[258,2142,2143],{"class":285},"admin",[258,2145,289],{"class":268},[258,2147,1985],{"class":382},[258,2149,623],{"class":268},[258,2151,2152,2155,2157,2159,2161,2163,2166,2168,2170],{"class":260,"line":1539},[258,2153,2154],{"class":272},"            console",[258,2156,447],{"class":268},[258,2158,634],{"class":363},[258,2160,376],{"class":382},[258,2162,289],{"class":268},[258,2164,2165],{"class":285},"Admin features enabled",[258,2167,289],{"class":268},[258,2169,398],{"class":382},[258,2171,292],{"class":268},[258,2173,2174],{"class":260,"line":1545},[258,2175,2176],{"class":268},"        }\n",[258,2178,2179,2181],{"class":260,"line":1551},[258,2180,1371],{"class":268},[258,2182,1374],{"class":272},[258,2184,2185,2187,2189,2191,2193,2195,2197,2199,2201,2203,2205,2207],{"class":260,"line":1557},[258,2186,1270],{"class":268},[258,2188,1381],{"class":363},[258,2190,376],{"class":272},[258,2192,289],{"class":268},[258,2194,1388],{"class":285},[258,2196,289],{"class":268},[258,2198,352],{"class":268},[258,2200,1395],{"class":268},[258,2202,1398],{"class":1321},[258,2204,398],{"class":268},[258,2206,1327],{"class":343},[258,2208,667],{"class":268},[258,2210,2211],{"class":260,"line":1571},[258,2212,2213],{"class":305},"        \u002F\u002F error.errorData is strongly typed as NotAuthorizedData!\n",[258,2215,2216],{"class":260,"line":1605},[258,2217,2218],{"class":305},"        \u002F\u002F TypeScript knows: error.errorData?.reason is 'missing-token' | 'invalid-token' | 'expired-token'\n",[258,2220,2221,2224,2227,2229,2231,2233,2236,2238,2241],{"class":260,"line":1610},[258,2222,2223],{"class":343},"        const",[258,2225,2226],{"class":272}," reason",[258,2228,360],{"class":268},[258,2230,563],{"class":272},[258,2232,447],{"class":268},[258,2234,2235],{"class":272},"errorData",[258,2237,985],{"class":268},[258,2239,2240],{"class":272},"reason",[258,2242,292],{"class":268},[258,2244,2245,2247,2249,2251,2253,2255,2258,2260,2262],{"class":260,"line":1624},[258,2246,2035],{"class":264},[258,2248,1395],{"class":382},[258,2250,2240],{"class":272},[258,2252,2138],{"class":268},[258,2254,282],{"class":268},[258,2256,2257],{"class":285},"expired-token",[258,2259,289],{"class":268},[258,2261,1985],{"class":382},[258,2263,623],{"class":268},[258,2265,2266,2268,2270,2272,2274,2276,2279,2281,2283],{"class":260,"line":1654},[258,2267,2154],{"class":272},[258,2269,447],{"class":268},[258,2271,634],{"class":363},[258,2273,376],{"class":382},[258,2275,289],{"class":268},[258,2277,2278],{"class":285},"Token expired, refreshing...",[258,2280,289],{"class":268},[258,2282,398],{"class":382},[258,2284,292],{"class":268},[258,2286,2287,2290,2292,2295,2297,2299,2301,2303,2306,2308,2310],{"class":260,"line":1659},[258,2288,2289],{"class":268},"        }",[258,2291,664],{"class":264},[258,2293,2294],{"class":264}," if",[258,2296,1395],{"class":382},[258,2298,2240],{"class":272},[258,2300,2138],{"class":268},[258,2302,282],{"class":268},[258,2304,2305],{"class":285},"missing-token",[258,2307,289],{"class":268},[258,2309,1985],{"class":382},[258,2311,623],{"class":268},[258,2313,2314,2316,2318,2320,2322,2324,2327,2329,2331],{"class":260,"line":1674},[258,2315,2154],{"class":272},[258,2317,447],{"class":268},[258,2319,634],{"class":363},[258,2321,376],{"class":382},[258,2323,289],{"class":268},[258,2325,2326],{"class":285},"No token provided, redirecting to login...",[258,2328,289],{"class":268},[258,2330,398],{"class":382},[258,2332,292],{"class":268},[258,2334,2335,2337,2339],{"class":260,"line":1693},[258,2336,2289],{"class":268},[258,2338,664],{"class":264},[258,2340,667],{"class":268},[258,2342,2344,2346,2348,2350,2352,2354,2357,2359,2361,2363,2365,2367,2369],{"class":260,"line":2343},41,[258,2345,2154],{"class":272},[258,2347,447],{"class":268},[258,2349,634],{"class":363},[258,2351,376],{"class":382},[258,2353,289],{"class":268},[258,2355,2356],{"class":285},"Invalid token:",[258,2358,289],{"class":268},[258,2360,352],{"class":268},[258,2362,563],{"class":272},[258,2364,447],{"class":268},[258,2366,652],{"class":272},[258,2368,398],{"class":382},[258,2370,292],{"class":268},[258,2372,2374],{"class":260,"line":2373},42,[258,2375,2176],{"class":268},[258,2377,2379,2381],{"class":260,"line":2378},43,[258,2380,1371],{"class":268},[258,2382,1374],{"class":272},[258,2384,2386,2388,2390,2392,2394,2397,2399,2401,2403,2405,2407,2409],{"class":260,"line":2385},44,[258,2387,1270],{"class":268},[258,2389,1381],{"class":363},[258,2391,376],{"class":272},[258,2393,289],{"class":268},[258,2395,2396],{"class":285},"validation-error",[258,2398,289],{"class":268},[258,2400,352],{"class":268},[258,2402,1395],{"class":268},[258,2404,1398],{"class":1321},[258,2406,398],{"class":268},[258,2408,1327],{"class":343},[258,2410,667],{"class":268},[258,2412,2414,2416,2418,2420,2422,2424,2427,2429,2431,2433,2435,2437,2439,2442,2444],{"class":260,"line":2413},45,[258,2415,1339],{"class":272},[258,2417,447],{"class":268},[258,2419,634],{"class":363},[258,2421,376],{"class":382},[258,2423,289],{"class":268},[258,2425,2426],{"class":285},"Validation error:",[258,2428,289],{"class":268},[258,2430,352],{"class":268},[258,2432,563],{"class":272},[258,2434,447],{"class":268},[258,2436,2235],{"class":272},[258,2438,985],{"class":268},[258,2440,2441],{"class":272},"typeErrors",[258,2443,398],{"class":382},[258,2445,292],{"class":268},[258,2447,2449,2451,2453],{"class":260,"line":2448},46,[258,2450,1371],{"class":268},[258,2452,398],{"class":272},[258,2454,292],{"class":268},[258,2456,2458],{"class":260,"line":2457},47,[258,2459,299],{"emptyLinePlaceholder":298},[258,2461,2463],{"class":260,"line":2462},48,[258,2464,2465],{"class":305},"\u002F\u002F ========== Example 1: Route with strongly-typed errorData ==========\n",[258,2467,2469],{"class":260,"line":2468},49,[258,2470,2471],{"class":305},"\u002F\u002F getById returns User | RpcError\u003C'user-not-found', UserNotFoundData>\n",[258,2473,2475],{"class":260,"line":2474},50,[258,2476,2477],{"class":305},"\u002F\u002F call() returns 4-tuple: [routeResult, routeError, middleFnsResults, middleFnsErrors]\n",[258,2479,2481,2483,2485,2488,2490,2493,2495,2497,2499,2501,2503,2505,2507,2509,2511,2513,2516,2518,2520,2522,2524,2526],{"class":260,"line":2480},51,[258,2482,344],{"class":343},[258,2484,555],{"class":268},[258,2486,2487],{"class":272},"user1",[258,2489,352],{"class":268},[258,2491,2492],{"class":272}," error1",[258,2494,566],{"class":268},[258,2496,360],{"class":268},[258,2498,571],{"class":264},[258,2500,574],{"class":272},[258,2502,447],{"class":268},[258,2504,872],{"class":272},[258,2506,447],{"class":268},[258,2508,877],{"class":363},[258,2510,376],{"class":272},[258,2512,289],{"class":268},[258,2514,2515],{"class":285},"USER-123",[258,2517,289],{"class":268},[258,2519,398],{"class":272},[258,2521,447],{"class":268},[258,2523,601],{"class":363},[258,2525,604],{"class":272},[258,2527,292],{"class":268},[258,2529,2531,2533,2536,2539,2541,2543,2546,2549,2551,2554,2556,2558],{"class":260,"line":2530},52,[258,2532,617],{"class":264},[258,2534,2535],{"class":272}," (error1 ",[258,2537,2538],{"class":268},"&&",[258,2540,2492],{"class":272},[258,2542,447],{"class":268},[258,2544,2545],{"class":272},"type ",[258,2547,2548],{"class":268},"===",[258,2550,282],{"class":268},[258,2552,2553],{"class":285},"user-not-found",[258,2555,289],{"class":268},[258,2557,1985],{"class":272},[258,2559,623],{"class":268},[258,2561,2563],{"class":260,"line":2562},53,[258,2564,2565],{"class":305},"    \u002F\u002F error1.errorData is strongly typed as UserNotFoundData!\n",[258,2567,2569,2571,2573,2575,2577,2579,2582,2584,2586,2588,2590,2592,2594,2597,2599],{"class":260,"line":2568},54,[258,2570,629],{"class":272},[258,2572,447],{"class":268},[258,2574,634],{"class":363},[258,2576,376],{"class":382},[258,2578,289],{"class":268},[258,2580,2581],{"class":285},"User not found. Requested ID:",[258,2583,289],{"class":268},[258,2585,352],{"class":268},[258,2587,2492],{"class":272},[258,2589,447],{"class":268},[258,2591,2235],{"class":272},[258,2593,985],{"class":268},[258,2595,2596],{"class":272},"requestedId",[258,2598,398],{"class":382},[258,2600,292],{"class":268},[258,2602,2604,2607,2609,2612,2614,2616,2618,2621,2623,2626,2628],{"class":260,"line":2603},55,[258,2605,2606],{"class":264},"    if",[258,2608,1395],{"class":382},[258,2610,2611],{"class":272},"error1",[258,2613,447],{"class":268},[258,2615,2235],{"class":272},[258,2617,985],{"class":268},[258,2619,2620],{"class":272},"suggestedIds",[258,2622,985],{"class":268},[258,2624,2625],{"class":272},"length",[258,2627,1985],{"class":382},[258,2629,623],{"class":268},[258,2631,2633,2635,2637,2639,2641,2643,2646,2648,2650,2652,2654,2656,2658,2660,2662,2665,2667,2669,2672,2674,2676],{"class":260,"line":2632},56,[258,2634,1339],{"class":272},[258,2636,447],{"class":268},[258,2638,634],{"class":363},[258,2640,376],{"class":382},[258,2642,289],{"class":268},[258,2644,2645],{"class":285},"Did you mean one of these?",[258,2647,289],{"class":268},[258,2649,352],{"class":268},[258,2651,2492],{"class":272},[258,2653,447],{"class":268},[258,2655,2235],{"class":272},[258,2657,447],{"class":268},[258,2659,2620],{"class":272},[258,2661,447],{"class":268},[258,2663,2664],{"class":363},"join",[258,2666,376],{"class":382},[258,2668,289],{"class":268},[258,2670,2671],{"class":285},", ",[258,2673,289],{"class":268},[258,2675,948],{"class":382},[258,2677,292],{"class":268},[258,2679,2681],{"class":260,"line":2680},57,[258,2682,2683],{"class":268},"    }\n",[258,2685,2687,2689,2691,2693,2696],{"class":260,"line":2686},58,[258,2688,276],{"class":268},[258,2690,664],{"class":264},[258,2692,2294],{"class":264},[258,2694,2695],{"class":272}," (error1) ",[258,2697,623],{"class":268},[258,2699,2701],{"class":260,"line":2700},59,[258,2702,2703],{"class":305},"    \u002F\u002F Catches any other errors (network errors, middleFn errors, etc.)\n",[258,2705,2707,2709,2711,2713,2715,2717,2720,2722,2724,2726,2728,2730,2732],{"class":260,"line":2706},60,[258,2708,629],{"class":272},[258,2710,447],{"class":268},[258,2712,634],{"class":363},[258,2714,376],{"class":382},[258,2716,289],{"class":268},[258,2718,2719],{"class":285},"Unexpected error:",[258,2721,289],{"class":268},[258,2723,352],{"class":268},[258,2725,2492],{"class":272},[258,2727,447],{"class":268},[258,2729,652],{"class":272},[258,2731,398],{"class":382},[258,2733,292],{"class":268},[258,2735,2737],{"class":260,"line":2736},61,[258,2738,694],{"class":268},[258,2740,2742],{"class":260,"line":2741},62,[258,2743,2744],{"class":305},"\u002F\u002F After error check, user is guaranteed to be User here\n",[258,2746,2748],{"class":260,"line":2747},63,[258,2749,2750],{"class":305},"\u002F\u002F Use optional chaining for TypeScript strictness\n",[258,2752,2754,2757,2759,2761,2763,2765,2768,2770,2772,2775,2777,2780,2782,2784,2786,2789],{"class":260,"line":2753},64,[258,2755,2756],{"class":272},"console",[258,2758,447],{"class":268},[258,2760,634],{"class":363},[258,2762,376],{"class":272},[258,2764,289],{"class":268},[258,2766,2767],{"class":285},"Found user:",[258,2769,289],{"class":268},[258,2771,352],{"class":268},[258,2773,2774],{"class":272}," user1",[258,2776,985],{"class":268},[258,2778,2779],{"class":272},"name",[258,2781,352],{"class":268},[258,2783,2774],{"class":272},[258,2785,985],{"class":268},[258,2787,2788],{"class":272},"surname)",[258,2790,292],{"class":268},[258,2792,2794],{"class":260,"line":2793},65,[258,2795,299],{"emptyLinePlaceholder":298},[258,2797,2799],{"class":260,"line":2798},66,[258,2800,2801],{"class":305},"\u002F\u002F ========== Example 2: Order error with typed errorData ==========\n",[258,2803,2805],{"class":260,"line":2804},67,[258,2806,2807],{"class":305},"\u002F\u002F Order getById returns Order | RpcError\u003C'order-not-found', OrderNotFoundData>\n",[258,2809,2811,2813,2815,2818,2820,2823,2825,2827,2829,2831,2833,2836,2838,2840,2842,2844,2847,2849,2851,2853,2855,2857],{"class":260,"line":2810},68,[258,2812,344],{"class":343},[258,2814,555],{"class":268},[258,2816,2817],{"class":272},"order",[258,2819,352],{"class":268},[258,2821,2822],{"class":272}," error2",[258,2824,566],{"class":268},[258,2826,360],{"class":268},[258,2828,571],{"class":264},[258,2830,574],{"class":272},[258,2832,447],{"class":268},[258,2834,2835],{"class":272},"orders",[258,2837,447],{"class":268},[258,2839,877],{"class":363},[258,2841,376],{"class":272},[258,2843,289],{"class":268},[258,2845,2846],{"class":285},"ORDER-404",[258,2848,289],{"class":268},[258,2850,398],{"class":272},[258,2852,447],{"class":268},[258,2854,601],{"class":363},[258,2856,604],{"class":272},[258,2858,292],{"class":268},[258,2860,2862,2864,2867,2869,2871,2873,2875,2877,2879,2882,2884,2886],{"class":260,"line":2861},69,[258,2863,617],{"class":264},[258,2865,2866],{"class":272}," (error2 ",[258,2868,2538],{"class":268},[258,2870,2822],{"class":272},[258,2872,447],{"class":268},[258,2874,2545],{"class":272},[258,2876,2548],{"class":268},[258,2878,282],{"class":268},[258,2880,2881],{"class":285},"order-not-found",[258,2883,289],{"class":268},[258,2885,1985],{"class":272},[258,2887,623],{"class":268},[258,2889,2891],{"class":260,"line":2890},70,[258,2892,2893],{"class":305},"    \u002F\u002F error2.errorData is strongly typed as OrderNotFoundData!\n",[258,2895,2897,2899,2901,2903,2905,2907,2910,2912,2914,2916,2918,2920,2922,2924,2926],{"class":260,"line":2896},71,[258,2898,629],{"class":272},[258,2900,447],{"class":268},[258,2902,634],{"class":363},[258,2904,376],{"class":382},[258,2906,289],{"class":268},[258,2908,2909],{"class":285},"Order not found. Requested ID:",[258,2911,289],{"class":268},[258,2913,352],{"class":268},[258,2915,2822],{"class":272},[258,2917,447],{"class":268},[258,2919,2235],{"class":272},[258,2921,985],{"class":268},[258,2923,2596],{"class":272},[258,2925,398],{"class":382},[258,2927,292],{"class":268},[258,2929,2931],{"class":260,"line":2930},72,[258,2932,694],{"class":268},[258,2934,2936],{"class":260,"line":2935},73,[258,2937,2938],{"class":305},"\u002F\u002F After error check, order is guaranteed to be Order here\n",[258,2940,2942,2944,2946,2948,2950,2952,2955,2957,2959,2962,2964,2967],{"class":260,"line":2941},74,[258,2943,2756],{"class":272},[258,2945,447],{"class":268},[258,2947,634],{"class":363},[258,2949,376],{"class":272},[258,2951,289],{"class":268},[258,2953,2954],{"class":285},"Order total:",[258,2956,289],{"class":268},[258,2958,352],{"class":268},[258,2960,2961],{"class":272}," order",[258,2963,985],{"class":268},[258,2965,2966],{"class":272},"totalUSD)",[258,2968,292],{"class":268},[258,2970,2972],{"class":260,"line":2971},75,[258,2973,299],{"emptyLinePlaceholder":298},[258,2975,2977],{"class":260,"line":2976},76,[258,2978,2979],{"class":305},"\u002F\u002F ========== Example 3: Route that always succeeds ==========\n",[258,2981,2983],{"class":260,"line":2982},77,[258,2984,2985],{"class":305},"\u002F\u002F sayHello returns just string (no error type), so error is always undefined\n",[258,2987,2989,2991,2993,2996,2998,3001,3003,3005,3007,3009,3011,3013,3015,3018,3021,3023,3025,3027],{"class":260,"line":2988},78,[258,2990,344],{"class":343},[258,2992,555],{"class":268},[258,2994,2995],{"class":272},"result",[258,2997,352],{"class":268},[258,2999,3000],{"class":272}," error3",[258,3002,566],{"class":268},[258,3004,360],{"class":268},[258,3006,571],{"class":264},[258,3008,574],{"class":272},[258,3010,447],{"class":268},[258,3012,872],{"class":272},[258,3014,447],{"class":268},[258,3016,3017],{"class":363},"sayHello",[258,3019,3020],{"class":272},"(john)",[258,3022,447],{"class":268},[258,3024,601],{"class":363},[258,3026,604],{"class":272},[258,3028,292],{"class":268},[258,3030,3032],{"class":260,"line":3031},79,[258,3033,3034],{"class":305},"\u002F\u002F sayHello never has an error type, so we can use the result directly\n",[258,3036,3038,3040,3042,3044,3047,3049],{"class":260,"line":3037},80,[258,3039,2756],{"class":272},[258,3041,447],{"class":268},[258,3043,634],{"class":363},[258,3045,3046],{"class":272},"(result)",[258,3048,685],{"class":268},[258,3050,3051],{"class":305}," \u002F\u002F Hello John Doe\n",[258,3053,3055],{"class":260,"line":3054},81,[258,3056,299],{"emptyLinePlaceholder":298},[258,3058,3060],{"class":260,"line":3059},82,[258,3061,3062],{"class":305},"\u002F\u002F ========== Example 5: Using call() with middleFns for per-request middleFns ==========\n",[258,3064,3066],{"class":260,"line":3065},83,[258,3067,3068],{"class":305},"\u002F\u002F Use call({middleFns: {...}}) when you need to pass middleFns for a SINGLE request\n",[258,3070,3072],{"class":260,"line":3071},84,[258,3073,835],{"class":305},[258,3075,3077],{"class":260,"line":3076},85,[258,3078,299],{"emptyLinePlaceholder":298},[258,3080,3082],{"class":260,"line":3081},86,[258,3083,3084],{"class":305},"\u002F\u002F Create a middleFn with temporary credentials for this specific request\n",[258,3086,3088,3090,3093,3095,3097,3099,3101,3103,3105,3107,3109,3111,3114,3116,3118,3120,3122,3124,3127,3129],{"class":260,"line":3087},87,[258,3089,344],{"class":343},[258,3091,3092],{"class":272}," tempAuthHeaders",[258,3094,386],{"class":268},[258,3096,927],{"class":370},[258,3098,367],{"class":268},[258,3100,289],{"class":268},[258,3102,934],{"class":285},[258,3104,289],{"class":268},[258,3106,373],{"class":268},[258,3108,360],{"class":268},[258,3110,269],{"class":268},[258,3112,3113],{"class":382},"headers",[258,3115,386],{"class":268},[258,3117,269],{"class":268},[258,3119,934],{"class":382},[258,3121,386],{"class":268},[258,3123,282],{"class":268},[258,3125,3126],{"class":285},"Bearer temp-token-ABC",[258,3128,289],{"class":268},[258,3130,3131],{"class":268},"}};\n",[258,3133,3135],{"class":260,"line":3134},88,[258,3136,299],{"emptyLinePlaceholder":298},[258,3138,3140],{"class":260,"line":3139},89,[258,3141,3142],{"class":305},"\u002F\u002F call({middleFns: {...}}) takes a record of middleFns and returns a typed 4-tuple\n",[258,3144,3146,3148,3150,3153,3155,3158,3160,3163,3165,3168,3170,3172,3174,3176,3178,3180,3182,3184,3186,3188,3190,3192,3194,3196,3198,3200],{"class":260,"line":3145},90,[258,3147,344],{"class":343},[258,3149,555],{"class":268},[258,3151,3152],{"class":272},"user4",[258,3154,352],{"class":268},[258,3156,3157],{"class":272}," routeError4",[258,3159,352],{"class":268},[258,3161,3162],{"class":272}," middleFnResults4",[258,3164,352],{"class":268},[258,3166,3167],{"class":272}," middleFnErrors4",[258,3169,566],{"class":268},[258,3171,360],{"class":268},[258,3173,571],{"class":264},[258,3175,574],{"class":272},[258,3177,447],{"class":268},[258,3179,872],{"class":272},[258,3181,447],{"class":268},[258,3183,877],{"class":363},[258,3185,376],{"class":272},[258,3187,289],{"class":268},[258,3189,2515],{"class":285},[258,3191,289],{"class":268},[258,3193,398],{"class":272},[258,3195,447],{"class":268},[258,3197,601],{"class":363},[258,3199,376],{"class":272},[258,3201,623],{"class":268},[258,3203,3205,3207,3209],{"class":260,"line":3204},91,[258,3206,901],{"class":382},[258,3208,386],{"class":268},[258,3210,667],{"class":268},[258,3212,3214,3216,3218,3220,3222,3224,3227,3229,3231,3233],{"class":260,"line":3213},92,[258,3215,910],{"class":382},[258,3217,386],{"class":268},[258,3219,355],{"class":272},[258,3221,447],{"class":268},[258,3223,919],{"class":363},[258,3225,3226],{"class":272},"(tempAuthHeaders",[258,3228,352],{"class":268},[258,3230,1982],{"class":1981},[258,3232,398],{"class":272},[258,3234,951],{"class":268},[258,3236,3238],{"class":260,"line":3237},93,[258,3239,956],{"class":268},[258,3241,3243,3245,3247],{"class":260,"line":3242},94,[258,3244,276],{"class":268},[258,3246,398],{"class":272},[258,3248,292],{"class":268},[258,3250,3252],{"class":260,"line":3251},95,[258,3253,3254],{"class":305},"\u002F\u002F Check for route errors\n",[258,3256,3258,3260,3263,3265,3267,3269,3271,3273,3275,3277],{"class":260,"line":3257},96,[258,3259,617],{"class":264},[258,3261,3262],{"class":272}," (routeError4",[258,3264,985],{"class":268},[258,3266,2545],{"class":272},[258,3268,2548],{"class":268},[258,3270,282],{"class":268},[258,3272,2553],{"class":285},[258,3274,289],{"class":268},[258,3276,1985],{"class":272},[258,3278,623],{"class":268},[258,3280,3282,3284,3286,3288,3290,3292,3295,3297,3299,3301,3303,3305,3307,3309,3311],{"class":260,"line":3281},97,[258,3283,629],{"class":272},[258,3285,447],{"class":268},[258,3287,634],{"class":363},[258,3289,376],{"class":382},[258,3291,289],{"class":268},[258,3293,3294],{"class":285},"User not found:",[258,3296,289],{"class":268},[258,3298,352],{"class":268},[258,3300,3157],{"class":272},[258,3302,447],{"class":268},[258,3304,2235],{"class":272},[258,3306,985],{"class":268},[258,3308,2596],{"class":272},[258,3310,398],{"class":382},[258,3312,292],{"class":268},[258,3314,3316],{"class":260,"line":3315},98,[258,3317,694],{"class":268},[258,3319,3321],{"class":260,"line":3320},99,[258,3322,3323],{"class":305},"\u002F\u002F Check middleFn errors\n",[258,3325,3327,3329,3332,3334,3336,3338,3340,3342,3344,3346,3348,3350],{"class":260,"line":3326},100,[258,3328,617],{"class":264},[258,3330,3331],{"class":272}," (middleFnErrors4",[258,3333,985],{"class":268},[258,3335,919],{"class":272},[258,3337,985],{"class":268},[258,3339,2545],{"class":272},[258,3341,2548],{"class":268},[258,3343,282],{"class":268},[258,3345,1388],{"class":285},[258,3347,289],{"class":268},[258,3349,1985],{"class":272},[258,3351,623],{"class":268},[258,3353,3355,3358,3361,3363,3365,3367,3369],{"class":260,"line":3354},101,[258,3356,3357],{"class":343},"    const",[258,3359,3360],{"class":272}," authError",[258,3362,360],{"class":268},[258,3364,3167],{"class":272},[258,3366,447],{"class":268},[258,3368,919],{"class":272},[258,3370,292],{"class":268},[258,3372,3374,3376,3378,3380,3382,3384,3386,3388,3390],{"class":260,"line":3373},102,[258,3375,3357],{"class":343},[258,3377,2226],{"class":272},[258,3379,360],{"class":268},[258,3381,3360],{"class":272},[258,3383,447],{"class":268},[258,3385,2235],{"class":272},[258,3387,985],{"class":268},[258,3389,2240],{"class":272},[258,3391,292],{"class":268},[258,3393,3395,3397,3399,3401,3403,3405,3407,3409,3411],{"class":260,"line":3394},103,[258,3396,2606],{"class":264},[258,3398,1395],{"class":382},[258,3400,2240],{"class":272},[258,3402,2138],{"class":268},[258,3404,282],{"class":268},[258,3406,2257],{"class":285},[258,3408,289],{"class":268},[258,3410,1985],{"class":382},[258,3412,623],{"class":268},[258,3414,3416,3418,3420,3422,3424,3426,3429,3431,3433],{"class":260,"line":3415},104,[258,3417,1339],{"class":272},[258,3419,447],{"class":268},[258,3421,634],{"class":363},[258,3423,376],{"class":382},[258,3425,289],{"class":268},[258,3427,3428],{"class":285},"Temp token expired, requesting new one...",[258,3430,289],{"class":268},[258,3432,398],{"class":382},[258,3434,292],{"class":268},[258,3436,3438],{"class":260,"line":3437},105,[258,3439,2683],{"class":268},[258,3441,3443],{"class":260,"line":3442},106,[258,3444,694],{"class":268},[258,3446,3448],{"class":260,"line":3447},107,[258,3449,3450],{"class":305},"\u002F\u002F Access success data\n",[258,3452,3454,3456,3459,3461,3463,3465,3467,3469,3471,3473,3476,3478,3481],{"class":260,"line":3453},108,[258,3455,617],{"class":264},[258,3457,3458],{"class":272}," (user4) console",[258,3460,447],{"class":268},[258,3462,634],{"class":363},[258,3464,376],{"class":272},[258,3466,289],{"class":268},[258,3468,2767],{"class":285},[258,3470,289],{"class":268},[258,3472,352],{"class":268},[258,3474,3475],{"class":272}," user4",[258,3477,447],{"class":268},[258,3479,3480],{"class":272},"name)",[258,3482,292],{"class":268},[258,3484,3486,3488,3491,3493,3496,3498,3500,3502,3504,3506,3508,3510,3512,3514,3516,3518,3521],{"class":260,"line":3485},109,[258,3487,617],{"class":264},[258,3489,3490],{"class":272}," (middleFnResults4",[258,3492,985],{"class":268},[258,3494,3495],{"class":272},"auth) console",[258,3497,447],{"class":268},[258,3499,634],{"class":363},[258,3501,376],{"class":272},[258,3503,289],{"class":268},[258,3505,1350],{"class":285},[258,3507,289],{"class":268},[258,3509,352],{"class":268},[258,3511,3162],{"class":272},[258,3513,447],{"class":268},[258,3515,919],{"class":272},[258,3517,447],{"class":268},[258,3519,3520],{"class":272},"userId)",[258,3522,292],{"class":268},[258,3524,3526],{"class":260,"line":3525},110,[258,3527,299],{"emptyLinePlaceholder":298},[258,3529,3531],{"class":260,"line":3530},111,[258,3532,3533],{"class":305},"\u002F\u002F ========== Example 6: Multiple MiddleFns with call({middleFns: {...}}) ==========\n",[258,3535,3537],{"class":260,"line":3536},112,[258,3538,3539],{"class":305},"\u002F\u002F Pass multiple middleFns in the record - each gets its own typed result\n",[258,3541,3543,3545,3547,3550,3552,3555,3557,3560,3562,3565,3567,3569,3571,3573,3575,3577,3579,3581,3583,3585,3587,3589,3591,3593,3595,3597],{"class":260,"line":3542},113,[258,3544,344],{"class":343},[258,3546,555],{"class":268},[258,3548,3549],{"class":272},"user5",[258,3551,352],{"class":268},[258,3553,3554],{"class":272}," routeError5",[258,3556,352],{"class":268},[258,3558,3559],{"class":272}," middleFnResults5",[258,3561,352],{"class":268},[258,3563,3564],{"class":272}," middleFnErrors5",[258,3566,566],{"class":268},[258,3568,360],{"class":268},[258,3570,571],{"class":264},[258,3572,574],{"class":272},[258,3574,447],{"class":268},[258,3576,872],{"class":272},[258,3578,447],{"class":268},[258,3580,877],{"class":363},[258,3582,376],{"class":272},[258,3584,289],{"class":268},[258,3586,2515],{"class":285},[258,3588,289],{"class":268},[258,3590,398],{"class":272},[258,3592,447],{"class":268},[258,3594,601],{"class":363},[258,3596,376],{"class":272},[258,3598,623],{"class":268},[258,3600,3602,3604,3606],{"class":260,"line":3601},114,[258,3603,901],{"class":382},[258,3605,386],{"class":268},[258,3607,667],{"class":268},[258,3609,3611,3613,3615,3617,3619,3621,3624],{"class":260,"line":3610},115,[258,3612,910],{"class":382},[258,3614,386],{"class":268},[258,3616,355],{"class":272},[258,3618,447],{"class":268},[258,3620,919],{"class":363},[258,3622,3623],{"class":272},"(tempAuthHeaders)",[258,3625,951],{"class":268},[258,3627,3629,3632],{"class":260,"line":3628},116,[258,3630,3631],{"class":305},"        \u002F\u002F session: middleFns.session('session-token'),",[258,3633,3634],{"class":305}," \u002F\u002F If you have a session middleFn\n",[258,3636,3638],{"class":260,"line":3637},117,[258,3639,956],{"class":268},[258,3641,3643,3645,3647],{"class":260,"line":3642},118,[258,3644,276],{"class":268},[258,3646,398],{"class":272},[258,3648,292],{"class":268},[258,3650,3652],{"class":260,"line":3651},119,[258,3653,3654],{"class":305},"\u002F\u002F Handle each middleFn's errors independently\n",[258,3656,3658,3660,3663,3665,3667],{"class":260,"line":3657},120,[258,3659,617],{"class":264},[258,3661,3662],{"class":272}," (middleFnErrors5",[258,3664,985],{"class":268},[258,3666,988],{"class":272},[258,3668,623],{"class":268},[258,3670,3672,3674,3676,3678,3680,3682,3684,3686,3688,3690,3692,3694,3696,3698,3700],{"class":260,"line":3671},121,[258,3673,629],{"class":272},[258,3675,447],{"class":268},[258,3677,634],{"class":363},[258,3679,376],{"class":382},[258,3681,289],{"class":268},[258,3683,1426],{"class":285},[258,3685,289],{"class":268},[258,3687,352],{"class":268},[258,3689,3564],{"class":272},[258,3691,447],{"class":268},[258,3693,919],{"class":272},[258,3695,447],{"class":268},[258,3697,652],{"class":272},[258,3699,398],{"class":382},[258,3701,292],{"class":268},[258,3703,3705],{"class":260,"line":3704},122,[258,3706,694],{"class":268},[258,3708,3710],{"class":260,"line":3709},123,[258,3711,3450],{"class":305},[258,3713,3715,3717,3720,3722,3724,3726,3728,3731,3733,3735,3738,3740,3742],{"class":260,"line":3714},124,[258,3716,617],{"class":264},[258,3718,3719],{"class":272}," (user5) console",[258,3721,447],{"class":268},[258,3723,634],{"class":363},[258,3725,376],{"class":272},[258,3727,289],{"class":268},[258,3729,3730],{"class":285},"User:",[258,3732,289],{"class":268},[258,3734,352],{"class":268},[258,3736,3737],{"class":272}," user5",[258,3739,447],{"class":268},[258,3741,3480],{"class":272},[258,3743,292],{"class":268},[258,3745,3747],{"class":260,"line":3746},125,[258,3748,299],{"emptyLinePlaceholder":298},[258,3750,3752],{"class":260,"line":3751},126,[258,3753,3754],{"class":305},"\u002F\u002F ========== Example 7: Using call() with async\u002Fawait (recommended) ==========\n",[258,3756,3758],{"class":260,"line":3757},127,[258,3759,2477],{"class":305},[258,3761,3763],{"class":260,"line":3762},128,[258,3764,3765],{"class":305},"\u002F\u002F This is the standard pattern for all route calls\n",[258,3767,3769],{"class":260,"line":3768},129,[258,3770,3771],{"class":305},"\u002F\u002F call() never throws - returns a 4-tuple\n",[258,3773,3775],{"class":260,"line":3774},130,[258,3776,3777],{"class":305},"\u002F\u002F Partial destructuring still works for backward compatibility\n",[258,3779,3781,3783,3785,3788,3790,3793,3795,3797,3799,3801,3803,3805,3807,3809,3811,3813,3816,3818,3820,3822,3824,3826],{"class":260,"line":3780},131,[258,3782,344],{"class":343},[258,3784,555],{"class":268},[258,3786,3787],{"class":272},"user6",[258,3789,352],{"class":268},[258,3791,3792],{"class":272}," error6",[258,3794,566],{"class":268},[258,3796,360],{"class":268},[258,3798,571],{"class":264},[258,3800,574],{"class":272},[258,3802,447],{"class":268},[258,3804,872],{"class":272},[258,3806,447],{"class":268},[258,3808,877],{"class":363},[258,3810,376],{"class":272},[258,3812,289],{"class":268},[258,3814,3815],{"class":285},"USER-999",[258,3817,289],{"class":268},[258,3819,398],{"class":272},[258,3821,447],{"class":268},[258,3823,601],{"class":363},[258,3825,604],{"class":272},[258,3827,292],{"class":268},[258,3829,3831,3833,3836],{"class":260,"line":3830},132,[258,3832,617],{"class":264},[258,3834,3835],{"class":272}," (error6) ",[258,3837,623],{"class":268},[258,3839,3841],{"class":260,"line":3840},133,[258,3842,3843],{"class":305},"    \u002F\u002F TypeScript knows error is the typed error here\n",[258,3845,3847],{"class":260,"line":3846},134,[258,3848,3849],{"class":305},"    \u002F\u002F Each error type can be checked\n",[258,3851,3853,3855,3857,3860,3862,3864,3866,3868,3870,3872,3874],{"class":260,"line":3852},135,[258,3854,2606],{"class":264},[258,3856,1395],{"class":382},[258,3858,3859],{"class":272},"error6",[258,3861,447],{"class":268},[258,3863,1718],{"class":272},[258,3865,2138],{"class":268},[258,3867,282],{"class":268},[258,3869,2553],{"class":285},[258,3871,289],{"class":268},[258,3873,1985],{"class":382},[258,3875,623],{"class":268},[258,3877,3879],{"class":260,"line":3878},136,[258,3880,3881],{"class":305},"        \u002F\u002F error6.errorData is still strongly typed!\n",[258,3883,3885,3887,3889,3891,3893,3895,3897,3899,3901,3903,3905,3907,3909,3911,3913],{"class":260,"line":3884},137,[258,3886,1339],{"class":272},[258,3888,447],{"class":268},[258,3890,634],{"class":363},[258,3892,376],{"class":382},[258,3894,289],{"class":268},[258,3896,3294],{"class":285},[258,3898,289],{"class":268},[258,3900,352],{"class":268},[258,3902,3792],{"class":272},[258,3904,447],{"class":268},[258,3906,2235],{"class":272},[258,3908,985],{"class":268},[258,3910,2596],{"class":272},[258,3912,398],{"class":382},[258,3914,292],{"class":268},[258,3916,3918,3920,3922],{"class":260,"line":3917},138,[258,3919,1371],{"class":268},[258,3921,664],{"class":264},[258,3923,667],{"class":268},[258,3925,3927,3929,3931,3933,3935,3937,3940,3942,3944,3946,3948,3950,3952],{"class":260,"line":3926},139,[258,3928,1339],{"class":272},[258,3930,447],{"class":268},[258,3932,634],{"class":363},[258,3934,376],{"class":382},[258,3936,289],{"class":268},[258,3938,3939],{"class":285},"Other error:",[258,3941,289],{"class":268},[258,3943,352],{"class":268},[258,3945,3792],{"class":272},[258,3947,447],{"class":268},[258,3949,652],{"class":272},[258,3951,398],{"class":382},[258,3953,292],{"class":268},[258,3955,3957],{"class":260,"line":3956},140,[258,3958,2683],{"class":268},[258,3960,3962],{"class":260,"line":3961},141,[258,3963,694],{"class":268},[258,3965,3967],{"class":260,"line":3966},142,[258,3968,2744],{"class":305},[258,3970,3972],{"class":260,"line":3971},143,[258,3973,2750],{"class":305},[258,3975,3977,3979,3981,3983,3985,3987,3989,3991,3993,3996,3998,4000,4002,4004,4006,4008],{"class":260,"line":3976},144,[258,3978,2756],{"class":272},[258,3980,447],{"class":268},[258,3982,634],{"class":363},[258,3984,376],{"class":272},[258,3986,289],{"class":268},[258,3988,3730],{"class":285},[258,3990,289],{"class":268},[258,3992,352],{"class":268},[258,3994,3995],{"class":272}," user6",[258,3997,985],{"class":268},[258,3999,2779],{"class":272},[258,4001,352],{"class":268},[258,4003,3995],{"class":272},[258,4005,985],{"class":268},[258,4007,2788],{"class":272},[258,4009,292],{"class":268},[258,4011,4013],{"class":260,"line":4012},145,[258,4014,4015],{"class":305},"\u002F\u002F validate parameters locally without calling the server\n",[258,4017,4019,4021,4024,4026,4028,4030,4032,4034,4036,4038,4040,4042,4044,4046],{"class":260,"line":4018},146,[258,4020,344],{"class":343},[258,4022,4023],{"class":272}," validationResp ",[258,4025,1816],{"class":268},[258,4027,571],{"class":264},[258,4029,574],{"class":272},[258,4031,447],{"class":268},[258,4033,872],{"class":272},[258,4035,447],{"class":268},[258,4037,3017],{"class":363},[258,4039,3020],{"class":272},[258,4041,447],{"class":268},[258,4043,2441],{"class":363},[258,4045,604],{"class":272},[258,4047,292],{"class":268},[258,4049,4051,4053,4055,4057,4060,4062],{"class":260,"line":4050},147,[258,4052,2756],{"class":272},[258,4054,447],{"class":268},[258,4056,634],{"class":363},[258,4058,4059],{"class":272},"(validationResp)",[258,4061,685],{"class":268},[258,4063,4064],{"class":305}," \u002F\u002F []\n",[249,4066,4069],{"className":251,"code":4067,"filename":4068,"language":253,"meta":254,"style":254},"import {RpcError, HeadersSubset} from '@mionjs\u002Fcore';\nimport {Routes, headersFn, middleFn, initMionRouter, route} from '@mionjs\u002Frouter';\nimport {Logger} from 'Logger';\n\nexport type User = {id: string; name: string; surname: string};\nexport type Order = {id: string; date: Date; userId: string; totalUSD: number};\n\n\u002F\u002F Session info returned by auth middleFn - strongly typed in client onSuccess!\nexport type SessionInfo = {\n    userId: string;\n    role: 'admin' | 'user' | 'guest';\n    permissions: string[];\n    expiresAt: Date;\n};\n\n\u002F\u002F Error data types - these will be strongly typed in the client!\nexport type UserNotFoundData = {requestedId: string; suggestedIds?: string[]};\nexport type OrderNotFoundData = {requestedId: string};\nexport type NotAuthorizedData = {reason: 'missing-token' | 'invalid-token' | 'expired-token'};\n\n\u002F\u002F Simulated database\nconst usersDb: Record\u003Cstring, User> = {\n    'USER-123': {id: 'USER-123', name: 'John', surname: 'Smith'},\n};\n\nconst routes = {\n    \u002F\u002F MiddleFn with typed errorData and typed success return\n    \u002F\u002F When returnSession is true, returns SessionInfo - strongly typed in client onSuccess!\n    auth: headersFn(\n        (\n            ctx,\n            h: HeadersSubset\u003C'Authorization'>,\n            returnSession = false\n        ): SessionInfo | void | RpcError\u003C'not-authorized', NotAuthorizedData> => {\n            const token = h.headers.Authorization;\n            if (!token) {\n                throw new RpcError({\n                    publicMessage: 'Not Authorized',\n                    type: 'not-authorized',\n                    errorData: {reason: 'missing-token'},\n                });\n            }\n            \u002F\u002F Return session info if requested\n            if (returnSession) {\n                return {\n                    userId: 'USER-123',\n                    role: 'admin',\n                    permissions: ['read', 'write', 'delete'],\n                    expiresAt: new Date(Date.now() + 3600000), \u002F\u002F 1 hour from now\n                };\n            }\n        }\n    ),\n    users: {\n        \u002F\u002F Route with typed errorData - client can access error.errorData.requestedId\n        getById: route((ctx, id: string): User | RpcError\u003C'user-not-found', UserNotFoundData> => {\n            const user = usersDb[id];\n            if (!user) {\n                return new RpcError({\n                    publicMessage: `User ${id} not found`,\n                    type: 'user-not-found',\n                    errorData: {requestedId: id, suggestedIds: ['USER-123']},\n                });\n            }\n            return user;\n        }),\n        delete: route((ctx, id: string): string => id),\n        create: route((ctx, user: Omit\u003CUser, 'id'>): User => ({id: 'USER-123', ...user})),\n        sayHello: route((ctx, user: User): string => `Hello ${user.name} ${user.surname}`),\n    },\n    orders: {\n        \u002F\u002F Route with typed errorData\n        getById: route((ctx, id: string): Order | RpcError\u003C'order-not-found', OrderNotFoundData> => {\n            if (id === 'ORDER-404') {\n                return new RpcError({\n                    publicMessage: `Order ${id} not found`,\n                    type: 'order-not-found',\n                    errorData: {requestedId: id},\n                });\n            }\n            return {id, date: new Date(), userId: 'USER-123', totalUSD: 120};\n        }),\n        delete: route((ctx, id: string): string => id),\n        create: route((ctx, order: Omit\u003COrder, 'id'>): Order => ({id: 'ORDER-123', ...order})),\n    },\n    utils: {\n        sum: route((ctx, a: number, b: number): number => a + b),\n    },\n    log: middleFn((ctx): void => Logger.log(ctx.path, ctx.request.headers, ctx.request.body), {runOnError: true}),\n} satisfies Routes;\n\n\u002F\u002F init & register routes (this automatically registers client routes)\nconst myApi = await initMionRouter(routes);\n\n\u002F\u002F Export the type of the Api (used by the client)\nexport type MyApi = typeof myApi;\n","server.routes.ts",[219,4070,4071,4095,4136,4157,4161,4200,4250,4254,4259,4272,4283,4316,4330,4341,4345,4349,4354,4387,4408,4450,4454,4459,4485,4536,4540,4544,4555,4560,4565,4577,4582,4589,4605,4615,4651,4674,4690,4703,4719,4734,4755,4764,4769,4774,4787,4794,4809,4824,4862,4899,4904,4908,4912,4919,4928,4933,4985,5005,5019,5031,5058,5072,5104,5112,5116,5125,5133,5167,5238,5299,5303,5312,5317,5365,5385,5397,5420,5434,5450,5458,5462,5505,5513,5545,5613,5617,5626,5675,5679,5759,5771,5775,5780,5798,5802,5807],{"__ignoreMap":254},[258,4072,4073,4075,4077,4079,4081,4083,4085,4087,4089,4091,4093],{"class":260,"line":261},[258,4074,265],{"class":264},[258,4076,269],{"class":268},[258,4078,1085],{"class":272},[258,4080,352],{"class":268},[258,4082,927],{"class":272},[258,4084,276],{"class":268},[258,4086,279],{"class":264},[258,4088,282],{"class":268},[258,4090,769],{"class":285},[258,4092,289],{"class":268},[258,4094,292],{"class":268},[258,4096,4097,4099,4101,4103,4105,4108,4110,4113,4115,4118,4120,4123,4125,4127,4129,4132,4134],{"class":260,"line":295},[258,4098,265],{"class":264},[258,4100,269],{"class":268},[258,4102,38],{"class":272},[258,4104,352],{"class":268},[258,4106,4107],{"class":272}," headersFn",[258,4109,352],{"class":268},[258,4111,4112],{"class":272}," middleFn",[258,4114,352],{"class":268},[258,4116,4117],{"class":272}," initMionRouter",[258,4119,352],{"class":268},[258,4121,4122],{"class":272}," route",[258,4124,276],{"class":268},[258,4126,279],{"class":264},[258,4128,282],{"class":268},[258,4130,4131],{"class":285},"@mionjs\u002Frouter",[258,4133,289],{"class":268},[258,4135,292],{"class":268},[258,4137,4138,4140,4142,4145,4147,4149,4151,4153,4155],{"class":260,"line":302},[258,4139,265],{"class":264},[258,4141,269],{"class":268},[258,4143,4144],{"class":272},"Logger",[258,4146,276],{"class":268},[258,4148,279],{"class":264},[258,4150,282],{"class":268},[258,4152,4144],{"class":285},[258,4154,289],{"class":268},[258,4156,292],{"class":268},[258,4158,4159],{"class":260,"line":309},[258,4160,299],{"emptyLinePlaceholder":298},[258,4162,4163,4166,4168,4171,4173,4175,4177,4179,4182,4184,4186,4188,4190,4192,4194,4196,4198],{"class":260,"line":335},[258,4164,4165],{"class":264},"export",[258,4167,314],{"class":343},[258,4169,4170],{"class":370}," User",[258,4172,360],{"class":268},[258,4174,269],{"class":268},[258,4176,1821],{"class":382},[258,4178,386],{"class":268},[258,4180,4181],{"class":370}," string",[258,4183,685],{"class":268},[258,4185,1834],{"class":382},[258,4187,386],{"class":268},[258,4189,4181],{"class":370},[258,4191,685],{"class":268},[258,4193,1848],{"class":382},[258,4195,386],{"class":268},[258,4197,4181],{"class":370},[258,4199,1860],{"class":268},[258,4201,4202,4204,4206,4209,4211,4213,4215,4217,4219,4221,4224,4226,4229,4231,4234,4236,4238,4240,4243,4245,4248],{"class":260,"line":340},[258,4203,4165],{"class":264},[258,4205,314],{"class":343},[258,4207,4208],{"class":370}," Order",[258,4210,360],{"class":268},[258,4212,269],{"class":268},[258,4214,1821],{"class":382},[258,4216,386],{"class":268},[258,4218,4181],{"class":370},[258,4220,685],{"class":268},[258,4222,4223],{"class":382}," date",[258,4225,386],{"class":268},[258,4227,4228],{"class":370}," Date",[258,4230,685],{"class":268},[258,4232,4233],{"class":382}," userId",[258,4235,386],{"class":268},[258,4237,4181],{"class":370},[258,4239,685],{"class":268},[258,4241,4242],{"class":382}," totalUSD",[258,4244,386],{"class":268},[258,4246,4247],{"class":370}," number",[258,4249,1860],{"class":268},[258,4251,4252],{"class":260,"line":550},[258,4253,299],{"emptyLinePlaceholder":298},[258,4255,4256],{"class":260,"line":609},[258,4257,4258],{"class":305},"\u002F\u002F Session info returned by auth middleFn - strongly typed in client onSuccess!\n",[258,4260,4261,4263,4265,4268,4270],{"class":260,"line":614},[258,4262,4165],{"class":264},[258,4264,314],{"class":343},[258,4266,4267],{"class":370}," SessionInfo",[258,4269,360],{"class":268},[258,4271,667],{"class":268},[258,4273,4274,4277,4279,4281],{"class":260,"line":626},[258,4275,4276],{"class":382},"    userId",[258,4278,386],{"class":268},[258,4280,4181],{"class":370},[258,4282,292],{"class":268},[258,4284,4285,4288,4290,4292,4294,4296,4299,4301,4303,4305,4307,4309,4312,4314],{"class":260,"line":659},[258,4286,4287],{"class":382},"    role",[258,4289,386],{"class":268},[258,4291,282],{"class":268},[258,4293,2143],{"class":285},[258,4295,289],{"class":268},[258,4297,4298],{"class":268}," |",[258,4300,282],{"class":268},[258,4302,844],{"class":285},[258,4304,289],{"class":268},[258,4306,4298],{"class":268},[258,4308,282],{"class":268},[258,4310,4311],{"class":285},"guest",[258,4313,289],{"class":268},[258,4315,292],{"class":268},[258,4317,4318,4321,4323,4325,4328],{"class":260,"line":670},[258,4319,4320],{"class":382},"    permissions",[258,4322,386],{"class":268},[258,4324,4181],{"class":370},[258,4326,4327],{"class":272},"[]",[258,4329,292],{"class":268},[258,4331,4332,4335,4337,4339],{"class":260,"line":691},[258,4333,4334],{"class":382},"    expiresAt",[258,4336,386],{"class":268},[258,4338,4228],{"class":370},[258,4340,292],{"class":268},[258,4342,4343],{"class":260,"line":967},[258,4344,1860],{"class":268},[258,4346,4347],{"class":260,"line":972},[258,4348,299],{"emptyLinePlaceholder":298},[258,4350,4351],{"class":260,"line":993},[258,4352,4353],{"class":305},"\u002F\u002F Error data types - these will be strongly typed in the client!\n",[258,4355,4356,4358,4360,4363,4365,4367,4369,4371,4373,4375,4378,4381,4383,4385],{"class":260,"line":1015},[258,4357,4165],{"class":264},[258,4359,314],{"class":343},[258,4361,4362],{"class":370}," UserNotFoundData",[258,4364,360],{"class":268},[258,4366,269],{"class":268},[258,4368,2596],{"class":382},[258,4370,386],{"class":268},[258,4372,4181],{"class":370},[258,4374,685],{"class":268},[258,4376,4377],{"class":382}," suggestedIds",[258,4379,4380],{"class":268},"?:",[258,4382,4181],{"class":370},[258,4384,4327],{"class":272},[258,4386,1860],{"class":268},[258,4388,4389,4391,4393,4396,4398,4400,4402,4404,4406],{"class":260,"line":1024},[258,4390,4165],{"class":264},[258,4392,314],{"class":343},[258,4394,4395],{"class":370}," OrderNotFoundData",[258,4397,360],{"class":268},[258,4399,269],{"class":268},[258,4401,2596],{"class":382},[258,4403,386],{"class":268},[258,4405,4181],{"class":370},[258,4407,1860],{"class":268},[258,4409,4410,4412,4414,4417,4419,4421,4423,4425,4427,4429,4431,4433,4435,4438,4440,4442,4444,4446,4448],{"class":260,"line":1044},[258,4411,4165],{"class":264},[258,4413,314],{"class":343},[258,4415,4416],{"class":370}," NotAuthorizedData",[258,4418,360],{"class":268},[258,4420,269],{"class":268},[258,4422,2240],{"class":382},[258,4424,386],{"class":268},[258,4426,282],{"class":268},[258,4428,2305],{"class":285},[258,4430,289],{"class":268},[258,4432,4298],{"class":268},[258,4434,282],{"class":268},[258,4436,4437],{"class":285},"invalid-token",[258,4439,289],{"class":268},[258,4441,4298],{"class":268},[258,4443,282],{"class":268},[258,4445,2257],{"class":285},[258,4447,289],{"class":268},[258,4449,1860],{"class":268},[258,4451,4452],{"class":260,"line":1407},[258,4453,299],{"emptyLinePlaceholder":298},[258,4455,4456],{"class":260,"line":1413},[258,4457,4458],{"class":305},"\u002F\u002F Simulated database\n",[258,4460,4461,4463,4466,4468,4471,4473,4475,4477,4479,4481,4483],{"class":260,"line":1443},[258,4462,344],{"class":343},[258,4464,4465],{"class":272}," usersDb",[258,4467,386],{"class":268},[258,4469,4470],{"class":370}," Record",[258,4472,367],{"class":268},[258,4474,1243],{"class":370},[258,4476,352],{"class":268},[258,4478,4170],{"class":370},[258,4480,373],{"class":268},[258,4482,360],{"class":268},[258,4484,667],{"class":268},[258,4486,4487,4490,4492,4494,4496,4498,4500,4502,4504,4506,4508,4510,4512,4514,4516,4518,4520,4522,4524,4526,4528,4531,4533],{"class":260,"line":1453},[258,4488,4489],{"class":268},"    '",[258,4491,2515],{"class":382},[258,4493,289],{"class":268},[258,4495,386],{"class":268},[258,4497,269],{"class":268},[258,4499,1821],{"class":382},[258,4501,386],{"class":268},[258,4503,282],{"class":268},[258,4505,2515],{"class":285},[258,4507,289],{"class":268},[258,4509,352],{"class":268},[258,4511,1834],{"class":382},[258,4513,386],{"class":268},[258,4515,282],{"class":268},[258,4517,1841],{"class":285},[258,4519,289],{"class":268},[258,4521,352],{"class":268},[258,4523,1848],{"class":382},[258,4525,386],{"class":268},[258,4527,282],{"class":268},[258,4529,4530],{"class":285},"Smith",[258,4532,289],{"class":268},[258,4534,4535],{"class":268},"},\n",[258,4537,4538],{"class":260,"line":1462},[258,4539,1860],{"class":268},[258,4541,4542],{"class":260,"line":1467},[258,4543,299],{"emptyLinePlaceholder":298},[258,4545,4546,4548,4551,4553],{"class":260,"line":1473},[258,4547,344],{"class":343},[258,4549,4550],{"class":272}," routes ",[258,4552,1816],{"class":268},[258,4554,667],{"class":268},[258,4556,4557],{"class":260,"line":1479},[258,4558,4559],{"class":305},"    \u002F\u002F MiddleFn with typed errorData and typed success return\n",[258,4561,4562],{"class":260,"line":1534},[258,4563,4564],{"class":305},"    \u002F\u002F When returnSession is true, returns SessionInfo - strongly typed in client onSuccess!\n",[258,4566,4567,4570,4572,4574],{"class":260,"line":1539},[258,4568,4569],{"class":382},"    auth",[258,4571,386],{"class":268},[258,4573,4107],{"class":363},[258,4575,4576],{"class":272},"(\n",[258,4578,4579],{"class":260,"line":1545},[258,4580,4581],{"class":272},"        (\n",[258,4583,4584,4587],{"class":260,"line":1551},[258,4585,4586],{"class":272},"            ctx",[258,4588,951],{"class":268},[258,4590,4591,4594,4596,4598,4600,4602],{"class":260,"line":1557},[258,4592,4593],{"class":272},"            h: HeadersSubset",[258,4595,367],{"class":268},[258,4597,289],{"class":268},[258,4599,934],{"class":285},[258,4601,289],{"class":268},[258,4603,4604],{"class":268},">,\n",[258,4606,4607,4610,4612],{"class":260,"line":1571},[258,4608,4609],{"class":272},"            returnSession ",[258,4611,1816],{"class":268},[258,4613,4614],{"class":1981}," false\n",[258,4616,4617,4620,4622,4624,4626,4628,4630,4633,4635,4637,4639,4641,4643,4645,4647,4649],{"class":260,"line":1605},[258,4618,4619],{"class":272},"        )",[258,4621,386],{"class":268},[258,4623,4267],{"class":370},[258,4625,4298],{"class":268},[258,4627,1222],{"class":370},[258,4629,4298],{"class":268},[258,4631,4632],{"class":370}," RpcError",[258,4634,367],{"class":268},[258,4636,289],{"class":268},[258,4638,1388],{"class":285},[258,4640,289],{"class":268},[258,4642,352],{"class":268},[258,4644,4416],{"class":370},[258,4646,373],{"class":268},[258,4648,1327],{"class":343},[258,4650,667],{"class":268},[258,4652,4653,4656,4659,4661,4664,4666,4668,4670,4672],{"class":260,"line":1610},[258,4654,4655],{"class":343},"            const",[258,4657,4658],{"class":272}," token",[258,4660,360],{"class":268},[258,4662,4663],{"class":272}," h",[258,4665,447],{"class":268},[258,4667,3113],{"class":272},[258,4669,447],{"class":268},[258,4671,934],{"class":272},[258,4673,292],{"class":268},[258,4675,4676,4679,4681,4683,4686,4688],{"class":260,"line":1624},[258,4677,4678],{"class":264},"            if",[258,4680,1395],{"class":382},[258,4682,1666],{"class":268},[258,4684,4685],{"class":272},"token",[258,4687,1985],{"class":382},[258,4689,623],{"class":268},[258,4691,4692,4695,4697,4699,4701],{"class":260,"line":1654},[258,4693,4694],{"class":264},"                throw",[258,4696,1940],{"class":268},[258,4698,4632],{"class":363},[258,4700,376],{"class":382},[258,4702,623],{"class":268},[258,4704,4705,4708,4710,4712,4715,4717],{"class":260,"line":1659},[258,4706,4707],{"class":382},"                    publicMessage",[258,4709,386],{"class":268},[258,4711,282],{"class":268},[258,4713,4714],{"class":285},"Not Authorized",[258,4716,289],{"class":268},[258,4718,951],{"class":268},[258,4720,4721,4724,4726,4728,4730,4732],{"class":260,"line":1674},[258,4722,4723],{"class":382},"                    type",[258,4725,386],{"class":268},[258,4727,282],{"class":268},[258,4729,1388],{"class":285},[258,4731,289],{"class":268},[258,4733,951],{"class":268},[258,4735,4736,4739,4741,4743,4745,4747,4749,4751,4753],{"class":260,"line":1693},[258,4737,4738],{"class":382},"                    errorData",[258,4740,386],{"class":268},[258,4742,269],{"class":268},[258,4744,2240],{"class":382},[258,4746,386],{"class":268},[258,4748,282],{"class":268},[258,4750,2305],{"class":285},[258,4752,289],{"class":268},[258,4754,4535],{"class":268},[258,4756,4757,4760,4762],{"class":260,"line":2343},[258,4758,4759],{"class":268},"                }",[258,4761,398],{"class":382},[258,4763,292],{"class":268},[258,4765,4766],{"class":260,"line":2373},[258,4767,4768],{"class":268},"            }\n",[258,4770,4771],{"class":260,"line":2378},[258,4772,4773],{"class":305},"            \u002F\u002F Return session info if requested\n",[258,4775,4776,4778,4780,4783,4785],{"class":260,"line":2385},[258,4777,4678],{"class":264},[258,4779,1395],{"class":382},[258,4781,4782],{"class":272},"returnSession",[258,4784,1985],{"class":382},[258,4786,623],{"class":268},[258,4788,4789,4792],{"class":260,"line":2413},[258,4790,4791],{"class":264},"                return",[258,4793,667],{"class":268},[258,4795,4796,4799,4801,4803,4805,4807],{"class":260,"line":2448},[258,4797,4798],{"class":382},"                    userId",[258,4800,386],{"class":268},[258,4802,282],{"class":268},[258,4804,2515],{"class":285},[258,4806,289],{"class":268},[258,4808,951],{"class":268},[258,4810,4811,4814,4816,4818,4820,4822],{"class":260,"line":2457},[258,4812,4813],{"class":382},"                    role",[258,4815,386],{"class":268},[258,4817,282],{"class":268},[258,4819,2143],{"class":285},[258,4821,289],{"class":268},[258,4823,951],{"class":268},[258,4825,4826,4829,4831,4833,4835,4838,4840,4842,4844,4847,4849,4851,4853,4856,4858,4860],{"class":260,"line":2462},[258,4827,4828],{"class":382},"                    permissions",[258,4830,386],{"class":268},[258,4832,555],{"class":382},[258,4834,289],{"class":268},[258,4836,4837],{"class":285},"read",[258,4839,289],{"class":268},[258,4841,352],{"class":268},[258,4843,282],{"class":268},[258,4845,4846],{"class":285},"write",[258,4848,289],{"class":268},[258,4850,352],{"class":268},[258,4852,282],{"class":268},[258,4854,4855],{"class":285},"delete",[258,4857,289],{"class":268},[258,4859,566],{"class":382},[258,4861,951],{"class":268},[258,4863,4864,4867,4869,4871,4873,4875,4878,4880,4883,4886,4889,4892,4894,4896],{"class":260,"line":2468},[258,4865,4866],{"class":382},"                    expiresAt",[258,4868,386],{"class":268},[258,4870,1940],{"class":268},[258,4872,4228],{"class":363},[258,4874,376],{"class":382},[258,4876,4877],{"class":272},"Date",[258,4879,447],{"class":268},[258,4881,4882],{"class":363},"now",[258,4884,4885],{"class":382},"() ",[258,4887,4888],{"class":268},"+",[258,4890,4891],{"class":588}," 3600000",[258,4893,398],{"class":382},[258,4895,352],{"class":268},[258,4897,4898],{"class":305}," \u002F\u002F 1 hour from now\n",[258,4900,4901],{"class":260,"line":2474},[258,4902,4903],{"class":268},"                };\n",[258,4905,4906],{"class":260,"line":2480},[258,4907,4768],{"class":268},[258,4909,4910],{"class":260,"line":2530},[258,4911,2176],{"class":268},[258,4913,4914,4917],{"class":260,"line":2562},[258,4915,4916],{"class":272},"    )",[258,4918,951],{"class":268},[258,4920,4921,4924,4926],{"class":260,"line":2568},[258,4922,4923],{"class":382},"    users",[258,4925,386],{"class":268},[258,4927,667],{"class":268},[258,4929,4930],{"class":260,"line":2603},[258,4931,4932],{"class":305},"        \u002F\u002F Route with typed errorData - client can access error.errorData.requestedId\n",[258,4934,4935,4938,4940,4942,4944,4946,4949,4951,4954,4956,4958,4961,4963,4965,4967,4969,4971,4973,4975,4977,4979,4981,4983],{"class":260,"line":2632},[258,4936,4937],{"class":382},"        getById",[258,4939,386],{"class":268},[258,4941,4122],{"class":363},[258,4943,376],{"class":272},[258,4945,376],{"class":268},[258,4947,4948],{"class":1321},"ctx",[258,4950,352],{"class":268},[258,4952,4953],{"class":1321}," id",[258,4955,386],{"class":268},[258,4957,4181],{"class":370},[258,4959,4960],{"class":268},"):",[258,4962,4170],{"class":370},[258,4964,4298],{"class":268},[258,4966,4632],{"class":370},[258,4968,367],{"class":268},[258,4970,289],{"class":268},[258,4972,2553],{"class":285},[258,4974,289],{"class":268},[258,4976,352],{"class":268},[258,4978,4362],{"class":370},[258,4980,373],{"class":268},[258,4982,1327],{"class":343},[258,4984,667],{"class":268},[258,4986,4987,4989,4992,4994,4996,4999,5001,5003],{"class":260,"line":2680},[258,4988,4655],{"class":343},[258,4990,4991],{"class":272}," user",[258,4993,360],{"class":268},[258,4995,4465],{"class":272},[258,4997,4998],{"class":382},"[",[258,5000,1821],{"class":272},[258,5002,566],{"class":382},[258,5004,292],{"class":268},[258,5006,5007,5009,5011,5013,5015,5017],{"class":260,"line":2686},[258,5008,4678],{"class":264},[258,5010,1395],{"class":382},[258,5012,1666],{"class":268},[258,5014,844],{"class":272},[258,5016,1985],{"class":382},[258,5018,623],{"class":268},[258,5020,5021,5023,5025,5027,5029],{"class":260,"line":2700},[258,5022,4791],{"class":264},[258,5024,1940],{"class":268},[258,5026,4632],{"class":363},[258,5028,376],{"class":382},[258,5030,623],{"class":268},[258,5032,5033,5035,5037,5040,5043,5046,5048,5050,5053,5056],{"class":260,"line":2706},[258,5034,4707],{"class":382},[258,5036,386],{"class":268},[258,5038,5039],{"class":268}," `",[258,5041,5042],{"class":285},"User ",[258,5044,5045],{"class":268},"${",[258,5047,1821],{"class":272},[258,5049,276],{"class":268},[258,5051,5052],{"class":285}," not found",[258,5054,5055],{"class":268},"`",[258,5057,951],{"class":268},[258,5059,5060,5062,5064,5066,5068,5070],{"class":260,"line":2736},[258,5061,4723],{"class":382},[258,5063,386],{"class":268},[258,5065,282],{"class":268},[258,5067,2553],{"class":285},[258,5069,289],{"class":268},[258,5071,951],{"class":268},[258,5073,5074,5076,5078,5080,5082,5084,5086,5088,5090,5092,5094,5096,5098,5100,5102],{"class":260,"line":2741},[258,5075,4738],{"class":382},[258,5077,386],{"class":268},[258,5079,269],{"class":268},[258,5081,2596],{"class":382},[258,5083,386],{"class":268},[258,5085,4953],{"class":272},[258,5087,352],{"class":268},[258,5089,4377],{"class":382},[258,5091,386],{"class":268},[258,5093,555],{"class":382},[258,5095,289],{"class":268},[258,5097,2515],{"class":285},[258,5099,289],{"class":268},[258,5101,566],{"class":382},[258,5103,4535],{"class":268},[258,5105,5106,5108,5110],{"class":260,"line":2747},[258,5107,4759],{"class":268},[258,5109,398],{"class":382},[258,5111,292],{"class":268},[258,5113,5114],{"class":260,"line":2753},[258,5115,4768],{"class":268},[258,5117,5118,5121,5123],{"class":260,"line":2793},[258,5119,5120],{"class":264},"            return",[258,5122,4991],{"class":272},[258,5124,292],{"class":268},[258,5126,5127,5129,5131],{"class":260,"line":2798},[258,5128,2289],{"class":268},[258,5130,398],{"class":272},[258,5132,951],{"class":268},[258,5134,5135,5138,5140,5142,5144,5146,5148,5150,5152,5154,5156,5158,5160,5162,5165],{"class":260,"line":2804},[258,5136,5137],{"class":382},"        delete",[258,5139,386],{"class":268},[258,5141,4122],{"class":363},[258,5143,376],{"class":272},[258,5145,376],{"class":268},[258,5147,4948],{"class":1321},[258,5149,352],{"class":268},[258,5151,4953],{"class":1321},[258,5153,386],{"class":268},[258,5155,4181],{"class":370},[258,5157,4960],{"class":268},[258,5159,4181],{"class":370},[258,5161,1327],{"class":343},[258,5163,5164],{"class":272}," id)",[258,5166,951],{"class":268},[258,5168,5169,5172,5174,5176,5178,5180,5182,5184,5186,5188,5191,5193,5196,5198,5200,5202,5204,5207,5209,5211,5213,5215,5217,5219,5221,5223,5225,5227,5230,5232,5234,5236],{"class":260,"line":2810},[258,5170,5171],{"class":382},"        create",[258,5173,386],{"class":268},[258,5175,4122],{"class":363},[258,5177,376],{"class":272},[258,5179,376],{"class":268},[258,5181,4948],{"class":1321},[258,5183,352],{"class":268},[258,5185,4991],{"class":1321},[258,5187,386],{"class":268},[258,5189,5190],{"class":370}," Omit",[258,5192,367],{"class":268},[258,5194,5195],{"class":370},"User",[258,5197,352],{"class":268},[258,5199,282],{"class":268},[258,5201,1821],{"class":285},[258,5203,289],{"class":268},[258,5205,5206],{"class":268},">):",[258,5208,4170],{"class":370},[258,5210,1327],{"class":343},[258,5212,1395],{"class":272},[258,5214,379],{"class":268},[258,5216,1821],{"class":382},[258,5218,386],{"class":268},[258,5220,282],{"class":268},[258,5222,2515],{"class":285},[258,5224,289],{"class":268},[258,5226,352],{"class":268},[258,5228,5229],{"class":268}," ...",[258,5231,844],{"class":272},[258,5233,276],{"class":268},[258,5235,948],{"class":272},[258,5237,951],{"class":268},[258,5239,5240,5243,5245,5247,5249,5251,5253,5255,5257,5259,5261,5263,5265,5267,5269,5272,5274,5276,5278,5280,5282,5285,5287,5289,5292,5295,5297],{"class":260,"line":2861},[258,5241,5242],{"class":382},"        sayHello",[258,5244,386],{"class":268},[258,5246,4122],{"class":363},[258,5248,376],{"class":272},[258,5250,376],{"class":268},[258,5252,4948],{"class":1321},[258,5254,352],{"class":268},[258,5256,4991],{"class":1321},[258,5258,386],{"class":268},[258,5260,4170],{"class":370},[258,5262,4960],{"class":268},[258,5264,4181],{"class":370},[258,5266,1327],{"class":343},[258,5268,5039],{"class":268},[258,5270,5271],{"class":285},"Hello ",[258,5273,5045],{"class":268},[258,5275,844],{"class":272},[258,5277,447],{"class":268},[258,5279,2779],{"class":272},[258,5281,276],{"class":268},[258,5283,5284],{"class":268}," ${",[258,5286,844],{"class":272},[258,5288,447],{"class":268},[258,5290,5291],{"class":272},"surname",[258,5293,5294],{"class":268},"}`",[258,5296,398],{"class":272},[258,5298,951],{"class":268},[258,5300,5301],{"class":260,"line":2890},[258,5302,956],{"class":268},[258,5304,5305,5308,5310],{"class":260,"line":2896},[258,5306,5307],{"class":382},"    orders",[258,5309,386],{"class":268},[258,5311,667],{"class":268},[258,5313,5314],{"class":260,"line":2930},[258,5315,5316],{"class":305},"        \u002F\u002F Route with typed errorData\n",[258,5318,5319,5321,5323,5325,5327,5329,5331,5333,5335,5337,5339,5341,5343,5345,5347,5349,5351,5353,5355,5357,5359,5361,5363],{"class":260,"line":2935},[258,5320,4937],{"class":382},[258,5322,386],{"class":268},[258,5324,4122],{"class":363},[258,5326,376],{"class":272},[258,5328,376],{"class":268},[258,5330,4948],{"class":1321},[258,5332,352],{"class":268},[258,5334,4953],{"class":1321},[258,5336,386],{"class":268},[258,5338,4181],{"class":370},[258,5340,4960],{"class":268},[258,5342,4208],{"class":370},[258,5344,4298],{"class":268},[258,5346,4632],{"class":370},[258,5348,367],{"class":268},[258,5350,289],{"class":268},[258,5352,2881],{"class":285},[258,5354,289],{"class":268},[258,5356,352],{"class":268},[258,5358,4395],{"class":370},[258,5360,373],{"class":268},[258,5362,1327],{"class":343},[258,5364,667],{"class":268},[258,5366,5367,5369,5371,5373,5375,5377,5379,5381,5383],{"class":260,"line":2941},[258,5368,4678],{"class":264},[258,5370,1395],{"class":382},[258,5372,1821],{"class":272},[258,5374,2138],{"class":268},[258,5376,282],{"class":268},[258,5378,2846],{"class":285},[258,5380,289],{"class":268},[258,5382,1985],{"class":382},[258,5384,623],{"class":268},[258,5386,5387,5389,5391,5393,5395],{"class":260,"line":2971},[258,5388,4791],{"class":264},[258,5390,1940],{"class":268},[258,5392,4632],{"class":363},[258,5394,376],{"class":382},[258,5396,623],{"class":268},[258,5398,5399,5401,5403,5405,5408,5410,5412,5414,5416,5418],{"class":260,"line":2976},[258,5400,4707],{"class":382},[258,5402,386],{"class":268},[258,5404,5039],{"class":268},[258,5406,5407],{"class":285},"Order ",[258,5409,5045],{"class":268},[258,5411,1821],{"class":272},[258,5413,276],{"class":268},[258,5415,5052],{"class":285},[258,5417,5055],{"class":268},[258,5419,951],{"class":268},[258,5421,5422,5424,5426,5428,5430,5432],{"class":260,"line":2982},[258,5423,4723],{"class":382},[258,5425,386],{"class":268},[258,5427,282],{"class":268},[258,5429,2881],{"class":285},[258,5431,289],{"class":268},[258,5433,951],{"class":268},[258,5435,5436,5438,5440,5442,5444,5446,5448],{"class":260,"line":2988},[258,5437,4738],{"class":382},[258,5439,386],{"class":268},[258,5441,269],{"class":268},[258,5443,2596],{"class":382},[258,5445,386],{"class":268},[258,5447,4953],{"class":272},[258,5449,4535],{"class":268},[258,5451,5452,5454,5456],{"class":260,"line":3031},[258,5453,4759],{"class":268},[258,5455,398],{"class":382},[258,5457,292],{"class":268},[258,5459,5460],{"class":260,"line":3037},[258,5461,4768],{"class":268},[258,5463,5464,5466,5468,5470,5472,5474,5476,5478,5480,5482,5484,5486,5488,5490,5492,5494,5496,5498,5500,5503],{"class":260,"line":3054},[258,5465,5120],{"class":264},[258,5467,269],{"class":268},[258,5469,1821],{"class":272},[258,5471,352],{"class":268},[258,5473,4223],{"class":382},[258,5475,386],{"class":268},[258,5477,1940],{"class":268},[258,5479,4228],{"class":363},[258,5481,604],{"class":382},[258,5483,352],{"class":268},[258,5485,4233],{"class":382},[258,5487,386],{"class":268},[258,5489,282],{"class":268},[258,5491,2515],{"class":285},[258,5493,289],{"class":268},[258,5495,352],{"class":268},[258,5497,4242],{"class":382},[258,5499,386],{"class":268},[258,5501,5502],{"class":588}," 120",[258,5504,1860],{"class":268},[258,5506,5507,5509,5511],{"class":260,"line":3059},[258,5508,2289],{"class":268},[258,5510,398],{"class":272},[258,5512,951],{"class":268},[258,5514,5515,5517,5519,5521,5523,5525,5527,5529,5531,5533,5535,5537,5539,5541,5543],{"class":260,"line":3065},[258,5516,5137],{"class":382},[258,5518,386],{"class":268},[258,5520,4122],{"class":363},[258,5522,376],{"class":272},[258,5524,376],{"class":268},[258,5526,4948],{"class":1321},[258,5528,352],{"class":268},[258,5530,4953],{"class":1321},[258,5532,386],{"class":268},[258,5534,4181],{"class":370},[258,5536,4960],{"class":268},[258,5538,4181],{"class":370},[258,5540,1327],{"class":343},[258,5542,5164],{"class":272},[258,5544,951],{"class":268},[258,5546,5547,5549,5551,5553,5555,5557,5559,5561,5563,5565,5567,5569,5572,5574,5576,5578,5580,5582,5584,5586,5588,5590,5592,5594,5596,5599,5601,5603,5605,5607,5609,5611],{"class":260,"line":3071},[258,5548,5171],{"class":382},[258,5550,386],{"class":268},[258,5552,4122],{"class":363},[258,5554,376],{"class":272},[258,5556,376],{"class":268},[258,5558,4948],{"class":1321},[258,5560,352],{"class":268},[258,5562,2961],{"class":1321},[258,5564,386],{"class":268},[258,5566,5190],{"class":370},[258,5568,367],{"class":268},[258,5570,5571],{"class":370},"Order",[258,5573,352],{"class":268},[258,5575,282],{"class":268},[258,5577,1821],{"class":285},[258,5579,289],{"class":268},[258,5581,5206],{"class":268},[258,5583,4208],{"class":370},[258,5585,1327],{"class":343},[258,5587,1395],{"class":272},[258,5589,379],{"class":268},[258,5591,1821],{"class":382},[258,5593,386],{"class":268},[258,5595,282],{"class":268},[258,5597,5598],{"class":285},"ORDER-123",[258,5600,289],{"class":268},[258,5602,352],{"class":268},[258,5604,5229],{"class":268},[258,5606,2817],{"class":272},[258,5608,276],{"class":268},[258,5610,948],{"class":272},[258,5612,951],{"class":268},[258,5614,5615],{"class":260,"line":3076},[258,5616,956],{"class":268},[258,5618,5619,5622,5624],{"class":260,"line":3081},[258,5620,5621],{"class":382},"    utils",[258,5623,386],{"class":268},[258,5625,667],{"class":268},[258,5627,5628,5631,5633,5635,5637,5639,5641,5643,5646,5648,5650,5652,5655,5657,5659,5661,5663,5665,5668,5670,5673],{"class":260,"line":3087},[258,5629,5630],{"class":382},"        sum",[258,5632,386],{"class":268},[258,5634,4122],{"class":363},[258,5636,376],{"class":272},[258,5638,376],{"class":268},[258,5640,4948],{"class":1321},[258,5642,352],{"class":268},[258,5644,5645],{"class":1321}," a",[258,5647,386],{"class":268},[258,5649,4247],{"class":370},[258,5651,352],{"class":268},[258,5653,5654],{"class":1321}," b",[258,5656,386],{"class":268},[258,5658,4247],{"class":370},[258,5660,4960],{"class":268},[258,5662,4247],{"class":370},[258,5664,1327],{"class":343},[258,5666,5667],{"class":272}," a ",[258,5669,4888],{"class":268},[258,5671,5672],{"class":272}," b)",[258,5674,951],{"class":268},[258,5676,5677],{"class":260,"line":3134},[258,5678,956],{"class":268},[258,5680,5681,5684,5686,5688,5690,5692,5694,5696,5698,5700,5703,5705,5707,5710,5712,5715,5717,5720,5722,5725,5727,5729,5731,5733,5735,5737,5739,5742,5744,5746,5749,5751,5753,5755,5757],{"class":260,"line":3139},[258,5682,5683],{"class":382},"    log",[258,5685,386],{"class":268},[258,5687,4112],{"class":363},[258,5689,376],{"class":272},[258,5691,376],{"class":268},[258,5693,4948],{"class":1321},[258,5695,4960],{"class":268},[258,5697,1222],{"class":370},[258,5699,1327],{"class":343},[258,5701,5702],{"class":272}," Logger",[258,5704,447],{"class":268},[258,5706,634],{"class":363},[258,5708,5709],{"class":272},"(ctx",[258,5711,447],{"class":268},[258,5713,5714],{"class":272},"path",[258,5716,352],{"class":268},[258,5718,5719],{"class":272}," ctx",[258,5721,447],{"class":268},[258,5723,5724],{"class":272},"request",[258,5726,447],{"class":268},[258,5728,3113],{"class":272},[258,5730,352],{"class":268},[258,5732,5719],{"class":272},[258,5734,447],{"class":268},[258,5736,5724],{"class":272},[258,5738,447],{"class":268},[258,5740,5741],{"class":272},"body)",[258,5743,352],{"class":268},[258,5745,269],{"class":268},[258,5747,5748],{"class":382},"runOnError",[258,5750,386],{"class":268},[258,5752,1982],{"class":1981},[258,5754,276],{"class":268},[258,5756,398],{"class":272},[258,5758,951],{"class":268},[258,5760,5761,5763,5766,5769],{"class":260,"line":3145},[258,5762,276],{"class":268},[258,5764,5765],{"class":264}," satisfies",[258,5767,5768],{"class":370}," Routes",[258,5770,292],{"class":268},[258,5772,5773],{"class":260,"line":3204},[258,5774,299],{"emptyLinePlaceholder":298},[258,5776,5777],{"class":260,"line":3213},[258,5778,5779],{"class":305},"\u002F\u002F init & register routes (this automatically registers client routes)\n",[258,5781,5782,5784,5787,5789,5791,5793,5796],{"class":260,"line":3237},[258,5783,344],{"class":343},[258,5785,5786],{"class":272}," myApi ",[258,5788,1816],{"class":268},[258,5790,571],{"class":264},[258,5792,4117],{"class":363},[258,5794,5795],{"class":272},"(routes)",[258,5797,292],{"class":268},[258,5799,5800],{"class":260,"line":3242},[258,5801,299],{"emptyLinePlaceholder":298},[258,5803,5804],{"class":260,"line":3251},[258,5805,5806],{"class":305},"\u002F\u002F Export the type of the Api (used by the client)\n",[258,5808,5809,5811,5813,5816,5818,5821,5824],{"class":260,"line":3257},[258,5810,4165],{"class":264},[258,5812,314],{"class":343},[258,5814,5815],{"class":370}," MyApi",[258,5817,360],{"class":268},[258,5819,5820],{"class":268}," typeof",[258,5822,5823],{"class":272}," myApi",[258,5825,292],{"class":268},[5827,5828],"spacer",{},[201,5830,5832],{"id":5831},"type-reference","Type Reference",[406,5834,5835],{"id":2995},"Result",[237,5837,412,5838,5840,5841,5843],{},[219,5839,5835],{}," type is a 4-tuple used by ",[219,5842,435],{}," to return route and middleFn results without throwing.",[249,5845,5850],{"className":5846,"code":5848,"language":5849,"meta":254},[5847],"language-text","\u002F\u002F Error processing code-import:\n\u002F\u002F Start comment marker not found: \u002F\u002F type-result-start\n","text",[219,5851,5848],{"__ignoreMap":254},[406,5853,242],{"id":5854},"remoteapi",[237,5856,5857,5858,447],{},"This type could be considered your API schema to be used by the client. This is a Mapping of your public middleFns and routes to ",[219,5859,5860],{},"PublicMethod",[249,5862,5864],{"className":251,"code":5863,"language":253,"meta":254,"style":254},"\u002F** Same as Public Api but no type mapping, should be easier to use than PublicApi when non strong types are required. *\u002F\nexport type RemoteApi = {\n    [key: string]: PublicRoute | PublicMiddleFn | PublicHeadersFn | RemoteApi;\n};\n",[219,5865,5866,5871,5884,5919],{"__ignoreMap":254},[258,5867,5868],{"class":260,"line":261},[258,5869,5870],{"class":305},"\u002F** Same as Public Api but no type mapping, should be easier to use than PublicApi when non strong types are required. *\u002F\n",[258,5872,5873,5875,5877,5880,5882],{"class":260,"line":295},[258,5874,4165],{"class":264},[258,5876,314],{"class":343},[258,5878,5879],{"class":370}," RemoteApi",[258,5881,360],{"class":268},[258,5883,667],{"class":268},[258,5885,5886,5889,5892,5894,5896,5898,5900,5903,5905,5908,5910,5913,5915,5917],{"class":260,"line":302},[258,5887,5888],{"class":272},"    [",[258,5890,5891],{"class":1321},"key",[258,5893,386],{"class":268},[258,5895,4181],{"class":370},[258,5897,566],{"class":272},[258,5899,386],{"class":268},[258,5901,5902],{"class":370}," PublicRoute",[258,5904,4298],{"class":268},[258,5906,5907],{"class":370}," PublicMiddleFn",[258,5909,4298],{"class":268},[258,5911,5912],{"class":370}," PublicHeadersFn",[258,5914,4298],{"class":268},[258,5916,5879],{"class":370},[258,5918,292],{"class":268},[258,5920,5921],{"class":260,"line":309},[258,5922,1860],{"class":268},[406,5924,5926],{"id":5925},"subrequest","SubRequest",[249,5928,5931],{"className":5929,"code":5930,"language":5849,"meta":254},[5847],"\u002F\u002F Error processing code-import:\n\u002F\u002F Start comment marker not found: \u002F\u002F type-sub-request-start\n",[219,5932,5930],{"__ignoreMap":254},[406,5934,431],{"id":5935},"routesubrequest",[249,5937,5940],{"className":5938,"code":5939,"language":5849,"meta":254},[5847],"\u002F\u002F Error processing code-import:\n\u002F\u002F Start comment marker not found: \u002F\u002F type-route-sub-request-start\n",[219,5941,5939],{"__ignoreMap":254},[406,5943,1060],{"id":5944},"middlefnsubrequest",[249,5946,5949],{"className":5947,"code":5948,"language":5849,"meta":254},[5847],"\u002F\u002F Error processing code-import:\n\u002F\u002F Start comment marker not found: \u002F\u002F type-middleFn-sub-request-start\n",[219,5950,5948],{"__ignoreMap":254},[5952,5953,5954],"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 .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 .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 .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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}","Learn how to use the mion client for type-safe API calls.","md",null,{"toc":26},{"title":82,"description":5955},"EJk9CBdmjzq67KMVIrfwCGmi7w7BgxuUGklsScVJGFA",[5962,5964],{"title":72,"path":73,"stem":74,"description":5963,"children":-1},"How types are mapped to database columns when using mion Drizzle ORM package.",{"title":50,"path":86,"stem":87,"description":5965,"children":-1},"Learn how to handle errors in the mion client using the Result pattern.",1778674524008]