[{"data":1,"prerenderedAt":1586},["ShallowReactive",2],{"navigation_docs":3,"-docs-essentials-project-structure":493,"-docs-essentials-project-structure-surround":1581},[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":131,"body":495,"description":1574,"extension":1575,"links":1576,"meta":1577,"navigation":1578,"path":132,"seo":1579,"stem":133,"__hash__":1580},"docs\u002Fdocs\u002F02.essentials\u002F19.project-structure.md",{"type":496,"value":497,"toc":1563},"minimark",[498,516,521,540,661,675,696,700,719,966,987,1004,1008,1019,1134,1137,1141,1148,1314,1321,1330,1395,1399,1408,1441,1451,1472,1476,1490,1526,1530,1559],[499,500,501,502,506,507,511,512,515],"p",{},"A Heximon app is organized by ",[503,504,505],"strong",{},"feature",", not by layer. Each feature lives in one folder — its module,\ncontroller, providers, schemas, and errors side by side — and a single root module composes them. There\nis no ",[508,509,510],"code",{},"server.ts"," or bootstrap to maintain: the compiler generates the boot entry, so ",[508,513,514],{},"src\u002F"," is nothing\nbut your features.",[517,518,520],"h2",{"id":519},"start-small-one-feature-one-folder","Start small: one feature, one folder",[499,522,523,524,527,528,531,532,535,536,539],{},"The smallest real app is a single feature folder plus a root module, sitting beside the three files that\nconfigure it: ",[508,525,526],{},"vite.config.ts"," (registers the ",[508,529,530],{},"heximon()"," build step), ",[508,533,534],{},"heximon.config.ts"," (lists which\nHeximon plugins are active — HTTP, events, …), and ",[508,537,538],{},"tsconfig.json",".",[541,542,548],"pre",{"className":543,"code":544,"filename":545,"language":546,"meta":547,"style":547},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","src\u002F\n├── app.module.ts                 # Root module — imports every feature\n└── users\u002F\n    ├── users.module.ts           # Declares the feature: providers + http namespace\n    ├── users.controller.ts       # HTTP surface; routes declared by handler types\n    ├── users.repository.ts       # Data access (a plain provider)\n    ├── user.schema.ts             # Request\u002Fresponse DTOs (any Standard Schema)\n    └── user-errors.ts             # Domain errors thrown by the repository\nvite.config.ts                    # heximon() plugin — see Core Concepts\nheximon.config.ts                 # the active compiler plugins\ntsconfig.json\n","project","bash","",[508,549,550,559,573,582,594,605,616,627,639,647,655],{"__ignoreMap":547},[551,552,555],"span",{"class":553,"line":554},"line",1,[551,556,558],{"class":557},"sBMFI","src\u002F\n",[551,560,562,565,569],{"class":553,"line":561},2,[551,563,564],{"class":557},"├──",[551,566,568],{"class":567},"sfazB"," app.module.ts",[551,570,572],{"class":571},"sHwdD","                 # Root module — imports every feature\n",[551,574,576,579],{"class":553,"line":575},3,[551,577,578],{"class":557},"└──",[551,580,581],{"class":567}," users\u002F\n",[551,583,585,588,591],{"class":553,"line":584},4,[551,586,587],{"class":557},"    ├──",[551,589,590],{"class":567}," users.module.ts",[551,592,593],{"class":571},"           # Declares the feature: providers + http namespace\n",[551,595,597,599,602],{"class":553,"line":596},5,[551,598,587],{"class":557},[551,600,601],{"class":567}," users.controller.ts",[551,603,604],{"class":571},"       # HTTP surface; routes declared by handler types\n",[551,606,608,610,613],{"class":553,"line":607},6,[551,609,587],{"class":557},[551,611,612],{"class":567}," users.repository.ts",[551,614,615],{"class":571},"       # Data access (a plain provider)\n",[551,617,619,621,624],{"class":553,"line":618},7,[551,620,587],{"class":557},[551,622,623],{"class":567}," user.schema.ts",[551,625,626],{"class":571},"             # Request\u002Fresponse DTOs (any Standard Schema)\n",[551,628,630,633,636],{"class":553,"line":629},8,[551,631,632],{"class":557},"    └──",[551,634,635],{"class":567}," user-errors.ts",[551,637,638],{"class":571},"             # Domain errors thrown by the repository\n",[551,640,642,644],{"class":553,"line":641},9,[551,643,526],{"class":557},[551,645,646],{"class":571},"                    # heximon() plugin — see Core Concepts\n",[551,648,650,652],{"class":553,"line":649},10,[551,651,534],{"class":557},[551,653,654],{"class":571},"                 # the active compiler plugins\n",[551,656,658],{"class":553,"line":657},11,[551,659,660],{"class":557},"tsconfig.json\n",[499,662,663,664,667,668,670,671,674],{},"There is no entry file because there is nothing for you to write. ",[508,665,666],{},"pnpm dev"," runs the compiler over\n",[508,669,514],{},", generates the ",[508,672,673],{},"fetch"," boot, and serves it — by default the generated wiring stays in memory and never\ntouches disk.",[499,676,677,678,681,682,684,685,687,688,691,692,695],{},"It's written to ",[508,679,680],{},".heximon\u002F"," at your project root (a sibling of ",[508,683,514],{},", gitignored) only when\n",[508,686,534],{}," sets ",[508,689,690],{},"debug: true"," or the platform build needs disk output. The one always-on artifact is\n",[508,693,694],{},"src\u002F.heximon\u002F",", the generated graph\u002Fdeclaration directory the editor reads for compile-time type errors —\ngitignored and regenerated on every change, so you never edit or commit it.",[517,697,699],{"id":698},"group-a-feature-in-its-module","Group a feature in its module",[499,701,702,703,706,707,710,711,714,715,718],{},"A feature's module is the one file that names everything the feature owns. It lists plain ",[508,704,705],{},"providers",",\nnames concept classes under their plugin's namespace (",[508,708,709],{},"http",", ",[508,712,713],{},"cqrs",", …), and ",[508,716,717],{},"exports"," any class\nanother feature may inject. Nothing outside this config gets wired.",[541,720,725],{"className":721,"code":722,"filename":723,"language":724,"meta":547,"style":547},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Module } from \"@heximon\u002Fruntime\";\nimport { RequestLoggerMiddleware } from \"..\u002Fcommon\u002Frequest-logger.middleware\";\nimport { UserNotFoundErrorFilter } from \".\u002Fuser-error.filter\";\nimport { UsersController } from \".\u002Fusers.controller\";\nimport { UsersRepository } from \".\u002Fusers.repository\";\n\nexport class UsersModule extends Module({\n  providers: [UsersRepository, RequestLoggerMiddleware],\n  http: {\n    controllers: [UsersController],\n    errorFilters: [UserNotFoundErrorFilter],\n  },\n  exports: [UsersRepository], \u002F\u002F visible to features that import UsersModule\n}) {}\n","src\u002Fusers\u002Fusers.module.ts","ts",[508,726,727,759,781,803,825,847,853,877,898,908,920,932,938,954],{"__ignoreMap":547},[551,728,729,733,737,741,744,747,750,753,756],{"class":553,"line":554},[551,730,732],{"class":731},"s7zQu","import",[551,734,736],{"class":735},"sMK4o"," {",[551,738,740],{"class":739},"sTEyZ"," Module",[551,742,743],{"class":735}," }",[551,745,746],{"class":731}," from",[551,748,749],{"class":735}," \"",[551,751,752],{"class":567},"@heximon\u002Fruntime",[551,754,755],{"class":735},"\"",[551,757,758],{"class":735},";\n",[551,760,761,763,765,768,770,772,774,777,779],{"class":553,"line":561},[551,762,732],{"class":731},[551,764,736],{"class":735},[551,766,767],{"class":739}," RequestLoggerMiddleware",[551,769,743],{"class":735},[551,771,746],{"class":731},[551,773,749],{"class":735},[551,775,776],{"class":567},"..\u002Fcommon\u002Frequest-logger.middleware",[551,778,755],{"class":735},[551,780,758],{"class":735},[551,782,783,785,787,790,792,794,796,799,801],{"class":553,"line":575},[551,784,732],{"class":731},[551,786,736],{"class":735},[551,788,789],{"class":739}," UserNotFoundErrorFilter",[551,791,743],{"class":735},[551,793,746],{"class":731},[551,795,749],{"class":735},[551,797,798],{"class":567},".\u002Fuser-error.filter",[551,800,755],{"class":735},[551,802,758],{"class":735},[551,804,805,807,809,812,814,816,818,821,823],{"class":553,"line":584},[551,806,732],{"class":731},[551,808,736],{"class":735},[551,810,811],{"class":739}," UsersController",[551,813,743],{"class":735},[551,815,746],{"class":731},[551,817,749],{"class":735},[551,819,820],{"class":567},".\u002Fusers.controller",[551,822,755],{"class":735},[551,824,758],{"class":735},[551,826,827,829,831,834,836,838,840,843,845],{"class":553,"line":596},[551,828,732],{"class":731},[551,830,736],{"class":735},[551,832,833],{"class":739}," UsersRepository",[551,835,743],{"class":735},[551,837,746],{"class":731},[551,839,749],{"class":735},[551,841,842],{"class":567},".\u002Fusers.repository",[551,844,755],{"class":735},[551,846,758],{"class":735},[551,848,849],{"class":553,"line":607},[551,850,852],{"emptyLinePlaceholder":851},true,"\n",[551,854,855,858,862,865,868,871,874],{"class":553,"line":618},[551,856,857],{"class":731},"export",[551,859,861],{"class":860},"spNyl"," class",[551,863,864],{"class":557}," UsersModule",[551,866,867],{"class":860}," extends",[551,869,740],{"class":870},"s2Zo4",[551,872,873],{"class":739},"(",[551,875,876],{"class":735},"{\n",[551,878,879,883,886,889,892,895],{"class":553,"line":629},[551,880,882],{"class":881},"swJcz","  providers",[551,884,885],{"class":735},":",[551,887,888],{"class":739}," [UsersRepository",[551,890,891],{"class":735},",",[551,893,894],{"class":739}," RequestLoggerMiddleware]",[551,896,897],{"class":735},",\n",[551,899,900,903,905],{"class":553,"line":641},[551,901,902],{"class":881},"  http",[551,904,885],{"class":735},[551,906,907],{"class":735}," {\n",[551,909,910,913,915,918],{"class":553,"line":649},[551,911,912],{"class":881},"    controllers",[551,914,885],{"class":735},[551,916,917],{"class":739}," [UsersController]",[551,919,897],{"class":735},[551,921,922,925,927,930],{"class":553,"line":657},[551,923,924],{"class":881},"    errorFilters",[551,926,885],{"class":735},[551,928,929],{"class":739}," [UserNotFoundErrorFilter]",[551,931,897],{"class":735},[551,933,935],{"class":553,"line":934},12,[551,936,937],{"class":735},"  },\n",[551,939,941,944,946,949,951],{"class":553,"line":940},13,[551,942,943],{"class":881},"  exports",[551,945,885],{"class":735},[551,947,948],{"class":739}," [UsersRepository]",[551,950,891],{"class":735},[551,952,953],{"class":571}," \u002F\u002F visible to features that import UsersModule\n",[551,955,957,960,963],{"class":553,"line":956},14,[551,958,959],{"class":735},"}",[551,961,962],{"class":739},") ",[551,964,965],{"class":735},"{}\n",[499,967,968,969,972,973,976,977,980,981,984,985,539],{},"The slot is the registration, so place each class deliberately. The controller and the error filter are\nboth concept classes the HTTP plugin discovers by the ",[508,970,971],{},"Controller\u003C...>"," \u002F ",[508,974,975],{},"ErrorFilter\u003C...>"," clause they\ndeclare (",[508,978,979],{},"implements"," or ",[508,982,983],{},"extends","), so they go under ",[508,986,709],{},[499,988,989,990,992,993,997,998,1001,1002,539],{},"The\nrepository is a plain DI class the graph must construct, so it goes in ",[508,991,705],{}," — and so does a\nmiddleware, which is then ",[994,995,996],"em",{},"named"," on the controller (which routes it applies to) but ",[994,999,1000],{},"constructed"," via\n",[508,1003,705],{},[517,1005,1007],{"id":1006},"compose-features-under-a-root-module","Compose features under a root module",[499,1009,1010,1011,1014,1015,1018],{},"The root module is the one no other module imports. It pulls features together with ",[508,1012,1013],{},"imports",", and the\ncompiler picks it up as your app automatically — no ",[508,1016,1017],{},"apps"," config, no manifest to register.",[541,1020,1023],{"className":721,"code":1021,"filename":1022,"language":724,"meta":547,"style":547},"import { Module } from \"@heximon\u002Fruntime\";\nimport { CatalogModule } from \".\u002Fcatalog\u002Fcatalog.module\";\nimport { UsersModule } from \".\u002Fusers\u002Fusers.module\";\n\nexport class AppModule extends Module({\n  imports: [UsersModule, CatalogModule],\n}) {}\n","src\u002Fapp.module.ts",[508,1024,1025,1045,1067,1088,1092,1109,1126],{"__ignoreMap":547},[551,1026,1027,1029,1031,1033,1035,1037,1039,1041,1043],{"class":553,"line":554},[551,1028,732],{"class":731},[551,1030,736],{"class":735},[551,1032,740],{"class":739},[551,1034,743],{"class":735},[551,1036,746],{"class":731},[551,1038,749],{"class":735},[551,1040,752],{"class":567},[551,1042,755],{"class":735},[551,1044,758],{"class":735},[551,1046,1047,1049,1051,1054,1056,1058,1060,1063,1065],{"class":553,"line":561},[551,1048,732],{"class":731},[551,1050,736],{"class":735},[551,1052,1053],{"class":739}," CatalogModule",[551,1055,743],{"class":735},[551,1057,746],{"class":731},[551,1059,749],{"class":735},[551,1061,1062],{"class":567},".\u002Fcatalog\u002Fcatalog.module",[551,1064,755],{"class":735},[551,1066,758],{"class":735},[551,1068,1069,1071,1073,1075,1077,1079,1081,1084,1086],{"class":553,"line":575},[551,1070,732],{"class":731},[551,1072,736],{"class":735},[551,1074,864],{"class":739},[551,1076,743],{"class":735},[551,1078,746],{"class":731},[551,1080,749],{"class":735},[551,1082,1083],{"class":567},".\u002Fusers\u002Fusers.module",[551,1085,755],{"class":735},[551,1087,758],{"class":735},[551,1089,1090],{"class":553,"line":584},[551,1091,852],{"emptyLinePlaceholder":851},[551,1093,1094,1096,1098,1101,1103,1105,1107],{"class":553,"line":596},[551,1095,857],{"class":731},[551,1097,861],{"class":860},[551,1099,1100],{"class":557}," AppModule",[551,1102,867],{"class":860},[551,1104,740],{"class":870},[551,1106,873],{"class":739},[551,1108,876],{"class":735},[551,1110,1111,1114,1116,1119,1121,1124],{"class":553,"line":607},[551,1112,1113],{"class":881},"  imports",[551,1115,885],{"class":735},[551,1117,1118],{"class":739}," [UsersModule",[551,1120,891],{"class":735},[551,1122,1123],{"class":739}," CatalogModule]",[551,1125,897],{"class":735},[551,1127,1128,1130,1132],{"class":553,"line":618},[551,1129,959],{"class":735},[551,1131,962],{"class":739},[551,1133,965],{"class":735},[499,1135,1136],{},"It is also where app-wide middleware belongs: declared on the root, it becomes the broadest layer of the\nrequest onion, wrapping every feature beneath it.",[517,1138,1140],{"id":1139},"name-files-for-what-they-hold","Name files for what they hold",[499,1142,1143,1144,1147],{},"A consistent ",[508,1145,1146],{},"\u003Cdomain>.\u003Crole>.ts"," convention makes a file's job obvious from its name, and sorts the\nrelated files for one feature together in your editor. These are the patterns the example apps use.",[1149,1150,1151,1168],"table",{},[1152,1153,1154],"thead",{},[1155,1156,1157,1162,1165],"tr",{},[1158,1159,1161],"th",{"align":1160},"left","Role",[1158,1163,1164],{"align":1160},"Pattern",[1158,1166,1167],{"align":1160},"Example",[1169,1170,1171,1187,1202,1217,1232,1251,1266,1281,1296],"tbody",{},[1155,1172,1173,1177,1182],{},[1174,1175,1176],"td",{"align":1160},"Module",[1174,1178,1179],{"align":1160},[508,1180,1181],{},"\u003Cdomain>.module.ts",[1174,1183,1184],{"align":1160},[508,1185,1186],{},"users.module.ts",[1155,1188,1189,1192,1197],{},[1174,1190,1191],{"align":1160},"Controller",[1174,1193,1194],{"align":1160},[508,1195,1196],{},"\u003Cdomain>.controller.ts",[1174,1198,1199],{"align":1160},[508,1200,1201],{},"users.controller.ts",[1155,1203,1204,1207,1212],{},[1174,1205,1206],{"align":1160},"Contract",[1174,1208,1209],{"align":1160},[508,1210,1211],{},"\u003Cdomain>.api.ts",[1174,1213,1214],{"align":1160},[508,1215,1216],{},"task.api.ts",[1155,1218,1219,1222,1227],{},[1174,1220,1221],{"align":1160},"Repository \u002F service",[1174,1223,1224],{"align":1160},[508,1225,1226],{},"\u003Cdomain>.repository.ts",[1174,1228,1229],{"align":1160},[508,1230,1231],{},"users.repository.ts",[1155,1233,1234,1237,1246],{},[1174,1235,1236],{"align":1160},"Schema \u002F DTO",[1174,1238,1239,1242,1243],{"align":1160},[508,1240,1241],{},"\u003Cdomain>.schema.ts"," · ",[508,1244,1245],{},"\u003Cdomain>.dto.ts",[1174,1247,1248],{"align":1160},[508,1249,1250],{},"user.schema.ts",[1155,1252,1253,1256,1261],{},[1174,1254,1255],{"align":1160},"Domain errors",[1174,1257,1258],{"align":1160},[508,1259,1260],{},"\u003Cdomain>-errors.ts",[1174,1262,1263],{"align":1160},[508,1264,1265],{},"user-errors.ts",[1155,1267,1268,1271,1276],{},[1174,1269,1270],{"align":1160},"Error filter",[1174,1272,1273],{"align":1160},[508,1274,1275],{},"\u003Cdomain>-error.filter.ts",[1174,1277,1278],{"align":1160},[508,1279,1280],{},"user-error.filter.ts",[1155,1282,1283,1286,1291],{},[1174,1284,1285],{"align":1160},"Middleware",[1174,1287,1288],{"align":1160},[508,1289,1290],{},"\u003Cname>.middleware.ts",[1174,1292,1293],{"align":1160},[508,1294,1295],{},"request-logger.middleware.ts",[1155,1297,1298,1301,1309],{},[1174,1299,1300],{"align":1160},"Test",[1174,1302,1303,1242,1306],{"align":1160},[508,1304,1305],{},"\u003Csubject>.test.ts",[508,1307,1308],{},"\u003Csubject>.e2e.test.ts",[1174,1310,1311],{"align":1160},[508,1312,1313],{},"app.e2e.test.ts",[517,1315,1317,1318],{"id":1316},"share-cross-feature-code-in-common","Share cross-feature code in ",[508,1319,1320],{},"common\u002F",[499,1322,1323,1324,1326,1327,1329],{},"Code that belongs to no single feature — a request logger, a shared base error — lives in a ",[508,1325,1320],{},"\nfolder beside your features, never reached for from one feature into another's. Keeping the dependency\narrows pointing at ",[508,1328,1320],{},", and never sideways between features, is what keeps modules genuinely\nindependent.",[541,1331,1333],{"className":543,"code":1332,"filename":545,"language":546,"meta":547,"style":547},"src\u002F\n├── app.module.ts\n├── common\u002F\n│   └── request-logger.middleware.ts   # used by more than one feature\n├── users\u002F\n│   └── …\n└── catalog\u002F\n    └── …\n",[508,1334,1335,1339,1346,1353,1367,1373,1382,1389],{"__ignoreMap":547},[551,1336,1337],{"class":553,"line":554},[551,1338,558],{"class":557},[551,1340,1341,1343],{"class":553,"line":561},[551,1342,564],{"class":557},[551,1344,1345],{"class":567}," app.module.ts\n",[551,1347,1348,1350],{"class":553,"line":575},[551,1349,564],{"class":557},[551,1351,1352],{"class":567}," common\u002F\n",[551,1354,1355,1358,1361,1364],{"class":553,"line":584},[551,1356,1357],{"class":557},"│",[551,1359,1360],{"class":567},"   └──",[551,1362,1363],{"class":567}," request-logger.middleware.ts",[551,1365,1366],{"class":571},"   # used by more than one feature\n",[551,1368,1369,1371],{"class":553,"line":596},[551,1370,564],{"class":557},[551,1372,581],{"class":567},[551,1374,1375,1377,1379],{"class":553,"line":607},[551,1376,1357],{"class":557},[551,1378,1360],{"class":567},[551,1380,1381],{"class":567}," …\n",[551,1383,1384,1386],{"class":553,"line":618},[551,1385,578],{"class":557},[551,1387,1388],{"class":567}," catalog\u002F\n",[551,1390,1391,1393],{"class":553,"line":629},[551,1392,632],{"class":557},[551,1394,1381],{"class":567},[517,1396,1398],{"id":1397},"match-the-hosts-layout-when-you-deploy","Match the host's layout when you deploy",[499,1400,1401,1402,1404,1405,885],{},"The ",[508,1403,514],{}," convention is for the standalone Vite dev server. A host adapter scans its own directory, so\nthe same modules just move to where the host expects them. The Nitro and Nuxt adapters look under\n",[508,1406,1407],{},"server\u002F",[541,1409,1412],{"className":543,"code":1410,"filename":1411,"language":546,"meta":547,"style":547},"server\u002F\n├── app.module.ts\n└── users\u002F\n    └── …                         # the same feature folders, unchanged\n","nitro \u002F nuxt",[508,1413,1414,1419,1425,1431],{"__ignoreMap":547},[551,1415,1416],{"class":553,"line":554},[551,1417,1418],{"class":557},"server\u002F\n",[551,1420,1421,1423],{"class":553,"line":561},[551,1422,564],{"class":557},[551,1424,1345],{"class":567},[551,1426,1427,1429],{"class":553,"line":575},[551,1428,578],{"class":557},[551,1430,581],{"class":567},[551,1432,1433,1435,1438],{"class":553,"line":584},[551,1434,632],{"class":557},[551,1436,1437],{"class":567}," …",[551,1439,1440],{"class":571},"                         # the same feature folders, unchanged\n",[499,1442,1443,1444,1447,1448,1450],{},"Under Nuxt your Vue frontend lives in ",[508,1445,1446],{},"app\u002F"," and your Heximon modules directly under ",[508,1449,1407],{}," — one project,\nboth halves type-checked together.",[1452,1453,1455,1464,1465,1467,1468,1471],"callout",{"type":1454},"info",[503,1456,1457,1458,1460,1461,1463],{},"Keep ",[508,1459,1013],{}," and ",[508,1462,705],{}," literal — the compiler reads them, it never runs them."," Discovery\nwalks the source AST, so a module's lists must be static arrays of class references. Building a\n",[508,1466,705],{}," array conditionally, or spreading one in from a function call, is a hard build error —\nthe compiler rejects the computed list and names the offending entry (",[508,1469,1470],{},"config\u002Fcomputed-list","), so a\nclass can never be silently skipped. List every provider and import inline.",[517,1473,1475],{"id":1474},"growing-past-one-app","Growing past one app",[499,1477,1478,1479,1482,1483,1486,1487,1489],{},"A feature with real domain logic earns sub-folders by responsibility (CQRS ",[508,1480,1481],{},"commands\u002F","\u002F",[508,1484,1485],{},"queries\u002F",",\nDDD's entity at the feature root), shared infrastructure gets its own module that ",[508,1488,717],{}," a token every\nfeature injects, and a whole feature can ship as its own precompiled package. The module-per-feature rule\ndoesn't change at any of these sizes — only how many folders and packages hold it.",[1491,1492,1493,1506,1515],"ul",{},[1494,1495,1496,1499,1500,1482,1503,1505],"li",{},[1497,1498,475],"a",{"href":476}," — ship a module as an installable package with a ",[508,1501,1502],{},"requires",[508,1504,717],{}," boundary.",[1494,1507,1508,1510,1511,1514],{},[1497,1509,398],{"href":399}," — how the precompiled ",[508,1512,1513],{},"create\u003CModule>"," factory and manifest work under the hood.",[1494,1516,1517,1525],{},[1497,1518,1522],{"href":1519,"rel":1520},"https:\u002F\u002Fgithub.com\u002Fheximon\u002Fheximon\u002Ftree\u002Fmain\u002Fexamples\u002Fflagship",[1521],"nofollow",[503,1523,1524],{},"Flagship"," — the full sub-folder layout at real scale: CQRS, DDD, a shared database module, auth, and an error filter, composed under one root per deploy target.",[517,1527,1529],{"id":1528},"next-steps","Next steps",[1491,1531,1532,1537,1542],{},[1494,1533,1534,1536],{},[1497,1535,26],{"href":27}," — how modules, providers, and the DI graph fit together.",[1494,1538,1539,1541],{},[1497,1540,57],{"href":58}," — the two controller modes, routes, middleware, and responses.",[1494,1543,1544,1551,1552,1554,1555,1558],{},[1497,1545,1548],{"href":1546,"rel":1547},"https:\u002F\u002Fgithub.com\u002Fheximon\u002Fheximon\u002Ftree\u002Fmain\u002Fexamples\u002Fladder\u002FL02-http-validation",[1521],[503,1549,1550],{},"L02 — HTTP validation"," — two feature folders, a shared ",[508,1553,1320],{}," middleware, and domain errors that map to ",[508,1556,1557],{},"problem+json"," through the built-in error formatter, in the flat layout.",[1560,1561,1562],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html 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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":547,"searchDepth":561,"depth":561,"links":1564},[1565,1566,1567,1568,1569,1571,1572,1573],{"id":519,"depth":561,"text":520},{"id":698,"depth":561,"text":699},{"id":1006,"depth":561,"text":1007},{"id":1139,"depth":561,"text":1140},{"id":1316,"depth":561,"text":1570},"Share cross-feature code in common\u002F",{"id":1397,"depth":561,"text":1398},{"id":1474,"depth":561,"text":1475},{"id":1528,"depth":561,"text":1529},"The recommended directory layout for a Heximon app — one folder per feature module, the three config files, naming conventions, and the generated boot entry.","md",null,{},{"icon":134},{"title":131,"description":1574},"5OPQD3_WqmJBTiveIbELwPrJRI9IqkXnfDVik3blC_Q",[1582,1584],{"title":126,"path":127,"stem":128,"description":1583,"icon":129,"children":-1},"Request-scoped data with Context and the augmentable ContextData, deferred work via waitUntil and background, plus the OnInit, OnBootstrap, and OnShutdown lifecycle hooks, createApp, get, preload, and graceful shutdown with drain.",{"title":142,"path":143,"stem":144,"description":1585,"icon":137,"children":-1},"The capability map — every production concern (events, background jobs, cron, caching, storage, health, notifications, idempotency, security, tracing, OpenAPI, MCP, schema, branded ids) and the one config line each one adds.",1783300761903]