[{"data":1,"prerenderedAt":2004},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fcore-concepts\u002Fcontrollers":176,"\u002Fdocs\u002Fcore-concepts\u002Fcontrollers-surround":1999},[4,21,86,158],{"title":5,"path":6,"stem":7,"children":8,"status":11,"icon":20},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,16],{"title":10,"path":6,"stem":7,"status":11},"Introduction",null,{"title":13,"path":14,"stem":15,"status":11},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F2.installation",{"title":17,"path":18,"stem":19,"status":11},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","1.docs\u002F1.getting-started\u002F3.quick-start",false,{"title":22,"path":23,"stem":24,"children":25,"status":11,"icon":20},"Core Concepts","\u002Fdocs\u002Fcore-concepts","1.docs\u002F2.core-concepts\u002F1.index",[26,28,32,36,46,50,54,58,62,66,70,74,78,82],{"title":27,"path":23,"stem":24,"status":11},"Overview",{"title":29,"path":30,"stem":31,"status":11},"Response","\u002Fdocs\u002Fcore-concepts\u002Fresponse","1.docs\u002F2.core-concepts\u002F10.response",{"title":33,"path":34,"stem":35,"status":11},"Testing","\u002Fdocs\u002Fcore-concepts\u002Ftesting","1.docs\u002F2.core-concepts\u002F12.testing",{"title":37,"path":38,"stem":39,"children":40,"status":11,"icon":20,"defaultOpen":20},"Decorators","\u002Fdocs\u002Fcore-concepts\u002Fdecorators","1.docs\u002F2.core-concepts\u002F13.decorators\u002F1.index",[41,42],{"title":27,"path":38,"stem":39,"status":11},{"title":43,"path":44,"stem":45,"status":11},"Custom","\u002Fdocs\u002Fcore-concepts\u002Fdecorators\u002Fcustom","1.docs\u002F2.core-concepts\u002F13.decorators\u002F2.custom",{"title":47,"path":48,"stem":49,"status":11},"Discovery Service","\u002Fdocs\u002Fcore-concepts\u002Fdiscovery","1.docs\u002F2.core-concepts\u002F14.discovery",{"title":51,"path":52,"stem":53,"status":11},"Application Lifecycle","\u002Fdocs\u002Fcore-concepts\u002Fapp-lifecycle","1.docs\u002F2.core-concepts\u002F15.app-lifecycle",{"title":55,"path":56,"stem":57,"status":11},"Controllers","\u002Fdocs\u002Fcore-concepts\u002Fcontrollers","1.docs\u002F2.core-concepts\u002F2.controllers",{"title":59,"path":60,"stem":61,"status":11},"Routing","\u002Fdocs\u002Fcore-concepts\u002Frouting","1.docs\u002F2.core-concepts\u002F3.routing",{"title":63,"path":64,"stem":65,"status":11},"Providers","\u002Fdocs\u002Fcore-concepts\u002Fproviders","1.docs\u002F2.core-concepts\u002F4.providers",{"title":67,"path":68,"stem":69,"status":11},"Modules","\u002Fdocs\u002Fcore-concepts\u002Fmodules","1.docs\u002F2.core-concepts\u002F5.modules",{"title":71,"path":72,"stem":73,"status":11},"Configuration","\u002Fdocs\u002Fcore-concepts\u002Fconfiguration","1.docs\u002F2.core-concepts\u002F6.configuration",{"title":75,"path":76,"stem":77,"status":11},"Middleware","\u002Fdocs\u002Fcore-concepts\u002Fmiddleware","1.docs\u002F2.core-concepts\u002F7.middleware",{"title":79,"path":80,"stem":81,"status":11},"Guards","\u002Fdocs\u002Fcore-concepts\u002Fguards","1.docs\u002F2.core-concepts\u002F8.guards",{"title":83,"path":84,"stem":85,"status":11},"Exceptions","\u002Fdocs\u002Fcore-concepts\u002Fexceptions","1.docs\u002F2.core-concepts\u002F9.exceptions",{"title":87,"path":88,"stem":89,"children":90,"status":11,"icon":20},"Packages","\u002Fdocs\u002Fpackages","1.docs\u002F3.packages\u002F1.index",[91,92,97,108,112,130,134,138,142,146,150,154],{"title":27,"path":88,"stem":89,"status":11},{"title":93,"path":94,"stem":95,"status":96},"CLI","\u002Fdocs\u002Fpackages\u002Fcli","1.docs\u002F3.packages\u002F10.cli","experimental",{"title":98,"path":99,"stem":100,"children":101,"status":11,"icon":20,"defaultOpen":20},"Events","\u002Fdocs\u002Fpackages\u002Fmessaging","1.docs\u002F3.packages\u002F11.messaging\u002F1.index",[102,104],{"title":27,"path":99,"stem":100,"status":103},"beta",{"title":105,"path":106,"stem":107,"status":96},"Redis","\u002Fdocs\u002Fpackages\u002Fmessaging\u002Fredis","1.docs\u002F3.packages\u002F11.messaging\u002F2.redis",{"title":109,"path":110,"stem":111,"status":103},"Serve Static","\u002Fdocs\u002Fpackages\u002Fserve-static","1.docs\u002F3.packages\u002F12.serve-static",{"title":113,"path":114,"stem":115,"children":116,"status":11,"icon":20,"defaultOpen":20},"Auth","\u002Fdocs\u002Fpackages\u002Fauth","1.docs\u002F3.packages\u002F2.auth\u002F1.index",[117,118,122,126],{"title":27,"path":114,"stem":115,"status":103},{"title":119,"path":120,"stem":121,"status":103},"JWT Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Fjwt","1.docs\u002F3.packages\u002F2.auth\u002F2.jwt",{"title":123,"path":124,"stem":125,"status":103},"Local Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Flocal","1.docs\u002F3.packages\u002F2.auth\u002F3.local",{"title":127,"path":128,"stem":129,"status":96},"OAuth2 Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Foauth2","1.docs\u002F3.packages\u002F2.auth\u002F4.oauth2",{"title":131,"path":132,"stem":133,"status":103},"JWT","\u002Fdocs\u002Fpackages\u002Fjwt","1.docs\u002F3.packages\u002F3.jwt",{"title":135,"path":136,"stem":137,"status":103},"Drizzle","\u002Fdocs\u002Fpackages\u002Fdrizzle","1.docs\u002F3.packages\u002F4.drizzle",{"title":139,"path":140,"stem":141,"status":103},"Papr","\u002Fdocs\u002Fpackages\u002Fpapr","1.docs\u002F3.packages\u002F5.papr",{"title":143,"path":144,"stem":145,"status":103},"Mongoose","\u002Fdocs\u002Fpackages\u002Fmongoose","1.docs\u002F3.packages\u002F6.mongoose",{"title":147,"path":148,"stem":149,"status":103},"Swagger","\u002Fdocs\u002Fpackages\u002Fswagger","1.docs\u002F3.packages\u002F7.swagger",{"title":151,"path":152,"stem":153,"status":103},"Node Server","\u002Fdocs\u002Fpackages\u002Fnode-server","1.docs\u002F3.packages\u002F8.node-server",{"title":155,"path":156,"stem":157,"status":103},"uWS Server","\u002Fdocs\u002Fpackages\u002Fuws-server","1.docs\u002F3.packages\u002F9.uws-server",{"title":159,"path":160,"stem":161,"children":162,"status":11,"icon":20},"Roadmap","\u002Fdocs\u002Froadmap","1.docs\u002F4.roadmap\u002F1.index",[163,164,168,172],{"title":27,"path":160,"stem":161,"status":11},{"title":165,"path":166,"stem":167,"status":11},"Short term (0-3 months)","\u002Fdocs\u002Froadmap\u002Fshort-term","1.docs\u002F4.roadmap\u002F2.short-term",{"title":169,"path":170,"stem":171,"status":11},"Mid term (3-9 months)","\u002Fdocs\u002Froadmap\u002Fmid-term","1.docs\u002F4.roadmap\u002F3.mid-term",{"title":173,"path":174,"stem":175,"status":11},"Long term (9-12+ months)","\u002Fdocs\u002Froadmap\u002Flong-term","1.docs\u002F4.roadmap\u002F4.long-term",{"id":177,"title":55,"body":178,"description":1994,"extension":1995,"meta":1996,"navigation":264,"path":56,"seo":1997,"status":11,"stem":57,"__hash__":1998},"docs\u002F1.docs\u002F2.core-concepts\u002F2.controllers.md",{"type":179,"value":180,"toc":1981},"minimark",[181,185,190,198,533,541,545,548,638,649,653,659,816,831,851,855,861,939,943,946,951,957,1022,1026,1032,1129,1133,1139,1245,1249,1256,1360,1366,1370,1383,1895,1909,1916,1977],[182,183,184],"p",{},"Controllers are responsible for handling incoming HTTP requests and returning responses. A controller groups related routes under a common path prefix.",[186,187,189],"h2",{"id":188},"defining-a-controller","Defining a controller",[182,191,192,193,197],{},"Use the ",[194,195,196],"code",{},"@Controller()"," decorator to define a controller and its path prefix:",[199,200,205],"pre",{"className":201,"code":202,"language":203,"meta":204,"style":204},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Controller, Get, Post, type RequestContext } from '@miiajs\u002Fcore'\n\n@Controller('\u002Fusers')\nclass UserController {\n  @Get('\u002F')\n  list() {\n    return [{ id: 1, name: 'Alice' }]\n  }\n\n  @Get('\u002F:id')\n  findOne(ctx: RequestContext) {\n    return { id: ctx.params.id }\n  }\n\n  @Post('\u002F')\n  async create(ctx: RequestContext) {\n    return await ctx.json()\n  }\n}\n","typescript","",[194,206,207,259,266,290,304,324,336,377,383,388,406,427,455,460,465,483,504,522,527],{"__ignoreMap":204},[208,209,212,216,220,224,227,230,232,235,237,240,243,246,249,252,256],"span",{"class":210,"line":211},"line",1,[208,213,215],{"class":214},"s7zQu","import",[208,217,219],{"class":218},"sMK4o"," {",[208,221,223],{"class":222},"sTEyZ"," Controller",[208,225,226],{"class":218},",",[208,228,229],{"class":222}," Get",[208,231,226],{"class":218},[208,233,234],{"class":222}," Post",[208,236,226],{"class":218},[208,238,239],{"class":214}," type",[208,241,242],{"class":222}," RequestContext",[208,244,245],{"class":218}," }",[208,247,248],{"class":214}," from",[208,250,251],{"class":218}," '",[208,253,255],{"class":254},"sfazB","@miiajs\u002Fcore",[208,257,258],{"class":218},"'\n",[208,260,262],{"class":210,"line":261},2,[208,263,265],{"emptyLinePlaceholder":264},true,"\n",[208,267,269,272,276,279,282,285,287],{"class":210,"line":268},3,[208,270,271],{"class":218},"@",[208,273,275],{"class":274},"s2Zo4","Controller",[208,277,278],{"class":222},"(",[208,280,281],{"class":218},"'",[208,283,284],{"class":254},"\u002Fusers",[208,286,281],{"class":218},[208,288,289],{"class":222},")\n",[208,291,293,297,301],{"class":210,"line":292},4,[208,294,296],{"class":295},"spNyl","class",[208,298,300],{"class":299},"sBMFI"," UserController",[208,302,303],{"class":218}," {\n",[208,305,307,310,313,315,317,320,322],{"class":210,"line":306},5,[208,308,309],{"class":218},"  @",[208,311,312],{"class":274},"Get",[208,314,278],{"class":222},[208,316,281],{"class":218},[208,318,319],{"class":254},"\u002F",[208,321,281],{"class":218},[208,323,289],{"class":222},[208,325,327,331,334],{"class":210,"line":326},6,[208,328,330],{"class":329},"swJcz","  list",[208,332,333],{"class":218},"()",[208,335,303],{"class":218},[208,337,339,342,345,348,351,354,358,360,363,365,367,370,372,374],{"class":210,"line":338},7,[208,340,341],{"class":214},"    return",[208,343,344],{"class":329}," [",[208,346,347],{"class":218},"{",[208,349,350],{"class":329}," id",[208,352,353],{"class":218},":",[208,355,357],{"class":356},"sbssI"," 1",[208,359,226],{"class":218},[208,361,362],{"class":329}," name",[208,364,353],{"class":218},[208,366,251],{"class":218},[208,368,369],{"class":254},"Alice",[208,371,281],{"class":218},[208,373,245],{"class":218},[208,375,376],{"class":329},"]\n",[208,378,380],{"class":210,"line":379},8,[208,381,382],{"class":218},"  }\n",[208,384,386],{"class":210,"line":385},9,[208,387,265],{"emptyLinePlaceholder":264},[208,389,391,393,395,397,399,402,404],{"class":210,"line":390},10,[208,392,309],{"class":218},[208,394,312],{"class":274},[208,396,278],{"class":222},[208,398,281],{"class":218},[208,400,401],{"class":254},"\u002F:id",[208,403,281],{"class":218},[208,405,289],{"class":222},[208,407,409,412,414,418,420,422,425],{"class":210,"line":408},11,[208,410,411],{"class":329},"  findOne",[208,413,278],{"class":218},[208,415,417],{"class":416},"sHdIc","ctx",[208,419,353],{"class":218},[208,421,242],{"class":299},[208,423,424],{"class":218},")",[208,426,303],{"class":218},[208,428,430,432,434,436,438,441,444,447,449,452],{"class":210,"line":429},12,[208,431,341],{"class":214},[208,433,219],{"class":218},[208,435,350],{"class":329},[208,437,353],{"class":218},[208,439,440],{"class":222}," ctx",[208,442,443],{"class":218},".",[208,445,446],{"class":222},"params",[208,448,443],{"class":218},[208,450,451],{"class":222},"id",[208,453,454],{"class":218}," }\n",[208,456,458],{"class":210,"line":457},13,[208,459,382],{"class":218},[208,461,463],{"class":210,"line":462},14,[208,464,265],{"emptyLinePlaceholder":264},[208,466,468,470,473,475,477,479,481],{"class":210,"line":467},15,[208,469,309],{"class":218},[208,471,472],{"class":274},"Post",[208,474,278],{"class":222},[208,476,281],{"class":218},[208,478,319],{"class":254},[208,480,281],{"class":218},[208,482,289],{"class":222},[208,484,486,489,492,494,496,498,500,502],{"class":210,"line":485},16,[208,487,488],{"class":295},"  async",[208,490,491],{"class":329}," create",[208,493,278],{"class":218},[208,495,417],{"class":416},[208,497,353],{"class":218},[208,499,242],{"class":299},[208,501,424],{"class":218},[208,503,303],{"class":218},[208,505,507,509,512,514,516,519],{"class":210,"line":506},17,[208,508,341],{"class":214},[208,510,511],{"class":214}," await",[208,513,440],{"class":222},[208,515,443],{"class":218},[208,517,518],{"class":274},"json",[208,520,521],{"class":329},"()\n",[208,523,525],{"class":210,"line":524},18,[208,526,382],{"class":218},[208,528,530],{"class":210,"line":529},19,[208,531,532],{"class":218},"}\n",[182,534,535,536,540],{},"Controllers must be registered in a ",[537,538,539],"a",{"href":68},"Module"," to be discovered by the framework.",[186,542,544],{"id":543},"route-decorators","Route decorators",[182,546,547],{},"MiiaJS provides decorators for all standard HTTP methods:",[549,550,551,564],"table",{},[552,553,554],"thead",{},[555,556,557,561],"tr",{},[558,559,560],"th",{},"Decorator",[558,562,563],{},"HTTP Method",[565,566,567,578,588,598,608,618,628],"tbody",{},[555,568,569,575],{},[570,571,572],"td",{},[194,573,574],{},"@Get(path?)",[570,576,577],{},"GET",[555,579,580,585],{},[570,581,582],{},[194,583,584],{},"@Post(path?)",[570,586,587],{},"POST",[555,589,590,595],{},[570,591,592],{},[194,593,594],{},"@Put(path?)",[570,596,597],{},"PUT",[555,599,600,605],{},[570,601,602],{},[194,603,604],{},"@Patch(path?)",[570,606,607],{},"PATCH",[555,609,610,615],{},[570,611,612],{},[194,613,614],{},"@Delete(path?)",[570,616,617],{},"DELETE",[555,619,620,625],{},[570,621,622],{},[194,623,624],{},"@Head(path?)",[570,626,627],{},"HEAD",[555,629,630,635],{},[570,631,632],{},[194,633,634],{},"@Options(path?)",[570,636,637],{},"OPTIONS",[182,639,640,641,644,645,648],{},"The ",[194,642,643],{},"path"," argument is optional and defaults to ",[194,646,647],{},"''"," (the controller prefix itself).",[186,650,652],{"id":651},"requestcontext","RequestContext",[182,654,655,656,658],{},"Every route handler receives a ",[194,657,652],{}," object as its first argument:",[199,660,662],{"className":201,"code":661,"language":203,"meta":204,"style":204},"interface RequestContext {\n  req: Request               \u002F\u002F Native Fetch API Request\n  res: ResponseBuilder       \u002F\u002F Fluent response builder\n  params: Record\u003Cstring, string>  \u002F\u002F URL path parameters\n  query: Record\u003Cstring, string>   \u002F\u002F Parsed query string\n  rawQuery: URLSearchParams       \u002F\u002F Raw query for multi-value params\n  json\u003CT = any>(): Promise\u003CT>     \u002F\u002F Parsed JSON body (cached)\n  text(): Promise\u003Cstring>         \u002F\u002F Raw body as text (cached)\n}\n",[194,663,664,673,687,700,727,749,762,793,812],{"__ignoreMap":204},[208,665,666,669,671],{"class":210,"line":211},[208,667,668],{"class":295},"interface",[208,670,242],{"class":299},[208,672,303],{"class":218},[208,674,675,678,680,683],{"class":210,"line":261},[208,676,677],{"class":329},"  req",[208,679,353],{"class":218},[208,681,682],{"class":299}," Request",[208,684,686],{"class":685},"sHwdD","               \u002F\u002F Native Fetch API Request\n",[208,688,689,692,694,697],{"class":210,"line":268},[208,690,691],{"class":329},"  res",[208,693,353],{"class":218},[208,695,696],{"class":299}," ResponseBuilder",[208,698,699],{"class":685},"       \u002F\u002F Fluent response builder\n",[208,701,702,705,707,710,713,716,718,721,724],{"class":210,"line":292},[208,703,704],{"class":329},"  params",[208,706,353],{"class":218},[208,708,709],{"class":299}," Record",[208,711,712],{"class":218},"\u003C",[208,714,715],{"class":299},"string",[208,717,226],{"class":218},[208,719,720],{"class":299}," string",[208,722,723],{"class":218},">",[208,725,726],{"class":685},"  \u002F\u002F URL path parameters\n",[208,728,729,732,734,736,738,740,742,744,746],{"class":210,"line":306},[208,730,731],{"class":329},"  query",[208,733,353],{"class":218},[208,735,709],{"class":299},[208,737,712],{"class":218},[208,739,715],{"class":299},[208,741,226],{"class":218},[208,743,720],{"class":299},[208,745,723],{"class":218},[208,747,748],{"class":685},"   \u002F\u002F Parsed query string\n",[208,750,751,754,756,759],{"class":210,"line":326},[208,752,753],{"class":329},"  rawQuery",[208,755,353],{"class":218},[208,757,758],{"class":299}," URLSearchParams",[208,760,761],{"class":685},"       \u002F\u002F Raw query for multi-value params\n",[208,763,764,767,769,772,775,778,781,784,786,788,790],{"class":210,"line":338},[208,765,766],{"class":329},"  json",[208,768,712],{"class":218},[208,770,771],{"class":299},"T",[208,773,774],{"class":218}," =",[208,776,777],{"class":299}," any",[208,779,780],{"class":218},">():",[208,782,783],{"class":299}," Promise",[208,785,712],{"class":218},[208,787,771],{"class":299},[208,789,723],{"class":218},[208,791,792],{"class":685},"     \u002F\u002F Parsed JSON body (cached)\n",[208,794,795,798,801,803,805,807,809],{"class":210,"line":379},[208,796,797],{"class":329},"  text",[208,799,800],{"class":218},"():",[208,802,783],{"class":299},[208,804,712],{"class":218},[208,806,715],{"class":299},[208,808,723],{"class":218},[208,810,811],{"class":685},"         \u002F\u002F Raw body as text (cached)\n",[208,813,814],{"class":210,"line":385},[208,815,532],{"class":218},[182,817,818,821,822,825,826,830],{},[194,819,820],{},"query"," and ",[194,823,824],{},"rawQuery"," are ",[827,828,829],"strong",{},"lazy-loaded"," on first access for better performance.",[182,832,833,835,836,842,843,846,847,850],{},[194,834,652],{}," is extensible via ",[537,837,841],{"href":838,"rel":839},"https:\u002F\u002Fwww.typescriptlang.org\u002Fdocs\u002Fhandbook\u002Fdeclaration-merging.html",[840],"nofollow","declaration merging",". For example, ",[194,844,845],{},"@miiajs\u002Fauth"," adds the ",[194,848,849],{},"user"," property automatically when installed.",[186,852,854],{"id":853},"route-parameters","Route parameters",[182,856,857,858,353],{},"Dynamic segments in the path are extracted as ",[194,859,860],{},"ctx.params",[199,862,864],{"className":201,"code":863,"language":203,"meta":204,"style":204},"@Get('\u002F:userId\u002Fposts\u002F:postId')\ngetPost(ctx: RequestContext) {\n  const { userId, postId } = ctx.params\n  return { userId, postId }\n}\n",[194,865,866,883,894,920,935],{"__ignoreMap":204},[208,867,868,870,872,874,876,879,881],{"class":210,"line":211},[208,869,271],{"class":218},[208,871,312],{"class":274},[208,873,278],{"class":222},[208,875,281],{"class":218},[208,877,878],{"class":254},"\u002F:userId\u002Fposts\u002F:postId",[208,880,281],{"class":218},[208,882,289],{"class":222},[208,884,885,888,891],{"class":210,"line":261},[208,886,887],{"class":274},"getPost",[208,889,890],{"class":222},"(ctx: RequestContext) ",[208,892,893],{"class":218},"{\n",[208,895,896,899,901,904,906,909,911,913,915,917],{"class":210,"line":268},[208,897,898],{"class":295},"  const",[208,900,219],{"class":218},[208,902,903],{"class":222}," userId",[208,905,226],{"class":218},[208,907,908],{"class":222}," postId",[208,910,245],{"class":218},[208,912,774],{"class":218},[208,914,440],{"class":222},[208,916,443],{"class":218},[208,918,919],{"class":222},"params\n",[208,921,922,925,927,929,931,933],{"class":210,"line":292},[208,923,924],{"class":214},"  return",[208,926,219],{"class":218},[208,928,903],{"class":222},[208,930,226],{"class":218},[208,932,908],{"class":222},[208,934,454],{"class":218},[208,936,937],{"class":210,"line":306},[208,938,532],{"class":218},[186,940,942],{"id":941},"response-handling","Response handling",[182,944,945],{},"Route handlers can return values in several ways:",[947,948,950],"h3",{"id":949},"auto-json","Auto JSON",[182,952,953,954,353],{},"Return any object or array and it will be serialized as JSON with status ",[194,955,956],{},"200",[199,958,960],{"className":201,"code":959,"language":203,"meta":204,"style":204},"@Get('\u002F')\nlist() {\n  return [{ id: 1 }, { id: 2 }]\n}\n",[194,961,962,978,988,1018],{"__ignoreMap":204},[208,963,964,966,968,970,972,974,976],{"class":210,"line":211},[208,965,271],{"class":218},[208,967,312],{"class":274},[208,969,278],{"class":222},[208,971,281],{"class":218},[208,973,319],{"class":254},[208,975,281],{"class":218},[208,977,289],{"class":222},[208,979,980,983,986],{"class":210,"line":261},[208,981,982],{"class":274},"list",[208,984,985],{"class":222},"() ",[208,987,893],{"class":218},[208,989,990,992,994,996,998,1000,1002,1005,1007,1009,1011,1014,1016],{"class":210,"line":268},[208,991,924],{"class":214},[208,993,344],{"class":329},[208,995,347],{"class":218},[208,997,350],{"class":329},[208,999,353],{"class":218},[208,1001,357],{"class":356},[208,1003,1004],{"class":218}," },",[208,1006,219],{"class":218},[208,1008,350],{"class":329},[208,1010,353],{"class":218},[208,1012,1013],{"class":356}," 2",[208,1015,245],{"class":218},[208,1017,376],{"class":329},[208,1019,1020],{"class":210,"line":292},[208,1021,532],{"class":218},[947,1023,1025],{"id":1024},"custom-status","Custom status",[182,1027,192,1028,1031],{},[194,1029,1030],{},"@Status()"," decorator to set a different status code:",[199,1033,1035],{"className":201,"code":1034,"language":203,"meta":204,"style":204},"import { Status } from '@miiajs\u002Fcore'\n\n@Post('\u002F')\n@Status(201)\ncreate(ctx: RequestContext) {\n  return { id: 3, created: true }\n}\n",[194,1036,1037,1056,1060,1076,1090,1099,1125],{"__ignoreMap":204},[208,1038,1039,1041,1043,1046,1048,1050,1052,1054],{"class":210,"line":211},[208,1040,215],{"class":214},[208,1042,219],{"class":218},[208,1044,1045],{"class":222}," Status",[208,1047,245],{"class":218},[208,1049,248],{"class":214},[208,1051,251],{"class":218},[208,1053,255],{"class":254},[208,1055,258],{"class":218},[208,1057,1058],{"class":210,"line":261},[208,1059,265],{"emptyLinePlaceholder":264},[208,1061,1062,1064,1066,1068,1070,1072,1074],{"class":210,"line":268},[208,1063,271],{"class":218},[208,1065,472],{"class":274},[208,1067,278],{"class":222},[208,1069,281],{"class":218},[208,1071,319],{"class":254},[208,1073,281],{"class":218},[208,1075,289],{"class":222},[208,1077,1078,1080,1083,1085,1088],{"class":210,"line":292},[208,1079,271],{"class":218},[208,1081,1082],{"class":274},"Status",[208,1084,278],{"class":222},[208,1086,1087],{"class":356},"201",[208,1089,289],{"class":222},[208,1091,1092,1095,1097],{"class":210,"line":306},[208,1093,1094],{"class":274},"create",[208,1096,890],{"class":222},[208,1098,893],{"class":218},[208,1100,1101,1103,1105,1107,1109,1112,1114,1117,1119,1123],{"class":210,"line":326},[208,1102,924],{"class":214},[208,1104,219],{"class":218},[208,1106,350],{"class":329},[208,1108,353],{"class":218},[208,1110,1111],{"class":356}," 3",[208,1113,226],{"class":218},[208,1115,1116],{"class":329}," created",[208,1118,353],{"class":218},[208,1120,1122],{"class":1121},"sfNiH"," true",[208,1124,454],{"class":218},[208,1126,1127],{"class":210,"line":338},[208,1128,532],{"class":218},[947,1130,1132],{"id":1131},"native-response","Native Response",[182,1134,1135,1136,1138],{},"Return a ",[194,1137,29],{}," object for full control:",[199,1140,1142],{"className":201,"code":1141,"language":203,"meta":204,"style":204},"@Get('\u002Fdownload')\ndownload() {\n  return new Response('raw body', {\n    status: 200,\n    headers: { 'Content-Type': 'text\u002Fplain' },\n  })\n}\n",[194,1143,1144,1161,1170,1193,1206,1234,1241],{"__ignoreMap":204},[208,1145,1146,1148,1150,1152,1154,1157,1159],{"class":210,"line":211},[208,1147,271],{"class":218},[208,1149,312],{"class":274},[208,1151,278],{"class":222},[208,1153,281],{"class":218},[208,1155,1156],{"class":254},"\u002Fdownload",[208,1158,281],{"class":218},[208,1160,289],{"class":222},[208,1162,1163,1166,1168],{"class":210,"line":261},[208,1164,1165],{"class":274},"download",[208,1167,985],{"class":222},[208,1169,893],{"class":218},[208,1171,1172,1174,1177,1180,1182,1184,1187,1189,1191],{"class":210,"line":268},[208,1173,924],{"class":214},[208,1175,1176],{"class":218}," new",[208,1178,1179],{"class":274}," Response",[208,1181,278],{"class":329},[208,1183,281],{"class":218},[208,1185,1186],{"class":254},"raw body",[208,1188,281],{"class":218},[208,1190,226],{"class":218},[208,1192,303],{"class":218},[208,1194,1195,1198,1200,1203],{"class":210,"line":292},[208,1196,1197],{"class":329},"    status",[208,1199,353],{"class":218},[208,1201,1202],{"class":356}," 200",[208,1204,1205],{"class":218},",\n",[208,1207,1208,1211,1213,1215,1217,1220,1222,1224,1226,1229,1231],{"class":210,"line":306},[208,1209,1210],{"class":329},"    headers",[208,1212,353],{"class":218},[208,1214,219],{"class":218},[208,1216,251],{"class":218},[208,1218,1219],{"class":329},"Content-Type",[208,1221,281],{"class":218},[208,1223,353],{"class":218},[208,1225,251],{"class":218},[208,1227,1228],{"class":254},"text\u002Fplain",[208,1230,281],{"class":218},[208,1232,1233],{"class":218}," },\n",[208,1235,1236,1239],{"class":210,"line":326},[208,1237,1238],{"class":218},"  }",[208,1240,289],{"class":329},[208,1242,1243],{"class":210,"line":338},[208,1244,532],{"class":218},[947,1246,1248],{"id":1247},"response-builder","Response builder",[182,1250,1251,1252,1255],{},"Use ",[194,1253,1254],{},"ctx.res"," for a fluent API:",[199,1257,1259],{"className":201,"code":1258,"language":203,"meta":204,"style":204},"@Get('\u002Fhtml')\npage(ctx: RequestContext) {\n  ctx.res\n    .status(200)\n    .header('X-Request-Id', 'abc')\n    .html('\u003Ch1>Hello\u003C\u002Fh1>')\n}\n",[194,1260,1261,1278,1287,1297,1311,1338,1356],{"__ignoreMap":204},[208,1262,1263,1265,1267,1269,1271,1274,1276],{"class":210,"line":211},[208,1264,271],{"class":218},[208,1266,312],{"class":274},[208,1268,278],{"class":222},[208,1270,281],{"class":218},[208,1272,1273],{"class":254},"\u002Fhtml",[208,1275,281],{"class":218},[208,1277,289],{"class":222},[208,1279,1280,1283,1285],{"class":210,"line":261},[208,1281,1282],{"class":274},"page",[208,1284,890],{"class":222},[208,1286,893],{"class":218},[208,1288,1289,1292,1294],{"class":210,"line":268},[208,1290,1291],{"class":222},"  ctx",[208,1293,443],{"class":218},[208,1295,1296],{"class":222},"res\n",[208,1298,1299,1302,1305,1307,1309],{"class":210,"line":292},[208,1300,1301],{"class":218},"    .",[208,1303,1304],{"class":274},"status",[208,1306,278],{"class":329},[208,1308,956],{"class":356},[208,1310,289],{"class":329},[208,1312,1313,1315,1318,1320,1322,1325,1327,1329,1331,1334,1336],{"class":210,"line":306},[208,1314,1301],{"class":218},[208,1316,1317],{"class":274},"header",[208,1319,278],{"class":329},[208,1321,281],{"class":218},[208,1323,1324],{"class":254},"X-Request-Id",[208,1326,281],{"class":218},[208,1328,226],{"class":218},[208,1330,251],{"class":218},[208,1332,1333],{"class":254},"abc",[208,1335,281],{"class":218},[208,1337,289],{"class":329},[208,1339,1340,1342,1345,1347,1349,1352,1354],{"class":210,"line":326},[208,1341,1301],{"class":218},[208,1343,1344],{"class":274},"html",[208,1346,278],{"class":329},[208,1348,281],{"class":218},[208,1350,1351],{"class":254},"\u003Ch1>Hello\u003C\u002Fh1>",[208,1353,281],{"class":218},[208,1355,289],{"class":329},[208,1357,1358],{"class":210,"line":338},[208,1359,532],{"class":218},[182,1361,1362,1363,1365],{},"See ",[537,1364,29],{"href":30}," for more details.",[186,1367,1369],{"id":1368},"validation","Validation",[182,1371,1372,1373,1378,1379,1382],{},"MiiaJS provides built-in validation decorators that work with any ZodLike schema (",[537,1374,1377],{"href":1375,"rel":1376},"https:\u002F\u002Fzod.dev",[840],"Zod",", or any object with ",[194,1380,1381],{},"safeParse()","):",[199,1384,1386],{"className":201,"code":1385,"language":203,"meta":204,"style":204},"import { ValidateBody, ValidateQuery, ValidateParams } from '@miiajs\u002Fcore'\nimport { z } from 'zod'\n\nconst CreateUserSchema = z.object({\n  name: z.string().min(1),\n  email: z.string().email(),\n})\n\nconst QuerySchema = z.object({\n  page: z.string().transform(Number).default('1'),\n  limit: z.string().transform(Number).default('10'),\n})\n\ntype CreateUserInput = z.infer\u003Ctypeof CreateUserSchema>\n\n@Controller('\u002Fusers')\nclass UserController {\n  @Post('\u002F')\n  @Status(201)\n  @ValidateBody(CreateUserSchema)\n  async create(ctx: RequestContext) {\n    \u002F\u002F After @ValidateBody runs, ctx.json\u003CT>() returns the validated (and possibly transformed) data.\n    const data = await ctx.json\u003CCreateUserInput>()\n    return data\n  }\n\n  @Get('\u002F')\n  @ValidateQuery(QuerySchema)\n  list(ctx: RequestContext) {\n    return { page: ctx.query.page, limit: ctx.query.limit }\n  }\n}\n",[194,1387,1388,1417,1437,1441,1463,1492,1516,1523,1527,1546,1586,1624,1630,1634,1660,1664,1680,1688,1704,1716,1727,1746,1752,1780,1788,1793,1798,1815,1826,1843,1885,1890],{"__ignoreMap":204},[208,1389,1390,1392,1394,1397,1399,1402,1404,1407,1409,1411,1413,1415],{"class":210,"line":211},[208,1391,215],{"class":214},[208,1393,219],{"class":218},[208,1395,1396],{"class":222}," ValidateBody",[208,1398,226],{"class":218},[208,1400,1401],{"class":222}," ValidateQuery",[208,1403,226],{"class":218},[208,1405,1406],{"class":222}," ValidateParams",[208,1408,245],{"class":218},[208,1410,248],{"class":214},[208,1412,251],{"class":218},[208,1414,255],{"class":254},[208,1416,258],{"class":218},[208,1418,1419,1421,1423,1426,1428,1430,1432,1435],{"class":210,"line":261},[208,1420,215],{"class":214},[208,1422,219],{"class":218},[208,1424,1425],{"class":222}," z",[208,1427,245],{"class":218},[208,1429,248],{"class":214},[208,1431,251],{"class":218},[208,1433,1434],{"class":254},"zod",[208,1436,258],{"class":218},[208,1438,1439],{"class":210,"line":268},[208,1440,265],{"emptyLinePlaceholder":264},[208,1442,1443,1446,1449,1452,1454,1456,1459,1461],{"class":210,"line":292},[208,1444,1445],{"class":295},"const",[208,1447,1448],{"class":222}," CreateUserSchema ",[208,1450,1451],{"class":218},"=",[208,1453,1425],{"class":222},[208,1455,443],{"class":218},[208,1457,1458],{"class":274},"object",[208,1460,278],{"class":222},[208,1462,893],{"class":218},[208,1464,1465,1468,1470,1472,1474,1476,1478,1480,1483,1485,1488,1490],{"class":210,"line":306},[208,1466,1467],{"class":329},"  name",[208,1469,353],{"class":218},[208,1471,1425],{"class":222},[208,1473,443],{"class":218},[208,1475,715],{"class":274},[208,1477,333],{"class":222},[208,1479,443],{"class":218},[208,1481,1482],{"class":274},"min",[208,1484,278],{"class":222},[208,1486,1487],{"class":356},"1",[208,1489,424],{"class":222},[208,1491,1205],{"class":218},[208,1493,1494,1497,1499,1501,1503,1505,1507,1509,1512,1514],{"class":210,"line":326},[208,1495,1496],{"class":329},"  email",[208,1498,353],{"class":218},[208,1500,1425],{"class":222},[208,1502,443],{"class":218},[208,1504,715],{"class":274},[208,1506,333],{"class":222},[208,1508,443],{"class":218},[208,1510,1511],{"class":274},"email",[208,1513,333],{"class":222},[208,1515,1205],{"class":218},[208,1517,1518,1521],{"class":210,"line":338},[208,1519,1520],{"class":218},"}",[208,1522,289],{"class":222},[208,1524,1525],{"class":210,"line":379},[208,1526,265],{"emptyLinePlaceholder":264},[208,1528,1529,1531,1534,1536,1538,1540,1542,1544],{"class":210,"line":385},[208,1530,1445],{"class":295},[208,1532,1533],{"class":222}," QuerySchema ",[208,1535,1451],{"class":218},[208,1537,1425],{"class":222},[208,1539,443],{"class":218},[208,1541,1458],{"class":274},[208,1543,278],{"class":222},[208,1545,893],{"class":218},[208,1547,1548,1551,1553,1555,1557,1559,1561,1563,1566,1569,1571,1574,1576,1578,1580,1582,1584],{"class":210,"line":390},[208,1549,1550],{"class":329},"  page",[208,1552,353],{"class":218},[208,1554,1425],{"class":222},[208,1556,443],{"class":218},[208,1558,715],{"class":274},[208,1560,333],{"class":222},[208,1562,443],{"class":218},[208,1564,1565],{"class":274},"transform",[208,1567,1568],{"class":222},"(Number)",[208,1570,443],{"class":218},[208,1572,1573],{"class":274},"default",[208,1575,278],{"class":222},[208,1577,281],{"class":218},[208,1579,1487],{"class":254},[208,1581,281],{"class":218},[208,1583,424],{"class":222},[208,1585,1205],{"class":218},[208,1587,1588,1591,1593,1595,1597,1599,1601,1603,1605,1607,1609,1611,1613,1615,1618,1620,1622],{"class":210,"line":408},[208,1589,1590],{"class":329},"  limit",[208,1592,353],{"class":218},[208,1594,1425],{"class":222},[208,1596,443],{"class":218},[208,1598,715],{"class":274},[208,1600,333],{"class":222},[208,1602,443],{"class":218},[208,1604,1565],{"class":274},[208,1606,1568],{"class":222},[208,1608,443],{"class":218},[208,1610,1573],{"class":274},[208,1612,278],{"class":222},[208,1614,281],{"class":218},[208,1616,1617],{"class":254},"10",[208,1619,281],{"class":218},[208,1621,424],{"class":222},[208,1623,1205],{"class":218},[208,1625,1626,1628],{"class":210,"line":429},[208,1627,1520],{"class":218},[208,1629,289],{"class":222},[208,1631,1632],{"class":210,"line":457},[208,1633,265],{"emptyLinePlaceholder":264},[208,1635,1636,1639,1642,1644,1646,1648,1651,1654,1657],{"class":210,"line":462},[208,1637,1638],{"class":295},"type",[208,1640,1641],{"class":299}," CreateUserInput",[208,1643,774],{"class":218},[208,1645,1425],{"class":299},[208,1647,443],{"class":218},[208,1649,1650],{"class":299},"infer",[208,1652,1653],{"class":218},"\u003Ctypeof",[208,1655,1656],{"class":222}," CreateUserSchema",[208,1658,1659],{"class":218},">\n",[208,1661,1662],{"class":210,"line":467},[208,1663,265],{"emptyLinePlaceholder":264},[208,1665,1666,1668,1670,1672,1674,1676,1678],{"class":210,"line":485},[208,1667,271],{"class":222},[208,1669,275],{"class":299},[208,1671,278],{"class":222},[208,1673,281],{"class":218},[208,1675,284],{"class":254},[208,1677,281],{"class":218},[208,1679,289],{"class":222},[208,1681,1682,1684,1686],{"class":210,"line":506},[208,1683,296],{"class":295},[208,1685,300],{"class":299},[208,1687,303],{"class":218},[208,1689,1690,1692,1694,1696,1698,1700,1702],{"class":210,"line":524},[208,1691,309],{"class":218},[208,1693,472],{"class":274},[208,1695,278],{"class":222},[208,1697,281],{"class":218},[208,1699,319],{"class":254},[208,1701,281],{"class":218},[208,1703,289],{"class":222},[208,1705,1706,1708,1710,1712,1714],{"class":210,"line":529},[208,1707,309],{"class":218},[208,1709,1082],{"class":274},[208,1711,278],{"class":222},[208,1713,1087],{"class":356},[208,1715,289],{"class":222},[208,1717,1719,1721,1724],{"class":210,"line":1718},20,[208,1720,309],{"class":218},[208,1722,1723],{"class":274},"ValidateBody",[208,1725,1726],{"class":222},"(CreateUserSchema)\n",[208,1728,1730,1732,1734,1736,1738,1740,1742,1744],{"class":210,"line":1729},21,[208,1731,488],{"class":295},[208,1733,491],{"class":329},[208,1735,278],{"class":218},[208,1737,417],{"class":416},[208,1739,353],{"class":218},[208,1741,242],{"class":299},[208,1743,424],{"class":218},[208,1745,303],{"class":218},[208,1747,1749],{"class":210,"line":1748},22,[208,1750,1751],{"class":685},"    \u002F\u002F After @ValidateBody runs, ctx.json\u003CT>() returns the validated (and possibly transformed) data.\n",[208,1753,1755,1758,1761,1763,1765,1767,1769,1771,1773,1776,1778],{"class":210,"line":1754},23,[208,1756,1757],{"class":295},"    const",[208,1759,1760],{"class":222}," data",[208,1762,774],{"class":218},[208,1764,511],{"class":214},[208,1766,440],{"class":222},[208,1768,443],{"class":218},[208,1770,518],{"class":274},[208,1772,712],{"class":218},[208,1774,1775],{"class":299},"CreateUserInput",[208,1777,723],{"class":218},[208,1779,521],{"class":329},[208,1781,1783,1785],{"class":210,"line":1782},24,[208,1784,341],{"class":214},[208,1786,1787],{"class":222}," data\n",[208,1789,1791],{"class":210,"line":1790},25,[208,1792,382],{"class":218},[208,1794,1796],{"class":210,"line":1795},26,[208,1797,265],{"emptyLinePlaceholder":264},[208,1799,1801,1803,1805,1807,1809,1811,1813],{"class":210,"line":1800},27,[208,1802,309],{"class":218},[208,1804,312],{"class":274},[208,1806,278],{"class":222},[208,1808,281],{"class":218},[208,1810,319],{"class":254},[208,1812,281],{"class":218},[208,1814,289],{"class":222},[208,1816,1818,1820,1823],{"class":210,"line":1817},28,[208,1819,309],{"class":218},[208,1821,1822],{"class":274},"ValidateQuery",[208,1824,1825],{"class":222},"(QuerySchema)\n",[208,1827,1829,1831,1833,1835,1837,1839,1841],{"class":210,"line":1828},29,[208,1830,330],{"class":329},[208,1832,278],{"class":218},[208,1834,417],{"class":416},[208,1836,353],{"class":218},[208,1838,242],{"class":299},[208,1840,424],{"class":218},[208,1842,303],{"class":218},[208,1844,1846,1848,1850,1853,1855,1857,1859,1861,1863,1865,1867,1870,1872,1874,1876,1878,1880,1883],{"class":210,"line":1845},30,[208,1847,341],{"class":214},[208,1849,219],{"class":218},[208,1851,1852],{"class":329}," page",[208,1854,353],{"class":218},[208,1856,440],{"class":222},[208,1858,443],{"class":218},[208,1860,820],{"class":222},[208,1862,443],{"class":218},[208,1864,1282],{"class":222},[208,1866,226],{"class":218},[208,1868,1869],{"class":329}," limit",[208,1871,353],{"class":218},[208,1873,440],{"class":222},[208,1875,443],{"class":218},[208,1877,820],{"class":222},[208,1879,443],{"class":218},[208,1881,1882],{"class":222},"limit",[208,1884,454],{"class":218},[208,1886,1888],{"class":210,"line":1887},31,[208,1889,382],{"class":218},[208,1891,1893],{"class":210,"line":1892},32,[208,1894,532],{"class":218},[182,1896,1897,1898,1901,1902,1905,1906,443],{},"Handler methods that read the request body must be ",[194,1899,1900],{},"async",", since ",[194,1903,1904],{},"ctx.json()"," returns a ",[194,1907,1908],{},"Promise",[182,1910,1911,1912,1915],{},"Validation decorators throw ",[194,1913,1914],{},"UnprocessableException"," (422) with detailed error messages on failure.",[549,1917,1918,1930],{},[552,1919,1920],{},[555,1921,1922,1924,1927],{},[558,1923,560],{},[558,1925,1926],{},"Validates",[558,1928,1929],{},"Source",[565,1931,1932,1948,1963],{},[555,1933,1934,1939,1942],{},[570,1935,1936],{},[194,1937,1938],{},"@ValidateBody(schema)",[570,1940,1941],{},"Request body",[570,1943,1944,1947],{},[194,1945,1946],{},"await ctx.json\u003CT>()"," (validated after decorator runs)",[555,1949,1950,1955,1958],{},[570,1951,1952],{},[194,1953,1954],{},"@ValidateQuery(schema)",[570,1956,1957],{},"Query parameters",[570,1959,1960],{},[194,1961,1962],{},"ctx.query",[555,1964,1965,1970,1973],{},[570,1966,1967],{},[194,1968,1969],{},"@ValidateParams(schema)",[570,1971,1972],{},"Path parameters",[570,1974,1975],{},[194,1976,860],{},[1978,1979,1980],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":204,"searchDepth":261,"depth":261,"links":1982},[1983,1984,1985,1986,1987,1993],{"id":188,"depth":261,"text":189},{"id":543,"depth":261,"text":544},{"id":651,"depth":261,"text":652},{"id":853,"depth":261,"text":854},{"id":941,"depth":261,"text":942,"children":1988},[1989,1990,1991,1992],{"id":949,"depth":268,"text":950},{"id":1024,"depth":268,"text":1025},{"id":1131,"depth":268,"text":1132},{"id":1247,"depth":268,"text":1248},{"id":1368,"depth":261,"text":1369},"Handle incoming HTTP requests and define your API routes.","md",{},{"title":55,"description":1994},"PmG8atK1xNksiztFku-qRC5DchfD1Dbky7l017QCp7o",[2000,2002],{"title":51,"path":52,"stem":53,"description":2001,"children":-1},"Init, active, and shutdown phases of a Miia app - graceful destroy on SIGTERM\u002FSIGINT\u002FSIGHUP by default.",{"title":59,"path":60,"stem":61,"description":2003,"children":-1},"How MiiaJS matches URLs to handlers - static routes, dynamic parameters, wildcards, and route compilation.",1778575270760]