[{"data":1,"prerenderedAt":352},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fcore-concepts":176,"\u002Fdocs\u002Fcore-concepts-surround":347},[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":27,"body":178,"description":341,"extension":342,"meta":343,"navigation":344,"path":23,"seo":345,"status":11,"stem":24,"__hash__":346},"docs\u002F1.docs\u002F2.core-concepts\u002F1.index.md",{"type":179,"value":180,"toc":336},"minimark",[181,185,190,301,305,308,319],[182,183,184],"p",{},"MiiaJS is built around a few core concepts that work together to create a clean, modular application architecture.",[186,187,189],"h2",{"id":188},"building-blocks","Building blocks",[191,192,193,206],"table",{},[194,195,196],"thead",{},[197,198,199,203],"tr",{},[200,201,202],"th",{},"Concept",[200,204,205],{},"Description",[207,208,209,220,229,238,247,256,265,274,283,292],"tbody",{},[197,210,211,217],{},[212,213,214],"td",{},[215,216,55],"a",{"href":56},[212,218,219],{},"Handle incoming HTTP requests and return responses",[197,221,222,226],{},[212,223,224],{},[215,225,59],{"href":60},[212,227,228],{},"How URLs are matched - static, dynamic, wildcard routes",[197,230,231,235],{},[212,232,233],{},[215,234,63],{"href":64},[212,236,237],{},"Services, repositories, and other injectable classes",[197,239,240,244],{},[212,241,242],{},[215,243,67],{"href":68},[212,245,246],{},"Organize the application into cohesive blocks",[197,248,249,253],{},[212,250,251],{},[215,252,71],{"href":72},[212,254,255],{},"Manage environment variables and app settings",[197,257,258,262],{},[212,259,260],{},[215,261,75],{"href":76},[212,263,264],{},"Transform requests and responses in the pipeline",[197,266,267,271],{},[212,268,269],{},[215,270,79],{"href":80},[212,272,273],{},"Determine whether a request should be handled",[197,275,276,280],{},[212,277,278],{},[215,279,83],{"href":84},[212,281,282],{},"Handle errors with structured HTTP responses",[197,284,285,289],{},[212,286,287],{},[215,288,29],{"href":30},[212,290,291],{},"Build HTTP responses with a fluent API",[197,293,294,298],{},[212,295,296],{},[215,297,33],{"href":34},[212,299,300],{},"Test your application with the built-in TestApp",[186,302,304],{"id":303},"request-lifecycle","Request lifecycle",[182,306,307],{},"Every HTTP request in MiiaJS flows through a well-defined pipeline:",[309,310,315],"pre",{"className":311,"code":313,"language":314},[312],"language-text","Request\n  -> Global middleware\n  -> Global guards\n  -> Controller middleware\n  -> Route guards\n  -> Route middleware\n  -> Validation (body\u002Fquery\u002Fparams)\n  -> Route handler\n  -> Response\n","text",[316,317,313],"code",{"__ignoreMap":318},"",[182,320,321,322,326,327,331,332,335],{},"Middleware follows a ",[323,324,325],"strong",{},"Koa-style onion model"," - each middleware can run code before ",[328,329,330],"em",{},"and"," after the handler by wrapping ",[316,333,334],{},"await next()",".",{"title":318,"searchDepth":337,"depth":337,"links":338},2,[339,340],{"id":188,"depth":337,"text":189},{"id":303,"depth":337,"text":304},"Learn the fundamental building blocks of a MiiaJS application.","md",{},true,{"title":27,"description":341},"tyxSu4QGIshLXE_kAay5uk0bCVTL4K7HBjIa8vJlKCk",[348,350],{"title":17,"path":18,"stem":19,"description":349,"children":-1},"Build your first MiiaJS API in under a minute.",{"title":29,"path":30,"stem":31,"description":351,"children":-1},"Build HTTP responses with the fluent ResponseBuilder API.",1778575269583]