[{"data":1,"prerenderedAt":5781},["ShallowReactive",2],{"navigation":3,"docs-path-index":152,"-docs-core-features-validation":198,"-docs-core-features-validation-surround":5777},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":52},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,26,53,138],{"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,109,123,134],{"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},"Drivers","\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,101,105],{"title":66,"path":99,"stem":100},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":102,"path":103,"stem":104},"AWS Lambda","\u002Fdocs\u002Fmodules\u002Fserverless\u002Faws-lambda","docs\u002F3.modules\u002F3.serverless\u002F1.aws-lambda",{"title":106,"path":107,"stem":108},"Azure Functions","\u002Fdocs\u002Fmodules\u002Fserverless\u002Fazure-functions","docs\u002F3.modules\u002F3.serverless\u002F2.azure-functions",{"title":110,"icon":52,"defaultOpen":52,"path":111,"stem":112,"children":113,"page":52},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[114,117,120],{"title":66,"path":115,"stem":116},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":86,"path":118,"stem":119},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":90,"path":121,"stem":122},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":124,"icon":52,"defaultOpen":52,"path":125,"stem":126,"children":127,"page":52},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[128,131],{"title":66,"path":129,"stem":130},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":90,"path":132,"stem":133},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":135,"path":136,"stem":137},"MCP","\u002Fdocs\u002Fmodules\u002Fmcp","docs\u002F3.modules\u002F6.mcp",{"title":139,"icon":140,"defaultOpen":52,"path":141,"stem":142,"children":143,"page":52},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[144,148],{"title":145,"path":146,"stem":147},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":149,"path":150,"stem":151},"Custom Plugin","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",[153,155,157,158,159,160,162,163,164,165,166,167,169,171,172,173,174,176,177,178,179,181,182,183,184,186,187,188,189,191,192,193,194,196,197],{"path":154},"\u002Fdocs\u002F.navigation",{"path":156},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":161},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":34},{"path":38},{"path":42},{"path":46},{"path":50},{"path":168},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":170},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":67},{"path":71},{"path":75},{"path":175},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":83},{"path":87},{"path":91},{"path":180},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":99},{"path":103},{"path":107},{"path":185},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":115},{"path":118},{"path":121},{"path":190},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":129},{"path":132},{"path":136},{"path":195},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":146},{"path":150},{"id":199,"title":49,"body":200,"description":5771,"extension":5772,"links":5773,"meta":5774,"navigation":56,"path":50,"seo":5775,"stem":51,"__hash__":5776},"docs\u002Fdocs\u002F2.core-features\u002F4.validation.md",{"type":201,"value":202,"toc":5746},"minimark",[203,207,212,215,220,497,501,713,717,733,738,742,749,783,787,797,801,804,852,858,862,865,1947,1951,1954,2375,2517,2527,2531,2534,2611,2837,2842,2846,2849,3153,3157,4033,4036,4187,4191,4194,4417,4421,4424,4704,4959,4963,4969,5091,5097,5197,5203,5349,5355,5498,5504,5666,5670,5673,5675,5681,5695,5697,5702,5716,5718,5723,5737,5742],[204,205,206],"p",{},"Validation in Vercube ensures that incoming data meets your requirements before it reaches your business logic. Instead of manually checking every field, Vercube automatically validates and transforms request data using industry-standard validation libraries.",[208,209,211],"h2",{"id":210},"what-is-validation","What is Validation?",[204,213,214],{},"Validation is the process of checking if incoming data is correct, complete, and safe to use. Without validation, your API is vulnerable to bad data, which can cause crashes, security issues, or data corruption.",[216,217,219],"h3",{"id":218},"the-problem-without-validation","The Problem Without Validation",[221,222,227],"pre",{"className":223,"code":224,"language":225,"meta":226,"style":226},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@Post('\u002Fusers')\ncreateUser(@Body() data: any) {\n  \u002F\u002F ❌ What if email is missing?\n  \u002F\u002F ❌ What if age is negative?\n  \u002F\u002F ❌ What if name is 1000 characters long?\n  \u002F\u002F ❌ What if data is not even an object?\n  \n  \u002F\u002F Manual validation is tedious and error-prone\n  if (!data.email) throw new Error('Email required');\n  if (typeof data.age !== 'number') throw new Error('Age must be number');\n  if (data.age \u003C 0) throw new Error('Age must be positive');\n  \u002F\u002F ... and so on for every field\n  \n  return this.userService.create(data);\n}\n","ts","",[228,229,230,259,277,284,290,296,302,309,315,364,414,455,461,466,491],"code",{"__ignoreMap":226},[231,232,235,239,243,247,250,254,256],"span",{"class":233,"line":234},"line",1,[231,236,238],{"class":237},"sMK4o","@",[231,240,242],{"class":241},"s2Zo4","Post",[231,244,246],{"class":245},"sTEyZ","(",[231,248,249],{"class":237},"'",[231,251,253],{"class":252},"sfazB","\u002Fusers",[231,255,249],{"class":237},[231,257,258],{"class":245},")\n",[231,260,262,265,268,271,274],{"class":233,"line":261},2,[231,263,264],{"class":241},"createUser",[231,266,267],{"class":245},"(@",[231,269,270],{"class":241},"Body",[231,272,273],{"class":245},"() data: any) ",[231,275,276],{"class":237},"{\n",[231,278,280],{"class":233,"line":279},3,[231,281,283],{"class":282},"sHwdD","  \u002F\u002F ❌ What if email is missing?\n",[231,285,287],{"class":233,"line":286},4,[231,288,289],{"class":282},"  \u002F\u002F ❌ What if age is negative?\n",[231,291,293],{"class":233,"line":292},5,[231,294,295],{"class":282},"  \u002F\u002F ❌ What if name is 1000 characters long?\n",[231,297,299],{"class":233,"line":298},6,[231,300,301],{"class":282},"  \u002F\u002F ❌ What if data is not even an object?\n",[231,303,305],{"class":233,"line":304},7,[231,306,308],{"class":307},"swJcz","  \n",[231,310,312],{"class":233,"line":311},8,[231,313,314],{"class":282},"  \u002F\u002F Manual validation is tedious and error-prone\n",[231,316,318,322,325,328,331,334,337,340,343,346,349,351,353,356,358,361],{"class":233,"line":317},9,[231,319,321],{"class":320},"s7zQu","  if",[231,323,324],{"class":307}," (",[231,326,327],{"class":237},"!",[231,329,330],{"class":245},"data",[231,332,333],{"class":237},".",[231,335,336],{"class":245},"email",[231,338,339],{"class":307},") ",[231,341,342],{"class":320},"throw",[231,344,345],{"class":237}," new",[231,347,348],{"class":241}," Error",[231,350,246],{"class":307},[231,352,249],{"class":237},[231,354,355],{"class":252},"Email required",[231,357,249],{"class":237},[231,359,360],{"class":307},")",[231,362,363],{"class":237},";\n",[231,365,367,369,371,374,377,379,382,385,388,391,393,395,397,399,401,403,405,408,410,412],{"class":233,"line":366},10,[231,368,321],{"class":320},[231,370,324],{"class":307},[231,372,373],{"class":237},"typeof",[231,375,376],{"class":245}," data",[231,378,333],{"class":237},[231,380,381],{"class":245},"age",[231,383,384],{"class":237}," !==",[231,386,387],{"class":237}," '",[231,389,390],{"class":252},"number",[231,392,249],{"class":237},[231,394,339],{"class":307},[231,396,342],{"class":320},[231,398,345],{"class":237},[231,400,348],{"class":241},[231,402,246],{"class":307},[231,404,249],{"class":237},[231,406,407],{"class":252},"Age must be number",[231,409,249],{"class":237},[231,411,360],{"class":307},[231,413,363],{"class":237},[231,415,417,419,421,423,425,427,430,434,436,438,440,442,444,446,449,451,453],{"class":233,"line":416},11,[231,418,321],{"class":320},[231,420,324],{"class":307},[231,422,330],{"class":245},[231,424,333],{"class":237},[231,426,381],{"class":245},[231,428,429],{"class":237}," \u003C",[231,431,433],{"class":432},"sbssI"," 0",[231,435,339],{"class":307},[231,437,342],{"class":320},[231,439,345],{"class":237},[231,441,348],{"class":241},[231,443,246],{"class":307},[231,445,249],{"class":237},[231,447,448],{"class":252},"Age must be positive",[231,450,249],{"class":237},[231,452,360],{"class":307},[231,454,363],{"class":237},[231,456,458],{"class":233,"line":457},12,[231,459,460],{"class":282},"  \u002F\u002F ... and so on for every field\n",[231,462,464],{"class":233,"line":463},13,[231,465,308],{"class":307},[231,467,469,472,475,478,480,483,485,487,489],{"class":233,"line":468},14,[231,470,471],{"class":320},"  return",[231,473,474],{"class":237}," this.",[231,476,477],{"class":245},"userService",[231,479,333],{"class":237},[231,481,482],{"class":241},"create",[231,484,246],{"class":307},[231,486,330],{"class":245},[231,488,360],{"class":307},[231,490,363],{"class":237},[231,492,494],{"class":233,"line":493},15,[231,495,496],{"class":237},"}\n",[216,498,500],{"id":499},"the-solution-with-validation","The Solution With Validation",[221,502,504],{"className":223,"code":503,"language":225,"meta":226,"style":226},"const CreateUserSchema = z.object({\n  email: z.string().email(),\n  age: z.number().min(0),\n  name: z.string().max(100)\n});\n\n@Post('\u002Fusers')\ncreateUser(@Body({ validationSchema: CreateUserSchema }) data: CreateUserDto) {\n  \u002F\u002F ✅ Data is guaranteed to be valid\n  \u002F\u002F ✅ Automatic 400 response if validation fails\n  \u002F\u002F ✅ Type-safe and clean\n  \n  return this.userService.create(data);\n}\n",[228,505,506,530,557,586,613,622,627,643,670,675,680,685,689,709],{"__ignoreMap":226},[231,507,508,512,515,518,521,523,526,528],{"class":233,"line":234},[231,509,511],{"class":510},"spNyl","const",[231,513,514],{"class":245}," CreateUserSchema ",[231,516,517],{"class":237},"=",[231,519,520],{"class":245}," z",[231,522,333],{"class":237},[231,524,525],{"class":241},"object",[231,527,246],{"class":245},[231,529,276],{"class":237},[231,531,532,535,538,540,542,545,548,550,552,554],{"class":233,"line":261},[231,533,534],{"class":307},"  email",[231,536,537],{"class":237},":",[231,539,520],{"class":245},[231,541,333],{"class":237},[231,543,544],{"class":241},"string",[231,546,547],{"class":245},"()",[231,549,333],{"class":237},[231,551,336],{"class":241},[231,553,547],{"class":245},[231,555,556],{"class":237},",\n",[231,558,559,562,564,566,568,570,572,574,577,579,582,584],{"class":233,"line":279},[231,560,561],{"class":307},"  age",[231,563,537],{"class":237},[231,565,520],{"class":245},[231,567,333],{"class":237},[231,569,390],{"class":241},[231,571,547],{"class":245},[231,573,333],{"class":237},[231,575,576],{"class":241},"min",[231,578,246],{"class":245},[231,580,581],{"class":432},"0",[231,583,360],{"class":245},[231,585,556],{"class":237},[231,587,588,591,593,595,597,599,601,603,606,608,611],{"class":233,"line":286},[231,589,590],{"class":307},"  name",[231,592,537],{"class":237},[231,594,520],{"class":245},[231,596,333],{"class":237},[231,598,544],{"class":241},[231,600,547],{"class":245},[231,602,333],{"class":237},[231,604,605],{"class":241},"max",[231,607,246],{"class":245},[231,609,610],{"class":432},"100",[231,612,258],{"class":245},[231,614,615,618,620],{"class":233,"line":292},[231,616,617],{"class":237},"}",[231,619,360],{"class":245},[231,621,363],{"class":237},[231,623,624],{"class":233,"line":298},[231,625,626],{"emptyLinePlaceholder":56},"\n",[231,628,629,631,633,635,637,639,641],{"class":233,"line":304},[231,630,238],{"class":237},[231,632,242],{"class":241},[231,634,246],{"class":245},[231,636,249],{"class":237},[231,638,253],{"class":252},[231,640,249],{"class":237},[231,642,258],{"class":245},[231,644,645,647,649,651,653,656,659,661,663,665,668],{"class":233,"line":311},[231,646,264],{"class":241},[231,648,267],{"class":245},[231,650,270],{"class":241},[231,652,246],{"class":245},[231,654,655],{"class":237},"{",[231,657,658],{"class":307}," validationSchema",[231,660,537],{"class":237},[231,662,514],{"class":245},[231,664,617],{"class":237},[231,666,667],{"class":245},") data: CreateUserDto) ",[231,669,276],{"class":237},[231,671,672],{"class":233,"line":317},[231,673,674],{"class":282},"  \u002F\u002F ✅ Data is guaranteed to be valid\n",[231,676,677],{"class":233,"line":366},[231,678,679],{"class":282},"  \u002F\u002F ✅ Automatic 400 response if validation fails\n",[231,681,682],{"class":233,"line":416},[231,683,684],{"class":282},"  \u002F\u002F ✅ Type-safe and clean\n",[231,686,687],{"class":233,"line":457},[231,688,308],{"class":307},[231,690,691,693,695,697,699,701,703,705,707],{"class":233,"line":463},[231,692,471],{"class":320},[231,694,474],{"class":237},[231,696,477],{"class":245},[231,698,333],{"class":237},[231,700,482],{"class":241},[231,702,246],{"class":307},[231,704,330],{"class":245},[231,706,360],{"class":307},[231,708,363],{"class":237},[231,710,711],{"class":233,"line":468},[231,712,496],{"class":237},[208,714,716],{"id":715},"how-validation-works","How Validation Works",[204,718,719,720,727,728,732],{},"Vercube's validation system is built on ",[721,722,726],"a",{"href":723,"rel":724},"https:\u002F\u002Fstandardschema.dev\u002F",[725],"nofollow","Standard Schema",", which means it works with ",[729,730,731],"strong",{},"any"," validation library that follows this standard. You're not locked into a specific library!",[734,735],"img",{"src":736,"alt":737},"\u002Fimages\u002Fvalidation-1.svg","how validation works",[216,739,741],{"id":740},"what-happens-behind-the-scenes","What Happens Behind the Scenes",[204,743,744,745,748],{},"When you add ",[228,746,747],{},"validationSchema"," to a decorator:",[750,751,752,759,765,771,777],"ol",{},[753,754,755,758],"li",{},[729,756,757],{},"Vercube registers a validation middleware"," that runs before your handler",[753,760,761,764],{},[729,762,763],{},"The middleware extracts the data"," (from body, query params, etc.)",[753,766,767,770],{},[729,768,769],{},"Your schema validates and transforms"," the data",[753,772,773,776],{},[729,774,775],{},"If validation fails",", Vercube automatically returns a 400 error with details",[753,778,779,782],{},[729,780,781],{},"If validation succeeds",", your handler receives clean, type-safe data",[208,784,786],{"id":785},"standard-schema-support","Standard Schema Support",[204,788,789,790,792,793,796],{},"Vercube supports ",[729,791,731],{}," validation library that implements the ",[721,794,726],{"href":723,"rel":795},[725]," specification. This gives you the freedom to choose the library that best fits your needs.",[216,798,800],{"id":799},"supported-libraries","Supported Libraries",[204,802,803],{},"All of these work out of the box:",[805,806,807,817,827,837,847],"ul",{},[753,808,809,816],{},[729,810,811],{},[721,812,815],{"href":813,"rel":814},"https:\u002F\u002Fzod.dev\u002F",[725],"Zod"," - TypeScript-first schema validation",[753,818,819,826],{},[729,820,821],{},[721,822,825],{"href":823,"rel":824},"https:\u002F\u002Fvalibot.dev\u002F",[725],"Valibot"," - Lightweight, modular validation",[753,828,829,836],{},[729,830,831],{},[721,832,835],{"href":833,"rel":834},"https:\u002F\u002Farktype.io\u002F",[725],"ArkType"," - TypeScript-native runtime validation",[753,838,839,846],{},[729,840,841],{},[721,842,845],{"href":843,"rel":844},"https:\u002F\u002Fgithub.com\u002Fsinclairzx81\u002Ftypebox",[725],"Typebox"," - JSON Schema based validation",[753,848,849],{},[729,850,851],{},"And any other Standard Schema compatible library!",[853,854,855],"tip",{},[204,856,857],{},"You can even mix different libraries in the same project! Use Zod for complex validations and Valibot for simple ones - Vercube doesn't care, it works with all of them.",[208,859,861],{"id":860},"validating-request-body","Validating Request Body",[204,863,864],{},"The most common use case is validating JSON request bodies. Choose your preferred validation library - they all work the same way in Vercube:",[866,867,868,1263,1675],"code-group",{},[221,869,871],{"className":223,"code":870,"filename":815,"language":225,"meta":226,"style":226},"import { z } from 'zod';\n\nconst CreateUserSchema = z.object({\n  name: z.string().min(2).max(50),\n  email: z.string().email(),\n  age: z.number().int().min(18).max(120),\n  role: z.enum(['user', 'admin']).default('user')\n});\n\ntype CreateUserDto = z.infer\u003Ctypeof CreateUserSchema>;\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Post('\u002F')\n  @Status(201)\n  createUser(@Body({ validationSchema: CreateUserSchema }) data: CreateUserDto) {\n    \u002F\u002F data is validated and typed!\n    return this.userService.create(data);\n  }\n}\n",[228,872,873,898,902,920,958,980,1025,1077,1085,1089,1117,1121,1138,1152,1156,1174,1189,1224,1230,1252,1258],{"__ignoreMap":226},[231,874,875,878,881,883,886,889,891,894,896],{"class":233,"line":234},[231,876,877],{"class":320},"import",[231,879,880],{"class":237}," {",[231,882,520],{"class":245},[231,884,885],{"class":237}," }",[231,887,888],{"class":320}," from",[231,890,387],{"class":237},[231,892,893],{"class":252},"zod",[231,895,249],{"class":237},[231,897,363],{"class":237},[231,899,900],{"class":233,"line":261},[231,901,626],{"emptyLinePlaceholder":56},[231,903,904,906,908,910,912,914,916,918],{"class":233,"line":279},[231,905,511],{"class":510},[231,907,514],{"class":245},[231,909,517],{"class":237},[231,911,520],{"class":245},[231,913,333],{"class":237},[231,915,525],{"class":241},[231,917,246],{"class":245},[231,919,276],{"class":237},[231,921,922,924,926,928,930,932,934,936,938,940,943,945,947,949,951,954,956],{"class":233,"line":286},[231,923,590],{"class":307},[231,925,537],{"class":237},[231,927,520],{"class":245},[231,929,333],{"class":237},[231,931,544],{"class":241},[231,933,547],{"class":245},[231,935,333],{"class":237},[231,937,576],{"class":241},[231,939,246],{"class":245},[231,941,942],{"class":432},"2",[231,944,360],{"class":245},[231,946,333],{"class":237},[231,948,605],{"class":241},[231,950,246],{"class":245},[231,952,953],{"class":432},"50",[231,955,360],{"class":245},[231,957,556],{"class":237},[231,959,960,962,964,966,968,970,972,974,976,978],{"class":233,"line":292},[231,961,534],{"class":307},[231,963,537],{"class":237},[231,965,520],{"class":245},[231,967,333],{"class":237},[231,969,544],{"class":241},[231,971,547],{"class":245},[231,973,333],{"class":237},[231,975,336],{"class":241},[231,977,547],{"class":245},[231,979,556],{"class":237},[231,981,982,984,986,988,990,992,994,996,999,1001,1003,1005,1007,1010,1012,1014,1016,1018,1021,1023],{"class":233,"line":298},[231,983,561],{"class":307},[231,985,537],{"class":237},[231,987,520],{"class":245},[231,989,333],{"class":237},[231,991,390],{"class":241},[231,993,547],{"class":245},[231,995,333],{"class":237},[231,997,998],{"class":241},"int",[231,1000,547],{"class":245},[231,1002,333],{"class":237},[231,1004,576],{"class":241},[231,1006,246],{"class":245},[231,1008,1009],{"class":432},"18",[231,1011,360],{"class":245},[231,1013,333],{"class":237},[231,1015,605],{"class":241},[231,1017,246],{"class":245},[231,1019,1020],{"class":432},"120",[231,1022,360],{"class":245},[231,1024,556],{"class":237},[231,1026,1027,1030,1032,1034,1036,1039,1042,1044,1047,1049,1052,1054,1057,1059,1062,1064,1067,1069,1071,1073,1075],{"class":233,"line":304},[231,1028,1029],{"class":307},"  role",[231,1031,537],{"class":237},[231,1033,520],{"class":245},[231,1035,333],{"class":237},[231,1037,1038],{"class":241},"enum",[231,1040,1041],{"class":245},"([",[231,1043,249],{"class":237},[231,1045,1046],{"class":252},"user",[231,1048,249],{"class":237},[231,1050,1051],{"class":237},",",[231,1053,387],{"class":237},[231,1055,1056],{"class":252},"admin",[231,1058,249],{"class":237},[231,1060,1061],{"class":245},"])",[231,1063,333],{"class":237},[231,1065,1066],{"class":241},"default",[231,1068,246],{"class":245},[231,1070,249],{"class":237},[231,1072,1046],{"class":252},[231,1074,249],{"class":237},[231,1076,258],{"class":245},[231,1078,1079,1081,1083],{"class":233,"line":311},[231,1080,617],{"class":237},[231,1082,360],{"class":245},[231,1084,363],{"class":237},[231,1086,1087],{"class":233,"line":317},[231,1088,626],{"emptyLinePlaceholder":56},[231,1090,1091,1094,1098,1101,1103,1105,1108,1111,1114],{"class":233,"line":366},[231,1092,1093],{"class":510},"type",[231,1095,1097],{"class":1096},"sBMFI"," CreateUserDto",[231,1099,1100],{"class":237}," =",[231,1102,520],{"class":1096},[231,1104,333],{"class":237},[231,1106,1107],{"class":1096},"infer",[231,1109,1110],{"class":237},"\u003Ctypeof",[231,1112,1113],{"class":245}," CreateUserSchema",[231,1115,1116],{"class":237},">;\n",[231,1118,1119],{"class":233,"line":416},[231,1120,626],{"emptyLinePlaceholder":56},[231,1122,1123,1125,1128,1130,1132,1134,1136],{"class":233,"line":457},[231,1124,238],{"class":237},[231,1126,1127],{"class":241},"Controller",[231,1129,246],{"class":245},[231,1131,249],{"class":237},[231,1133,253],{"class":252},[231,1135,249],{"class":237},[231,1137,258],{"class":245},[231,1139,1140,1143,1146,1149],{"class":233,"line":463},[231,1141,1142],{"class":320},"export",[231,1144,1145],{"class":510}," class",[231,1147,1148],{"class":1096}," UserController",[231,1150,1151],{"class":237}," {\n",[231,1153,1154],{"class":233,"line":468},[231,1155,308],{"class":245},[231,1157,1158,1161,1163,1165,1167,1170,1172],{"class":233,"line":493},[231,1159,1160],{"class":237},"  @",[231,1162,242],{"class":241},[231,1164,246],{"class":245},[231,1166,249],{"class":237},[231,1168,1169],{"class":252},"\u002F",[231,1171,249],{"class":237},[231,1173,258],{"class":245},[231,1175,1177,1179,1182,1184,1187],{"class":233,"line":1176},16,[231,1178,1160],{"class":237},[231,1180,1181],{"class":241},"Status",[231,1183,246],{"class":245},[231,1185,1186],{"class":432},"201",[231,1188,258],{"class":245},[231,1190,1192,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1216,1218,1220,1222],{"class":233,"line":1191},17,[231,1193,1194],{"class":307},"  createUser",[231,1196,267],{"class":237},[231,1198,270],{"class":241},[231,1200,246],{"class":245},[231,1202,655],{"class":237},[231,1204,658],{"class":307},[231,1206,537],{"class":237},[231,1208,514],{"class":245},[231,1210,617],{"class":237},[231,1212,339],{"class":245},[231,1214,330],{"class":1215},"sHdIc",[231,1217,537],{"class":237},[231,1219,1097],{"class":1096},[231,1221,360],{"class":237},[231,1223,1151],{"class":237},[231,1225,1227],{"class":233,"line":1226},18,[231,1228,1229],{"class":282},"    \u002F\u002F data is validated and typed!\n",[231,1231,1233,1236,1238,1240,1242,1244,1246,1248,1250],{"class":233,"line":1232},19,[231,1234,1235],{"class":320},"    return",[231,1237,474],{"class":237},[231,1239,477],{"class":245},[231,1241,333],{"class":237},[231,1243,482],{"class":241},[231,1245,246],{"class":307},[231,1247,330],{"class":245},[231,1249,360],{"class":307},[231,1251,363],{"class":237},[231,1253,1255],{"class":233,"line":1254},20,[231,1256,1257],{"class":237},"  }\n",[231,1259,1261],{"class":233,"line":1260},21,[231,1262,496],{"class":237},[221,1264,1266],{"className":223,"code":1265,"filename":825,"language":225,"meta":226,"style":226},"import * as v from 'valibot';\n\nconst CreateUserSchema = v.object({\n  name: v.pipe(v.string(), v.minLength(2), v.maxLength(50)),\n  email: v.pipe(v.string(), v.email()),\n  age: v.pipe(v.number(), v.integer(), v.minValue(18), v.maxValue(120)),\n  role: v.optional(v.picklist(['user', 'admin']), 'user')\n});\n\ntype CreateUserDto = v.InferOutput\u003Ctypeof CreateUserSchema>;\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Post('\u002F')\n  @Status(201)\n  createUser(@Body({ validationSchema: CreateUserSchema }) data: CreateUserDto) {\n    \u002F\u002F Same behavior, different library!\n    return this.userService.create(data);\n  }\n}\n",[228,1267,1268,1293,1297,1316,1371,1404,1467,1515,1523,1527,1548,1552,1568,1578,1582,1598,1610,1642,1647,1667,1671],{"__ignoreMap":226},[231,1269,1270,1272,1275,1278,1281,1284,1286,1289,1291],{"class":233,"line":234},[231,1271,877],{"class":320},[231,1273,1274],{"class":237}," *",[231,1276,1277],{"class":320}," as",[231,1279,1280],{"class":245}," v ",[231,1282,1283],{"class":320},"from",[231,1285,387],{"class":237},[231,1287,1288],{"class":252},"valibot",[231,1290,249],{"class":237},[231,1292,363],{"class":237},[231,1294,1295],{"class":233,"line":261},[231,1296,626],{"emptyLinePlaceholder":56},[231,1298,1299,1301,1303,1305,1308,1310,1312,1314],{"class":233,"line":279},[231,1300,511],{"class":510},[231,1302,514],{"class":245},[231,1304,517],{"class":237},[231,1306,1307],{"class":245}," v",[231,1309,333],{"class":237},[231,1311,525],{"class":241},[231,1313,246],{"class":245},[231,1315,276],{"class":237},[231,1317,1318,1320,1322,1324,1326,1329,1332,1334,1336,1338,1340,1342,1344,1347,1349,1351,1353,1355,1357,1359,1362,1364,1366,1369],{"class":233,"line":286},[231,1319,590],{"class":307},[231,1321,537],{"class":237},[231,1323,1307],{"class":245},[231,1325,333],{"class":237},[231,1327,1328],{"class":241},"pipe",[231,1330,1331],{"class":245},"(v",[231,1333,333],{"class":237},[231,1335,544],{"class":241},[231,1337,547],{"class":245},[231,1339,1051],{"class":237},[231,1341,1307],{"class":245},[231,1343,333],{"class":237},[231,1345,1346],{"class":241},"minLength",[231,1348,246],{"class":245},[231,1350,942],{"class":432},[231,1352,360],{"class":245},[231,1354,1051],{"class":237},[231,1356,1307],{"class":245},[231,1358,333],{"class":237},[231,1360,1361],{"class":241},"maxLength",[231,1363,246],{"class":245},[231,1365,953],{"class":432},[231,1367,1368],{"class":245},"))",[231,1370,556],{"class":237},[231,1372,1373,1375,1377,1379,1381,1383,1385,1387,1389,1391,1393,1395,1397,1399,1402],{"class":233,"line":292},[231,1374,534],{"class":307},[231,1376,537],{"class":237},[231,1378,1307],{"class":245},[231,1380,333],{"class":237},[231,1382,1328],{"class":241},[231,1384,1331],{"class":245},[231,1386,333],{"class":237},[231,1388,544],{"class":241},[231,1390,547],{"class":245},[231,1392,1051],{"class":237},[231,1394,1307],{"class":245},[231,1396,333],{"class":237},[231,1398,336],{"class":241},[231,1400,1401],{"class":245},"())",[231,1403,556],{"class":237},[231,1405,1406,1408,1410,1412,1414,1416,1418,1420,1422,1424,1426,1428,1430,1433,1435,1437,1439,1441,1444,1446,1448,1450,1452,1454,1456,1459,1461,1463,1465],{"class":233,"line":298},[231,1407,561],{"class":307},[231,1409,537],{"class":237},[231,1411,1307],{"class":245},[231,1413,333],{"class":237},[231,1415,1328],{"class":241},[231,1417,1331],{"class":245},[231,1419,333],{"class":237},[231,1421,390],{"class":241},[231,1423,547],{"class":245},[231,1425,1051],{"class":237},[231,1427,1307],{"class":245},[231,1429,333],{"class":237},[231,1431,1432],{"class":241},"integer",[231,1434,547],{"class":245},[231,1436,1051],{"class":237},[231,1438,1307],{"class":245},[231,1440,333],{"class":237},[231,1442,1443],{"class":241},"minValue",[231,1445,246],{"class":245},[231,1447,1009],{"class":432},[231,1449,360],{"class":245},[231,1451,1051],{"class":237},[231,1453,1307],{"class":245},[231,1455,333],{"class":237},[231,1457,1458],{"class":241},"maxValue",[231,1460,246],{"class":245},[231,1462,1020],{"class":432},[231,1464,1368],{"class":245},[231,1466,556],{"class":237},[231,1468,1469,1471,1473,1475,1477,1480,1482,1484,1487,1489,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509,1511,1513],{"class":233,"line":304},[231,1470,1029],{"class":307},[231,1472,537],{"class":237},[231,1474,1307],{"class":245},[231,1476,333],{"class":237},[231,1478,1479],{"class":241},"optional",[231,1481,1331],{"class":245},[231,1483,333],{"class":237},[231,1485,1486],{"class":241},"picklist",[231,1488,1041],{"class":245},[231,1490,249],{"class":237},[231,1492,1046],{"class":252},[231,1494,249],{"class":237},[231,1496,1051],{"class":237},[231,1498,387],{"class":237},[231,1500,1056],{"class":252},[231,1502,249],{"class":237},[231,1504,1061],{"class":245},[231,1506,1051],{"class":237},[231,1508,387],{"class":237},[231,1510,1046],{"class":252},[231,1512,249],{"class":237},[231,1514,258],{"class":245},[231,1516,1517,1519,1521],{"class":233,"line":311},[231,1518,617],{"class":237},[231,1520,360],{"class":245},[231,1522,363],{"class":237},[231,1524,1525],{"class":233,"line":317},[231,1526,626],{"emptyLinePlaceholder":56},[231,1528,1529,1531,1533,1535,1537,1539,1542,1544,1546],{"class":233,"line":366},[231,1530,1093],{"class":510},[231,1532,1097],{"class":1096},[231,1534,1100],{"class":237},[231,1536,1307],{"class":1096},[231,1538,333],{"class":237},[231,1540,1541],{"class":1096},"InferOutput",[231,1543,1110],{"class":237},[231,1545,1113],{"class":245},[231,1547,1116],{"class":237},[231,1549,1550],{"class":233,"line":416},[231,1551,626],{"emptyLinePlaceholder":56},[231,1553,1554,1556,1558,1560,1562,1564,1566],{"class":233,"line":457},[231,1555,238],{"class":237},[231,1557,1127],{"class":241},[231,1559,246],{"class":245},[231,1561,249],{"class":237},[231,1563,253],{"class":252},[231,1565,249],{"class":237},[231,1567,258],{"class":245},[231,1569,1570,1572,1574,1576],{"class":233,"line":463},[231,1571,1142],{"class":320},[231,1573,1145],{"class":510},[231,1575,1148],{"class":1096},[231,1577,1151],{"class":237},[231,1579,1580],{"class":233,"line":468},[231,1581,308],{"class":245},[231,1583,1584,1586,1588,1590,1592,1594,1596],{"class":233,"line":493},[231,1585,1160],{"class":237},[231,1587,242],{"class":241},[231,1589,246],{"class":245},[231,1591,249],{"class":237},[231,1593,1169],{"class":252},[231,1595,249],{"class":237},[231,1597,258],{"class":245},[231,1599,1600,1602,1604,1606,1608],{"class":233,"line":1176},[231,1601,1160],{"class":237},[231,1603,1181],{"class":241},[231,1605,246],{"class":245},[231,1607,1186],{"class":432},[231,1609,258],{"class":245},[231,1611,1612,1614,1616,1618,1620,1622,1624,1626,1628,1630,1632,1634,1636,1638,1640],{"class":233,"line":1191},[231,1613,1194],{"class":307},[231,1615,267],{"class":237},[231,1617,270],{"class":241},[231,1619,246],{"class":245},[231,1621,655],{"class":237},[231,1623,658],{"class":307},[231,1625,537],{"class":237},[231,1627,514],{"class":245},[231,1629,617],{"class":237},[231,1631,339],{"class":245},[231,1633,330],{"class":1215},[231,1635,537],{"class":237},[231,1637,1097],{"class":1096},[231,1639,360],{"class":237},[231,1641,1151],{"class":237},[231,1643,1644],{"class":233,"line":1226},[231,1645,1646],{"class":282},"    \u002F\u002F Same behavior, different library!\n",[231,1648,1649,1651,1653,1655,1657,1659,1661,1663,1665],{"class":233,"line":1232},[231,1650,1235],{"class":320},[231,1652,474],{"class":237},[231,1654,477],{"class":245},[231,1656,333],{"class":237},[231,1658,482],{"class":241},[231,1660,246],{"class":307},[231,1662,330],{"class":245},[231,1664,360],{"class":307},[231,1666,363],{"class":237},[231,1668,1669],{"class":233,"line":1254},[231,1670,1257],{"class":237},[231,1672,1673],{"class":233,"line":1260},[231,1674,496],{"class":237},[221,1676,1678],{"className":223,"code":1677,"filename":835,"language":225,"meta":226,"style":226},"import { type } from 'arktype';\n\nconst CreateUserSchema = type({\n  name: 'string>2\u003C50',\n  'email': 'string.email',\n  age: 'number.integer>=18\u003C=120',\n  'role?': '\"user\"|\"admin\" = \"user\"'\n});\n\ntype CreateUserDto = typeof CreateUserSchema.infer;\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Post('\u002F')\n  @Status(201)\n  createUser(@Body({ validationSchema: CreateUserSchema }) data: CreateUserDto) {\n    \u002F\u002F Works exactly the same!\n    return this.userService.create(data);\n  }\n}\n",[228,1679,1680,1702,1706,1720,1735,1755,1770,1789,1797,1801,1820,1824,1840,1850,1854,1870,1882,1914,1919,1939,1943],{"__ignoreMap":226},[231,1681,1682,1684,1686,1689,1691,1693,1695,1698,1700],{"class":233,"line":234},[231,1683,877],{"class":320},[231,1685,880],{"class":237},[231,1687,1688],{"class":245}," type",[231,1690,885],{"class":237},[231,1692,888],{"class":320},[231,1694,387],{"class":237},[231,1696,1697],{"class":252},"arktype",[231,1699,249],{"class":237},[231,1701,363],{"class":237},[231,1703,1704],{"class":233,"line":261},[231,1705,626],{"emptyLinePlaceholder":56},[231,1707,1708,1710,1712,1714,1716,1718],{"class":233,"line":279},[231,1709,511],{"class":510},[231,1711,514],{"class":245},[231,1713,517],{"class":237},[231,1715,1688],{"class":241},[231,1717,246],{"class":245},[231,1719,276],{"class":237},[231,1721,1722,1724,1726,1728,1731,1733],{"class":233,"line":286},[231,1723,590],{"class":307},[231,1725,537],{"class":237},[231,1727,387],{"class":237},[231,1729,1730],{"class":252},"string>2\u003C50",[231,1732,249],{"class":237},[231,1734,556],{"class":237},[231,1736,1737,1740,1742,1744,1746,1748,1751,1753],{"class":233,"line":292},[231,1738,1739],{"class":237},"  '",[231,1741,336],{"class":307},[231,1743,249],{"class":237},[231,1745,537],{"class":237},[231,1747,387],{"class":237},[231,1749,1750],{"class":252},"string.email",[231,1752,249],{"class":237},[231,1754,556],{"class":237},[231,1756,1757,1759,1761,1763,1766,1768],{"class":233,"line":298},[231,1758,561],{"class":307},[231,1760,537],{"class":237},[231,1762,387],{"class":237},[231,1764,1765],{"class":252},"number.integer>=18\u003C=120",[231,1767,249],{"class":237},[231,1769,556],{"class":237},[231,1771,1772,1774,1777,1779,1781,1783,1786],{"class":233,"line":304},[231,1773,1739],{"class":237},[231,1775,1776],{"class":307},"role?",[231,1778,249],{"class":237},[231,1780,537],{"class":237},[231,1782,387],{"class":237},[231,1784,1785],{"class":252},"\"user\"|\"admin\" = \"user\"",[231,1787,1788],{"class":237},"'\n",[231,1790,1791,1793,1795],{"class":233,"line":311},[231,1792,617],{"class":237},[231,1794,360],{"class":245},[231,1796,363],{"class":237},[231,1798,1799],{"class":233,"line":317},[231,1800,626],{"emptyLinePlaceholder":56},[231,1802,1803,1805,1807,1809,1812,1814,1816,1818],{"class":233,"line":366},[231,1804,1093],{"class":510},[231,1806,1097],{"class":1096},[231,1808,1100],{"class":237},[231,1810,1811],{"class":237}," typeof",[231,1813,1113],{"class":245},[231,1815,333],{"class":237},[231,1817,1107],{"class":245},[231,1819,363],{"class":237},[231,1821,1822],{"class":233,"line":416},[231,1823,626],{"emptyLinePlaceholder":56},[231,1825,1826,1828,1830,1832,1834,1836,1838],{"class":233,"line":457},[231,1827,238],{"class":237},[231,1829,1127],{"class":241},[231,1831,246],{"class":245},[231,1833,249],{"class":237},[231,1835,253],{"class":252},[231,1837,249],{"class":237},[231,1839,258],{"class":245},[231,1841,1842,1844,1846,1848],{"class":233,"line":463},[231,1843,1142],{"class":320},[231,1845,1145],{"class":510},[231,1847,1148],{"class":1096},[231,1849,1151],{"class":237},[231,1851,1852],{"class":233,"line":468},[231,1853,308],{"class":245},[231,1855,1856,1858,1860,1862,1864,1866,1868],{"class":233,"line":493},[231,1857,1160],{"class":237},[231,1859,242],{"class":241},[231,1861,246],{"class":245},[231,1863,249],{"class":237},[231,1865,1169],{"class":252},[231,1867,249],{"class":237},[231,1869,258],{"class":245},[231,1871,1872,1874,1876,1878,1880],{"class":233,"line":1176},[231,1873,1160],{"class":237},[231,1875,1181],{"class":241},[231,1877,246],{"class":245},[231,1879,1186],{"class":432},[231,1881,258],{"class":245},[231,1883,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910,1912],{"class":233,"line":1191},[231,1885,1194],{"class":307},[231,1887,267],{"class":237},[231,1889,270],{"class":241},[231,1891,246],{"class":245},[231,1893,655],{"class":237},[231,1895,658],{"class":307},[231,1897,537],{"class":237},[231,1899,514],{"class":245},[231,1901,617],{"class":237},[231,1903,339],{"class":245},[231,1905,330],{"class":1215},[231,1907,537],{"class":237},[231,1909,1097],{"class":1096},[231,1911,360],{"class":237},[231,1913,1151],{"class":237},[231,1915,1916],{"class":233,"line":1226},[231,1917,1918],{"class":282},"    \u002F\u002F Works exactly the same!\n",[231,1920,1921,1923,1925,1927,1929,1931,1933,1935,1937],{"class":233,"line":1232},[231,1922,1235],{"class":320},[231,1924,474],{"class":237},[231,1926,477],{"class":245},[231,1928,333],{"class":237},[231,1930,482],{"class":241},[231,1932,246],{"class":307},[231,1934,330],{"class":245},[231,1936,360],{"class":307},[231,1938,363],{"class":237},[231,1940,1941],{"class":233,"line":1254},[231,1942,1257],{"class":237},[231,1944,1945],{"class":233,"line":1260},[231,1946,496],{"class":237},[208,1948,1950],{"id":1949},"validating-query-parameters","Validating Query Parameters",[204,1952,1953],{},"Query parameters are always strings in HTTP, but validation libraries can transform them to the correct types:",[221,1955,1957],{"className":223,"code":1956,"language":225,"meta":226,"style":226},"import { z } from 'zod';\n\nconst SearchUsersSchema = z.object({\n  \u002F\u002F z.coerce converts strings to numbers\u002Fbooleans\n  page: z.coerce.number().int().min(1).default(1),\n  limit: z.coerce.number().int().min(1).max(100).default(10),\n  active: z.coerce.boolean().optional(),\n  role: z.enum(['user', 'admin']).optional(),\n  search: z.string().optional()\n});\n\ntype SearchUsersDto = z.infer\u003Ctypeof SearchUsersSchema>;\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Get('\u002F')\n  searchUsers(@QueryParams({ validationSchema: SearchUsersSchema }) query: SearchUsersDto) {\n    \u002F\u002F query.page is a number (not string!)\n    \u002F\u002F query.limit is a number (not string!)\n    \u002F\u002F query.active is a boolean (not string!)\n    \n    return this.userService.search(query);\n  }\n}\n",[228,1958,1959,1979,1983,2002,2007,2056,2114,2142,2180,2202,2210,2214,2236,2240,2256,2266,2270,2287,2322,2327,2332,2337,2343,2365,2370],{"__ignoreMap":226},[231,1960,1961,1963,1965,1967,1969,1971,1973,1975,1977],{"class":233,"line":234},[231,1962,877],{"class":320},[231,1964,880],{"class":237},[231,1966,520],{"class":245},[231,1968,885],{"class":237},[231,1970,888],{"class":320},[231,1972,387],{"class":237},[231,1974,893],{"class":252},[231,1976,249],{"class":237},[231,1978,363],{"class":237},[231,1980,1981],{"class":233,"line":261},[231,1982,626],{"emptyLinePlaceholder":56},[231,1984,1985,1987,1990,1992,1994,1996,1998,2000],{"class":233,"line":279},[231,1986,511],{"class":510},[231,1988,1989],{"class":245}," SearchUsersSchema ",[231,1991,517],{"class":237},[231,1993,520],{"class":245},[231,1995,333],{"class":237},[231,1997,525],{"class":241},[231,1999,246],{"class":245},[231,2001,276],{"class":237},[231,2003,2004],{"class":233,"line":286},[231,2005,2006],{"class":282},"  \u002F\u002F z.coerce converts strings to numbers\u002Fbooleans\n",[231,2008,2009,2012,2014,2016,2018,2021,2023,2025,2027,2029,2031,2033,2035,2037,2039,2042,2044,2046,2048,2050,2052,2054],{"class":233,"line":292},[231,2010,2011],{"class":307},"  page",[231,2013,537],{"class":237},[231,2015,520],{"class":245},[231,2017,333],{"class":237},[231,2019,2020],{"class":245},"coerce",[231,2022,333],{"class":237},[231,2024,390],{"class":241},[231,2026,547],{"class":245},[231,2028,333],{"class":237},[231,2030,998],{"class":241},[231,2032,547],{"class":245},[231,2034,333],{"class":237},[231,2036,576],{"class":241},[231,2038,246],{"class":245},[231,2040,2041],{"class":432},"1",[231,2043,360],{"class":245},[231,2045,333],{"class":237},[231,2047,1066],{"class":241},[231,2049,246],{"class":245},[231,2051,2041],{"class":432},[231,2053,360],{"class":245},[231,2055,556],{"class":237},[231,2057,2058,2061,2063,2065,2067,2069,2071,2073,2075,2077,2079,2081,2083,2085,2087,2089,2091,2093,2095,2097,2099,2101,2103,2105,2107,2110,2112],{"class":233,"line":298},[231,2059,2060],{"class":307},"  limit",[231,2062,537],{"class":237},[231,2064,520],{"class":245},[231,2066,333],{"class":237},[231,2068,2020],{"class":245},[231,2070,333],{"class":237},[231,2072,390],{"class":241},[231,2074,547],{"class":245},[231,2076,333],{"class":237},[231,2078,998],{"class":241},[231,2080,547],{"class":245},[231,2082,333],{"class":237},[231,2084,576],{"class":241},[231,2086,246],{"class":245},[231,2088,2041],{"class":432},[231,2090,360],{"class":245},[231,2092,333],{"class":237},[231,2094,605],{"class":241},[231,2096,246],{"class":245},[231,2098,610],{"class":432},[231,2100,360],{"class":245},[231,2102,333],{"class":237},[231,2104,1066],{"class":241},[231,2106,246],{"class":245},[231,2108,2109],{"class":432},"10",[231,2111,360],{"class":245},[231,2113,556],{"class":237},[231,2115,2116,2119,2121,2123,2125,2127,2129,2132,2134,2136,2138,2140],{"class":233,"line":304},[231,2117,2118],{"class":307},"  active",[231,2120,537],{"class":237},[231,2122,520],{"class":245},[231,2124,333],{"class":237},[231,2126,2020],{"class":245},[231,2128,333],{"class":237},[231,2130,2131],{"class":241},"boolean",[231,2133,547],{"class":245},[231,2135,333],{"class":237},[231,2137,1479],{"class":241},[231,2139,547],{"class":245},[231,2141,556],{"class":237},[231,2143,2144,2146,2148,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170,2172,2174,2176,2178],{"class":233,"line":311},[231,2145,1029],{"class":307},[231,2147,537],{"class":237},[231,2149,520],{"class":245},[231,2151,333],{"class":237},[231,2153,1038],{"class":241},[231,2155,1041],{"class":245},[231,2157,249],{"class":237},[231,2159,1046],{"class":252},[231,2161,249],{"class":237},[231,2163,1051],{"class":237},[231,2165,387],{"class":237},[231,2167,1056],{"class":252},[231,2169,249],{"class":237},[231,2171,1061],{"class":245},[231,2173,333],{"class":237},[231,2175,1479],{"class":241},[231,2177,547],{"class":245},[231,2179,556],{"class":237},[231,2181,2182,2185,2187,2189,2191,2193,2195,2197,2199],{"class":233,"line":317},[231,2183,2184],{"class":307},"  search",[231,2186,537],{"class":237},[231,2188,520],{"class":245},[231,2190,333],{"class":237},[231,2192,544],{"class":241},[231,2194,547],{"class":245},[231,2196,333],{"class":237},[231,2198,1479],{"class":241},[231,2200,2201],{"class":245},"()\n",[231,2203,2204,2206,2208],{"class":233,"line":366},[231,2205,617],{"class":237},[231,2207,360],{"class":245},[231,2209,363],{"class":237},[231,2211,2212],{"class":233,"line":416},[231,2213,626],{"emptyLinePlaceholder":56},[231,2215,2216,2218,2221,2223,2225,2227,2229,2231,2234],{"class":233,"line":457},[231,2217,1093],{"class":510},[231,2219,2220],{"class":1096}," SearchUsersDto",[231,2222,1100],{"class":237},[231,2224,520],{"class":1096},[231,2226,333],{"class":237},[231,2228,1107],{"class":1096},[231,2230,1110],{"class":237},[231,2232,2233],{"class":245}," SearchUsersSchema",[231,2235,1116],{"class":237},[231,2237,2238],{"class":233,"line":463},[231,2239,626],{"emptyLinePlaceholder":56},[231,2241,2242,2244,2246,2248,2250,2252,2254],{"class":233,"line":468},[231,2243,238],{"class":237},[231,2245,1127],{"class":241},[231,2247,246],{"class":245},[231,2249,249],{"class":237},[231,2251,253],{"class":252},[231,2253,249],{"class":237},[231,2255,258],{"class":245},[231,2257,2258,2260,2262,2264],{"class":233,"line":493},[231,2259,1142],{"class":320},[231,2261,1145],{"class":510},[231,2263,1148],{"class":1096},[231,2265,1151],{"class":237},[231,2267,2268],{"class":233,"line":1176},[231,2269,308],{"class":245},[231,2271,2272,2274,2277,2279,2281,2283,2285],{"class":233,"line":1191},[231,2273,1160],{"class":237},[231,2275,2276],{"class":241},"Get",[231,2278,246],{"class":245},[231,2280,249],{"class":237},[231,2282,1169],{"class":252},[231,2284,249],{"class":237},[231,2286,258],{"class":245},[231,2288,2289,2292,2294,2297,2299,2301,2303,2305,2307,2309,2311,2314,2316,2318,2320],{"class":233,"line":1226},[231,2290,2291],{"class":307},"  searchUsers",[231,2293,267],{"class":237},[231,2295,2296],{"class":241},"QueryParams",[231,2298,246],{"class":245},[231,2300,655],{"class":237},[231,2302,658],{"class":307},[231,2304,537],{"class":237},[231,2306,1989],{"class":245},[231,2308,617],{"class":237},[231,2310,339],{"class":245},[231,2312,2313],{"class":1215},"query",[231,2315,537],{"class":237},[231,2317,2220],{"class":1096},[231,2319,360],{"class":237},[231,2321,1151],{"class":237},[231,2323,2324],{"class":233,"line":1232},[231,2325,2326],{"class":282},"    \u002F\u002F query.page is a number (not string!)\n",[231,2328,2329],{"class":233,"line":1254},[231,2330,2331],{"class":282},"    \u002F\u002F query.limit is a number (not string!)\n",[231,2333,2334],{"class":233,"line":1260},[231,2335,2336],{"class":282},"    \u002F\u002F query.active is a boolean (not string!)\n",[231,2338,2340],{"class":233,"line":2339},22,[231,2341,2342],{"class":307},"    \n",[231,2344,2346,2348,2350,2352,2354,2357,2359,2361,2363],{"class":233,"line":2345},23,[231,2347,1235],{"class":320},[231,2349,474],{"class":237},[231,2351,477],{"class":245},[231,2353,333],{"class":237},[231,2355,2356],{"class":241},"search",[231,2358,246],{"class":307},[231,2360,2313],{"class":245},[231,2362,360],{"class":307},[231,2364,363],{"class":237},[231,2366,2368],{"class":233,"line":2367},24,[231,2369,1257],{"class":237},[231,2371,2373],{"class":233,"line":2372},25,[231,2374,496],{"class":237},[221,2376,2380],{"className":2377,"code":2378,"language":2379,"meta":226,"style":226},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Request:\nGET \u002Fusers?page=2&limit=20&active=true&role=admin\n\n# Your handler receives:\n{\n  page: 2,        \u002F\u002F number\n  limit: 20,      \u002F\u002F number  \n  active: true,   \u002F\u002F boolean\n  role: \"admin\"   \u002F\u002F string (enum validated)\n}\n","bash",[228,2381,2382,2387,2428,2432,2437,2441,2455,2471,2487,2513],{"__ignoreMap":226},[231,2383,2384],{"class":233,"line":234},[231,2385,2386],{"class":282},"# Request:\n",[231,2388,2389,2392,2395,2397,2400,2403,2405,2408,2410,2413,2415,2418,2420,2423,2425],{"class":233,"line":261},[231,2390,2391],{"class":1096},"GET",[231,2393,2394],{"class":252}," \u002Fusers?page=",[231,2396,942],{"class":432},[231,2398,2399],{"class":237},"&",[231,2401,2402],{"class":245},"limit",[231,2404,517],{"class":237},[231,2406,2407],{"class":252},"20",[231,2409,2399],{"class":237},[231,2411,2412],{"class":245},"active",[231,2414,517],{"class":237},[231,2416,2417],{"class":252},"true",[231,2419,2399],{"class":237},[231,2421,2422],{"class":245},"role",[231,2424,517],{"class":237},[231,2426,2427],{"class":252},"admin\n",[231,2429,2430],{"class":233,"line":279},[231,2431,626],{"emptyLinePlaceholder":56},[231,2433,2434],{"class":233,"line":286},[231,2435,2436],{"class":282},"# Your handler receives:\n",[231,2438,2439],{"class":233,"line":292},[231,2440,276],{"class":237},[231,2442,2443,2446,2449,2452],{"class":233,"line":298},[231,2444,2445],{"class":1096},"  page:",[231,2447,2448],{"class":252}," 2,",[231,2450,2451],{"class":252},"        \u002F\u002F",[231,2453,2454],{"class":252}," number\n",[231,2456,2457,2460,2463,2466,2469],{"class":233,"line":304},[231,2458,2459],{"class":1096},"  limit:",[231,2461,2462],{"class":252}," 20,",[231,2464,2465],{"class":252},"      \u002F\u002F",[231,2467,2468],{"class":252}," number",[231,2470,308],{"class":245},[231,2472,2473,2476,2479,2481,2484],{"class":233,"line":311},[231,2474,2475],{"class":1096},"  active:",[231,2477,2478],{"class":237}," true",[231,2480,1051],{"class":252},[231,2482,2483],{"class":252},"   \u002F\u002F",[231,2485,2486],{"class":252}," boolean\n",[231,2488,2489,2492,2495,2497,2500,2502,2505,2508,2511],{"class":233,"line":317},[231,2490,2491],{"class":1096},"  role:",[231,2493,2494],{"class":237}," \"",[231,2496,1056],{"class":252},[231,2498,2499],{"class":237},"\"",[231,2501,2483],{"class":252},[231,2503,2504],{"class":252}," string",[231,2506,2507],{"class":245}," (enum ",[231,2509,2510],{"class":252},"validated",[231,2512,258],{"class":245},[231,2514,2515],{"class":233,"line":366},[231,2516,496],{"class":237},[2518,2519,2520],"warning",{},[204,2521,2522,2523,2526],{},"Remember to use ",[228,2524,2525],{},".coerce"," methods (Zod) or equivalent transformations in other libraries to convert string query parameters to numbers, booleans, dates, etc.",[208,2528,2530],{"id":2529},"validation-errors","Validation Errors",[204,2532,2533],{},"When validation fails, Vercube automatically returns a structured error response:",[221,2535,2537],{"className":2377,"code":2536,"language":2379,"meta":226,"style":226},"# Invalid request:\nPOST \u002Fusers\n{\n  \"name\": \"A\",           # Too short\n  \"email\": \"invalid\",    # Not an email\n  \"age\": 15              # Too young\n}\n",[228,2538,2539,2544,2552,2556,2575,2594,2607],{"__ignoreMap":226},[231,2540,2541],{"class":233,"line":234},[231,2542,2543],{"class":282},"# Invalid request:\n",[231,2545,2546,2549],{"class":233,"line":261},[231,2547,2548],{"class":1096},"POST",[231,2550,2551],{"class":252}," \u002Fusers\n",[231,2553,2554],{"class":233,"line":279},[231,2555,276],{"class":237},[231,2557,2558,2561,2563,2565,2568,2570,2572],{"class":233,"line":286},[231,2559,2560],{"class":1096},"  \"name\"",[231,2562,537],{"class":241},[231,2564,2494],{"class":237},[231,2566,2567],{"class":252},"A",[231,2569,2499],{"class":237},[231,2571,1051],{"class":252},[231,2573,2574],{"class":282},"           # Too short\n",[231,2576,2577,2580,2582,2584,2587,2589,2591],{"class":233,"line":292},[231,2578,2579],{"class":1096},"  \"email\"",[231,2581,537],{"class":241},[231,2583,2494],{"class":237},[231,2585,2586],{"class":252},"invalid",[231,2588,2499],{"class":237},[231,2590,1051],{"class":252},[231,2592,2593],{"class":282},"    # Not an email\n",[231,2595,2596,2599,2601,2604],{"class":233,"line":298},[231,2597,2598],{"class":1096},"  \"age\"",[231,2600,537],{"class":241},[231,2602,2603],{"class":432}," 15",[231,2605,2606],{"class":282},"              # Too young\n",[231,2608,2609],{"class":233,"line":304},[231,2610,496],{"class":237},[221,2612,2616],{"className":2613,"code":2614,"language":2615,"meta":226,"style":226},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Automatic response (400 Bad Request):\n{\n  \"statusCode\": 400,\n  \"message\": \"Validation failed\",\n  \"errors\": [\n    {\n      \"path\": [\"name\"],\n      \"message\": \"String must contain at least 2 character(s)\"\n    },\n    {\n      \"path\": [\"email\"],\n      \"message\": \"Invalid email\"\n    },\n    {\n      \"path\": [\"age\"],\n      \"message\": \"Number must be greater than or equal to 18\"\n    }\n  ]\n}\n","json",[228,2617,2618,2629,2633,2650,2670,2684,2689,2714,2732,2737,2741,2761,2778,2782,2786,2806,2823,2828,2833],{"__ignoreMap":226},[231,2619,2620,2623,2626],{"class":233,"line":234},[231,2621,2622],{"class":245},"# Automatic response (",[231,2624,2625],{"class":432},"400",[231,2627,2628],{"class":245}," Bad Request):\n",[231,2630,2631],{"class":233,"line":261},[231,2632,276],{"class":237},[231,2634,2635,2638,2641,2643,2645,2648],{"class":233,"line":279},[231,2636,2637],{"class":237},"  \"",[231,2639,2640],{"class":510},"statusCode",[231,2642,2499],{"class":237},[231,2644,537],{"class":237},[231,2646,2647],{"class":432}," 400",[231,2649,556],{"class":237},[231,2651,2652,2654,2657,2659,2661,2663,2666,2668],{"class":233,"line":286},[231,2653,2637],{"class":237},[231,2655,2656],{"class":510},"message",[231,2658,2499],{"class":237},[231,2660,537],{"class":237},[231,2662,2494],{"class":237},[231,2664,2665],{"class":252},"Validation failed",[231,2667,2499],{"class":237},[231,2669,556],{"class":237},[231,2671,2672,2674,2677,2679,2681],{"class":233,"line":292},[231,2673,2637],{"class":237},[231,2675,2676],{"class":510},"errors",[231,2678,2499],{"class":237},[231,2680,537],{"class":237},[231,2682,2683],{"class":237}," [\n",[231,2685,2686],{"class":233,"line":298},[231,2687,2688],{"class":237},"    {\n",[231,2690,2691,2694,2697,2699,2701,2704,2706,2709,2711],{"class":233,"line":304},[231,2692,2693],{"class":237},"      \"",[231,2695,2696],{"class":1096},"path",[231,2698,2499],{"class":237},[231,2700,537],{"class":237},[231,2702,2703],{"class":237}," [",[231,2705,2499],{"class":237},[231,2707,2708],{"class":252},"name",[231,2710,2499],{"class":237},[231,2712,2713],{"class":237},"],\n",[231,2715,2716,2718,2720,2722,2724,2726,2729],{"class":233,"line":311},[231,2717,2693],{"class":237},[231,2719,2656],{"class":1096},[231,2721,2499],{"class":237},[231,2723,537],{"class":237},[231,2725,2494],{"class":237},[231,2727,2728],{"class":252},"String must contain at least 2 character(s)",[231,2730,2731],{"class":237},"\"\n",[231,2733,2734],{"class":233,"line":317},[231,2735,2736],{"class":237},"    },\n",[231,2738,2739],{"class":233,"line":366},[231,2740,2688],{"class":237},[231,2742,2743,2745,2747,2749,2751,2753,2755,2757,2759],{"class":233,"line":416},[231,2744,2693],{"class":237},[231,2746,2696],{"class":1096},[231,2748,2499],{"class":237},[231,2750,537],{"class":237},[231,2752,2703],{"class":237},[231,2754,2499],{"class":237},[231,2756,336],{"class":252},[231,2758,2499],{"class":237},[231,2760,2713],{"class":237},[231,2762,2763,2765,2767,2769,2771,2773,2776],{"class":233,"line":457},[231,2764,2693],{"class":237},[231,2766,2656],{"class":1096},[231,2768,2499],{"class":237},[231,2770,537],{"class":237},[231,2772,2494],{"class":237},[231,2774,2775],{"class":252},"Invalid email",[231,2777,2731],{"class":237},[231,2779,2780],{"class":233,"line":463},[231,2781,2736],{"class":237},[231,2783,2784],{"class":233,"line":468},[231,2785,2688],{"class":237},[231,2787,2788,2790,2792,2794,2796,2798,2800,2802,2804],{"class":233,"line":493},[231,2789,2693],{"class":237},[231,2791,2696],{"class":1096},[231,2793,2499],{"class":237},[231,2795,537],{"class":237},[231,2797,2703],{"class":237},[231,2799,2499],{"class":237},[231,2801,381],{"class":252},[231,2803,2499],{"class":237},[231,2805,2713],{"class":237},[231,2807,2808,2810,2812,2814,2816,2818,2821],{"class":233,"line":1176},[231,2809,2693],{"class":237},[231,2811,2656],{"class":1096},[231,2813,2499],{"class":237},[231,2815,537],{"class":237},[231,2817,2494],{"class":237},[231,2819,2820],{"class":252},"Number must be greater than or equal to 18",[231,2822,2731],{"class":237},[231,2824,2825],{"class":233,"line":1191},[231,2826,2827],{"class":237},"    }\n",[231,2829,2830],{"class":233,"line":1226},[231,2831,2832],{"class":237},"  ]\n",[231,2834,2835],{"class":233,"line":1232},[231,2836,496],{"class":237},[853,2838,2839],{},[204,2840,2841],{},"The exact error format may vary slightly between validation libraries, but they all provide clear, actionable error messages that you can return to clients.",[208,2843,2845],{"id":2844},"type-safety","Type Safety",[204,2847,2848],{},"One of the biggest benefits of using validation schemas is automatic TypeScript type inference:",[221,2850,2852],{"className":223,"code":2851,"language":225,"meta":226,"style":226},"const UserSchema = z.object({\n  name: z.string(),\n  email: z.string().email(),\n  age: z.number(),\n  preferences: z.object({\n    newsletter: z.boolean(),\n    theme: z.enum(['light', 'dark'])\n  })\n});\n\n\u002F\u002F TypeScript automatically knows the type!\ntype UserDto = z.infer\u003Ctypeof UserSchema>;\n\n@Post('\u002F')\ncreateUser(@Body({ validationSchema: UserSchema }) data: UserDto) {\n  \u002F\u002F Full autocomplete and type checking:\n  data.name           \u002F\u002F ✅ string\n  data.email          \u002F\u002F ✅ string\n  data.age            \u002F\u002F ✅ number\n  data.preferences    \u002F\u002F ✅ { newsletter: boolean, theme: 'light' | 'dark' }\n  data.unknown        \u002F\u002F ❌ TypeScript error!\n}\n",[228,2853,2854,2873,2889,2911,2927,2944,2961,2995,3002,3010,3014,3019,3041,3045,3061,3086,3091,3103,3114,3125,3137,3149],{"__ignoreMap":226},[231,2855,2856,2858,2861,2863,2865,2867,2869,2871],{"class":233,"line":234},[231,2857,511],{"class":510},[231,2859,2860],{"class":245}," UserSchema ",[231,2862,517],{"class":237},[231,2864,520],{"class":245},[231,2866,333],{"class":237},[231,2868,525],{"class":241},[231,2870,246],{"class":245},[231,2872,276],{"class":237},[231,2874,2875,2877,2879,2881,2883,2885,2887],{"class":233,"line":261},[231,2876,590],{"class":307},[231,2878,537],{"class":237},[231,2880,520],{"class":245},[231,2882,333],{"class":237},[231,2884,544],{"class":241},[231,2886,547],{"class":245},[231,2888,556],{"class":237},[231,2890,2891,2893,2895,2897,2899,2901,2903,2905,2907,2909],{"class":233,"line":279},[231,2892,534],{"class":307},[231,2894,537],{"class":237},[231,2896,520],{"class":245},[231,2898,333],{"class":237},[231,2900,544],{"class":241},[231,2902,547],{"class":245},[231,2904,333],{"class":237},[231,2906,336],{"class":241},[231,2908,547],{"class":245},[231,2910,556],{"class":237},[231,2912,2913,2915,2917,2919,2921,2923,2925],{"class":233,"line":286},[231,2914,561],{"class":307},[231,2916,537],{"class":237},[231,2918,520],{"class":245},[231,2920,333],{"class":237},[231,2922,390],{"class":241},[231,2924,547],{"class":245},[231,2926,556],{"class":237},[231,2928,2929,2932,2934,2936,2938,2940,2942],{"class":233,"line":292},[231,2930,2931],{"class":307},"  preferences",[231,2933,537],{"class":237},[231,2935,520],{"class":245},[231,2937,333],{"class":237},[231,2939,525],{"class":241},[231,2941,246],{"class":245},[231,2943,276],{"class":237},[231,2945,2946,2949,2951,2953,2955,2957,2959],{"class":233,"line":298},[231,2947,2948],{"class":307},"    newsletter",[231,2950,537],{"class":237},[231,2952,520],{"class":245},[231,2954,333],{"class":237},[231,2956,2131],{"class":241},[231,2958,547],{"class":245},[231,2960,556],{"class":237},[231,2962,2963,2966,2968,2970,2972,2974,2976,2978,2981,2983,2985,2987,2990,2992],{"class":233,"line":304},[231,2964,2965],{"class":307},"    theme",[231,2967,537],{"class":237},[231,2969,520],{"class":245},[231,2971,333],{"class":237},[231,2973,1038],{"class":241},[231,2975,1041],{"class":245},[231,2977,249],{"class":237},[231,2979,2980],{"class":252},"light",[231,2982,249],{"class":237},[231,2984,1051],{"class":237},[231,2986,387],{"class":237},[231,2988,2989],{"class":252},"dark",[231,2991,249],{"class":237},[231,2993,2994],{"class":245},"])\n",[231,2996,2997,3000],{"class":233,"line":311},[231,2998,2999],{"class":237},"  }",[231,3001,258],{"class":245},[231,3003,3004,3006,3008],{"class":233,"line":317},[231,3005,617],{"class":237},[231,3007,360],{"class":245},[231,3009,363],{"class":237},[231,3011,3012],{"class":233,"line":366},[231,3013,626],{"emptyLinePlaceholder":56},[231,3015,3016],{"class":233,"line":416},[231,3017,3018],{"class":282},"\u002F\u002F TypeScript automatically knows the type!\n",[231,3020,3021,3023,3026,3028,3030,3032,3034,3036,3039],{"class":233,"line":457},[231,3022,1093],{"class":510},[231,3024,3025],{"class":1096}," UserDto",[231,3027,1100],{"class":237},[231,3029,520],{"class":1096},[231,3031,333],{"class":237},[231,3033,1107],{"class":1096},[231,3035,1110],{"class":237},[231,3037,3038],{"class":245}," UserSchema",[231,3040,1116],{"class":237},[231,3042,3043],{"class":233,"line":463},[231,3044,626],{"emptyLinePlaceholder":56},[231,3046,3047,3049,3051,3053,3055,3057,3059],{"class":233,"line":468},[231,3048,238],{"class":237},[231,3050,242],{"class":241},[231,3052,246],{"class":245},[231,3054,249],{"class":237},[231,3056,1169],{"class":252},[231,3058,249],{"class":237},[231,3060,258],{"class":245},[231,3062,3063,3065,3067,3069,3071,3073,3075,3077,3079,3081,3084],{"class":233,"line":493},[231,3064,264],{"class":241},[231,3066,267],{"class":245},[231,3068,270],{"class":241},[231,3070,246],{"class":245},[231,3072,655],{"class":237},[231,3074,658],{"class":307},[231,3076,537],{"class":237},[231,3078,2860],{"class":245},[231,3080,617],{"class":237},[231,3082,3083],{"class":245},") data: UserDto) ",[231,3085,276],{"class":237},[231,3087,3088],{"class":233,"line":1176},[231,3089,3090],{"class":282},"  \u002F\u002F Full autocomplete and type checking:\n",[231,3092,3093,3096,3098,3100],{"class":233,"line":1191},[231,3094,3095],{"class":245},"  data",[231,3097,333],{"class":237},[231,3099,2708],{"class":245},[231,3101,3102],{"class":282},"           \u002F\u002F ✅ string\n",[231,3104,3105,3107,3109,3111],{"class":233,"line":1226},[231,3106,3095],{"class":245},[231,3108,333],{"class":237},[231,3110,336],{"class":245},[231,3112,3113],{"class":282},"          \u002F\u002F ✅ string\n",[231,3115,3116,3118,3120,3122],{"class":233,"line":1232},[231,3117,3095],{"class":245},[231,3119,333],{"class":237},[231,3121,381],{"class":245},[231,3123,3124],{"class":282},"            \u002F\u002F ✅ number\n",[231,3126,3127,3129,3131,3134],{"class":233,"line":1254},[231,3128,3095],{"class":245},[231,3130,333],{"class":237},[231,3132,3133],{"class":245},"preferences",[231,3135,3136],{"class":282},"    \u002F\u002F ✅ { newsletter: boolean, theme: 'light' | 'dark' }\n",[231,3138,3139,3141,3143,3146],{"class":233,"line":1260},[231,3140,3095],{"class":245},[231,3142,333],{"class":237},[231,3144,3145],{"class":245},"unknown",[231,3147,3148],{"class":282},"        \u002F\u002F ❌ TypeScript error!\n",[231,3150,3151],{"class":233,"line":2339},[231,3152,496],{"class":237},[208,3154,3156],{"id":3155},"advanced-validation","Advanced Validation",[866,3158,3159,3462,3646,3873],{},[221,3160,3163],{"className":223,"code":3161,"filename":3162,"language":225,"meta":226,"style":226},"const CreateOrderSchema = z.object({\n  items: z.array(z.object({\n    productId: z.string().uuid(),\n    quantity: z.number().int().min(1)\n  })).min(1),\n  shipping: z.object({\n    address: z.string(),\n    city: z.string(),\n    zipCode: z.string().regex(\u002F^\\d{5}$\u002F)\n  }),\n  payment: z.object({\n    method: z.enum(['card', 'paypal']),\n    token: z.string()\n  })\n});\n","Nested Objects",[228,3164,3165,3184,3209,3233,3264,3282,3299,3316,3333,3373,3381,3398,3433,3448,3454],{"__ignoreMap":226},[231,3166,3167,3169,3172,3174,3176,3178,3180,3182],{"class":233,"line":234},[231,3168,511],{"class":510},[231,3170,3171],{"class":245}," CreateOrderSchema ",[231,3173,517],{"class":237},[231,3175,520],{"class":245},[231,3177,333],{"class":237},[231,3179,525],{"class":241},[231,3181,246],{"class":245},[231,3183,276],{"class":237},[231,3185,3186,3189,3191,3193,3195,3198,3201,3203,3205,3207],{"class":233,"line":261},[231,3187,3188],{"class":307},"  items",[231,3190,537],{"class":237},[231,3192,520],{"class":245},[231,3194,333],{"class":237},[231,3196,3197],{"class":241},"array",[231,3199,3200],{"class":245},"(z",[231,3202,333],{"class":237},[231,3204,525],{"class":241},[231,3206,246],{"class":245},[231,3208,276],{"class":237},[231,3210,3211,3214,3216,3218,3220,3222,3224,3226,3229,3231],{"class":233,"line":279},[231,3212,3213],{"class":307},"    productId",[231,3215,537],{"class":237},[231,3217,520],{"class":245},[231,3219,333],{"class":237},[231,3221,544],{"class":241},[231,3223,547],{"class":245},[231,3225,333],{"class":237},[231,3227,3228],{"class":241},"uuid",[231,3230,547],{"class":245},[231,3232,556],{"class":237},[231,3234,3235,3238,3240,3242,3244,3246,3248,3250,3252,3254,3256,3258,3260,3262],{"class":233,"line":286},[231,3236,3237],{"class":307},"    quantity",[231,3239,537],{"class":237},[231,3241,520],{"class":245},[231,3243,333],{"class":237},[231,3245,390],{"class":241},[231,3247,547],{"class":245},[231,3249,333],{"class":237},[231,3251,998],{"class":241},[231,3253,547],{"class":245},[231,3255,333],{"class":237},[231,3257,576],{"class":241},[231,3259,246],{"class":245},[231,3261,2041],{"class":432},[231,3263,258],{"class":245},[231,3265,3266,3268,3270,3272,3274,3276,3278,3280],{"class":233,"line":292},[231,3267,2999],{"class":237},[231,3269,1368],{"class":245},[231,3271,333],{"class":237},[231,3273,576],{"class":241},[231,3275,246],{"class":245},[231,3277,2041],{"class":432},[231,3279,360],{"class":245},[231,3281,556],{"class":237},[231,3283,3284,3287,3289,3291,3293,3295,3297],{"class":233,"line":298},[231,3285,3286],{"class":307},"  shipping",[231,3288,537],{"class":237},[231,3290,520],{"class":245},[231,3292,333],{"class":237},[231,3294,525],{"class":241},[231,3296,246],{"class":245},[231,3298,276],{"class":237},[231,3300,3301,3304,3306,3308,3310,3312,3314],{"class":233,"line":304},[231,3302,3303],{"class":307},"    address",[231,3305,537],{"class":237},[231,3307,520],{"class":245},[231,3309,333],{"class":237},[231,3311,544],{"class":241},[231,3313,547],{"class":245},[231,3315,556],{"class":237},[231,3317,3318,3321,3323,3325,3327,3329,3331],{"class":233,"line":311},[231,3319,3320],{"class":307},"    city",[231,3322,537],{"class":237},[231,3324,520],{"class":245},[231,3326,333],{"class":237},[231,3328,544],{"class":241},[231,3330,547],{"class":245},[231,3332,556],{"class":237},[231,3334,3335,3338,3340,3342,3344,3346,3348,3350,3353,3355,3357,3360,3363,3366,3369,3371],{"class":233,"line":317},[231,3336,3337],{"class":307},"    zipCode",[231,3339,537],{"class":237},[231,3341,520],{"class":245},[231,3343,333],{"class":237},[231,3345,544],{"class":241},[231,3347,547],{"class":245},[231,3349,333],{"class":237},[231,3351,3352],{"class":241},"regex",[231,3354,246],{"class":245},[231,3356,1169],{"class":237},[231,3358,3359],{"class":320},"^",[231,3361,3362],{"class":252},"\\d",[231,3364,3365],{"class":237},"{5}",[231,3367,3368],{"class":320},"$",[231,3370,1169],{"class":237},[231,3372,258],{"class":245},[231,3374,3375,3377,3379],{"class":233,"line":366},[231,3376,2999],{"class":237},[231,3378,360],{"class":245},[231,3380,556],{"class":237},[231,3382,3383,3386,3388,3390,3392,3394,3396],{"class":233,"line":416},[231,3384,3385],{"class":307},"  payment",[231,3387,537],{"class":237},[231,3389,520],{"class":245},[231,3391,333],{"class":237},[231,3393,525],{"class":241},[231,3395,246],{"class":245},[231,3397,276],{"class":237},[231,3399,3400,3403,3405,3407,3409,3411,3413,3415,3418,3420,3422,3424,3427,3429,3431],{"class":233,"line":457},[231,3401,3402],{"class":307},"    method",[231,3404,537],{"class":237},[231,3406,520],{"class":245},[231,3408,333],{"class":237},[231,3410,1038],{"class":241},[231,3412,1041],{"class":245},[231,3414,249],{"class":237},[231,3416,3417],{"class":252},"card",[231,3419,249],{"class":237},[231,3421,1051],{"class":237},[231,3423,387],{"class":237},[231,3425,3426],{"class":252},"paypal",[231,3428,249],{"class":237},[231,3430,1061],{"class":245},[231,3432,556],{"class":237},[231,3434,3435,3438,3440,3442,3444,3446],{"class":233,"line":463},[231,3436,3437],{"class":307},"    token",[231,3439,537],{"class":237},[231,3441,520],{"class":245},[231,3443,333],{"class":237},[231,3445,544],{"class":241},[231,3447,2201],{"class":245},[231,3449,3450,3452],{"class":233,"line":468},[231,3451,2999],{"class":237},[231,3453,258],{"class":245},[231,3455,3456,3458,3460],{"class":233,"line":493},[231,3457,617],{"class":237},[231,3459,360],{"class":245},[231,3461,363],{"class":237},[221,3463,3466],{"className":223,"code":3464,"filename":3465,"language":225,"meta":226,"style":226},"const RegisterUserSchema = z.object({\n  email: z.string().email(),\n  password: z.string().min(8),\n  confirmPassword: z.string()\n}).refine(\n  (data) => data.password === data.confirmPassword,\n  {\n    message: \"Passwords don't match\",\n    path: [\"confirmPassword\"]\n  }\n);\n","Custom Validation",[228,3467,3468,3487,3509,3537,3552,3566,3597,3602,3618,3636,3640],{"__ignoreMap":226},[231,3469,3470,3472,3475,3477,3479,3481,3483,3485],{"class":233,"line":234},[231,3471,511],{"class":510},[231,3473,3474],{"class":245}," RegisterUserSchema ",[231,3476,517],{"class":237},[231,3478,520],{"class":245},[231,3480,333],{"class":237},[231,3482,525],{"class":241},[231,3484,246],{"class":245},[231,3486,276],{"class":237},[231,3488,3489,3491,3493,3495,3497,3499,3501,3503,3505,3507],{"class":233,"line":261},[231,3490,534],{"class":307},[231,3492,537],{"class":237},[231,3494,520],{"class":245},[231,3496,333],{"class":237},[231,3498,544],{"class":241},[231,3500,547],{"class":245},[231,3502,333],{"class":237},[231,3504,336],{"class":241},[231,3506,547],{"class":245},[231,3508,556],{"class":237},[231,3510,3511,3514,3516,3518,3520,3522,3524,3526,3528,3530,3533,3535],{"class":233,"line":279},[231,3512,3513],{"class":307},"  password",[231,3515,537],{"class":237},[231,3517,520],{"class":245},[231,3519,333],{"class":237},[231,3521,544],{"class":241},[231,3523,547],{"class":245},[231,3525,333],{"class":237},[231,3527,576],{"class":241},[231,3529,246],{"class":245},[231,3531,3532],{"class":432},"8",[231,3534,360],{"class":245},[231,3536,556],{"class":237},[231,3538,3539,3542,3544,3546,3548,3550],{"class":233,"line":286},[231,3540,3541],{"class":307},"  confirmPassword",[231,3543,537],{"class":237},[231,3545,520],{"class":245},[231,3547,333],{"class":237},[231,3549,544],{"class":241},[231,3551,2201],{"class":245},[231,3553,3554,3556,3558,3560,3563],{"class":233,"line":292},[231,3555,617],{"class":237},[231,3557,360],{"class":245},[231,3559,333],{"class":237},[231,3561,3562],{"class":241},"refine",[231,3564,3565],{"class":245},"(\n",[231,3567,3568,3571,3573,3575,3578,3580,3582,3585,3588,3590,3592,3595],{"class":233,"line":298},[231,3569,3570],{"class":237},"  (",[231,3572,330],{"class":1215},[231,3574,360],{"class":237},[231,3576,3577],{"class":510}," =>",[231,3579,376],{"class":245},[231,3581,333],{"class":237},[231,3583,3584],{"class":245},"password ",[231,3586,3587],{"class":237},"===",[231,3589,376],{"class":245},[231,3591,333],{"class":237},[231,3593,3594],{"class":245},"confirmPassword",[231,3596,556],{"class":237},[231,3598,3599],{"class":233,"line":304},[231,3600,3601],{"class":237},"  {\n",[231,3603,3604,3607,3609,3611,3614,3616],{"class":233,"line":311},[231,3605,3606],{"class":307},"    message",[231,3608,537],{"class":237},[231,3610,2494],{"class":237},[231,3612,3613],{"class":252},"Passwords don't match",[231,3615,2499],{"class":237},[231,3617,556],{"class":237},[231,3619,3620,3623,3625,3627,3629,3631,3633],{"class":233,"line":317},[231,3621,3622],{"class":307},"    path",[231,3624,537],{"class":237},[231,3626,2703],{"class":245},[231,3628,2499],{"class":237},[231,3630,3594],{"class":252},[231,3632,2499],{"class":237},[231,3634,3635],{"class":245},"]\n",[231,3637,3638],{"class":233,"line":366},[231,3639,1257],{"class":237},[231,3641,3642,3644],{"class":233,"line":416},[231,3643,360],{"class":245},[231,3645,363],{"class":237},[221,3647,3650],{"className":223,"code":3648,"filename":3649,"language":225,"meta":226,"style":226},"const CreateArticleSchema = z.object({\n  title: z.string()\n    .trim()                              \u002F\u002F Remove whitespace\n    .min(5)\n    .max(100),\n  slug: z.string()\n    .transform(s => s.toLowerCase())     \u002F\u002F Convert to lowercase\n    .transform(s => s.replace(\u002F\\s+\u002Fg, '-')), \u002F\u002F Replace spaces\n  publishedAt: z.string()\n    .datetime()\n    .transform(s => new Date(s))         \u002F\u002F Convert to Date object\n});\n","Transformations",[228,3651,3652,3671,3686,3700,3713,3727,3742,3770,3818,3833,3842,3865],{"__ignoreMap":226},[231,3653,3654,3656,3659,3661,3663,3665,3667,3669],{"class":233,"line":234},[231,3655,511],{"class":510},[231,3657,3658],{"class":245}," CreateArticleSchema ",[231,3660,517],{"class":237},[231,3662,520],{"class":245},[231,3664,333],{"class":237},[231,3666,525],{"class":241},[231,3668,246],{"class":245},[231,3670,276],{"class":237},[231,3672,3673,3676,3678,3680,3682,3684],{"class":233,"line":261},[231,3674,3675],{"class":307},"  title",[231,3677,537],{"class":237},[231,3679,520],{"class":245},[231,3681,333],{"class":237},[231,3683,544],{"class":241},[231,3685,2201],{"class":245},[231,3687,3688,3691,3694,3697],{"class":233,"line":279},[231,3689,3690],{"class":237},"    .",[231,3692,3693],{"class":241},"trim",[231,3695,3696],{"class":245},"()                              ",[231,3698,3699],{"class":282},"\u002F\u002F Remove whitespace\n",[231,3701,3702,3704,3706,3708,3711],{"class":233,"line":286},[231,3703,3690],{"class":237},[231,3705,576],{"class":241},[231,3707,246],{"class":245},[231,3709,3710],{"class":432},"5",[231,3712,258],{"class":245},[231,3714,3715,3717,3719,3721,3723,3725],{"class":233,"line":292},[231,3716,3690],{"class":237},[231,3718,605],{"class":241},[231,3720,246],{"class":245},[231,3722,610],{"class":432},[231,3724,360],{"class":245},[231,3726,556],{"class":237},[231,3728,3729,3732,3734,3736,3738,3740],{"class":233,"line":298},[231,3730,3731],{"class":307},"  slug",[231,3733,537],{"class":237},[231,3735,520],{"class":245},[231,3737,333],{"class":237},[231,3739,544],{"class":241},[231,3741,2201],{"class":245},[231,3743,3744,3746,3749,3751,3754,3756,3759,3761,3764,3767],{"class":233,"line":304},[231,3745,3690],{"class":237},[231,3747,3748],{"class":241},"transform",[231,3750,246],{"class":245},[231,3752,3753],{"class":1215},"s",[231,3755,3577],{"class":510},[231,3757,3758],{"class":245}," s",[231,3760,333],{"class":237},[231,3762,3763],{"class":241},"toLowerCase",[231,3765,3766],{"class":245},"())     ",[231,3768,3769],{"class":282},"\u002F\u002F Convert to lowercase\n",[231,3771,3772,3774,3776,3778,3780,3782,3784,3786,3789,3791,3793,3796,3799,3802,3804,3806,3809,3811,3813,3815],{"class":233,"line":311},[231,3773,3690],{"class":237},[231,3775,3748],{"class":241},[231,3777,246],{"class":245},[231,3779,3753],{"class":1215},[231,3781,3577],{"class":510},[231,3783,3758],{"class":245},[231,3785,333],{"class":237},[231,3787,3788],{"class":241},"replace",[231,3790,246],{"class":245},[231,3792,1169],{"class":237},[231,3794,3795],{"class":252},"\\s",[231,3797,3798],{"class":237},"+\u002F",[231,3800,3801],{"class":432},"g",[231,3803,1051],{"class":237},[231,3805,387],{"class":237},[231,3807,3808],{"class":252},"-",[231,3810,249],{"class":237},[231,3812,1368],{"class":245},[231,3814,1051],{"class":237},[231,3816,3817],{"class":282}," \u002F\u002F Replace spaces\n",[231,3819,3820,3823,3825,3827,3829,3831],{"class":233,"line":317},[231,3821,3822],{"class":307},"  publishedAt",[231,3824,537],{"class":237},[231,3826,520],{"class":245},[231,3828,333],{"class":237},[231,3830,544],{"class":241},[231,3832,2201],{"class":245},[231,3834,3835,3837,3840],{"class":233,"line":366},[231,3836,3690],{"class":237},[231,3838,3839],{"class":241},"datetime",[231,3841,2201],{"class":245},[231,3843,3844,3846,3848,3850,3852,3854,3856,3859,3862],{"class":233,"line":416},[231,3845,3690],{"class":237},[231,3847,3748],{"class":241},[231,3849,246],{"class":245},[231,3851,3753],{"class":1215},[231,3853,3577],{"class":510},[231,3855,345],{"class":237},[231,3857,3858],{"class":241}," Date",[231,3860,3861],{"class":245},"(s))         ",[231,3863,3864],{"class":282},"\u002F\u002F Convert to Date object\n",[231,3866,3867,3869,3871],{"class":233,"line":457},[231,3868,617],{"class":237},[231,3870,360],{"class":245},[231,3872,363],{"class":237},[221,3874,3877],{"className":223,"code":3875,"filename":3876,"language":225,"meta":226,"style":226},"const UpdateUserSchema = z.object({\n  name: z.string().optional(),           \u002F\u002F Field is optional\n  email: z.string().email().optional(),\n  role: z.enum(['user', 'admin']).default('user'), \u002F\u002F Default value\n  active: z.boolean().default(true)\n});\n","Optional & Defaults",[228,3878,3879,3898,3923,3951,4000,4025],{"__ignoreMap":226},[231,3880,3881,3883,3886,3888,3890,3892,3894,3896],{"class":233,"line":234},[231,3882,511],{"class":510},[231,3884,3885],{"class":245}," UpdateUserSchema ",[231,3887,517],{"class":237},[231,3889,520],{"class":245},[231,3891,333],{"class":237},[231,3893,525],{"class":241},[231,3895,246],{"class":245},[231,3897,276],{"class":237},[231,3899,3900,3902,3904,3906,3908,3910,3912,3914,3916,3918,3920],{"class":233,"line":261},[231,3901,590],{"class":307},[231,3903,537],{"class":237},[231,3905,520],{"class":245},[231,3907,333],{"class":237},[231,3909,544],{"class":241},[231,3911,547],{"class":245},[231,3913,333],{"class":237},[231,3915,1479],{"class":241},[231,3917,547],{"class":245},[231,3919,1051],{"class":237},[231,3921,3922],{"class":282},"           \u002F\u002F Field is optional\n",[231,3924,3925,3927,3929,3931,3933,3935,3937,3939,3941,3943,3945,3947,3949],{"class":233,"line":279},[231,3926,534],{"class":307},[231,3928,537],{"class":237},[231,3930,520],{"class":245},[231,3932,333],{"class":237},[231,3934,544],{"class":241},[231,3936,547],{"class":245},[231,3938,333],{"class":237},[231,3940,336],{"class":241},[231,3942,547],{"class":245},[231,3944,333],{"class":237},[231,3946,1479],{"class":241},[231,3948,547],{"class":245},[231,3950,556],{"class":237},[231,3952,3953,3955,3957,3959,3961,3963,3965,3967,3969,3971,3973,3975,3977,3979,3981,3983,3985,3987,3989,3991,3993,3995,3997],{"class":233,"line":286},[231,3954,1029],{"class":307},[231,3956,537],{"class":237},[231,3958,520],{"class":245},[231,3960,333],{"class":237},[231,3962,1038],{"class":241},[231,3964,1041],{"class":245},[231,3966,249],{"class":237},[231,3968,1046],{"class":252},[231,3970,249],{"class":237},[231,3972,1051],{"class":237},[231,3974,387],{"class":237},[231,3976,1056],{"class":252},[231,3978,249],{"class":237},[231,3980,1061],{"class":245},[231,3982,333],{"class":237},[231,3984,1066],{"class":241},[231,3986,246],{"class":245},[231,3988,249],{"class":237},[231,3990,1046],{"class":252},[231,3992,249],{"class":237},[231,3994,360],{"class":245},[231,3996,1051],{"class":237},[231,3998,3999],{"class":282}," \u002F\u002F Default value\n",[231,4001,4002,4004,4006,4008,4010,4012,4014,4016,4018,4020,4023],{"class":233,"line":292},[231,4003,2118],{"class":307},[231,4005,537],{"class":237},[231,4007,520],{"class":245},[231,4009,333],{"class":237},[231,4011,2131],{"class":241},[231,4013,547],{"class":245},[231,4015,333],{"class":237},[231,4017,1066],{"class":241},[231,4019,246],{"class":245},[231,4021,2417],{"class":4022},"sfNiH",[231,4024,258],{"class":245},[231,4026,4027,4029,4031],{"class":233,"line":298},[231,4028,617],{"class":237},[231,4030,360],{"class":245},[231,4032,363],{"class":237},[204,4034,4035],{},"You can also validate path parameters to ensure they're in the correct format:",[221,4037,4039],{"className":223,"code":4038,"language":225,"meta":226,"style":226},"const UserIdParamSchema = z.object({\n  id: z.string().uuid()\n});\n\n@Get('\u002F:id')\ngetUser(@Param({ validationSchema: UserIdParamSchema }) params: { id: string }) {\n  \u002F\u002F params.id is guaranteed to be a valid UUID\n  return this.userService.findById(params.id);\n}\n",[228,4040,4041,4060,4081,4089,4093,4110,4151,4156,4183],{"__ignoreMap":226},[231,4042,4043,4045,4048,4050,4052,4054,4056,4058],{"class":233,"line":234},[231,4044,511],{"class":510},[231,4046,4047],{"class":245}," UserIdParamSchema ",[231,4049,517],{"class":237},[231,4051,520],{"class":245},[231,4053,333],{"class":237},[231,4055,525],{"class":241},[231,4057,246],{"class":245},[231,4059,276],{"class":237},[231,4061,4062,4065,4067,4069,4071,4073,4075,4077,4079],{"class":233,"line":261},[231,4063,4064],{"class":307},"  id",[231,4066,537],{"class":237},[231,4068,520],{"class":245},[231,4070,333],{"class":237},[231,4072,544],{"class":241},[231,4074,547],{"class":245},[231,4076,333],{"class":237},[231,4078,3228],{"class":241},[231,4080,2201],{"class":245},[231,4082,4083,4085,4087],{"class":233,"line":279},[231,4084,617],{"class":237},[231,4086,360],{"class":245},[231,4088,363],{"class":237},[231,4090,4091],{"class":233,"line":286},[231,4092,626],{"emptyLinePlaceholder":56},[231,4094,4095,4097,4099,4101,4103,4106,4108],{"class":233,"line":292},[231,4096,238],{"class":237},[231,4098,2276],{"class":241},[231,4100,246],{"class":245},[231,4102,249],{"class":237},[231,4104,4105],{"class":252},"\u002F:id",[231,4107,249],{"class":237},[231,4109,258],{"class":245},[231,4111,4112,4115,4117,4120,4122,4124,4126,4128,4130,4132,4135,4137,4140,4142,4145,4147,4149],{"class":233,"line":298},[231,4113,4114],{"class":241},"getUser",[231,4116,267],{"class":245},[231,4118,4119],{"class":241},"Param",[231,4121,246],{"class":245},[231,4123,655],{"class":237},[231,4125,658],{"class":307},[231,4127,537],{"class":237},[231,4129,4047],{"class":245},[231,4131,617],{"class":237},[231,4133,4134],{"class":245},") params: ",[231,4136,655],{"class":237},[231,4138,4139],{"class":307}," id",[231,4141,537],{"class":237},[231,4143,4144],{"class":245}," string ",[231,4146,617],{"class":237},[231,4148,339],{"class":245},[231,4150,276],{"class":237},[231,4152,4153],{"class":233,"line":304},[231,4154,4155],{"class":282},"  \u002F\u002F params.id is guaranteed to be a valid UUID\n",[231,4157,4158,4160,4162,4164,4166,4169,4171,4174,4176,4179,4181],{"class":233,"line":311},[231,4159,471],{"class":320},[231,4161,474],{"class":237},[231,4163,477],{"class":245},[231,4165,333],{"class":237},[231,4167,4168],{"class":241},"findById",[231,4170,246],{"class":307},[231,4172,4173],{"class":245},"params",[231,4175,333],{"class":237},[231,4177,4178],{"class":245},"id",[231,4180,360],{"class":307},[231,4182,363],{"class":237},[231,4184,4185],{"class":233,"line":317},[231,4186,496],{"class":237},[208,4188,4190],{"id":4189},"partial-validation","Partial Validation",[204,4192,4193],{},"For update endpoints, you often want to make all fields optional:",[221,4195,4197],{"className":223,"code":4196,"language":225,"meta":226,"style":226},"const CreateUserSchema = z.object({\n  name: z.string(),\n  email: z.string().email(),\n  age: z.number()\n});\n\n\u002F\u002F All fields become optional\nconst UpdateUserSchema = CreateUserSchema.partial();\n\n@Put('\u002F:id')\nupdateUser(\n  @Param('id') id: string,\n  @Body({ validationSchema: UpdateUserSchema }) data: Partial\u003CUserDto>\n) {\n  return this.userService.update(id, data);\n}\n",[228,4198,4199,4217,4233,4255,4269,4277,4281,4286,4305,4309,4326,4333,4352,4382,4388,4413],{"__ignoreMap":226},[231,4200,4201,4203,4205,4207,4209,4211,4213,4215],{"class":233,"line":234},[231,4202,511],{"class":510},[231,4204,514],{"class":245},[231,4206,517],{"class":237},[231,4208,520],{"class":245},[231,4210,333],{"class":237},[231,4212,525],{"class":241},[231,4214,246],{"class":245},[231,4216,276],{"class":237},[231,4218,4219,4221,4223,4225,4227,4229,4231],{"class":233,"line":261},[231,4220,590],{"class":307},[231,4222,537],{"class":237},[231,4224,520],{"class":245},[231,4226,333],{"class":237},[231,4228,544],{"class":241},[231,4230,547],{"class":245},[231,4232,556],{"class":237},[231,4234,4235,4237,4239,4241,4243,4245,4247,4249,4251,4253],{"class":233,"line":279},[231,4236,534],{"class":307},[231,4238,537],{"class":237},[231,4240,520],{"class":245},[231,4242,333],{"class":237},[231,4244,544],{"class":241},[231,4246,547],{"class":245},[231,4248,333],{"class":237},[231,4250,336],{"class":241},[231,4252,547],{"class":245},[231,4254,556],{"class":237},[231,4256,4257,4259,4261,4263,4265,4267],{"class":233,"line":286},[231,4258,561],{"class":307},[231,4260,537],{"class":237},[231,4262,520],{"class":245},[231,4264,333],{"class":237},[231,4266,390],{"class":241},[231,4268,2201],{"class":245},[231,4270,4271,4273,4275],{"class":233,"line":292},[231,4272,617],{"class":237},[231,4274,360],{"class":245},[231,4276,363],{"class":237},[231,4278,4279],{"class":233,"line":298},[231,4280,626],{"emptyLinePlaceholder":56},[231,4282,4283],{"class":233,"line":304},[231,4284,4285],{"class":282},"\u002F\u002F All fields become optional\n",[231,4287,4288,4290,4292,4294,4296,4298,4301,4303],{"class":233,"line":311},[231,4289,511],{"class":510},[231,4291,3885],{"class":245},[231,4293,517],{"class":237},[231,4295,1113],{"class":245},[231,4297,333],{"class":237},[231,4299,4300],{"class":241},"partial",[231,4302,547],{"class":245},[231,4304,363],{"class":237},[231,4306,4307],{"class":233,"line":317},[231,4308,626],{"emptyLinePlaceholder":56},[231,4310,4311,4313,4316,4318,4320,4322,4324],{"class":233,"line":366},[231,4312,238],{"class":237},[231,4314,4315],{"class":241},"Put",[231,4317,246],{"class":245},[231,4319,249],{"class":237},[231,4321,4105],{"class":252},[231,4323,249],{"class":237},[231,4325,258],{"class":245},[231,4327,4328,4331],{"class":233,"line":416},[231,4329,4330],{"class":241},"updateUser",[231,4332,3565],{"class":245},[231,4334,4335,4337,4339,4341,4343,4345,4347,4350],{"class":233,"line":457},[231,4336,1160],{"class":245},[231,4338,4119],{"class":241},[231,4340,246],{"class":245},[231,4342,249],{"class":237},[231,4344,4178],{"class":252},[231,4346,249],{"class":237},[231,4348,4349],{"class":245},") id: string",[231,4351,556],{"class":237},[231,4353,4354,4356,4358,4360,4362,4364,4366,4368,4370,4373,4376,4379],{"class":233,"line":463},[231,4355,1160],{"class":245},[231,4357,270],{"class":241},[231,4359,246],{"class":245},[231,4361,655],{"class":237},[231,4363,658],{"class":307},[231,4365,537],{"class":237},[231,4367,3885],{"class":245},[231,4369,617],{"class":237},[231,4371,4372],{"class":245},") data: Partial",[231,4374,4375],{"class":237},"\u003C",[231,4377,4378],{"class":245},"UserDto",[231,4380,4381],{"class":237},">\n",[231,4383,4384,4386],{"class":233,"line":468},[231,4385,339],{"class":245},[231,4387,276],{"class":237},[231,4389,4390,4392,4394,4396,4398,4401,4403,4405,4407,4409,4411],{"class":233,"line":493},[231,4391,471],{"class":320},[231,4393,474],{"class":237},[231,4395,477],{"class":245},[231,4397,333],{"class":237},[231,4399,4400],{"class":241},"update",[231,4402,246],{"class":307},[231,4404,4178],{"class":245},[231,4406,1051],{"class":237},[231,4408,376],{"class":245},[231,4410,360],{"class":307},[231,4412,363],{"class":237},[231,4414,4415],{"class":233,"line":1176},[231,4416,496],{"class":237},[208,4418,4420],{"id":4419},"reusing-schemas","Reusing Schemas",[204,4422,4423],{},"Define schemas in separate files and reuse them across your application:",[221,4425,4428],{"className":223,"code":4426,"filename":4427,"language":225,"meta":226,"style":226},"import { z } from 'zod';\n\nexport const BaseUserSchema = z.object({\n  name: z.string().min(2).max(50),\n  email: z.string().email(),\n  age: z.number().int().min(18)\n});\n\nexport const CreateUserSchema = BaseUserSchema.extend({\n  password: z.string().min(8)\n});\n\nexport const UpdateUserSchema = BaseUserSchema.partial();\n\nexport type CreateUserDto = z.infer\u003Ctypeof CreateUserSchema>;\nexport type UpdateUserDto = z.infer\u003Ctypeof UpdateUserSchema>;\n","schemas\u002Fuser.schema.ts",[228,4429,4430,4450,4454,4476,4512,4534,4564,4572,4576,4598,4622,4630,4634,4654,4658,4680],{"__ignoreMap":226},[231,4431,4432,4434,4436,4438,4440,4442,4444,4446,4448],{"class":233,"line":234},[231,4433,877],{"class":320},[231,4435,880],{"class":237},[231,4437,520],{"class":245},[231,4439,885],{"class":237},[231,4441,888],{"class":320},[231,4443,387],{"class":237},[231,4445,893],{"class":252},[231,4447,249],{"class":237},[231,4449,363],{"class":237},[231,4451,4452],{"class":233,"line":261},[231,4453,626],{"emptyLinePlaceholder":56},[231,4455,4456,4458,4461,4464,4466,4468,4470,4472,4474],{"class":233,"line":279},[231,4457,1142],{"class":320},[231,4459,4460],{"class":510}," const",[231,4462,4463],{"class":245}," BaseUserSchema ",[231,4465,517],{"class":237},[231,4467,520],{"class":245},[231,4469,333],{"class":237},[231,4471,525],{"class":241},[231,4473,246],{"class":245},[231,4475,276],{"class":237},[231,4477,4478,4480,4482,4484,4486,4488,4490,4492,4494,4496,4498,4500,4502,4504,4506,4508,4510],{"class":233,"line":286},[231,4479,590],{"class":307},[231,4481,537],{"class":237},[231,4483,520],{"class":245},[231,4485,333],{"class":237},[231,4487,544],{"class":241},[231,4489,547],{"class":245},[231,4491,333],{"class":237},[231,4493,576],{"class":241},[231,4495,246],{"class":245},[231,4497,942],{"class":432},[231,4499,360],{"class":245},[231,4501,333],{"class":237},[231,4503,605],{"class":241},[231,4505,246],{"class":245},[231,4507,953],{"class":432},[231,4509,360],{"class":245},[231,4511,556],{"class":237},[231,4513,4514,4516,4518,4520,4522,4524,4526,4528,4530,4532],{"class":233,"line":292},[231,4515,534],{"class":307},[231,4517,537],{"class":237},[231,4519,520],{"class":245},[231,4521,333],{"class":237},[231,4523,544],{"class":241},[231,4525,547],{"class":245},[231,4527,333],{"class":237},[231,4529,336],{"class":241},[231,4531,547],{"class":245},[231,4533,556],{"class":237},[231,4535,4536,4538,4540,4542,4544,4546,4548,4550,4552,4554,4556,4558,4560,4562],{"class":233,"line":298},[231,4537,561],{"class":307},[231,4539,537],{"class":237},[231,4541,520],{"class":245},[231,4543,333],{"class":237},[231,4545,390],{"class":241},[231,4547,547],{"class":245},[231,4549,333],{"class":237},[231,4551,998],{"class":241},[231,4553,547],{"class":245},[231,4555,333],{"class":237},[231,4557,576],{"class":241},[231,4559,246],{"class":245},[231,4561,1009],{"class":432},[231,4563,258],{"class":245},[231,4565,4566,4568,4570],{"class":233,"line":304},[231,4567,617],{"class":237},[231,4569,360],{"class":245},[231,4571,363],{"class":237},[231,4573,4574],{"class":233,"line":311},[231,4575,626],{"emptyLinePlaceholder":56},[231,4577,4578,4580,4582,4584,4586,4589,4591,4594,4596],{"class":233,"line":317},[231,4579,1142],{"class":320},[231,4581,4460],{"class":510},[231,4583,514],{"class":245},[231,4585,517],{"class":237},[231,4587,4588],{"class":245}," BaseUserSchema",[231,4590,333],{"class":237},[231,4592,4593],{"class":241},"extend",[231,4595,246],{"class":245},[231,4597,276],{"class":237},[231,4599,4600,4602,4604,4606,4608,4610,4612,4614,4616,4618,4620],{"class":233,"line":366},[231,4601,3513],{"class":307},[231,4603,537],{"class":237},[231,4605,520],{"class":245},[231,4607,333],{"class":237},[231,4609,544],{"class":241},[231,4611,547],{"class":245},[231,4613,333],{"class":237},[231,4615,576],{"class":241},[231,4617,246],{"class":245},[231,4619,3532],{"class":432},[231,4621,258],{"class":245},[231,4623,4624,4626,4628],{"class":233,"line":416},[231,4625,617],{"class":237},[231,4627,360],{"class":245},[231,4629,363],{"class":237},[231,4631,4632],{"class":233,"line":457},[231,4633,626],{"emptyLinePlaceholder":56},[231,4635,4636,4638,4640,4642,4644,4646,4648,4650,4652],{"class":233,"line":463},[231,4637,1142],{"class":320},[231,4639,4460],{"class":510},[231,4641,3885],{"class":245},[231,4643,517],{"class":237},[231,4645,4588],{"class":245},[231,4647,333],{"class":237},[231,4649,4300],{"class":241},[231,4651,547],{"class":245},[231,4653,363],{"class":237},[231,4655,4656],{"class":233,"line":468},[231,4657,626],{"emptyLinePlaceholder":56},[231,4659,4660,4662,4664,4666,4668,4670,4672,4674,4676,4678],{"class":233,"line":493},[231,4661,1142],{"class":320},[231,4663,1688],{"class":510},[231,4665,1097],{"class":1096},[231,4667,1100],{"class":237},[231,4669,520],{"class":1096},[231,4671,333],{"class":237},[231,4673,1107],{"class":1096},[231,4675,1110],{"class":237},[231,4677,1113],{"class":245},[231,4679,1116],{"class":237},[231,4681,4682,4684,4686,4689,4691,4693,4695,4697,4699,4702],{"class":233,"line":1176},[231,4683,1142],{"class":320},[231,4685,1688],{"class":510},[231,4687,4688],{"class":1096}," UpdateUserDto",[231,4690,1100],{"class":237},[231,4692,520],{"class":1096},[231,4694,333],{"class":237},[231,4696,1107],{"class":1096},[231,4698,1110],{"class":237},[231,4700,4701],{"class":245}," UpdateUserSchema",[231,4703,1116],{"class":237},[221,4705,4708],{"className":223,"code":4706,"filename":4707,"language":225,"meta":226,"style":226},"import { CreateUserSchema, UpdateUserSchema } from '.\u002Fschemas\u002Fuser.schema';\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Post('\u002F')\n  createUser(@Body({ validationSchema: CreateUserSchema }) data: CreateUserDto) {\n    return this.userService.create(data);\n  }\n  \n  @Put('\u002F:id')\n  updateUser(\n    @Param('id') id: string,\n    @Body({ validationSchema: UpdateUserSchema }) data: UpdateUserDto\n  ) {\n    return this.userService.update(id, data);\n  }\n}\n","UserController.ts",[228,4709,4710,4735,4739,4755,4765,4769,4785,4817,4837,4841,4845,4861,4868,4893,4920,4927,4951,4955],{"__ignoreMap":226},[231,4711,4712,4714,4716,4718,4720,4722,4724,4726,4728,4731,4733],{"class":233,"line":234},[231,4713,877],{"class":320},[231,4715,880],{"class":237},[231,4717,1113],{"class":245},[231,4719,1051],{"class":237},[231,4721,4701],{"class":245},[231,4723,885],{"class":237},[231,4725,888],{"class":320},[231,4727,387],{"class":237},[231,4729,4730],{"class":252},".\u002Fschemas\u002Fuser.schema",[231,4732,249],{"class":237},[231,4734,363],{"class":237},[231,4736,4737],{"class":233,"line":261},[231,4738,626],{"emptyLinePlaceholder":56},[231,4740,4741,4743,4745,4747,4749,4751,4753],{"class":233,"line":279},[231,4742,238],{"class":237},[231,4744,1127],{"class":241},[231,4746,246],{"class":245},[231,4748,249],{"class":237},[231,4750,253],{"class":252},[231,4752,249],{"class":237},[231,4754,258],{"class":245},[231,4756,4757,4759,4761,4763],{"class":233,"line":286},[231,4758,1142],{"class":320},[231,4760,1145],{"class":510},[231,4762,1148],{"class":1096},[231,4764,1151],{"class":237},[231,4766,4767],{"class":233,"line":292},[231,4768,308],{"class":245},[231,4770,4771,4773,4775,4777,4779,4781,4783],{"class":233,"line":298},[231,4772,1160],{"class":237},[231,4774,242],{"class":241},[231,4776,246],{"class":245},[231,4778,249],{"class":237},[231,4780,1169],{"class":252},[231,4782,249],{"class":237},[231,4784,258],{"class":245},[231,4786,4787,4789,4791,4793,4795,4797,4799,4801,4803,4805,4807,4809,4811,4813,4815],{"class":233,"line":304},[231,4788,1194],{"class":307},[231,4790,267],{"class":237},[231,4792,270],{"class":241},[231,4794,246],{"class":245},[231,4796,655],{"class":237},[231,4798,658],{"class":307},[231,4800,537],{"class":237},[231,4802,514],{"class":245},[231,4804,617],{"class":237},[231,4806,339],{"class":245},[231,4808,330],{"class":1215},[231,4810,537],{"class":237},[231,4812,1097],{"class":1096},[231,4814,360],{"class":237},[231,4816,1151],{"class":237},[231,4818,4819,4821,4823,4825,4827,4829,4831,4833,4835],{"class":233,"line":311},[231,4820,1235],{"class":320},[231,4822,474],{"class":237},[231,4824,477],{"class":245},[231,4826,333],{"class":237},[231,4828,482],{"class":241},[231,4830,246],{"class":307},[231,4832,330],{"class":245},[231,4834,360],{"class":307},[231,4836,363],{"class":237},[231,4838,4839],{"class":233,"line":317},[231,4840,1257],{"class":237},[231,4842,4843],{"class":233,"line":366},[231,4844,308],{"class":245},[231,4846,4847,4849,4851,4853,4855,4857,4859],{"class":233,"line":416},[231,4848,1160],{"class":237},[231,4850,4315],{"class":241},[231,4852,246],{"class":245},[231,4854,249],{"class":237},[231,4856,4105],{"class":252},[231,4858,249],{"class":237},[231,4860,258],{"class":245},[231,4862,4863,4866],{"class":233,"line":457},[231,4864,4865],{"class":307},"  updateUser",[231,4867,3565],{"class":237},[231,4869,4870,4873,4875,4877,4879,4881,4883,4885,4887,4889,4891],{"class":233,"line":463},[231,4871,4872],{"class":237},"    @",[231,4874,4119],{"class":241},[231,4876,246],{"class":245},[231,4878,249],{"class":237},[231,4880,4178],{"class":252},[231,4882,249],{"class":237},[231,4884,339],{"class":245},[231,4886,4178],{"class":1215},[231,4888,537],{"class":237},[231,4890,2504],{"class":1096},[231,4892,556],{"class":237},[231,4894,4895,4897,4899,4901,4903,4905,4907,4909,4911,4913,4915,4917],{"class":233,"line":468},[231,4896,4872],{"class":237},[231,4898,270],{"class":241},[231,4900,246],{"class":245},[231,4902,655],{"class":237},[231,4904,658],{"class":307},[231,4906,537],{"class":237},[231,4908,3885],{"class":245},[231,4910,617],{"class":237},[231,4912,339],{"class":245},[231,4914,330],{"class":1215},[231,4916,537],{"class":237},[231,4918,4919],{"class":1096}," UpdateUserDto\n",[231,4921,4922,4925],{"class":233,"line":493},[231,4923,4924],{"class":237},"  )",[231,4926,1151],{"class":237},[231,4928,4929,4931,4933,4935,4937,4939,4941,4943,4945,4947,4949],{"class":233,"line":1176},[231,4930,1235],{"class":320},[231,4932,474],{"class":237},[231,4934,477],{"class":245},[231,4936,333],{"class":237},[231,4938,4400],{"class":241},[231,4940,246],{"class":307},[231,4942,4178],{"class":245},[231,4944,1051],{"class":237},[231,4946,376],{"class":245},[231,4948,360],{"class":307},[231,4950,363],{"class":237},[231,4952,4953],{"class":233,"line":1191},[231,4954,1257],{"class":237},[231,4956,4957],{"class":233,"line":1226},[231,4958,496],{"class":237},[208,4960,4962],{"id":4961},"best-practices","Best Practices",[204,4964,4965,4968],{},[729,4966,4967],{},"Define schemas close to usage"," - Keep schemas in the same file or nearby",[221,4970,4972],{"className":223,"code":4971,"language":225,"meta":226,"style":226},"\u002F\u002F ✅ Good - easy to find and maintain\nconst CreateUserSchema = z.object({ ... });\n\n@Controller('\u002Fusers')\nexport class UserController {\n  @Post('\u002F')\n  createUser(@Body({ validationSchema: CreateUserSchema }) data: UserDto) { }\n}\n",[228,4973,4974,4979,5006,5010,5026,5036,5052,5087],{"__ignoreMap":226},[231,4975,4976],{"class":233,"line":234},[231,4977,4978],{"class":282},"\u002F\u002F ✅ Good - easy to find and maintain\n",[231,4980,4981,4983,4985,4987,4989,4991,4993,4995,4997,5000,5002,5004],{"class":233,"line":261},[231,4982,511],{"class":510},[231,4984,514],{"class":245},[231,4986,517],{"class":237},[231,4988,520],{"class":245},[231,4990,333],{"class":237},[231,4992,525],{"class":241},[231,4994,246],{"class":245},[231,4996,655],{"class":237},[231,4998,4999],{"class":237}," ...",[231,5001,885],{"class":237},[231,5003,360],{"class":245},[231,5005,363],{"class":237},[231,5007,5008],{"class":233,"line":279},[231,5009,626],{"emptyLinePlaceholder":56},[231,5011,5012,5014,5016,5018,5020,5022,5024],{"class":233,"line":286},[231,5013,238],{"class":237},[231,5015,1127],{"class":241},[231,5017,246],{"class":245},[231,5019,249],{"class":237},[231,5021,253],{"class":252},[231,5023,249],{"class":237},[231,5025,258],{"class":245},[231,5027,5028,5030,5032,5034],{"class":233,"line":292},[231,5029,1142],{"class":320},[231,5031,1145],{"class":510},[231,5033,1148],{"class":1096},[231,5035,1151],{"class":237},[231,5037,5038,5040,5042,5044,5046,5048,5050],{"class":233,"line":298},[231,5039,1160],{"class":237},[231,5041,242],{"class":241},[231,5043,246],{"class":245},[231,5045,249],{"class":237},[231,5047,1169],{"class":252},[231,5049,249],{"class":237},[231,5051,258],{"class":245},[231,5053,5054,5056,5058,5060,5062,5064,5066,5068,5070,5072,5074,5076,5078,5080,5082,5084],{"class":233,"line":304},[231,5055,1194],{"class":307},[231,5057,267],{"class":237},[231,5059,270],{"class":241},[231,5061,246],{"class":245},[231,5063,655],{"class":237},[231,5065,658],{"class":307},[231,5067,537],{"class":237},[231,5069,514],{"class":245},[231,5071,617],{"class":237},[231,5073,339],{"class":245},[231,5075,330],{"class":1215},[231,5077,537],{"class":237},[231,5079,3025],{"class":1096},[231,5081,360],{"class":237},[231,5083,880],{"class":237},[231,5085,5086],{"class":237}," }\n",[231,5088,5089],{"class":233,"line":311},[231,5090,496],{"class":237},[204,5092,5093,5096],{},[729,5094,5095],{},"Use descriptive error messages"," - Help clients understand what's wrong",[221,5098,5100],{"className":223,"code":5099,"language":225,"meta":226,"style":226},"const PasswordSchema = z.string()\n  .min(8, 'Password must be at least 8 characters')\n  .regex(\u002F[A-Z]\u002F, 'Password must contain at least one uppercase letter')\n  .regex(\u002F[0-9]\u002F, 'Password must contain at least one number');\n",[228,5101,5102,5119,5141,5169],{"__ignoreMap":226},[231,5103,5104,5106,5109,5111,5113,5115,5117],{"class":233,"line":234},[231,5105,511],{"class":510},[231,5107,5108],{"class":245}," PasswordSchema ",[231,5110,517],{"class":237},[231,5112,520],{"class":245},[231,5114,333],{"class":237},[231,5116,544],{"class":241},[231,5118,2201],{"class":245},[231,5120,5121,5124,5126,5128,5130,5132,5134,5137,5139],{"class":233,"line":261},[231,5122,5123],{"class":237},"  .",[231,5125,576],{"class":241},[231,5127,246],{"class":245},[231,5129,3532],{"class":432},[231,5131,1051],{"class":237},[231,5133,387],{"class":237},[231,5135,5136],{"class":252},"Password must be at least 8 characters",[231,5138,249],{"class":237},[231,5140,258],{"class":245},[231,5142,5143,5145,5147,5149,5152,5155,5158,5160,5162,5165,5167],{"class":233,"line":279},[231,5144,5123],{"class":237},[231,5146,3352],{"class":241},[231,5148,246],{"class":245},[231,5150,5151],{"class":237},"\u002F[",[231,5153,5154],{"class":252},"A-Z",[231,5156,5157],{"class":237},"]\u002F",[231,5159,1051],{"class":237},[231,5161,387],{"class":237},[231,5163,5164],{"class":252},"Password must contain at least one uppercase letter",[231,5166,249],{"class":237},[231,5168,258],{"class":245},[231,5170,5171,5173,5175,5177,5179,5182,5184,5186,5188,5191,5193,5195],{"class":233,"line":286},[231,5172,5123],{"class":237},[231,5174,3352],{"class":241},[231,5176,246],{"class":245},[231,5178,5151],{"class":237},[231,5180,5181],{"class":252},"0-9",[231,5183,5157],{"class":237},[231,5185,1051],{"class":237},[231,5187,387],{"class":237},[231,5189,5190],{"class":252},"Password must contain at least one number",[231,5192,249],{"class":237},[231,5194,360],{"class":245},[231,5196,363],{"class":237},[204,5198,5199,5202],{},[729,5200,5201],{},"Validate early, validate often"," - Don't let bad data reach your business logic",[221,5204,5206],{"className":223,"code":5205,"language":225,"meta":226,"style":226},"\u002F\u002F ❌ Bad - validation happens too late\n@Post('\u002F')\ncreateUser(@Body() data: any) {\n  \u002F\u002F Business logic might fail with invalid data\n  await this.userService.create(data);\n}\n\n\u002F\u002F ✅ Good - validation happens first\n@Post('\u002F')\ncreateUser(@Body({ validationSchema: CreateUserSchema }) data: UserDto) {\n  \u002F\u002F Guaranteed valid data\n  await this.userService.create(data);\n}\n",[228,5207,5208,5213,5229,5241,5246,5267,5271,5275,5280,5296,5320,5325,5345],{"__ignoreMap":226},[231,5209,5210],{"class":233,"line":234},[231,5211,5212],{"class":282},"\u002F\u002F ❌ Bad - validation happens too late\n",[231,5214,5215,5217,5219,5221,5223,5225,5227],{"class":233,"line":261},[231,5216,238],{"class":237},[231,5218,242],{"class":241},[231,5220,246],{"class":245},[231,5222,249],{"class":237},[231,5224,1169],{"class":252},[231,5226,249],{"class":237},[231,5228,258],{"class":245},[231,5230,5231,5233,5235,5237,5239],{"class":233,"line":279},[231,5232,264],{"class":241},[231,5234,267],{"class":245},[231,5236,270],{"class":241},[231,5238,273],{"class":245},[231,5240,276],{"class":237},[231,5242,5243],{"class":233,"line":286},[231,5244,5245],{"class":282},"  \u002F\u002F Business logic might fail with invalid data\n",[231,5247,5248,5251,5253,5255,5257,5259,5261,5263,5265],{"class":233,"line":292},[231,5249,5250],{"class":320},"  await",[231,5252,474],{"class":237},[231,5254,477],{"class":245},[231,5256,333],{"class":237},[231,5258,482],{"class":241},[231,5260,246],{"class":307},[231,5262,330],{"class":245},[231,5264,360],{"class":307},[231,5266,363],{"class":237},[231,5268,5269],{"class":233,"line":298},[231,5270,496],{"class":237},[231,5272,5273],{"class":233,"line":304},[231,5274,626],{"emptyLinePlaceholder":56},[231,5276,5277],{"class":233,"line":311},[231,5278,5279],{"class":282},"\u002F\u002F ✅ Good - validation happens first\n",[231,5281,5282,5284,5286,5288,5290,5292,5294],{"class":233,"line":317},[231,5283,238],{"class":237},[231,5285,242],{"class":241},[231,5287,246],{"class":245},[231,5289,249],{"class":237},[231,5291,1169],{"class":252},[231,5293,249],{"class":237},[231,5295,258],{"class":245},[231,5297,5298,5300,5302,5304,5306,5308,5310,5312,5314,5316,5318],{"class":233,"line":366},[231,5299,264],{"class":241},[231,5301,267],{"class":245},[231,5303,270],{"class":241},[231,5305,246],{"class":245},[231,5307,655],{"class":237},[231,5309,658],{"class":307},[231,5311,537],{"class":237},[231,5313,514],{"class":245},[231,5315,617],{"class":237},[231,5317,3083],{"class":245},[231,5319,276],{"class":237},[231,5321,5322],{"class":233,"line":416},[231,5323,5324],{"class":282},"  \u002F\u002F Guaranteed valid data\n",[231,5326,5327,5329,5331,5333,5335,5337,5339,5341,5343],{"class":233,"line":457},[231,5328,5250],{"class":320},[231,5330,474],{"class":237},[231,5332,477],{"class":245},[231,5334,333],{"class":237},[231,5336,482],{"class":241},[231,5338,246],{"class":307},[231,5340,330],{"class":245},[231,5342,360],{"class":307},[231,5344,363],{"class":237},[231,5346,5347],{"class":233,"line":463},[231,5348,496],{"class":237},[204,5350,5351,5354],{},[729,5352,5353],{},"Don't over-validate"," - Balance strictness with usability",[221,5356,5358],{"className":223,"code":5357,"language":225,"meta":226,"style":226},"\u002F\u002F ❌ Too strict - will frustrate users\nconst NameSchema = z.string()\n  .min(2)\n  .max(20)\n  .regex(\u002F^[A-Za-z]+$\u002F); \u002F\u002F No spaces, special characters\n\n\u002F\u002F ✅ Reasonable - accepts most valid names\nconst NameSchema = z.string()\n  .min(2)\n  .max(100)\n  .trim();\n",[228,5359,5360,5365,5382,5394,5406,5439,5443,5448,5464,5476,5488],{"__ignoreMap":226},[231,5361,5362],{"class":233,"line":234},[231,5363,5364],{"class":282},"\u002F\u002F ❌ Too strict - will frustrate users\n",[231,5366,5367,5369,5372,5374,5376,5378,5380],{"class":233,"line":261},[231,5368,511],{"class":510},[231,5370,5371],{"class":245}," NameSchema ",[231,5373,517],{"class":237},[231,5375,520],{"class":245},[231,5377,333],{"class":237},[231,5379,544],{"class":241},[231,5381,2201],{"class":245},[231,5383,5384,5386,5388,5390,5392],{"class":233,"line":279},[231,5385,5123],{"class":237},[231,5387,576],{"class":241},[231,5389,246],{"class":245},[231,5391,942],{"class":432},[231,5393,258],{"class":245},[231,5395,5396,5398,5400,5402,5404],{"class":233,"line":286},[231,5397,5123],{"class":237},[231,5399,605],{"class":241},[231,5401,246],{"class":245},[231,5403,2407],{"class":432},[231,5405,258],{"class":245},[231,5407,5408,5410,5412,5414,5416,5418,5421,5424,5427,5429,5431,5433,5436],{"class":233,"line":292},[231,5409,5123],{"class":237},[231,5411,3352],{"class":241},[231,5413,246],{"class":245},[231,5415,1169],{"class":237},[231,5417,3359],{"class":320},[231,5419,5420],{"class":237},"[",[231,5422,5423],{"class":252},"A-Za-z",[231,5425,5426],{"class":237},"]+",[231,5428,3368],{"class":320},[231,5430,1169],{"class":237},[231,5432,360],{"class":245},[231,5434,5435],{"class":237},";",[231,5437,5438],{"class":282}," \u002F\u002F No spaces, special characters\n",[231,5440,5441],{"class":233,"line":298},[231,5442,626],{"emptyLinePlaceholder":56},[231,5444,5445],{"class":233,"line":304},[231,5446,5447],{"class":282},"\u002F\u002F ✅ Reasonable - accepts most valid names\n",[231,5449,5450,5452,5454,5456,5458,5460,5462],{"class":233,"line":311},[231,5451,511],{"class":510},[231,5453,5371],{"class":245},[231,5455,517],{"class":237},[231,5457,520],{"class":245},[231,5459,333],{"class":237},[231,5461,544],{"class":241},[231,5463,2201],{"class":245},[231,5465,5466,5468,5470,5472,5474],{"class":233,"line":317},[231,5467,5123],{"class":237},[231,5469,576],{"class":241},[231,5471,246],{"class":245},[231,5473,942],{"class":432},[231,5475,258],{"class":245},[231,5477,5478,5480,5482,5484,5486],{"class":233,"line":366},[231,5479,5123],{"class":237},[231,5481,605],{"class":241},[231,5483,246],{"class":245},[231,5485,610],{"class":432},[231,5487,258],{"class":245},[231,5489,5490,5492,5494,5496],{"class":233,"line":416},[231,5491,5123],{"class":237},[231,5493,3693],{"class":241},[231,5495,547],{"class":245},[231,5497,363],{"class":237},[204,5499,5500,5503],{},[729,5501,5502],{},"Use transformation wisely"," - Clean data, but don't change meaning",[221,5505,5507],{"className":223,"code":5506,"language":225,"meta":226,"style":226},"\u002F\u002F ✅ Good transformations\nz.string().trim()                    \u002F\u002F Remove whitespace\nz.string().toLowerCase()             \u002F\u002F Normalize case\nz.string().datetime().transform(Date) \u002F\u002F Parse to Date\n\n\u002F\u002F ❌ Questionable transformations\nz.string().transform(s => s.substring(0, 10)) \u002F\u002F Silently truncating\nz.number().transform(n => Math.abs(n))        \u002F\u002F Changing sign without telling user\n",[228,5508,5509,5514,5534,5554,5580,5584,5589,5631],{"__ignoreMap":226},[231,5510,5511],{"class":233,"line":234},[231,5512,5513],{"class":282},"\u002F\u002F ✅ Good transformations\n",[231,5515,5516,5519,5521,5523,5525,5527,5529,5532],{"class":233,"line":261},[231,5517,5518],{"class":245},"z",[231,5520,333],{"class":237},[231,5522,544],{"class":241},[231,5524,547],{"class":245},[231,5526,333],{"class":237},[231,5528,3693],{"class":241},[231,5530,5531],{"class":245},"()                    ",[231,5533,3699],{"class":282},[231,5535,5536,5538,5540,5542,5544,5546,5548,5551],{"class":233,"line":279},[231,5537,5518],{"class":245},[231,5539,333],{"class":237},[231,5541,544],{"class":241},[231,5543,547],{"class":245},[231,5545,333],{"class":237},[231,5547,3763],{"class":241},[231,5549,5550],{"class":245},"()             ",[231,5552,5553],{"class":282},"\u002F\u002F Normalize case\n",[231,5555,5556,5558,5560,5562,5564,5566,5568,5570,5572,5574,5577],{"class":233,"line":286},[231,5557,5518],{"class":245},[231,5559,333],{"class":237},[231,5561,544],{"class":241},[231,5563,547],{"class":245},[231,5565,333],{"class":237},[231,5567,3839],{"class":241},[231,5569,547],{"class":245},[231,5571,333],{"class":237},[231,5573,3748],{"class":241},[231,5575,5576],{"class":245},"(Date) ",[231,5578,5579],{"class":282},"\u002F\u002F Parse to Date\n",[231,5581,5582],{"class":233,"line":292},[231,5583,626],{"emptyLinePlaceholder":56},[231,5585,5586],{"class":233,"line":298},[231,5587,5588],{"class":282},"\u002F\u002F ❌ Questionable transformations\n",[231,5590,5591,5593,5595,5597,5599,5601,5603,5605,5607,5609,5611,5613,5616,5618,5620,5622,5625,5628],{"class":233,"line":304},[231,5592,5518],{"class":245},[231,5594,333],{"class":237},[231,5596,544],{"class":241},[231,5598,547],{"class":245},[231,5600,333],{"class":237},[231,5602,3748],{"class":241},[231,5604,246],{"class":245},[231,5606,3753],{"class":1215},[231,5608,3577],{"class":510},[231,5610,3758],{"class":245},[231,5612,333],{"class":237},[231,5614,5615],{"class":241},"substring",[231,5617,246],{"class":245},[231,5619,581],{"class":432},[231,5621,1051],{"class":237},[231,5623,5624],{"class":432}," 10",[231,5626,5627],{"class":245},")) ",[231,5629,5630],{"class":282},"\u002F\u002F Silently truncating\n",[231,5632,5633,5635,5637,5639,5641,5643,5645,5647,5650,5652,5655,5657,5660,5663],{"class":233,"line":311},[231,5634,5518],{"class":245},[231,5636,333],{"class":237},[231,5638,390],{"class":241},[231,5640,547],{"class":245},[231,5642,333],{"class":237},[231,5644,3748],{"class":241},[231,5646,246],{"class":245},[231,5648,5649],{"class":1215},"n",[231,5651,3577],{"class":510},[231,5653,5654],{"class":245}," Math",[231,5656,333],{"class":237},[231,5658,5659],{"class":241},"abs",[231,5661,5662],{"class":245},"(n))        ",[231,5664,5665],{"class":282},"\u002F\u002F Changing sign without telling user\n",[208,5667,5669],{"id":5668},"choosing-a-validation-library","Choosing a Validation Library",[204,5671,5672],{},"All Standard Schema libraries work the same way in Vercube, but each has different strengths:",[216,5674,815],{"id":893},[204,5676,5677,5680],{},[729,5678,5679],{},"Best for:"," General use, great TypeScript support, large ecosystem",[805,5682,5683,5686,5689,5692],{},[753,5684,5685],{},"Most popular, lots of examples and plugins",[753,5687,5688],{},"Excellent error messages",[753,5690,5691],{},"Great IDE autocomplete",[753,5693,5694],{},"Slightly larger bundle size",[216,5696,825],{"id":1288},[204,5698,5699,5701],{},[729,5700,5679],{}," Bundle size sensitive projects, modular validation",[805,5703,5704,5707,5710,5713],{},[753,5705,5706],{},"Smallest bundle size (tree-shakeable)",[753,5708,5709],{},"Modular - only import what you need",[753,5711,5712],{},"Similar API to Zod",[753,5714,5715],{},"Growing ecosystem",[216,5717,835],{"id":1697},[204,5719,5720,5722],{},[729,5721,5679],{}," Runtime performance, type-first approach",[805,5724,5725,5728,5731,5734],{},[753,5726,5727],{},"Fastest runtime validation",[753,5729,5730],{},"Unique syntax using TypeScript-like strings",[753,5732,5733],{},"Excellent type inference",[753,5735,5736],{},"Smaller community (newer)",[853,5738,5739],{},[204,5740,5741],{},"Start with Zod if you're unsure - it has the best documentation and community support. You can always switch later thanks to Standard Schema!",[5743,5744,5745],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":226,"searchDepth":234,"depth":261,"links":5747},[5748,5752,5755,5758,5759,5760,5761,5762,5763,5764,5765,5766],{"id":210,"depth":261,"text":211,"children":5749},[5750,5751],{"id":218,"depth":279,"text":219},{"id":499,"depth":279,"text":500},{"id":715,"depth":261,"text":716,"children":5753},[5754],{"id":740,"depth":279,"text":741},{"id":785,"depth":261,"text":786,"children":5756},[5757],{"id":799,"depth":279,"text":800},{"id":860,"depth":261,"text":861},{"id":1949,"depth":261,"text":1950},{"id":2529,"depth":261,"text":2530},{"id":2844,"depth":261,"text":2845},{"id":3155,"depth":261,"text":3156},{"id":4189,"depth":261,"text":4190},{"id":4419,"depth":261,"text":4420},{"id":4961,"depth":261,"text":4962},{"id":5668,"depth":261,"text":5669,"children":5767},[5768,5769,5770],{"id":893,"depth":279,"text":815},{"id":1288,"depth":279,"text":825},{"id":1697,"depth":279,"text":835},"Automatic request validation with Standard Schema support","md",null,{},{"title":49,"description":5771},"3fRnvJMDL0fq7K_8B2O7XCEn4ddEG7urtD2SsIGhYXU",[5778,5779],{"title":45,"path":46,"stem":47,"description":5773,"children":-1},{"title":66,"path":67,"stem":68,"description":5780,"children":-1},"Flexible authentication system for Vercube applications",1775552780365]