[{"data":1,"prerenderedAt":1553},["ShallowReactive",2],{"navigation":3,"docs-path-index":208,"-docs-modules-nitro-middleware":272,"-docs-modules-nitro-middleware-surround":1548},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":52},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,26,53,169,190],{"title":11,"path":12,"stem":13,"children":14,"icon":25},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F1.getting-started\u002F3.examples","i-lucide-rocket",{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":52},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[32,36,40,44,48],{"title":33,"path":34,"stem":35},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":37,"path":38,"stem":39},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":41,"path":42,"stem":43},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":45,"path":46,"stem":47},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":49,"path":50,"stem":51},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",false,{"title":54,"icon":55,"defaultOpen":56,"path":57,"stem":58,"children":59,"page":52},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[60,77,93,101,116,127,142,161],{"title":61,"icon":52,"defaultOpen":52,"path":62,"stem":63,"children":64,"page":52},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[65,69,73],{"title":66,"path":67,"stem":68},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":70,"path":71,"stem":72},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":74,"path":75,"stem":76},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":78,"icon":52,"defaultOpen":52,"path":79,"stem":80,"children":81,"page":52},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[82,85,89],{"title":66,"path":83,"stem":84},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":86,"path":87,"stem":88},"Drains & Adapters","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":90,"path":91,"stem":92},"API","\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":94,"icon":52,"defaultOpen":52,"path":95,"stem":96,"children":97,"page":52},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[98],{"title":66,"path":99,"stem":100},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":102,"icon":52,"defaultOpen":52,"path":103,"stem":104,"children":105,"page":52},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[106,109,113],{"title":66,"path":107,"stem":108},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":110,"path":111,"stem":112},"Drivers","\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":90,"path":114,"stem":115},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":117,"icon":52,"defaultOpen":52,"path":118,"stem":119,"children":120,"page":52},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[121,124],{"title":66,"path":122,"stem":123},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":90,"path":125,"stem":126},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":128,"icon":52,"defaultOpen":52,"path":129,"stem":130,"children":131,"page":52},"Schema","\u002Fdocs\u002Fmodules\u002Fschema","docs\u002F3.modules\u002F6.schema",[132,135,138],{"title":66,"path":133,"stem":134},"\u002Fdocs\u002Fmodules\u002Fschema\u002Foverview","docs\u002F3.modules\u002F6.schema\u002F0.overview",{"title":70,"path":136,"stem":137},"\u002Fdocs\u002Fmodules\u002Fschema\u002Fdecorators","docs\u002F3.modules\u002F6.schema\u002F1.decorators",{"title":139,"path":140,"stem":141},"Scalar","\u002Fdocs\u002Fmodules\u002Fschema\u002Fscalar","docs\u002F3.modules\u002F6.schema\u002F2.scalar",{"title":143,"icon":52,"defaultOpen":52,"path":144,"stem":145,"children":146,"page":52},"Nitro","\u002Fdocs\u002Fmodules\u002Fnitro","docs\u002F3.modules\u002F7.nitro",[147,150,153,157],{"title":66,"path":148,"stem":149},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Foverview","docs\u002F3.modules\u002F7.nitro\u002F0.overview",{"title":102,"path":151,"stem":152},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Fstorage","docs\u002F3.modules\u002F7.nitro\u002F1.storage",{"title":154,"path":155,"stem":156},"File-Based Routes","\u002Fdocs\u002Fmodules\u002Fnitro\u002Ffile-based-routes","docs\u002F3.modules\u002F7.nitro\u002F2.file-based-routes",{"title":158,"path":159,"stem":160},"Middleware","\u002Fdocs\u002Fmodules\u002Fnitro\u002Fmiddleware","docs\u002F3.modules\u002F7.nitro\u002F3.middleware",{"title":162,"icon":52,"defaultOpen":52,"path":163,"stem":164,"children":165,"page":52},"Vite","\u002Fdocs\u002Fmodules\u002Fvite","docs\u002F3.modules\u002F8.vite",[166],{"title":66,"path":167,"stem":168},"\u002Fdocs\u002Fmodules\u002Fvite\u002Foverview","docs\u002F3.modules\u002F8.vite\u002F0.overview",{"title":170,"icon":171,"path":172,"stem":173,"children":174,"page":52},"Deployment","i-lucide-cloud-upload","\u002Fdocs\u002Fdeployment","docs\u002F4.deployment",[175,178,182,186],{"title":66,"path":176,"stem":177},"\u002Fdocs\u002Fdeployment\u002Foverview","docs\u002F4.deployment\u002F0.overview",{"title":179,"path":180,"stem":181},"Vercel","\u002Fdocs\u002Fdeployment\u002Fvercel","docs\u002F4.deployment\u002F1.vercel",{"title":183,"path":184,"stem":185},"AWS Lambda","\u002Fdocs\u002Fdeployment\u002Faws-lambda","docs\u002F4.deployment\u002F2.aws-lambda",{"title":187,"path":188,"stem":189},"Azure Functions","\u002Fdocs\u002Fdeployment\u002Fazure-functions","docs\u002F4.deployment\u002F3.azure-functions",{"title":191,"icon":192,"path":193,"stem":194,"children":195,"page":52},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[196,200,204],{"title":197,"path":198,"stem":199},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":201,"path":202,"stem":203},"Plugins","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",{"title":205,"path":206,"stem":207},"Custom CLI Command","\u002Fdocs\u002Fadvanced\u002Fcustom-cli-command","docs\u002F99.advanced\u002F3.custom-cli-command",[209,211,213,214,215,216,218,219,220,221,222,223,225,227,228,229,230,232,233,234,235,237,238,240,241,242,243,245,246,247,249,250,251,252,254,255,256,257,258,260,261,263,264,265,266,267,269,270,271],{"path":210},"\u002Fdocs\u002F.navigation",{"path":212},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":217},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":34},{"path":38},{"path":42},{"path":46},{"path":50},{"path":224},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":226},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":67},{"path":71},{"path":75},{"path":231},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":83},{"path":87},{"path":91},{"path":236},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":99},{"path":239},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":107},{"path":111},{"path":114},{"path":244},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":122},{"path":125},{"path":248},"\u002Fdocs\u002Fmodules\u002Fschema\u002F.navigation",{"path":133},{"path":136},{"path":140},{"path":253},"\u002Fdocs\u002Fmodules\u002Fnitro\u002F.navigation",{"path":148},{"path":151},{"path":155},{"path":159},{"path":259},"\u002Fdocs\u002Fmodules\u002Fvite\u002F.navigation",{"path":167},{"path":262},"\u002Fdocs\u002Fdeployment\u002F.navigation",{"path":176},{"path":180},{"path":184},{"path":188},{"path":268},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":198},{"path":202},{"path":206},{"id":273,"title":158,"body":274,"description":1542,"extension":1543,"links":1544,"meta":1545,"navigation":56,"path":159,"seo":1546,"stem":160,"__hash__":1547},"docs\u002Fdocs\u002F3.modules\u002F7.nitro\u002F3.middleware.md",{"type":275,"value":276,"toc":1535},"minimark",[277,286,291,305,313,317,326,557,804,808,815,1110,1114,1126,1146,1316,1442,1446,1499,1502,1531],[278,279,280,281,285],"p",{},"Vercube middleware classes placed in the ",[282,283,284],"code",{},"middleware\u002F"," directory are automatically detected and excluded from Nitro's native middleware handling. This prevents Nitro from trying to auto-register them as H3 middleware, which would cause errors since they are not standard Nitro event handlers.",[287,288,290],"h2",{"id":289},"how-it-works","How It Works",[278,292,293,294,296,297,300,301,304],{},"At build time the module scans the ",[282,295,284],{}," directory (hardcoded in Nitro) and looks for classes that extend ",[282,298,299],{},"BaseMiddleware"," from ",[282,302,303],{},"@vercube\u002Fcore",". Any matching file is added to Nitro's ignore list so Nitro's own file scanner skips it.",[278,306,307,308,312],{},"The middleware classes are ",[309,310,311],"strong",{},"not"," bound to the DI container automatically - Vercube handles middleware registration differently and does not require it.",[287,314,316],{"id":315},"creating-a-middleware","Creating a Middleware",[278,318,319,320,322,323,325],{},"Extend ",[282,321,299],{}," and place the file inside your ",[282,324,284],{}," directory:",[327,328,334],"pre",{"className":329,"code":330,"filename":331,"language":332,"meta":333,"style":333},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { BaseMiddleware, UnauthorizedError } from '@vercube\u002Fcore';\n\nexport class AuthMiddleware extends BaseMiddleware {\n  public async onRequest(request: Request): Promise\u003Cvoid> {\n    const token = request.headers.get('authorization');\n\n    if (!token) {\n      throw new UnauthorizedError('Missing authorization header');\n    }\n  }\n}\n","src\u002Fmiddleware\u002FAuthMiddleware.ts","ts","",[282,335,336,377,383,405,448,489,494,515,539,545,551],{"__ignoreMap":333},[337,338,341,345,349,353,356,359,362,365,368,371,374],"span",{"class":339,"line":340},"line",1,[337,342,344],{"class":343},"s7zQu","import",[337,346,348],{"class":347},"sMK4o"," {",[337,350,352],{"class":351},"sTEyZ"," BaseMiddleware",[337,354,355],{"class":347},",",[337,357,358],{"class":351}," UnauthorizedError",[337,360,361],{"class":347}," }",[337,363,364],{"class":343}," from",[337,366,367],{"class":347}," '",[337,369,303],{"class":370},"sfazB",[337,372,373],{"class":347},"'",[337,375,376],{"class":347},";\n",[337,378,380],{"class":339,"line":379},2,[337,381,382],{"emptyLinePlaceholder":56},"\n",[337,384,386,389,393,397,400,402],{"class":339,"line":385},3,[337,387,388],{"class":343},"export",[337,390,392],{"class":391},"spNyl"," class",[337,394,396],{"class":395},"sBMFI"," AuthMiddleware",[337,398,399],{"class":391}," extends",[337,401,352],{"class":395},[337,403,404],{"class":347}," {\n",[337,406,408,411,414,418,421,425,428,431,434,437,440,443,446],{"class":339,"line":407},4,[337,409,410],{"class":391},"  public",[337,412,413],{"class":391}," async",[337,415,417],{"class":416},"swJcz"," onRequest",[337,419,420],{"class":347},"(",[337,422,424],{"class":423},"sHdIc","request",[337,426,427],{"class":347},":",[337,429,430],{"class":395}," Request",[337,432,433],{"class":347},"):",[337,435,436],{"class":395}," Promise",[337,438,439],{"class":347},"\u003C",[337,441,442],{"class":395},"void",[337,444,445],{"class":347},">",[337,447,404],{"class":347},[337,449,451,454,457,460,463,466,469,471,475,477,479,482,484,487],{"class":339,"line":450},5,[337,452,453],{"class":391},"    const",[337,455,456],{"class":351}," token",[337,458,459],{"class":347}," =",[337,461,462],{"class":351}," request",[337,464,465],{"class":347},".",[337,467,468],{"class":351},"headers",[337,470,465],{"class":347},[337,472,474],{"class":473},"s2Zo4","get",[337,476,420],{"class":416},[337,478,373],{"class":347},[337,480,481],{"class":370},"authorization",[337,483,373],{"class":347},[337,485,486],{"class":416},")",[337,488,376],{"class":347},[337,490,492],{"class":339,"line":491},6,[337,493,382],{"emptyLinePlaceholder":56},[337,495,497,500,503,506,509,512],{"class":339,"line":496},7,[337,498,499],{"class":343},"    if",[337,501,502],{"class":416}," (",[337,504,505],{"class":347},"!",[337,507,508],{"class":351},"token",[337,510,511],{"class":416},") ",[337,513,514],{"class":347},"{\n",[337,516,518,521,524,526,528,530,533,535,537],{"class":339,"line":517},8,[337,519,520],{"class":343},"      throw",[337,522,523],{"class":347}," new",[337,525,358],{"class":473},[337,527,420],{"class":416},[337,529,373],{"class":347},[337,531,532],{"class":370},"Missing authorization header",[337,534,373],{"class":347},[337,536,486],{"class":416},[337,538,376],{"class":347},[337,540,542],{"class":339,"line":541},9,[337,543,544],{"class":347},"    }\n",[337,546,548],{"class":339,"line":547},10,[337,549,550],{"class":347},"  }\n",[337,552,554],{"class":339,"line":553},11,[337,555,556],{"class":347},"}\n",[327,558,561],{"className":329,"code":559,"filename":560,"language":332,"meta":333,"style":333},"import { BaseMiddleware } from '@vercube\u002Fcore';\n\nexport class LogMiddleware extends BaseMiddleware {\n  public async onRequest(request: Request): Promise\u003Cvoid> {\n    console.log(`[${new Date().toISOString()}] ${request.method} ${request.url}`);\n  }\n\n  public async onResponse(request: Request, response: Response): Promise\u003Cvoid> {\n    console.log(`[${new Date().toISOString()}] ${response.status}`);\n  }\n}\n","src\u002Fmiddleware\u002FLogMiddleware.ts",[282,562,563,583,587,602,630,701,705,709,748,796,800],{"__ignoreMap":333},[337,564,565,567,569,571,573,575,577,579,581],{"class":339,"line":340},[337,566,344],{"class":343},[337,568,348],{"class":347},[337,570,352],{"class":351},[337,572,361],{"class":347},[337,574,364],{"class":343},[337,576,367],{"class":347},[337,578,303],{"class":370},[337,580,373],{"class":347},[337,582,376],{"class":347},[337,584,585],{"class":339,"line":379},[337,586,382],{"emptyLinePlaceholder":56},[337,588,589,591,593,596,598,600],{"class":339,"line":385},[337,590,388],{"class":343},[337,592,392],{"class":391},[337,594,595],{"class":395}," LogMiddleware",[337,597,399],{"class":391},[337,599,352],{"class":395},[337,601,404],{"class":347},[337,603,604,606,608,610,612,614,616,618,620,622,624,626,628],{"class":339,"line":407},[337,605,410],{"class":391},[337,607,413],{"class":391},[337,609,417],{"class":416},[337,611,420],{"class":347},[337,613,424],{"class":423},[337,615,427],{"class":347},[337,617,430],{"class":395},[337,619,433],{"class":347},[337,621,436],{"class":395},[337,623,439],{"class":347},[337,625,442],{"class":395},[337,627,445],{"class":347},[337,629,404],{"class":347},[337,631,632,635,637,640,642,645,648,651,654,657,660,662,665,667,670,673,675,677,679,682,684,687,689,691,694,697,699],{"class":339,"line":450},[337,633,634],{"class":351},"    console",[337,636,465],{"class":347},[337,638,639],{"class":473},"log",[337,641,420],{"class":416},[337,643,644],{"class":347},"`",[337,646,647],{"class":370},"[",[337,649,650],{"class":347},"${",[337,652,653],{"class":347},"new",[337,655,656],{"class":473}," Date",[337,658,659],{"class":351},"()",[337,661,465],{"class":347},[337,663,664],{"class":473},"toISOString",[337,666,659],{"class":351},[337,668,669],{"class":347},"}",[337,671,672],{"class":370},"] ",[337,674,650],{"class":347},[337,676,424],{"class":351},[337,678,465],{"class":347},[337,680,681],{"class":351},"method",[337,683,669],{"class":347},[337,685,686],{"class":347}," ${",[337,688,424],{"class":351},[337,690,465],{"class":347},[337,692,693],{"class":351},"url",[337,695,696],{"class":347},"}`",[337,698,486],{"class":416},[337,700,376],{"class":347},[337,702,703],{"class":339,"line":491},[337,704,550],{"class":347},[337,706,707],{"class":339,"line":496},[337,708,382],{"emptyLinePlaceholder":56},[337,710,711,713,715,718,720,722,724,726,728,731,733,736,738,740,742,744,746],{"class":339,"line":517},[337,712,410],{"class":391},[337,714,413],{"class":391},[337,716,717],{"class":416}," onResponse",[337,719,420],{"class":347},[337,721,424],{"class":423},[337,723,427],{"class":347},[337,725,430],{"class":395},[337,727,355],{"class":347},[337,729,730],{"class":423}," response",[337,732,427],{"class":347},[337,734,735],{"class":395}," Response",[337,737,433],{"class":347},[337,739,436],{"class":395},[337,741,439],{"class":347},[337,743,442],{"class":395},[337,745,445],{"class":347},[337,747,404],{"class":347},[337,749,750,752,754,756,758,760,762,764,766,768,770,772,774,776,778,780,782,785,787,790,792,794],{"class":339,"line":541},[337,751,634],{"class":351},[337,753,465],{"class":347},[337,755,639],{"class":473},[337,757,420],{"class":416},[337,759,644],{"class":347},[337,761,647],{"class":370},[337,763,650],{"class":347},[337,765,653],{"class":347},[337,767,656],{"class":473},[337,769,659],{"class":351},[337,771,465],{"class":347},[337,773,664],{"class":473},[337,775,659],{"class":351},[337,777,669],{"class":347},[337,779,672],{"class":370},[337,781,650],{"class":347},[337,783,784],{"class":351},"response",[337,786,465],{"class":347},[337,788,789],{"class":351},"status",[337,791,696],{"class":347},[337,793,486],{"class":416},[337,795,376],{"class":347},[337,797,798],{"class":339,"line":547},[337,799,550],{"class":347},[337,801,802],{"class":339,"line":553},[337,803,556],{"class":347},[287,805,807],{"id":806},"applying-middleware-to-a-controller","Applying Middleware to a Controller",[278,809,810,811,814],{},"Apply middleware via the ",[282,812,813],{},"@Middleware"," decorator on a controller class or individual method:",[327,816,819],{"className":329,"code":817,"filename":818,"language":332,"meta":333,"style":333},"import { Controller, Get, Middleware } from '@vercube\u002Fcore';\nimport { AuthMiddleware } from '..\u002Fmiddleware\u002FAuthMiddleware';\nimport { LogMiddleware } from '..\u002Fmiddleware\u002FLogMiddleware';\n\n@Controller('\u002Fapi\u002Fusers')\n@Middleware(LogMiddleware)\nexport class UserController {\n\n  @Get('\u002F')\n  @Middleware(AuthMiddleware)\n  list() {\n    return [{ id: '1', name: 'Alice' }];\n  }\n\n  @Get('\u002Fpublic')\n  public() {\n    return [{ id: '2', name: 'Bob' }];\n  }\n}\n","src\u002Froutes\u002FUserController.ts",[282,820,821,852,873,894,898,918,927,938,942,961,970,979,1024,1029,1034,1052,1061,1100,1105],{"__ignoreMap":333},[337,822,823,825,827,830,832,835,837,840,842,844,846,848,850],{"class":339,"line":340},[337,824,344],{"class":343},[337,826,348],{"class":347},[337,828,829],{"class":351}," Controller",[337,831,355],{"class":347},[337,833,834],{"class":351}," Get",[337,836,355],{"class":347},[337,838,839],{"class":351}," Middleware",[337,841,361],{"class":347},[337,843,364],{"class":343},[337,845,367],{"class":347},[337,847,303],{"class":370},[337,849,373],{"class":347},[337,851,376],{"class":347},[337,853,854,856,858,860,862,864,866,869,871],{"class":339,"line":379},[337,855,344],{"class":343},[337,857,348],{"class":347},[337,859,396],{"class":351},[337,861,361],{"class":347},[337,863,364],{"class":343},[337,865,367],{"class":347},[337,867,868],{"class":370},"..\u002Fmiddleware\u002FAuthMiddleware",[337,870,373],{"class":347},[337,872,376],{"class":347},[337,874,875,877,879,881,883,885,887,890,892],{"class":339,"line":385},[337,876,344],{"class":343},[337,878,348],{"class":347},[337,880,595],{"class":351},[337,882,361],{"class":347},[337,884,364],{"class":343},[337,886,367],{"class":347},[337,888,889],{"class":370},"..\u002Fmiddleware\u002FLogMiddleware",[337,891,373],{"class":347},[337,893,376],{"class":347},[337,895,896],{"class":339,"line":407},[337,897,382],{"emptyLinePlaceholder":56},[337,899,900,903,906,908,910,913,915],{"class":339,"line":450},[337,901,902],{"class":347},"@",[337,904,905],{"class":473},"Controller",[337,907,420],{"class":351},[337,909,373],{"class":347},[337,911,912],{"class":370},"\u002Fapi\u002Fusers",[337,914,373],{"class":347},[337,916,917],{"class":351},")\n",[337,919,920,922,924],{"class":339,"line":491},[337,921,902],{"class":347},[337,923,158],{"class":473},[337,925,926],{"class":351},"(LogMiddleware)\n",[337,928,929,931,933,936],{"class":339,"line":496},[337,930,388],{"class":343},[337,932,392],{"class":391},[337,934,935],{"class":395}," UserController",[337,937,404],{"class":347},[337,939,940],{"class":339,"line":517},[337,941,382],{"emptyLinePlaceholder":56},[337,943,944,947,950,952,954,957,959],{"class":339,"line":541},[337,945,946],{"class":347},"  @",[337,948,949],{"class":473},"Get",[337,951,420],{"class":351},[337,953,373],{"class":347},[337,955,956],{"class":370},"\u002F",[337,958,373],{"class":347},[337,960,917],{"class":351},[337,962,963,965,967],{"class":339,"line":547},[337,964,946],{"class":347},[337,966,158],{"class":473},[337,968,969],{"class":351},"(AuthMiddleware)\n",[337,971,972,975,977],{"class":339,"line":553},[337,973,974],{"class":416},"  list",[337,976,659],{"class":347},[337,978,404],{"class":347},[337,980,982,985,988,991,994,996,998,1001,1003,1005,1008,1010,1012,1015,1017,1019,1022],{"class":339,"line":981},12,[337,983,984],{"class":343},"    return",[337,986,987],{"class":416}," [",[337,989,990],{"class":347},"{",[337,992,993],{"class":416}," id",[337,995,427],{"class":347},[337,997,367],{"class":347},[337,999,1000],{"class":370},"1",[337,1002,373],{"class":347},[337,1004,355],{"class":347},[337,1006,1007],{"class":416}," name",[337,1009,427],{"class":347},[337,1011,367],{"class":347},[337,1013,1014],{"class":370},"Alice",[337,1016,373],{"class":347},[337,1018,361],{"class":347},[337,1020,1021],{"class":416},"]",[337,1023,376],{"class":347},[337,1025,1027],{"class":339,"line":1026},13,[337,1028,550],{"class":347},[337,1030,1032],{"class":339,"line":1031},14,[337,1033,382],{"emptyLinePlaceholder":56},[337,1035,1037,1039,1041,1043,1045,1048,1050],{"class":339,"line":1036},15,[337,1038,946],{"class":347},[337,1040,949],{"class":473},[337,1042,420],{"class":351},[337,1044,373],{"class":347},[337,1046,1047],{"class":370},"\u002Fpublic",[337,1049,373],{"class":347},[337,1051,917],{"class":351},[337,1053,1055,1057,1059],{"class":339,"line":1054},16,[337,1056,410],{"class":416},[337,1058,659],{"class":347},[337,1060,404],{"class":347},[337,1062,1064,1066,1068,1070,1072,1074,1076,1079,1081,1083,1085,1087,1089,1092,1094,1096,1098],{"class":339,"line":1063},17,[337,1065,984],{"class":343},[337,1067,987],{"class":416},[337,1069,990],{"class":347},[337,1071,993],{"class":416},[337,1073,427],{"class":347},[337,1075,367],{"class":347},[337,1077,1078],{"class":370},"2",[337,1080,373],{"class":347},[337,1082,355],{"class":347},[337,1084,1007],{"class":416},[337,1086,427],{"class":347},[337,1088,367],{"class":347},[337,1090,1091],{"class":370},"Bob",[337,1093,373],{"class":347},[337,1095,361],{"class":347},[337,1097,1021],{"class":416},[337,1099,376],{"class":347},[337,1101,1103],{"class":339,"line":1102},18,[337,1104,550],{"class":347},[337,1106,1108],{"class":339,"line":1107},19,[337,1109,556],{"class":347},[287,1111,1113],{"id":1112},"global-middleware","Global Middleware",[278,1115,1116,1117,1119,1120,1122,1123,1125],{},"Middleware classes in the ",[282,1118,284],{}," directory are ",[309,1121,311],{}," registered as global middleware automatically. They are only applied where you explicitly use the ",[282,1124,813],{}," decorator.",[278,1127,1128,1129,1132,1133,1140,1141,1145],{},"If you want a middleware to run on every request, register it in ",[282,1130,1131],{},"GlobalMiddlewareRegistry"," via a ",[1134,1135,1137],"a",{"href":1136},".\u002Foverview#customizing-the-container",[282,1138,1139],{},"setupFile",". See ",[1134,1142,1144],{"href":1143},"\u002Fdocs\u002Fcore\u002Fmiddlewares#global-middlewares","Global Middlewares"," in the core docs for the full API.",[327,1147,1150],{"className":329,"code":1148,"filename":1149,"language":332,"meta":333,"style":333},"import type { App } from '@vercube\u002Fcore';\nimport { GlobalMiddlewareRegistry } from '@vercube\u002Fcore';\nimport { LogMiddleware } from '.\u002Fmiddleware\u002FLogMiddleware';\n\nexport default async (app: App) => {\n  const registry = app.container.get(GlobalMiddlewareRegistry);\n  registry.registerGlobalMiddleware(LogMiddleware, { priority: 1 });\n};\n","src\u002Fcontainer.ts",[282,1151,1152,1176,1197,1218,1222,1247,1277,1311],{"__ignoreMap":333},[337,1153,1154,1156,1159,1161,1164,1166,1168,1170,1172,1174],{"class":339,"line":340},[337,1155,344],{"class":343},[337,1157,1158],{"class":343}," type",[337,1160,348],{"class":347},[337,1162,1163],{"class":351}," App",[337,1165,361],{"class":347},[337,1167,364],{"class":343},[337,1169,367],{"class":347},[337,1171,303],{"class":370},[337,1173,373],{"class":347},[337,1175,376],{"class":347},[337,1177,1178,1180,1182,1185,1187,1189,1191,1193,1195],{"class":339,"line":379},[337,1179,344],{"class":343},[337,1181,348],{"class":347},[337,1183,1184],{"class":351}," GlobalMiddlewareRegistry",[337,1186,361],{"class":347},[337,1188,364],{"class":343},[337,1190,367],{"class":347},[337,1192,303],{"class":370},[337,1194,373],{"class":347},[337,1196,376],{"class":347},[337,1198,1199,1201,1203,1205,1207,1209,1211,1214,1216],{"class":339,"line":385},[337,1200,344],{"class":343},[337,1202,348],{"class":347},[337,1204,595],{"class":351},[337,1206,361],{"class":347},[337,1208,364],{"class":343},[337,1210,367],{"class":347},[337,1212,1213],{"class":370},".\u002Fmiddleware\u002FLogMiddleware",[337,1215,373],{"class":347},[337,1217,376],{"class":347},[337,1219,1220],{"class":339,"line":407},[337,1221,382],{"emptyLinePlaceholder":56},[337,1223,1224,1226,1229,1231,1233,1236,1238,1240,1242,1245],{"class":339,"line":450},[337,1225,388],{"class":343},[337,1227,1228],{"class":343}," default",[337,1230,413],{"class":391},[337,1232,502],{"class":347},[337,1234,1235],{"class":423},"app",[337,1237,427],{"class":347},[337,1239,1163],{"class":395},[337,1241,486],{"class":347},[337,1243,1244],{"class":391}," =>",[337,1246,404],{"class":347},[337,1248,1249,1252,1255,1257,1260,1262,1265,1267,1269,1271,1273,1275],{"class":339,"line":491},[337,1250,1251],{"class":391},"  const",[337,1253,1254],{"class":351}," registry",[337,1256,459],{"class":347},[337,1258,1259],{"class":351}," app",[337,1261,465],{"class":347},[337,1263,1264],{"class":351},"container",[337,1266,465],{"class":347},[337,1268,474],{"class":473},[337,1270,420],{"class":416},[337,1272,1131],{"class":351},[337,1274,486],{"class":416},[337,1276,376],{"class":347},[337,1278,1279,1282,1284,1287,1289,1292,1294,1296,1299,1301,1305,1307,1309],{"class":339,"line":496},[337,1280,1281],{"class":351},"  registry",[337,1283,465],{"class":347},[337,1285,1286],{"class":473},"registerGlobalMiddleware",[337,1288,420],{"class":416},[337,1290,1291],{"class":351},"LogMiddleware",[337,1293,355],{"class":347},[337,1295,348],{"class":347},[337,1297,1298],{"class":416}," priority",[337,1300,427],{"class":347},[337,1302,1304],{"class":1303},"sbssI"," 1",[337,1306,361],{"class":347},[337,1308,486],{"class":416},[337,1310,376],{"class":347},[337,1312,1313],{"class":339,"line":517},[337,1314,1315],{"class":347},"};\n",[327,1317,1320],{"className":329,"code":1318,"filename":1319,"language":332,"meta":333,"style":333},"import { vercubeNitro } from '@vercube\u002Fnitro';\nimport { defineConfig } from 'nitro';\n\nexport default defineConfig({\n  modules: [\n    vercubeNitro({\n      setupFile: '.\u002Fsrc\u002Fcontainer.ts',\n    }),\n  ],\n});\n","nitro.config.ts",[282,1321,1322,1344,1366,1370,1382,1392,1401,1418,1427,1434],{"__ignoreMap":333},[337,1323,1324,1326,1328,1331,1333,1335,1337,1340,1342],{"class":339,"line":340},[337,1325,344],{"class":343},[337,1327,348],{"class":347},[337,1329,1330],{"class":351}," vercubeNitro",[337,1332,361],{"class":347},[337,1334,364],{"class":343},[337,1336,367],{"class":347},[337,1338,1339],{"class":370},"@vercube\u002Fnitro",[337,1341,373],{"class":347},[337,1343,376],{"class":347},[337,1345,1346,1348,1350,1353,1355,1357,1359,1362,1364],{"class":339,"line":379},[337,1347,344],{"class":343},[337,1349,348],{"class":347},[337,1351,1352],{"class":351}," defineConfig",[337,1354,361],{"class":347},[337,1356,364],{"class":343},[337,1358,367],{"class":347},[337,1360,1361],{"class":370},"nitro",[337,1363,373],{"class":347},[337,1365,376],{"class":347},[337,1367,1368],{"class":339,"line":385},[337,1369,382],{"emptyLinePlaceholder":56},[337,1371,1372,1374,1376,1378,1380],{"class":339,"line":407},[337,1373,388],{"class":343},[337,1375,1228],{"class":343},[337,1377,1352],{"class":473},[337,1379,420],{"class":351},[337,1381,514],{"class":347},[337,1383,1384,1387,1389],{"class":339,"line":450},[337,1385,1386],{"class":416},"  modules",[337,1388,427],{"class":347},[337,1390,1391],{"class":351}," [\n",[337,1393,1394,1397,1399],{"class":339,"line":491},[337,1395,1396],{"class":473},"    vercubeNitro",[337,1398,420],{"class":351},[337,1400,514],{"class":347},[337,1402,1403,1406,1408,1410,1413,1415],{"class":339,"line":496},[337,1404,1405],{"class":416},"      setupFile",[337,1407,427],{"class":347},[337,1409,367],{"class":347},[337,1411,1412],{"class":370},".\u002Fsrc\u002Fcontainer.ts",[337,1414,373],{"class":347},[337,1416,1417],{"class":347},",\n",[337,1419,1420,1423,1425],{"class":339,"line":517},[337,1421,1422],{"class":347},"    }",[337,1424,486],{"class":351},[337,1426,1417],{"class":347},[337,1428,1429,1432],{"class":339,"line":541},[337,1430,1431],{"class":351},"  ]",[337,1433,1417],{"class":347},[337,1435,1436,1438,1440],{"class":339,"line":547},[337,1437,669],{"class":347},[337,1439,486],{"class":351},[337,1441,376],{"class":347},[287,1443,1445],{"id":1444},"basemiddleware-api","BaseMiddleware API",[1447,1448,1449,1465],"table",{},[1450,1451,1452],"thead",{},[1453,1454,1455,1459,1462],"tr",{},[1456,1457,1458],"th",{},"Method",[1456,1460,1461],{},"Arguments",[1456,1463,1464],{},"Description",[1466,1467,1468,1484],"tbody",{},[1453,1469,1470,1476,1481],{},[1471,1472,1473],"td",{},[282,1474,1475],{},"onRequest",[1471,1477,1478],{},[282,1479,1480],{},"request: Request, response: Response, args: MiddlewareOptions",[1471,1482,1483],{},"Called before the controller method. Throw an error to abort the request.",[1453,1485,1486,1491,1496],{},[1471,1487,1488],{},[282,1489,1490],{},"onResponse",[1471,1492,1493],{},[282,1494,1495],{},"request: Request, response: Response, payload: T",[1471,1497,1498],{},"Called after the controller method returns. Can modify the response.",[278,1500,1501],{},"Both methods are optional - implement only the ones you need.",[1503,1504,1507],"callout",{"icon":1505,"type":1506},"i-lucide-info","info",[278,1508,1509,1510,1513,1514,1517,1518,1521,1522,1524,1525,1527,1528,1530],{},"Middleware can abort a request by throwing an ",[282,1511,1512],{},"HttpError"," (e.g. ",[282,1515,1516],{},"BadRequestError",", ",[282,1519,1520],{},"ForbiddenError","). Returning a value from ",[282,1523,1475],{}," or ",[282,1526,1490],{}," is not supported - use the ",[282,1529,784],{}," argument to modify the response object instead.",[1532,1533,1534],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":333,"searchDepth":340,"depth":379,"links":1536},[1537,1538,1539,1540,1541],{"id":289,"depth":379,"text":290},{"id":315,"depth":379,"text":316},{"id":806,"depth":379,"text":807},{"id":1112,"depth":379,"text":1113},{"id":1444,"depth":379,"text":1445},"Using Vercube BaseMiddleware inside a Nitro application","md",null,{},{"title":158,"description":1542},"ZZ5TjUrjTNzDBd7lZqAwYKwi9-yLAwoyAl3WdIHfgjQ",[1549,1551],{"title":154,"path":155,"stem":156,"description":1550,"children":-1},"Mixing Nitro file-based routes with Vercube controllers",{"title":66,"path":167,"stem":168,"description":1552,"children":-1},"Run Vercube as a Vite plugin using the Environment API",1782807890938]