[{"data":1,"prerenderedAt":1255},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fcore-concepts\u002Frouting":176,"\u002Fdocs\u002Fcore-concepts\u002Frouting-surround":1250},[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":59,"body":178,"description":1245,"extension":1246,"meta":1247,"navigation":748,"path":60,"seo":1248,"status":11,"stem":61,"__hash__":1249},"docs\u002F1.docs\u002F2.core-concepts\u002F3.routing.md",{"type":179,"value":180,"toc":1230},"minimark",[181,190,195,198,237,242,245,255,258,342,356,360,367,487,490,571,580,583,587,593,684,690,694,704,765,769,772,840,844,851,1031,1105,1120,1124,1127,1131,1154,1158,1161,1167,1173,1177,1226],[182,183,184,185,189],"p",{},"MiiaJS uses a ",[186,187,188],"strong",{},"trie-based router"," with a static route fast path. Routes are defined via decorators on controllers, and the router compiles them into an optimized matching structure before handling the first request.",[191,192,194],"h2",{"id":193},"how-matching-works","How matching works",[182,196,197],{},"When a request arrives, the router resolves a handler in this order:",[199,200,201,217,231],"ol",{},[202,203,204,207,208,212,213,216],"li",{},[186,205,206],{},"Static lookup"," - O(1) Map check for routes without parameters (e.g. ",[209,210,211],"code",{},"\u002Fusers",", ",[209,214,215],{},"\u002Fhealth",")",[202,218,219,222,223,226,227,230],{},[186,220,221],{},"Trie traversal"," - walks the trie for routes with ",[209,224,225],{},":param"," or ",[209,228,229],{},"*"," wildcard segments",[202,232,233,236],{},[186,234,235],{},"HEAD fallback"," - if method is HEAD and no match, retries with GET automatically",[238,239,241],"h3",{"id":240},"priority","Priority",[182,243,244],{},"When multiple routes could match a URL, the router picks the most specific one:",[246,247,252],"pre",{"className":248,"code":250,"language":251},[249],"language-text","static segment  >  :param  >  * wildcard\n","text",[209,253,250],{"__ignoreMap":254},"",[182,256,257],{},"Given these routes:",[246,259,263],{"className":260,"code":261,"language":262,"meta":254,"style":254},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@Get('\u002Fusers\u002Fme')      \u002F\u002F static\n@Get('\u002Fusers\u002F:id')     \u002F\u002F param\n@Get('\u002Fusers\u002F*')       \u002F\u002F wildcard\n","typescript",[209,264,265,298,320],{"__ignoreMap":254},[266,267,270,274,278,282,285,289,291,294],"span",{"class":268,"line":269},"line",1,[266,271,273],{"class":272},"sMK4o","@",[266,275,277],{"class":276},"s2Zo4","Get",[266,279,281],{"class":280},"sTEyZ","(",[266,283,284],{"class":272},"'",[266,286,288],{"class":287},"sfazB","\u002Fusers\u002Fme",[266,290,284],{"class":272},[266,292,293],{"class":280},")      ",[266,295,297],{"class":296},"sHwdD","\u002F\u002F static\n",[266,299,301,303,305,307,309,312,314,317],{"class":268,"line":300},2,[266,302,273],{"class":272},[266,304,277],{"class":276},[266,306,281],{"class":280},[266,308,284],{"class":272},[266,310,311],{"class":287},"\u002Fusers\u002F:id",[266,313,284],{"class":272},[266,315,316],{"class":280},")     ",[266,318,319],{"class":296},"\u002F\u002F param\n",[266,321,323,325,327,329,331,334,336,339],{"class":268,"line":322},3,[266,324,273],{"class":272},[266,326,277],{"class":276},[266,328,281],{"class":280},[266,330,284],{"class":272},[266,332,333],{"class":287},"\u002Fusers\u002F*",[266,335,284],{"class":272},[266,337,338],{"class":280},")       ",[266,340,341],{"class":296},"\u002F\u002F wildcard\n",[182,343,344,345,347,348,351,352,355],{},"A request to ",[209,346,288],{}," matches the static route. ",[209,349,350],{},"\u002Fusers\u002F42"," matches the param route. ",[209,353,354],{},"\u002Fusers\u002F42\u002Fposts\u002F1"," matches the wildcard.",[191,357,359],{"id":358},"path-parameters","Path parameters",[182,361,362,363,366],{},"Dynamic segments prefixed with ",[209,364,365],{},":"," capture a single path segment:",[246,368,370],{"className":260,"code":369,"language":262,"meta":254,"style":254},"@Controller('\u002Fusers')\nclass UserController {\n  @Get('\u002F:id')\n  findOne(ctx: RequestContext) {\n    return { id: ctx.params.id }\n  }\n}\n",[209,371,372,390,403,421,443,475,481],{"__ignoreMap":254},[266,373,374,376,379,381,383,385,387],{"class":268,"line":269},[266,375,273],{"class":272},[266,377,378],{"class":276},"Controller",[266,380,281],{"class":280},[266,382,284],{"class":272},[266,384,211],{"class":287},[266,386,284],{"class":272},[266,388,389],{"class":280},")\n",[266,391,392,396,400],{"class":268,"line":300},[266,393,395],{"class":394},"spNyl","class",[266,397,399],{"class":398},"sBMFI"," UserController",[266,401,402],{"class":272}," {\n",[266,404,405,408,410,412,414,417,419],{"class":268,"line":322},[266,406,407],{"class":272},"  @",[266,409,277],{"class":276},[266,411,281],{"class":280},[266,413,284],{"class":272},[266,415,416],{"class":287},"\u002F:id",[266,418,284],{"class":272},[266,420,389],{"class":280},[266,422,424,428,430,434,436,439,441],{"class":268,"line":423},4,[266,425,427],{"class":426},"swJcz","  findOne",[266,429,281],{"class":272},[266,431,433],{"class":432},"sHdIc","ctx",[266,435,365],{"class":272},[266,437,438],{"class":398}," RequestContext",[266,440,216],{"class":272},[266,442,402],{"class":272},[266,444,446,450,453,456,458,461,464,467,469,472],{"class":268,"line":445},5,[266,447,449],{"class":448},"s7zQu","    return",[266,451,452],{"class":272}," {",[266,454,455],{"class":426}," id",[266,457,365],{"class":272},[266,459,460],{"class":280}," ctx",[266,462,463],{"class":272},".",[266,465,466],{"class":280},"params",[266,468,463],{"class":272},[266,470,471],{"class":280},"id",[266,473,474],{"class":272}," }\n",[266,476,478],{"class":268,"line":477},6,[266,479,480],{"class":272},"  }\n",[266,482,484],{"class":268,"line":483},7,[266,485,486],{"class":272},"}\n",[182,488,489],{},"Multiple parameters work across nested segments:",[246,491,493],{"className":260,"code":492,"language":262,"meta":254,"style":254},"@Get('\u002F:userId\u002Fposts\u002F:postId')\ngetPost(ctx: RequestContext) {\n  const { userId, postId } = ctx.params\n  return { userId, postId }\n}\n",[209,494,495,512,523,552,567],{"__ignoreMap":254},[266,496,497,499,501,503,505,508,510],{"class":268,"line":269},[266,498,273],{"class":272},[266,500,277],{"class":276},[266,502,281],{"class":280},[266,504,284],{"class":272},[266,506,507],{"class":287},"\u002F:userId\u002Fposts\u002F:postId",[266,509,284],{"class":272},[266,511,389],{"class":280},[266,513,514,517,520],{"class":268,"line":300},[266,515,516],{"class":276},"getPost",[266,518,519],{"class":280},"(ctx: RequestContext) ",[266,521,522],{"class":272},"{\n",[266,524,525,528,530,533,536,539,542,545,547,549],{"class":268,"line":322},[266,526,527],{"class":394},"  const",[266,529,452],{"class":272},[266,531,532],{"class":280}," userId",[266,534,535],{"class":272},",",[266,537,538],{"class":280}," postId",[266,540,541],{"class":272}," }",[266,543,544],{"class":272}," =",[266,546,460],{"class":280},[266,548,463],{"class":272},[266,550,551],{"class":280},"params\n",[266,553,554,557,559,561,563,565],{"class":268,"line":423},[266,555,556],{"class":448},"  return",[266,558,452],{"class":272},[266,560,532],{"class":280},[266,562,535],{"class":272},[266,564,538],{"class":280},[266,566,474],{"class":272},[266,568,569],{"class":268,"line":445},[266,570,486],{"class":272},[182,572,573,576,577],{},[209,574,575],{},"GET \u002Fusers\u002F42\u002Fposts\u002F7"," → ",[209,578,579],{},"{ userId: '42', postId: '7' }",[182,581,582],{},"Parameters are always strings. Parse them in your handler if you need numbers.",[191,584,586],{"id":585},"wildcards","Wildcards",[182,588,589,590,592],{},"A ",[209,591,229],{}," segment captures the entire remaining path:",[246,594,596],{"className":260,"code":595,"language":262,"meta":254,"style":254},"app.addRoute('GET', '\u002Ffiles\u002F*', (ctx) => {\n  \u002F\u002F GET \u002Ffiles\u002Fimages\u002Flogo.png → ctx.params['*'] = 'images\u002Flogo.png'\n  return { path: ctx.params['*'] }\n})\n",[209,597,598,641,646,677],{"__ignoreMap":254},[266,599,600,603,605,608,610,612,615,617,619,622,625,627,629,632,634,636,639],{"class":268,"line":269},[266,601,602],{"class":280},"app",[266,604,463],{"class":272},[266,606,607],{"class":276},"addRoute",[266,609,281],{"class":280},[266,611,284],{"class":272},[266,613,614],{"class":287},"GET",[266,616,284],{"class":272},[266,618,535],{"class":272},[266,620,621],{"class":272}," '",[266,623,624],{"class":287},"\u002Ffiles\u002F*",[266,626,284],{"class":272},[266,628,535],{"class":272},[266,630,631],{"class":272}," (",[266,633,433],{"class":432},[266,635,216],{"class":272},[266,637,638],{"class":394}," =>",[266,640,402],{"class":272},[266,642,643],{"class":268,"line":300},[266,644,645],{"class":296},"  \u002F\u002F GET \u002Ffiles\u002Fimages\u002Flogo.png → ctx.params['*'] = 'images\u002Flogo.png'\n",[266,647,648,650,652,655,657,659,661,663,666,668,670,672,675],{"class":268,"line":322},[266,649,556],{"class":448},[266,651,452],{"class":272},[266,653,654],{"class":426}," path",[266,656,365],{"class":272},[266,658,460],{"class":280},[266,660,463],{"class":272},[266,662,466],{"class":280},[266,664,665],{"class":426},"[",[266,667,284],{"class":272},[266,669,229],{"class":287},[266,671,284],{"class":272},[266,673,674],{"class":426},"] ",[266,676,486],{"class":272},[266,678,679,682],{"class":268,"line":423},[266,680,681],{"class":272},"}",[266,683,389],{"class":280},[182,685,686,687,463],{},"Wildcards are useful for catch-all routes, static file serving, and SPA fallbacks. The captured value is available as ",[209,688,689],{},"ctx.params['*']",[191,691,693],{"id":692},"trailing-slashes","Trailing slashes",[182,695,696,697,699,700,703],{},"MiiaJS normalizes trailing slashes - ",[209,698,211],{}," and ",[209,701,702],{},"\u002Fusers\u002F"," match the same route. You don't need to register both.",[246,705,707],{"className":260,"code":706,"language":262,"meta":254,"style":254},"@Get('\u002Fusers')\nlist() { return [] }\n\n\u002F\u002F All of these match:\n\u002F\u002F GET \u002Fusers\n\u002F\u002F GET \u002Fusers\u002F\n",[209,708,709,725,744,750,755,760],{"__ignoreMap":254},[266,710,711,713,715,717,719,721,723],{"class":268,"line":269},[266,712,273],{"class":272},[266,714,277],{"class":276},[266,716,281],{"class":280},[266,718,284],{"class":272},[266,720,211],{"class":287},[266,722,284],{"class":272},[266,724,389],{"class":280},[266,726,727,730,733,736,739,742],{"class":268,"line":300},[266,728,729],{"class":276},"list",[266,731,732],{"class":280},"() ",[266,734,735],{"class":272},"{",[266,737,738],{"class":448}," return",[266,740,741],{"class":426}," [] ",[266,743,486],{"class":272},[266,745,746],{"class":268,"line":322},[266,747,749],{"emptyLinePlaceholder":748},true,"\n",[266,751,752],{"class":268,"line":423},[266,753,754],{"class":296},"\u002F\u002F All of these match:\n",[266,756,757],{"class":268,"line":445},[266,758,759],{"class":296},"\u002F\u002F GET \u002Fusers\n",[266,761,762],{"class":268,"line":477},[266,763,764],{"class":296},"\u002F\u002F GET \u002Fusers\u002F\n",[191,766,768],{"id":767},"head-requests","HEAD requests",[182,770,771],{},"HEAD requests automatically fall back to the matching GET route if no explicit HEAD route is defined. The framework returns headers only, without a body - matching HTTP spec behavior.",[246,773,775],{"className":260,"code":774,"language":262,"meta":254,"style":254},"@Get('\u002Fhealth')\ncheck() {\n  return { status: 'ok' }\n}\n\n\u002F\u002F GET  \u002Fhealth → 200 { \"status\": \"ok\" }\n\u002F\u002F HEAD \u002Fhealth → 200 (headers only, no body)\n",[209,776,777,793,802,822,826,830,835],{"__ignoreMap":254},[266,778,779,781,783,785,787,789,791],{"class":268,"line":269},[266,780,273],{"class":272},[266,782,277],{"class":276},[266,784,281],{"class":280},[266,786,284],{"class":272},[266,788,215],{"class":287},[266,790,284],{"class":272},[266,792,389],{"class":280},[266,794,795,798,800],{"class":268,"line":300},[266,796,797],{"class":276},"check",[266,799,732],{"class":280},[266,801,522],{"class":272},[266,803,804,806,808,811,813,815,818,820],{"class":268,"line":322},[266,805,556],{"class":448},[266,807,452],{"class":272},[266,809,810],{"class":426}," status",[266,812,365],{"class":272},[266,814,621],{"class":272},[266,816,817],{"class":287},"ok",[266,819,284],{"class":272},[266,821,474],{"class":272},[266,823,824],{"class":268,"line":423},[266,825,486],{"class":272},[266,827,828],{"class":268,"line":445},[266,829,749],{"emptyLinePlaceholder":748},[266,831,832],{"class":268,"line":477},[266,833,834],{"class":296},"\u002F\u002F GET  \u002Fhealth → 200 { \"status\": \"ok\" }\n",[266,836,837],{"class":268,"line":483},[266,838,839],{"class":296},"\u002F\u002F HEAD \u002Fhealth → 200 (headers only, no body)\n",[191,841,843],{"id":842},"manual-routes","Manual routes",[182,845,846,847,850],{},"Use ",[209,848,849],{},"app.addRoute()"," to register routes without decorators:",[246,852,854],{"className":260,"code":853,"language":262,"meta":254,"style":254},"const app = new Miia()\n  .addRoute('GET', '\u002Fhealth', () => ({ ok: true }))\n  .addRoute('GET', '\u002Fusers\u002F:id', (ctx) => {\n    return { id: ctx.params.id }\n  })\n  .addRoute('POST', '\u002Fupload', uploadHandler, [authMiddleware])\n  .register(AppModule)\n",[209,855,856,876,924,958,980,987,1021],{"__ignoreMap":254},[266,857,858,861,864,867,870,873],{"class":268,"line":269},[266,859,860],{"class":394},"const",[266,862,863],{"class":280}," app ",[266,865,866],{"class":272},"=",[266,868,869],{"class":272}," new",[266,871,872],{"class":276}," Miia",[266,874,875],{"class":280},"()\n",[266,877,878,881,883,885,887,889,891,893,895,897,899,901,904,906,908,910,913,915,919,921],{"class":268,"line":300},[266,879,880],{"class":272},"  .",[266,882,607],{"class":276},[266,884,281],{"class":280},[266,886,284],{"class":272},[266,888,614],{"class":287},[266,890,284],{"class":272},[266,892,535],{"class":272},[266,894,621],{"class":272},[266,896,215],{"class":287},[266,898,284],{"class":272},[266,900,535],{"class":272},[266,902,903],{"class":272}," ()",[266,905,638],{"class":394},[266,907,631],{"class":280},[266,909,735],{"class":272},[266,911,912],{"class":426}," ok",[266,914,365],{"class":272},[266,916,918],{"class":917},"sfNiH"," true",[266,920,541],{"class":272},[266,922,923],{"class":280},"))\n",[266,925,926,928,930,932,934,936,938,940,942,944,946,948,950,952,954,956],{"class":268,"line":322},[266,927,880],{"class":272},[266,929,607],{"class":276},[266,931,281],{"class":280},[266,933,284],{"class":272},[266,935,614],{"class":287},[266,937,284],{"class":272},[266,939,535],{"class":272},[266,941,621],{"class":272},[266,943,311],{"class":287},[266,945,284],{"class":272},[266,947,535],{"class":272},[266,949,631],{"class":272},[266,951,433],{"class":432},[266,953,216],{"class":272},[266,955,638],{"class":394},[266,957,402],{"class":272},[266,959,960,962,964,966,968,970,972,974,976,978],{"class":268,"line":423},[266,961,449],{"class":448},[266,963,452],{"class":272},[266,965,455],{"class":426},[266,967,365],{"class":272},[266,969,460],{"class":280},[266,971,463],{"class":272},[266,973,466],{"class":280},[266,975,463],{"class":272},[266,977,471],{"class":280},[266,979,474],{"class":272},[266,981,982,985],{"class":268,"line":445},[266,983,984],{"class":272},"  }",[266,986,389],{"class":280},[266,988,989,991,993,995,997,1000,1002,1004,1006,1009,1011,1013,1016,1018],{"class":268,"line":477},[266,990,880],{"class":272},[266,992,607],{"class":276},[266,994,281],{"class":280},[266,996,284],{"class":272},[266,998,999],{"class":287},"POST",[266,1001,284],{"class":272},[266,1003,535],{"class":272},[266,1005,621],{"class":272},[266,1007,1008],{"class":287},"\u002Fupload",[266,1010,284],{"class":272},[266,1012,535],{"class":272},[266,1014,1015],{"class":280}," uploadHandler",[266,1017,535],{"class":272},[266,1019,1020],{"class":280}," [authMiddleware])\n",[266,1022,1023,1025,1028],{"class":268,"line":483},[266,1024,880],{"class":272},[266,1026,1027],{"class":276},"register",[266,1029,1030],{"class":280},"(AppModule)\n",[246,1032,1034],{"className":260,"code":1033,"language":262,"meta":254,"style":254},"app.addRoute(\n  method: HttpMethod,\n  path: string,\n  handler: (ctx: RequestContext) => any,\n  middlewares?: Middleware[],\n): this\n",[209,1035,1036,1047,1055,1062,1084,1097],{"__ignoreMap":254},[266,1037,1038,1040,1042,1044],{"class":268,"line":269},[266,1039,602],{"class":280},[266,1041,463],{"class":272},[266,1043,607],{"class":276},[266,1045,1046],{"class":280},"(\n",[266,1048,1049,1052],{"class":268,"line":300},[266,1050,1051],{"class":280},"  method: HttpMethod",[266,1053,1054],{"class":272},",\n",[266,1056,1057,1060],{"class":268,"line":322},[266,1058,1059],{"class":280},"  path: string",[266,1061,1054],{"class":272},[266,1063,1064,1067,1069,1071,1073,1075,1077,1079,1082],{"class":268,"line":423},[266,1065,1066],{"class":280},"  handler: ",[266,1068,281],{"class":272},[266,1070,433],{"class":432},[266,1072,365],{"class":272},[266,1074,438],{"class":398},[266,1076,216],{"class":272},[266,1078,638],{"class":394},[266,1080,1081],{"class":280}," any",[266,1083,1054],{"class":272},[266,1085,1086,1089,1092,1095],{"class":268,"line":445},[266,1087,1088],{"class":280},"  middlewares",[266,1090,1091],{"class":272},"?:",[266,1093,1094],{"class":280}," Middleware[]",[266,1096,1054],{"class":272},[266,1098,1099,1102],{"class":268,"line":477},[266,1100,1101],{"class":280},"): ",[266,1103,1104],{"class":272},"this\n",[182,1106,1107,1108,1111,1112,1115,1116,1119],{},"Manual routes participate in the pipeline like any other: global middleware from ",[209,1109,1110],{},"app.use()"," wraps them, global guards apply to them, and the ",[209,1113,1114],{},"middlewares"," array passed to ",[209,1117,1118],{},"addRoute()"," is run as route-bound middleware inside the global onion.",[191,1121,1123],{"id":1122},"route-compilation","Route compilation",[182,1125,1126],{},"Before handling the first request, MiiaJS compiles all routes into optimized pipelines:",[238,1128,1130],{"id":1129},"global-pipeline","Global pipeline",[182,1132,1133,1134,1136,1137,1140,1141,1144,1145,1148,1149,463],{},"Global middleware registered via ",[209,1135,1110],{}," is composed ",[186,1138,1139],{},"once"," into a single ",[209,1142,1143],{},"compiledGlobalPipeline"," that wraps the entire dispatch, including ",[209,1146,1147],{},"router.match()",". This is how global middleware runs on 404 responses and sees errors thrown by the router - see ",[1150,1151,1153],"a",{"href":1152},"\u002Fdocs\u002Fcore-concepts\u002Fmiddleware#global-middleware","Middleware → Global middleware",[238,1155,1157],{"id":1156},"per-route-pipeline","Per-route pipeline",[182,1159,1160],{},"Each decorator route is compiled into its own pipeline in this order:",[246,1162,1165],{"className":1163,"code":1164,"language":251},[249],"Global guards (app.useGuard(), unless @SkipGuard filters them)\n  → Controller @UseGuard() guards\n  → Controller @Use() middlewares\n  → Method @UseGuard() guards\n  → Method @Use() middlewares\n  → Validation decorators\n  → Route handler\n",[209,1166,1164],{"__ignoreMap":254},[182,1168,1169,1170,463],{},"The per-route pipeline is nested inside the global pipeline at dispatch time: ",[209,1171,1172],{},"globalMiddleware → router.match → perRouteMiddleware → handler",[238,1174,1176],{"id":1175},"performance","Performance",[1178,1179,1180,1190,1200,1210,1220],"ul",{},[202,1181,1182,1185,1186,1189],{},[186,1183,1184],{},"Static routes"," are stored in a ",[209,1187,1188],{},"Map"," for O(1) exact matching - no trie traversal needed",[202,1191,1192,1195,1196,1199],{},[186,1193,1194],{},"URL parsing"," uses ",[209,1197,1198],{},"indexOf()"," instead of regex for fast pathname\u002Fquery extraction",[202,1201,1202,1205,1206,1209],{},[186,1203,1204],{},"Query params"," are parsed lazily - only when ",[209,1207,1208],{},"ctx.query"," is accessed",[202,1211,1212,1215,1216,1219],{},[186,1213,1214],{},"Sync fast path"," - routes without middleware skip ",[209,1217,1218],{},"async\u002Fawait"," entirely, returning JSON inline with zero Promise allocation",[202,1221,1222,1225],{},[186,1223,1224],{},"Pipeline compilation"," happens once at startup, not per-request",[1227,1228,1229],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .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 .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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":254,"searchDepth":300,"depth":300,"links":1231},[1232,1235,1236,1237,1238,1239,1240],{"id":193,"depth":300,"text":194,"children":1233},[1234],{"id":240,"depth":322,"text":241},{"id":358,"depth":300,"text":359},{"id":585,"depth":300,"text":586},{"id":692,"depth":300,"text":693},{"id":767,"depth":300,"text":768},{"id":842,"depth":300,"text":843},{"id":1122,"depth":300,"text":1123,"children":1241},[1242,1243,1244],{"id":1129,"depth":322,"text":1130},{"id":1156,"depth":322,"text":1157},{"id":1175,"depth":322,"text":1176},"How MiiaJS matches URLs to handlers - static routes, dynamic parameters, wildcards, and route compilation.","md",{},{"title":59,"description":1245},"AoCJiyATrELzQyzxIvaXQoqkPRtqjDZBeuqxfp2TVA8",[1251,1253],{"title":55,"path":56,"stem":57,"description":1252,"children":-1},"Handle incoming HTTP requests and define your API routes.",{"title":63,"path":64,"stem":65,"description":1254,"children":-1},"Injectable services, repositories, and the dependency injection system.",1778575270760]