[{"data":1,"prerenderedAt":3467},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fpackages\u002Fswagger":176,"\u002Fdocs\u002Fpackages\u002Fswagger-surround":3462},[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":147,"body":178,"description":3457,"extension":3458,"meta":3459,"navigation":381,"path":148,"seo":3460,"status":103,"stem":149,"__hash__":3461},"docs\u002F1.docs\u002F3.packages\u002F7.swagger.md",{"type":179,"value":180,"toc":3436},"minimark",[181,197,201,281,285,299,655,755,761,777,797,824,828,1024,1027,1032,1035,1086,1090,1093,1204,1208,1211,1325,1329,1336,1414,1429,1448,1452,1455,1559,1566,1570,1573,1689,1696,1700,1703,1778,1782,1785,1898,1902,1905,1989,1993,1996,2049,2053,2056,2299,2302,2306,2858,2861,2882,3307,3311,3432],[182,183,184,188,189,196],"p",{},[185,186,187],"code",{},"@miiajs\u002Fswagger"," scans your controllers for decorator metadata and generates an ",[190,191,195],"a",{"href":192,"rel":193},"https:\u002F\u002Fspec.openapis.org\u002Foas\u002Fv3.1.0",[194],"nofollow","OpenAPI 3.1"," spec with Swagger UI.",[198,199,13],"h2",{"id":200},"installation",[202,203,204,232,249,265],"code-group",{},[205,206,212],"pre",{"className":207,"code":208,"filename":209,"language":210,"meta":211,"style":211},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bun add @miiajs\u002Fswagger swagger-ui-dist\n","bun","bash","",[185,213,214],{"__ignoreMap":211},[215,216,219,222,226,229],"span",{"class":217,"line":218},"line",1,[215,220,209],{"class":221},"sBMFI",[215,223,225],{"class":224},"sfazB"," add",[215,227,228],{"class":224}," @miiajs\u002Fswagger",[215,230,231],{"class":224}," swagger-ui-dist\n",[205,233,236],{"className":207,"code":234,"filename":235,"language":210,"meta":211,"style":211},"npm install @miiajs\u002Fswagger swagger-ui-dist\n","npm",[185,237,238],{"__ignoreMap":211},[215,239,240,242,245,247],{"class":217,"line":218},[215,241,235],{"class":221},[215,243,244],{"class":224}," install",[215,246,228],{"class":224},[215,248,231],{"class":224},[205,250,253],{"className":207,"code":251,"filename":252,"language":210,"meta":211,"style":211},"pnpm add @miiajs\u002Fswagger swagger-ui-dist\n","pnpm",[185,254,255],{"__ignoreMap":211},[215,256,257,259,261,263],{"class":217,"line":218},[215,258,252],{"class":221},[215,260,225],{"class":224},[215,262,228],{"class":224},[215,264,231],{"class":224},[205,266,269],{"className":207,"code":267,"filename":268,"language":210,"meta":211,"style":211},"yarn add @miiajs\u002Fswagger swagger-ui-dist\n","yarn",[185,270,271],{"__ignoreMap":211},[215,272,273,275,277,279],{"class":217,"line":218},[215,274,268],{"class":221},[215,276,225],{"class":224},[215,278,228],{"class":224},[215,280,231],{"class":224},[198,282,284],{"id":283},"setup","Setup",[182,286,287,290,291,294,295,298],{},[185,288,289],{},"SwaggerModule.configure()"," returns a configured module you drop into your root ",[185,292,293],{},"@Module({ imports: [...] })",". The service inside it runs in ",[185,296,297],{},"onReady()"," - after all controllers have been discovered but before the HTTP server starts - so the spec is always generated with the full, live routing tree.",[205,300,304],{"className":301,"code":302,"language":303,"meta":211,"style":211},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Module } from '@miiajs\u002Fcore'\nimport { SwaggerModule } from '@miiajs\u002Fswagger'\nimport { UsersModule } from '.\u002Fusers\u002Fusers.module.js'\n\n@Module({\n  imports: [\n    UsersModule,\n    SwaggerModule.configure({\n      title: 'My API',\n      version: '1.0.0',\n      description: 'API documentation',\n      servers: [\n        { url: 'http:\u002F\u002Flocalhost:3000', description: 'Development' },\n      ],\n      securitySchemes: {\n        bearer: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },\n      },\n    }),\n  ],\n})\nexport class AppModule {}\n","typescript",[185,305,306,335,355,376,383,399,412,421,437,455,472,489,499,535,543,554,605,611,622,630,639],{"__ignoreMap":211},[215,307,308,312,316,320,323,326,329,332],{"class":217,"line":218},[215,309,311],{"class":310},"s7zQu","import",[215,313,315],{"class":314},"sMK4o"," {",[215,317,319],{"class":318},"sTEyZ"," Module",[215,321,322],{"class":314}," }",[215,324,325],{"class":310}," from",[215,327,328],{"class":314}," '",[215,330,331],{"class":224},"@miiajs\u002Fcore",[215,333,334],{"class":314},"'\n",[215,336,338,340,342,345,347,349,351,353],{"class":217,"line":337},2,[215,339,311],{"class":310},[215,341,315],{"class":314},[215,343,344],{"class":318}," SwaggerModule",[215,346,322],{"class":314},[215,348,325],{"class":310},[215,350,328],{"class":314},[215,352,187],{"class":224},[215,354,334],{"class":314},[215,356,358,360,362,365,367,369,371,374],{"class":217,"line":357},3,[215,359,311],{"class":310},[215,361,315],{"class":314},[215,363,364],{"class":318}," UsersModule",[215,366,322],{"class":314},[215,368,325],{"class":310},[215,370,328],{"class":314},[215,372,373],{"class":224},".\u002Fusers\u002Fusers.module.js",[215,375,334],{"class":314},[215,377,379],{"class":217,"line":378},4,[215,380,382],{"emptyLinePlaceholder":381},true,"\n",[215,384,386,389,393,396],{"class":217,"line":385},5,[215,387,388],{"class":314},"@",[215,390,392],{"class":391},"s2Zo4","Module",[215,394,395],{"class":318},"(",[215,397,398],{"class":314},"{\n",[215,400,402,406,409],{"class":217,"line":401},6,[215,403,405],{"class":404},"swJcz","  imports",[215,407,408],{"class":314},":",[215,410,411],{"class":318}," [\n",[215,413,415,418],{"class":217,"line":414},7,[215,416,417],{"class":318},"    UsersModule",[215,419,420],{"class":314},",\n",[215,422,424,427,430,433,435],{"class":217,"line":423},8,[215,425,426],{"class":318},"    SwaggerModule",[215,428,429],{"class":314},".",[215,431,432],{"class":391},"configure",[215,434,395],{"class":318},[215,436,398],{"class":314},[215,438,440,443,445,447,450,453],{"class":217,"line":439},9,[215,441,442],{"class":404},"      title",[215,444,408],{"class":314},[215,446,328],{"class":314},[215,448,449],{"class":224},"My API",[215,451,452],{"class":314},"'",[215,454,420],{"class":314},[215,456,458,461,463,465,468,470],{"class":217,"line":457},10,[215,459,460],{"class":404},"      version",[215,462,408],{"class":314},[215,464,328],{"class":314},[215,466,467],{"class":224},"1.0.0",[215,469,452],{"class":314},[215,471,420],{"class":314},[215,473,475,478,480,482,485,487],{"class":217,"line":474},11,[215,476,477],{"class":404},"      description",[215,479,408],{"class":314},[215,481,328],{"class":314},[215,483,484],{"class":224},"API documentation",[215,486,452],{"class":314},[215,488,420],{"class":314},[215,490,492,495,497],{"class":217,"line":491},12,[215,493,494],{"class":404},"      servers",[215,496,408],{"class":314},[215,498,411],{"class":318},[215,500,502,505,508,510,512,515,517,520,523,525,527,530,532],{"class":217,"line":501},13,[215,503,504],{"class":314},"        {",[215,506,507],{"class":404}," url",[215,509,408],{"class":314},[215,511,328],{"class":314},[215,513,514],{"class":224},"http:\u002F\u002Flocalhost:3000",[215,516,452],{"class":314},[215,518,519],{"class":314},",",[215,521,522],{"class":404}," description",[215,524,408],{"class":314},[215,526,328],{"class":314},[215,528,529],{"class":224},"Development",[215,531,452],{"class":314},[215,533,534],{"class":314}," },\n",[215,536,538,541],{"class":217,"line":537},14,[215,539,540],{"class":318},"      ]",[215,542,420],{"class":314},[215,544,546,549,551],{"class":217,"line":545},15,[215,547,548],{"class":404},"      securitySchemes",[215,550,408],{"class":314},[215,552,553],{"class":314}," {\n",[215,555,557,560,562,564,567,569,571,574,576,578,581,583,585,588,590,592,595,597,599,601,603],{"class":217,"line":556},16,[215,558,559],{"class":404},"        bearer",[215,561,408],{"class":314},[215,563,315],{"class":314},[215,565,566],{"class":404}," type",[215,568,408],{"class":314},[215,570,328],{"class":314},[215,572,573],{"class":224},"http",[215,575,452],{"class":314},[215,577,519],{"class":314},[215,579,580],{"class":404}," scheme",[215,582,408],{"class":314},[215,584,328],{"class":314},[215,586,587],{"class":224},"bearer",[215,589,452],{"class":314},[215,591,519],{"class":314},[215,593,594],{"class":404}," bearerFormat",[215,596,408],{"class":314},[215,598,328],{"class":314},[215,600,131],{"class":224},[215,602,452],{"class":314},[215,604,534],{"class":314},[215,606,608],{"class":217,"line":607},17,[215,609,610],{"class":314},"      },\n",[215,612,614,617,620],{"class":217,"line":613},18,[215,615,616],{"class":314},"    }",[215,618,619],{"class":318},")",[215,621,420],{"class":314},[215,623,625,628],{"class":217,"line":624},19,[215,626,627],{"class":318},"  ]",[215,629,420],{"class":314},[215,631,633,636],{"class":217,"line":632},20,[215,634,635],{"class":314},"}",[215,637,638],{"class":318},")\n",[215,640,642,645,649,652],{"class":217,"line":641},21,[215,643,644],{"class":310},"export",[215,646,648],{"class":647},"spNyl"," class",[215,650,651],{"class":221}," AppModule",[215,653,654],{"class":314}," {}\n",[205,656,658],{"className":301,"code":657,"language":303,"meta":211,"style":211},"import { Miia } from '@miiajs\u002Fcore'\nimport { AppModule } from '.\u002Fapp.module.js'\n\nconst app = new Miia()\napp.register(AppModule)\nawait app.listen(3000)\n",[185,659,660,679,698,702,721,734],{"__ignoreMap":211},[215,661,662,664,666,669,671,673,675,677],{"class":217,"line":218},[215,663,311],{"class":310},[215,665,315],{"class":314},[215,667,668],{"class":318}," Miia",[215,670,322],{"class":314},[215,672,325],{"class":310},[215,674,328],{"class":314},[215,676,331],{"class":224},[215,678,334],{"class":314},[215,680,681,683,685,687,689,691,693,696],{"class":217,"line":337},[215,682,311],{"class":310},[215,684,315],{"class":314},[215,686,651],{"class":318},[215,688,322],{"class":314},[215,690,325],{"class":310},[215,692,328],{"class":314},[215,694,695],{"class":224},".\u002Fapp.module.js",[215,697,334],{"class":314},[215,699,700],{"class":217,"line":357},[215,701,382],{"emptyLinePlaceholder":381},[215,703,704,707,710,713,716,718],{"class":217,"line":378},[215,705,706],{"class":647},"const",[215,708,709],{"class":318}," app ",[215,711,712],{"class":314},"=",[215,714,715],{"class":314}," new",[215,717,668],{"class":391},[215,719,720],{"class":318},"()\n",[215,722,723,726,728,731],{"class":217,"line":385},[215,724,725],{"class":318},"app",[215,727,429],{"class":314},[215,729,730],{"class":391},"register",[215,732,733],{"class":318},"(AppModule)\n",[215,735,736,739,742,744,747,749,753],{"class":217,"line":401},[215,737,738],{"class":310},"await",[215,740,741],{"class":318}," app",[215,743,429],{"class":314},[215,745,746],{"class":391},"listen",[215,748,395],{"class":318},[215,750,752],{"class":751},"sbssI","3000",[215,754,638],{"class":318},[182,756,757],{},[758,759,760],"strong",{},"Endpoints:",[762,763,764,771],"ul",{},[765,766,767,770],"li",{},[185,768,769],{},"GET \u002Fdocs"," - Swagger UI",[765,772,773,776],{},[185,774,775],{},"GET \u002Fdocs\u002Fjson"," - OpenAPI JSON spec",[778,779,780],"tip",{},[182,781,782,783,785,786,789,790,793,794,796],{},"Place ",[185,784,289],{}," ",[758,787,788],{},"last"," in your root module's ",[185,791,792],{},"imports"," array. ",[185,795,297],{}," hooks run in registration order, and putting swagger last guarantees every controller module has already been processed by the time the spec is built.",[182,798,799,800,803,804,807,808,811,812,815,816,819,820,823],{},"::note Swagger under a global auth guard\nSwagger registers its routes with ",[185,801,802],{},"{ skipGlobalGuards: true }",", so ",[185,805,806],{},"\u002Fdocs\u002Fjson"," and the UI stay reachable even when the app has a global ",[185,809,810],{},"AuthGuard"," via ",[185,813,814],{},"app.useGuard()",". Global middleware (CORS, request logging, request-id) still applies to swagger endpoints - only guards are opted out. If you want the UI to be authenticated anyway, add an ",[185,817,818],{},"@UseGuard()","-protected reverse-proxy or wrap the ",[185,821,822],{},"\u002Fdocs"," path at the HTTP-server level.\n::",[198,825,827],{"id":826},"setup-options","Setup options",[205,829,831],{"className":301,"code":830,"language":303,"meta":211,"style":211},"interface SwaggerSetupOptions {\n  title: string                \u002F\u002F Required\n  version: string              \u002F\u002F Required\n  description?: string\n  servers?: Array\u003C{ url: string; description?: string }>\n  securitySchemes?: Record\u003Cstring, any>\n  globalSecurity?: Array\u003CRecord\u003Cstring, string[]>>\n  path?: string                \u002F\u002F Spec path (default: '\u002Fdocs\u002Fjson')\n  uiPath?: string              \u002F\u002F UI path (default: '\u002Fdocs')\n  ui?: boolean                 \u002F\u002F Serve UI (default: true)\n  swaggerOptions?: Record\u003Cstring, any>\n}\n",[185,832,833,843,857,869,880,911,935,963,975,987,1000,1019],{"__ignoreMap":211},[215,834,835,838,841],{"class":217,"line":218},[215,836,837],{"class":647},"interface",[215,839,840],{"class":221}," SwaggerSetupOptions",[215,842,553],{"class":314},[215,844,845,848,850,853],{"class":217,"line":337},[215,846,847],{"class":404},"  title",[215,849,408],{"class":314},[215,851,852],{"class":221}," string",[215,854,856],{"class":855},"sHwdD","                \u002F\u002F Required\n",[215,858,859,862,864,866],{"class":217,"line":357},[215,860,861],{"class":404},"  version",[215,863,408],{"class":314},[215,865,852],{"class":221},[215,867,868],{"class":855},"              \u002F\u002F Required\n",[215,870,871,874,877],{"class":217,"line":378},[215,872,873],{"class":404},"  description",[215,875,876],{"class":314},"?:",[215,878,879],{"class":221}," string\n",[215,881,882,885,887,890,893,895,897,899,902,904,906,908],{"class":217,"line":385},[215,883,884],{"class":404},"  servers",[215,886,876],{"class":314},[215,888,889],{"class":221}," Array",[215,891,892],{"class":314},"\u003C{",[215,894,507],{"class":404},[215,896,408],{"class":314},[215,898,852],{"class":221},[215,900,901],{"class":314},";",[215,903,522],{"class":404},[215,905,876],{"class":314},[215,907,852],{"class":221},[215,909,910],{"class":314}," }>\n",[215,912,913,916,918,921,924,927,929,932],{"class":217,"line":401},[215,914,915],{"class":404},"  securitySchemes",[215,917,876],{"class":314},[215,919,920],{"class":221}," Record",[215,922,923],{"class":314},"\u003C",[215,925,926],{"class":221},"string",[215,928,519],{"class":314},[215,930,931],{"class":221}," any",[215,933,934],{"class":314},">\n",[215,936,937,940,942,944,946,949,951,953,955,957,960],{"class":217,"line":414},[215,938,939],{"class":404},"  globalSecurity",[215,941,876],{"class":314},[215,943,889],{"class":221},[215,945,923],{"class":314},[215,947,948],{"class":221},"Record",[215,950,923],{"class":314},[215,952,926],{"class":221},[215,954,519],{"class":314},[215,956,852],{"class":221},[215,958,959],{"class":318},"[]",[215,961,962],{"class":314},">>\n",[215,964,965,968,970,972],{"class":217,"line":423},[215,966,967],{"class":404},"  path",[215,969,876],{"class":314},[215,971,852],{"class":221},[215,973,974],{"class":855},"                \u002F\u002F Spec path (default: '\u002Fdocs\u002Fjson')\n",[215,976,977,980,982,984],{"class":217,"line":439},[215,978,979],{"class":404},"  uiPath",[215,981,876],{"class":314},[215,983,852],{"class":221},[215,985,986],{"class":855},"              \u002F\u002F UI path (default: '\u002Fdocs')\n",[215,988,989,992,994,997],{"class":217,"line":457},[215,990,991],{"class":404},"  ui",[215,993,876],{"class":314},[215,995,996],{"class":221}," boolean",[215,998,999],{"class":855},"                 \u002F\u002F Serve UI (default: true)\n",[215,1001,1002,1005,1007,1009,1011,1013,1015,1017],{"class":217,"line":474},[215,1003,1004],{"class":404},"  swaggerOptions",[215,1006,876],{"class":314},[215,1008,920],{"class":221},[215,1010,923],{"class":314},[215,1012,926],{"class":221},[215,1014,519],{"class":314},[215,1016,931],{"class":221},[215,1018,934],{"class":314},[215,1020,1021],{"class":217,"line":491},[215,1022,1023],{"class":314},"}\n",[198,1025,37],{"id":1026},"decorators",[1028,1029,1031],"h3",{"id":1030},"apitag","@ApiTag",[182,1033,1034],{},"Group routes under tags (class-level):",[205,1036,1038],{"className":301,"code":1037,"language":303,"meta":211,"style":211},"@ApiTag('Users')\n@Controller('\u002Fusers')\nclass UserController {}\n",[185,1039,1040,1058,1076],{"__ignoreMap":211},[215,1041,1042,1044,1047,1049,1051,1054,1056],{"class":217,"line":218},[215,1043,388],{"class":314},[215,1045,1046],{"class":391},"ApiTag",[215,1048,395],{"class":318},[215,1050,452],{"class":314},[215,1052,1053],{"class":224},"Users",[215,1055,452],{"class":314},[215,1057,638],{"class":318},[215,1059,1060,1062,1065,1067,1069,1072,1074],{"class":217,"line":337},[215,1061,388],{"class":314},[215,1063,1064],{"class":391},"Controller",[215,1066,395],{"class":318},[215,1068,452],{"class":314},[215,1070,1071],{"class":224},"\u002Fusers",[215,1073,452],{"class":314},[215,1075,638],{"class":318},[215,1077,1078,1081,1084],{"class":217,"line":357},[215,1079,1080],{"class":647},"class",[215,1082,1083],{"class":221}," UserController",[215,1085,654],{"class":314},[1028,1087,1089],{"id":1088},"apioperation","@ApiOperation",[182,1091,1092],{},"Describe an endpoint (method-level):",[205,1094,1096],{"className":301,"code":1095,"language":303,"meta":211,"style":211},"@ApiOperation({\n  summary: 'Create a new user',\n  description: 'Creates a user and returns the created object',\n  operationId: 'createUser',\n  deprecated: false,\n})\n@Post('\u002F')\ncreate(ctx: RequestContext) {}\n",[185,1097,1098,1109,1125,1140,1156,1169,1175,1193],{"__ignoreMap":211},[215,1099,1100,1102,1105,1107],{"class":217,"line":218},[215,1101,388],{"class":314},[215,1103,1104],{"class":391},"ApiOperation",[215,1106,395],{"class":318},[215,1108,398],{"class":314},[215,1110,1111,1114,1116,1118,1121,1123],{"class":217,"line":337},[215,1112,1113],{"class":404},"  summary",[215,1115,408],{"class":314},[215,1117,328],{"class":314},[215,1119,1120],{"class":224},"Create a new user",[215,1122,452],{"class":314},[215,1124,420],{"class":314},[215,1126,1127,1129,1131,1133,1136,1138],{"class":217,"line":357},[215,1128,873],{"class":404},[215,1130,408],{"class":314},[215,1132,328],{"class":314},[215,1134,1135],{"class":224},"Creates a user and returns the created object",[215,1137,452],{"class":314},[215,1139,420],{"class":314},[215,1141,1142,1145,1147,1149,1152,1154],{"class":217,"line":378},[215,1143,1144],{"class":404},"  operationId",[215,1146,408],{"class":314},[215,1148,328],{"class":314},[215,1150,1151],{"class":224},"createUser",[215,1153,452],{"class":314},[215,1155,420],{"class":314},[215,1157,1158,1161,1163,1167],{"class":217,"line":385},[215,1159,1160],{"class":404},"  deprecated",[215,1162,408],{"class":314},[215,1164,1166],{"class":1165},"sfNiH"," false",[215,1168,420],{"class":314},[215,1170,1171,1173],{"class":217,"line":401},[215,1172,635],{"class":314},[215,1174,638],{"class":318},[215,1176,1177,1179,1182,1184,1186,1189,1191],{"class":217,"line":414},[215,1178,388],{"class":314},[215,1180,1181],{"class":391},"Post",[215,1183,395],{"class":318},[215,1185,452],{"class":314},[215,1187,1188],{"class":224},"\u002F",[215,1190,452],{"class":314},[215,1192,638],{"class":318},[215,1194,1195,1198,1201],{"class":217,"line":423},[215,1196,1197],{"class":391},"create",[215,1199,1200],{"class":318},"(ctx: RequestContext) ",[215,1202,1203],{"class":314},"{}\n",[1028,1205,1207],{"id":1206},"apiresponse","@ApiResponse",[182,1209,1210],{},"Define response schemas (method-level, stackable):",[205,1212,1214],{"className":301,"code":1213,"language":303,"meta":211,"style":211},"@ApiResponse(200, {\n  description: 'User found',\n  schema: UserResponseSchema,  \u002F\u002F Zod schema or JSON Schema\n})\n@ApiResponse(404, { description: 'User not found' })\n@Get('\u002F:id')\nfindOne(ctx: RequestContext) {}\n",[185,1215,1216,1232,1247,1262,1268,1298,1316],{"__ignoreMap":211},[215,1217,1218,1220,1223,1225,1228,1230],{"class":217,"line":218},[215,1219,388],{"class":314},[215,1221,1222],{"class":391},"ApiResponse",[215,1224,395],{"class":318},[215,1226,1227],{"class":751},"200",[215,1229,519],{"class":314},[215,1231,553],{"class":314},[215,1233,1234,1236,1238,1240,1243,1245],{"class":217,"line":337},[215,1235,873],{"class":404},[215,1237,408],{"class":314},[215,1239,328],{"class":314},[215,1241,1242],{"class":224},"User found",[215,1244,452],{"class":314},[215,1246,420],{"class":314},[215,1248,1249,1252,1254,1257,1259],{"class":217,"line":357},[215,1250,1251],{"class":404},"  schema",[215,1253,408],{"class":314},[215,1255,1256],{"class":318}," UserResponseSchema",[215,1258,519],{"class":314},[215,1260,1261],{"class":855},"  \u002F\u002F Zod schema or JSON Schema\n",[215,1263,1264,1266],{"class":217,"line":378},[215,1265,635],{"class":314},[215,1267,638],{"class":318},[215,1269,1270,1272,1274,1276,1279,1281,1283,1285,1287,1289,1292,1294,1296],{"class":217,"line":385},[215,1271,388],{"class":314},[215,1273,1222],{"class":391},[215,1275,395],{"class":318},[215,1277,1278],{"class":751},"404",[215,1280,519],{"class":314},[215,1282,315],{"class":314},[215,1284,522],{"class":404},[215,1286,408],{"class":314},[215,1288,328],{"class":314},[215,1290,1291],{"class":224},"User not found",[215,1293,452],{"class":314},[215,1295,322],{"class":314},[215,1297,638],{"class":318},[215,1299,1300,1302,1305,1307,1309,1312,1314],{"class":217,"line":401},[215,1301,388],{"class":314},[215,1303,1304],{"class":391},"Get",[215,1306,395],{"class":318},[215,1308,452],{"class":314},[215,1310,1311],{"class":224},"\u002F:id",[215,1313,452],{"class":314},[215,1315,638],{"class":318},[215,1317,1318,1321,1323],{"class":217,"line":414},[215,1319,1320],{"class":391},"findOne",[215,1322,1200],{"class":318},[215,1324,1203],{"class":314},[1028,1326,1328],{"id":1327},"apibody","@ApiBody",[182,1330,1331,1332,1335],{},"Declare the request body schema ",[758,1333,1334],{},"without"," running runtime validation (method-level):",[205,1337,1339],{"className":301,"code":1338,"language":303,"meta":211,"style":211},"import { ApiBody } from '@miiajs\u002Fswagger'\n\n@ApiBody(LoginSchema)\n@Post('\u002Flogin')\n@UseGuard(AuthGuard(LocalAuth))\nlogin(ctx: RequestContext) {}\n",[185,1340,1341,1360,1364,1374,1391,1405],{"__ignoreMap":211},[215,1342,1343,1345,1347,1350,1352,1354,1356,1358],{"class":217,"line":218},[215,1344,311],{"class":310},[215,1346,315],{"class":314},[215,1348,1349],{"class":318}," ApiBody",[215,1351,322],{"class":314},[215,1353,325],{"class":310},[215,1355,328],{"class":314},[215,1357,187],{"class":224},[215,1359,334],{"class":314},[215,1361,1362],{"class":217,"line":337},[215,1363,382],{"emptyLinePlaceholder":381},[215,1365,1366,1368,1371],{"class":217,"line":357},[215,1367,388],{"class":314},[215,1369,1370],{"class":391},"ApiBody",[215,1372,1373],{"class":318},"(LoginSchema)\n",[215,1375,1376,1378,1380,1382,1384,1387,1389],{"class":217,"line":378},[215,1377,388],{"class":314},[215,1379,1181],{"class":391},[215,1381,395],{"class":318},[215,1383,452],{"class":314},[215,1385,1386],{"class":224},"\u002Flogin",[215,1388,452],{"class":314},[215,1390,638],{"class":318},[215,1392,1393,1395,1398,1400,1402],{"class":217,"line":385},[215,1394,388],{"class":314},[215,1396,1397],{"class":391},"UseGuard",[215,1399,395],{"class":318},[215,1401,810],{"class":391},[215,1403,1404],{"class":318},"(LocalAuth))\n",[215,1406,1407,1410,1412],{"class":217,"line":401},[215,1408,1409],{"class":391},"login",[215,1411,1200],{"class":318},[215,1413,1203],{"class":314},[182,1415,1416,1417,1420,1421,1424,1425,1428],{},"Use this when the body is validated elsewhere - inside an auth provider, a custom middleware, or a strategy that reads ",[185,1418,1419],{},"ctx.json()"," directly - but you still want Swagger UI to show the expected shape. It writes to the same ",[185,1422,1423],{},"BODY_SCHEMAS"," key as ",[185,1426,1427],{},"@ValidateBody",", so the spec builder picks it up automatically.",[1430,1431,1432],"note",{},[182,1433,1434,1435,1437,1438,1441,1442,1444,1445,1447],{},"If you're already using ",[185,1436,1427],{}," on a route, you ",[758,1439,1440],{},"don't"," need ",[185,1443,1328],{}," - the schema is auto-detected from the validator. Reach for ",[185,1446,1328],{}," only when validation happens outside the route-level middleware chain.",[1028,1449,1451],{"id":1450},"apiparam","@ApiParam",[182,1453,1454],{},"Document path parameters (method-level, stackable):",[205,1456,1458],{"className":301,"code":1457,"language":303,"meta":211,"style":211},"@ApiParam('id', {\n  description: 'User ID',\n  schema: { type: 'string', format: 'uuid' },\n})\n@Get('\u002F:id')\nfindOne(ctx: RequestContext) {}\n",[185,1459,1460,1480,1495,1529,1535,1551],{"__ignoreMap":211},[215,1461,1462,1464,1467,1469,1471,1474,1476,1478],{"class":217,"line":218},[215,1463,388],{"class":314},[215,1465,1466],{"class":391},"ApiParam",[215,1468,395],{"class":318},[215,1470,452],{"class":314},[215,1472,1473],{"class":224},"id",[215,1475,452],{"class":314},[215,1477,519],{"class":314},[215,1479,553],{"class":314},[215,1481,1482,1484,1486,1488,1491,1493],{"class":217,"line":337},[215,1483,873],{"class":404},[215,1485,408],{"class":314},[215,1487,328],{"class":314},[215,1489,1490],{"class":224},"User ID",[215,1492,452],{"class":314},[215,1494,420],{"class":314},[215,1496,1497,1499,1501,1503,1505,1507,1509,1511,1513,1515,1518,1520,1522,1525,1527],{"class":217,"line":357},[215,1498,1251],{"class":404},[215,1500,408],{"class":314},[215,1502,315],{"class":314},[215,1504,566],{"class":404},[215,1506,408],{"class":314},[215,1508,328],{"class":314},[215,1510,926],{"class":224},[215,1512,452],{"class":314},[215,1514,519],{"class":314},[215,1516,1517],{"class":404}," format",[215,1519,408],{"class":314},[215,1521,328],{"class":314},[215,1523,1524],{"class":224},"uuid",[215,1526,452],{"class":314},[215,1528,534],{"class":314},[215,1530,1531,1533],{"class":217,"line":378},[215,1532,635],{"class":314},[215,1534,638],{"class":318},[215,1536,1537,1539,1541,1543,1545,1547,1549],{"class":217,"line":385},[215,1538,388],{"class":314},[215,1540,1304],{"class":391},[215,1542,395],{"class":318},[215,1544,452],{"class":314},[215,1546,1311],{"class":224},[215,1548,452],{"class":314},[215,1550,638],{"class":318},[215,1552,1553,1555,1557],{"class":217,"line":401},[215,1554,1320],{"class":391},[215,1556,1200],{"class":318},[215,1558,1203],{"class":314},[182,1560,1561,1562,1565],{},"Path parameters from ",[185,1563,1564],{},":paramName"," patterns are auto-detected.",[1028,1567,1569],{"id":1568},"apiquery","@ApiQuery",[182,1571,1572],{},"Document query parameters (method-level, stackable):",[205,1574,1576],{"className":301,"code":1575,"language":303,"meta":211,"style":211},"@ApiQuery('limit', { description: 'Max results', required: false })\n@ApiQuery('offset', { description: 'Pagination offset', required: false })\n@Get('\u002F')\nlist(ctx: RequestContext) {}\n",[185,1577,1578,1622,1664,1680],{"__ignoreMap":211},[215,1579,1580,1582,1585,1587,1589,1592,1594,1596,1598,1600,1602,1604,1607,1609,1611,1614,1616,1618,1620],{"class":217,"line":218},[215,1581,388],{"class":314},[215,1583,1584],{"class":391},"ApiQuery",[215,1586,395],{"class":318},[215,1588,452],{"class":314},[215,1590,1591],{"class":224},"limit",[215,1593,452],{"class":314},[215,1595,519],{"class":314},[215,1597,315],{"class":314},[215,1599,522],{"class":404},[215,1601,408],{"class":314},[215,1603,328],{"class":314},[215,1605,1606],{"class":224},"Max results",[215,1608,452],{"class":314},[215,1610,519],{"class":314},[215,1612,1613],{"class":404}," required",[215,1615,408],{"class":314},[215,1617,1166],{"class":1165},[215,1619,322],{"class":314},[215,1621,638],{"class":318},[215,1623,1624,1626,1628,1630,1632,1635,1637,1639,1641,1643,1645,1647,1650,1652,1654,1656,1658,1660,1662],{"class":217,"line":337},[215,1625,388],{"class":314},[215,1627,1584],{"class":391},[215,1629,395],{"class":318},[215,1631,452],{"class":314},[215,1633,1634],{"class":224},"offset",[215,1636,452],{"class":314},[215,1638,519],{"class":314},[215,1640,315],{"class":314},[215,1642,522],{"class":404},[215,1644,408],{"class":314},[215,1646,328],{"class":314},[215,1648,1649],{"class":224},"Pagination offset",[215,1651,452],{"class":314},[215,1653,519],{"class":314},[215,1655,1613],{"class":404},[215,1657,408],{"class":314},[215,1659,1166],{"class":1165},[215,1661,322],{"class":314},[215,1663,638],{"class":318},[215,1665,1666,1668,1670,1672,1674,1676,1678],{"class":217,"line":357},[215,1667,388],{"class":314},[215,1669,1304],{"class":391},[215,1671,395],{"class":318},[215,1673,452],{"class":314},[215,1675,1188],{"class":224},[215,1677,452],{"class":314},[215,1679,638],{"class":318},[215,1681,1682,1685,1687],{"class":217,"line":378},[215,1683,1684],{"class":391},"list",[215,1686,1200],{"class":318},[215,1688,1203],{"class":314},[182,1690,1691,1692,1695],{},"Query parameters from ",[185,1693,1694],{},"@ValidateQuery"," schemas are auto-detected.",[1028,1697,1699],{"id":1698},"apiheader","@ApiHeader",[182,1701,1702],{},"Document request headers (class or method-level, stackable):",[205,1704,1706],{"className":301,"code":1705,"language":303,"meta":211,"style":211},"@ApiHeader('X-Api-Key', { description: 'API key', required: true })\n@Controller('\u002Fadmin')\nclass AdminController {}\n",[185,1707,1708,1752,1769],{"__ignoreMap":211},[215,1709,1710,1712,1715,1717,1719,1722,1724,1726,1728,1730,1732,1734,1737,1739,1741,1743,1745,1748,1750],{"class":217,"line":218},[215,1711,388],{"class":314},[215,1713,1714],{"class":391},"ApiHeader",[215,1716,395],{"class":318},[215,1718,452],{"class":314},[215,1720,1721],{"class":224},"X-Api-Key",[215,1723,452],{"class":314},[215,1725,519],{"class":314},[215,1727,315],{"class":314},[215,1729,522],{"class":404},[215,1731,408],{"class":314},[215,1733,328],{"class":314},[215,1735,1736],{"class":224},"API key",[215,1738,452],{"class":314},[215,1740,519],{"class":314},[215,1742,1613],{"class":404},[215,1744,408],{"class":314},[215,1746,1747],{"class":1165}," true",[215,1749,322],{"class":314},[215,1751,638],{"class":318},[215,1753,1754,1756,1758,1760,1762,1765,1767],{"class":217,"line":337},[215,1755,388],{"class":314},[215,1757,1064],{"class":391},[215,1759,395],{"class":318},[215,1761,452],{"class":314},[215,1763,1764],{"class":224},"\u002Fadmin",[215,1766,452],{"class":314},[215,1768,638],{"class":318},[215,1770,1771,1773,1776],{"class":217,"line":357},[215,1772,1080],{"class":647},[215,1774,1775],{"class":221}," AdminController",[215,1777,654],{"class":314},[1028,1779,1781],{"id":1780},"apisecurity","@ApiSecurity",[182,1783,1784],{},"Declare security requirements (class or method-level):",[205,1786,1788],{"className":301,"code":1787,"language":303,"meta":211,"style":211},"@ApiSecurity('bearer')\n@Controller('\u002Fapi')\nclass ApiController {}\n\n\u002F\u002F With scopes\n@ApiSecurity('oauth2', ['write:users'])\n@Delete('\u002F:id')\nremove(ctx: RequestContext) {}\n",[185,1789,1790,1807,1824,1833,1837,1842,1872,1889],{"__ignoreMap":211},[215,1791,1792,1794,1797,1799,1801,1803,1805],{"class":217,"line":218},[215,1793,388],{"class":314},[215,1795,1796],{"class":391},"ApiSecurity",[215,1798,395],{"class":318},[215,1800,452],{"class":314},[215,1802,587],{"class":224},[215,1804,452],{"class":314},[215,1806,638],{"class":318},[215,1808,1809,1811,1813,1815,1817,1820,1822],{"class":217,"line":337},[215,1810,388],{"class":314},[215,1812,1064],{"class":391},[215,1814,395],{"class":318},[215,1816,452],{"class":314},[215,1818,1819],{"class":224},"\u002Fapi",[215,1821,452],{"class":314},[215,1823,638],{"class":318},[215,1825,1826,1828,1831],{"class":217,"line":357},[215,1827,1080],{"class":647},[215,1829,1830],{"class":221}," ApiController",[215,1832,654],{"class":314},[215,1834,1835],{"class":217,"line":378},[215,1836,382],{"emptyLinePlaceholder":381},[215,1838,1839],{"class":217,"line":385},[215,1840,1841],{"class":855},"\u002F\u002F With scopes\n",[215,1843,1844,1846,1848,1850,1852,1855,1857,1859,1862,1864,1867,1869],{"class":217,"line":401},[215,1845,388],{"class":314},[215,1847,1796],{"class":391},[215,1849,395],{"class":318},[215,1851,452],{"class":314},[215,1853,1854],{"class":224},"oauth2",[215,1856,452],{"class":314},[215,1858,519],{"class":314},[215,1860,1861],{"class":318}," [",[215,1863,452],{"class":314},[215,1865,1866],{"class":224},"write:users",[215,1868,452],{"class":314},[215,1870,1871],{"class":318},"])\n",[215,1873,1874,1876,1879,1881,1883,1885,1887],{"class":217,"line":414},[215,1875,388],{"class":314},[215,1877,1878],{"class":391},"Delete",[215,1880,395],{"class":318},[215,1882,452],{"class":314},[215,1884,1311],{"class":224},[215,1886,452],{"class":314},[215,1888,638],{"class":318},[215,1890,1891,1894,1896],{"class":217,"line":423},[215,1892,1893],{"class":391},"remove",[215,1895,1200],{"class":318},[215,1897,1203],{"class":314},[1028,1899,1901],{"id":1900},"apiexclude","@ApiExclude",[182,1903,1904],{},"Hide routes or controllers from the spec:",[205,1906,1908],{"className":301,"code":1907,"language":303,"meta":211,"style":211},"@ApiExclude()\n@Controller('\u002Finternal')\nclass InternalController {}\n\n\u002F\u002F Or exclude a single route\n@ApiExclude()\n@Get('\u002Fdebug')\ndebug() {}\n",[185,1909,1910,1919,1936,1945,1949,1954,1962,1979],{"__ignoreMap":211},[215,1911,1912,1914,1917],{"class":217,"line":218},[215,1913,388],{"class":314},[215,1915,1916],{"class":391},"ApiExclude",[215,1918,720],{"class":318},[215,1920,1921,1923,1925,1927,1929,1932,1934],{"class":217,"line":337},[215,1922,388],{"class":314},[215,1924,1064],{"class":391},[215,1926,395],{"class":318},[215,1928,452],{"class":314},[215,1930,1931],{"class":224},"\u002Finternal",[215,1933,452],{"class":314},[215,1935,638],{"class":318},[215,1937,1938,1940,1943],{"class":217,"line":357},[215,1939,1080],{"class":647},[215,1941,1942],{"class":221}," InternalController",[215,1944,654],{"class":314},[215,1946,1947],{"class":217,"line":378},[215,1948,382],{"emptyLinePlaceholder":381},[215,1950,1951],{"class":217,"line":385},[215,1952,1953],{"class":855},"\u002F\u002F Or exclude a single route\n",[215,1955,1956,1958,1960],{"class":217,"line":401},[215,1957,388],{"class":314},[215,1959,1916],{"class":391},[215,1961,720],{"class":318},[215,1963,1964,1966,1968,1970,1972,1975,1977],{"class":217,"line":414},[215,1965,388],{"class":314},[215,1967,1304],{"class":391},[215,1969,395],{"class":318},[215,1971,452],{"class":314},[215,1973,1974],{"class":224},"\u002Fdebug",[215,1976,452],{"class":314},[215,1978,638],{"class":318},[215,1980,1981,1984,1987],{"class":217,"line":423},[215,1982,1983],{"class":391},"debug",[215,1985,1986],{"class":318},"() ",[215,1988,1203],{"class":314},[198,1990,1992],{"id":1991},"auto-detection","Auto-detection",[182,1994,1995],{},"The spec builder automatically detects:",[762,1997,1998,2011,2020,2031,2037,2043],{},[765,1999,2000,2003,2004,2007,2008,619],{},[758,2001,2002],{},"Path parameters"," from route patterns (",[185,2005,2006],{},":id"," -> ",[185,2009,2010],{},"{id}",[765,2012,2013,2016,2017,2019],{},[758,2014,2015],{},"Query parameters"," from ",[185,2018,1694],{}," schemas",[765,2021,2022,2016,2025,2027,2028,2030],{},[758,2023,2024],{},"Request body",[185,2026,1427],{}," schemas (or ",[185,2029,1328],{}," for doc-only declarations)",[765,2032,2033,2036],{},[758,2034,2035],{},"Default responses"," (200\u002F201 based on method)",[765,2038,2039,2042],{},[758,2040,2041],{},"422 response"," when validation decorators are present",[765,2044,2045,2048],{},[758,2046,2047],{},"403 response"," when guards are present",[198,2050,2052],{"id":2051},"schema-support","Schema support",[182,2054,2055],{},"Decorators accept any ZodLike schema (Zod v3, v4, or custom) and raw JSON Schema objects:",[205,2057,2059],{"className":301,"code":2058,"language":303,"meta":211,"style":211},"import { z } from 'zod'\n\nconst UserSchema = z.object({\n  id: z.string().uuid(),\n  name: z.string().min(1).max(100),\n  email: z.string().email(),\n  role: z.enum(['user', 'admin']),\n  age: z.number().int().optional(),\n})\n\n@ApiResponse(200, { schema: UserSchema })\n",[185,2060,2061,2081,2085,2105,2129,2170,2194,2232,2264,2270,2274],{"__ignoreMap":211},[215,2062,2063,2065,2067,2070,2072,2074,2076,2079],{"class":217,"line":218},[215,2064,311],{"class":310},[215,2066,315],{"class":314},[215,2068,2069],{"class":318}," z",[215,2071,322],{"class":314},[215,2073,325],{"class":310},[215,2075,328],{"class":314},[215,2077,2078],{"class":224},"zod",[215,2080,334],{"class":314},[215,2082,2083],{"class":217,"line":337},[215,2084,382],{"emptyLinePlaceholder":381},[215,2086,2087,2089,2092,2094,2096,2098,2101,2103],{"class":217,"line":357},[215,2088,706],{"class":647},[215,2090,2091],{"class":318}," UserSchema ",[215,2093,712],{"class":314},[215,2095,2069],{"class":318},[215,2097,429],{"class":314},[215,2099,2100],{"class":391},"object",[215,2102,395],{"class":318},[215,2104,398],{"class":314},[215,2106,2107,2110,2112,2114,2116,2118,2121,2123,2125,2127],{"class":217,"line":378},[215,2108,2109],{"class":404},"  id",[215,2111,408],{"class":314},[215,2113,2069],{"class":318},[215,2115,429],{"class":314},[215,2117,926],{"class":391},[215,2119,2120],{"class":318},"()",[215,2122,429],{"class":314},[215,2124,1524],{"class":391},[215,2126,2120],{"class":318},[215,2128,420],{"class":314},[215,2130,2131,2134,2136,2138,2140,2142,2144,2146,2149,2151,2154,2156,2158,2161,2163,2166,2168],{"class":217,"line":385},[215,2132,2133],{"class":404},"  name",[215,2135,408],{"class":314},[215,2137,2069],{"class":318},[215,2139,429],{"class":314},[215,2141,926],{"class":391},[215,2143,2120],{"class":318},[215,2145,429],{"class":314},[215,2147,2148],{"class":391},"min",[215,2150,395],{"class":318},[215,2152,2153],{"class":751},"1",[215,2155,619],{"class":318},[215,2157,429],{"class":314},[215,2159,2160],{"class":391},"max",[215,2162,395],{"class":318},[215,2164,2165],{"class":751},"100",[215,2167,619],{"class":318},[215,2169,420],{"class":314},[215,2171,2172,2175,2177,2179,2181,2183,2185,2187,2190,2192],{"class":217,"line":401},[215,2173,2174],{"class":404},"  email",[215,2176,408],{"class":314},[215,2178,2069],{"class":318},[215,2180,429],{"class":314},[215,2182,926],{"class":391},[215,2184,2120],{"class":318},[215,2186,429],{"class":314},[215,2188,2189],{"class":391},"email",[215,2191,2120],{"class":318},[215,2193,420],{"class":314},[215,2195,2196,2199,2201,2203,2205,2208,2211,2213,2216,2218,2220,2222,2225,2227,2230],{"class":217,"line":414},[215,2197,2198],{"class":404},"  role",[215,2200,408],{"class":314},[215,2202,2069],{"class":318},[215,2204,429],{"class":314},[215,2206,2207],{"class":391},"enum",[215,2209,2210],{"class":318},"([",[215,2212,452],{"class":314},[215,2214,2215],{"class":224},"user",[215,2217,452],{"class":314},[215,2219,519],{"class":314},[215,2221,328],{"class":314},[215,2223,2224],{"class":224},"admin",[215,2226,452],{"class":314},[215,2228,2229],{"class":318},"])",[215,2231,420],{"class":314},[215,2233,2234,2237,2239,2241,2243,2246,2248,2250,2253,2255,2257,2260,2262],{"class":217,"line":423},[215,2235,2236],{"class":404},"  age",[215,2238,408],{"class":314},[215,2240,2069],{"class":318},[215,2242,429],{"class":314},[215,2244,2245],{"class":391},"number",[215,2247,2120],{"class":318},[215,2249,429],{"class":314},[215,2251,2252],{"class":391},"int",[215,2254,2120],{"class":318},[215,2256,429],{"class":314},[215,2258,2259],{"class":391},"optional",[215,2261,2120],{"class":318},[215,2263,420],{"class":314},[215,2265,2266,2268],{"class":217,"line":439},[215,2267,635],{"class":314},[215,2269,638],{"class":318},[215,2271,2272],{"class":217,"line":457},[215,2273,382],{"emptyLinePlaceholder":381},[215,2275,2276,2278,2280,2282,2284,2286,2288,2291,2293,2295,2297],{"class":217,"line":474},[215,2277,388],{"class":314},[215,2279,1222],{"class":391},[215,2281,395],{"class":318},[215,2283,1227],{"class":751},[215,2285,519],{"class":314},[215,2287,315],{"class":314},[215,2289,2290],{"class":404}," schema",[215,2292,408],{"class":314},[215,2294,2091],{"class":318},[215,2296,635],{"class":314},[215,2298,638],{"class":318},[182,2300,2301],{},"Zod types are converted to JSON Schema automatically.",[198,2303,2305],{"id":2304},"complete-example","Complete example",[205,2307,2309],{"className":301,"code":2308,"language":303,"meta":211,"style":211},"@ApiTag('Users')\n@ApiSecurity('bearer')\n@Controller('\u002Fusers')\n@UseGuard(AuthGuard())\nclass UserController {\n  @Get('\u002F')\n  @SkipGuard(AuthGuard)\n  @ApiOperation({ summary: 'List all users' })\n  @ApiResponse(200, { schema: z.array(UserSchema) })\n  list() {}\n\n  @Get('\u002F:id')\n  @ApiOperation({ summary: 'Get user by ID' })\n  @ApiParam('id', { description: 'User ObjectId' })\n  @ApiResponse(200, { schema: UserSchema })\n  @ApiResponse(404, { description: 'Not found' })\n  findOne(ctx: RequestContext) {}\n\n  @Post('\u002F')\n  @Status(201)\n  @ValidateBody(CreateUserSchema)\n  @ApiOperation({ summary: 'Create user' })\n  @ApiResponse(201, { schema: UserSchema })\n  create(ctx: RequestContext) {}\n\n  @Delete('\u002F:id')\n  @ApiOperation({ summary: 'Delete user' })\n  @ApiParam('id')\n  @ApiResponse(204, { description: 'Deleted' })\n  remove(ctx: RequestContext) {}\n}\n",[185,2310,2311,2327,2343,2359,2372,2380,2397,2407,2434,2466,2475,2479,2495,2520,2553,2577,2606,2626,2630,2646,2660,2670,2696,2721,2739,2744,2761,2787,2804,2835,2853],{"__ignoreMap":211},[215,2312,2313,2315,2317,2319,2321,2323,2325],{"class":217,"line":218},[215,2314,388],{"class":314},[215,2316,1046],{"class":391},[215,2318,395],{"class":318},[215,2320,452],{"class":314},[215,2322,1053],{"class":224},[215,2324,452],{"class":314},[215,2326,638],{"class":318},[215,2328,2329,2331,2333,2335,2337,2339,2341],{"class":217,"line":337},[215,2330,388],{"class":314},[215,2332,1796],{"class":391},[215,2334,395],{"class":318},[215,2336,452],{"class":314},[215,2338,587],{"class":224},[215,2340,452],{"class":314},[215,2342,638],{"class":318},[215,2344,2345,2347,2349,2351,2353,2355,2357],{"class":217,"line":357},[215,2346,388],{"class":314},[215,2348,1064],{"class":391},[215,2350,395],{"class":318},[215,2352,452],{"class":314},[215,2354,1071],{"class":224},[215,2356,452],{"class":314},[215,2358,638],{"class":318},[215,2360,2361,2363,2365,2367,2369],{"class":217,"line":378},[215,2362,388],{"class":314},[215,2364,1397],{"class":391},[215,2366,395],{"class":318},[215,2368,810],{"class":391},[215,2370,2371],{"class":318},"())\n",[215,2373,2374,2376,2378],{"class":217,"line":385},[215,2375,1080],{"class":647},[215,2377,1083],{"class":221},[215,2379,553],{"class":314},[215,2381,2382,2385,2387,2389,2391,2393,2395],{"class":217,"line":401},[215,2383,2384],{"class":314},"  @",[215,2386,1304],{"class":391},[215,2388,395],{"class":318},[215,2390,452],{"class":314},[215,2392,1188],{"class":224},[215,2394,452],{"class":314},[215,2396,638],{"class":318},[215,2398,2399,2401,2404],{"class":217,"line":414},[215,2400,2384],{"class":314},[215,2402,2403],{"class":391},"SkipGuard",[215,2405,2406],{"class":318},"(AuthGuard)\n",[215,2408,2409,2411,2413,2415,2418,2421,2423,2425,2428,2430,2432],{"class":217,"line":423},[215,2410,2384],{"class":314},[215,2412,1104],{"class":391},[215,2414,395],{"class":318},[215,2416,2417],{"class":314},"{",[215,2419,2420],{"class":404}," summary",[215,2422,408],{"class":314},[215,2424,328],{"class":314},[215,2426,2427],{"class":224},"List all users",[215,2429,452],{"class":314},[215,2431,322],{"class":314},[215,2433,638],{"class":318},[215,2435,2436,2438,2440,2442,2444,2446,2448,2450,2452,2454,2456,2459,2462,2464],{"class":217,"line":439},[215,2437,2384],{"class":314},[215,2439,1222],{"class":391},[215,2441,395],{"class":318},[215,2443,1227],{"class":751},[215,2445,519],{"class":314},[215,2447,315],{"class":314},[215,2449,2290],{"class":404},[215,2451,408],{"class":314},[215,2453,2069],{"class":318},[215,2455,429],{"class":314},[215,2457,2458],{"class":391},"array",[215,2460,2461],{"class":318},"(UserSchema) ",[215,2463,635],{"class":314},[215,2465,638],{"class":318},[215,2467,2468,2471,2473],{"class":217,"line":457},[215,2469,2470],{"class":404},"  list",[215,2472,2120],{"class":314},[215,2474,654],{"class":314},[215,2476,2477],{"class":217,"line":474},[215,2478,382],{"emptyLinePlaceholder":381},[215,2480,2481,2483,2485,2487,2489,2491,2493],{"class":217,"line":491},[215,2482,2384],{"class":314},[215,2484,1304],{"class":391},[215,2486,395],{"class":318},[215,2488,452],{"class":314},[215,2490,1311],{"class":224},[215,2492,452],{"class":314},[215,2494,638],{"class":318},[215,2496,2497,2499,2501,2503,2505,2507,2509,2511,2514,2516,2518],{"class":217,"line":501},[215,2498,2384],{"class":314},[215,2500,1104],{"class":391},[215,2502,395],{"class":318},[215,2504,2417],{"class":314},[215,2506,2420],{"class":404},[215,2508,408],{"class":314},[215,2510,328],{"class":314},[215,2512,2513],{"class":224},"Get user by ID",[215,2515,452],{"class":314},[215,2517,322],{"class":314},[215,2519,638],{"class":318},[215,2521,2522,2524,2526,2528,2530,2532,2534,2536,2538,2540,2542,2544,2547,2549,2551],{"class":217,"line":537},[215,2523,2384],{"class":314},[215,2525,1466],{"class":391},[215,2527,395],{"class":318},[215,2529,452],{"class":314},[215,2531,1473],{"class":224},[215,2533,452],{"class":314},[215,2535,519],{"class":314},[215,2537,315],{"class":314},[215,2539,522],{"class":404},[215,2541,408],{"class":314},[215,2543,328],{"class":314},[215,2545,2546],{"class":224},"User ObjectId",[215,2548,452],{"class":314},[215,2550,322],{"class":314},[215,2552,638],{"class":318},[215,2554,2555,2557,2559,2561,2563,2565,2567,2569,2571,2573,2575],{"class":217,"line":545},[215,2556,2384],{"class":314},[215,2558,1222],{"class":391},[215,2560,395],{"class":318},[215,2562,1227],{"class":751},[215,2564,519],{"class":314},[215,2566,315],{"class":314},[215,2568,2290],{"class":404},[215,2570,408],{"class":314},[215,2572,2091],{"class":318},[215,2574,635],{"class":314},[215,2576,638],{"class":318},[215,2578,2579,2581,2583,2585,2587,2589,2591,2593,2595,2597,2600,2602,2604],{"class":217,"line":556},[215,2580,2384],{"class":314},[215,2582,1222],{"class":391},[215,2584,395],{"class":318},[215,2586,1278],{"class":751},[215,2588,519],{"class":314},[215,2590,315],{"class":314},[215,2592,522],{"class":404},[215,2594,408],{"class":314},[215,2596,328],{"class":314},[215,2598,2599],{"class":224},"Not found",[215,2601,452],{"class":314},[215,2603,322],{"class":314},[215,2605,638],{"class":318},[215,2607,2608,2611,2613,2617,2619,2622,2624],{"class":217,"line":607},[215,2609,2610],{"class":404},"  findOne",[215,2612,395],{"class":314},[215,2614,2616],{"class":2615},"sHdIc","ctx",[215,2618,408],{"class":314},[215,2620,2621],{"class":221}," RequestContext",[215,2623,619],{"class":314},[215,2625,654],{"class":314},[215,2627,2628],{"class":217,"line":613},[215,2629,382],{"emptyLinePlaceholder":381},[215,2631,2632,2634,2636,2638,2640,2642,2644],{"class":217,"line":624},[215,2633,2384],{"class":314},[215,2635,1181],{"class":391},[215,2637,395],{"class":318},[215,2639,452],{"class":314},[215,2641,1188],{"class":224},[215,2643,452],{"class":314},[215,2645,638],{"class":318},[215,2647,2648,2650,2653,2655,2658],{"class":217,"line":632},[215,2649,2384],{"class":314},[215,2651,2652],{"class":391},"Status",[215,2654,395],{"class":318},[215,2656,2657],{"class":751},"201",[215,2659,638],{"class":318},[215,2661,2662,2664,2667],{"class":217,"line":641},[215,2663,2384],{"class":314},[215,2665,2666],{"class":391},"ValidateBody",[215,2668,2669],{"class":318},"(CreateUserSchema)\n",[215,2671,2673,2675,2677,2679,2681,2683,2685,2687,2690,2692,2694],{"class":217,"line":2672},22,[215,2674,2384],{"class":314},[215,2676,1104],{"class":391},[215,2678,395],{"class":318},[215,2680,2417],{"class":314},[215,2682,2420],{"class":404},[215,2684,408],{"class":314},[215,2686,328],{"class":314},[215,2688,2689],{"class":224},"Create user",[215,2691,452],{"class":314},[215,2693,322],{"class":314},[215,2695,638],{"class":318},[215,2697,2699,2701,2703,2705,2707,2709,2711,2713,2715,2717,2719],{"class":217,"line":2698},23,[215,2700,2384],{"class":314},[215,2702,1222],{"class":391},[215,2704,395],{"class":318},[215,2706,2657],{"class":751},[215,2708,519],{"class":314},[215,2710,315],{"class":314},[215,2712,2290],{"class":404},[215,2714,408],{"class":314},[215,2716,2091],{"class":318},[215,2718,635],{"class":314},[215,2720,638],{"class":318},[215,2722,2724,2727,2729,2731,2733,2735,2737],{"class":217,"line":2723},24,[215,2725,2726],{"class":404},"  create",[215,2728,395],{"class":314},[215,2730,2616],{"class":2615},[215,2732,408],{"class":314},[215,2734,2621],{"class":221},[215,2736,619],{"class":314},[215,2738,654],{"class":314},[215,2740,2742],{"class":217,"line":2741},25,[215,2743,382],{"emptyLinePlaceholder":381},[215,2745,2747,2749,2751,2753,2755,2757,2759],{"class":217,"line":2746},26,[215,2748,2384],{"class":314},[215,2750,1878],{"class":391},[215,2752,395],{"class":318},[215,2754,452],{"class":314},[215,2756,1311],{"class":224},[215,2758,452],{"class":314},[215,2760,638],{"class":318},[215,2762,2764,2766,2768,2770,2772,2774,2776,2778,2781,2783,2785],{"class":217,"line":2763},27,[215,2765,2384],{"class":314},[215,2767,1104],{"class":391},[215,2769,395],{"class":318},[215,2771,2417],{"class":314},[215,2773,2420],{"class":404},[215,2775,408],{"class":314},[215,2777,328],{"class":314},[215,2779,2780],{"class":224},"Delete user",[215,2782,452],{"class":314},[215,2784,322],{"class":314},[215,2786,638],{"class":318},[215,2788,2790,2792,2794,2796,2798,2800,2802],{"class":217,"line":2789},28,[215,2791,2384],{"class":314},[215,2793,1466],{"class":391},[215,2795,395],{"class":318},[215,2797,452],{"class":314},[215,2799,1473],{"class":224},[215,2801,452],{"class":314},[215,2803,638],{"class":318},[215,2805,2807,2809,2811,2813,2816,2818,2820,2822,2824,2826,2829,2831,2833],{"class":217,"line":2806},29,[215,2808,2384],{"class":314},[215,2810,1222],{"class":391},[215,2812,395],{"class":318},[215,2814,2815],{"class":751},"204",[215,2817,519],{"class":314},[215,2819,315],{"class":314},[215,2821,522],{"class":404},[215,2823,408],{"class":314},[215,2825,328],{"class":314},[215,2827,2828],{"class":224},"Deleted",[215,2830,452],{"class":314},[215,2832,322],{"class":314},[215,2834,638],{"class":318},[215,2836,2838,2841,2843,2845,2847,2849,2851],{"class":217,"line":2837},30,[215,2839,2840],{"class":404},"  remove",[215,2842,395],{"class":314},[215,2844,2616],{"class":2615},[215,2846,408],{"class":314},[215,2848,2621],{"class":221},[215,2850,619],{"class":314},[215,2852,654],{"class":314},[215,2854,2856],{"class":217,"line":2855},31,[215,2857,1023],{"class":314},[198,2859,33],{"id":2860},"testing",[182,2862,2863,2864,2016,2867,2870,2871,2874,2875,2877,2878,2881],{},"Use ",[185,2865,2866],{},"TestApp",[185,2868,2869],{},"@miiajs\u002Fcore\u002Ftesting",". ",[185,2872,2873],{},"compile()"," runs the full app lifecycle, including ",[185,2876,297],{},", so swagger routes are wired up before any ",[185,2879,2880],{},"request()"," call.",[205,2883,2885],{"className":301,"code":2884,"language":303,"meta":211,"style":211},"import { describe, it, expect } from 'bun:test'\nimport { Module } from '@miiajs\u002Fcore'\nimport { TestApp } from '@miiajs\u002Fcore\u002Ftesting'\nimport { SwaggerModule } from '@miiajs\u002Fswagger'\n\n@Module({\n  imports: [\n    UsersModule,\n    SwaggerModule.configure({ title: 'Test API', version: '1.0.0' }),\n  ],\n})\nclass AppModule {}\n\ndescribe('swagger spec', () => {\n  it('lists every controller route', async () => {\n    const app = await TestApp.create(AppModule).compile()\n\n    const res = await app.request('GET', '\u002Fdocs\u002Fjson')\n    const spec = await res.json()\n\n    expect(spec.paths['\u002Fusers']).toBeDefined()\n    expect(spec.paths['\u002Fusers\u002F{id}']).toBeDefined()\n\n    await app.close()\n  })\n})\n",[185,2886,2887,2917,2935,2954,2972,2976,2986,2994,3000,3043,3049,3055,3063,3067,3091,3116,3149,3153,3190,3210,3214,3247,3276,3280,3294,3301],{"__ignoreMap":211},[215,2888,2889,2891,2893,2896,2898,2901,2903,2906,2908,2910,2912,2915],{"class":217,"line":218},[215,2890,311],{"class":310},[215,2892,315],{"class":314},[215,2894,2895],{"class":318}," describe",[215,2897,519],{"class":314},[215,2899,2900],{"class":318}," it",[215,2902,519],{"class":314},[215,2904,2905],{"class":318}," expect",[215,2907,322],{"class":314},[215,2909,325],{"class":310},[215,2911,328],{"class":314},[215,2913,2914],{"class":224},"bun:test",[215,2916,334],{"class":314},[215,2918,2919,2921,2923,2925,2927,2929,2931,2933],{"class":217,"line":337},[215,2920,311],{"class":310},[215,2922,315],{"class":314},[215,2924,319],{"class":318},[215,2926,322],{"class":314},[215,2928,325],{"class":310},[215,2930,328],{"class":314},[215,2932,331],{"class":224},[215,2934,334],{"class":314},[215,2936,2937,2939,2941,2944,2946,2948,2950,2952],{"class":217,"line":357},[215,2938,311],{"class":310},[215,2940,315],{"class":314},[215,2942,2943],{"class":318}," TestApp",[215,2945,322],{"class":314},[215,2947,325],{"class":310},[215,2949,328],{"class":314},[215,2951,2869],{"class":224},[215,2953,334],{"class":314},[215,2955,2956,2958,2960,2962,2964,2966,2968,2970],{"class":217,"line":378},[215,2957,311],{"class":310},[215,2959,315],{"class":314},[215,2961,344],{"class":318},[215,2963,322],{"class":314},[215,2965,325],{"class":310},[215,2967,328],{"class":314},[215,2969,187],{"class":224},[215,2971,334],{"class":314},[215,2973,2974],{"class":217,"line":385},[215,2975,382],{"emptyLinePlaceholder":381},[215,2977,2978,2980,2982,2984],{"class":217,"line":401},[215,2979,388],{"class":314},[215,2981,392],{"class":391},[215,2983,395],{"class":318},[215,2985,398],{"class":314},[215,2987,2988,2990,2992],{"class":217,"line":414},[215,2989,405],{"class":404},[215,2991,408],{"class":314},[215,2993,411],{"class":318},[215,2995,2996,2998],{"class":217,"line":423},[215,2997,417],{"class":318},[215,2999,420],{"class":314},[215,3001,3002,3004,3006,3008,3010,3012,3015,3017,3019,3022,3024,3026,3029,3031,3033,3035,3037,3039,3041],{"class":217,"line":439},[215,3003,426],{"class":318},[215,3005,429],{"class":314},[215,3007,432],{"class":391},[215,3009,395],{"class":318},[215,3011,2417],{"class":314},[215,3013,3014],{"class":404}," title",[215,3016,408],{"class":314},[215,3018,328],{"class":314},[215,3020,3021],{"class":224},"Test API",[215,3023,452],{"class":314},[215,3025,519],{"class":314},[215,3027,3028],{"class":404}," version",[215,3030,408],{"class":314},[215,3032,328],{"class":314},[215,3034,467],{"class":224},[215,3036,452],{"class":314},[215,3038,322],{"class":314},[215,3040,619],{"class":318},[215,3042,420],{"class":314},[215,3044,3045,3047],{"class":217,"line":457},[215,3046,627],{"class":318},[215,3048,420],{"class":314},[215,3050,3051,3053],{"class":217,"line":474},[215,3052,635],{"class":314},[215,3054,638],{"class":318},[215,3056,3057,3059,3061],{"class":217,"line":491},[215,3058,1080],{"class":647},[215,3060,651],{"class":221},[215,3062,654],{"class":314},[215,3064,3065],{"class":217,"line":501},[215,3066,382],{"emptyLinePlaceholder":381},[215,3068,3069,3072,3074,3076,3079,3081,3083,3086,3089],{"class":217,"line":537},[215,3070,3071],{"class":391},"describe",[215,3073,395],{"class":318},[215,3075,452],{"class":314},[215,3077,3078],{"class":224},"swagger spec",[215,3080,452],{"class":314},[215,3082,519],{"class":314},[215,3084,3085],{"class":314}," ()",[215,3087,3088],{"class":647}," =>",[215,3090,553],{"class":314},[215,3092,3093,3096,3098,3100,3103,3105,3107,3110,3112,3114],{"class":217,"line":545},[215,3094,3095],{"class":391},"  it",[215,3097,395],{"class":404},[215,3099,452],{"class":314},[215,3101,3102],{"class":224},"lists every controller route",[215,3104,452],{"class":314},[215,3106,519],{"class":314},[215,3108,3109],{"class":647}," async",[215,3111,3085],{"class":314},[215,3113,3088],{"class":647},[215,3115,553],{"class":314},[215,3117,3118,3121,3123,3126,3129,3131,3133,3135,3137,3140,3142,3144,3147],{"class":217,"line":556},[215,3119,3120],{"class":647},"    const",[215,3122,741],{"class":318},[215,3124,3125],{"class":314}," =",[215,3127,3128],{"class":310}," await",[215,3130,2943],{"class":318},[215,3132,429],{"class":314},[215,3134,1197],{"class":391},[215,3136,395],{"class":404},[215,3138,3139],{"class":318},"AppModule",[215,3141,619],{"class":404},[215,3143,429],{"class":314},[215,3145,3146],{"class":391},"compile",[215,3148,720],{"class":404},[215,3150,3151],{"class":217,"line":607},[215,3152,382],{"emptyLinePlaceholder":381},[215,3154,3155,3157,3160,3162,3164,3166,3168,3171,3173,3175,3178,3180,3182,3184,3186,3188],{"class":217,"line":613},[215,3156,3120],{"class":647},[215,3158,3159],{"class":318}," res",[215,3161,3125],{"class":314},[215,3163,3128],{"class":310},[215,3165,741],{"class":318},[215,3167,429],{"class":314},[215,3169,3170],{"class":391},"request",[215,3172,395],{"class":404},[215,3174,452],{"class":314},[215,3176,3177],{"class":224},"GET",[215,3179,452],{"class":314},[215,3181,519],{"class":314},[215,3183,328],{"class":314},[215,3185,806],{"class":224},[215,3187,452],{"class":314},[215,3189,638],{"class":404},[215,3191,3192,3194,3197,3199,3201,3203,3205,3208],{"class":217,"line":624},[215,3193,3120],{"class":647},[215,3195,3196],{"class":318}," spec",[215,3198,3125],{"class":314},[215,3200,3128],{"class":310},[215,3202,3159],{"class":318},[215,3204,429],{"class":314},[215,3206,3207],{"class":391},"json",[215,3209,720],{"class":404},[215,3211,3212],{"class":217,"line":632},[215,3213,382],{"emptyLinePlaceholder":381},[215,3215,3216,3219,3221,3224,3226,3229,3232,3234,3236,3238,3240,3242,3245],{"class":217,"line":641},[215,3217,3218],{"class":391},"    expect",[215,3220,395],{"class":404},[215,3222,3223],{"class":318},"spec",[215,3225,429],{"class":314},[215,3227,3228],{"class":318},"paths",[215,3230,3231],{"class":404},"[",[215,3233,452],{"class":314},[215,3235,1071],{"class":224},[215,3237,452],{"class":314},[215,3239,2229],{"class":404},[215,3241,429],{"class":314},[215,3243,3244],{"class":391},"toBeDefined",[215,3246,720],{"class":404},[215,3248,3249,3251,3253,3255,3257,3259,3261,3263,3266,3268,3270,3272,3274],{"class":217,"line":2672},[215,3250,3218],{"class":391},[215,3252,395],{"class":404},[215,3254,3223],{"class":318},[215,3256,429],{"class":314},[215,3258,3228],{"class":318},[215,3260,3231],{"class":404},[215,3262,452],{"class":314},[215,3264,3265],{"class":224},"\u002Fusers\u002F{id}",[215,3267,452],{"class":314},[215,3269,2229],{"class":404},[215,3271,429],{"class":314},[215,3273,3244],{"class":391},[215,3275,720],{"class":404},[215,3277,3278],{"class":217,"line":2698},[215,3279,382],{"emptyLinePlaceholder":381},[215,3281,3282,3285,3287,3289,3292],{"class":217,"line":2723},[215,3283,3284],{"class":310},"    await",[215,3286,741],{"class":318},[215,3288,429],{"class":314},[215,3290,3291],{"class":391},"close",[215,3293,720],{"class":404},[215,3295,3296,3299],{"class":217,"line":2741},[215,3297,3298],{"class":314},"  }",[215,3300,638],{"class":404},[215,3302,3303,3305],{"class":217,"line":2746},[215,3304,635],{"class":314},[215,3306,638],{"class":318},[198,3308,3310],{"id":3309},"exports","Exports",[205,3312,3314],{"className":301,"code":3313,"language":303,"meta":211,"style":211},"import {\n  SwaggerModule,\n  SwaggerService,\n  SWAGGER_OPTIONS,\n  ApiTag,\n  ApiOperation,\n  ApiResponse,\n  ApiBody,\n  ApiParam,\n  ApiQuery,\n  ApiSecurity,\n  ApiHeader,\n  ApiExclude,\n  SpecBuilder,\n  convertSchema,\n} from '@miiajs\u002Fswagger'\n",[185,3315,3316,3322,3329,3336,3343,3350,3357,3364,3371,3378,3385,3392,3399,3406,3413,3420],{"__ignoreMap":211},[215,3317,3318,3320],{"class":217,"line":218},[215,3319,311],{"class":310},[215,3321,553],{"class":314},[215,3323,3324,3327],{"class":217,"line":337},[215,3325,3326],{"class":318},"  SwaggerModule",[215,3328,420],{"class":314},[215,3330,3331,3334],{"class":217,"line":357},[215,3332,3333],{"class":318},"  SwaggerService",[215,3335,420],{"class":314},[215,3337,3338,3341],{"class":217,"line":378},[215,3339,3340],{"class":318},"  SWAGGER_OPTIONS",[215,3342,420],{"class":314},[215,3344,3345,3348],{"class":217,"line":385},[215,3346,3347],{"class":318},"  ApiTag",[215,3349,420],{"class":314},[215,3351,3352,3355],{"class":217,"line":401},[215,3353,3354],{"class":318},"  ApiOperation",[215,3356,420],{"class":314},[215,3358,3359,3362],{"class":217,"line":414},[215,3360,3361],{"class":318},"  ApiResponse",[215,3363,420],{"class":314},[215,3365,3366,3369],{"class":217,"line":423},[215,3367,3368],{"class":318},"  ApiBody",[215,3370,420],{"class":314},[215,3372,3373,3376],{"class":217,"line":439},[215,3374,3375],{"class":318},"  ApiParam",[215,3377,420],{"class":314},[215,3379,3380,3383],{"class":217,"line":457},[215,3381,3382],{"class":318},"  ApiQuery",[215,3384,420],{"class":314},[215,3386,3387,3390],{"class":217,"line":474},[215,3388,3389],{"class":318},"  ApiSecurity",[215,3391,420],{"class":314},[215,3393,3394,3397],{"class":217,"line":491},[215,3395,3396],{"class":318},"  ApiHeader",[215,3398,420],{"class":314},[215,3400,3401,3404],{"class":217,"line":501},[215,3402,3403],{"class":318},"  ApiExclude",[215,3405,420],{"class":314},[215,3407,3408,3411],{"class":217,"line":537},[215,3409,3410],{"class":318},"  SpecBuilder",[215,3412,420],{"class":314},[215,3414,3415,3418],{"class":217,"line":545},[215,3416,3417],{"class":318},"  convertSchema",[215,3419,420],{"class":314},[215,3421,3422,3424,3426,3428,3430],{"class":217,"line":556},[215,3423,635],{"class":314},[215,3425,325],{"class":310},[215,3427,328],{"class":314},[215,3429,187],{"class":224},[215,3431,334],{"class":314},[3433,3434,3435],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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}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}",{"title":211,"searchDepth":337,"depth":337,"links":3437},[3438,3439,3440,3441,3452,3453,3454,3455,3456],{"id":200,"depth":337,"text":13},{"id":283,"depth":337,"text":284},{"id":826,"depth":337,"text":827},{"id":1026,"depth":337,"text":37,"children":3442},[3443,3444,3445,3446,3447,3448,3449,3450,3451],{"id":1030,"depth":357,"text":1031},{"id":1088,"depth":357,"text":1089},{"id":1206,"depth":357,"text":1207},{"id":1327,"depth":357,"text":1328},{"id":1450,"depth":357,"text":1451},{"id":1568,"depth":357,"text":1569},{"id":1698,"depth":357,"text":1699},{"id":1780,"depth":357,"text":1781},{"id":1900,"depth":357,"text":1901},{"id":1991,"depth":337,"text":1992},{"id":2051,"depth":337,"text":2052},{"id":2304,"depth":337,"text":2305},{"id":2860,"depth":337,"text":33},{"id":3309,"depth":337,"text":3310},"Generate OpenAPI 3.1 specs and serve Swagger UI from controller metadata.","md",{},{"title":147,"description":3457},"uVM4mGEQJEYo_zecEsX9nh6QiWmybnegqfywMgXiQHM",[3463,3465],{"title":143,"path":144,"stem":145,"description":3464,"children":-1},"MongoDB integration via Mongoose with injectable models, multi-connection support, and standard `inject()` API.",{"title":151,"path":152,"stem":153,"description":3466,"children":-1},"Node.js HTTP server adapter with optimized request\u002Fresponse handling.",1778575274289]