[{"data":1,"prerenderedAt":2909},["ShallowReactive",2],{"navigation_docs":3,"-docs-capabilities-schema":493,"-docs-capabilities-schema-surround":2904},[4,46,135,218,257,292,355,377,420],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":45},"Getting Started","i-lucide-rocket","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",[10,15,20,25,30,35,40],{"title":11,"path":12,"stem":13,"icon":14},"What is Heximon?","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F01.getting-started\u002F01.introduction","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F01.getting-started\u002F02.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002F01.getting-started\u002F03.quick-start","i-lucide-zap",{"title":26,"path":27,"stem":28,"icon":29},"Core Concepts","\u002Fdocs\u002Fgetting-started\u002Fcore-concepts","docs\u002F01.getting-started\u002F04.core-concepts","i-lucide-shapes",{"title":31,"path":32,"stem":33,"icon":34},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F01.getting-started\u002F05.examples","i-lucide-library",{"title":36,"path":37,"stem":38,"icon":39},"Where Next?","\u002Fdocs\u002Fgetting-started\u002Fwhere-next","docs\u002F01.getting-started\u002F06.where-next","i-lucide-signpost",{"title":41,"path":42,"stem":43,"icon":44},"Troubleshooting","\u002Fdocs\u002Fgetting-started\u002Ftroubleshooting","docs\u002F01.getting-started\u002F07.troubleshooting","i-lucide-life-buoy",false,{"title":47,"icon":48,"path":49,"stem":50,"children":51,"page":45},"Essentials","i-lucide-boxes","\u002Fdocs\u002Fessentials","docs\u002F02.essentials",[52,56,61,66,71,76,81,86,91,96,101,105,110,115,120,125,130],{"title":53,"path":54,"stem":55,"icon":48},"Modules & DI","\u002Fdocs\u002Fessentials\u002Fmodules-and-di","docs\u002F02.essentials\u002F01.modules-and-di",{"title":57,"path":58,"stem":59,"icon":60},"Controllers","\u002Fdocs\u002Fessentials\u002Fcontrollers","docs\u002F02.essentials\u002F02.controllers","i-lucide-route",{"title":62,"path":63,"stem":64,"icon":65},"Validation & DTOs","\u002Fdocs\u002Fessentials\u002Fvalidation","docs\u002F02.essentials\u002F03.validation","i-lucide-shield-check",{"title":67,"path":68,"stem":69,"icon":70},"Contracts","\u002Fdocs\u002Fessentials\u002Fcontracts","docs\u002F02.essentials\u002F04.contracts","i-lucide-file-signature",{"title":72,"path":73,"stem":74,"icon":75},"REST Client","\u002Fdocs\u002Fessentials\u002Fclient","docs\u002F02.essentials\u002F05.client","i-lucide-plug",{"title":77,"path":78,"stem":79,"icon":80},"Database","\u002Fdocs\u002Fessentials\u002Fdatabase","docs\u002F02.essentials\u002F06.database","i-lucide-database",{"title":82,"path":83,"stem":84,"icon":85},"Drizzle ORM","\u002Fdocs\u002Fessentials\u002Fdrizzle","docs\u002F02.essentials\u002F07.drizzle","i-lucide-database-zap",{"title":87,"path":88,"stem":89,"icon":90},"Persistence & Transactions","\u002Fdocs\u002Fessentials\u002Fpersistence","docs\u002F02.essentials\u002F08.persistence","i-lucide-database-backup",{"title":92,"path":93,"stem":94,"icon":95},"Migrations","\u002Fdocs\u002Fessentials\u002Fmigrations","docs\u002F02.essentials\u002F09.migrations","i-lucide-git-branch",{"title":97,"path":98,"stem":99,"icon":100},"Authentication","\u002Fdocs\u002Fessentials\u002Fauthentication","docs\u002F02.essentials\u002F10.authentication","i-lucide-key-round",{"title":102,"path":103,"stem":104,"icon":65},"Permissions & scopes","\u002Fdocs\u002Fessentials\u002Fpermissions","docs\u002F02.essentials\u002F11.permissions",{"title":106,"path":107,"stem":108,"icon":109},"Error Handling","\u002Fdocs\u002Fessentials\u002Ferrors","docs\u002F02.essentials\u002F12.errors","i-lucide-triangle-alert",{"title":111,"path":112,"stem":113,"icon":114},"Testing a Heximon App","\u002Fdocs\u002Fessentials\u002Ftesting","docs\u002F02.essentials\u002F13.testing","i-lucide-flask-conical",{"title":116,"path":117,"stem":118,"icon":119},"Test app harness","\u002Fdocs\u002Fessentials\u002Fcreatetestapp","docs\u002F02.essentials\u002F14.createtestapp","i-lucide-test-tube",{"title":121,"path":122,"stem":123,"icon":124},"Logging & Observability","\u002Fdocs\u002Fessentials\u002Flogging","docs\u002F02.essentials\u002F17.logging","i-lucide-scroll-text",{"title":126,"path":127,"stem":128,"icon":129},"Context & Lifecycle","\u002Fdocs\u002Fessentials\u002Fcontext-and-lifecycle","docs\u002F02.essentials\u002F18.context-and-lifecycle","i-lucide-radio",{"title":131,"path":132,"stem":133,"icon":134},"Project Structure","\u002Fdocs\u002Fessentials\u002Fproject-structure","docs\u002F02.essentials\u002F19.project-structure","i-lucide-folder-tree",{"title":136,"icon":137,"path":138,"stem":139,"children":140,"page":45},"Capabilities","i-lucide-sparkles","\u002Fdocs\u002Fcapabilities","docs\u002F03.capabilities",[141,145,150,155,160,164,169,174,179,184,188,193,198,203,208,213],{"title":142,"path":143,"stem":144,"icon":137},"Overview","\u002Fdocs\u002Fcapabilities\u002Foverview","docs\u002F03.capabilities\u002F01.overview",{"title":146,"path":147,"stem":148,"icon":149},"Events","\u002Fdocs\u002Fcapabilities\u002Fevents","docs\u002F03.capabilities\u002F02.events","i-lucide-radio-tower",{"title":151,"path":152,"stem":153,"icon":154},"Queue","\u002Fdocs\u002Fcapabilities\u002Fbackground-jobs","docs\u002F03.capabilities\u002F03.background-jobs","i-lucide-list-ordered",{"title":156,"path":157,"stem":158,"icon":159},"Scheduled Work","\u002Fdocs\u002Fcapabilities\u002Fscheduled-jobs","docs\u002F03.capabilities\u002F04.scheduled-jobs","i-lucide-clock",{"title":161,"path":162,"stem":163,"icon":85},"Caching","\u002Fdocs\u002Fcapabilities\u002Fcaching","docs\u002F03.capabilities\u002F05.caching",{"title":165,"path":166,"stem":167,"icon":168},"Key\u002FValue Storage","\u002Fdocs\u002Fcapabilities\u002Fkey-value","docs\u002F03.capabilities\u002F06.key-value","i-lucide-hard-drive",{"title":170,"path":171,"stem":172,"icon":173},"Blob Storage","\u002Fdocs\u002Fcapabilities\u002Fblob","docs\u002F03.capabilities\u002F07.blob","i-lucide-folder-open",{"title":175,"path":176,"stem":177,"icon":178},"Health & Readiness","\u002Fdocs\u002Fcapabilities\u002Fhealth","docs\u002F03.capabilities\u002F08.health","i-lucide-heart-pulse",{"title":180,"path":181,"stem":182,"icon":183},"Notifications","\u002Fdocs\u002Fcapabilities\u002Fnotifications","docs\u002F03.capabilities\u002F09.notifications","i-lucide-mail",{"title":185,"path":186,"stem":187,"icon":65},"Idempotency","\u002Fdocs\u002Fcapabilities\u002Fidempotency","docs\u002F03.capabilities\u002F10.idempotency",{"title":189,"path":190,"stem":191,"icon":192},"Security Hardening","\u002Fdocs\u002Fcapabilities\u002Fsecurity","docs\u002F03.capabilities\u002F11.security","i-lucide-shield",{"title":194,"path":195,"stem":196,"icon":197},"Observability & Tracing","\u002Fdocs\u002Fcapabilities\u002Fobservability","docs\u002F03.capabilities\u002F12.observability","i-lucide-activity",{"title":199,"path":200,"stem":201,"icon":202},"OpenAPI","\u002Fdocs\u002Fcapabilities\u002Fopenapi","docs\u002F03.capabilities\u002F13.openapi","i-lucide-book-marked",{"title":204,"path":205,"stem":206,"icon":207},"MCP Server","\u002Fdocs\u002Fcapabilities\u002Fmcp","docs\u002F03.capabilities\u002F14.mcp","i-lucide-bot",{"title":209,"path":210,"stem":211,"icon":212},"Schema DTOs","\u002Fdocs\u002Fcapabilities\u002Fschema","docs\u002F03.capabilities\u002F15.schema","i-lucide-file-json",{"title":214,"path":215,"stem":216,"icon":217},"Branded IDs","\u002Fdocs\u002Fcapabilities\u002Fbranded-ids","docs\u002F03.capabilities\u002F16.branded-ids","i-lucide-tag",{"title":219,"icon":220,"path":221,"stem":222,"children":223,"page":45},"Architecture","i-lucide-building","\u002Fdocs\u002Farchitecture","docs\u002F04.architecture",[224,227,232,237,242,247,252],{"title":142,"path":225,"stem":226,"icon":220},"\u002Fdocs\u002Farchitecture\u002Foverview","docs\u002F04.architecture\u002F01.overview",{"title":228,"path":229,"stem":230,"icon":231},"Domain-Driven Design","\u002Fdocs\u002Farchitecture\u002Fddd","docs\u002F04.architecture\u002F02.ddd","i-lucide-hexagon",{"title":233,"path":234,"stem":235,"icon":236},"CQRS","\u002Fdocs\u002Farchitecture\u002Fcqrs","docs\u002F04.architecture\u002F03.cqrs","i-lucide-split",{"title":238,"path":239,"stem":240,"icon":241},"Repository Pattern","\u002Fdocs\u002Farchitecture\u002Frepository-pattern","docs\u002F04.architecture\u002F04.repository-pattern","i-lucide-archive",{"title":243,"path":244,"stem":245,"icon":246},"Integration Events","\u002Fdocs\u002Farchitecture\u002Fintegration-events","docs\u002F04.architecture\u002F05.integration-events","i-lucide-send-horizontal",{"title":248,"path":249,"stem":250,"icon":251},"Saga Orchestration","\u002Fdocs\u002Farchitecture\u002Fsagas","docs\u002F04.architecture\u002F06.sagas","i-lucide-hourglass",{"title":253,"path":254,"stem":255,"icon":256},"Durable Workflows","\u002Fdocs\u002Farchitecture\u002Fworkflows","docs\u002F04.architecture\u002F07.workflows","i-lucide-workflow",{"title":258,"icon":259,"path":260,"stem":261,"children":262,"page":45},"Realtime","i-lucide-cable","\u002Fdocs\u002Frealtime","docs\u002F05.realtime",[263,266,270,274,279,284,288],{"title":142,"path":264,"stem":265,"icon":259},"\u002Fdocs\u002Frealtime\u002Foverview","docs\u002F05.realtime\u002F01.overview",{"title":267,"path":268,"stem":269,"icon":129},"WebSockets","\u002Fdocs\u002Frealtime\u002Fwebsockets","docs\u002F05.realtime\u002F02.websockets",{"title":271,"path":272,"stem":273,"icon":70},"WebSocket Contracts","\u002Fdocs\u002Frealtime\u002Fwebsocket-contracts","docs\u002F05.realtime\u002F03.websocket-contracts",{"title":275,"path":276,"stem":277,"icon":278},"Server-Sent Events","\u002Fdocs\u002Frealtime\u002Fserver-sent-events","docs\u002F05.realtime\u002F04.server-sent-events","i-lucide-rss",{"title":280,"path":281,"stem":282,"icon":283},"Typed Clients","\u002Fdocs\u002Frealtime\u002Ftyped-clients","docs\u002F05.realtime\u002F05.typed-clients","i-lucide-plug-zap",{"title":285,"path":286,"stem":287,"icon":259},"AsyncAPI","\u002Fdocs\u002Frealtime\u002Fasyncapi","docs\u002F05.realtime\u002F06.asyncapi",{"title":289,"path":290,"stem":291,"icon":80},"Durable Objects","\u002Fdocs\u002Frealtime\u002Fdurable-objects","docs\u002F05.realtime\u002F07.durable-objects",{"title":293,"icon":294,"path":295,"stem":296,"children":297,"page":45},"Deploy","i-lucide-cloud-upload","\u002Fdocs\u002Fdeploy","docs\u002F06.deploy",[298,301,306,311,316,321,326,331,336,341,345,350],{"title":142,"path":299,"stem":300,"icon":6},"\u002Fdocs\u002Fdeploy\u002Foverview","docs\u002F06.deploy\u002F01.overview",{"title":302,"path":303,"stem":304,"icon":305},"Node","\u002Fdocs\u002Fdeploy\u002Fnode","docs\u002F06.deploy\u002F02.node","la:node-js",{"title":307,"path":308,"stem":309,"icon":310},"Cloudflare","\u002Fdocs\u002Fdeploy\u002Fcloudflare","docs\u002F06.deploy\u002F03.cloudflare","simple-icons:cloudflare",{"title":312,"path":313,"stem":314,"icon":315},"Vercel","\u002Fdocs\u002Fdeploy\u002Fvercel","docs\u002F06.deploy\u002F04.vercel","ri:vercel-fill",{"title":317,"path":318,"stem":319,"icon":320},"Netlify","\u002Fdocs\u002Fdeploy\u002Fnetlify","docs\u002F06.deploy\u002F05.netlify","i-simple-icons-netlify",{"title":322,"path":323,"stem":324,"icon":325},"AWS Lambda","\u002Fdocs\u002Fdeploy\u002Faws-lambda","docs\u002F06.deploy\u002F06.aws-lambda","hugeicons:aws-lambda",{"title":327,"path":328,"stem":329,"icon":330},"Deno Deploy","\u002Fdocs\u002Fdeploy\u002Fdeno-deploy","docs\u002F06.deploy\u002F07.deno-deploy","simple-icons:denodeploy",{"title":332,"path":333,"stem":334,"icon":335},"Nitro","\u002Fdocs\u002Fdeploy\u002Fnitro","docs\u002F06.deploy\u002F08.nitro","i-unjs-nitro",{"title":337,"path":338,"stem":339,"icon":340},"Nuxt","\u002Fdocs\u002Fdeploy\u002Fnuxt","docs\u002F06.deploy\u002F09.nuxt","i-devicon-nuxt",{"title":342,"path":343,"stem":344,"icon":236},"Mixed-runtime split","\u002Fdocs\u002Fdeploy\u002Fmixed-runtime-split","docs\u002F06.deploy\u002F10.mixed-runtime-split",{"title":346,"path":347,"stem":348,"icon":349},"Hosts","\u002Fdocs\u002Fdeploy\u002Fhosts","docs\u002F06.deploy\u002F11.hosts","i-lucide-map",{"title":351,"path":352,"stem":353,"icon":354},"Cross-service events","\u002Fdocs\u002Fdeploy\u002Fcross-service-events","docs\u002F06.deploy\u002F12.cross-service-events","i-lucide-network",{"title":356,"icon":357,"path":358,"stem":359,"children":360,"page":45},"CLI","i-lucide-terminal","\u002Fdocs\u002Fcli","docs\u002F07.cli",[361,365,369,373],{"title":362,"path":363,"stem":364,"icon":357},"The heximon CLI","\u002Fdocs\u002Fcli\u002Foverview","docs\u002F07.cli\u002F01.overview",{"title":366,"path":367,"stem":368,"icon":137},"Create a New App","\u002Fdocs\u002Fcli\u002Fcreate","docs\u002F07.cli\u002F02.create",{"title":370,"path":371,"stem":372,"icon":95},"Migrations from the CLI","\u002Fdocs\u002Fcli\u002Fmigrations","docs\u002F07.cli\u002F03.migrations",{"title":374,"path":375,"stem":376,"icon":6},"Deploying a Heximon app","\u002Fdocs\u002Fcli\u002Fdeploy","docs\u002F07.cli\u002F04.deploy",{"title":378,"icon":379,"path":380,"stem":381,"children":382,"page":45},"Under the Hood","i-lucide-wrench","\u002Fdocs\u002Funder-the-hood","docs\u002F08.under-the-hood",[383,388,393,397,402,407,411,415],{"title":384,"path":385,"stem":386,"icon":387},"How the Compiler Works","\u002Fdocs\u002Funder-the-hood\u002Fhow-the-compiler-works","docs\u002F08.under-the-hood\u002F01.how-the-compiler-works","i-lucide-cog",{"title":389,"path":390,"stem":391,"icon":392},"Compiler","\u002Fdocs\u002Funder-the-hood\u002Fextending-the-compiler","docs\u002F08.under-the-hood\u002F02.extending-the-compiler","i-lucide-cpu",{"title":394,"path":395,"stem":396,"icon":357},"Compiler Diagnostics","\u002Fdocs\u002Funder-the-hood\u002Fcompiler-diagnostics","docs\u002F08.under-the-hood\u002F03.compiler-diagnostics",{"title":398,"path":399,"stem":400,"icon":401},"Library Mode","\u002Fdocs\u002Funder-the-hood\u002Flibrary-mode","docs\u002F08.under-the-hood\u002F04.library-mode","i-lucide-package",{"title":403,"path":404,"stem":405,"icon":406},"Other bundlers","\u002Fdocs\u002Funder-the-hood\u002Falternate-bundlers","docs\u002F08.under-the-hood\u002F05.alternate-bundlers","i-lucide-blocks",{"title":408,"path":409,"stem":410,"icon":401},"Packages","\u002Fdocs\u002Funder-the-hood\u002Fpackages","docs\u002F08.under-the-hood\u002F06.packages",{"title":412,"path":413,"stem":414,"icon":207},"AI Skills","\u002Fdocs\u002Funder-the-hood\u002Fai-and-agents","docs\u002F08.under-the-hood\u002F07.ai-and-agents",{"title":416,"path":417,"stem":418,"icon":419},"Advanced DI","\u002Fdocs\u002Funder-the-hood\u002Fadvanced-di","docs\u002F08.under-the-hood\u002F08.advanced-di","i-lucide-git-fork",{"title":421,"icon":422,"path":423,"stem":424,"children":425,"page":45},"Recipes","i-lucide-book-open-check","\u002Fdocs\u002Frecipes","docs\u002F09.recipes",[426,431,436,440,444,448,452,456,460,465,469,474,479,484,488],{"title":427,"path":428,"stem":429,"icon":430},"Send an Email","\u002Fdocs\u002Frecipes\u002Fsend-an-email","docs\u002F09.recipes\u002F01.send-an-email","i-lucide-send",{"title":432,"path":433,"stem":434,"icon":435},"Upload a File","\u002Fdocs\u002Frecipes\u002Fupload-a-file","docs\u002F09.recipes\u002F02.upload-a-file","i-lucide-upload",{"title":437,"path":438,"stem":439,"icon":24},"Cache an Expensive Call","\u002Fdocs\u002Frecipes\u002Fcache-an-expensive-call","docs\u002F09.recipes\u002F03.cache-an-expensive-call",{"title":441,"path":442,"stem":443,"icon":154},"Paginate a List","\u002Fdocs\u002Frecipes\u002Fpaginate-a-list","docs\u002F09.recipes\u002F04.paginate-a-list",{"title":445,"path":446,"stem":447,"icon":65},"Protect Admin Routes","\u002Fdocs\u002Frecipes\u002Fprotect-admin-routes","docs\u002F09.recipes\u002F05.protect-admin-routes",{"title":449,"path":450,"stem":451,"icon":178},"Health Probes and a Nightly Job","\u002Fdocs\u002Frecipes\u002Fhealth-probes-and-a-nightly-job","docs\u002F09.recipes\u002F06.health-probes-and-a-nightly-job",{"title":453,"path":454,"stem":455,"icon":80},"Build a CRUD API","\u002Fdocs\u002Frecipes\u002Fcrud-api","docs\u002F09.recipes\u002F07.crud-api",{"title":457,"path":458,"stem":459,"icon":100},"Add Authentication","\u002Fdocs\u002Frecipes\u002Fadd-authentication","docs\u002F09.recipes\u002F08.add-authentication",{"title":461,"path":462,"stem":463,"icon":464},"Background Jobs","\u002Fdocs\u002Frecipes\u002Fbackground-jobs","docs\u002F09.recipes\u002F09.background-jobs","i-lucide-timer",{"title":466,"path":467,"stem":468,"icon":149},"Decouple Features with Events","\u002Fdocs\u002Frecipes\u002Fevent-driven-module","docs\u002F09.recipes\u002F10.event-driven-module",{"title":470,"path":471,"stem":472,"icon":473},"Build a DDD Aggregate","\u002Fdocs\u002Frecipes\u002Fddd-aggregate","docs\u002F09.recipes\u002F11.ddd-aggregate","i-lucide-box",{"title":475,"path":476,"stem":477,"icon":478},"Publish a Feature Package","\u002Fdocs\u002Frecipes\u002Ffeature-package","docs\u002F09.recipes\u002F12.feature-package","i-lucide-package-open",{"title":480,"path":481,"stem":482,"icon":483},"Reliable Integration Events","\u002Fdocs\u002Frecipes\u002Freliable-integration-events","docs\u002F09.recipes\u002F13.reliable-integration-events","i-lucide-inbox",{"title":485,"path":486,"stem":487,"icon":95},"Reactive Choreography","\u002Fdocs\u002Frecipes\u002Freactive-choreography","docs\u002F09.recipes\u002F14.reactive-choreography",{"title":489,"path":490,"stem":491,"icon":492},"Build a Production CRUD API","\u002Fdocs\u002Frecipes\u002Fproduction-crud-api","docs\u002F09.recipes\u002F15.production-crud-api","i-lucide-layers",{"id":494,"title":209,"body":495,"description":2897,"extension":2898,"links":2899,"meta":2900,"navigation":2901,"path":210,"seo":2902,"stem":211,"__hash__":2903},"docs\u002Fdocs\u002F03.capabilities\u002F15.schema.md",{"type":496,"value":497,"toc":2883},"minimark",[498,541,560,565,645,668,672,678,1079,1094,1098,1112,1376,1389,1421,1425,1431,1588,1594,1643,1647,1668,1975,1979,1989,2351,2362,2366,2376,2504,2508,2531,2539,2555,2610,2613,2779,2807,2811,2879],[499,500,501,502,506,507,511,512,516,517,524,525,528,529,532,533,536,537,540],"p",{},"Describe a shape once, get a type ",[503,504,505],"em",{},"and"," a validator. You write a request or response shape as a class —\n",[508,509,510],"code",{},"class CreateTask extends SchemaObject({ ... }) {}"," — and that single declaration is ",[513,514,515],"strong",{},"simultaneously"," the\ninferred TypeScript type and a usable ",[518,519,523],"a",{"href":520,"rel":521},"https:\u002F\u002Fstandardschema.dev",[522],"nofollow","Standard Schema"," value. It drops straight\ninto a route's ",[508,526,527],{},"body",", ",[508,530,531],{},"responses",", or ",[508,534,535],{},"pathParams",", and ",[508,538,539],{},"readValidatedBody()"," validates against it at the\nboundary. No interface to keep in sync with a separate validator — there is only one source of truth.",[499,542,543,544,547,548,553,554,559],{},"The per-field validators are ",[503,545,546],{},"any"," Standard Schema: ",[518,549,552],{"href":550,"rel":551},"https:\u002F\u002Fzod.dev",[522],"zod"," is the default across these docs,\nand ",[518,555,558],{"href":556,"rel":557},"https:\u002F\u002Fvalibot.dev",[522],"valibot",", arktype, and others work identically. Heximon never imports a validator\nlibrary — it owns the object and array structure and delegates each field to its own validator. That is why\nthe package depends on nothing but the Standard Schema contract: you bring the validator you already like.",[561,562,564],"h2",{"id":563},"install-the-package","Install the package",[566,567,568,596,613,629],"code-group",{},[569,570,576],"pre",{"className":571,"code":572,"filename":573,"language":574,"meta":575,"style":575},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @heximon\u002Fschema zod\n","pnpm","bash","",[508,577,578],{"__ignoreMap":575},[579,580,583,586,590,593],"span",{"class":581,"line":582},"line",1,[579,584,573],{"class":585},"sBMFI",[579,587,589],{"class":588},"sfazB"," add",[579,591,592],{"class":588}," @heximon\u002Fschema",[579,594,595],{"class":588}," zod\n",[569,597,600],{"className":571,"code":598,"filename":599,"language":574,"meta":575,"style":575},"npm install @heximon\u002Fschema zod\n","npm",[508,601,602],{"__ignoreMap":575},[579,603,604,606,609,611],{"class":581,"line":582},[579,605,599],{"class":585},[579,607,608],{"class":588}," install",[579,610,592],{"class":588},[579,612,595],{"class":588},[569,614,617],{"className":571,"code":615,"filename":616,"language":574,"meta":575,"style":575},"yarn add @heximon\u002Fschema zod\n","yarn",[508,618,619],{"__ignoreMap":575},[579,620,621,623,625,627],{"class":581,"line":582},[579,622,616],{"class":585},[579,624,589],{"class":588},[579,626,592],{"class":588},[579,628,595],{"class":588},[569,630,633],{"className":571,"code":631,"filename":632,"language":574,"meta":575,"style":575},"bun add @heximon\u002Fschema zod\n","bun",[508,634,635],{"__ignoreMap":575},[579,636,637,639,641,643],{"class":581,"line":582},[579,638,632],{"class":585},[579,640,589],{"class":588},[579,642,592],{"class":588},[579,644,595],{"class":588},[499,646,647,648,651,652,528,655,528,658,528,661,664,665,667],{},"The validator is your choice — swap in any Standard-Schema library; these examples use zod, but valibot and\narktype work identically, because ",[508,649,650],{},"@heximon\u002Fschema"," owns only the object\u002Farray structure and never imports a\nvalidator itself. The whole surface (",[508,653,654],{},"SchemaObject",[508,656,657],{},"SchemaArray",[508,659,660],{},"Schema",[508,662,663],{},"SchemaError",") is exported from\n",[508,666,650],{},"; there are no subpaths to remember.",[561,669,671],{"id":670},"define-a-dto","Define a DTO",[499,673,674,677],{},[508,675,676],{},"SchemaObject(shape)"," composes a record of per-field Standard Schemas into a constructible, validating class.\nEach value is a plain validator from your library — here, zod validators:",[569,679,684],{"className":680,"code":681,"filename":682,"language":683,"meta":575,"style":575},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { SchemaObject } from \"@heximon\u002Fschema\";\nimport { z } from \"zod\";\n\n\u002F** The create-task request body. *\u002F\nexport class CreateTaskBody extends SchemaObject({\n  title: z.string().min(1),\n  assigneeId: z.string().min(1),\n}) {}\n\n\u002F** The task representation the API returns. *\u002F\nexport class TaskResponse extends SchemaObject({\n  id: z.string(),\n  title: z.string(),\n  status: z.enum([\"Todo\", \"Done\"]),\n  assigneeId: z.string(),\n  completedAt: z.string().optional(), \u002F\u002F accepts undefined → optional, omitted from `required`\n}) {}\n\n\u002F** The path parameters of a `:id` route. *\u002F\nexport class TaskIdParams extends SchemaObject({\n  id: z.string().min(1),\n}) {}\n","src\u002Ftasks\u002Ftask.dto.ts","ts",[508,685,686,717,739,746,753,778,816,844,856,861,867,885,903,920,960,977,1005,1014,1019,1025,1043,1070],{"__ignoreMap":575},[579,687,688,692,696,700,703,706,709,711,714],{"class":581,"line":582},[579,689,691],{"class":690},"s7zQu","import",[579,693,695],{"class":694},"sMK4o"," {",[579,697,699],{"class":698},"sTEyZ"," SchemaObject",[579,701,702],{"class":694}," }",[579,704,705],{"class":690}," from",[579,707,708],{"class":694}," \"",[579,710,650],{"class":588},[579,712,713],{"class":694},"\"",[579,715,716],{"class":694},";\n",[579,718,720,722,724,727,729,731,733,735,737],{"class":581,"line":719},2,[579,721,691],{"class":690},[579,723,695],{"class":694},[579,725,726],{"class":698}," z",[579,728,702],{"class":694},[579,730,705],{"class":690},[579,732,708],{"class":694},[579,734,552],{"class":588},[579,736,713],{"class":694},[579,738,716],{"class":694},[579,740,742],{"class":581,"line":741},3,[579,743,745],{"emptyLinePlaceholder":744},true,"\n",[579,747,749],{"class":581,"line":748},4,[579,750,752],{"class":751},"sHwdD","\u002F** The create-task request body. *\u002F\n",[579,754,756,759,763,766,769,772,775],{"class":581,"line":755},5,[579,757,758],{"class":690},"export",[579,760,762],{"class":761},"spNyl"," class",[579,764,765],{"class":585}," CreateTaskBody",[579,767,768],{"class":761}," extends",[579,770,699],{"class":771},"s2Zo4",[579,773,774],{"class":698},"(",[579,776,777],{"class":694},"{\n",[579,779,781,785,788,790,793,796,799,801,804,806,810,813],{"class":581,"line":780},6,[579,782,784],{"class":783},"swJcz","  title",[579,786,787],{"class":694},":",[579,789,726],{"class":698},[579,791,792],{"class":694},".",[579,794,795],{"class":771},"string",[579,797,798],{"class":698},"()",[579,800,792],{"class":694},[579,802,803],{"class":771},"min",[579,805,774],{"class":698},[579,807,809],{"class":808},"sbssI","1",[579,811,812],{"class":698},")",[579,814,815],{"class":694},",\n",[579,817,819,822,824,826,828,830,832,834,836,838,840,842],{"class":581,"line":818},7,[579,820,821],{"class":783},"  assigneeId",[579,823,787],{"class":694},[579,825,726],{"class":698},[579,827,792],{"class":694},[579,829,795],{"class":771},[579,831,798],{"class":698},[579,833,792],{"class":694},[579,835,803],{"class":771},[579,837,774],{"class":698},[579,839,809],{"class":808},[579,841,812],{"class":698},[579,843,815],{"class":694},[579,845,847,850,853],{"class":581,"line":846},8,[579,848,849],{"class":694},"}",[579,851,852],{"class":698},") ",[579,854,855],{"class":694},"{}\n",[579,857,859],{"class":581,"line":858},9,[579,860,745],{"emptyLinePlaceholder":744},[579,862,864],{"class":581,"line":863},10,[579,865,866],{"class":751},"\u002F** The task representation the API returns. *\u002F\n",[579,868,870,872,874,877,879,881,883],{"class":581,"line":869},11,[579,871,758],{"class":690},[579,873,762],{"class":761},[579,875,876],{"class":585}," TaskResponse",[579,878,768],{"class":761},[579,880,699],{"class":771},[579,882,774],{"class":698},[579,884,777],{"class":694},[579,886,888,891,893,895,897,899,901],{"class":581,"line":887},12,[579,889,890],{"class":783},"  id",[579,892,787],{"class":694},[579,894,726],{"class":698},[579,896,792],{"class":694},[579,898,795],{"class":771},[579,900,798],{"class":698},[579,902,815],{"class":694},[579,904,906,908,910,912,914,916,918],{"class":581,"line":905},13,[579,907,784],{"class":783},[579,909,787],{"class":694},[579,911,726],{"class":698},[579,913,792],{"class":694},[579,915,795],{"class":771},[579,917,798],{"class":698},[579,919,815],{"class":694},[579,921,923,926,928,930,932,935,938,940,943,945,948,950,953,955,958],{"class":581,"line":922},14,[579,924,925],{"class":783},"  status",[579,927,787],{"class":694},[579,929,726],{"class":698},[579,931,792],{"class":694},[579,933,934],{"class":771},"enum",[579,936,937],{"class":698},"([",[579,939,713],{"class":694},[579,941,942],{"class":588},"Todo",[579,944,713],{"class":694},[579,946,947],{"class":694},",",[579,949,708],{"class":694},[579,951,952],{"class":588},"Done",[579,954,713],{"class":694},[579,956,957],{"class":698},"])",[579,959,815],{"class":694},[579,961,963,965,967,969,971,973,975],{"class":581,"line":962},15,[579,964,821],{"class":783},[579,966,787],{"class":694},[579,968,726],{"class":698},[579,970,792],{"class":694},[579,972,795],{"class":771},[579,974,798],{"class":698},[579,976,815],{"class":694},[579,978,980,983,985,987,989,991,993,995,998,1000,1002],{"class":581,"line":979},16,[579,981,982],{"class":783},"  completedAt",[579,984,787],{"class":694},[579,986,726],{"class":698},[579,988,792],{"class":694},[579,990,795],{"class":771},[579,992,798],{"class":698},[579,994,792],{"class":694},[579,996,997],{"class":771},"optional",[579,999,798],{"class":698},[579,1001,947],{"class":694},[579,1003,1004],{"class":751}," \u002F\u002F accepts undefined → optional, omitted from `required`\n",[579,1006,1008,1010,1012],{"class":581,"line":1007},17,[579,1009,849],{"class":694},[579,1011,852],{"class":698},[579,1013,855],{"class":694},[579,1015,1017],{"class":581,"line":1016},18,[579,1018,745],{"emptyLinePlaceholder":744},[579,1020,1022],{"class":581,"line":1021},19,[579,1023,1024],{"class":751},"\u002F** The path parameters of a `:id` route. *\u002F\n",[579,1026,1028,1030,1032,1035,1037,1039,1041],{"class":581,"line":1027},20,[579,1029,758],{"class":690},[579,1031,762],{"class":761},[579,1033,1034],{"class":585}," TaskIdParams",[579,1036,768],{"class":761},[579,1038,699],{"class":771},[579,1040,774],{"class":698},[579,1042,777],{"class":694},[579,1044,1046,1048,1050,1052,1054,1056,1058,1060,1062,1064,1066,1068],{"class":581,"line":1045},21,[579,1047,890],{"class":783},[579,1049,787],{"class":694},[579,1051,726],{"class":698},[579,1053,792],{"class":694},[579,1055,795],{"class":771},[579,1057,798],{"class":698},[579,1059,792],{"class":694},[579,1061,803],{"class":771},[579,1063,774],{"class":698},[579,1065,809],{"class":808},[579,1067,812],{"class":698},[579,1069,815],{"class":694},[579,1071,1073,1075,1077],{"class":581,"line":1072},22,[579,1074,849],{"class":694},[579,1076,852],{"class":698},[579,1078,855],{"class":694},[499,1080,1081,1082,1085,1086,1089,1090,1093],{},"A field is optional exactly when its validator accepts ",[508,1083,1084],{},"undefined"," synchronously (a zod field ending in\n",[508,1087,1088],{},".optional()","), so optionality is inferred from the field, never declared twice. That inference is what\ndrives the ",[508,1091,1092],{},"required"," array in the JSON Schema Heximon assembles from these DTOs — the same array OpenAPI\nreads.",[561,1095,1097],{"id":1096},"use-the-class-as-both-a-value-and-a-type","Use the class as both a value and a type",[499,1099,1100,1101,1103,1104,1107,1108,1111],{},"The returned class is a constructor ",[503,1102,505],{}," a Standard Schema value at the same time, so you can hold it as a\ntype, ",[508,1105,1106],{},"new"," it to validate a value, and pass it anywhere a ",[508,1109,1110],{},"StandardSchemaV1"," is expected:",[569,1113,1115],{"className":680,"code":1114,"language":683,"meta":575,"style":575},"import { Route } from \"@heximon\u002Fcontract\";\nimport { SchemaObject } from \"@heximon\u002Fschema\";\nimport { z } from \"zod\";\n\nclass CreateUser extends SchemaObject({\n  email: z.email(),\n  name: z.string().min(1),\n  age: z.number().optional(),\n}) {}\n\nconst create = Route.post(\"\u002F\").body(CreateUser);                \u002F\u002F accepted as a Standard Schema value\nconst user = new CreateUser({ email: \"a@b.com\", name: \"Ann\" }); \u002F\u002F user: { email, name, age? } — a plain value\n",[508,1116,1117,1139,1159,1179,1183,1199,1217,1244,1268,1276,1280,1322],{"__ignoreMap":575},[579,1118,1119,1121,1123,1126,1128,1130,1132,1135,1137],{"class":581,"line":582},[579,1120,691],{"class":690},[579,1122,695],{"class":694},[579,1124,1125],{"class":698}," Route",[579,1127,702],{"class":694},[579,1129,705],{"class":690},[579,1131,708],{"class":694},[579,1133,1134],{"class":588},"@heximon\u002Fcontract",[579,1136,713],{"class":694},[579,1138,716],{"class":694},[579,1140,1141,1143,1145,1147,1149,1151,1153,1155,1157],{"class":581,"line":719},[579,1142,691],{"class":690},[579,1144,695],{"class":694},[579,1146,699],{"class":698},[579,1148,702],{"class":694},[579,1150,705],{"class":690},[579,1152,708],{"class":694},[579,1154,650],{"class":588},[579,1156,713],{"class":694},[579,1158,716],{"class":694},[579,1160,1161,1163,1165,1167,1169,1171,1173,1175,1177],{"class":581,"line":741},[579,1162,691],{"class":690},[579,1164,695],{"class":694},[579,1166,726],{"class":698},[579,1168,702],{"class":694},[579,1170,705],{"class":690},[579,1172,708],{"class":694},[579,1174,552],{"class":588},[579,1176,713],{"class":694},[579,1178,716],{"class":694},[579,1180,1181],{"class":581,"line":748},[579,1182,745],{"emptyLinePlaceholder":744},[579,1184,1185,1188,1191,1193,1195,1197],{"class":581,"line":755},[579,1186,1187],{"class":761},"class",[579,1189,1190],{"class":585}," CreateUser",[579,1192,768],{"class":761},[579,1194,699],{"class":771},[579,1196,774],{"class":698},[579,1198,777],{"class":694},[579,1200,1201,1204,1206,1208,1210,1213,1215],{"class":581,"line":780},[579,1202,1203],{"class":783},"  email",[579,1205,787],{"class":694},[579,1207,726],{"class":698},[579,1209,792],{"class":694},[579,1211,1212],{"class":771},"email",[579,1214,798],{"class":698},[579,1216,815],{"class":694},[579,1218,1219,1222,1224,1226,1228,1230,1232,1234,1236,1238,1240,1242],{"class":581,"line":818},[579,1220,1221],{"class":783},"  name",[579,1223,787],{"class":694},[579,1225,726],{"class":698},[579,1227,792],{"class":694},[579,1229,795],{"class":771},[579,1231,798],{"class":698},[579,1233,792],{"class":694},[579,1235,803],{"class":771},[579,1237,774],{"class":698},[579,1239,809],{"class":808},[579,1241,812],{"class":698},[579,1243,815],{"class":694},[579,1245,1246,1249,1251,1253,1255,1258,1260,1262,1264,1266],{"class":581,"line":846},[579,1247,1248],{"class":783},"  age",[579,1250,787],{"class":694},[579,1252,726],{"class":698},[579,1254,792],{"class":694},[579,1256,1257],{"class":771},"number",[579,1259,798],{"class":698},[579,1261,792],{"class":694},[579,1263,997],{"class":771},[579,1265,798],{"class":698},[579,1267,815],{"class":694},[579,1269,1270,1272,1274],{"class":581,"line":858},[579,1271,849],{"class":694},[579,1273,852],{"class":698},[579,1275,855],{"class":694},[579,1277,1278],{"class":581,"line":863},[579,1279,745],{"emptyLinePlaceholder":744},[579,1281,1282,1285,1288,1291,1293,1295,1298,1300,1302,1305,1307,1309,1311,1313,1316,1319],{"class":581,"line":869},[579,1283,1284],{"class":761},"const",[579,1286,1287],{"class":698}," create ",[579,1289,1290],{"class":694},"=",[579,1292,1125],{"class":698},[579,1294,792],{"class":694},[579,1296,1297],{"class":771},"post",[579,1299,774],{"class":698},[579,1301,713],{"class":694},[579,1303,1304],{"class":588},"\u002F",[579,1306,713],{"class":694},[579,1308,812],{"class":698},[579,1310,792],{"class":694},[579,1312,527],{"class":771},[579,1314,1315],{"class":698},"(CreateUser)",[579,1317,1318],{"class":694},";",[579,1320,1321],{"class":751},"                \u002F\u002F accepted as a Standard Schema value\n",[579,1323,1324,1326,1329,1331,1334,1336,1338,1341,1344,1346,1348,1351,1353,1355,1358,1360,1362,1365,1367,1369,1371,1373],{"class":581,"line":887},[579,1325,1284],{"class":761},[579,1327,1328],{"class":698}," user ",[579,1330,1290],{"class":694},[579,1332,1333],{"class":694}," new",[579,1335,1190],{"class":771},[579,1337,774],{"class":698},[579,1339,1340],{"class":694},"{",[579,1342,1343],{"class":783}," email",[579,1345,787],{"class":694},[579,1347,708],{"class":694},[579,1349,1350],{"class":588},"a@b.com",[579,1352,713],{"class":694},[579,1354,947],{"class":694},[579,1356,1357],{"class":783}," name",[579,1359,787],{"class":694},[579,1361,708],{"class":694},[579,1363,1364],{"class":588},"Ann",[579,1366,713],{"class":694},[579,1368,702],{"class":694},[579,1370,812],{"class":698},[579,1372,1318],{"class":694},[579,1374,1375],{"class":751}," \u002F\u002F user: { email, name, age? } — a plain value\n",[499,1377,1378,1381,1382,1384,1385,1388],{},[508,1379,1380],{},"new Dto(input)"," validates the input and either throws a ",[508,1383,663],{}," carrying the per-field issues or\nassigns the validated keys onto the instance. There is no wrapper object to unwrap — the instance ",[503,1386,1387],{},"is"," the\nvalidated value.",[1390,1391,1393,1396,1397,1399,1400,1403,1404,1406,1407,1410,1411,1413,1414,1417,1418,1420],"callout",{"type":1392},"warning",[513,1394,1395],{},"Constructing a DTO validates synchronously."," ",[508,1398,1380],{}," runs each field validator and needs the\nresult on the spot, so a leaf that returns a ",[508,1401,1402],{},"Promise"," makes the constructor throw a ",[508,1405,663],{}," —\n",[508,1408,1409],{},"\"Schema validation must be synchronous when constructing a value.\""," Async-only validators still work through\n",[508,1412,539],{}," (the validation path awaits pending leaves); only the ",[508,1415,1416],{},"new Dto(...)"," shortcut requires\nsynchronous fields. Keep an async leaf out of any DTO you intend to ",[508,1419,1106],{}," directly, and validate it at the HTTP\nboundary instead.",[561,1422,1424],{"id":1423},"derive-new-dtos-without-repeating-fields","Derive new DTOs without repeating fields",[499,1426,1427,1428,1430],{},"Every ",[508,1429,654],{}," class carries typed derivation operators that rebuild the field record — Heximon never\nre-inspects the underlying leaves, it just transforms the record — and they chain. This is how you spell\n\"the create body, but every field optional\" without restating the fields:",[569,1432,1434],{"className":680,"code":1433,"language":683,"meta":575,"style":575},"class UpdateUser extends CreateUser.partial() {}                   \u002F\u002F every key optional\nclass EmailOnly extends CreateUser.pick([\"email\"]) {}             \u002F\u002F keep only `email`\nclass WithRole extends CreateUser.extend({ role: z.string() }) {} \u002F\u002F add a required field\n\n\u002F\u002F chainable:\nclass Patch extends CreateUser.partial().extend({ revision: z.number() }) {}\n",[508,1435,1436,1461,1493,1535,1539,1544],{"__ignoreMap":575},[579,1437,1438,1440,1443,1445,1447,1449,1452,1455,1458],{"class":581,"line":582},[579,1439,1187],{"class":761},[579,1441,1442],{"class":585}," UpdateUser",[579,1444,768],{"class":761},[579,1446,1190],{"class":698},[579,1448,792],{"class":694},[579,1450,1451],{"class":771},"partial",[579,1453,1454],{"class":698},"() ",[579,1456,1457],{"class":694},"{}",[579,1459,1460],{"class":751},"                   \u002F\u002F every key optional\n",[579,1462,1463,1465,1468,1470,1472,1474,1477,1479,1481,1483,1485,1488,1490],{"class":581,"line":719},[579,1464,1187],{"class":761},[579,1466,1467],{"class":585}," EmailOnly",[579,1469,768],{"class":761},[579,1471,1190],{"class":698},[579,1473,792],{"class":694},[579,1475,1476],{"class":771},"pick",[579,1478,937],{"class":698},[579,1480,713],{"class":694},[579,1482,1212],{"class":588},[579,1484,713],{"class":694},[579,1486,1487],{"class":698},"]) ",[579,1489,1457],{"class":694},[579,1491,1492],{"class":751},"             \u002F\u002F keep only `email`\n",[579,1494,1495,1497,1500,1502,1504,1506,1509,1511,1513,1516,1518,1520,1522,1524,1526,1528,1530,1532],{"class":581,"line":741},[579,1496,1187],{"class":761},[579,1498,1499],{"class":585}," WithRole",[579,1501,768],{"class":761},[579,1503,1190],{"class":698},[579,1505,792],{"class":694},[579,1507,1508],{"class":771},"extend",[579,1510,774],{"class":698},[579,1512,1340],{"class":694},[579,1514,1515],{"class":783}," role",[579,1517,787],{"class":694},[579,1519,726],{"class":698},[579,1521,792],{"class":694},[579,1523,795],{"class":771},[579,1525,1454],{"class":698},[579,1527,849],{"class":694},[579,1529,852],{"class":698},[579,1531,1457],{"class":694},[579,1533,1534],{"class":751}," \u002F\u002F add a required field\n",[579,1536,1537],{"class":581,"line":748},[579,1538,745],{"emptyLinePlaceholder":744},[579,1540,1541],{"class":581,"line":755},[579,1542,1543],{"class":751},"\u002F\u002F chainable:\n",[579,1545,1546,1548,1551,1553,1555,1557,1559,1561,1563,1565,1567,1569,1572,1574,1576,1578,1580,1582,1584,1586],{"class":581,"line":780},[579,1547,1187],{"class":761},[579,1549,1550],{"class":585}," Patch",[579,1552,768],{"class":761},[579,1554,1190],{"class":698},[579,1556,792],{"class":694},[579,1558,1451],{"class":771},[579,1560,798],{"class":698},[579,1562,792],{"class":694},[579,1564,1508],{"class":771},[579,1566,774],{"class":698},[579,1568,1340],{"class":694},[579,1570,1571],{"class":783}," revision",[579,1573,787],{"class":694},[579,1575,726],{"class":698},[579,1577,792],{"class":694},[579,1579,1257],{"class":771},[579,1581,1454],{"class":698},[579,1583,849],{"class":694},[579,1585,852],{"class":698},[579,1587,855],{"class":694},[499,1589,1590,1593],{},[508,1591,1592],{},"SchemaArray(element)"," is the array counterpart: it wraps an element schema into a validating class whose\ninstance type is an array of the element's output, re-pathing each element's issues under its index.",[569,1595,1597],{"className":680,"code":1596,"language":683,"meta":575,"style":575},"import { SchemaArray } from \"@heximon\u002Fschema\";\n\nclass TaskListResponse extends SchemaArray(TaskResponse) {} \u002F\u002F a validating class over TaskResponse[]\n",[508,1598,1599,1620,1624],{"__ignoreMap":575},[579,1600,1601,1603,1605,1608,1610,1612,1614,1616,1618],{"class":581,"line":582},[579,1602,691],{"class":690},[579,1604,695],{"class":694},[579,1606,1607],{"class":698}," SchemaArray",[579,1609,702],{"class":694},[579,1611,705],{"class":690},[579,1613,708],{"class":694},[579,1615,650],{"class":588},[579,1617,713],{"class":694},[579,1619,716],{"class":694},[579,1621,1622],{"class":581,"line":719},[579,1623,745],{"emptyLinePlaceholder":744},[579,1625,1626,1628,1631,1633,1635,1638,1640],{"class":581,"line":741},[579,1627,1187],{"class":761},[579,1629,1630],{"class":585}," TaskListResponse",[579,1632,768],{"class":761},[579,1634,1607],{"class":771},[579,1636,1637],{"class":698},"(TaskResponse) ",[579,1639,1457],{"class":694},[579,1641,1642],{"class":751}," \u002F\u002F a validating class over TaskResponse[]\n",[561,1644,1646],{"id":1645},"drop-a-dto-into-a-contract","Drop a DTO into a contract",[499,1648,1649,1650,1652,1653,1656,1657,528,1659,536,1661,1663,1664,1667],{},"Because each DTO ",[503,1651,1387],{}," a Standard Schema value, it slots directly into a ",[518,1654,1655],{"href":68},"contract","\nroute's ",[508,1658,527],{},[508,1660,531],{},[508,1662,535],{}," — no adapter, no ",[508,1665,1666],{},"typeof"," gymnastics:",[569,1669,1672],{"className":680,"code":1670,"filename":1671,"language":683,"meta":575,"style":575},"import { Contract, Route } from \"@heximon\u002Fcontract\";\nimport { SchemaArray } from \"@heximon\u002Fschema\";\nimport { CreateTaskBody, TaskIdParams, TaskResponse } from \".\u002Ftask.dto\";\n\nclass TaskListResponse extends SchemaArray(TaskResponse) {}\n\nexport class TaskApi extends Contract({\n  prefix: \"\u002Fapi\u002Ftasks\",\n  routes: {\n    list: Route.get(\"\u002F\").responses({ 200: TaskListResponse }),\n    create: Route.post(\"\u002F\").body(CreateTaskBody).responses({ 201: TaskResponse }),\n    complete: Route.post(\"\u002F:id\u002Fcomplete\").pathParams(TaskIdParams).responses({ 200: TaskResponse }),\n  },\n}) {}\n","src\u002Ftasks\u002Ftask.api.ts",[508,1673,1674,1699,1719,1748,1752,1766,1770,1787,1803,1813,1859,1911,1962,1967],{"__ignoreMap":575},[579,1675,1676,1678,1680,1683,1685,1687,1689,1691,1693,1695,1697],{"class":581,"line":582},[579,1677,691],{"class":690},[579,1679,695],{"class":694},[579,1681,1682],{"class":698}," Contract",[579,1684,947],{"class":694},[579,1686,1125],{"class":698},[579,1688,702],{"class":694},[579,1690,705],{"class":690},[579,1692,708],{"class":694},[579,1694,1134],{"class":588},[579,1696,713],{"class":694},[579,1698,716],{"class":694},[579,1700,1701,1703,1705,1707,1709,1711,1713,1715,1717],{"class":581,"line":719},[579,1702,691],{"class":690},[579,1704,695],{"class":694},[579,1706,1607],{"class":698},[579,1708,702],{"class":694},[579,1710,705],{"class":690},[579,1712,708],{"class":694},[579,1714,650],{"class":588},[579,1716,713],{"class":694},[579,1718,716],{"class":694},[579,1720,1721,1723,1725,1727,1729,1731,1733,1735,1737,1739,1741,1744,1746],{"class":581,"line":741},[579,1722,691],{"class":690},[579,1724,695],{"class":694},[579,1726,765],{"class":698},[579,1728,947],{"class":694},[579,1730,1034],{"class":698},[579,1732,947],{"class":694},[579,1734,876],{"class":698},[579,1736,702],{"class":694},[579,1738,705],{"class":690},[579,1740,708],{"class":694},[579,1742,1743],{"class":588},".\u002Ftask.dto",[579,1745,713],{"class":694},[579,1747,716],{"class":694},[579,1749,1750],{"class":581,"line":748},[579,1751,745],{"emptyLinePlaceholder":744},[579,1753,1754,1756,1758,1760,1762,1764],{"class":581,"line":755},[579,1755,1187],{"class":761},[579,1757,1630],{"class":585},[579,1759,768],{"class":761},[579,1761,1607],{"class":771},[579,1763,1637],{"class":698},[579,1765,855],{"class":694},[579,1767,1768],{"class":581,"line":780},[579,1769,745],{"emptyLinePlaceholder":744},[579,1771,1772,1774,1776,1779,1781,1783,1785],{"class":581,"line":818},[579,1773,758],{"class":690},[579,1775,762],{"class":761},[579,1777,1778],{"class":585}," TaskApi",[579,1780,768],{"class":761},[579,1782,1682],{"class":771},[579,1784,774],{"class":698},[579,1786,777],{"class":694},[579,1788,1789,1792,1794,1796,1799,1801],{"class":581,"line":846},[579,1790,1791],{"class":783},"  prefix",[579,1793,787],{"class":694},[579,1795,708],{"class":694},[579,1797,1798],{"class":588},"\u002Fapi\u002Ftasks",[579,1800,713],{"class":694},[579,1802,815],{"class":694},[579,1804,1805,1808,1810],{"class":581,"line":858},[579,1806,1807],{"class":783},"  routes",[579,1809,787],{"class":694},[579,1811,1812],{"class":694}," {\n",[579,1814,1815,1818,1820,1822,1824,1827,1829,1831,1833,1835,1837,1839,1841,1843,1845,1848,1850,1853,1855,1857],{"class":581,"line":863},[579,1816,1817],{"class":783},"    list",[579,1819,787],{"class":694},[579,1821,1125],{"class":698},[579,1823,792],{"class":694},[579,1825,1826],{"class":771},"get",[579,1828,774],{"class":698},[579,1830,713],{"class":694},[579,1832,1304],{"class":588},[579,1834,713],{"class":694},[579,1836,812],{"class":698},[579,1838,792],{"class":694},[579,1840,531],{"class":771},[579,1842,774],{"class":698},[579,1844,1340],{"class":694},[579,1846,1847],{"class":808}," 200",[579,1849,787],{"class":694},[579,1851,1852],{"class":698}," TaskListResponse ",[579,1854,849],{"class":694},[579,1856,812],{"class":698},[579,1858,815],{"class":694},[579,1860,1861,1864,1866,1868,1870,1872,1874,1876,1878,1880,1882,1884,1886,1889,1891,1893,1895,1897,1900,1902,1905,1907,1909],{"class":581,"line":869},[579,1862,1863],{"class":783},"    create",[579,1865,787],{"class":694},[579,1867,1125],{"class":698},[579,1869,792],{"class":694},[579,1871,1297],{"class":771},[579,1873,774],{"class":698},[579,1875,713],{"class":694},[579,1877,1304],{"class":588},[579,1879,713],{"class":694},[579,1881,812],{"class":698},[579,1883,792],{"class":694},[579,1885,527],{"class":771},[579,1887,1888],{"class":698},"(CreateTaskBody)",[579,1890,792],{"class":694},[579,1892,531],{"class":771},[579,1894,774],{"class":698},[579,1896,1340],{"class":694},[579,1898,1899],{"class":808}," 201",[579,1901,787],{"class":694},[579,1903,1904],{"class":698}," TaskResponse ",[579,1906,849],{"class":694},[579,1908,812],{"class":698},[579,1910,815],{"class":694},[579,1912,1913,1916,1918,1920,1922,1924,1926,1928,1931,1933,1935,1937,1939,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960],{"class":581,"line":887},[579,1914,1915],{"class":783},"    complete",[579,1917,787],{"class":694},[579,1919,1125],{"class":698},[579,1921,792],{"class":694},[579,1923,1297],{"class":771},[579,1925,774],{"class":698},[579,1927,713],{"class":694},[579,1929,1930],{"class":588},"\u002F:id\u002Fcomplete",[579,1932,713],{"class":694},[579,1934,812],{"class":698},[579,1936,792],{"class":694},[579,1938,535],{"class":771},[579,1940,1941],{"class":698},"(TaskIdParams)",[579,1943,792],{"class":694},[579,1945,531],{"class":771},[579,1947,774],{"class":698},[579,1949,1340],{"class":694},[579,1951,1847],{"class":808},[579,1953,787],{"class":694},[579,1955,1904],{"class":698},[579,1957,849],{"class":694},[579,1959,812],{"class":698},[579,1961,815],{"class":694},[579,1963,1964],{"class":581,"line":905},[579,1965,1966],{"class":694},"  },\n",[579,1968,1969,1971,1973],{"class":581,"line":922},[579,1970,849],{"class":694},[579,1972,852],{"class":698},[579,1974,855],{"class":694},[561,1976,1978],{"id":1977},"validate-at-the-boundary","Validate at the boundary",[499,1980,1981,1982,1984,1985,1988],{},"A contract-bound controller reads validated input through ",[508,1983,539],{}," and\n",[508,1986,1987],{},"getValidatedPathParams()",". Each checks the request against the route's DTO and hands back the typed output —\nyour handler only ever sees a value that already passed:",[569,1990,1993],{"className":680,"code":1991,"filename":1992,"language":683,"meta":575,"style":575},"import { type Action, type Controller } from \"@heximon\u002Fhttp\";\nimport { TaskApi } from \".\u002Ftask.api\";\n\nexport class TasksController implements Controller\u003CTaskApi> {\n  public async create(action: Action\u003CTaskApi, \"create\">) {\n    const body = await action.request.readValidatedBody(); \u002F\u002F validated against CreateTaskBody\n    \u002F\u002F body: { title: string; assigneeId: string }\n    return action.respond(201, \u002F* ... *\u002F);\n  }\n\n  public async list(action: Action\u003CTaskApi, \"list\">) {\n    return action.json(\u002F* ... *\u002F);\n  }\n\n  public async complete(action: Action\u003CTaskApi, \"complete\">) {\n    const { id } = await action.request.getValidatedPathParams(); \u002F\u002F validated against TaskIdParams\n    return action.respond(200, \u002F* ... *\u002F);\n  }\n}\n","src\u002Ftasks\u002Ftasks.controller.ts",[508,1994,1995,2027,2048,2052,2077,2116,2150,2155,2181,2186,2190,2224,2244,2248,2252,2286,2319,2342,2346],{"__ignoreMap":575},[579,1996,1997,1999,2001,2004,2007,2009,2011,2014,2016,2018,2020,2023,2025],{"class":581,"line":582},[579,1998,691],{"class":690},[579,2000,695],{"class":694},[579,2002,2003],{"class":690}," type",[579,2005,2006],{"class":698}," Action",[579,2008,947],{"class":694},[579,2010,2003],{"class":690},[579,2012,2013],{"class":698}," Controller",[579,2015,702],{"class":694},[579,2017,705],{"class":690},[579,2019,708],{"class":694},[579,2021,2022],{"class":588},"@heximon\u002Fhttp",[579,2024,713],{"class":694},[579,2026,716],{"class":694},[579,2028,2029,2031,2033,2035,2037,2039,2041,2044,2046],{"class":581,"line":719},[579,2030,691],{"class":690},[579,2032,695],{"class":694},[579,2034,1778],{"class":698},[579,2036,702],{"class":694},[579,2038,705],{"class":690},[579,2040,708],{"class":694},[579,2042,2043],{"class":588},".\u002Ftask.api",[579,2045,713],{"class":694},[579,2047,716],{"class":694},[579,2049,2050],{"class":581,"line":741},[579,2051,745],{"emptyLinePlaceholder":744},[579,2053,2054,2056,2058,2061,2064,2066,2069,2072,2075],{"class":581,"line":748},[579,2055,758],{"class":690},[579,2057,762],{"class":761},[579,2059,2060],{"class":585}," TasksController",[579,2062,2063],{"class":761}," implements",[579,2065,2013],{"class":585},[579,2067,2068],{"class":694},"\u003C",[579,2070,2071],{"class":585},"TaskApi",[579,2073,2074],{"class":694},">",[579,2076,1812],{"class":694},[579,2078,2079,2082,2085,2088,2090,2094,2096,2098,2100,2102,2104,2106,2109,2111,2114],{"class":581,"line":755},[579,2080,2081],{"class":761},"  public",[579,2083,2084],{"class":761}," async",[579,2086,2087],{"class":783}," create",[579,2089,774],{"class":694},[579,2091,2093],{"class":2092},"sHdIc","action",[579,2095,787],{"class":694},[579,2097,2006],{"class":585},[579,2099,2068],{"class":694},[579,2101,2071],{"class":585},[579,2103,947],{"class":694},[579,2105,708],{"class":694},[579,2107,2108],{"class":588},"create",[579,2110,713],{"class":694},[579,2112,2113],{"class":694},">)",[579,2115,1812],{"class":694},[579,2117,2118,2121,2124,2127,2130,2133,2135,2138,2140,2143,2145,2147],{"class":581,"line":780},[579,2119,2120],{"class":761},"    const",[579,2122,2123],{"class":698}," body",[579,2125,2126],{"class":694}," =",[579,2128,2129],{"class":690}," await",[579,2131,2132],{"class":698}," action",[579,2134,792],{"class":694},[579,2136,2137],{"class":698},"request",[579,2139,792],{"class":694},[579,2141,2142],{"class":771},"readValidatedBody",[579,2144,798],{"class":783},[579,2146,1318],{"class":694},[579,2148,2149],{"class":751}," \u002F\u002F validated against CreateTaskBody\n",[579,2151,2152],{"class":581,"line":818},[579,2153,2154],{"class":751},"    \u002F\u002F body: { title: string; assigneeId: string }\n",[579,2156,2157,2160,2162,2164,2167,2169,2172,2174,2177,2179],{"class":581,"line":846},[579,2158,2159],{"class":690},"    return",[579,2161,2132],{"class":698},[579,2163,792],{"class":694},[579,2165,2166],{"class":771},"respond",[579,2168,774],{"class":783},[579,2170,2171],{"class":808},"201",[579,2173,947],{"class":694},[579,2175,2176],{"class":751}," \u002F* ... *\u002F",[579,2178,812],{"class":783},[579,2180,716],{"class":694},[579,2182,2183],{"class":581,"line":858},[579,2184,2185],{"class":694},"  }\n",[579,2187,2188],{"class":581,"line":863},[579,2189,745],{"emptyLinePlaceholder":744},[579,2191,2192,2194,2196,2199,2201,2203,2205,2207,2209,2211,2213,2215,2218,2220,2222],{"class":581,"line":869},[579,2193,2081],{"class":761},[579,2195,2084],{"class":761},[579,2197,2198],{"class":783}," list",[579,2200,774],{"class":694},[579,2202,2093],{"class":2092},[579,2204,787],{"class":694},[579,2206,2006],{"class":585},[579,2208,2068],{"class":694},[579,2210,2071],{"class":585},[579,2212,947],{"class":694},[579,2214,708],{"class":694},[579,2216,2217],{"class":588},"list",[579,2219,713],{"class":694},[579,2221,2113],{"class":694},[579,2223,1812],{"class":694},[579,2225,2226,2228,2230,2232,2235,2237,2240,2242],{"class":581,"line":887},[579,2227,2159],{"class":690},[579,2229,2132],{"class":698},[579,2231,792],{"class":694},[579,2233,2234],{"class":771},"json",[579,2236,774],{"class":783},[579,2238,2239],{"class":751},"\u002F* ... *\u002F",[579,2241,812],{"class":783},[579,2243,716],{"class":694},[579,2245,2246],{"class":581,"line":905},[579,2247,2185],{"class":694},[579,2249,2250],{"class":581,"line":922},[579,2251,745],{"emptyLinePlaceholder":744},[579,2253,2254,2256,2258,2261,2263,2265,2267,2269,2271,2273,2275,2277,2280,2282,2284],{"class":581,"line":962},[579,2255,2081],{"class":761},[579,2257,2084],{"class":761},[579,2259,2260],{"class":783}," complete",[579,2262,774],{"class":694},[579,2264,2093],{"class":2092},[579,2266,787],{"class":694},[579,2268,2006],{"class":585},[579,2270,2068],{"class":694},[579,2272,2071],{"class":585},[579,2274,947],{"class":694},[579,2276,708],{"class":694},[579,2278,2279],{"class":588},"complete",[579,2281,713],{"class":694},[579,2283,2113],{"class":694},[579,2285,1812],{"class":694},[579,2287,2288,2290,2292,2295,2297,2299,2301,2303,2305,2307,2309,2312,2314,2316],{"class":581,"line":979},[579,2289,2120],{"class":761},[579,2291,695],{"class":694},[579,2293,2294],{"class":698}," id",[579,2296,702],{"class":694},[579,2298,2126],{"class":694},[579,2300,2129],{"class":690},[579,2302,2132],{"class":698},[579,2304,792],{"class":694},[579,2306,2137],{"class":698},[579,2308,792],{"class":694},[579,2310,2311],{"class":771},"getValidatedPathParams",[579,2313,798],{"class":783},[579,2315,1318],{"class":694},[579,2317,2318],{"class":751}," \u002F\u002F validated against TaskIdParams\n",[579,2320,2321,2323,2325,2327,2329,2331,2334,2336,2338,2340],{"class":581,"line":1007},[579,2322,2159],{"class":690},[579,2324,2132],{"class":698},[579,2326,792],{"class":694},[579,2328,2166],{"class":771},[579,2330,774],{"class":783},[579,2332,2333],{"class":808},"200",[579,2335,947],{"class":694},[579,2337,2176],{"class":751},[579,2339,812],{"class":783},[579,2341,716],{"class":694},[579,2343,2344],{"class":581,"line":1016},[579,2345,2185],{"class":694},[579,2347,2348],{"class":581,"line":1021},[579,2349,2350],{"class":694},"}\n",[499,2352,2353,2354,2357,2358,2361],{},"When validation fails, Heximon returns its ",[508,2355,2356],{},"ValidationError"," as a ",[508,2359,2360],{},"400 application\u002Fproblem+json"," response with\nthe per-field issues attached — the DTO never reaches your handler. That's the point of validating at the\nboundary: the inside of your app only deals in shapes it can trust.",[561,2363,2365],{"id":2364},"back-a-value-object-with-a-dto","Back a value object with a DTO",[499,2367,2368,2369,2371,2372,2375],{},"The same construct-time validation makes a ",[508,2370,654],{}," a natural input for a DDD\n",[518,2373,2374],{"href":229},"value object"," — the value object simply wraps the DTO and inherits its validation:",[569,2377,2380],{"className":680,"code":2378,"filename":2379,"language":683,"meta":575,"style":575},"import { SchemaObject } from \"@heximon\u002Fschema\";\nimport { z } from \"zod\";\n\nexport class Credentials extends SchemaObject({\n  email: z.email(),\n  password: z.string().min(8),\n}) {}\n\n\u002F\u002F also: class Money extends ValueObject(SchemaObject({ amount: z.number(), currency: z.string() })) {}\n","src\u002Fauth\u002Fcredentials.schema.ts",[508,2381,2382,2402,2422,2426,2443,2459,2487,2495,2499],{"__ignoreMap":575},[579,2383,2384,2386,2388,2390,2392,2394,2396,2398,2400],{"class":581,"line":582},[579,2385,691],{"class":690},[579,2387,695],{"class":694},[579,2389,699],{"class":698},[579,2391,702],{"class":694},[579,2393,705],{"class":690},[579,2395,708],{"class":694},[579,2397,650],{"class":588},[579,2399,713],{"class":694},[579,2401,716],{"class":694},[579,2403,2404,2406,2408,2410,2412,2414,2416,2418,2420],{"class":581,"line":719},[579,2405,691],{"class":690},[579,2407,695],{"class":694},[579,2409,726],{"class":698},[579,2411,702],{"class":694},[579,2413,705],{"class":690},[579,2415,708],{"class":694},[579,2417,552],{"class":588},[579,2419,713],{"class":694},[579,2421,716],{"class":694},[579,2423,2424],{"class":581,"line":741},[579,2425,745],{"emptyLinePlaceholder":744},[579,2427,2428,2430,2432,2435,2437,2439,2441],{"class":581,"line":748},[579,2429,758],{"class":690},[579,2431,762],{"class":761},[579,2433,2434],{"class":585}," Credentials",[579,2436,768],{"class":761},[579,2438,699],{"class":771},[579,2440,774],{"class":698},[579,2442,777],{"class":694},[579,2444,2445,2447,2449,2451,2453,2455,2457],{"class":581,"line":755},[579,2446,1203],{"class":783},[579,2448,787],{"class":694},[579,2450,726],{"class":698},[579,2452,792],{"class":694},[579,2454,1212],{"class":771},[579,2456,798],{"class":698},[579,2458,815],{"class":694},[579,2460,2461,2464,2466,2468,2470,2472,2474,2476,2478,2480,2483,2485],{"class":581,"line":780},[579,2462,2463],{"class":783},"  password",[579,2465,787],{"class":694},[579,2467,726],{"class":698},[579,2469,792],{"class":694},[579,2471,795],{"class":771},[579,2473,798],{"class":698},[579,2475,792],{"class":694},[579,2477,803],{"class":771},[579,2479,774],{"class":698},[579,2481,2482],{"class":808},"8",[579,2484,812],{"class":698},[579,2486,815],{"class":694},[579,2488,2489,2491,2493],{"class":581,"line":818},[579,2490,849],{"class":694},[579,2492,852],{"class":698},[579,2494,855],{"class":694},[579,2496,2497],{"class":581,"line":846},[579,2498,745],{"emptyLinePlaceholder":744},[579,2500,2501],{"class":581,"line":858},[579,2502,2503],{"class":751},"\u002F\u002F also: class Money extends ValueObject(SchemaObject({ amount: z.number(), currency: z.string() })) {}\n",[561,2505,2507],{"id":2506},"feed-openapi-for-free","Feed OpenAPI for free",[499,2509,2510,2511,2514,2515,2517,2518,1304,2521,2524,2525,2527,2528,2530],{},"The JSON Schema Heximon assembles from a DTO is built from each field's ",[508,2512,2513],{},"StandardJSONSchemaV1"," — the matching\nJSON-Schema converter the Standard Schema spec defines, a standard rather than a validator library — so the\nsame DTOs that validate your routes also describe them in ",[518,2516,199],{"href":200}," with no extra wiring. Zod v4\ncarries that converter natively, so a ",[508,2519,2520],{},"z.email()",[508,2522,2523],{},"z.string().min(1)","\u002F… field embeds at full fidelity out of\nthe box. A field whose validator exposes no such converter renders as a permissive ",[508,2526,1457],{}," by default, but the\nobject structure and the ",[508,2529,1092],{}," array are still emitted, so the document stays accurate where it can be\nprecise.",[2532,2533,2535,2536],"h3",{"id":2534},"full-valibot-leaf-types-with-heximonschemavalibot","Full valibot leaf types with ",[508,2537,2538],{},"@heximon\u002Fschema\u002Fvalibot",[499,2540,2541,2542,528,2545,2548,2549,2551,2552,2554],{},"Reach for this subpath only if you chose valibot over zod: plain valibot leaves (",[508,2543,2544],{},"v.string()",[508,2546,2547],{},"v.number()",",\n…) do not carry the Standard-Schema JSON Schema sister-spec, so without extra wiring they degrade to ",[508,2550,1457],{}," in\nthe generated OpenAPI document. Install the optional peer and use the ",[508,2553,2538],{}," subpath to\nenable full-fidelity output:",[566,2556,2557,2571,2584,2597],{},[569,2558,2560],{"className":571,"code":2559,"filename":573,"language":574,"meta":575,"style":575},"pnpm add @valibot\u002Fto-json-schema\n",[508,2561,2562],{"__ignoreMap":575},[579,2563,2564,2566,2568],{"class":581,"line":582},[579,2565,573],{"class":585},[579,2567,589],{"class":588},[579,2569,2570],{"class":588}," @valibot\u002Fto-json-schema\n",[569,2572,2574],{"className":571,"code":2573,"filename":599,"language":574,"meta":575,"style":575},"npm install @valibot\u002Fto-json-schema\n",[508,2575,2576],{"__ignoreMap":575},[579,2577,2578,2580,2582],{"class":581,"line":582},[579,2579,599],{"class":585},[579,2581,608],{"class":588},[579,2583,2570],{"class":588},[569,2585,2587],{"className":571,"code":2586,"filename":616,"language":574,"meta":575,"style":575},"yarn add @valibot\u002Fto-json-schema\n",[508,2588,2589],{"__ignoreMap":575},[579,2590,2591,2593,2595],{"class":581,"line":582},[579,2592,616],{"class":585},[579,2594,589],{"class":588},[579,2596,2570],{"class":588},[569,2598,2600],{"className":571,"code":2599,"filename":632,"language":574,"meta":575,"style":575},"bun add @valibot\u002Fto-json-schema\n",[508,2601,2602],{"__ignoreMap":575},[579,2603,2604,2606,2608],{"class":581,"line":582},[579,2605,632],{"class":585},[579,2607,589],{"class":588},[579,2609,2570],{"class":588},[499,2611,2612],{},"Then wire the converter when constructing the OpenAPI generator — it chains valibot-specific conversion\nbefore the standard sister-spec path:",[569,2614,2617],{"className":680,"code":2615,"filename":2616,"language":683,"meta":575,"style":575},"import { valibotJsonSchema, registerValibotLeafFallback } from \"@heximon\u002Fschema\u002Fvalibot\";\nimport { OpenApiGenerator, StandardSchemaConverter } from \"@heximon\u002Fopenapi\";\n\n\u002F\u002F Optional: register the process-wide leaf fallback for SchemaObject field leaves.\nregisterValibotLeafFallback();\n\nnew OpenApiGenerator({\n  contracts: [MyApi],\n  converter: (schema, direction) =>\n    valibotJsonSchema(schema, direction) ?? StandardSchemaConverter.convert(schema, direction),\n});\n","src\u002Fdocs\u002Fdocs.module.ts",[508,2618,2619,2645,2672,2676,2681,2690,2694,2704,2716,2739,2771],{"__ignoreMap":575},[579,2620,2621,2623,2625,2628,2630,2633,2635,2637,2639,2641,2643],{"class":581,"line":582},[579,2622,691],{"class":690},[579,2624,695],{"class":694},[579,2626,2627],{"class":698}," valibotJsonSchema",[579,2629,947],{"class":694},[579,2631,2632],{"class":698}," registerValibotLeafFallback",[579,2634,702],{"class":694},[579,2636,705],{"class":690},[579,2638,708],{"class":694},[579,2640,2538],{"class":588},[579,2642,713],{"class":694},[579,2644,716],{"class":694},[579,2646,2647,2649,2651,2654,2656,2659,2661,2663,2665,2668,2670],{"class":581,"line":719},[579,2648,691],{"class":690},[579,2650,695],{"class":694},[579,2652,2653],{"class":698}," OpenApiGenerator",[579,2655,947],{"class":694},[579,2657,2658],{"class":698}," StandardSchemaConverter",[579,2660,702],{"class":694},[579,2662,705],{"class":690},[579,2664,708],{"class":694},[579,2666,2667],{"class":588},"@heximon\u002Fopenapi",[579,2669,713],{"class":694},[579,2671,716],{"class":694},[579,2673,2674],{"class":581,"line":741},[579,2675,745],{"emptyLinePlaceholder":744},[579,2677,2678],{"class":581,"line":748},[579,2679,2680],{"class":751},"\u002F\u002F Optional: register the process-wide leaf fallback for SchemaObject field leaves.\n",[579,2682,2683,2686,2688],{"class":581,"line":755},[579,2684,2685],{"class":771},"registerValibotLeafFallback",[579,2687,798],{"class":698},[579,2689,716],{"class":694},[579,2691,2692],{"class":581,"line":780},[579,2693,745],{"emptyLinePlaceholder":744},[579,2695,2696,2698,2700,2702],{"class":581,"line":818},[579,2697,1106],{"class":694},[579,2699,2653],{"class":771},[579,2701,774],{"class":698},[579,2703,777],{"class":694},[579,2705,2706,2709,2711,2714],{"class":581,"line":846},[579,2707,2708],{"class":783},"  contracts",[579,2710,787],{"class":694},[579,2712,2713],{"class":698}," [MyApi]",[579,2715,815],{"class":694},[579,2717,2718,2721,2723,2726,2729,2731,2734,2736],{"class":581,"line":858},[579,2719,2720],{"class":771},"  converter",[579,2722,787],{"class":694},[579,2724,2725],{"class":694}," (",[579,2727,2728],{"class":2092},"schema",[579,2730,947],{"class":694},[579,2732,2733],{"class":2092}," direction",[579,2735,812],{"class":694},[579,2737,2738],{"class":761}," =>\n",[579,2740,2741,2744,2747,2749,2752,2755,2757,2759,2762,2764,2766,2769],{"class":581,"line":863},[579,2742,2743],{"class":771},"    valibotJsonSchema",[579,2745,2746],{"class":698},"(schema",[579,2748,947],{"class":694},[579,2750,2751],{"class":698}," direction) ",[579,2753,2754],{"class":694},"??",[579,2756,2658],{"class":698},[579,2758,792],{"class":694},[579,2760,2761],{"class":771},"convert",[579,2763,2746],{"class":698},[579,2765,947],{"class":694},[579,2767,2768],{"class":698}," direction)",[579,2770,815],{"class":694},[579,2772,2773,2775,2777],{"class":581,"line":869},[579,2774,849],{"class":694},[579,2776,812],{"class":698},[579,2778,716],{"class":694},[499,2780,2781,2784,2785,2788,2789,2792,2793,2796,2797,2800,2801,2803,2804,2806],{},[508,2782,2783],{},"valibotJsonSchema"," guards on ",[508,2786,2787],{},"~standard.vendor === \"valibot\""," before invoking ",[508,2790,2791],{},"@valibot\u002Fto-json-schema",",\nso it is safe to compose with ",[508,2794,2795],{},"StandardSchemaConverter.convert",". Pipe actions that cannot be represented\nin JSON Schema (e.g. custom transforms) are silently omitted (",[508,2798,2799],{},"errorMode: \"ignore\"",") — the converter\nreturns ",[508,2802,1084],{}," for any completely unrepresentable schema, falling back to ",[508,2805,1457],{}," rather than throwing.",[561,2808,2810],{"id":2809},"see-also","See also",[2812,2813,2814,2827,2839,2844,2856,2866],"ul",{},[2815,2816,2817,2819,2820,528,2822,536,2824,2826],"li",{},[518,2818,67],{"href":68}," — where DTOs become a route's ",[508,2821,527],{},[508,2823,531],{},[508,2825,535],{},", shared by server and client.",[2815,2828,2829,2832,2833,2835,2836,2838],{},[518,2830,2831],{"href":63},"Validation"," — how ",[508,2834,539],{}," turns a failed DTO into a ",[508,2837,2360],{}," response.",[2815,2840,2841,2843],{},[518,2842,214],{"href":215}," — carry nominal, type-safe identifiers through your DTO fields.",[2815,2845,2846,2848,2849,2851,2852,2855],{},[518,2847,228],{"href":229}," — wrap a ",[508,2850,654],{}," in a ",[508,2853,2854],{},"ValueObject"," for a validated, immutable domain value.",[2815,2857,2858,2865],{},[518,2859,2862],{"href":2860,"rel":2861},"https:\u002F\u002Fgithub.com\u002Fheximon\u002Fheximon\u002Ftree\u002Fmain\u002Fexamples\u002Fgap\u002Fopenapi-mcp",[522],[513,2863,2864],{},"OpenAPI + MCP"," — a contract whose schema DTOs drive both the served routes and the generated OpenAPI document.",[2815,2867,2868,2875,2876,2878],{},[518,2869,2872],{"href":2870,"rel":2871},"https:\u002F\u002Fgithub.com\u002Fheximon\u002Fheximon\u002Ftree\u002Fmain\u002Fexamples\u002Fflagship",[522],[513,2873,2874],{},"the flagship app"," — ",[508,2877,654],{}," DTOs across request bodies, responses, path params, and value-object inputs in a full application.",[2880,2881,2882],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":575,"searchDepth":719,"depth":719,"links":2884},[2885,2886,2887,2888,2889,2890,2891,2892,2896],{"id":563,"depth":719,"text":564},{"id":670,"depth":719,"text":671},{"id":1096,"depth":719,"text":1097},{"id":1423,"depth":719,"text":1424},{"id":1645,"depth":719,"text":1646},{"id":1977,"depth":719,"text":1978},{"id":2364,"depth":719,"text":2365},{"id":2506,"depth":719,"text":2507,"children":2893},[2894],{"id":2534,"depth":741,"text":2895},"Full valibot leaf types with @heximon\u002Fschema\u002Fvalibot",{"id":2809,"depth":719,"text":2810},"Author request and response shapes with SchemaObject and SchemaArray — one class that is both the validated TypeScript type and a Standard Schema value, with partial, pick, omit, and extend derivations.","md",null,{},{"icon":212},{"title":209,"description":2897},"U61-kLgRIE8NIP_AolbCa0NlJcnTYgYsN0pfrWdyOwo",[2905,2907],{"title":204,"path":205,"stem":206,"description":2906,"icon":207,"children":-1},"Derive a Model Context Protocol server from a Contract's route table at runtime with McpServerGenerator — per-route .mcp() opt-in, marked or all selection, in-process tool execution, and stateless Streamable HTTP.",{"title":214,"path":215,"stem":216,"description":2908,"icon":217,"children":-1},"Nominal entity identifiers with the zero-runtime Branded type and the DI-free Id helper — generate, from, uuid.v7, uuid.v4, $type, and end-to-end id safety.",1783300761903]