[{"data":1,"prerenderedAt":2137},["ShallowReactive",2],{"navigation_docs":3,"-docs-getting-started-troubleshooting":493,"-docs-getting-started-troubleshooting-surround":2132},[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":41,"body":495,"description":2125,"extension":2126,"links":2127,"meta":2128,"navigation":2129,"path":42,"seo":2130,"stem":43,"__hash__":2131},"docs\u002Fdocs\u002F01.getting-started\u002F07.troubleshooting.md",{"type":496,"value":497,"toc":2107},"minimark",[498,507,510,515,527,623,626,663,667,675,683,686,757,781,794,798,820,835,862,866,881,884,888,902,1051,1062,1066,1069,1074,1093,1099,1133,1151,1173,1176,1179,1283,1301,1305,1329,1347,1464,1467,1486,1490,1509,1515,1518,1560,1578,1582,1585,1599,1603,1617,1692,1695,1699,1714,1717,1799,1802,1806,1832,1842,1988,2007,2011,2032,2046,2050,2103],[499,500,501,502,506],"p",{},"Most first-run problems trace back to a handful of root causes. Because Heximon wires your app at ",[503,504,505],"strong",{},"build\ntime",", many of them surface as diagnostics in your dev console — a red message naming the class and the\nmissing piece — before your app ever runs. Read those first; they usually tell you exactly what's wrong.",[499,508,509],{},"If you're just getting your first app running, start with the next few sections — they cover the problems\nyou're most likely to hit before your first route even responds.",[511,512,514],"h2",{"id":513},"my-controllers-routes-dont-appear","My controller's routes don't appear",[499,516,517,518,521,522,526],{},"A controller becomes part of your app by being ",[503,519,520],{},"listed in a module",", not by living in the right folder.\nHeximon finds a controller because some module names it under ",[523,524,525],"code",{},"http: { controllers }"," — so a controller that\nisn't listed is invisible, and its routes never register.",[528,529,535],"pre",{"className":530,"code":531,"filename":532,"language":533,"meta":534,"style":534},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export class UsersModule extends Module({\n  providers: [UsersRepository],\n  http: { controllers: [UsersController] }, \u002F\u002F ← a controller is found here, not by file location\n}) {}\n","src\u002Fusers\u002Fusers.module.ts","ts","",[523,536,537,569,585,611],{"__ignoreMap":534},[538,539,542,546,550,554,557,561,565],"span",{"class":540,"line":541},"line",1,[538,543,545],{"class":544},"s7zQu","export",[538,547,549],{"class":548},"spNyl"," class",[538,551,553],{"class":552},"sBMFI"," UsersModule",[538,555,556],{"class":548}," extends",[538,558,560],{"class":559},"s2Zo4"," Module",[538,562,564],{"class":563},"sTEyZ","(",[538,566,568],{"class":567},"sMK4o","{\n",[538,570,572,576,579,582],{"class":540,"line":571},2,[538,573,575],{"class":574},"swJcz","  providers",[538,577,578],{"class":567},":",[538,580,581],{"class":563}," [UsersRepository]",[538,583,584],{"class":567},",\n",[538,586,588,591,593,596,599,601,604,607],{"class":540,"line":587},3,[538,589,590],{"class":574},"  http",[538,592,578],{"class":567},[538,594,595],{"class":567}," {",[538,597,598],{"class":574}," controllers",[538,600,578],{"class":567},[538,602,603],{"class":563}," [UsersController] ",[538,605,606],{"class":567},"},",[538,608,610],{"class":609},"sHwdD"," \u002F\u002F ← a controller is found here, not by file location\n",[538,612,614,617,620],{"class":540,"line":613},4,[538,615,616],{"class":567},"}",[538,618,619],{"class":563},") ",[538,621,622],{"class":567},"{}\n",[499,624,625],{},"Walk three checks in order:",[627,628,629,637,644],"ol",{},[630,631,632,633,636],"li",{},"Is the controller listed under ",[523,634,635],{},"http: { controllers: [...] }"," in some module?",[630,638,639,640,643],{},"Does that module reach your root module through ",[523,641,642],{},"imports","? Only modules connected to the root are\ncompiled — a stranded module is silently skipped.",[630,645,646,647,650,651,654,655,658,659,662],{},"Does the class actually declare ",[523,648,649],{},"Controller\u003C...>"," — ",[523,652,653],{},"implements Controller\u003C...>"," or\n",[523,656,657],{},"extends Controller\u003C...>","? A class listed under ",[523,660,661],{},"controllers"," that declares neither is reported as a\nwarning, and its routes are dropped.",[511,664,666],{"id":665},"no-provider-for-x","\"no provider for 'X'\"",[499,668,669,670,674],{},"A constructor parameter ",[671,672,673],"em",{},"is"," a dependency declaration — Heximon reads the parameter's type and looks for a\nclass it can construct in the module's visible scope. This error means it found a parameter whose type\nisn't reachable, so there's nothing to inject. The build points straight at the offending parameter and\ntells you the fix:",[528,676,681],{"className":677,"code":679,"language":680,"meta":534},[678],"language-text","error [resolve\u002Fno-provider]  UsersService (in UsersModule): no provider for 'UsersRepository'\n  ╭─[src\u002Fusers\u002Fusers.service.ts:3:39]\n  │\n3 │   constructor(private readonly users: UsersRepository) {}\n  │                                       ───────────────\n  │\n  ╰─ help: add a provider for it (or a class that extends\u002Fimplements it).\n","text",[523,682,679],{"__ignoreMap":534},[499,684,685],{},"Check, in order:",[627,687,688,702,726,750],{},[630,689,690,691,694,695,698,699,701],{},"Is ",[523,692,693],{},"X"," in the ",[523,696,697],{},"providers"," of the same module — or of a module this one ",[523,700,642],{},"?",[630,703,704,705,707,708,710,711,714,715,718,719,721,722,725],{},"If ",[523,706,693],{}," lives in another module, does that module ",[503,709,545],{}," it (",[523,712,713],{},"exports: [X]","), and does your module\n",[503,716,717],{},"import"," that module? Visibility flows along ",[523,720,642],{},"\u002F",[523,723,724],{},"exports",", never by reach.",[630,727,690,728,730,731,734,735,738,739,742,743,734,746,749],{},[523,729,693],{}," an abstract or framework-supplied token with no binding? Bind it with\n",[523,732,733],{},"{ provide: X, useClass: ... }",", ",[523,736,737],{},"useFactory",", or ",[523,740,741],{},"useValue",", or supply it at boot for tokens the host\nprovides (",[523,744,745],{},"CoreConfig",[523,747,748],{},"InternalClient",").",[630,751,752,753,756],{},"Is the parameter a real class, not an erased type? Class identity is the only token Heximon has — a\nparameter typed as an interface or a ",[523,754,755],{},"type"," alias has no runtime value to wire.",[499,758,704,759,761,762,765,766,769,770,772,773,776,777,780],{},[523,760,693],{}," is a token you ",[523,763,764],{},"app.get"," from a ",[503,767,768],{},"published package"," (a precompiled, manifest-bearing module you\nlist in ",[523,771,642],{},"), the cause may be a ",[503,774,775],{},"stale manifest"," — its ",[523,778,779],{},"heximon.manifest.json"," exporting a token\nthe shipped package no longer ships.",[499,782,783,784,787,788,793],{},"The app build warns about that at compile time (",[523,785,786],{},"boundary.manifest-drift","); see\n",[789,790,792],"a",{"href":791},"\u002Fdocs\u002Funder-the-hood\u002Flibrary-mode#the-build-flags-a-stale-manifest","the drift check",". If you see that\nwarning, rebuild\u002Frepublish the package or align your installed version with its manifest.",[511,795,797],{"id":796},"a-request-that-should-pass-fails-with-a-400","A request that should pass fails with a 400",[499,799,800,801,804,805,734,808,811,812,815,816,819],{},"Validation runs at the ",[503,802,803],{},"boundary",", before your handler. When you call a validated accessor\n(",[523,806,807],{},"readValidatedBody()",[523,809,810],{},"getValidatedQuery()",", …) and the payload doesn't match the route's schema, it\nthrows a ",[523,813,814],{},"RequestValidationError",", and the built-in filter maps it to a ",[523,817,818],{},"400 application\u002Fproblem+json",".\nThat's the point: your handler only ever sees data that already matched its schema.",[499,821,822,823,826,827,830,831,834],{},"The ",[523,824,825],{},"400"," body's ",[523,828,829],{},"issues"," array names exactly which fields failed — read it first. If the request ",[671,832,833],{},"looks","\nright but is still rejected, check the schema side:",[627,836,837,844],{},[630,838,839,840,843],{},"Does the body actually satisfy the schema referenced in the route's slot\n(",[523,841,842],{},"Post\u003C\"\u002F\", { body: CreateUser }>",")?",[630,845,690,846,849,850,853,854,857,858,861],{},[523,847,848],{},"CreateUser"," imported as a ",[503,851,852],{},"value",", not ",[523,855,856],{},"import type","? Heximon wires the validator from the class\nitself (",[523,859,860],{},"typeof createUser"," works the same way for a plain runtime constant), so a type-only import\ngives it nothing to validate against.",[511,863,865],{"id":864},"my-endpoint-returns-heximon-build-failed-after-an-edit","My endpoint returns \"Heximon build failed\" after an edit",[499,867,868,869,872,873,876,877,880],{},"You changed a source file and now every request answers with a ",[523,870,871],{},"500"," whose body is a build error — often a\ncodeframe naming a class and a missing piece. That's the dev server telling you the truth: your latest edit\n",[503,874,875],{},"didn't compile",", so rather than keep serving the old build as if nothing changed (a confident ",[523,878,879],{},"200"," from code\nthat no longer matches your source), it surfaces the failure on the request. The same codeframe is in your dev\nterminal.",[499,882,883],{},"Read the error, fix the source, and save — the next clean compile swaps in the new wiring automatically and the\nendpoint recovers. Your app process never went down; only requests during the broken window were answered with\nthe error.",[511,885,887],{"id":886},"a-middleware-hangs-or-short-circuits-unexpectedly","A middleware hangs or short-circuits unexpectedly",[499,889,890,891,894,895,898,899,901],{},"A middleware is one link in a chain, and it owes the chain exactly one of two things: ",[523,892,893],{},"await next()"," to\ncontinue (returning the downstream ",[523,896,897],{},"Response","), or its own ",[523,900,897],{}," to short-circuit. Do neither and\nthe request never resolves — that's the hang.",[528,903,905],{"className":530,"code":904,"language":533,"meta":534,"style":534},"public async handle(action: HttpAction, next: Next): Promise\u003CResponse> {\n  if (!action.request.headers.get(\"authorization\")) {\n    return HttpResponse.json({ error: \"unauthorized\" }, { status: 401 }); \u002F\u002F short-circuit\n  }\n  return next(); \u002F\u002F continue down the chain\n}\n",[523,906,907,938,965,1022,1027,1045],{"__ignoreMap":534},[538,908,909,912,915,918,921,924,927,930,932,935],{"class":540,"line":541},[538,910,911],{"class":563},"public async ",[538,913,914],{"class":559},"handle",[538,916,917],{"class":563},"(action: HttpAction",[538,919,920],{"class":567},",",[538,922,923],{"class":563}," next: Next): ",[538,925,926],{"class":552},"Promise",[538,928,929],{"class":567},"\u003C",[538,931,897],{"class":563},[538,933,934],{"class":567},">",[538,936,937],{"class":567}," {\n",[538,939,940,943,946,949,952,956,958,961,963],{"class":540,"line":571},[538,941,942],{"class":574},"  if",[538,944,945],{"class":567}," (",[538,947,948],{"class":563},"!action.request.headers.get(",[538,950,951],{"class":567},"\"",[538,953,955],{"class":954},"sfazB","authorization",[538,957,951],{"class":567},[538,959,960],{"class":567},")",[538,962,619],{"class":563},[538,964,568],{"class":567},[538,966,967,970,973,976,979,981,984,987,989,992,995,997,1000,1002,1005,1007,1011,1014,1016,1019],{"class":540,"line":587},[538,968,969],{"class":544},"    return",[538,971,972],{"class":563}," HttpResponse",[538,974,975],{"class":567},".",[538,977,978],{"class":559},"json",[538,980,564],{"class":574},[538,982,983],{"class":567},"{",[538,985,986],{"class":574}," error",[538,988,578],{"class":567},[538,990,991],{"class":567}," \"",[538,993,994],{"class":954},"unauthorized",[538,996,951],{"class":567},[538,998,999],{"class":567}," },",[538,1001,595],{"class":567},[538,1003,1004],{"class":574}," status",[538,1006,578],{"class":567},[538,1008,1010],{"class":1009},"sbssI"," 401",[538,1012,1013],{"class":567}," }",[538,1015,960],{"class":574},[538,1017,1018],{"class":567},";",[538,1020,1021],{"class":609}," \u002F\u002F short-circuit\n",[538,1023,1024],{"class":540,"line":613},[538,1025,1026],{"class":567},"  }\n",[538,1028,1030,1033,1036,1039,1042],{"class":540,"line":1029},5,[538,1031,1032],{"class":563},"  return ",[538,1034,1035],{"class":574},"next",[538,1037,1038],{"class":567},"()",[538,1040,1041],{"class":563},"; ",[538,1043,1044],{"class":609},"\u002F\u002F continue down the chain\n",[538,1046,1048],{"class":540,"line":1047},6,[538,1049,1050],{"class":567},"}\n",[499,1052,1053,1054,1057,1058,1061],{},"Middleware are ",[503,1055,1056],{},"singletons",", constructed once and reused for every request — so never stash per-request\nstate on an instance field. Two requests in flight would clobber each other's value. Read and write\nrequest-scoped state through the ambient ",[523,1059,1060],{},"Context"," instead.",[511,1063,1065],{"id":1064},"deeper-diagnostics","Deeper diagnostics",[499,1067,1068],{},"The rest cover cases you'll hit as your app grows into contracts, scopes, and published packages — less\ncommon on a first run, but worth knowing where to look when they show up.",[1070,1071,1073],"h3",{"id":1072},"the-contract-does-not-resolve-to-an-importable-value","\"the contract does not resolve to an importable value\"",[499,1075,1076,1077,1080,1081,1084,1085,1088,1089,1092],{},"A contract controller binds its contract as the ",[523,1078,1079],{},"Controller\u003CSomeApi>"," type argument, and the generated\nregistration imports that ",[523,1082,1083],{},"SomeApi"," value ",[503,1086,1087],{},"by reference",". If the contract isn't imported in the controller\nfile — a removed, renamed, or commented-out import — the build fails with ",[523,1090,1091],{},"discovery\u002Funresolved-reference",", a\ncodeframe underlining the contract name:",[528,1094,1097],{"className":1095,"code":1096,"language":680,"meta":534},[678],"error [discovery\u002Funresolved-reference]  TasksController: the contract 'TaskApi' does not resolve to an\nimportable value — 'TaskApi' is not imported into this file. Its wiring would bind to `undefined` at boot.\n  ╭─[src\u002Ftasks\u002Ftasks.controller.ts:29:33]\n  ╰─ help: import the contract into this file, e.g. `import { TaskApi } from \".\u002F…\";` — a removed or renamed\n     import leaves nothing to wire.\n",[523,1098,1096],{"__ignoreMap":534},[499,1100,1101,1102,1104,1105,1108,1109,1112,1113,1116,1117,1120,1121,1124,1125,1128,1129,1132],{},"The same ",[523,1103,1091],{}," error covers ",[503,1106,1107],{},"every"," name a build reads by value, not only a\nconcept's own type argument — an ",[523,1110,1111],{},"EventHandler\u003COrderCreated>",", a ",[523,1114,1115],{},"CommandHandler\u003CCreateOrder>",", a contract, a\nclass a concept ",[671,1118,1119],{},"references"," (a controller's ",[523,1122,1123],{},"middlewares"," \u002F ",[523,1126,1127],{},"errorFilters",", a streaming handler's\n",[523,1130,1131],{},"{ durable: Room }",", an inline route schema).",[499,1134,1135,1136,734,1138,1140,1141,1144,1145,945,1148,749],{},"It also covers an entry in module config (",[523,1137,642],{},[523,1139,697],{},", or a ",[523,1142,1143],{},"http: { controllers: […] }","\nnamespace list), and a ",[503,1146,1147],{},"constructor's injected token",[523,1149,1150],{},"constructor(private users: UsersRepository)",[499,1152,1153,1154,1157,1158,1161,1162,1165,1166,1169,1170,975],{},"For a referenced class that has its own check, the unresolved error wins: an unimported\n",[523,1155,1156],{},"middlewares: [ApiAuth]"," reads as ",[523,1159,1160],{},"the middleware 'ApiAuth' does not resolve … is not imported",", not the\nmisleading \"must extend or implement ",[523,1163,1164],{},"Middleware","\"; an unimported constructor token reads as\n",[523,1167,1168],{},"the dependency 'UsersRepository' does not resolve … is not imported",", not the misleading ",[523,1171,1172],{},"no provider for 'UsersRepository'",[499,1174,1175],{},"So a missing import is always a build error naming what didn't resolve and the fix, never a silent runtime\nmiss.",[499,1177,1178],{},"The fix is always to import (or, for a same-file contract, export) the contract:",[528,1180,1183],{"className":530,"code":1181,"filename":1182,"language":533,"meta":534,"style":534},"import { TaskApi } from \".\u002Ftask.api\"; \u002F\u002F ← required: the contract is imported by reference at runtime\n\nexport class TasksController implements Controller\u003C{\n  contract: TaskApi;\n  middlewares: [ApiAuthMiddleware];\n}> {\n  \u002F\u002F … one handler per TaskApi route key\n}\n","src\u002Ftasks\u002Ftasks.controller.ts",[523,1184,1185,1211,1217,1235,1247,1265,1272,1278],{"__ignoreMap":534},[538,1186,1187,1189,1191,1194,1196,1199,1201,1204,1206,1208],{"class":540,"line":541},[538,1188,717],{"class":544},[538,1190,595],{"class":567},[538,1192,1193],{"class":563}," TaskApi",[538,1195,1013],{"class":567},[538,1197,1198],{"class":544}," from",[538,1200,991],{"class":567},[538,1202,1203],{"class":954},".\u002Ftask.api",[538,1205,951],{"class":567},[538,1207,1018],{"class":567},[538,1209,1210],{"class":609}," \u002F\u002F ← required: the contract is imported by reference at runtime\n",[538,1212,1213],{"class":540,"line":571},[538,1214,1216],{"emptyLinePlaceholder":1215},true,"\n",[538,1218,1219,1221,1223,1226,1229,1232],{"class":540,"line":587},[538,1220,545],{"class":544},[538,1222,549],{"class":548},[538,1224,1225],{"class":552}," TasksController",[538,1227,1228],{"class":548}," implements",[538,1230,1231],{"class":559}," Controller",[538,1233,1234],{"class":567},"\u003C{\n",[538,1236,1237,1240,1242,1244],{"class":540,"line":613},[538,1238,1239],{"class":574},"  contract",[538,1241,578],{"class":567},[538,1243,1193],{"class":552},[538,1245,1246],{"class":567},";\n",[538,1248,1249,1252,1254,1257,1260,1263],{"class":540,"line":1029},[538,1250,1251],{"class":574},"  middlewares",[538,1253,578],{"class":567},[538,1255,1256],{"class":563}," [",[538,1258,1259],{"class":552},"ApiAuthMiddleware",[538,1261,1262],{"class":563},"]",[538,1264,1246],{"class":567},[538,1266,1267,1270],{"class":540,"line":1047},[538,1268,1269],{"class":567},"}>",[538,1271,937],{"class":567},[538,1273,1275],{"class":540,"line":1274},7,[538,1276,1277],{"class":609},"  \u002F\u002F … one handler per TaskApi route key\n",[538,1279,1281],{"class":540,"line":1280},8,[538,1282,1050],{"class":567},[499,1284,1285,1288,1289,1292,1293,1296,1297,1300],{},[523,1286,1287],{},"pnpm check"," flags the same mistake as a ",[523,1290,1291],{},"Cannot find name 'TaskApi'"," type error (the concept clause\nreferences the type). Should a contract slip through compilation anyway — e.g. its import resolves to a module\nthat no longer exports it — the boot fails with the runtime guard's equivalent message\n(",[523,1294,1295],{},"A contract-mode controller has no usable contract at boot …",") naming the same fix, so the mistake is never a\nbare ",[523,1298,1299],{},"undefined"," dereference.",[1070,1302,1304],{"id":1303},"type-argument-the-compiler-cannot-read-statically","\"type argument … the compiler cannot read statically\"",[499,1306,1307,1308,1311,1312,721,1315,1318,1319,1322,1323,1326,1327,749],{},"The compiler reads each concept clause's type argument ",[503,1309,1310],{},"statically"," — it never type-checks, so it follows\nonly what it can see literally at the ",[523,1313,1314],{},"implements",[523,1316,1317],{},"extends"," clause: an inline string (",[523,1320,1321],{},"Controller\u003C\"\u002Fusers\">","),\nan inline object literal (",[523,1324,1325],{},"Controller\u003C{ prefix, middlewares }>","), or a class reference (",[523,1328,1111],{},[499,1330,1331,1332,1335,1336,1339,1340,1342,1343,1346],{},"A ",[503,1333,1334],{},"named type"," the argument resolves ",[671,1337,1338],{},"through"," — a ",[523,1341,755],{}," alias, a union, a conditional, a ",[523,1344,1345],{},"typeof",", a generic\nparameter — is opaque to it.",[528,1348,1350],{"className":530,"code":1349,"language":533,"meta":534,"style":534},"type SecuredConfig = { prefix: \"\u002Fsecured\"; middlewares: [AuthMiddleware] };\nexport class SecuredController implements Controller\u003CSecuredConfig> {} \u002F\u002F ✗ config can't be read\nexport class SecuredController implements Controller\u003C{ prefix: \"\u002Fsecured\"; middlewares: [AuthMiddleware] }> {} \u002F\u002F ✓\n",[523,1351,1352,1394,1420],{"__ignoreMap":534},[538,1353,1354,1356,1359,1362,1364,1367,1369,1371,1374,1376,1378,1381,1383,1385,1388,1391],{"class":540,"line":541},[538,1355,755],{"class":548},[538,1357,1358],{"class":552}," SecuredConfig",[538,1360,1361],{"class":567}," =",[538,1363,595],{"class":567},[538,1365,1366],{"class":574}," prefix",[538,1368,578],{"class":567},[538,1370,991],{"class":567},[538,1372,1373],{"class":954},"\u002Fsecured",[538,1375,951],{"class":567},[538,1377,1018],{"class":567},[538,1379,1380],{"class":574}," middlewares",[538,1382,578],{"class":567},[538,1384,1256],{"class":563},[538,1386,1387],{"class":552},"AuthMiddleware",[538,1389,1390],{"class":563},"] ",[538,1392,1393],{"class":567},"};\n",[538,1395,1396,1398,1400,1403,1405,1407,1409,1412,1414,1417],{"class":540,"line":571},[538,1397,545],{"class":544},[538,1399,549],{"class":548},[538,1401,1402],{"class":552}," SecuredController",[538,1404,1228],{"class":548},[538,1406,1231],{"class":552},[538,1408,929],{"class":567},[538,1410,1411],{"class":552},"SecuredConfig",[538,1413,934],{"class":567},[538,1415,1416],{"class":567}," {}",[538,1418,1419],{"class":609}," \u002F\u002F ✗ config can't be read\n",[538,1421,1422,1424,1426,1428,1430,1432,1435,1437,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461],{"class":540,"line":587},[538,1423,545],{"class":544},[538,1425,549],{"class":548},[538,1427,1402],{"class":552},[538,1429,1228],{"class":548},[538,1431,1231],{"class":552},[538,1433,1434],{"class":567},"\u003C{",[538,1436,1366],{"class":574},[538,1438,578],{"class":567},[538,1440,991],{"class":567},[538,1442,1373],{"class":954},[538,1444,951],{"class":567},[538,1446,1018],{"class":567},[538,1448,1380],{"class":574},[538,1450,578],{"class":567},[538,1452,1256],{"class":563},[538,1454,1387],{"class":552},[538,1456,1390],{"class":563},[538,1458,1269],{"class":567},[538,1460,1416],{"class":567},[538,1462,1463],{"class":609}," \u002F\u002F ✓\n",[499,1465,1466],{},"Earlier this failed silently — the controller wired with no prefix or middlewares, the handler bound to no\nevent, the Durable Object ran with default storage. It is now a build error that underlines the offending\nargument and names the consequence.",[499,1468,1469,1470,1473,1474,734,1477,734,1480,584,1483,749],{},"The fix is always the same: ",[503,1471,1472],{},"inline"," the binding at the concept clause\n(",[523,1475,1476],{},"http.controller-config-unreadable",[523,1478,1479],{},"events.event-type-unreadable",[523,1481,1482],{},"cqrs.message-type-unreadable",[523,1484,1485],{},"durable.config-unreadable",[1070,1487,1489],{"id":1488},"a-shipped-concept-from-a-package-wont-wire","A shipped concept from a package won't wire",[499,1491,1492,1493,1495,1496,1112,1499,1501,1502,1505,1506,578],{},"When you list a concept class that a ",[503,1494,768],{}," ships — a ",[523,1497,1498],{},"HealthIndicator",[523,1500,1164],{},", a\nDurable Object — directly under its namespace (rather than a class from your own source), Heximon recovers\nthat class's base and constructor dependencies from the package's published ",[523,1503,1504],{},".d.ts",". If those declarations\ncan't be read, the build fails with ",[523,1507,1508],{},"resolve\u002Fexternal-concept-unresolvable",[528,1510,1513],{"className":1511,"code":1512,"language":680,"meta":534},[678],"error [resolve\u002Fexternal-concept-unresolvable]: DatabaseHealthIndicator is listed under a concept\nnamespace but its type declarations in \"@acme\u002Fhealth\" could not be read: \".\u002Findicator.d.ts\" could not be\nparsed (Unexpected token) — the published package \"@acme\u002Fhealth\" ships a corrupt .d.ts; reinstall or\nrebuild it. List a local subclass that delegates to it, or ensure the package ships types.\n",[523,1514,1512],{"__ignoreMap":534},[499,1516,1517],{},"There are two distinct causes, and the message tells you which one you have:",[627,1519,1520,1533],{},[630,1521,1522,1525,1526,721,1529,1532],{},[503,1523,1524],{},"The package ships no types"," — the message reads \"ships no usable type declarations\". The package has\nno ",[523,1527,1528],{},"types",[523,1530,1531],{},"typings"," entry, so there is nothing to recover. Use a package that ships types, or wrap the\nclass in a local subclass that delegates to a DI-injected service.",[630,1534,1535,1544,1545,1548,1549,1551,1552,1555,1556,1559],{},[503,1536,1537,1538,1541,1542],{},"The package ships a ",[671,1539,1540],{},"corrupt"," ",[523,1543,1504],{}," — the message names the exact file and the parse error\n(",[523,1546,1547],{},"\".\u002Findicator.d.ts\" could not be parsed (Unexpected token)","). A published ",[523,1550,1504],{}," that the compiler\ncan't parse almost always means a broken or half-written install — ",[503,1553,1554],{},"reinstall or rebuild the package","\n(",[523,1557,1558],{},"pnpm install --force",", or rebuild it when it's a local workspace dependency).",[499,1561,1562,1563,1566,1567,1570,1571,1573,1574,1577],{},"If you only ",[503,1564,1565],{},"subclass"," the shipped class in your own source (you list your own\n",[523,1568,1569],{},"class AppProbe extends DatabaseHealthIndicator","), the same corrupt-",[523,1572,1504],{}," cause surfaces as a ",[503,1575,1576],{},"warning","\nnaming the file rather than an error — your subclass just isn't recognized as that concept until the\npackage's types are readable again.",[1070,1579,1581],{"id":1580},"my-response-shape-is-wrong-but-nothing-errors","My response shape is wrong but nothing errors",[499,1583,1584],{},"Heximon never throws on a response-body mismatch at runtime — sending the wrong shape compiles and runs, by\ndesign, so a logging slip can't take an endpoint down in production.",[499,1586,1587,1588,1591,1592,1594,1595,1598],{},"In contract or schema-typed routes it instead lights up where it's cheap to fix: the handler's return type\nis checked against the route's ",[523,1589,1590],{},"responses",", so run ",[523,1593,1287],{}," and the type error points at the mismatched\nroute. (With the ",[523,1596,1597],{},"HEXIMON_DEBUG"," environment variable set, the dev server also logs a debug line as the\nroute is hit.)",[1070,1600,1602],{"id":1601},"route-scopes-arent-enforced","Route scopes aren't enforced",[499,1604,1605,1606,1609,1610,1541,1613,1616],{},"A guard reads the resolved scope union off ",[523,1607,1608],{},"action.scopes",". A route that declares ",[503,1611,1612],{},"no",[523,1614,1615],{},"scopes"," has an\nempty union, which passes any guard — so an unguarded route is treated as public, on purpose: it lets\npublic and protected routes coexist under one controller. If a route you meant to protect is wide open,\nit's missing its declaration.",[528,1618,1620],{"className":530,"code":1619,"language":533,"meta":534,"style":534},"create: Route.post(\"\u002F\").scopes(\"users:write\").body(createUser).responses({ 201: createdUser }),\n",[523,1621,1622],{"__ignoreMap":534},[538,1623,1624,1627,1629,1632,1634,1637,1639,1641,1643,1645,1647,1649,1651,1653,1655,1658,1660,1662,1664,1667,1670,1672,1674,1676,1678,1681,1683,1686,1688,1690],{"class":540,"line":541},[538,1625,1626],{"class":552},"create",[538,1628,578],{"class":567},[538,1630,1631],{"class":563}," Route",[538,1633,975],{"class":567},[538,1635,1636],{"class":559},"post",[538,1638,564],{"class":563},[538,1640,951],{"class":567},[538,1642,721],{"class":954},[538,1644,951],{"class":567},[538,1646,960],{"class":563},[538,1648,975],{"class":567},[538,1650,1615],{"class":559},[538,1652,564],{"class":563},[538,1654,951],{"class":567},[538,1656,1657],{"class":954},"users:write",[538,1659,951],{"class":567},[538,1661,960],{"class":563},[538,1663,975],{"class":567},[538,1665,1666],{"class":559},"body",[538,1668,1669],{"class":563},"(createUser)",[538,1671,975],{"class":567},[538,1673,1590],{"class":559},[538,1675,564],{"class":563},[538,1677,983],{"class":567},[538,1679,1680],{"class":1009}," 201",[538,1682,578],{"class":567},[538,1684,1685],{"class":563}," createdUser ",[538,1687,616],{"class":567},[538,1689,960],{"class":563},[538,1691,584],{"class":567},[499,1693,1694],{},"The scopes you declare on the route fold into the union the guard reads, so adding one is all it takes to\nbring the route under the guard.",[1070,1696,1698],{"id":1697},"context-reads-throw-outside-a-request","Context reads throw outside a request",[499,1700,1701,1703,1704,1124,1707,1124,1710,1713],{},[523,1702,1060],{}," is backed by per-operation async storage — ",[523,1705,1706],{},"context.get",[523,1708,1709],{},"set",[523,1711,1712],{},"waitUntil"," only work\ninside an active frame. HTTP requests are wrapped in one for you, but a background task, a script, or a\ntest that calls into context-using code without opening a frame will throw, because there's no frame to\nread from.",[499,1715,1716],{},"Open one around the entry point:",[528,1718,1720],{"className":530,"code":1719,"language":533,"meta":534,"style":534},"await context.run(async () => {\n  context.set(\"tenantId\", \"test-tenant\");\n  await doWork();\n});\n",[523,1721,1722,1748,1779,1791],{"__ignoreMap":534},[538,1723,1724,1727,1730,1732,1735,1737,1740,1743,1746],{"class":540,"line":541},[538,1725,1726],{"class":544},"await",[538,1728,1729],{"class":563}," context",[538,1731,975],{"class":567},[538,1733,1734],{"class":559},"run",[538,1736,564],{"class":563},[538,1738,1739],{"class":548},"async",[538,1741,1742],{"class":567}," ()",[538,1744,1745],{"class":548}," =>",[538,1747,937],{"class":567},[538,1749,1750,1753,1755,1757,1759,1761,1764,1766,1768,1770,1773,1775,1777],{"class":540,"line":571},[538,1751,1752],{"class":563},"  context",[538,1754,975],{"class":567},[538,1756,1709],{"class":559},[538,1758,564],{"class":574},[538,1760,951],{"class":567},[538,1762,1763],{"class":954},"tenantId",[538,1765,951],{"class":567},[538,1767,920],{"class":567},[538,1769,991],{"class":567},[538,1771,1772],{"class":954},"test-tenant",[538,1774,951],{"class":567},[538,1776,960],{"class":574},[538,1778,1246],{"class":567},[538,1780,1781,1784,1787,1789],{"class":540,"line":587},[538,1782,1783],{"class":544},"  await",[538,1785,1786],{"class":559}," doWork",[538,1788,1038],{"class":574},[538,1790,1246],{"class":567},[538,1792,1793,1795,1797],{"class":540,"line":613},[538,1794,616],{"class":567},[538,1796,960],{"class":563},[538,1798,1246],{"class":567},[499,1800,1801],{},"This is the same primitive the HTTP transport uses per request — you only call it yourself for the entry\npoints Heximon doesn't already wrap.",[1070,1803,1805],{"id":1804},"type-errors-from-workspace-linked-heximon-packages","Type errors from workspace-linked @heximon packages",[499,1807,1808,1809,1812,1813,1816,1817,1819,1820,1823,1824,1827,1828,1831],{},"This one is monorepo-only — a normal ",[523,1810,1811],{},"pnpm add @heximon\u002Fhttp"," install never hits it. If you develop\nHeximon itself, or link ",[523,1814,1815],{},"@heximon\u002F*"," packages by source in a workspace, your editor and ",[523,1818,1287],{},"\nresolve those packages through the ",[523,1821,1822],{},"development"," export condition, which points at package ",[523,1825,1826],{},"src\u002F"," instead\nof published ",[523,1829,1830],{},"dist",". Vite's dev server needs to be told to resolve the same way, or it loads a different\nbuild than your type-checker sees.",[499,1833,1834,1835,1838,1839,578],{},"Add the condition to ",[523,1836,1837],{},"resolve.conditions"," in ",[523,1840,1841],{},"vite.config.ts",[528,1843,1845],{"className":530,"code":1844,"filename":1841,"language":533,"meta":534,"style":534},"import heximon from \"@heximon\u002Fbuild\u002Fvite\";\nimport { defaultServerConditions, defineConfig } from \"vite-plus\";\n\nexport default defineConfig({\n  plugins: [heximon()],\n  resolve: { conditions: [\"development\", ...defaultServerConditions] },\n  server: { port: 3000 },\n});\n",[523,1846,1847,1866,1893,1897,1910,1927,1960,1980],{"__ignoreMap":534},[538,1848,1849,1851,1854,1857,1859,1862,1864],{"class":540,"line":541},[538,1850,717],{"class":544},[538,1852,1853],{"class":563}," heximon ",[538,1855,1856],{"class":544},"from",[538,1858,991],{"class":567},[538,1860,1861],{"class":954},"@heximon\u002Fbuild\u002Fvite",[538,1863,951],{"class":567},[538,1865,1246],{"class":567},[538,1867,1868,1870,1872,1875,1877,1880,1882,1884,1886,1889,1891],{"class":540,"line":571},[538,1869,717],{"class":544},[538,1871,595],{"class":567},[538,1873,1874],{"class":563}," defaultServerConditions",[538,1876,920],{"class":567},[538,1878,1879],{"class":563}," defineConfig",[538,1881,1013],{"class":567},[538,1883,1198],{"class":544},[538,1885,991],{"class":567},[538,1887,1888],{"class":954},"vite-plus",[538,1890,951],{"class":567},[538,1892,1246],{"class":567},[538,1894,1895],{"class":540,"line":587},[538,1896,1216],{"emptyLinePlaceholder":1215},[538,1898,1899,1901,1904,1906,1908],{"class":540,"line":613},[538,1900,545],{"class":544},[538,1902,1903],{"class":544}," default",[538,1905,1879],{"class":559},[538,1907,564],{"class":563},[538,1909,568],{"class":567},[538,1911,1912,1915,1917,1919,1922,1925],{"class":540,"line":1029},[538,1913,1914],{"class":574},"  plugins",[538,1916,578],{"class":567},[538,1918,1256],{"class":563},[538,1920,1921],{"class":559},"heximon",[538,1923,1924],{"class":563},"()]",[538,1926,584],{"class":567},[538,1928,1929,1932,1934,1936,1939,1941,1943,1945,1947,1949,1951,1954,1957],{"class":540,"line":1047},[538,1930,1931],{"class":574},"  resolve",[538,1933,578],{"class":567},[538,1935,595],{"class":567},[538,1937,1938],{"class":574}," conditions",[538,1940,578],{"class":567},[538,1942,1256],{"class":563},[538,1944,951],{"class":567},[538,1946,1822],{"class":954},[538,1948,951],{"class":567},[538,1950,920],{"class":567},[538,1952,1953],{"class":567}," ...",[538,1955,1956],{"class":563},"defaultServerConditions] ",[538,1958,1959],{"class":567},"},\n",[538,1961,1962,1965,1967,1969,1972,1974,1977],{"class":540,"line":1274},[538,1963,1964],{"class":574},"  server",[538,1966,578],{"class":567},[538,1968,595],{"class":567},[538,1970,1971],{"class":574}," port",[538,1973,578],{"class":567},[538,1975,1976],{"class":1009}," 3000",[538,1978,1979],{"class":567}," },\n",[538,1981,1982,1984,1986],{"class":540,"line":1280},[538,1983,616],{"class":567},[538,1985,960],{"class":563},[538,1987,1246],{"class":567},[499,1989,1990,1993,1994,1996,1997,2000,2001,2003,2004,2006],{},[523,1991,1992],{},"defaultServerConditions"," (from ",[523,1995,1888],{},") keeps Vite's normal server-resolution conditions in place;\nprepending ",[523,1998,1999],{},"\"development\""," is what makes a linked ",[523,2002,1815],{}," package resolve to its source. A regular\ninstalled dependency never needs this — it has no ",[523,2005,1822],{}," condition to chase in the first place.",[1070,2008,2010],{"id":2009},"the-generated-directory-tsconfig-entry","The generated-directory tsconfig entry",[499,2012,2013,2014,1124,2017,2020,2021,2024,2025,1541,2028,2031],{},"The first ",[523,2015,2016],{},"vp dev",[523,2018,2019],{},"vp build"," adds ",[523,2022,2023],{},"\"src\u002F.heximon\u002F**\u002F*\""," to your ",[523,2026,2027],{},"tsconfig.json",[523,2029,2030],{},"include"," for you —\nthe entry that surfaces compile verdicts in your editor.",[499,2033,2034,2035,2037,2038,2040,2042,2043,2045],{},"The one case it can't fix: an ",[523,2036,2030],{}," inherited from a shared base config your ",[523,2039,2027],{},[523,2041,1317],{}," — the healer won't override an ",[523,2044,2030],{}," it doesn't own. Add the entry to that base config\nby hand.",[511,2047,2049],{"id":2048},"still-stuck","Still stuck?",[2051,2052,2053,2058,2070,2079,2088,2093],"ul",{},[630,2054,2055,2057],{},[789,2056,16],{"href":17}," — re-check the Vite config and the decorator-free\nTypeScript setup that lets the compiler read your modules.",[630,2059,2060,2063,2064,2066,2067,2069],{},[789,2061,2062],{"href":54},"Dependency Injection"," — how providers, ",[523,2065,642],{},", and ",[523,2068,724],{}," decide what's\nresolvable where.",[630,2071,2072,2074,2075,2078],{},[789,2073,394],{"href":395}," — how to read any build error: the code, the\ncodeframe, and the ",[523,2076,2077],{},"help:"," fix.",[630,2080,2081,2084,2085,2087],{},[789,2082,2083],{"href":63},"Validation"," — runtime schemas, the validated accessors, and the ",[523,2086,825],{},"\nproblem+json they produce.",[630,2089,2090,2092],{},[789,2091,31],{"href":32}," — every one of the runnable apps compiles and runs, so they're a\nworking reference for any pattern you're unsure about.",[630,2094,2095,2096,2102],{},"Search the ",[789,2097,2101],{"href":2098,"rel":2099},"https:\u002F\u002Fgithub.com\u002Fheximon\u002Fheximon\u002Fissues",[2100],"nofollow","GitHub issues"," or open a discussion.",[2104,2105,2106],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":534,"searchDepth":571,"depth":571,"links":2108},[2109,2110,2111,2112,2113,2114,2124],{"id":513,"depth":571,"text":514},{"id":665,"depth":571,"text":666},{"id":796,"depth":571,"text":797},{"id":864,"depth":571,"text":865},{"id":886,"depth":571,"text":887},{"id":1064,"depth":571,"text":1065,"children":2115},[2116,2117,2118,2119,2120,2121,2122,2123],{"id":1072,"depth":587,"text":1073},{"id":1303,"depth":587,"text":1304},{"id":1488,"depth":587,"text":1489},{"id":1580,"depth":587,"text":1581},{"id":1601,"depth":587,"text":1602},{"id":1697,"depth":587,"text":1698},{"id":1804,"depth":587,"text":1805},{"id":2009,"depth":587,"text":2010},{"id":2048,"depth":571,"text":2049},"Fixes for the common first-run issues — missing routes, unresolved dependencies, validation 400s, a hanging middleware, a failed build after an edit — plus deeper diagnostics for contracts, scopes, and context.","md",null,{},{"icon":44},{"title":41,"description":2125},"sxEpaQ2kVxbKKHGSVCYWJV3ZhJCDZrZKk1hY1u1lv7g",[2133,2135],{"title":36,"path":37,"stem":38,"description":2134,"icon":39,"children":-1},"A goal-to-package map for everything past the Quick Start — contracts, databases, auth, background jobs, real-time, and deployment.",{"title":53,"path":54,"stem":55,"description":2136,"icon":48,"children":-1},"Group a feature with Module(...), wire providers with constructor injection, share them via imports and exports, and let the editor catch a broken DI graph before you build.",1783300761903]