[{"data":1,"prerenderedAt":1828},["ShallowReactive",2],{"navigation":3,"docs-path-index":208,"-docs-modules-schema-overview":272,"-docs-modules-schema-overview-surround":1823},[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":66,"body":274,"description":1817,"extension":1818,"links":1819,"meta":1820,"navigation":56,"path":133,"seo":1821,"stem":134,"__hash__":1822},"docs\u002Fdocs\u002F3.modules\u002F6.schema\u002F0.overview.md",{"type":275,"value":276,"toc":1810},"minimark",[277,300,315,337,341,408,439,443,1362,1366,1371,1506,1512,1611,1615,1623,1782,1789,1793,1806],[278,279,280,281,285,286,290,291,299],"p",{},"The Schema module (",[282,283,284],"code",{},"@vercube\u002Fschema",") turns your route metadata and Zod validation schemas into an ",[287,288,289],"strong",{},"OpenAPI 3"," document at runtime. It also serves a ",[287,292,293],{},[294,295,139],"a",{"href":296,"rel":297},"https:\u002F\u002Fgithub.com\u002Fscalar\u002Fscalar",[298],"nofollow"," API Reference UI so you can browse and try your API without extra tooling.",[278,301,302,303,306,307,310,311,314],{},"Define validation once with ",[282,304,305],{},"@Body"," \u002F ",[282,308,309],{},"@QueryParams",", annotate routes with ",[282,312,313],{},"@Schema",", and get:",[316,317,318,328],"ul",{},[319,320,321,324,325],"li",{},[287,322,323],{},"OpenAPI JSON"," at ",[282,326,327],{},"GET \u002F_schema\u002F",[319,329,330,324,333,336],{},[287,331,332],{},"Scalar docs",[282,334,335],{},"GET \u002F_schema\u002Fdocs"," (enabled by default)",[338,339,18],"h2",{"id":340},"installation",[342,343,344,373,391],"code-group",{},[345,346,352],"pre",{"className":347,"code":348,"filename":349,"language":350,"meta":351,"style":351},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$ pnpm add @vercube\u002Fschema\n","pnpm","bash","",[282,353,354],{"__ignoreMap":351},[355,356,359,363,367,370],"span",{"class":357,"line":358},"line",1,[355,360,362],{"class":361},"sBMFI","$",[355,364,366],{"class":365},"sfazB"," pnpm",[355,368,369],{"class":365}," add",[355,371,372],{"class":365}," @vercube\u002Fschema\n",[345,374,377],{"className":347,"code":375,"filename":376,"language":350,"meta":351,"style":351},"$ npm install @vercube\u002Fschema\n","npm",[282,378,379],{"__ignoreMap":351},[355,380,381,383,386,389],{"class":357,"line":358},[355,382,362],{"class":361},[355,384,385],{"class":365}," npm",[355,387,388],{"class":365}," install",[355,390,372],{"class":365},[345,392,395],{"className":347,"code":393,"filename":394,"language":350,"meta":351,"style":351},"$ bun install @vercube\u002Fschema\n","bun",[282,396,397],{"__ignoreMap":351},[355,398,399,401,404,406],{"class":357,"line":358},[355,400,362],{"class":361},[355,402,403],{"class":365}," bun",[355,405,388],{"class":365},[355,407,372],{"class":365},[278,409,410,411,416,417,424,425,427,428,430,431,434,435,438],{},"The package re-exports ",[287,412,413],{},[282,414,415],{},"z"," with OpenAPI helpers from ",[294,418,421],{"href":419,"rel":420},"https:\u002F\u002Fgithub.com\u002Fasteasolutions\u002Fzod-to-openapi",[298],[282,422,423],{},"@asteasolutions\u002Fzod-to-openapi",". Import ",[282,426,415],{}," from ",[282,429,284],{}," (not only from ",[282,432,433],{},"zod",") when you want ",[282,436,437],{},".openapi()"," metadata on your schemas.",[338,440,442],{"id":441},"quick-start","Quick Start",[444,445,446,451,583,590,682,686,705,1295,1299,1302,1342],"steps",{},[447,448,450],"h3",{"id":449},"register-the-plugin","Register the plugin",[345,452,457],{"className":453,"code":454,"filename":455,"language":456,"meta":351,"style":351},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createApp } from '@vercube\u002Fcore';\nimport { SchemaPlugin } from '@vercube\u002Fschema';\n\nexport async function setup(app: App) {\n  app.addPlugin(SchemaPlugin);\n}\n","src\u002FBoot\u002FSetup.ts","ts",[282,458,459,491,513,519,555,577],{"__ignoreMap":351},[355,460,461,465,469,473,476,479,482,485,488],{"class":357,"line":358},[355,462,464],{"class":463},"s7zQu","import",[355,466,468],{"class":467},"sMK4o"," {",[355,470,472],{"class":471},"sTEyZ"," createApp",[355,474,475],{"class":467}," }",[355,477,478],{"class":463}," from",[355,480,481],{"class":467}," '",[355,483,484],{"class":365},"@vercube\u002Fcore",[355,486,487],{"class":467},"'",[355,489,490],{"class":467},";\n",[355,492,494,496,498,501,503,505,507,509,511],{"class":357,"line":493},2,[355,495,464],{"class":463},[355,497,468],{"class":467},[355,499,500],{"class":471}," SchemaPlugin",[355,502,475],{"class":467},[355,504,478],{"class":463},[355,506,481],{"class":467},[355,508,284],{"class":365},[355,510,487],{"class":467},[355,512,490],{"class":467},[355,514,516],{"class":357,"line":515},3,[355,517,518],{"emptyLinePlaceholder":56},"\n",[355,520,522,525,529,532,536,539,543,546,549,552],{"class":357,"line":521},4,[355,523,524],{"class":463},"export",[355,526,528],{"class":527},"spNyl"," async",[355,530,531],{"class":527}," function",[355,533,535],{"class":534},"s2Zo4"," setup",[355,537,538],{"class":467},"(",[355,540,542],{"class":541},"sHdIc","app",[355,544,545],{"class":467},":",[355,547,548],{"class":361}," App",[355,550,551],{"class":467},")",[355,553,554],{"class":467}," {\n",[355,556,558,561,564,567,570,573,575],{"class":357,"line":557},5,[355,559,560],{"class":471},"  app",[355,562,563],{"class":467},".",[355,565,566],{"class":534},"addPlugin",[355,568,538],{"class":569},"swJcz",[355,571,572],{"class":471},"SchemaPlugin",[355,574,551],{"class":569},[355,576,490],{"class":467},[355,578,580],{"class":357,"line":579},6,[355,581,582],{"class":467},"}\n",[278,584,585,586,589],{},"Or from ",[282,587,588],{},"vercube.config.ts"," with a class plugin:",[345,591,593],{"className":453,"code":592,"filename":588,"language":456,"meta":351,"style":351},"import { defineConfig, withPluginOptions } from '@vercube\u002Fcore';\nimport { SchemaPlugin } from '@vercube\u002Fschema';\n\nexport default defineConfig({\n  plugins: [SchemaPlugin],\n});\n",[282,594,595,622,642,646,660,673],{"__ignoreMap":351},[355,596,597,599,601,604,607,610,612,614,616,618,620],{"class":357,"line":358},[355,598,464],{"class":463},[355,600,468],{"class":467},[355,602,603],{"class":471}," defineConfig",[355,605,606],{"class":467},",",[355,608,609],{"class":471}," withPluginOptions",[355,611,475],{"class":467},[355,613,478],{"class":463},[355,615,481],{"class":467},[355,617,484],{"class":365},[355,619,487],{"class":467},[355,621,490],{"class":467},[355,623,624,626,628,630,632,634,636,638,640],{"class":357,"line":493},[355,625,464],{"class":463},[355,627,468],{"class":467},[355,629,500],{"class":471},[355,631,475],{"class":467},[355,633,478],{"class":463},[355,635,481],{"class":467},[355,637,284],{"class":365},[355,639,487],{"class":467},[355,641,490],{"class":467},[355,643,644],{"class":357,"line":515},[355,645,518],{"emptyLinePlaceholder":56},[355,647,648,650,653,655,657],{"class":357,"line":521},[355,649,524],{"class":463},[355,651,652],{"class":463}," default",[355,654,603],{"class":534},[355,656,538],{"class":471},[355,658,659],{"class":467},"{\n",[355,661,662,665,667,670],{"class":357,"line":557},[355,663,664],{"class":569},"  plugins",[355,666,545],{"class":467},[355,668,669],{"class":471}," [SchemaPlugin]",[355,671,672],{"class":467},",\n",[355,674,675,678,680],{"class":357,"line":579},[355,676,677],{"class":467},"}",[355,679,551],{"class":471},[355,681,490],{"class":467},[447,683,685],{"id":684},"annotate-a-route","Annotate a route",[278,687,688,689,691,692,695,696,698,699,701,702,704],{},"Use ",[282,690,313],{}," on controller methods. The decorator registers the route in the OpenAPI registry. Request body and query schemas are picked up automatically when you use ",[282,693,694],{},"validationSchema"," on ",[282,697,305],{}," and ",[282,700,309],{}," (see ",[294,703,70],{"href":136},").",[345,706,709],{"className":453,"code":707,"filename":708,"language":456,"meta":351,"style":351},"import { Body, Controller, Post, QueryParams } from '@vercube\u002Fcore';\nimport { Schema, z } from '@vercube\u002Fschema';\n\nconst CreateUserSchema = z.object({\n  name: z.string(),\n  email: z.string().email(),\n});\n\nconst ListUsersQuerySchema = z.object({\n  page: z.coerce.number().optional(),\n});\n\n@Controller('\u002Fusers')\nexport class UserController {\n  @Post('\u002F')\n  @Schema({\n    summary: 'Create user',\n    responses: {\n      201: {\n        description: 'Created user',\n        content: {\n          'application\u002Fjson': {\n            schema: z.object({ id: z.string(), name: z.string() }),\n          },\n        },\n      },\n    },\n  })\n  create(\n    @Body({ validationSchema: CreateUserSchema }) body: z.infer\u003Ctypeof CreateUserSchema>,\n    @QueryParams({ validationSchema: ListUsersQuerySchema }) _query: z.infer\u003Ctypeof ListUsersQuerySchema>,\n  ) {\n    return { id: '1', ...body };\n  }\n}\n","src\u002Fcontrollers\u002FUserController.ts",[282,710,711,747,773,777,799,818,842,851,856,876,907,916,921,942,955,975,986,1003,1013,1024,1041,1051,1066,1120,1126,1132,1138,1144,1152,1161,1207,1247,1255,1284,1290],{"__ignoreMap":351},[355,712,713,715,717,720,722,725,727,730,732,735,737,739,741,743,745],{"class":357,"line":358},[355,714,464],{"class":463},[355,716,468],{"class":467},[355,718,719],{"class":471}," Body",[355,721,606],{"class":467},[355,723,724],{"class":471}," Controller",[355,726,606],{"class":467},[355,728,729],{"class":471}," Post",[355,731,606],{"class":467},[355,733,734],{"class":471}," QueryParams",[355,736,475],{"class":467},[355,738,478],{"class":463},[355,740,481],{"class":467},[355,742,484],{"class":365},[355,744,487],{"class":467},[355,746,490],{"class":467},[355,748,749,751,753,756,758,761,763,765,767,769,771],{"class":357,"line":493},[355,750,464],{"class":463},[355,752,468],{"class":467},[355,754,755],{"class":471}," Schema",[355,757,606],{"class":467},[355,759,760],{"class":471}," z",[355,762,475],{"class":467},[355,764,478],{"class":463},[355,766,481],{"class":467},[355,768,284],{"class":365},[355,770,487],{"class":467},[355,772,490],{"class":467},[355,774,775],{"class":357,"line":515},[355,776,518],{"emptyLinePlaceholder":56},[355,778,779,782,785,788,790,792,795,797],{"class":357,"line":521},[355,780,781],{"class":527},"const",[355,783,784],{"class":471}," CreateUserSchema ",[355,786,787],{"class":467},"=",[355,789,760],{"class":471},[355,791,563],{"class":467},[355,793,794],{"class":534},"object",[355,796,538],{"class":471},[355,798,659],{"class":467},[355,800,801,804,806,808,810,813,816],{"class":357,"line":557},[355,802,803],{"class":569},"  name",[355,805,545],{"class":467},[355,807,760],{"class":471},[355,809,563],{"class":467},[355,811,812],{"class":534},"string",[355,814,815],{"class":471},"()",[355,817,672],{"class":467},[355,819,820,823,825,827,829,831,833,835,838,840],{"class":357,"line":579},[355,821,822],{"class":569},"  email",[355,824,545],{"class":467},[355,826,760],{"class":471},[355,828,563],{"class":467},[355,830,812],{"class":534},[355,832,815],{"class":471},[355,834,563],{"class":467},[355,836,837],{"class":534},"email",[355,839,815],{"class":471},[355,841,672],{"class":467},[355,843,845,847,849],{"class":357,"line":844},7,[355,846,677],{"class":467},[355,848,551],{"class":471},[355,850,490],{"class":467},[355,852,854],{"class":357,"line":853},8,[355,855,518],{"emptyLinePlaceholder":56},[355,857,859,861,864,866,868,870,872,874],{"class":357,"line":858},9,[355,860,781],{"class":527},[355,862,863],{"class":471}," ListUsersQuerySchema ",[355,865,787],{"class":467},[355,867,760],{"class":471},[355,869,563],{"class":467},[355,871,794],{"class":534},[355,873,538],{"class":471},[355,875,659],{"class":467},[355,877,879,882,884,886,888,891,893,896,898,900,903,905],{"class":357,"line":878},10,[355,880,881],{"class":569},"  page",[355,883,545],{"class":467},[355,885,760],{"class":471},[355,887,563],{"class":467},[355,889,890],{"class":471},"coerce",[355,892,563],{"class":467},[355,894,895],{"class":534},"number",[355,897,815],{"class":471},[355,899,563],{"class":467},[355,901,902],{"class":534},"optional",[355,904,815],{"class":471},[355,906,672],{"class":467},[355,908,910,912,914],{"class":357,"line":909},11,[355,911,677],{"class":467},[355,913,551],{"class":471},[355,915,490],{"class":467},[355,917,919],{"class":357,"line":918},12,[355,920,518],{"emptyLinePlaceholder":56},[355,922,924,927,930,932,934,937,939],{"class":357,"line":923},13,[355,925,926],{"class":467},"@",[355,928,929],{"class":534},"Controller",[355,931,538],{"class":471},[355,933,487],{"class":467},[355,935,936],{"class":365},"\u002Fusers",[355,938,487],{"class":467},[355,940,941],{"class":471},")\n",[355,943,945,947,950,953],{"class":357,"line":944},14,[355,946,524],{"class":463},[355,948,949],{"class":527}," class",[355,951,952],{"class":361}," UserController",[355,954,554],{"class":467},[355,956,958,961,964,966,968,971,973],{"class":357,"line":957},15,[355,959,960],{"class":467},"  @",[355,962,963],{"class":534},"Post",[355,965,538],{"class":471},[355,967,487],{"class":467},[355,969,970],{"class":365},"\u002F",[355,972,487],{"class":467},[355,974,941],{"class":471},[355,976,978,980,982,984],{"class":357,"line":977},16,[355,979,960],{"class":467},[355,981,128],{"class":534},[355,983,538],{"class":471},[355,985,659],{"class":467},[355,987,989,992,994,996,999,1001],{"class":357,"line":988},17,[355,990,991],{"class":569},"    summary",[355,993,545],{"class":467},[355,995,481],{"class":467},[355,997,998],{"class":365},"Create user",[355,1000,487],{"class":467},[355,1002,672],{"class":467},[355,1004,1006,1009,1011],{"class":357,"line":1005},18,[355,1007,1008],{"class":569},"    responses",[355,1010,545],{"class":467},[355,1012,554],{"class":467},[355,1014,1016,1020,1022],{"class":357,"line":1015},19,[355,1017,1019],{"class":1018},"sbssI","      201",[355,1021,545],{"class":467},[355,1023,554],{"class":467},[355,1025,1027,1030,1032,1034,1037,1039],{"class":357,"line":1026},20,[355,1028,1029],{"class":569},"        description",[355,1031,545],{"class":467},[355,1033,481],{"class":467},[355,1035,1036],{"class":365},"Created user",[355,1038,487],{"class":467},[355,1040,672],{"class":467},[355,1042,1044,1047,1049],{"class":357,"line":1043},21,[355,1045,1046],{"class":569},"        content",[355,1048,545],{"class":467},[355,1050,554],{"class":467},[355,1052,1054,1057,1060,1062,1064],{"class":357,"line":1053},22,[355,1055,1056],{"class":467},"          '",[355,1058,1059],{"class":569},"application\u002Fjson",[355,1061,487],{"class":467},[355,1063,545],{"class":467},[355,1065,554],{"class":467},[355,1067,1069,1072,1074,1076,1078,1080,1082,1085,1088,1090,1092,1094,1096,1098,1100,1103,1105,1107,1109,1111,1114,1116,1118],{"class":357,"line":1068},23,[355,1070,1071],{"class":569},"            schema",[355,1073,545],{"class":467},[355,1075,760],{"class":471},[355,1077,563],{"class":467},[355,1079,794],{"class":534},[355,1081,538],{"class":471},[355,1083,1084],{"class":467},"{",[355,1086,1087],{"class":569}," id",[355,1089,545],{"class":467},[355,1091,760],{"class":471},[355,1093,563],{"class":467},[355,1095,812],{"class":534},[355,1097,815],{"class":471},[355,1099,606],{"class":467},[355,1101,1102],{"class":569}," name",[355,1104,545],{"class":467},[355,1106,760],{"class":471},[355,1108,563],{"class":467},[355,1110,812],{"class":534},[355,1112,1113],{"class":471},"() ",[355,1115,677],{"class":467},[355,1117,551],{"class":471},[355,1119,672],{"class":467},[355,1121,1123],{"class":357,"line":1122},24,[355,1124,1125],{"class":467},"          },\n",[355,1127,1129],{"class":357,"line":1128},25,[355,1130,1131],{"class":467},"        },\n",[355,1133,1135],{"class":357,"line":1134},26,[355,1136,1137],{"class":467},"      },\n",[355,1139,1141],{"class":357,"line":1140},27,[355,1142,1143],{"class":467},"    },\n",[355,1145,1147,1150],{"class":357,"line":1146},28,[355,1148,1149],{"class":467},"  }",[355,1151,941],{"class":471},[355,1153,1155,1158],{"class":357,"line":1154},29,[355,1156,1157],{"class":569},"  create",[355,1159,1160],{"class":467},"(\n",[355,1162,1164,1167,1170,1172,1174,1177,1179,1181,1183,1186,1189,1191,1193,1195,1198,1201,1204],{"class":357,"line":1163},30,[355,1165,1166],{"class":467},"    @",[355,1168,1169],{"class":534},"Body",[355,1171,538],{"class":471},[355,1173,1084],{"class":467},[355,1175,1176],{"class":569}," validationSchema",[355,1178,545],{"class":467},[355,1180,784],{"class":471},[355,1182,677],{"class":467},[355,1184,1185],{"class":471},") ",[355,1187,1188],{"class":541},"body",[355,1190,545],{"class":467},[355,1192,760],{"class":361},[355,1194,563],{"class":467},[355,1196,1197],{"class":361},"infer",[355,1199,1200],{"class":467},"\u003Ctypeof",[355,1202,1203],{"class":471}," CreateUserSchema",[355,1205,1206],{"class":467},">,\n",[355,1208,1210,1212,1215,1217,1219,1221,1223,1225,1227,1229,1232,1234,1236,1238,1240,1242,1245],{"class":357,"line":1209},31,[355,1211,1166],{"class":467},[355,1213,1214],{"class":534},"QueryParams",[355,1216,538],{"class":471},[355,1218,1084],{"class":467},[355,1220,1176],{"class":569},[355,1222,545],{"class":467},[355,1224,863],{"class":471},[355,1226,677],{"class":467},[355,1228,1185],{"class":471},[355,1230,1231],{"class":541},"_query",[355,1233,545],{"class":467},[355,1235,760],{"class":361},[355,1237,563],{"class":467},[355,1239,1197],{"class":361},[355,1241,1200],{"class":467},[355,1243,1244],{"class":471}," ListUsersQuerySchema",[355,1246,1206],{"class":467},[355,1248,1250,1253],{"class":357,"line":1249},32,[355,1251,1252],{"class":467},"  )",[355,1254,554],{"class":467},[355,1256,1258,1261,1263,1265,1267,1269,1272,1274,1276,1279,1281],{"class":357,"line":1257},33,[355,1259,1260],{"class":463},"    return",[355,1262,468],{"class":467},[355,1264,1087],{"class":569},[355,1266,545],{"class":467},[355,1268,481],{"class":467},[355,1270,1271],{"class":365},"1",[355,1273,487],{"class":467},[355,1275,606],{"class":467},[355,1277,1278],{"class":467}," ...",[355,1280,1188],{"class":471},[355,1282,1283],{"class":467}," };\n",[355,1285,1287],{"class":357,"line":1286},34,[355,1288,1289],{"class":467},"  }\n",[355,1291,1293],{"class":357,"line":1292},35,[355,1294,582],{"class":467},[447,1296,1298],{"id":1297},"open-the-docs","Open the docs",[278,1300,1301],{},"With the dev server running:",[1303,1304,1305,1318],"table",{},[1306,1307,1308],"thead",{},[1309,1310,1311,1315],"tr",{},[1312,1313,1314],"th",{},"URL",[1312,1316,1317],{},"Content",[1319,1320,1321,1332],"tbody",{},[1309,1322,1323,1329],{},[1324,1325,1326],"td",{},[282,1327,1328],{},"\u002F_schema\u002F",[1324,1330,1331],{},"OpenAPI 3.0 JSON",[1309,1333,1334,1339],{},[1324,1335,1336],{},[282,1337,1338],{},"\u002F_schema\u002Fdocs",[1324,1340,1341],{},"Scalar API Reference (HTML)",[1343,1344,1345],"tip",{},[278,1346,1347,1348,1350,1351,1354,1355,1358,1359,563],{},"The playground app already registers ",[282,1349,572],{}," - try ",[282,1352,1353],{},"http:\u002F\u002Flocalhost:3000\u002F_schema\u002Fdocs"," after ",[282,1356,1357],{},"pnpm dev"," in ",[282,1360,1361],{},"playground\u002F",[338,1363,1365],{"id":1364},"zod-and-openapi-metadata","Zod and OpenAPI metadata",[278,1367,688,1368,1370],{},[282,1369,437],{}," on Zod types for richer docs (examples, component names):",[345,1372,1374],{"className":453,"code":1373,"language":456,"meta":351,"style":351},"const UserSchema = z\n  .object({\n    id: z.string().openapi({ example: 'usr_123' }),\n    name: z.string().openapi({ example: 'Jane Doe' }),\n  })\n  .openapi('User');\n",[282,1375,1376,1388,1399,1441,1481,1487],{"__ignoreMap":351},[355,1377,1378,1380,1383,1385],{"class":357,"line":358},[355,1379,781],{"class":527},[355,1381,1382],{"class":471}," UserSchema ",[355,1384,787],{"class":467},[355,1386,1387],{"class":471}," z\n",[355,1389,1390,1393,1395,1397],{"class":357,"line":493},[355,1391,1392],{"class":467},"  .",[355,1394,794],{"class":534},[355,1396,538],{"class":471},[355,1398,659],{"class":467},[355,1400,1401,1404,1406,1408,1410,1412,1414,1416,1419,1421,1423,1426,1428,1430,1433,1435,1437,1439],{"class":357,"line":515},[355,1402,1403],{"class":569},"    id",[355,1405,545],{"class":467},[355,1407,760],{"class":471},[355,1409,563],{"class":467},[355,1411,812],{"class":534},[355,1413,815],{"class":471},[355,1415,563],{"class":467},[355,1417,1418],{"class":534},"openapi",[355,1420,538],{"class":471},[355,1422,1084],{"class":467},[355,1424,1425],{"class":569}," example",[355,1427,545],{"class":467},[355,1429,481],{"class":467},[355,1431,1432],{"class":365},"usr_123",[355,1434,487],{"class":467},[355,1436,475],{"class":467},[355,1438,551],{"class":471},[355,1440,672],{"class":467},[355,1442,1443,1446,1448,1450,1452,1454,1456,1458,1460,1462,1464,1466,1468,1470,1473,1475,1477,1479],{"class":357,"line":521},[355,1444,1445],{"class":569},"    name",[355,1447,545],{"class":467},[355,1449,760],{"class":471},[355,1451,563],{"class":467},[355,1453,812],{"class":534},[355,1455,815],{"class":471},[355,1457,563],{"class":467},[355,1459,1418],{"class":534},[355,1461,538],{"class":471},[355,1463,1084],{"class":467},[355,1465,1425],{"class":569},[355,1467,545],{"class":467},[355,1469,481],{"class":467},[355,1471,1472],{"class":365},"Jane Doe",[355,1474,487],{"class":467},[355,1476,475],{"class":467},[355,1478,551],{"class":471},[355,1480,672],{"class":467},[355,1482,1483,1485],{"class":357,"line":557},[355,1484,1149],{"class":467},[355,1486,941],{"class":471},[355,1488,1489,1491,1493,1495,1497,1500,1502,1504],{"class":357,"line":579},[355,1490,1392],{"class":467},[355,1492,1418],{"class":534},[355,1494,538],{"class":471},[355,1496,487],{"class":467},[355,1498,1499],{"class":365},"User",[355,1501,487],{"class":467},[355,1503,551],{"class":471},[355,1505,490],{"class":467},[278,1507,1508,1509,1511],{},"Reference named components in ",[282,1510,313],{}," responses:",[345,1513,1515],{"className":453,"code":1514,"language":456,"meta":351,"style":351},"@Schema({\n  responses: {\n    200: {\n      description: 'User',\n      content: {\n        'application\u002Fjson': { schema: UserSchema },\n      },\n    },\n  },\n})\n",[282,1516,1517,1527,1536,1545,1560,1569,1592,1596,1600,1605],{"__ignoreMap":351},[355,1518,1519,1521,1523,1525],{"class":357,"line":358},[355,1520,926],{"class":467},[355,1522,128],{"class":534},[355,1524,538],{"class":471},[355,1526,659],{"class":467},[355,1528,1529,1532,1534],{"class":357,"line":493},[355,1530,1531],{"class":569},"  responses",[355,1533,545],{"class":467},[355,1535,554],{"class":467},[355,1537,1538,1541,1543],{"class":357,"line":515},[355,1539,1540],{"class":1018},"    200",[355,1542,545],{"class":467},[355,1544,554],{"class":467},[355,1546,1547,1550,1552,1554,1556,1558],{"class":357,"line":521},[355,1548,1549],{"class":569},"      description",[355,1551,545],{"class":467},[355,1553,481],{"class":467},[355,1555,1499],{"class":365},[355,1557,487],{"class":467},[355,1559,672],{"class":467},[355,1561,1562,1565,1567],{"class":357,"line":557},[355,1563,1564],{"class":569},"      content",[355,1566,545],{"class":467},[355,1568,554],{"class":467},[355,1570,1571,1574,1576,1578,1580,1582,1585,1587,1589],{"class":357,"line":579},[355,1572,1573],{"class":467},"        '",[355,1575,1059],{"class":569},[355,1577,487],{"class":467},[355,1579,545],{"class":467},[355,1581,468],{"class":467},[355,1583,1584],{"class":569}," schema",[355,1586,545],{"class":467},[355,1588,1382],{"class":471},[355,1590,1591],{"class":467},"},\n",[355,1593,1594],{"class":357,"line":844},[355,1595,1137],{"class":467},[355,1597,1598],{"class":357,"line":853},[355,1599,1143],{"class":467},[355,1601,1602],{"class":357,"line":858},[355,1603,1604],{"class":467},"  },\n",[355,1606,1607,1609],{"class":357,"line":878},[355,1608,677],{"class":467},[355,1610,941],{"class":471},[338,1612,1614],{"id":1613},"plugin-options","Plugin options",[278,1616,1617,1619,1620,545],{},[282,1618,572],{}," accepts optional ",[282,1621,1622],{},"SchemaPluginOptions",[345,1624,1626],{"className":453,"code":1625,"language":456,"meta":351,"style":351},"import { SchemaPlugin } from '@vercube\u002Fschema';\n\napp.addPlugin(SchemaPlugin, {\n  scalar: {\n    pageTitle: 'My API',\n    openApiUrl: '\u002F_schema\u002F',\n    config: { theme: 'purple' },\n  },\n});\n\n\u002F\u002F Disable Scalar UI (OpenAPI JSON remains at \u002F_schema\u002F):\napp.addPlugin(SchemaPlugin, { scalar: false });\n",[282,1627,1628,1648,1652,1667,1676,1692,1707,1731,1735,1743,1747,1753],{"__ignoreMap":351},[355,1629,1630,1632,1634,1636,1638,1640,1642,1644,1646],{"class":357,"line":358},[355,1631,464],{"class":463},[355,1633,468],{"class":467},[355,1635,500],{"class":471},[355,1637,475],{"class":467},[355,1639,478],{"class":463},[355,1641,481],{"class":467},[355,1643,284],{"class":365},[355,1645,487],{"class":467},[355,1647,490],{"class":467},[355,1649,1650],{"class":357,"line":493},[355,1651,518],{"emptyLinePlaceholder":56},[355,1653,1654,1656,1658,1660,1663,1665],{"class":357,"line":515},[355,1655,542],{"class":471},[355,1657,563],{"class":467},[355,1659,566],{"class":534},[355,1661,1662],{"class":471},"(SchemaPlugin",[355,1664,606],{"class":467},[355,1666,554],{"class":467},[355,1668,1669,1672,1674],{"class":357,"line":521},[355,1670,1671],{"class":569},"  scalar",[355,1673,545],{"class":467},[355,1675,554],{"class":467},[355,1677,1678,1681,1683,1685,1688,1690],{"class":357,"line":557},[355,1679,1680],{"class":569},"    pageTitle",[355,1682,545],{"class":467},[355,1684,481],{"class":467},[355,1686,1687],{"class":365},"My API",[355,1689,487],{"class":467},[355,1691,672],{"class":467},[355,1693,1694,1697,1699,1701,1703,1705],{"class":357,"line":579},[355,1695,1696],{"class":569},"    openApiUrl",[355,1698,545],{"class":467},[355,1700,481],{"class":467},[355,1702,1328],{"class":365},[355,1704,487],{"class":467},[355,1706,672],{"class":467},[355,1708,1709,1712,1714,1716,1719,1721,1723,1726,1728],{"class":357,"line":844},[355,1710,1711],{"class":569},"    config",[355,1713,545],{"class":467},[355,1715,468],{"class":467},[355,1717,1718],{"class":569}," theme",[355,1720,545],{"class":467},[355,1722,481],{"class":467},[355,1724,1725],{"class":365},"purple",[355,1727,487],{"class":467},[355,1729,1730],{"class":467}," },\n",[355,1732,1733],{"class":357,"line":853},[355,1734,1604],{"class":467},[355,1736,1737,1739,1741],{"class":357,"line":858},[355,1738,677],{"class":467},[355,1740,551],{"class":471},[355,1742,490],{"class":467},[355,1744,1745],{"class":357,"line":878},[355,1746,518],{"emptyLinePlaceholder":56},[355,1748,1749],{"class":357,"line":909},[355,1750,1752],{"class":1751},"sHwdD","\u002F\u002F Disable Scalar UI (OpenAPI JSON remains at \u002F_schema\u002F):\n",[355,1754,1755,1757,1759,1761,1763,1765,1767,1770,1772,1776,1778,1780],{"class":357,"line":918},[355,1756,542],{"class":471},[355,1758,563],{"class":467},[355,1760,566],{"class":534},[355,1762,1662],{"class":471},[355,1764,606],{"class":467},[355,1766,468],{"class":467},[355,1768,1769],{"class":569}," scalar",[355,1771,545],{"class":467},[355,1773,1775],{"class":1774},"sfNiH"," false",[355,1777,475],{"class":467},[355,1779,551],{"class":471},[355,1781,490],{"class":467},[278,1783,1784,1785,1788],{},"See ",[294,1786,1787],{"href":140},"Scalar integration"," for all Scalar-related options.",[338,1790,1792],{"id":1791},"relationship-to-validation","Relationship to validation",[278,1794,1795,1796,1799,1800,1802,1803,1805],{},"Schema generation is ",[287,1797,1798],{},"additive"," to ",[294,1801,49],{"href":50},". Validation runs on every request via middleware; ",[282,1804,313],{}," only affects documentation and the generated OpenAPI spec. Use the same Zod schemas for both when possible so docs stay in sync with runtime behavior.",[1807,1808,1809],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":351,"searchDepth":358,"depth":493,"links":1811},[1812,1813,1814,1815,1816],{"id":340,"depth":493,"text":18},{"id":441,"depth":493,"text":442},{"id":1364,"depth":493,"text":1365},{"id":1613,"depth":493,"text":1614},{"id":1791,"depth":493,"text":1792},"OpenAPI generation and interactive API docs for Vercube","md",null,{},{"title":66,"description":1817},"SIjhYk2Af8tgNd8YEGBjQmC5ic7qUGwfG0isqjSgBSE",[1824,1826],{"title":90,"path":125,"stem":126,"description":1825,"children":-1},"Complete API reference for all WebSocket decorators",{"title":70,"path":136,"stem":137,"description":1827,"children":-1},"OpenAPI metadata with the @Schema decorator",1782807886979]