[{"data":1,"prerenderedAt":1506},["ShallowReactive",2],{"navigation_docs":3,"-docs-getting-started-core-concepts":493,"-docs-getting-started-core-concepts-surround":1501},[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":26,"body":495,"description":1494,"extension":1495,"links":1496,"meta":1497,"navigation":1498,"path":27,"seo":1499,"stem":28,"__hash__":1500},"docs\u002Fdocs\u002F01.getting-started\u002F04.core-concepts.md",{"type":496,"value":497,"toc":1486},"minimark",[498,519,535,540,552,738,755,759,769,843,848,852,875,1093,1098,1102,1119,1137,1215,1224,1228,1235,1324,1415,1425,1442,1446,1482],[499,500,501,502,506,507,510,511,514,515,518],"p",{},"A whole Heximon app comes down to six terms. A ",[503,504,505],"strong",{},"module"," groups a feature. ",[503,508,509],{},"Providers"," are the plain\nclasses inside it. ",[503,512,513],{},"Constructor injection"," wires those classes together. A ",[503,516,517],{},"controller"," turns HTTP\nrequests into method calls.",[499,520,521,522,525,526,530,531,534],{},"A ",[503,523,524],{},"build step"," — the ",[527,528,529],"code",{},"heximon()"," Vite plugin — reads all of that and generates the wiring before your\napp runs. And ",[503,532,533],{},"one config line"," registers that plugin. This page walks each term once; every section\nlinks to the page that goes deep.",[536,537,539],"h2",{"id":538},"group-a-feature-with-a-module","Group a feature with a module",[499,541,542,543,546,547,551],{},"A module is a class that ",[527,544,545],{},"extends Module({...})",". It draws the boundary of a feature — what it owns, what\nit pulls in from other modules — and it's the ",[548,549,550],"em",{},"only"," place the compiler looks to find your classes.",[553,554,560],"pre",{"className":555,"code":556,"filename":557,"language":558,"meta":559,"style":559},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Module } from \"@heximon\u002Fruntime\";\nimport { UsersController } from \".\u002Fusers.controller\";\nimport { UsersRepository } from \".\u002Fusers.repository\";\n\nexport class UsersModule extends Module({\n  providers: [UsersRepository],\n  http: { controllers: [UsersController] },\n  exports: [UsersRepository],\n}) {}\n","src\u002Fusers\u002Fusers.module.ts","ts","",[527,561,562,598,621,644,651,677,693,714,726],{"__ignoreMap":559},[563,564,567,571,575,579,582,585,588,592,595],"span",{"class":565,"line":566},"line",1,[563,568,570],{"class":569},"s7zQu","import",[563,572,574],{"class":573},"sMK4o"," {",[563,576,578],{"class":577},"sTEyZ"," Module",[563,580,581],{"class":573}," }",[563,583,584],{"class":569}," from",[563,586,587],{"class":573}," \"",[563,589,591],{"class":590},"sfazB","@heximon\u002Fruntime",[563,593,594],{"class":573},"\"",[563,596,597],{"class":573},";\n",[563,599,601,603,605,608,610,612,614,617,619],{"class":565,"line":600},2,[563,602,570],{"class":569},[563,604,574],{"class":573},[563,606,607],{"class":577}," UsersController",[563,609,581],{"class":573},[563,611,584],{"class":569},[563,613,587],{"class":573},[563,615,616],{"class":590},".\u002Fusers.controller",[563,618,594],{"class":573},[563,620,597],{"class":573},[563,622,624,626,628,631,633,635,637,640,642],{"class":565,"line":623},3,[563,625,570],{"class":569},[563,627,574],{"class":573},[563,629,630],{"class":577}," UsersRepository",[563,632,581],{"class":573},[563,634,584],{"class":569},[563,636,587],{"class":573},[563,638,639],{"class":590},".\u002Fusers.repository",[563,641,594],{"class":573},[563,643,597],{"class":573},[563,645,647],{"class":565,"line":646},4,[563,648,650],{"emptyLinePlaceholder":649},true,"\n",[563,652,654,657,661,665,668,671,674],{"class":565,"line":653},5,[563,655,656],{"class":569},"export",[563,658,660],{"class":659},"spNyl"," class",[563,662,664],{"class":663},"sBMFI"," UsersModule",[563,666,667],{"class":659}," extends",[563,669,578],{"class":670},"s2Zo4",[563,672,673],{"class":577},"(",[563,675,676],{"class":573},"{\n",[563,678,680,684,687,690],{"class":565,"line":679},6,[563,681,683],{"class":682},"swJcz","  providers",[563,685,686],{"class":573},":",[563,688,689],{"class":577}," [UsersRepository]",[563,691,692],{"class":573},",\n",[563,694,696,699,701,703,706,708,711],{"class":565,"line":695},7,[563,697,698],{"class":682},"  http",[563,700,686],{"class":573},[563,702,574],{"class":573},[563,704,705],{"class":682}," controllers",[563,707,686],{"class":573},[563,709,710],{"class":577}," [UsersController] ",[563,712,713],{"class":573},"},\n",[563,715,717,720,722,724],{"class":565,"line":716},8,[563,718,719],{"class":682},"  exports",[563,721,686],{"class":573},[563,723,689],{"class":577},[563,725,692],{"class":573},[563,727,729,732,735],{"class":565,"line":728},9,[563,730,731],{"class":573},"}",[563,733,734],{"class":577},") ",[563,736,737],{"class":573},"{}\n",[499,739,740,743,744,747,748,751,752],{},[527,741,742],{},"providers"," and ",[527,745,746],{},"exports"," are structural fields the kernel always understands; ",[527,749,750],{},"http"," is a plugin's\nnamespace for the concept classes it owns — here, a controller. That keeps registration explicit: a class\nis wired because it's listed here, never because it was scanned off disk.\n→ ",[753,754,53],"a",{"href":54},[536,756,758],{"id":757},"inject-providers-by-their-constructor","Inject providers by their constructor",[499,760,761,762,764,765,768],{},"A provider is any class the graph can build. List it in ",[527,763,742],{}," and it's injectable — no decorator\nneeded. Its dependencies ",[548,766,767],{},"are"," its constructor parameters: declare one typed by the class you want,\nand the compiler resolves it by identity and passes the instance in.",[553,770,773],{"className":555,"code":771,"filename":772,"language":558,"meta":559,"style":559},"export class UsersController implements Controller\u003C\"\u002Fusers\"> {\n  \u002F\u002F resolved by class identity — no token, no decorator\n  constructor(private readonly users: UsersRepository) {}\n}\n","src\u002Fusers\u002Fusers.controller.ts",[527,774,775,805,811,838],{"__ignoreMap":559},[563,776,777,779,781,783,786,789,792,794,797,799,802],{"class":565,"line":566},[563,778,656],{"class":569},[563,780,660],{"class":659},[563,782,607],{"class":663},[563,784,785],{"class":659}," implements",[563,787,788],{"class":663}," Controller",[563,790,791],{"class":573},"\u003C",[563,793,594],{"class":573},[563,795,796],{"class":590},"\u002Fusers",[563,798,594],{"class":573},[563,800,801],{"class":573},">",[563,803,804],{"class":573}," {\n",[563,806,807],{"class":565,"line":600},[563,808,810],{"class":809},"sHwdD","  \u002F\u002F resolved by class identity — no token, no decorator\n",[563,812,813,816,818,821,824,828,830,832,835],{"class":565,"line":623},[563,814,815],{"class":659},"  constructor",[563,817,673],{"class":573},[563,819,820],{"class":659},"private",[563,822,823],{"class":659}," readonly",[563,825,827],{"class":826},"sHdIc"," users",[563,829,686],{"class":573},[563,831,630],{"class":663},[563,833,834],{"class":573},")",[563,836,837],{"class":573}," {}\n",[563,839,840],{"class":565,"line":646},[563,841,842],{"class":573},"}\n",[499,844,845,846],{},"That's constructor injection: no token to declare, no string key to drift, just the type in the signature.\n→ ",[753,847,53],{"href":54},[536,849,851],{"id":850},"turn-requests-into-method-calls-with-a-controller","Turn requests into method calls with a controller",[499,853,854,855,858,859,862,863,866,867,870,871,874],{},"A controller declares ",[527,856,857],{},"implements Controller\u003C\"\u002Fprefix\">"," and is listed under ",[527,860,861],{},"http: { controllers }",".\nEach route is declared by its handler's ",[503,864,865],{},"action parameter type"," — ",[527,868,869],{},"Get\u003C\"\u002F:id\">"," ",[548,872,873],{},"is"," the route, so\nthere's no separate config to keep in sync with the method.",[553,876,878],{"className":555,"code":877,"filename":772,"language":558,"meta":559,"style":559},"import type { Controller, Get } from \"@heximon\u002Fhttp\";\nimport { type User, UsersRepository } from \".\u002Fusers.repository\";\n\nexport class UsersController implements Controller\u003C\"\u002Fusers\"> {\n  constructor(private readonly users: UsersRepository) {}\n\n  public async get(action: Get\u003C\"\u002F:id\">): Promise\u003CUser | undefined> {\n    return this.users.findById(action.request.pathParams.id); \u002F\u002F pathParams.id typed from \"\u002F:id\"\n  }\n}\n",[527,879,880,910,937,941,965,985,989,1039,1083,1088],{"__ignoreMap":559},[563,881,882,884,887,889,891,894,897,899,901,903,906,908],{"class":565,"line":566},[563,883,570],{"class":569},[563,885,886],{"class":569}," type",[563,888,574],{"class":573},[563,890,788],{"class":577},[563,892,893],{"class":573},",",[563,895,896],{"class":577}," Get",[563,898,581],{"class":573},[563,900,584],{"class":569},[563,902,587],{"class":573},[563,904,905],{"class":590},"@heximon\u002Fhttp",[563,907,594],{"class":573},[563,909,597],{"class":573},[563,911,912,914,916,918,921,923,925,927,929,931,933,935],{"class":565,"line":600},[563,913,570],{"class":569},[563,915,574],{"class":573},[563,917,886],{"class":569},[563,919,920],{"class":577}," User",[563,922,893],{"class":573},[563,924,630],{"class":577},[563,926,581],{"class":573},[563,928,584],{"class":569},[563,930,587],{"class":573},[563,932,639],{"class":590},[563,934,594],{"class":573},[563,936,597],{"class":573},[563,938,939],{"class":565,"line":623},[563,940,650],{"emptyLinePlaceholder":649},[563,942,943,945,947,949,951,953,955,957,959,961,963],{"class":565,"line":646},[563,944,656],{"class":569},[563,946,660],{"class":659},[563,948,607],{"class":663},[563,950,785],{"class":659},[563,952,788],{"class":663},[563,954,791],{"class":573},[563,956,594],{"class":573},[563,958,796],{"class":590},[563,960,594],{"class":573},[563,962,801],{"class":573},[563,964,804],{"class":573},[563,966,967,969,971,973,975,977,979,981,983],{"class":565,"line":653},[563,968,815],{"class":659},[563,970,673],{"class":573},[563,972,820],{"class":659},[563,974,823],{"class":659},[563,976,827],{"class":826},[563,978,686],{"class":573},[563,980,630],{"class":663},[563,982,834],{"class":573},[563,984,837],{"class":573},[563,986,987],{"class":565,"line":679},[563,988,650],{"emptyLinePlaceholder":649},[563,990,991,994,997,1000,1002,1005,1007,1009,1011,1013,1016,1018,1021,1024,1026,1029,1032,1035,1037],{"class":565,"line":695},[563,992,993],{"class":659},"  public",[563,995,996],{"class":659}," async",[563,998,999],{"class":682}," get",[563,1001,673],{"class":573},[563,1003,1004],{"class":826},"action",[563,1006,686],{"class":573},[563,1008,896],{"class":663},[563,1010,791],{"class":573},[563,1012,594],{"class":573},[563,1014,1015],{"class":590},"\u002F:id",[563,1017,594],{"class":573},[563,1019,1020],{"class":573},">):",[563,1022,1023],{"class":663}," Promise",[563,1025,791],{"class":573},[563,1027,1028],{"class":663},"User",[563,1030,1031],{"class":573}," |",[563,1033,1034],{"class":663}," undefined",[563,1036,801],{"class":573},[563,1038,804],{"class":573},[563,1040,1041,1044,1047,1050,1053,1056,1058,1060,1062,1065,1067,1070,1072,1075,1077,1080],{"class":565,"line":716},[563,1042,1043],{"class":569},"    return",[563,1045,1046],{"class":573}," this.",[563,1048,1049],{"class":577},"users",[563,1051,1052],{"class":573},".",[563,1054,1055],{"class":670},"findById",[563,1057,673],{"class":682},[563,1059,1004],{"class":577},[563,1061,1052],{"class":573},[563,1063,1064],{"class":577},"request",[563,1066,1052],{"class":573},[563,1068,1069],{"class":577},"pathParams",[563,1071,1052],{"class":573},[563,1073,1074],{"class":577},"id",[563,1076,834],{"class":682},[563,1078,1079],{"class":573},";",[563,1081,1082],{"class":809}," \u002F\u002F pathParams.id typed from \"\u002F:id\"\n",[563,1084,1085],{"class":565,"line":728},[563,1086,1087],{"class":573},"  }\n",[563,1089,1091],{"class":565,"line":1090},10,[563,1092,842],{"class":573},[499,1094,1095,1096],{},"→ ",[753,1097,57],{"href":58},[536,1099,1101],{"id":1100},"let-the-build-step-write-the-wiring","Let the build step write the wiring",[499,1103,1104,1105,1108,1109,1111,1112,1115,1116,1052],{},"The defining move: dependency injection happens at ",[503,1106,1107],{},"build time",", not at runtime. The ",[527,1110,529],{}," Vite\nplugin reads your modules and constructors and emits plain JavaScript that constructs everything directly\n(",[527,1113,1114],{},"new UsersController(new UsersRepository())",") into ",[527,1117,1118],{},".heximon\u002F",[499,1120,1121,1122,1125,1126,1129,1130,1132,1133,1136],{},"There's no container, no reflection, and no entry file to write — the plugin generates the ",[527,1123,1124],{},"fetch"," boot,\nand ",[527,1127,1128],{},"pnpm dev"," serves it. Because the compiler reads source rather than running it, your ",[527,1131,742],{}," and\n",[527,1134,1135],{},"imports"," lists must be static (no computed or conditional imports) — and in exchange the wiring is\nordinary code you can open and read.",[1138,1139,1140,1160,1179,1197],"code-group",{},[553,1141,1146],{"className":1142,"code":1143,"filename":1144,"language":1145,"meta":559,"style":559},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm dev\n# compiles src\u002F to wiring, serves it, and recompiles on every change\n","pnpm","bash",[527,1147,1148,1155],{"__ignoreMap":559},[563,1149,1150,1152],{"class":565,"line":566},[563,1151,1144],{"class":663},[563,1153,1154],{"class":590}," dev\n",[563,1156,1157],{"class":565,"line":600},[563,1158,1159],{"class":809},"# compiles src\u002F to wiring, serves it, and recompiles on every change\n",[553,1161,1164],{"className":1142,"code":1162,"filename":1163,"language":1145,"meta":559,"style":559},"npm run dev\n# compiles src\u002F to wiring, serves it, and recompiles on every change\n","npm",[527,1165,1166,1175],{"__ignoreMap":559},[563,1167,1168,1170,1173],{"class":565,"line":566},[563,1169,1163],{"class":663},[563,1171,1172],{"class":590}," run",[563,1174,1154],{"class":590},[563,1176,1177],{"class":565,"line":600},[563,1178,1159],{"class":809},[553,1180,1183],{"className":1142,"code":1181,"filename":1182,"language":1145,"meta":559,"style":559},"yarn run dev\n# compiles src\u002F to wiring, serves it, and recompiles on every change\n","yarn",[527,1184,1185,1193],{"__ignoreMap":559},[563,1186,1187,1189,1191],{"class":565,"line":566},[563,1188,1182],{"class":663},[563,1190,1172],{"class":590},[563,1192,1154],{"class":590},[563,1194,1195],{"class":565,"line":600},[563,1196,1159],{"class":809},[553,1198,1201],{"className":1142,"code":1199,"filename":1200,"language":1145,"meta":559,"style":559},"bun run dev\n# compiles src\u002F to wiring, serves it, and recompiles on every change\n","bun",[527,1202,1203,1211],{"__ignoreMap":559},[563,1204,1205,1207,1209],{"class":565,"line":566},[563,1206,1200],{"class":663},[563,1208,1172],{"class":590},[563,1210,1154],{"class":590},[563,1212,1213],{"class":565,"line":600},[563,1214,1159],{"class":809},[499,1216,1095,1217,1219,1220,1223],{},[753,1218,126],{"href":127}," covers what runs once the wiring boots\n(request context, ",[527,1221,1222],{},"OnInit",", graceful shutdown).",[536,1225,1227],{"id":1226},"register-it-with-one-config-line","Register it with one config line",[499,1229,1230,1231,1234],{},"The build step is a plugin you install like any other Vite plugin — it takes no arguments of its own; the\n",[527,1232,1233],{},"heximon.config.ts"," config file lists which Heximon plugins are active (here, just HTTP):",[553,1236,1238],{"className":555,"code":1237,"filename":1233,"language":558,"meta":559,"style":559},"import { defineHeximonConfig } from \"@heximon\u002Fbuild\";\nimport { HttpPlugin } from \"@heximon\u002Fhttp\u002Fcompiler\";\n\nexport default defineHeximonConfig({ plugins: [new HttpPlugin()] });\n",[527,1239,1240,1262,1284,1288],{"__ignoreMap":559},[563,1241,1242,1244,1246,1249,1251,1253,1255,1258,1260],{"class":565,"line":566},[563,1243,570],{"class":569},[563,1245,574],{"class":573},[563,1247,1248],{"class":577}," defineHeximonConfig",[563,1250,581],{"class":573},[563,1252,584],{"class":569},[563,1254,587],{"class":573},[563,1256,1257],{"class":590},"@heximon\u002Fbuild",[563,1259,594],{"class":573},[563,1261,597],{"class":573},[563,1263,1264,1266,1268,1271,1273,1275,1277,1280,1282],{"class":565,"line":600},[563,1265,570],{"class":569},[563,1267,574],{"class":573},[563,1269,1270],{"class":577}," HttpPlugin",[563,1272,581],{"class":573},[563,1274,584],{"class":569},[563,1276,587],{"class":573},[563,1278,1279],{"class":590},"@heximon\u002Fhttp\u002Fcompiler",[563,1281,594],{"class":573},[563,1283,597],{"class":573},[563,1285,1286],{"class":565,"line":623},[563,1287,650],{"emptyLinePlaceholder":649},[563,1289,1290,1292,1295,1297,1299,1302,1305,1307,1310,1313,1315,1318,1320,1322],{"class":565,"line":646},[563,1291,656],{"class":569},[563,1293,1294],{"class":569}," default",[563,1296,1248],{"class":670},[563,1298,673],{"class":577},[563,1300,1301],{"class":573},"{",[563,1303,1304],{"class":682}," plugins",[563,1306,686],{"class":573},[563,1308,1309],{"class":577}," [",[563,1311,1312],{"class":573},"new",[563,1314,1270],{"class":670},[563,1316,1317],{"class":577},"()] ",[563,1319,731],{"class":573},[563,1321,834],{"class":577},[563,1323,597],{"class":573},[553,1325,1328],{"className":555,"code":1326,"filename":1327,"language":558,"meta":559,"style":559},"import heximon from \"@heximon\u002Fbuild\u002Fvite\";\nimport { defineConfig } from \"vite-plus\";\n\nexport default defineConfig({\n  plugins: [heximon()], \u002F\u002F takes no arguments — plugins live in heximon.config.ts above\n});\n","vite.config.ts",[527,1329,1330,1349,1371,1375,1387,1407],{"__ignoreMap":559},[563,1331,1332,1334,1337,1340,1342,1345,1347],{"class":565,"line":566},[563,1333,570],{"class":569},[563,1335,1336],{"class":577}," heximon ",[563,1338,1339],{"class":569},"from",[563,1341,587],{"class":573},[563,1343,1344],{"class":590},"@heximon\u002Fbuild\u002Fvite",[563,1346,594],{"class":573},[563,1348,597],{"class":573},[563,1350,1351,1353,1355,1358,1360,1362,1364,1367,1369],{"class":565,"line":600},[563,1352,570],{"class":569},[563,1354,574],{"class":573},[563,1356,1357],{"class":577}," defineConfig",[563,1359,581],{"class":573},[563,1361,584],{"class":569},[563,1363,587],{"class":573},[563,1365,1366],{"class":590},"vite-plus",[563,1368,594],{"class":573},[563,1370,597],{"class":573},[563,1372,1373],{"class":565,"line":623},[563,1374,650],{"emptyLinePlaceholder":649},[563,1376,1377,1379,1381,1383,1385],{"class":565,"line":646},[563,1378,656],{"class":569},[563,1380,1294],{"class":569},[563,1382,1357],{"class":670},[563,1384,673],{"class":577},[563,1386,676],{"class":573},[563,1388,1389,1392,1394,1396,1399,1402,1404],{"class":565,"line":653},[563,1390,1391],{"class":682},"  plugins",[563,1393,686],{"class":573},[563,1395,1309],{"class":577},[563,1397,1398],{"class":670},"heximon",[563,1400,1401],{"class":577},"()]",[563,1403,893],{"class":573},[563,1405,1406],{"class":809}," \u002F\u002F takes no arguments — plugins live in heximon.config.ts above\n",[563,1408,1409,1411,1413],{"class":565,"line":679},[563,1410,731],{"class":573},[563,1412,834],{"class":577},[563,1414,597],{"class":573},[499,1416,1417,1418,1420,1421,1424],{},"That's the whole setup: one config file, one line in ",[527,1419,1327],{},". Every capability past this —\nvalidation, contracts, a database, background jobs, events, CQRS — is the same move, repeated: add a\npackage, add its namespace key to a module, register its plugin. See\n",[753,1422,1423],{"href":37},"Where next?"," for the full map.",[1426,1427,1429,1430,870,1433,1435,1436,1438,1439,1052],"callout",{"type":1428},"info","The Nitro and Nuxt hosts take the ",[503,1431,1432],{},"same",[527,1434,1233],{},", read through their own module instead of the\n",[527,1437,529],{}," Vite plugin — so moving from the dev server to a deployment is a config swap, not a rewrite.\nSee ",[753,1440,1441],{"href":347},"Deploy targets",[536,1443,1445],{"id":1444},"next-steps","Next steps",[1447,1448,1449,1455,1460,1465,1470],"ul",{},[1450,1451,1452,1454],"li",{},[753,1453,131],{"href":132}," — turn these concepts into a directory layout that scales.",[1450,1456,1457,1459],{},[753,1458,53],{"href":54}," — the DI graph in full, including factories and abstract-class seams.",[1450,1461,1462,1464],{},[753,1463,57],{"href":58}," — both binding modes, middleware, and status-keyed responses in depth.",[1450,1466,1467,1469],{},[753,1468,1423],{"href":37}," — the goal-to-package map for everything past this page.",[1450,1471,1472,1474,1475,1481],{},[753,1473,31],{"href":32}," — the tiered example set; ",[753,1476,1480],{"href":1477,"rel":1478},"https:\u002F\u002Fgithub.com\u002Fheximon\u002Fheximon\u002Ftree\u002Fmain\u002Fexamples\u002Fladder\u002FL01-minimal",[1479],"nofollow","the ladder's L01 — Minimal"," is exactly the app this page describes.",[1483,1484,1485],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .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 .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 .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 .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":559,"searchDepth":600,"depth":600,"links":1487},[1488,1489,1490,1491,1492,1493],{"id":538,"depth":600,"text":539},{"id":757,"depth":600,"text":758},{"id":850,"depth":600,"text":851},{"id":1100,"depth":600,"text":1101},{"id":1226,"depth":600,"text":1227},{"id":1444,"depth":600,"text":1445},"The six terms a Heximon app is built from — module, provider, constructor injection, controller, the build step, and the config line — each with a link to its dedicated page.","md",null,{},{"icon":29},{"title":26,"description":1494},"AHERU0Cm25j4siEYbeA9VEvBzKA6EYJyOxZci9QnSt4",[1502,1504],{"title":21,"path":22,"stem":23,"description":1503,"icon":24,"children":-1},"Build your first Heximon app in three files — a provider, a controller, and a module, wired by the compiler and served by Vite.",{"title":31,"path":32,"stem":33,"description":1505,"icon":34,"children":-1},"Runnable examples in three tiers — a progressive learning ladder (L01–L08), the event-ticketing flagship monorepo, and thematic gap examples for platform and feature one-offs.",1783300761903]