[{"data":1,"prerenderedAt":2007},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fcore-concepts\u002Fmiddleware":176,"\u002Fdocs\u002Fcore-concepts\u002Fmiddleware-surround":2002},[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":75,"body":178,"description":1997,"extension":1998,"meta":1999,"navigation":520,"path":76,"seo":2000,"status":11,"stem":77,"__hash__":2001},"docs\u002F1.docs\u002F2.core-concepts\u002F7.middleware.md",{"type":179,"value":180,"toc":1982},"minimark",[181,195,200,291,298,302,310,318,470,474,480,574,577,603,806,815,838,843,860,993,1003,1007,1014,1100,1104,1107,1209,1213,1219,1223,1226,1409,1414,1525,1529,1902,1905,1911,1978],[182,183,184,185,189,190,194],"p",{},"MiiaJS uses a ",[186,187,188],"strong",{},"Koa-style onion model"," for middleware. A single ",[191,192,193],"code",{},"compose()"," function replaces the need for separate interceptors, pipes, and filters.",[196,197,199],"h2",{"id":198},"middleware-signature","Middleware signature",[201,202,207],"pre",{"className":203,"code":204,"language":205,"meta":206,"style":206},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","type Middleware = (\n  ctx: RequestContext,\n  next: () => Promise\u003Cvoid>,\n) => Promise\u003Cvoid>\n","typescript","",[191,208,209,230,246,273],{"__ignoreMap":206},[210,211,214,218,222,226],"span",{"class":212,"line":213},"line",1,[210,215,217],{"class":216},"spNyl","type",[210,219,221],{"class":220},"sBMFI"," Middleware",[210,223,225],{"class":224},"sMK4o"," =",[210,227,229],{"class":228},"sTEyZ"," (\n",[210,231,233,237,240,243],{"class":212,"line":232},2,[210,234,236],{"class":235},"sHdIc","  ctx",[210,238,239],{"class":224},":",[210,241,242],{"class":220}," RequestContext",[210,244,245],{"class":224},",\n",[210,247,249,253,255,258,261,264,267,270],{"class":212,"line":248},3,[210,250,252],{"class":251},"s2Zo4","  next",[210,254,239],{"class":224},[210,256,257],{"class":224}," ()",[210,259,260],{"class":216}," =>",[210,262,263],{"class":220}," Promise",[210,265,266],{"class":224},"\u003C",[210,268,269],{"class":220},"void",[210,271,272],{"class":224},">,\n",[210,274,276,279,282,284,286,288],{"class":212,"line":275},4,[210,277,278],{"class":228},") ",[210,280,281],{"class":216},"=>",[210,283,263],{"class":220},[210,285,266],{"class":224},[210,287,269],{"class":220},[210,289,290],{"class":224},">\n",[182,292,293,294,297],{},"Every middleware must call ",[191,295,296],{},"await next()"," to pass control to the next middleware, or skip it to short-circuit the pipeline.",[196,299,301],{"id":300},"onion-model","Onion model",[182,303,304,305,309],{},"Middleware wraps around the handler, executing code before ",[306,307,308],"em",{},"and"," after:",[201,311,316],{"className":312,"code":314,"language":315},[313],"language-text","Request -> [MW1 before] -> [MW2 before] -> [Handler] -> [MW2 after] -> [MW1 after] -> Response\n","text",[191,317,314],{"__ignoreMap":206},[201,319,321],{"className":203,"code":320,"language":205,"meta":206,"style":206},"const timing: Middleware = async (ctx, next) => {\n  const start = Date.now()\n  await next()\n  const duration = Date.now() - start\n  ctx.res.header('X-Response-Time', `${duration}ms`)\n}\n",[191,322,323,360,383,393,417,464],{"__ignoreMap":206},[210,324,325,328,331,333,335,337,340,343,346,349,352,355,357],{"class":212,"line":213},[210,326,327],{"class":216},"const",[210,329,330],{"class":228}," timing",[210,332,239],{"class":224},[210,334,221],{"class":220},[210,336,225],{"class":224},[210,338,339],{"class":216}," async",[210,341,342],{"class":224}," (",[210,344,345],{"class":235},"ctx",[210,347,348],{"class":224},",",[210,350,351],{"class":235}," next",[210,353,354],{"class":224},")",[210,356,260],{"class":216},[210,358,359],{"class":224}," {\n",[210,361,362,365,368,370,373,376,379],{"class":212,"line":232},[210,363,364],{"class":216},"  const",[210,366,367],{"class":228}," start",[210,369,225],{"class":224},[210,371,372],{"class":228}," Date",[210,374,375],{"class":224},".",[210,377,378],{"class":251},"now",[210,380,382],{"class":381},"swJcz","()\n",[210,384,385,389,391],{"class":212,"line":248},[210,386,388],{"class":387},"s7zQu","  await",[210,390,351],{"class":251},[210,392,382],{"class":381},[210,394,395,397,400,402,404,406,408,411,414],{"class":212,"line":275},[210,396,364],{"class":216},[210,398,399],{"class":228}," duration",[210,401,225],{"class":224},[210,403,372],{"class":228},[210,405,375],{"class":224},[210,407,378],{"class":251},[210,409,410],{"class":381},"() ",[210,412,413],{"class":224},"-",[210,415,416],{"class":228}," start\n",[210,418,420,422,424,427,429,432,435,438,442,444,446,449,452,455,458,461],{"class":212,"line":419},5,[210,421,236],{"class":228},[210,423,375],{"class":224},[210,425,426],{"class":228},"res",[210,428,375],{"class":224},[210,430,431],{"class":251},"header",[210,433,434],{"class":381},"(",[210,436,437],{"class":224},"'",[210,439,441],{"class":440},"sfazB","X-Response-Time",[210,443,437],{"class":224},[210,445,348],{"class":224},[210,447,448],{"class":224}," `${",[210,450,451],{"class":228},"duration",[210,453,454],{"class":224},"}",[210,456,457],{"class":440},"ms",[210,459,460],{"class":224},"`",[210,462,463],{"class":381},")\n",[210,465,467],{"class":212,"line":466},6,[210,468,469],{"class":224},"}\n",[196,471,473],{"id":472},"global-middleware","Global middleware",[182,475,476,477,239],{},"Apply middleware to all routes with ",[191,478,479],{},"app.use()",[201,481,483],{"className":203,"code":482,"language":205,"meta":206,"style":206},"import { Miia, cors } from '@miiajs\u002Fcore'\n\nconst app = new Miia()\n  .use(cors())\n  .use(timing)\n  .register(AppModule)\n",[191,484,485,516,522,539,555,564],{"__ignoreMap":206},[210,486,487,490,493,496,498,501,504,507,510,513],{"class":212,"line":213},[210,488,489],{"class":387},"import",[210,491,492],{"class":224}," {",[210,494,495],{"class":228}," Miia",[210,497,348],{"class":224},[210,499,500],{"class":228}," cors",[210,502,503],{"class":224}," }",[210,505,506],{"class":387}," from",[210,508,509],{"class":224}," '",[210,511,512],{"class":440},"@miiajs\u002Fcore",[210,514,515],{"class":224},"'\n",[210,517,518],{"class":212,"line":232},[210,519,521],{"emptyLinePlaceholder":520},true,"\n",[210,523,524,526,529,532,535,537],{"class":212,"line":248},[210,525,327],{"class":216},[210,527,528],{"class":228}," app ",[210,530,531],{"class":224},"=",[210,533,534],{"class":224}," new",[210,536,495],{"class":251},[210,538,382],{"class":228},[210,540,541,544,547,549,552],{"class":212,"line":275},[210,542,543],{"class":224},"  .",[210,545,546],{"class":251},"use",[210,548,434],{"class":228},[210,550,551],{"class":251},"cors",[210,553,554],{"class":228},"())\n",[210,556,557,559,561],{"class":212,"line":419},[210,558,543],{"class":224},[210,560,546],{"class":251},[210,562,563],{"class":228},"(timing)\n",[210,565,566,568,571],{"class":212,"line":466},[210,567,543],{"class":224},[210,569,570],{"class":251},"register",[210,572,573],{"class":228},"(AppModule)\n",[182,575,576],{},"Global middleware executes in the order it's registered.",[182,578,579,580,583,584,587,588,591,592,595,596,599,600,239],{},"Global middleware is ",[186,581,582],{},"pre-route",": it wraps the entire dispatch, including ",[191,585,586],{},"router.match()",". This means it runs on ",[186,589,590],{},"every"," request, including unmatched routes that return ",[191,593,594],{},"404",". ",[191,597,598],{},"NotFoundException"," bubbles up through the onion, so middleware can observe it via ",[191,601,602],{},"try { await next() } catch",[201,604,606],{"className":203,"code":605,"language":205,"meta":206,"style":206},"const requestLogger: Middleware = async (ctx, next) => {\n  const start = Date.now()\n  try {\n    await next()\n  } finally {\n    const status = ctx.res.getStatus()\n    console.log(`${ctx.req.method} ${new URL(ctx.req.url).pathname} ${status} (${Date.now() - start}ms)`)\n  }\n}\n",[191,607,608,637,653,660,669,679,703,795,801],{"__ignoreMap":206},[210,609,610,612,615,617,619,621,623,625,627,629,631,633,635],{"class":212,"line":213},[210,611,327],{"class":216},[210,613,614],{"class":228}," requestLogger",[210,616,239],{"class":224},[210,618,221],{"class":220},[210,620,225],{"class":224},[210,622,339],{"class":216},[210,624,342],{"class":224},[210,626,345],{"class":235},[210,628,348],{"class":224},[210,630,351],{"class":235},[210,632,354],{"class":224},[210,634,260],{"class":216},[210,636,359],{"class":224},[210,638,639,641,643,645,647,649,651],{"class":212,"line":232},[210,640,364],{"class":216},[210,642,367],{"class":228},[210,644,225],{"class":224},[210,646,372],{"class":228},[210,648,375],{"class":224},[210,650,378],{"class":251},[210,652,382],{"class":381},[210,654,655,658],{"class":212,"line":248},[210,656,657],{"class":387},"  try",[210,659,359],{"class":224},[210,661,662,665,667],{"class":212,"line":275},[210,663,664],{"class":387},"    await",[210,666,351],{"class":251},[210,668,382],{"class":381},[210,670,671,674,677],{"class":212,"line":419},[210,672,673],{"class":224},"  }",[210,675,676],{"class":387}," finally",[210,678,359],{"class":224},[210,680,681,684,687,689,692,694,696,698,701],{"class":212,"line":466},[210,682,683],{"class":216},"    const",[210,685,686],{"class":228}," status",[210,688,225],{"class":224},[210,690,691],{"class":228}," ctx",[210,693,375],{"class":224},[210,695,426],{"class":228},[210,697,375],{"class":224},[210,699,700],{"class":251},"getStatus",[210,702,382],{"class":381},[210,704,706,709,711,714,716,719,721,723,726,728,731,733,736,739,742,745,747,749,751,754,756,759,761,763,766,768,770,773,776,778,780,782,784,786,788,791,793],{"class":212,"line":705},7,[210,707,708],{"class":228},"    console",[210,710,375],{"class":224},[210,712,713],{"class":251},"log",[210,715,434],{"class":381},[210,717,718],{"class":224},"`${",[210,720,345],{"class":228},[210,722,375],{"class":224},[210,724,725],{"class":228},"req",[210,727,375],{"class":224},[210,729,730],{"class":228},"method",[210,732,454],{"class":224},[210,734,735],{"class":224}," ${",[210,737,738],{"class":224},"new",[210,740,741],{"class":251}," URL",[210,743,744],{"class":228},"(ctx",[210,746,375],{"class":224},[210,748,725],{"class":228},[210,750,375],{"class":224},[210,752,753],{"class":228},"url)",[210,755,375],{"class":224},[210,757,758],{"class":228},"pathname",[210,760,454],{"class":224},[210,762,735],{"class":224},[210,764,765],{"class":228},"status",[210,767,454],{"class":224},[210,769,342],{"class":440},[210,771,772],{"class":224},"${",[210,774,775],{"class":228},"Date",[210,777,375],{"class":224},[210,779,378],{"class":251},[210,781,410],{"class":228},[210,783,413],{"class":224},[210,785,367],{"class":228},[210,787,454],{"class":224},[210,789,790],{"class":440},"ms)",[210,792,460],{"class":224},[210,794,463],{"class":381},[210,796,798],{"class":212,"line":797},8,[210,799,800],{"class":224},"  }\n",[210,802,804],{"class":212,"line":803},9,[210,805,469],{"class":224},[182,807,808,809,811,812,814],{},"This is why CORS, request loggers, and request-id middleware set headers that appear on ",[191,810,594],{}," responses - the header was written before ",[191,813,586],{}," threw.",[816,817,818],"tip",{},[182,819,820,823,824,827,828,831,832,834,835,837],{},[191,821,822],{},"ctx.params"," is ",[191,825,826],{},"{}"," inside global middleware ",[186,829,830],{},"before"," ",[191,833,296],{}," - the router hasn't matched yet. After ",[191,836,296],{}," on a matched route it contains the route params.",[839,840,842],"h3",{"id":841},"early-termination","Early termination",[182,844,845,846,849,850,853,854,856,857,239],{},"A global middleware that does ",[186,847,848],{},"not"," call ",[191,851,852],{},"next()"," short-circuits the dispatch - ",[191,855,586],{}," never runs, the handler never runs, and the response is built from ",[191,858,859],{},"ctx.res",[201,861,863],{"className":203,"code":862,"language":205,"meta":206,"style":206},"const rateLimiter: Middleware = async (ctx, next) => {\n  if (await isRateLimited(ctx.req)) {\n    ctx.res.status(429).json({ error: 'Too Many Requests' })\n    return \u002F\u002F no next() → router and handler skipped entirely\n  }\n  await next()\n}\n",[191,864,865,894,921,968,977,981,989],{"__ignoreMap":206},[210,866,867,869,872,874,876,878,880,882,884,886,888,890,892],{"class":212,"line":213},[210,868,327],{"class":216},[210,870,871],{"class":228}," rateLimiter",[210,873,239],{"class":224},[210,875,221],{"class":220},[210,877,225],{"class":224},[210,879,339],{"class":216},[210,881,342],{"class":224},[210,883,345],{"class":235},[210,885,348],{"class":224},[210,887,351],{"class":235},[210,889,354],{"class":224},[210,891,260],{"class":216},[210,893,359],{"class":224},[210,895,896,899,901,904,907,909,911,913,915,918],{"class":212,"line":232},[210,897,898],{"class":387},"  if",[210,900,342],{"class":381},[210,902,903],{"class":387},"await",[210,905,906],{"class":251}," isRateLimited",[210,908,434],{"class":381},[210,910,345],{"class":228},[210,912,375],{"class":224},[210,914,725],{"class":228},[210,916,917],{"class":381},")) ",[210,919,920],{"class":224},"{\n",[210,922,923,926,928,930,932,934,936,940,942,944,947,949,952,955,957,959,962,964,966],{"class":212,"line":248},[210,924,925],{"class":228},"    ctx",[210,927,375],{"class":224},[210,929,426],{"class":228},[210,931,375],{"class":224},[210,933,765],{"class":251},[210,935,434],{"class":381},[210,937,939],{"class":938},"sbssI","429",[210,941,354],{"class":381},[210,943,375],{"class":224},[210,945,946],{"class":251},"json",[210,948,434],{"class":381},[210,950,951],{"class":224},"{",[210,953,954],{"class":381}," error",[210,956,239],{"class":224},[210,958,509],{"class":224},[210,960,961],{"class":440},"Too Many Requests",[210,963,437],{"class":224},[210,965,503],{"class":224},[210,967,463],{"class":381},[210,969,970,973],{"class":212,"line":275},[210,971,972],{"class":387},"    return",[210,974,976],{"class":975},"sHwdD"," \u002F\u002F no next() → router and handler skipped entirely\n",[210,978,979],{"class":212,"line":419},[210,980,800],{"class":224},[210,982,983,985,987],{"class":212,"line":466},[210,984,388],{"class":387},[210,986,351],{"class":251},[210,988,382],{"class":381},[210,990,991],{"class":212,"line":705},[210,992,469],{"class":224},[182,994,995,996,999,1000,375],{},"This is the standard Koa pattern - the response is assembled from the ",[191,997,998],{},"ResponseBuilder"," exactly as if the handler had returned ",[191,1001,1002],{},"null",[196,1004,1006],{"id":1005},"controller-middleware","Controller middleware",[182,1008,1009,1010,1013],{},"Apply middleware to all routes in a controller with the ",[191,1011,1012],{},"@Use()"," decorator:",[201,1015,1017],{"className":203,"code":1016,"language":205,"meta":206,"style":206},"import { Controller, Use } from '@miiajs\u002Fcore'\n\n@Controller('\u002Fapi')\n@Use(loggingMiddleware, authMiddleware)\nclass ApiController {\n  \u002F\u002F All methods get loggingMiddleware and authMiddleware\n}\n",[191,1018,1019,1043,1047,1066,1081,1091,1096],{"__ignoreMap":206},[210,1020,1021,1023,1025,1028,1030,1033,1035,1037,1039,1041],{"class":212,"line":213},[210,1022,489],{"class":387},[210,1024,492],{"class":224},[210,1026,1027],{"class":228}," Controller",[210,1029,348],{"class":224},[210,1031,1032],{"class":228}," Use",[210,1034,503],{"class":224},[210,1036,506],{"class":387},[210,1038,509],{"class":224},[210,1040,512],{"class":440},[210,1042,515],{"class":224},[210,1044,1045],{"class":212,"line":232},[210,1046,521],{"emptyLinePlaceholder":520},[210,1048,1049,1052,1055,1057,1059,1062,1064],{"class":212,"line":248},[210,1050,1051],{"class":224},"@",[210,1053,1054],{"class":251},"Controller",[210,1056,434],{"class":228},[210,1058,437],{"class":224},[210,1060,1061],{"class":440},"\u002Fapi",[210,1063,437],{"class":224},[210,1065,463],{"class":228},[210,1067,1068,1070,1073,1076,1078],{"class":212,"line":275},[210,1069,1051],{"class":224},[210,1071,1072],{"class":251},"Use",[210,1074,1075],{"class":228},"(loggingMiddleware",[210,1077,348],{"class":224},[210,1079,1080],{"class":228}," authMiddleware)\n",[210,1082,1083,1086,1089],{"class":212,"line":419},[210,1084,1085],{"class":216},"class",[210,1087,1088],{"class":220}," ApiController",[210,1090,359],{"class":224},[210,1092,1093],{"class":212,"line":466},[210,1094,1095],{"class":975},"  \u002F\u002F All methods get loggingMiddleware and authMiddleware\n",[210,1097,1098],{"class":212,"line":705},[210,1099,469],{"class":224},[196,1101,1103],{"id":1102},"route-middleware","Route middleware",[182,1105,1106],{},"Apply middleware to a specific route:",[201,1108,1110],{"className":203,"code":1109,"language":205,"meta":206,"style":206},"@Controller('\u002Fitems')\nclass ItemController {\n  @Post('\u002F')\n  @Use(validateMiddleware)\n  async create(ctx: RequestContext) {\n    return await ctx.json()\n  }\n}\n",[191,1111,1112,1129,1138,1157,1166,1186,1201,1205],{"__ignoreMap":206},[210,1113,1114,1116,1118,1120,1122,1125,1127],{"class":212,"line":213},[210,1115,1051],{"class":224},[210,1117,1054],{"class":251},[210,1119,434],{"class":228},[210,1121,437],{"class":224},[210,1123,1124],{"class":440},"\u002Fitems",[210,1126,437],{"class":224},[210,1128,463],{"class":228},[210,1130,1131,1133,1136],{"class":212,"line":232},[210,1132,1085],{"class":216},[210,1134,1135],{"class":220}," ItemController",[210,1137,359],{"class":224},[210,1139,1140,1143,1146,1148,1150,1153,1155],{"class":212,"line":248},[210,1141,1142],{"class":224},"  @",[210,1144,1145],{"class":251},"Post",[210,1147,434],{"class":228},[210,1149,437],{"class":224},[210,1151,1152],{"class":440},"\u002F",[210,1154,437],{"class":224},[210,1156,463],{"class":228},[210,1158,1159,1161,1163],{"class":212,"line":275},[210,1160,1142],{"class":224},[210,1162,1072],{"class":251},[210,1164,1165],{"class":228},"(validateMiddleware)\n",[210,1167,1168,1171,1174,1176,1178,1180,1182,1184],{"class":212,"line":419},[210,1169,1170],{"class":216},"  async",[210,1172,1173],{"class":381}," create",[210,1175,434],{"class":224},[210,1177,345],{"class":235},[210,1179,239],{"class":224},[210,1181,242],{"class":220},[210,1183,354],{"class":224},[210,1185,359],{"class":224},[210,1187,1188,1190,1193,1195,1197,1199],{"class":212,"line":466},[210,1189,972],{"class":387},[210,1191,1192],{"class":387}," await",[210,1194,691],{"class":228},[210,1196,375],{"class":224},[210,1198,946],{"class":251},[210,1200,382],{"class":381},[210,1202,1203],{"class":212,"line":705},[210,1204,800],{"class":224},[210,1206,1207],{"class":212,"line":797},[210,1208,469],{"class":224},[196,1210,1212],{"id":1211},"execution-order","Execution order",[201,1214,1217],{"className":1215,"code":1216,"language":315},[313],"Global middleware (app.use())\n  -> Global guards (app.useGuard())\n  -> Controller middleware (@Use on class)\n  -> Route guards (@UseGuard on method)\n  -> Route middleware (@Use on method)\n  -> Validation (@ValidateBody, etc.)\n  -> Route handler\n",[191,1218,1216],{"__ignoreMap":206},[196,1220,1222],{"id":1221},"built-in-middleware","Built-in middleware",[839,1224,1225],{"id":551},"CORS",[201,1227,1229],{"className":203,"code":1228,"language":205,"meta":206,"style":206},"import { cors } from '@miiajs\u002Fcore'\n\napp.use(cors({\n  origin: ['https:\u002F\u002Fexample.com', 'https:\u002F\u002Fapp.example.com'],\n  methods: ['GET', 'POST', 'PUT', 'DELETE'],\n  allowedHeaders: ['Content-Type', 'Authorization'],\n  credentials: true,\n  maxAge: 86400,\n}))\n",[191,1230,1231,1249,1253,1270,1301,1348,1377,1390,1402],{"__ignoreMap":206},[210,1232,1233,1235,1237,1239,1241,1243,1245,1247],{"class":212,"line":213},[210,1234,489],{"class":387},[210,1236,492],{"class":224},[210,1238,500],{"class":228},[210,1240,503],{"class":224},[210,1242,506],{"class":387},[210,1244,509],{"class":224},[210,1246,512],{"class":440},[210,1248,515],{"class":224},[210,1250,1251],{"class":212,"line":232},[210,1252,521],{"emptyLinePlaceholder":520},[210,1254,1255,1258,1260,1262,1264,1266,1268],{"class":212,"line":248},[210,1256,1257],{"class":228},"app",[210,1259,375],{"class":224},[210,1261,546],{"class":251},[210,1263,434],{"class":228},[210,1265,551],{"class":251},[210,1267,434],{"class":228},[210,1269,920],{"class":224},[210,1271,1272,1275,1277,1280,1282,1285,1287,1289,1291,1294,1296,1299],{"class":212,"line":275},[210,1273,1274],{"class":381},"  origin",[210,1276,239],{"class":224},[210,1278,1279],{"class":228}," [",[210,1281,437],{"class":224},[210,1283,1284],{"class":440},"https:\u002F\u002Fexample.com",[210,1286,437],{"class":224},[210,1288,348],{"class":224},[210,1290,509],{"class":224},[210,1292,1293],{"class":440},"https:\u002F\u002Fapp.example.com",[210,1295,437],{"class":224},[210,1297,1298],{"class":228},"]",[210,1300,245],{"class":224},[210,1302,1303,1306,1308,1310,1312,1315,1317,1319,1321,1324,1326,1328,1330,1333,1335,1337,1339,1342,1344,1346],{"class":212,"line":419},[210,1304,1305],{"class":381},"  methods",[210,1307,239],{"class":224},[210,1309,1279],{"class":228},[210,1311,437],{"class":224},[210,1313,1314],{"class":440},"GET",[210,1316,437],{"class":224},[210,1318,348],{"class":224},[210,1320,509],{"class":224},[210,1322,1323],{"class":440},"POST",[210,1325,437],{"class":224},[210,1327,348],{"class":224},[210,1329,509],{"class":224},[210,1331,1332],{"class":440},"PUT",[210,1334,437],{"class":224},[210,1336,348],{"class":224},[210,1338,509],{"class":224},[210,1340,1341],{"class":440},"DELETE",[210,1343,437],{"class":224},[210,1345,1298],{"class":228},[210,1347,245],{"class":224},[210,1349,1350,1353,1355,1357,1359,1362,1364,1366,1368,1371,1373,1375],{"class":212,"line":466},[210,1351,1352],{"class":381},"  allowedHeaders",[210,1354,239],{"class":224},[210,1356,1279],{"class":228},[210,1358,437],{"class":224},[210,1360,1361],{"class":440},"Content-Type",[210,1363,437],{"class":224},[210,1365,348],{"class":224},[210,1367,509],{"class":224},[210,1369,1370],{"class":440},"Authorization",[210,1372,437],{"class":224},[210,1374,1298],{"class":228},[210,1376,245],{"class":224},[210,1378,1379,1382,1384,1388],{"class":212,"line":705},[210,1380,1381],{"class":381},"  credentials",[210,1383,239],{"class":224},[210,1385,1387],{"class":1386},"sfNiH"," true",[210,1389,245],{"class":224},[210,1391,1392,1395,1397,1400],{"class":212,"line":797},[210,1393,1394],{"class":381},"  maxAge",[210,1396,239],{"class":224},[210,1398,1399],{"class":938}," 86400",[210,1401,245],{"class":224},[210,1403,1404,1406],{"class":212,"line":803},[210,1405,454],{"class":224},[210,1407,1408],{"class":228},"))\n",[182,1410,1411],{},[186,1412,1413],{},"Options:",[1415,1416,1417,1433],"table",{},[1418,1419,1420],"thead",{},[1421,1422,1423,1427,1430],"tr",{},[1424,1425,1426],"th",{},"Option",[1424,1428,1429],{},"Type",[1424,1431,1432],{},"Description",[1434,1435,1436,1452,1467,1481,1495,1510],"tbody",{},[1421,1437,1438,1444,1449],{},[1439,1440,1441],"td",{},[191,1442,1443],{},"origin",[1439,1445,1446],{},[191,1447,1448],{},"string | string[] | ((origin: string) => boolean)",[1439,1450,1451],{},"Allowed origins",[1421,1453,1454,1459,1464],{},[1439,1455,1456],{},[191,1457,1458],{},"methods",[1439,1460,1461],{},[191,1462,1463],{},"string[]",[1439,1465,1466],{},"Allowed HTTP methods",[1421,1468,1469,1474,1478],{},[1439,1470,1471],{},[191,1472,1473],{},"allowedHeaders",[1439,1475,1476],{},[191,1477,1463],{},[1439,1479,1480],{},"Allowed request headers",[1421,1482,1483,1488,1492],{},[1439,1484,1485],{},[191,1486,1487],{},"exposedHeaders",[1439,1489,1490],{},[191,1491,1463],{},[1439,1493,1494],{},"Headers exposed to the browser",[1421,1496,1497,1502,1507],{},[1439,1498,1499],{},[191,1500,1501],{},"credentials",[1439,1503,1504],{},[191,1505,1506],{},"boolean",[1439,1508,1509],{},"Allow credentials",[1421,1511,1512,1517,1522],{},[1439,1513,1514],{},[191,1515,1516],{},"maxAge",[1439,1518,1519],{},[191,1520,1521],{},"number",[1439,1523,1524],{},"Preflight cache duration (seconds)",[196,1526,1528],{"id":1527},"writing-custom-middleware","Writing custom middleware",[201,1530,1532],{"className":203,"code":1531,"language":205,"meta":206,"style":206},"import type { Middleware, RequestContext } from '@miiajs\u002Fcore'\n\n\u002F\u002F Extend RequestContext with custom properties via declaration merging\ndeclare module '@miiajs\u002Fcore' {\n  interface RequestContext {\n    user?: { id: string; role: string }\n  }\n}\n\nconst auth: Middleware = async (ctx, next) => {\n  const token = ctx.req.headers.get('authorization')\n  if (!token) {\n    throw new UnauthorizedException()\n  }\n  ctx.user = await verifyToken(token)\n  await next()\n}\n\nconst errorHandler: Middleware = async (ctx, next) => {\n  try {\n    await next()\n  } catch (error) {\n    \u002F\u002F Custom error handling\n    ctx.res.status(500).json({ error: 'Something went wrong' })\n  }\n}\n",[191,1533,1534,1559,1563,1568,1584,1593,1624,1628,1632,1636,1666,1703,1720,1733,1738,1761,1770,1775,1780,1810,1817,1826,1843,1849,1892,1897],{"__ignoreMap":206},[210,1535,1536,1538,1541,1543,1545,1547,1549,1551,1553,1555,1557],{"class":212,"line":213},[210,1537,489],{"class":387},[210,1539,1540],{"class":387}," type",[210,1542,492],{"class":224},[210,1544,221],{"class":228},[210,1546,348],{"class":224},[210,1548,242],{"class":228},[210,1550,503],{"class":224},[210,1552,506],{"class":387},[210,1554,509],{"class":224},[210,1556,512],{"class":440},[210,1558,515],{"class":224},[210,1560,1561],{"class":212,"line":232},[210,1562,521],{"emptyLinePlaceholder":520},[210,1564,1565],{"class":212,"line":248},[210,1566,1567],{"class":975},"\u002F\u002F Extend RequestContext with custom properties via declaration merging\n",[210,1569,1570,1573,1576,1578,1580,1582],{"class":212,"line":275},[210,1571,1572],{"class":216},"declare",[210,1574,1575],{"class":216}," module",[210,1577,509],{"class":224},[210,1579,512],{"class":440},[210,1581,437],{"class":224},[210,1583,359],{"class":224},[210,1585,1586,1589,1591],{"class":212,"line":419},[210,1587,1588],{"class":216},"  interface",[210,1590,242],{"class":220},[210,1592,359],{"class":224},[210,1594,1595,1598,1601,1603,1606,1608,1611,1614,1617,1619,1621],{"class":212,"line":466},[210,1596,1597],{"class":381},"    user",[210,1599,1600],{"class":224},"?:",[210,1602,492],{"class":224},[210,1604,1605],{"class":381}," id",[210,1607,239],{"class":224},[210,1609,1610],{"class":220}," string",[210,1612,1613],{"class":224},";",[210,1615,1616],{"class":381}," role",[210,1618,239],{"class":224},[210,1620,1610],{"class":220},[210,1622,1623],{"class":224}," }\n",[210,1625,1626],{"class":212,"line":705},[210,1627,800],{"class":224},[210,1629,1630],{"class":212,"line":797},[210,1631,469],{"class":224},[210,1633,1634],{"class":212,"line":803},[210,1635,521],{"emptyLinePlaceholder":520},[210,1637,1639,1641,1644,1646,1648,1650,1652,1654,1656,1658,1660,1662,1664],{"class":212,"line":1638},10,[210,1640,327],{"class":216},[210,1642,1643],{"class":228}," auth",[210,1645,239],{"class":224},[210,1647,221],{"class":220},[210,1649,225],{"class":224},[210,1651,339],{"class":216},[210,1653,342],{"class":224},[210,1655,345],{"class":235},[210,1657,348],{"class":224},[210,1659,351],{"class":235},[210,1661,354],{"class":224},[210,1663,260],{"class":216},[210,1665,359],{"class":224},[210,1667,1669,1671,1674,1676,1678,1680,1682,1684,1687,1689,1692,1694,1696,1699,1701],{"class":212,"line":1668},11,[210,1670,364],{"class":216},[210,1672,1673],{"class":228}," token",[210,1675,225],{"class":224},[210,1677,691],{"class":228},[210,1679,375],{"class":224},[210,1681,725],{"class":228},[210,1683,375],{"class":224},[210,1685,1686],{"class":228},"headers",[210,1688,375],{"class":224},[210,1690,1691],{"class":251},"get",[210,1693,434],{"class":381},[210,1695,437],{"class":224},[210,1697,1698],{"class":440},"authorization",[210,1700,437],{"class":224},[210,1702,463],{"class":381},[210,1704,1706,1708,1710,1713,1716,1718],{"class":212,"line":1705},12,[210,1707,898],{"class":387},[210,1709,342],{"class":381},[210,1711,1712],{"class":224},"!",[210,1714,1715],{"class":228},"token",[210,1717,278],{"class":381},[210,1719,920],{"class":224},[210,1721,1723,1726,1728,1731],{"class":212,"line":1722},13,[210,1724,1725],{"class":387},"    throw",[210,1727,534],{"class":224},[210,1729,1730],{"class":251}," UnauthorizedException",[210,1732,382],{"class":381},[210,1734,1736],{"class":212,"line":1735},14,[210,1737,800],{"class":224},[210,1739,1741,1743,1745,1748,1750,1752,1755,1757,1759],{"class":212,"line":1740},15,[210,1742,236],{"class":228},[210,1744,375],{"class":224},[210,1746,1747],{"class":228},"user",[210,1749,225],{"class":224},[210,1751,1192],{"class":387},[210,1753,1754],{"class":251}," verifyToken",[210,1756,434],{"class":381},[210,1758,1715],{"class":228},[210,1760,463],{"class":381},[210,1762,1764,1766,1768],{"class":212,"line":1763},16,[210,1765,388],{"class":387},[210,1767,351],{"class":251},[210,1769,382],{"class":381},[210,1771,1773],{"class":212,"line":1772},17,[210,1774,469],{"class":224},[210,1776,1778],{"class":212,"line":1777},18,[210,1779,521],{"emptyLinePlaceholder":520},[210,1781,1783,1785,1788,1790,1792,1794,1796,1798,1800,1802,1804,1806,1808],{"class":212,"line":1782},19,[210,1784,327],{"class":216},[210,1786,1787],{"class":228}," errorHandler",[210,1789,239],{"class":224},[210,1791,221],{"class":220},[210,1793,225],{"class":224},[210,1795,339],{"class":216},[210,1797,342],{"class":224},[210,1799,345],{"class":235},[210,1801,348],{"class":224},[210,1803,351],{"class":235},[210,1805,354],{"class":224},[210,1807,260],{"class":216},[210,1809,359],{"class":224},[210,1811,1813,1815],{"class":212,"line":1812},20,[210,1814,657],{"class":387},[210,1816,359],{"class":224},[210,1818,1820,1822,1824],{"class":212,"line":1819},21,[210,1821,664],{"class":387},[210,1823,351],{"class":251},[210,1825,382],{"class":381},[210,1827,1829,1831,1834,1836,1839,1841],{"class":212,"line":1828},22,[210,1830,673],{"class":224},[210,1832,1833],{"class":387}," catch",[210,1835,342],{"class":381},[210,1837,1838],{"class":228},"error",[210,1840,278],{"class":381},[210,1842,920],{"class":224},[210,1844,1846],{"class":212,"line":1845},23,[210,1847,1848],{"class":975},"    \u002F\u002F Custom error handling\n",[210,1850,1852,1854,1856,1858,1860,1862,1864,1867,1869,1871,1873,1875,1877,1879,1881,1883,1886,1888,1890],{"class":212,"line":1851},24,[210,1853,925],{"class":228},[210,1855,375],{"class":224},[210,1857,426],{"class":228},[210,1859,375],{"class":224},[210,1861,765],{"class":251},[210,1863,434],{"class":381},[210,1865,1866],{"class":938},"500",[210,1868,354],{"class":381},[210,1870,375],{"class":224},[210,1872,946],{"class":251},[210,1874,434],{"class":381},[210,1876,951],{"class":224},[210,1878,954],{"class":381},[210,1880,239],{"class":224},[210,1882,509],{"class":224},[210,1884,1885],{"class":440},"Something went wrong",[210,1887,437],{"class":224},[210,1889,503],{"class":224},[210,1891,463],{"class":381},[210,1893,1895],{"class":212,"line":1894},25,[210,1896,800],{"class":224},[210,1898,1900],{"class":212,"line":1899},26,[210,1901,469],{"class":224},[196,1903,193],{"id":1904},"compose",[182,1906,1907,1908,1910],{},"The ",[191,1909,193],{}," function combines multiple middleware into one:",[201,1912,1914],{"className":203,"code":1913,"language":205,"meta":206,"style":206},"import { compose } from '@miiajs\u002Fcore'\n\nconst combined = compose([auth, logging, timing])\n\napp.use(combined)\n",[191,1915,1916,1935,1939,1963,1967],{"__ignoreMap":206},[210,1917,1918,1920,1922,1925,1927,1929,1931,1933],{"class":212,"line":213},[210,1919,489],{"class":387},[210,1921,492],{"class":224},[210,1923,1924],{"class":228}," compose",[210,1926,503],{"class":224},[210,1928,506],{"class":387},[210,1930,509],{"class":224},[210,1932,512],{"class":440},[210,1934,515],{"class":224},[210,1936,1937],{"class":212,"line":232},[210,1938,521],{"emptyLinePlaceholder":520},[210,1940,1941,1943,1946,1948,1950,1953,1955,1958,1960],{"class":212,"line":248},[210,1942,327],{"class":216},[210,1944,1945],{"class":228}," combined ",[210,1947,531],{"class":224},[210,1949,1924],{"class":251},[210,1951,1952],{"class":228},"([auth",[210,1954,348],{"class":224},[210,1956,1957],{"class":228}," logging",[210,1959,348],{"class":224},[210,1961,1962],{"class":228}," timing])\n",[210,1964,1965],{"class":212,"line":275},[210,1966,521],{"emptyLinePlaceholder":520},[210,1968,1969,1971,1973,1975],{"class":212,"line":419},[210,1970,1257],{"class":228},[210,1972,375],{"class":224},[210,1974,546],{"class":251},[210,1976,1977],{"class":228},"(combined)\n",[1979,1980,1981],"style",{},"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 .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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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":206,"searchDepth":232,"depth":232,"links":1983},[1984,1985,1986,1989,1990,1991,1992,1995,1996],{"id":198,"depth":232,"text":199},{"id":300,"depth":232,"text":301},{"id":472,"depth":232,"text":473,"children":1987},[1988],{"id":841,"depth":248,"text":842},{"id":1005,"depth":232,"text":1006},{"id":1102,"depth":232,"text":1103},{"id":1211,"depth":232,"text":1212},{"id":1221,"depth":232,"text":1222,"children":1993},[1994],{"id":551,"depth":248,"text":1225},{"id":1527,"depth":232,"text":1528},{"id":1904,"depth":232,"text":193},"Transform requests and responses using the Koa-style onion model.","md",{},{"title":75,"description":1997},"Cq_e-_E9mJ_ioviaaxrfY-Nc9EqL6knqsm762MFzoXY",[2003,2005],{"title":71,"path":72,"stem":73,"description":2004,"children":-1},"Manage environment variables with validated, type-safe configuration.",{"title":79,"path":80,"stem":81,"description":2006,"children":-1},"Control access to routes based on conditions like authentication and roles.",1778575270760]