[{"data":1,"prerenderedAt":3001},["ShallowReactive",2],{"navigation_docs":3,"-docs-essentials-database":493,"-docs-essentials-database-surround":2996},[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":77,"body":495,"description":2989,"extension":2990,"links":2991,"meta":2992,"navigation":2993,"path":78,"seo":2994,"stem":79,"__hash__":2995},"docs\u002Fdocs\u002F02.essentials\u002F06.database.md",{"type":496,"value":497,"toc":2977},"minimark",[498,509,571,586,591,594,915,938,942,949,1145,1155,1159,1166,1256,1267,1274,1289,1485,1495,1499,1509,2445,2464,2468,2474,2598,2607,2778,2781,2869,2872,2894,2905,2913,2917,2957,2961,2973],[499,500,501,502,508],"p",{},"You can go from nothing to a real database-backed CRUD API without standing up a database server: an in-memory\nSQLite database, a typed table, a repository, and a controller — the same DI you already know, wired to\n",[503,504,82],"a",{"href":505,"rel":506},"https:\u002F\u002Form.drizzle.team",[507],"nofollow"," instead of hand-written SQL.",[510,511,517],"pre",{"className":512,"code":513,"filename":514,"language":515,"meta":516,"style":516},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -X POST http:\u002F\u002Flocalhost:3004\u002Ftasks -H 'content-type: application\u002Fjson' -d '{\"title\":\"Write docs\"}'\ncurl http:\u002F\u002Flocalhost:3004\u002Ftasks\n","terminal","bash","",[518,519,520,563],"code",{"__ignoreMap":516},[521,522,525,529,533,536,539,542,546,549,552,555,557,560],"span",{"class":523,"line":524},"line",1,[521,526,528],{"class":527},"sBMFI","curl",[521,530,532],{"class":531},"sfazB"," -X",[521,534,535],{"class":531}," POST",[521,537,538],{"class":531}," http:\u002F\u002Flocalhost:3004\u002Ftasks",[521,540,541],{"class":531}," -H",[521,543,545],{"class":544},"sMK4o"," '",[521,547,548],{"class":531},"content-type: application\u002Fjson",[521,550,551],{"class":544},"'",[521,553,554],{"class":531}," -d",[521,556,545],{"class":544},[521,558,559],{"class":531},"{\"title\":\"Write docs\"}",[521,561,562],{"class":544},"'\n",[521,564,566,568],{"class":523,"line":565},2,[521,567,528],{"class":527},[521,569,570],{"class":531}," http:\u002F\u002Flocalhost:3004\u002Ftasks\n",[499,572,573,574,577,578,581,582,585],{},"That's the whole shape this page builds: a ",[518,575,576],{},"tasks"," table, a repository that runs typed queries against\nit, and a controller that turns HTTP requests into repository calls. No Drizzle compiler plugin exists —\npersistence is a runtime library you wire through the same ",[518,579,580],{},"providers","\u002F",[518,583,584],{},"useFactory"," mechanism as anything\nelse.",[587,588,590],"h2",{"id":589},"declare-the-schema","Declare the schema",[499,592,593],{},"The table is stock Drizzle — nothing Heximon-specific. If you already know Drizzle's SQLite column\nbuilders, this file needs no explanation:",[510,595,600],{"className":596,"code":597,"filename":598,"language":599,"meta":516,"style":516},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineRelations } from \"drizzle-orm\";\nimport { integer, sqliteTable, text } from \"drizzle-orm\u002Fsqlite-core\";\n\nexport const tasks = sqliteTable(\"tasks\", {\n  id: integer(\"id\").primaryKey({ autoIncrement: true }),\n  title: text(\"title\").notNull(),\n  done: integer(\"done\").notNull().default(0),\n});\n\nexport const schema = { tasks };\nexport const relations = defineRelations(schema);\n\nexport type TaskRow = typeof tasks.$inferSelect;\n","src\u002Fdatabase\u002Fschema.ts","ts",[518,601,602,633,666,673,706,757,788,830,840,845,864,883,888],{"__ignoreMap":516},[521,603,604,608,611,615,618,621,624,627,630],{"class":523,"line":524},[521,605,607],{"class":606},"s7zQu","import",[521,609,610],{"class":544}," {",[521,612,614],{"class":613},"sTEyZ"," defineRelations",[521,616,617],{"class":544}," }",[521,619,620],{"class":606}," from",[521,622,623],{"class":544}," \"",[521,625,626],{"class":531},"drizzle-orm",[521,628,629],{"class":544},"\"",[521,631,632],{"class":544},";\n",[521,634,635,637,639,642,645,648,650,653,655,657,659,662,664],{"class":523,"line":565},[521,636,607],{"class":606},[521,638,610],{"class":544},[521,640,641],{"class":613}," integer",[521,643,644],{"class":544},",",[521,646,647],{"class":613}," sqliteTable",[521,649,644],{"class":544},[521,651,652],{"class":613}," text",[521,654,617],{"class":544},[521,656,620],{"class":606},[521,658,623],{"class":544},[521,660,661],{"class":531},"drizzle-orm\u002Fsqlite-core",[521,663,629],{"class":544},[521,665,632],{"class":544},[521,667,669],{"class":523,"line":668},3,[521,670,672],{"emptyLinePlaceholder":671},true,"\n",[521,674,676,679,683,686,689,692,695,697,699,701,703],{"class":523,"line":675},4,[521,677,678],{"class":606},"export",[521,680,682],{"class":681},"spNyl"," const",[521,684,685],{"class":613}," tasks ",[521,687,688],{"class":544},"=",[521,690,647],{"class":691},"s2Zo4",[521,693,694],{"class":613},"(",[521,696,629],{"class":544},[521,698,576],{"class":531},[521,700,629],{"class":544},[521,702,644],{"class":544},[521,704,705],{"class":544}," {\n",[521,707,709,713,716,718,720,722,725,727,730,733,736,738,741,744,746,750,752,754],{"class":523,"line":708},5,[521,710,712],{"class":711},"swJcz","  id",[521,714,715],{"class":544},":",[521,717,641],{"class":691},[521,719,694],{"class":613},[521,721,629],{"class":544},[521,723,724],{"class":531},"id",[521,726,629],{"class":544},[521,728,729],{"class":613},")",[521,731,732],{"class":544},".",[521,734,735],{"class":691},"primaryKey",[521,737,694],{"class":613},[521,739,740],{"class":544},"{",[521,742,743],{"class":711}," autoIncrement",[521,745,715],{"class":544},[521,747,749],{"class":748},"sfNiH"," true",[521,751,617],{"class":544},[521,753,729],{"class":613},[521,755,756],{"class":544},",\n",[521,758,760,763,765,767,769,771,774,776,778,780,783,786],{"class":523,"line":759},6,[521,761,762],{"class":711},"  title",[521,764,715],{"class":544},[521,766,652],{"class":691},[521,768,694],{"class":613},[521,770,629],{"class":544},[521,772,773],{"class":531},"title",[521,775,629],{"class":544},[521,777,729],{"class":613},[521,779,732],{"class":544},[521,781,782],{"class":691},"notNull",[521,784,785],{"class":613},"()",[521,787,756],{"class":544},[521,789,791,794,796,798,800,802,805,807,809,811,813,815,817,820,822,826,828],{"class":523,"line":790},7,[521,792,793],{"class":711},"  done",[521,795,715],{"class":544},[521,797,641],{"class":691},[521,799,694],{"class":613},[521,801,629],{"class":544},[521,803,804],{"class":531},"done",[521,806,629],{"class":544},[521,808,729],{"class":613},[521,810,732],{"class":544},[521,812,782],{"class":691},[521,814,785],{"class":613},[521,816,732],{"class":544},[521,818,819],{"class":691},"default",[521,821,694],{"class":613},[521,823,825],{"class":824},"sbssI","0",[521,827,729],{"class":613},[521,829,756],{"class":544},[521,831,833,836,838],{"class":523,"line":832},8,[521,834,835],{"class":544},"}",[521,837,729],{"class":613},[521,839,632],{"class":544},[521,841,843],{"class":523,"line":842},9,[521,844,672],{"emptyLinePlaceholder":671},[521,846,848,850,852,855,857,859,861],{"class":523,"line":847},10,[521,849,678],{"class":606},[521,851,682],{"class":681},[521,853,854],{"class":613}," schema ",[521,856,688],{"class":544},[521,858,610],{"class":544},[521,860,685],{"class":613},[521,862,863],{"class":544},"};\n",[521,865,867,869,871,874,876,878,881],{"class":523,"line":866},11,[521,868,678],{"class":606},[521,870,682],{"class":681},[521,872,873],{"class":613}," relations ",[521,875,688],{"class":544},[521,877,614],{"class":691},[521,879,880],{"class":613},"(schema)",[521,882,632],{"class":544},[521,884,886],{"class":523,"line":885},12,[521,887,672],{"emptyLinePlaceholder":671},[521,889,891,893,896,899,902,905,908,910,913],{"class":523,"line":890},13,[521,892,678],{"class":606},[521,894,895],{"class":681}," type",[521,897,898],{"class":527}," TaskRow",[521,900,901],{"class":544}," =",[521,903,904],{"class":544}," typeof",[521,906,907],{"class":613}," tasks",[521,909,732],{"class":544},[521,911,912],{"class":613},"$inferSelect",[521,914,632],{"class":544},[499,916,917,919,920,581,922,925,926,929,930,933,934,937],{},[518,918,804],{}," is stored as SQLite's ",[518,921,825],{},[518,923,924],{},"1"," integer (SQLite has no native boolean) — the repository below maps\nit to a real ",[518,927,928],{},"boolean"," at the edge. ",[518,931,932],{},"schema"," is the name-to-table map both the runtime ORM and the CLI\nbelow read; ",[518,935,936],{},"relations"," is called even with a single table so the relational-query surface stays\nwell-formed as you add more.",[587,939,941],{"id":940},"author-the-unified-config","Author the unified config",[499,943,944,945,948],{},"One config object is read by two consumers: the Heximon runtime, which builds the database from it, and\nthe stock ",[518,946,947],{},"drizzle-kit"," CLI, which can generate and push migrations against the same instance — no second\nconfig file, no wrapper.",[510,950,953],{"className":596,"code":951,"filename":952,"language":599,"meta":516,"style":516},"import { DrizzleLibSQLConfig } from \"@heximon\u002Fdrizzle\u002Flibsql\u002Fconfig\";\nimport { relations, schema } from \".\u002Fschema\";\n\nexport const databaseConfig = new DrizzleLibSQLConfig(schema, relations, {\n  dialect: \"sqlite\",\n  schema: \".\u002Fsrc\u002Fdatabase\u002Fschema.ts\",\n  out: \".\u002Fmigrations\",\n  url: \":memory:\",\n});\n\nexport type DatabaseSchema = typeof schema;\nexport type DatabaseRelations = typeof relations;\n","src\u002Fdatabase\u002Fdatabase.config.ts",[518,954,955,977,1004,1008,1035,1051,1067,1083,1099,1107,1111,1128],{"__ignoreMap":516},[521,956,957,959,961,964,966,968,970,973,975],{"class":523,"line":524},[521,958,607],{"class":606},[521,960,610],{"class":544},[521,962,963],{"class":613}," DrizzleLibSQLConfig",[521,965,617],{"class":544},[521,967,620],{"class":606},[521,969,623],{"class":544},[521,971,972],{"class":531},"@heximon\u002Fdrizzle\u002Flibsql\u002Fconfig",[521,974,629],{"class":544},[521,976,632],{"class":544},[521,978,979,981,983,986,988,991,993,995,997,1000,1002],{"class":523,"line":565},[521,980,607],{"class":606},[521,982,610],{"class":544},[521,984,985],{"class":613}," relations",[521,987,644],{"class":544},[521,989,990],{"class":613}," schema",[521,992,617],{"class":544},[521,994,620],{"class":606},[521,996,623],{"class":544},[521,998,999],{"class":531},".\u002Fschema",[521,1001,629],{"class":544},[521,1003,632],{"class":544},[521,1005,1006],{"class":523,"line":668},[521,1007,672],{"emptyLinePlaceholder":671},[521,1009,1010,1012,1014,1017,1019,1022,1024,1027,1029,1031,1033],{"class":523,"line":675},[521,1011,678],{"class":606},[521,1013,682],{"class":681},[521,1015,1016],{"class":613}," databaseConfig ",[521,1018,688],{"class":544},[521,1020,1021],{"class":544}," new",[521,1023,963],{"class":691},[521,1025,1026],{"class":613},"(schema",[521,1028,644],{"class":544},[521,1030,985],{"class":613},[521,1032,644],{"class":544},[521,1034,705],{"class":544},[521,1036,1037,1040,1042,1044,1047,1049],{"class":523,"line":708},[521,1038,1039],{"class":711},"  dialect",[521,1041,715],{"class":544},[521,1043,623],{"class":544},[521,1045,1046],{"class":531},"sqlite",[521,1048,629],{"class":544},[521,1050,756],{"class":544},[521,1052,1053,1056,1058,1060,1063,1065],{"class":523,"line":759},[521,1054,1055],{"class":711},"  schema",[521,1057,715],{"class":544},[521,1059,623],{"class":544},[521,1061,1062],{"class":531},".\u002Fsrc\u002Fdatabase\u002Fschema.ts",[521,1064,629],{"class":544},[521,1066,756],{"class":544},[521,1068,1069,1072,1074,1076,1079,1081],{"class":523,"line":790},[521,1070,1071],{"class":711},"  out",[521,1073,715],{"class":544},[521,1075,623],{"class":544},[521,1077,1078],{"class":531},".\u002Fmigrations",[521,1080,629],{"class":544},[521,1082,756],{"class":544},[521,1084,1085,1088,1090,1092,1095,1097],{"class":523,"line":832},[521,1086,1087],{"class":711},"  url",[521,1089,715],{"class":544},[521,1091,623],{"class":544},[521,1093,1094],{"class":531},":memory:",[521,1096,629],{"class":544},[521,1098,756],{"class":544},[521,1100,1101,1103,1105],{"class":523,"line":842},[521,1102,835],{"class":544},[521,1104,729],{"class":613},[521,1106,632],{"class":544},[521,1108,1109],{"class":523,"line":847},[521,1110,672],{"emptyLinePlaceholder":671},[521,1112,1113,1115,1117,1120,1122,1124,1126],{"class":523,"line":866},[521,1114,678],{"class":606},[521,1116,895],{"class":681},[521,1118,1119],{"class":527}," DatabaseSchema",[521,1121,901],{"class":544},[521,1123,904],{"class":544},[521,1125,990],{"class":613},[521,1127,632],{"class":544},[521,1129,1130,1132,1134,1137,1139,1141,1143],{"class":523,"line":885},[521,1131,678],{"class":606},[521,1133,895],{"class":681},[521,1135,1136],{"class":527}," DatabaseRelations",[521,1138,901],{"class":544},[521,1140,904],{"class":544},[521,1142,985],{"class":613},[521,1144,632],{"class":544},[499,1146,1147,1150,1151,1154],{},[518,1148,1149],{},"url: \":memory:\""," opens an in-process SQLite database with no filesystem footprint — no server to run,\nnothing to configure beyond ",[518,1152,1153],{},"pnpm install",". It resets on every restart, which is exactly right for this\npage and for tests.",[587,1156,1158],{"id":1157},"name-the-database-as-a-di-token","Name the database as a DI token",[499,1160,1161,1162,1165],{},"Dependency injection resolves by class identity, and generic type arguments are erased once resolution\nhappens — so the generic ",[518,1163,1164],{},"DrizzleLibSQLDatabase\u003CSchema, Relations>"," can't be a token: every\nparameterization would collapse onto the same class. Fixing the schema and relations types in a named,\notherwise-empty subclass gives you one concrete class every consumer can inject:",[510,1167,1170],{"className":596,"code":1168,"filename":1169,"language":599,"meta":516,"style":516},"import { DrizzleLibSQLDatabase } from \"@heximon\u002Fdrizzle\u002Flibsql\";\nimport type { DatabaseRelations, DatabaseSchema } from \".\u002Fdatabase.config\";\n\nexport class AppDatabase extends DrizzleLibSQLDatabase\u003CDatabaseSchema, DatabaseRelations> {}\n","src\u002Fdatabase\u002Fapp-database.ts",[518,1171,1172,1194,1221,1225],{"__ignoreMap":516},[521,1173,1174,1176,1178,1181,1183,1185,1187,1190,1192],{"class":523,"line":524},[521,1175,607],{"class":606},[521,1177,610],{"class":544},[521,1179,1180],{"class":613}," DrizzleLibSQLDatabase",[521,1182,617],{"class":544},[521,1184,620],{"class":606},[521,1186,623],{"class":544},[521,1188,1189],{"class":531},"@heximon\u002Fdrizzle\u002Flibsql",[521,1191,629],{"class":544},[521,1193,632],{"class":544},[521,1195,1196,1198,1200,1202,1204,1206,1208,1210,1212,1214,1217,1219],{"class":523,"line":565},[521,1197,607],{"class":606},[521,1199,895],{"class":606},[521,1201,610],{"class":544},[521,1203,1136],{"class":613},[521,1205,644],{"class":544},[521,1207,1119],{"class":613},[521,1209,617],{"class":544},[521,1211,620],{"class":606},[521,1213,623],{"class":544},[521,1215,1216],{"class":531},".\u002Fdatabase.config",[521,1218,629],{"class":544},[521,1220,632],{"class":544},[521,1222,1223],{"class":523,"line":668},[521,1224,672],{"emptyLinePlaceholder":671},[521,1226,1227,1229,1232,1235,1238,1240,1243,1246,1248,1250,1253],{"class":523,"line":675},[521,1228,678],{"class":606},[521,1230,1231],{"class":681}," class",[521,1233,1234],{"class":527}," AppDatabase",[521,1236,1237],{"class":681}," extends",[521,1239,1180],{"class":527},[521,1241,1242],{"class":544},"\u003C",[521,1244,1245],{"class":527},"DatabaseSchema",[521,1247,644],{"class":544},[521,1249,1136],{"class":527},[521,1251,1252],{"class":544},">",[521,1254,1255],{"class":544}," {}\n",[499,1257,1258,1259,1262,1263,1266],{},"The body is empty on purpose — it inherits the ",[518,1260,1261],{},"(config, context)"," constructor unchanged. ",[518,1264,1265],{},"AppDatabase","\nis now both the DI token and a fully-typed ORM handle for this app's exact tables.",[587,1268,1270,1271,1273],{"id":1269},"provide-it-with-a-usefactory-no-compiler-plugin","Provide it with a ",[518,1272,584],{}," — no compiler plugin",[499,1275,1276,1277,1280,1281,1285,1286,1288],{},"There is no Drizzle compiler plugin, because there doesn't need to be one: the database is an ordinary\nprovider. The factory's one parameter is the framework ",[518,1278,1279],{},"Context",", resolved by its ",[1282,1283,1284],"strong",{},"type"," exactly like a\nconstructor dependency — no token, no decorator. The config is a closed-over value (never a token), and\nthe factory is keyed by the concrete ",[518,1287,1265],{}," class, so every consumer resolves to the one shared\ninstance:",[510,1290,1293],{"className":596,"code":1291,"filename":1292,"language":599,"meta":516,"style":516},"import { type Context, Module } from \"@heximon\u002Fruntime\";\nimport { AppDatabase } from \".\u002Fapp-database\";\nimport { databaseConfig } from \".\u002Fdatabase.config\";\n\nexport class DatabaseModule extends Module({\n  providers: [\n    {\n      provide: AppDatabase,\n      useFactory: (context: Context) => new AppDatabase(databaseConfig, context),\n    },\n  ],\n  exports: [AppDatabase],\n}) {}\n","src\u002Fdatabase\u002Fdatabase.module.ts",[518,1294,1295,1324,1345,1366,1370,1388,1398,1403,1414,1451,1456,1463,1475],{"__ignoreMap":516},[521,1296,1297,1299,1301,1303,1306,1308,1311,1313,1315,1317,1320,1322],{"class":523,"line":524},[521,1298,607],{"class":606},[521,1300,610],{"class":544},[521,1302,895],{"class":606},[521,1304,1305],{"class":613}," Context",[521,1307,644],{"class":544},[521,1309,1310],{"class":613}," Module",[521,1312,617],{"class":544},[521,1314,620],{"class":606},[521,1316,623],{"class":544},[521,1318,1319],{"class":531},"@heximon\u002Fruntime",[521,1321,629],{"class":544},[521,1323,632],{"class":544},[521,1325,1326,1328,1330,1332,1334,1336,1338,1341,1343],{"class":523,"line":565},[521,1327,607],{"class":606},[521,1329,610],{"class":544},[521,1331,1234],{"class":613},[521,1333,617],{"class":544},[521,1335,620],{"class":606},[521,1337,623],{"class":544},[521,1339,1340],{"class":531},".\u002Fapp-database",[521,1342,629],{"class":544},[521,1344,632],{"class":544},[521,1346,1347,1349,1351,1354,1356,1358,1360,1362,1364],{"class":523,"line":668},[521,1348,607],{"class":606},[521,1350,610],{"class":544},[521,1352,1353],{"class":613}," databaseConfig",[521,1355,617],{"class":544},[521,1357,620],{"class":606},[521,1359,623],{"class":544},[521,1361,1216],{"class":531},[521,1363,629],{"class":544},[521,1365,632],{"class":544},[521,1367,1368],{"class":523,"line":675},[521,1369,672],{"emptyLinePlaceholder":671},[521,1371,1372,1374,1376,1379,1381,1383,1385],{"class":523,"line":708},[521,1373,678],{"class":606},[521,1375,1231],{"class":681},[521,1377,1378],{"class":527}," DatabaseModule",[521,1380,1237],{"class":681},[521,1382,1310],{"class":691},[521,1384,694],{"class":613},[521,1386,1387],{"class":544},"{\n",[521,1389,1390,1393,1395],{"class":523,"line":759},[521,1391,1392],{"class":711},"  providers",[521,1394,715],{"class":544},[521,1396,1397],{"class":613}," [\n",[521,1399,1400],{"class":523,"line":790},[521,1401,1402],{"class":544},"    {\n",[521,1404,1405,1408,1410,1412],{"class":523,"line":832},[521,1406,1407],{"class":711},"      provide",[521,1409,715],{"class":544},[521,1411,1234],{"class":613},[521,1413,756],{"class":544},[521,1415,1416,1419,1421,1424,1428,1430,1432,1434,1437,1439,1441,1444,1446,1449],{"class":523,"line":842},[521,1417,1418],{"class":691},"      useFactory",[521,1420,715],{"class":544},[521,1422,1423],{"class":544}," (",[521,1425,1427],{"class":1426},"sHdIc","context",[521,1429,715],{"class":544},[521,1431,1305],{"class":527},[521,1433,729],{"class":544},[521,1435,1436],{"class":681}," =>",[521,1438,1021],{"class":544},[521,1440,1234],{"class":691},[521,1442,1443],{"class":613},"(databaseConfig",[521,1445,644],{"class":544},[521,1447,1448],{"class":613}," context)",[521,1450,756],{"class":544},[521,1452,1453],{"class":523,"line":847},[521,1454,1455],{"class":544},"    },\n",[521,1457,1458,1461],{"class":523,"line":866},[521,1459,1460],{"class":613},"  ]",[521,1462,756],{"class":544},[521,1464,1465,1468,1470,1473],{"class":523,"line":885},[521,1466,1467],{"class":711},"  exports",[521,1469,715],{"class":544},[521,1471,1472],{"class":613}," [AppDatabase]",[521,1474,756],{"class":544},[521,1476,1477,1479,1482],{"class":523,"line":890},[521,1478,835],{"class":544},[521,1480,1481],{"class":613},") ",[521,1483,1484],{"class":544},"{}\n",[499,1486,1487,1488,1491,1492,1494],{},"Any module that imports ",[518,1489,1490],{},"DatabaseModule"," can now inject ",[518,1493,1265],{}," — persistence is wired through the\nsame DI graph as everything else, no special-casing at compile time.",[587,1496,1498],{"id":1497},"write-the-repository","Write the repository",[499,1500,1501,1502,1504,1505,1508],{},"A repository is a plain class that injects ",[518,1503,1265],{}," by constructor parameter, exactly like injecting\nany other provider. It runs typed queries through ",[518,1506,1507],{},"getOrm()"," — inserts, selects, updates, deletes — all\nchecked against your schema at compile time:",[510,1510,1513],{"className":596,"code":1511,"filename":1512,"language":599,"meta":516,"style":516},"import { type OnInit } from \"@heximon\u002Fruntime\";\nimport { eq, sql } from \"drizzle-orm\";\nimport { AppDatabase } from \"..\u002Fdatabase\u002Fapp-database\";\nimport { tasks, type TaskRow } from \"..\u002Fdatabase\u002Fschema\";\n\nexport interface Task {\n  readonly id: number;\n  readonly title: string;\n  readonly done: boolean;\n}\n\nexport class TasksRepository implements OnInit {\n  private readonly database: AppDatabase;\n\n  public constructor(database: AppDatabase) {\n    this.database = database;\n  }\n\n  public async onInit(): Promise\u003Cvoid> {\n    await this.database.getOrm().run(sql`\n      CREATE TABLE IF NOT EXISTS tasks (\n        id    INTEGER PRIMARY KEY AUTOINCREMENT,\n        title TEXT NOT NULL,\n        done  INTEGER NOT NULL DEFAULT 0\n      )\n    `);\n  }\n\n  public async list(): Promise\u003CTask[]> {\n    const rows = await this.database.getOrm().select().from(tasks).orderBy(tasks.id);\n    return rows.map((row) => TasksRepository.toTask(row));\n  }\n\n  public async findById(id: number): Promise\u003CTask | undefined> {\n    const rows = await this.database.getOrm().select().from(tasks).where(eq(tasks.id, id)).limit(1);\n    const row = rows[0];\n    return row === undefined ? undefined : TasksRepository.toTask(row);\n  }\n\n  public async create(title: string): Promise\u003CTask> {\n    const [row] = await this.database.getOrm().insert(tasks).values({ title, done: 0 }).returning();\n    if (row === undefined) {\n      throw new Error(\"Insert returned no row.\");\n    }\n    return TasksRepository.toTask(row);\n  }\n\n  private static toTask(row: TaskRow): Task {\n    return { id: row.id, title: row.title, done: row.done === 1 };\n  }\n}\n","src\u002Ftasks\u002Ftasks.repository.ts",[518,1514,1515,1538,1564,1585,1612,1616,1628,1643,1657,1671,1676,1680,1696,1713,1718,1740,1754,1760,1765,1791,1822,1828,1834,1840,1846,1852,1862,1867,1872,1898,1957,1997,2002,2007,2044,2118,2140,2174,2179,2184,2214,2284,2302,2326,2332,2351,2356,2361,2386,2435,2440],{"__ignoreMap":516},[521,1516,1517,1519,1521,1523,1526,1528,1530,1532,1534,1536],{"class":523,"line":524},[521,1518,607],{"class":606},[521,1520,610],{"class":544},[521,1522,895],{"class":606},[521,1524,1525],{"class":613}," OnInit",[521,1527,617],{"class":544},[521,1529,620],{"class":606},[521,1531,623],{"class":544},[521,1533,1319],{"class":531},[521,1535,629],{"class":544},[521,1537,632],{"class":544},[521,1539,1540,1542,1544,1547,1549,1552,1554,1556,1558,1560,1562],{"class":523,"line":565},[521,1541,607],{"class":606},[521,1543,610],{"class":544},[521,1545,1546],{"class":613}," eq",[521,1548,644],{"class":544},[521,1550,1551],{"class":613}," sql",[521,1553,617],{"class":544},[521,1555,620],{"class":606},[521,1557,623],{"class":544},[521,1559,626],{"class":531},[521,1561,629],{"class":544},[521,1563,632],{"class":544},[521,1565,1566,1568,1570,1572,1574,1576,1578,1581,1583],{"class":523,"line":668},[521,1567,607],{"class":606},[521,1569,610],{"class":544},[521,1571,1234],{"class":613},[521,1573,617],{"class":544},[521,1575,620],{"class":606},[521,1577,623],{"class":544},[521,1579,1580],{"class":531},"..\u002Fdatabase\u002Fapp-database",[521,1582,629],{"class":544},[521,1584,632],{"class":544},[521,1586,1587,1589,1591,1593,1595,1597,1599,1601,1603,1605,1608,1610],{"class":523,"line":675},[521,1588,607],{"class":606},[521,1590,610],{"class":544},[521,1592,907],{"class":613},[521,1594,644],{"class":544},[521,1596,895],{"class":606},[521,1598,898],{"class":613},[521,1600,617],{"class":544},[521,1602,620],{"class":606},[521,1604,623],{"class":544},[521,1606,1607],{"class":531},"..\u002Fdatabase\u002Fschema",[521,1609,629],{"class":544},[521,1611,632],{"class":544},[521,1613,1614],{"class":523,"line":708},[521,1615,672],{"emptyLinePlaceholder":671},[521,1617,1618,1620,1623,1626],{"class":523,"line":759},[521,1619,678],{"class":606},[521,1621,1622],{"class":681}," interface",[521,1624,1625],{"class":527}," Task",[521,1627,705],{"class":544},[521,1629,1630,1633,1636,1638,1641],{"class":523,"line":790},[521,1631,1632],{"class":681},"  readonly",[521,1634,1635],{"class":711}," id",[521,1637,715],{"class":544},[521,1639,1640],{"class":527}," number",[521,1642,632],{"class":544},[521,1644,1645,1647,1650,1652,1655],{"class":523,"line":832},[521,1646,1632],{"class":681},[521,1648,1649],{"class":711}," title",[521,1651,715],{"class":544},[521,1653,1654],{"class":527}," string",[521,1656,632],{"class":544},[521,1658,1659,1661,1664,1666,1669],{"class":523,"line":842},[521,1660,1632],{"class":681},[521,1662,1663],{"class":711}," done",[521,1665,715],{"class":544},[521,1667,1668],{"class":527}," boolean",[521,1670,632],{"class":544},[521,1672,1673],{"class":523,"line":847},[521,1674,1675],{"class":544},"}\n",[521,1677,1678],{"class":523,"line":866},[521,1679,672],{"emptyLinePlaceholder":671},[521,1681,1682,1684,1686,1689,1692,1694],{"class":523,"line":885},[521,1683,678],{"class":606},[521,1685,1231],{"class":681},[521,1687,1688],{"class":527}," TasksRepository",[521,1690,1691],{"class":681}," implements",[521,1693,1525],{"class":527},[521,1695,705],{"class":544},[521,1697,1698,1701,1704,1707,1709,1711],{"class":523,"line":890},[521,1699,1700],{"class":681},"  private",[521,1702,1703],{"class":681}," readonly",[521,1705,1706],{"class":711}," database",[521,1708,715],{"class":544},[521,1710,1234],{"class":527},[521,1712,632],{"class":544},[521,1714,1716],{"class":523,"line":1715},14,[521,1717,672],{"emptyLinePlaceholder":671},[521,1719,1721,1724,1727,1729,1732,1734,1736,1738],{"class":523,"line":1720},15,[521,1722,1723],{"class":681},"  public",[521,1725,1726],{"class":681}," constructor",[521,1728,694],{"class":544},[521,1730,1731],{"class":1426},"database",[521,1733,715],{"class":544},[521,1735,1234],{"class":527},[521,1737,729],{"class":544},[521,1739,705],{"class":544},[521,1741,1743,1746,1748,1750,1752],{"class":523,"line":1742},16,[521,1744,1745],{"class":544},"    this.",[521,1747,1731],{"class":613},[521,1749,901],{"class":544},[521,1751,1706],{"class":613},[521,1753,632],{"class":544},[521,1755,1757],{"class":523,"line":1756},17,[521,1758,1759],{"class":544},"  }\n",[521,1761,1763],{"class":523,"line":1762},18,[521,1764,672],{"emptyLinePlaceholder":671},[521,1766,1768,1770,1773,1776,1779,1782,1784,1787,1789],{"class":523,"line":1767},19,[521,1769,1723],{"class":681},[521,1771,1772],{"class":681}," async",[521,1774,1775],{"class":711}," onInit",[521,1777,1778],{"class":544},"():",[521,1780,1781],{"class":527}," Promise",[521,1783,1242],{"class":544},[521,1785,1786],{"class":527},"void",[521,1788,1252],{"class":544},[521,1790,705],{"class":544},[521,1792,1794,1797,1800,1802,1804,1807,1809,1811,1814,1816,1819],{"class":523,"line":1793},20,[521,1795,1796],{"class":606},"    await",[521,1798,1799],{"class":544}," this.",[521,1801,1731],{"class":613},[521,1803,732],{"class":544},[521,1805,1806],{"class":691},"getOrm",[521,1808,785],{"class":711},[521,1810,732],{"class":544},[521,1812,1813],{"class":691},"run",[521,1815,694],{"class":711},[521,1817,1818],{"class":691},"sql",[521,1820,1821],{"class":544},"`\n",[521,1823,1825],{"class":523,"line":1824},21,[521,1826,1827],{"class":531},"      CREATE TABLE IF NOT EXISTS tasks (\n",[521,1829,1831],{"class":523,"line":1830},22,[521,1832,1833],{"class":531},"        id    INTEGER PRIMARY KEY AUTOINCREMENT,\n",[521,1835,1837],{"class":523,"line":1836},23,[521,1838,1839],{"class":531},"        title TEXT NOT NULL,\n",[521,1841,1843],{"class":523,"line":1842},24,[521,1844,1845],{"class":531},"        done  INTEGER NOT NULL DEFAULT 0\n",[521,1847,1849],{"class":523,"line":1848},25,[521,1850,1851],{"class":531},"      )\n",[521,1853,1855,1858,1860],{"class":523,"line":1854},26,[521,1856,1857],{"class":544},"    `",[521,1859,729],{"class":711},[521,1861,632],{"class":544},[521,1863,1865],{"class":523,"line":1864},27,[521,1866,1759],{"class":544},[521,1868,1870],{"class":523,"line":1869},28,[521,1871,672],{"emptyLinePlaceholder":671},[521,1873,1875,1877,1879,1882,1884,1886,1888,1891,1894,1896],{"class":523,"line":1874},29,[521,1876,1723],{"class":681},[521,1878,1772],{"class":681},[521,1880,1881],{"class":711}," list",[521,1883,1778],{"class":544},[521,1885,1781],{"class":527},[521,1887,1242],{"class":544},[521,1889,1890],{"class":527},"Task",[521,1892,1893],{"class":613},"[]",[521,1895,1252],{"class":544},[521,1897,705],{"class":544},[521,1899,1901,1904,1907,1909,1912,1914,1916,1918,1920,1922,1924,1927,1929,1931,1934,1936,1938,1940,1942,1945,1947,1949,1951,1953,1955],{"class":523,"line":1900},30,[521,1902,1903],{"class":681},"    const",[521,1905,1906],{"class":613}," rows",[521,1908,901],{"class":544},[521,1910,1911],{"class":606}," await",[521,1913,1799],{"class":544},[521,1915,1731],{"class":613},[521,1917,732],{"class":544},[521,1919,1806],{"class":691},[521,1921,785],{"class":711},[521,1923,732],{"class":544},[521,1925,1926],{"class":691},"select",[521,1928,785],{"class":711},[521,1930,732],{"class":544},[521,1932,1933],{"class":691},"from",[521,1935,694],{"class":711},[521,1937,576],{"class":613},[521,1939,729],{"class":711},[521,1941,732],{"class":544},[521,1943,1944],{"class":691},"orderBy",[521,1946,694],{"class":711},[521,1948,576],{"class":613},[521,1950,732],{"class":544},[521,1952,724],{"class":613},[521,1954,729],{"class":711},[521,1956,632],{"class":544},[521,1958,1960,1963,1965,1967,1970,1972,1974,1977,1979,1981,1983,1985,1988,1990,1992,1995],{"class":523,"line":1959},31,[521,1961,1962],{"class":606},"    return",[521,1964,1906],{"class":613},[521,1966,732],{"class":544},[521,1968,1969],{"class":691},"map",[521,1971,694],{"class":711},[521,1973,694],{"class":544},[521,1975,1976],{"class":1426},"row",[521,1978,729],{"class":544},[521,1980,1436],{"class":681},[521,1982,1688],{"class":613},[521,1984,732],{"class":544},[521,1986,1987],{"class":691},"toTask",[521,1989,694],{"class":711},[521,1991,1976],{"class":613},[521,1993,1994],{"class":711},"))",[521,1996,632],{"class":544},[521,1998,2000],{"class":523,"line":1999},32,[521,2001,1759],{"class":544},[521,2003,2005],{"class":523,"line":2004},33,[521,2006,672],{"emptyLinePlaceholder":671},[521,2008,2010,2012,2014,2017,2019,2021,2023,2025,2028,2030,2032,2034,2037,2040,2042],{"class":523,"line":2009},34,[521,2011,1723],{"class":681},[521,2013,1772],{"class":681},[521,2015,2016],{"class":711}," findById",[521,2018,694],{"class":544},[521,2020,724],{"class":1426},[521,2022,715],{"class":544},[521,2024,1640],{"class":527},[521,2026,2027],{"class":544},"):",[521,2029,1781],{"class":527},[521,2031,1242],{"class":544},[521,2033,1890],{"class":527},[521,2035,2036],{"class":544}," |",[521,2038,2039],{"class":527}," undefined",[521,2041,1252],{"class":544},[521,2043,705],{"class":544},[521,2045,2047,2049,2051,2053,2055,2057,2059,2061,2063,2065,2067,2069,2071,2073,2075,2077,2079,2081,2083,2086,2088,2091,2093,2095,2097,2099,2101,2103,2105,2107,2110,2112,2114,2116],{"class":523,"line":2046},35,[521,2048,1903],{"class":681},[521,2050,1906],{"class":613},[521,2052,901],{"class":544},[521,2054,1911],{"class":606},[521,2056,1799],{"class":544},[521,2058,1731],{"class":613},[521,2060,732],{"class":544},[521,2062,1806],{"class":691},[521,2064,785],{"class":711},[521,2066,732],{"class":544},[521,2068,1926],{"class":691},[521,2070,785],{"class":711},[521,2072,732],{"class":544},[521,2074,1933],{"class":691},[521,2076,694],{"class":711},[521,2078,576],{"class":613},[521,2080,729],{"class":711},[521,2082,732],{"class":544},[521,2084,2085],{"class":691},"where",[521,2087,694],{"class":711},[521,2089,2090],{"class":691},"eq",[521,2092,694],{"class":711},[521,2094,576],{"class":613},[521,2096,732],{"class":544},[521,2098,724],{"class":613},[521,2100,644],{"class":544},[521,2102,1635],{"class":613},[521,2104,1994],{"class":711},[521,2106,732],{"class":544},[521,2108,2109],{"class":691},"limit",[521,2111,694],{"class":711},[521,2113,924],{"class":824},[521,2115,729],{"class":711},[521,2117,632],{"class":544},[521,2119,2121,2123,2126,2128,2130,2133,2135,2138],{"class":523,"line":2120},36,[521,2122,1903],{"class":681},[521,2124,2125],{"class":613}," row",[521,2127,901],{"class":544},[521,2129,1906],{"class":613},[521,2131,2132],{"class":711},"[",[521,2134,825],{"class":824},[521,2136,2137],{"class":711},"]",[521,2139,632],{"class":544},[521,2141,2143,2145,2147,2150,2152,2155,2157,2160,2162,2164,2166,2168,2170,2172],{"class":523,"line":2142},37,[521,2144,1962],{"class":606},[521,2146,2125],{"class":613},[521,2148,2149],{"class":544}," ===",[521,2151,2039],{"class":544},[521,2153,2154],{"class":544}," ?",[521,2156,2039],{"class":544},[521,2158,2159],{"class":544}," :",[521,2161,1688],{"class":613},[521,2163,732],{"class":544},[521,2165,1987],{"class":691},[521,2167,694],{"class":711},[521,2169,1976],{"class":613},[521,2171,729],{"class":711},[521,2173,632],{"class":544},[521,2175,2177],{"class":523,"line":2176},38,[521,2178,1759],{"class":544},[521,2180,2182],{"class":523,"line":2181},39,[521,2183,672],{"emptyLinePlaceholder":671},[521,2185,2187,2189,2191,2194,2196,2198,2200,2202,2204,2206,2208,2210,2212],{"class":523,"line":2186},40,[521,2188,1723],{"class":681},[521,2190,1772],{"class":681},[521,2192,2193],{"class":711}," create",[521,2195,694],{"class":544},[521,2197,773],{"class":1426},[521,2199,715],{"class":544},[521,2201,1654],{"class":527},[521,2203,2027],{"class":544},[521,2205,1781],{"class":527},[521,2207,1242],{"class":544},[521,2209,1890],{"class":527},[521,2211,1252],{"class":544},[521,2213,705],{"class":544},[521,2215,2217,2219,2222,2224,2226,2228,2230,2232,2234,2236,2238,2240,2242,2245,2247,2249,2251,2253,2256,2258,2260,2262,2264,2266,2268,2271,2273,2275,2277,2280,2282],{"class":523,"line":2216},41,[521,2218,1903],{"class":681},[521,2220,2221],{"class":544}," [",[521,2223,1976],{"class":613},[521,2225,2137],{"class":544},[521,2227,901],{"class":544},[521,2229,1911],{"class":606},[521,2231,1799],{"class":544},[521,2233,1731],{"class":613},[521,2235,732],{"class":544},[521,2237,1806],{"class":691},[521,2239,785],{"class":711},[521,2241,732],{"class":544},[521,2243,2244],{"class":691},"insert",[521,2246,694],{"class":711},[521,2248,576],{"class":613},[521,2250,729],{"class":711},[521,2252,732],{"class":544},[521,2254,2255],{"class":691},"values",[521,2257,694],{"class":711},[521,2259,740],{"class":544},[521,2261,1649],{"class":613},[521,2263,644],{"class":544},[521,2265,1663],{"class":711},[521,2267,715],{"class":544},[521,2269,2270],{"class":824}," 0",[521,2272,617],{"class":544},[521,2274,729],{"class":711},[521,2276,732],{"class":544},[521,2278,2279],{"class":691},"returning",[521,2281,785],{"class":711},[521,2283,632],{"class":544},[521,2285,2287,2290,2292,2294,2296,2298,2300],{"class":523,"line":2286},42,[521,2288,2289],{"class":606},"    if",[521,2291,1423],{"class":711},[521,2293,1976],{"class":613},[521,2295,2149],{"class":544},[521,2297,2039],{"class":544},[521,2299,1481],{"class":711},[521,2301,1387],{"class":544},[521,2303,2305,2308,2310,2313,2315,2317,2320,2322,2324],{"class":523,"line":2304},43,[521,2306,2307],{"class":606},"      throw",[521,2309,1021],{"class":544},[521,2311,2312],{"class":691}," Error",[521,2314,694],{"class":711},[521,2316,629],{"class":544},[521,2318,2319],{"class":531},"Insert returned no row.",[521,2321,629],{"class":544},[521,2323,729],{"class":711},[521,2325,632],{"class":544},[521,2327,2329],{"class":523,"line":2328},44,[521,2330,2331],{"class":544},"    }\n",[521,2333,2335,2337,2339,2341,2343,2345,2347,2349],{"class":523,"line":2334},45,[521,2336,1962],{"class":606},[521,2338,1688],{"class":613},[521,2340,732],{"class":544},[521,2342,1987],{"class":691},[521,2344,694],{"class":711},[521,2346,1976],{"class":613},[521,2348,729],{"class":711},[521,2350,632],{"class":544},[521,2352,2354],{"class":523,"line":2353},46,[521,2355,1759],{"class":544},[521,2357,2359],{"class":523,"line":2358},47,[521,2360,672],{"emptyLinePlaceholder":671},[521,2362,2364,2366,2369,2372,2374,2376,2378,2380,2382,2384],{"class":523,"line":2363},48,[521,2365,1700],{"class":681},[521,2367,2368],{"class":681}," static",[521,2370,2371],{"class":711}," toTask",[521,2373,694],{"class":544},[521,2375,1976],{"class":1426},[521,2377,715],{"class":544},[521,2379,898],{"class":527},[521,2381,2027],{"class":544},[521,2383,1625],{"class":527},[521,2385,705],{"class":544},[521,2387,2389,2391,2393,2395,2397,2399,2401,2403,2405,2407,2409,2411,2413,2415,2417,2419,2421,2423,2425,2427,2429,2432],{"class":523,"line":2388},49,[521,2390,1962],{"class":606},[521,2392,610],{"class":544},[521,2394,1635],{"class":711},[521,2396,715],{"class":544},[521,2398,2125],{"class":613},[521,2400,732],{"class":544},[521,2402,724],{"class":613},[521,2404,644],{"class":544},[521,2406,1649],{"class":711},[521,2408,715],{"class":544},[521,2410,2125],{"class":613},[521,2412,732],{"class":544},[521,2414,773],{"class":613},[521,2416,644],{"class":544},[521,2418,1663],{"class":711},[521,2420,715],{"class":544},[521,2422,2125],{"class":613},[521,2424,732],{"class":544},[521,2426,804],{"class":613},[521,2428,2149],{"class":544},[521,2430,2431],{"class":824}," 1",[521,2433,2434],{"class":544}," };\n",[521,2436,2438],{"class":523,"line":2437},50,[521,2439,1759],{"class":544},[521,2441,2443],{"class":523,"line":2442},51,[521,2444,1675],{"class":544},[499,2446,2447,2450,2451,2454,2455,2458,2459,2463],{},[518,2448,2449],{},"onInit"," runs once, in dependency order, the first time something resolves ",[518,2452,2453],{},"TasksRepository"," — in\npractice, the first request that hits ",[518,2456,2457],{},"\u002Ftasks"," — and it completes before any repository method runs. That\nmakes it the right place to create a table for an in-memory database that starts empty on every boot. A file-backed or\nhosted database wouldn't do this; see ",[503,2460,2462],{"href":2461},"#toward-production","Toward production"," below.",[587,2465,2467],{"id":2466},"wire-the-controller","Wire the controller",[499,2469,2470,2471,2473],{},"The controller side is nothing new: a plain class injecting the repository, with routes declared by each\nhandler's action parameter type — see ",[503,2472,57],{"href":58}," for the full mechanics.",[510,2475,2477],{"className":596,"code":2476,"language":599,"meta":516,"style":516},"export class TasksController implements Controller\u003C\"\u002Ftasks\"> {\n  public constructor(private readonly tasks: TasksRepository) {}\n\n  public async list(_action: Get\u003C\"\u002F\">): Promise\u003CTask[]> {\n    return this.tasks.list();\n  }\n}\n",[518,2478,2479,2505,2528,2532,2573,2590,2594],{"__ignoreMap":516},[521,2480,2481,2483,2485,2488,2490,2493,2495,2497,2499,2501,2503],{"class":523,"line":524},[521,2482,678],{"class":606},[521,2484,1231],{"class":681},[521,2486,2487],{"class":527}," TasksController",[521,2489,1691],{"class":681},[521,2491,2492],{"class":527}," Controller",[521,2494,1242],{"class":544},[521,2496,629],{"class":544},[521,2498,2457],{"class":531},[521,2500,629],{"class":544},[521,2502,1252],{"class":544},[521,2504,705],{"class":544},[521,2506,2507,2509,2511,2513,2516,2518,2520,2522,2524,2526],{"class":523,"line":565},[521,2508,1723],{"class":681},[521,2510,1726],{"class":681},[521,2512,694],{"class":544},[521,2514,2515],{"class":681},"private",[521,2517,1703],{"class":681},[521,2519,907],{"class":1426},[521,2521,715],{"class":544},[521,2523,1688],{"class":527},[521,2525,729],{"class":544},[521,2527,1255],{"class":544},[521,2529,2530],{"class":523,"line":668},[521,2531,672],{"emptyLinePlaceholder":671},[521,2533,2534,2536,2538,2540,2542,2545,2547,2550,2552,2554,2556,2558,2561,2563,2565,2567,2569,2571],{"class":523,"line":675},[521,2535,1723],{"class":681},[521,2537,1772],{"class":681},[521,2539,1881],{"class":711},[521,2541,694],{"class":544},[521,2543,2544],{"class":1426},"_action",[521,2546,715],{"class":544},[521,2548,2549],{"class":527}," Get",[521,2551,1242],{"class":544},[521,2553,629],{"class":544},[521,2555,581],{"class":531},[521,2557,629],{"class":544},[521,2559,2560],{"class":544},">):",[521,2562,1781],{"class":527},[521,2564,1242],{"class":544},[521,2566,1890],{"class":527},[521,2568,1893],{"class":613},[521,2570,1252],{"class":544},[521,2572,705],{"class":544},[521,2574,2575,2577,2579,2581,2583,2586,2588],{"class":523,"line":708},[521,2576,1962],{"class":606},[521,2578,1799],{"class":544},[521,2580,576],{"class":613},[521,2582,732],{"class":544},[521,2584,2585],{"class":691},"list",[521,2587,785],{"class":711},[521,2589,632],{"class":544},[521,2591,2592],{"class":523,"line":759},[521,2593,1759],{"class":544},[521,2595,2596],{"class":523,"line":790},[521,2597,1675],{"class":544},[499,2599,2600,2601,2603,2604,2606],{},"The feature module imports ",[518,2602,1490],{}," so its provider can inject ",[518,2605,1265],{},", then declares the\nrepository and controller like any other feature:",[510,2608,2611],{"className":596,"code":2609,"filename":2610,"language":599,"meta":516,"style":516},"import { Module } from \"@heximon\u002Fruntime\";\nimport { DatabaseModule } from \"..\u002Fdatabase\u002Fdatabase.module\";\nimport { TasksController } from \".\u002Ftasks.controller\";\nimport { TasksRepository } from \".\u002Ftasks.repository\";\n\nexport class TasksModule extends Module({\n  imports: [DatabaseModule],\n  providers: [TasksRepository],\n  http: { controllers: [TasksController] },\n  exports: [TasksRepository],\n}) {}\n","src\u002Ftasks\u002Ftasks.module.ts",[518,2612,2613,2633,2654,2675,2696,2700,2717,2729,2740,2760,2770],{"__ignoreMap":516},[521,2614,2615,2617,2619,2621,2623,2625,2627,2629,2631],{"class":523,"line":524},[521,2616,607],{"class":606},[521,2618,610],{"class":544},[521,2620,1310],{"class":613},[521,2622,617],{"class":544},[521,2624,620],{"class":606},[521,2626,623],{"class":544},[521,2628,1319],{"class":531},[521,2630,629],{"class":544},[521,2632,632],{"class":544},[521,2634,2635,2637,2639,2641,2643,2645,2647,2650,2652],{"class":523,"line":565},[521,2636,607],{"class":606},[521,2638,610],{"class":544},[521,2640,1378],{"class":613},[521,2642,617],{"class":544},[521,2644,620],{"class":606},[521,2646,623],{"class":544},[521,2648,2649],{"class":531},"..\u002Fdatabase\u002Fdatabase.module",[521,2651,629],{"class":544},[521,2653,632],{"class":544},[521,2655,2656,2658,2660,2662,2664,2666,2668,2671,2673],{"class":523,"line":668},[521,2657,607],{"class":606},[521,2659,610],{"class":544},[521,2661,2487],{"class":613},[521,2663,617],{"class":544},[521,2665,620],{"class":606},[521,2667,623],{"class":544},[521,2669,2670],{"class":531},".\u002Ftasks.controller",[521,2672,629],{"class":544},[521,2674,632],{"class":544},[521,2676,2677,2679,2681,2683,2685,2687,2689,2692,2694],{"class":523,"line":675},[521,2678,607],{"class":606},[521,2680,610],{"class":544},[521,2682,1688],{"class":613},[521,2684,617],{"class":544},[521,2686,620],{"class":606},[521,2688,623],{"class":544},[521,2690,2691],{"class":531},".\u002Ftasks.repository",[521,2693,629],{"class":544},[521,2695,632],{"class":544},[521,2697,2698],{"class":523,"line":708},[521,2699,672],{"emptyLinePlaceholder":671},[521,2701,2702,2704,2706,2709,2711,2713,2715],{"class":523,"line":759},[521,2703,678],{"class":606},[521,2705,1231],{"class":681},[521,2707,2708],{"class":527}," TasksModule",[521,2710,1237],{"class":681},[521,2712,1310],{"class":691},[521,2714,694],{"class":613},[521,2716,1387],{"class":544},[521,2718,2719,2722,2724,2727],{"class":523,"line":790},[521,2720,2721],{"class":711},"  imports",[521,2723,715],{"class":544},[521,2725,2726],{"class":613}," [DatabaseModule]",[521,2728,756],{"class":544},[521,2730,2731,2733,2735,2738],{"class":523,"line":832},[521,2732,1392],{"class":711},[521,2734,715],{"class":544},[521,2736,2737],{"class":613}," [TasksRepository]",[521,2739,756],{"class":544},[521,2741,2742,2745,2747,2749,2752,2754,2757],{"class":523,"line":842},[521,2743,2744],{"class":711},"  http",[521,2746,715],{"class":544},[521,2748,610],{"class":544},[521,2750,2751],{"class":711}," controllers",[521,2753,715],{"class":544},[521,2755,2756],{"class":613}," [TasksController] ",[521,2758,2759],{"class":544},"},\n",[521,2761,2762,2764,2766,2768],{"class":523,"line":847},[521,2763,1467],{"class":711},[521,2765,715],{"class":544},[521,2767,2737],{"class":613},[521,2769,756],{"class":544},[521,2771,2772,2774,2776],{"class":523,"line":866},[521,2773,835],{"class":544},[521,2775,1481],{"class":613},[521,2777,1484],{"class":544},[499,2779,2780],{},"The only compiler plugin this app registers is the HTTP one, for the controller — the database needs\nnone:",[510,2782,2785],{"className":596,"code":2783,"filename":2784,"language":599,"meta":516,"style":516},"import { defineHeximonConfig } from \"@heximon\u002Fbuild\";\nimport { HttpPlugin } from \"@heximon\u002Fhttp\u002Fcompiler\";\n\nexport default defineHeximonConfig({ plugins: [new HttpPlugin()] });\n","heximon.config.ts",[518,2786,2787,2809,2831,2835],{"__ignoreMap":516},[521,2788,2789,2791,2793,2796,2798,2800,2802,2805,2807],{"class":523,"line":524},[521,2790,607],{"class":606},[521,2792,610],{"class":544},[521,2794,2795],{"class":613}," defineHeximonConfig",[521,2797,617],{"class":544},[521,2799,620],{"class":606},[521,2801,623],{"class":544},[521,2803,2804],{"class":531},"@heximon\u002Fbuild",[521,2806,629],{"class":544},[521,2808,632],{"class":544},[521,2810,2811,2813,2815,2818,2820,2822,2824,2827,2829],{"class":523,"line":565},[521,2812,607],{"class":606},[521,2814,610],{"class":544},[521,2816,2817],{"class":613}," HttpPlugin",[521,2819,617],{"class":544},[521,2821,620],{"class":606},[521,2823,623],{"class":544},[521,2825,2826],{"class":531},"@heximon\u002Fhttp\u002Fcompiler",[521,2828,629],{"class":544},[521,2830,632],{"class":544},[521,2832,2833],{"class":523,"line":668},[521,2834,672],{"emptyLinePlaceholder":671},[521,2836,2837,2839,2842,2844,2846,2848,2851,2853,2855,2858,2860,2863,2865,2867],{"class":523,"line":675},[521,2838,678],{"class":606},[521,2840,2841],{"class":606}," default",[521,2843,2795],{"class":691},[521,2845,694],{"class":613},[521,2847,740],{"class":544},[521,2849,2850],{"class":711}," plugins",[521,2852,715],{"class":544},[521,2854,2221],{"class":613},[521,2856,2857],{"class":544},"new",[521,2859,2817],{"class":691},[521,2861,2862],{"class":613},"()] ",[521,2864,835],{"class":544},[521,2866,729],{"class":613},[521,2868,632],{"class":544},[587,2870,2462],{"id":2871},"toward-production",[499,2873,2874,2875,2877,2878,2881,2882,2885,2886,2889,2890,2893],{},"Swap ",[518,2876,1149],{}," in ",[518,2879,2880],{},"database.config.ts"," for ",[518,2883,2884],{},"url: \"file:.\u002Fapp.db\""," to persist between restarts, or\na ",[518,2887,2888],{},"libsql:\u002F\u002F…"," Turso URL (with an ",[518,2891,2892],{},"authToken",") for a hosted database.",[499,2895,2896,2897,2877,2900,2902,2903,732],{},"Once the database survives a restart, the boot-time ",[518,2898,2899],{},"CREATE TABLE",[518,2901,2449],{}," stops being safe — a second\nboot would run against a database that already has the table, and a real schema change needs a real\nmigration. Generate one with the same unified config and apply it with an injectable runner instead: see\n",[503,2904,92],{"href":93},[2906,2907,2909,2910,2912],"callout",{"type":2908},"tip","This repository is hand-rolled CRUD, and that's the right tool while your persistence logic stays\nstraightforward. When your domain earns richer modeling — richer column mapping, optimistic\nconcurrency on every update, automatic row-to-object mapping — see\n",[503,2911,82],{"href":83}," for the repository base that does it for you.",[587,2914,2916],{"id":2915},"next-steps","Next steps",[2918,2919,2920,2935,2942],"ul",{},[2921,2922,2923,2927,2928,2931,2932,732],"li",{},[503,2924,2925],{"href":93},[1282,2926,92],{}," — generate SQL with ",[518,2929,2930],{},"drizzle-kit generate"," against this\nsame config, then apply it at boot with an injectable ",[518,2933,2934],{},"MigrationRunner",[2921,2936,2937,2941],{},[503,2938,2939],{"href":83},[1282,2940,82],{}," — value-object columns, automatic row mapping, and\noptimistic concurrency once a repository outgrows hand-written queries.",[2921,2943,2944,2949,2950,2953,2954,732],{},[503,2945,2946],{"href":112},[1282,2947,2948],{},"Testing"," — drive this exact config → factory → repository → controller\nchain through real ",[518,2951,2952],{},"fetch(Request)"," calls with ",[518,2955,2956],{},"createTestApp",[587,2958,2960],{"id":2959},"see-also","See also",[2918,2962,2963],{},[2921,2964,2965,2972],{},[503,2966,2969],{"href":2967,"rel":2968},"https:\u002F\u002Fgithub.com\u002Fheximon\u002Fheximon\u002Ftree\u002Fmain\u002Fexamples\u002Fladder\u002FL04-database",[507],[1282,2970,2971],{},"Example L04 — Database"," —\nthe full CRUD API this page is built from, plus a test that compiles the app, boots the generated\nserver, and drives every route end to end.",[2974,2975,2976],"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .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}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":516,"searchDepth":565,"depth":565,"links":2978},[2979,2980,2981,2982,2984,2985,2986,2987,2988],{"id":589,"depth":565,"text":590},{"id":940,"depth":565,"text":941},{"id":1157,"depth":565,"text":1158},{"id":1269,"depth":565,"text":2983},"Provide it with a useFactory — no compiler plugin",{"id":1497,"depth":565,"text":1498},{"id":2466,"depth":565,"text":2467},{"id":2871,"depth":565,"text":2462},{"id":2915,"depth":565,"text":2916},{"id":2959,"depth":565,"text":2960},"Wire a real SQLite database into a CRUD API with no install and no compiler plugin — the unified DrizzleLibSQLConfig, a named database DI token, a repository over getOrm(), and boot-time table creation.","md",null,{},{"icon":80},{"title":77,"description":2989},"oiw8ULhjgLBU0gVmGO1o4L9sxd-iDIVBFNOOCxJJKSY",[2997,2999],{"title":72,"path":73,"stem":74,"description":2998,"icon":75,"children":-1},"Call a shared Contract from the frontend by constructing it with a transport — ClientTransport.fetch, ClientTransport.internal, and ClientTransport.mock, throwing 2xx-body callers, raw() for the full status union, request\u002Fresponse interceptors, and vue-query bindings.",{"title":82,"path":83,"stem":84,"description":3000,"icon":85,"children":-1},"Map domain entities to Drizzle tables — value-object columns, DDD repositories, optimistic concurrency, relations, nested transactions, and seven dialects (libsql, better-sqlite3, Cloudflare D1, Durable Object SQLite, Postgres, MySQL, Cloudflare Hyperdrive MySQL).",1783300761903]