[{"data":1,"prerenderedAt":3828},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fpackages\u002Fdrizzle":176,"\u002Fdocs\u002Fpackages\u002Fdrizzle-surround":3823},[4,21,86,158],{"title":5,"path":6,"stem":7,"children":8,"status":11,"icon":20},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,16],{"title":10,"path":6,"stem":7,"status":11},"Introduction",null,{"title":13,"path":14,"stem":15,"status":11},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F2.installation",{"title":17,"path":18,"stem":19,"status":11},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","1.docs\u002F1.getting-started\u002F3.quick-start",false,{"title":22,"path":23,"stem":24,"children":25,"status":11,"icon":20},"Core Concepts","\u002Fdocs\u002Fcore-concepts","1.docs\u002F2.core-concepts\u002F1.index",[26,28,32,36,46,50,54,58,62,66,70,74,78,82],{"title":27,"path":23,"stem":24,"status":11},"Overview",{"title":29,"path":30,"stem":31,"status":11},"Response","\u002Fdocs\u002Fcore-concepts\u002Fresponse","1.docs\u002F2.core-concepts\u002F10.response",{"title":33,"path":34,"stem":35,"status":11},"Testing","\u002Fdocs\u002Fcore-concepts\u002Ftesting","1.docs\u002F2.core-concepts\u002F12.testing",{"title":37,"path":38,"stem":39,"children":40,"status":11,"icon":20,"defaultOpen":20},"Decorators","\u002Fdocs\u002Fcore-concepts\u002Fdecorators","1.docs\u002F2.core-concepts\u002F13.decorators\u002F1.index",[41,42],{"title":27,"path":38,"stem":39,"status":11},{"title":43,"path":44,"stem":45,"status":11},"Custom","\u002Fdocs\u002Fcore-concepts\u002Fdecorators\u002Fcustom","1.docs\u002F2.core-concepts\u002F13.decorators\u002F2.custom",{"title":47,"path":48,"stem":49,"status":11},"Discovery Service","\u002Fdocs\u002Fcore-concepts\u002Fdiscovery","1.docs\u002F2.core-concepts\u002F14.discovery",{"title":51,"path":52,"stem":53,"status":11},"Application Lifecycle","\u002Fdocs\u002Fcore-concepts\u002Fapp-lifecycle","1.docs\u002F2.core-concepts\u002F15.app-lifecycle",{"title":55,"path":56,"stem":57,"status":11},"Controllers","\u002Fdocs\u002Fcore-concepts\u002Fcontrollers","1.docs\u002F2.core-concepts\u002F2.controllers",{"title":59,"path":60,"stem":61,"status":11},"Routing","\u002Fdocs\u002Fcore-concepts\u002Frouting","1.docs\u002F2.core-concepts\u002F3.routing",{"title":63,"path":64,"stem":65,"status":11},"Providers","\u002Fdocs\u002Fcore-concepts\u002Fproviders","1.docs\u002F2.core-concepts\u002F4.providers",{"title":67,"path":68,"stem":69,"status":11},"Modules","\u002Fdocs\u002Fcore-concepts\u002Fmodules","1.docs\u002F2.core-concepts\u002F5.modules",{"title":71,"path":72,"stem":73,"status":11},"Configuration","\u002Fdocs\u002Fcore-concepts\u002Fconfiguration","1.docs\u002F2.core-concepts\u002F6.configuration",{"title":75,"path":76,"stem":77,"status":11},"Middleware","\u002Fdocs\u002Fcore-concepts\u002Fmiddleware","1.docs\u002F2.core-concepts\u002F7.middleware",{"title":79,"path":80,"stem":81,"status":11},"Guards","\u002Fdocs\u002Fcore-concepts\u002Fguards","1.docs\u002F2.core-concepts\u002F8.guards",{"title":83,"path":84,"stem":85,"status":11},"Exceptions","\u002Fdocs\u002Fcore-concepts\u002Fexceptions","1.docs\u002F2.core-concepts\u002F9.exceptions",{"title":87,"path":88,"stem":89,"children":90,"status":11,"icon":20},"Packages","\u002Fdocs\u002Fpackages","1.docs\u002F3.packages\u002F1.index",[91,92,97,108,112,130,134,138,142,146,150,154],{"title":27,"path":88,"stem":89,"status":11},{"title":93,"path":94,"stem":95,"status":96},"CLI","\u002Fdocs\u002Fpackages\u002Fcli","1.docs\u002F3.packages\u002F10.cli","experimental",{"title":98,"path":99,"stem":100,"children":101,"status":11,"icon":20,"defaultOpen":20},"Events","\u002Fdocs\u002Fpackages\u002Fmessaging","1.docs\u002F3.packages\u002F11.messaging\u002F1.index",[102,104],{"title":27,"path":99,"stem":100,"status":103},"beta",{"title":105,"path":106,"stem":107,"status":96},"Redis","\u002Fdocs\u002Fpackages\u002Fmessaging\u002Fredis","1.docs\u002F3.packages\u002F11.messaging\u002F2.redis",{"title":109,"path":110,"stem":111,"status":103},"Serve Static","\u002Fdocs\u002Fpackages\u002Fserve-static","1.docs\u002F3.packages\u002F12.serve-static",{"title":113,"path":114,"stem":115,"children":116,"status":11,"icon":20,"defaultOpen":20},"Auth","\u002Fdocs\u002Fpackages\u002Fauth","1.docs\u002F3.packages\u002F2.auth\u002F1.index",[117,118,122,126],{"title":27,"path":114,"stem":115,"status":103},{"title":119,"path":120,"stem":121,"status":103},"JWT Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Fjwt","1.docs\u002F3.packages\u002F2.auth\u002F2.jwt",{"title":123,"path":124,"stem":125,"status":103},"Local Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Flocal","1.docs\u002F3.packages\u002F2.auth\u002F3.local",{"title":127,"path":128,"stem":129,"status":96},"OAuth2 Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Foauth2","1.docs\u002F3.packages\u002F2.auth\u002F4.oauth2",{"title":131,"path":132,"stem":133,"status":103},"JWT","\u002Fdocs\u002Fpackages\u002Fjwt","1.docs\u002F3.packages\u002F3.jwt",{"title":135,"path":136,"stem":137,"status":103},"Drizzle","\u002Fdocs\u002Fpackages\u002Fdrizzle","1.docs\u002F3.packages\u002F4.drizzle",{"title":139,"path":140,"stem":141,"status":103},"Papr","\u002Fdocs\u002Fpackages\u002Fpapr","1.docs\u002F3.packages\u002F5.papr",{"title":143,"path":144,"stem":145,"status":103},"Mongoose","\u002Fdocs\u002Fpackages\u002Fmongoose","1.docs\u002F3.packages\u002F6.mongoose",{"title":147,"path":148,"stem":149,"status":103},"Swagger","\u002Fdocs\u002Fpackages\u002Fswagger","1.docs\u002F3.packages\u002F7.swagger",{"title":151,"path":152,"stem":153,"status":103},"Node Server","\u002Fdocs\u002Fpackages\u002Fnode-server","1.docs\u002F3.packages\u002F8.node-server",{"title":155,"path":156,"stem":157,"status":103},"uWS Server","\u002Fdocs\u002Fpackages\u002Fuws-server","1.docs\u002F3.packages\u002F9.uws-server",{"title":159,"path":160,"stem":161,"children":162,"status":11,"icon":20},"Roadmap","\u002Fdocs\u002Froadmap","1.docs\u002F4.roadmap\u002F1.index",[163,164,168,172],{"title":27,"path":160,"stem":161,"status":11},{"title":165,"path":166,"stem":167,"status":11},"Short term (0-3 months)","\u002Fdocs\u002Froadmap\u002Fshort-term","1.docs\u002F4.roadmap\u002F2.short-term",{"title":169,"path":170,"stem":171,"status":11},"Mid term (3-9 months)","\u002Fdocs\u002Froadmap\u002Fmid-term","1.docs\u002F4.roadmap\u002F3.mid-term",{"title":173,"path":174,"stem":175,"status":11},"Long term (9-12+ months)","\u002Fdocs\u002Froadmap\u002Flong-term","1.docs\u002F4.roadmap\u002F4.long-term",{"id":177,"title":135,"body":178,"description":3818,"extension":3819,"meta":3820,"navigation":363,"path":136,"seo":3821,"status":103,"stem":137,"__hash__":3822},"docs\u002F1.docs\u002F3.packages\u002F4.drizzle.md",{"type":179,"value":180,"toc":3799},"minimark",[181,197,201,220,293,297,302,495,506,684,688,851,855,858,1175,1179,1194,1235,1369,1373,1384,1490,2126,2130,2155,2171,2210,2214,2228,2309,2315,2380,2384,2400,2403,2471,2478,2606,2609,2648,2662,2692,2717,2737,2741,2748,2903,3149,3152,3235,3239,3302,3305,3309,3340,3343,3350,3653,3656,3727,3731,3795],[182,183,184,188,189,196],"p",{},[185,186,187],"code",{},"@miiajs\u002Fdrizzle"," integrates ",[190,191,195],"a",{"href":192,"rel":193},"https:\u002F\u002Form.drizzle.team",[194],"nofollow","Drizzle ORM"," with MiiaJS, providing connection management, retry logic, and DI-based access to the database.",[198,199,13],"h2",{"id":200},"installation",[182,202,203,204,207,208,211,212,215,216,219],{},"Install the core package and a database driver. MiiaJS is bun-native - swap ",[185,205,206],{},"bun add"," for ",[185,209,210],{},"npm install",", ",[185,213,214],{},"pnpm add",", or ",[185,217,218],{},"yarn add"," if you use a different package manager.",[221,222,223,255,274],"code-group",{},[224,225,231],"pre",{"className":226,"code":227,"filename":228,"language":229,"meta":230,"style":230},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bun add @miiajs\u002Fdrizzle drizzle-orm postgres\n","PostgreSQL","bash","",[185,232,233],{"__ignoreMap":230},[234,235,238,242,246,249,252],"span",{"class":236,"line":237},"line",1,[234,239,241],{"class":240},"sBMFI","bun",[234,243,245],{"class":244},"sfazB"," add",[234,247,248],{"class":244}," @miiajs\u002Fdrizzle",[234,250,251],{"class":244}," drizzle-orm",[234,253,254],{"class":244}," postgres\n",[224,256,259],{"className":226,"code":257,"filename":258,"language":229,"meta":230,"style":230},"bun add @miiajs\u002Fdrizzle drizzle-orm mysql2\n","MySQL",[185,260,261],{"__ignoreMap":230},[234,262,263,265,267,269,271],{"class":236,"line":237},[234,264,241],{"class":240},[234,266,245],{"class":244},[234,268,248],{"class":244},[234,270,251],{"class":244},[234,272,273],{"class":244}," mysql2\n",[224,275,278],{"className":226,"code":276,"filename":277,"language":229,"meta":230,"style":230},"bun add @miiajs\u002Fdrizzle drizzle-orm better-sqlite3\n","SQLite",[185,279,280],{"__ignoreMap":230},[234,281,282,284,286,288,290],{"class":236,"line":237},[234,283,241],{"class":240},[234,285,245],{"class":244},[234,287,248],{"class":244},[234,289,251],{"class":244},[234,291,292],{"class":244}," better-sqlite3\n",[198,294,296],{"id":295},"setup","Setup",[298,299,301],"h3",{"id":300},"configure-the-module","Configure the module",[224,303,307],{"className":304,"code":305,"language":306,"meta":230,"style":230},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Module } from '@miiajs\u002Fcore'\nimport { DrizzleModule } from '@miiajs\u002Fdrizzle'\n\n@Module({\n  imports: [\n    DrizzleModule.configure({\n      dialect: 'postgres',\n      connection: { url: 'postgres:\u002F\u002Flocalhost:5432\u002Fmydb' },\n    }),\n  ],\n})\nclass AppModule {}\n","typescript",[185,308,309,338,358,365,381,394,410,429,454,465,473,482],{"__ignoreMap":230},[234,310,311,315,319,323,326,329,332,335],{"class":236,"line":237},[234,312,314],{"class":313},"s7zQu","import",[234,316,318],{"class":317},"sMK4o"," {",[234,320,322],{"class":321},"sTEyZ"," Module",[234,324,325],{"class":317}," }",[234,327,328],{"class":313}," from",[234,330,331],{"class":317}," '",[234,333,334],{"class":244},"@miiajs\u002Fcore",[234,336,337],{"class":317},"'\n",[234,339,341,343,345,348,350,352,354,356],{"class":236,"line":340},2,[234,342,314],{"class":313},[234,344,318],{"class":317},[234,346,347],{"class":321}," DrizzleModule",[234,349,325],{"class":317},[234,351,328],{"class":313},[234,353,331],{"class":317},[234,355,187],{"class":244},[234,357,337],{"class":317},[234,359,361],{"class":236,"line":360},3,[234,362,364],{"emptyLinePlaceholder":363},true,"\n",[234,366,368,371,375,378],{"class":236,"line":367},4,[234,369,370],{"class":317},"@",[234,372,374],{"class":373},"s2Zo4","Module",[234,376,377],{"class":321},"(",[234,379,380],{"class":317},"{\n",[234,382,384,388,391],{"class":236,"line":383},5,[234,385,387],{"class":386},"swJcz","  imports",[234,389,390],{"class":317},":",[234,392,393],{"class":321}," [\n",[234,395,397,400,403,406,408],{"class":236,"line":396},6,[234,398,399],{"class":321},"    DrizzleModule",[234,401,402],{"class":317},".",[234,404,405],{"class":373},"configure",[234,407,377],{"class":321},[234,409,380],{"class":317},[234,411,413,416,418,420,423,426],{"class":236,"line":412},7,[234,414,415],{"class":386},"      dialect",[234,417,390],{"class":317},[234,419,331],{"class":317},[234,421,422],{"class":244},"postgres",[234,424,425],{"class":317},"'",[234,427,428],{"class":317},",\n",[234,430,432,435,437,439,442,444,446,449,451],{"class":236,"line":431},8,[234,433,434],{"class":386},"      connection",[234,436,390],{"class":317},[234,438,318],{"class":317},[234,440,441],{"class":386}," url",[234,443,390],{"class":317},[234,445,331],{"class":317},[234,447,448],{"class":244},"postgres:\u002F\u002Flocalhost:5432\u002Fmydb",[234,450,425],{"class":317},[234,452,453],{"class":317}," },\n",[234,455,457,460,463],{"class":236,"line":456},9,[234,458,459],{"class":317},"    }",[234,461,462],{"class":321},")",[234,464,428],{"class":317},[234,466,468,471],{"class":236,"line":467},10,[234,469,470],{"class":321},"  ]",[234,472,428],{"class":317},[234,474,476,479],{"class":236,"line":475},11,[234,477,478],{"class":317},"}",[234,480,481],{"class":321},")\n",[234,483,485,489,492],{"class":236,"line":484},12,[234,486,488],{"class":487},"spNyl","class",[234,490,491],{"class":240}," AppModule",[234,493,494],{"class":317}," {}\n",[182,496,497,498,501,502,505],{},"With ",[185,499,500],{},"ConfigService"," (from ",[185,503,504],{},"@miiajs\u002Fconfig","):",[224,507,509],{"className":304,"code":508,"language":306,"meta":230,"style":230},"import { ConfigService } from '@miiajs\u002Fconfig'\n\nDrizzleModule.configure((resolve) => {\n  const config = resolve(ConfigService)\n  return {\n    dialect: 'postgres',\n    connection: {\n      url: config.getOrThrow('DATABASE_URL'),\n      retry: { attempts: 10, delay: 10_000 },\n    },\n  }\n})\n",[185,510,511,530,534,559,579,586,601,610,637,668,673,678],{"__ignoreMap":230},[234,512,513,515,517,520,522,524,526,528],{"class":236,"line":237},[234,514,314],{"class":313},[234,516,318],{"class":317},[234,518,519],{"class":321}," ConfigService",[234,521,325],{"class":317},[234,523,328],{"class":313},[234,525,331],{"class":317},[234,527,504],{"class":244},[234,529,337],{"class":317},[234,531,532],{"class":236,"line":340},[234,533,364],{"emptyLinePlaceholder":363},[234,535,536,539,541,543,545,547,551,553,556],{"class":236,"line":360},[234,537,538],{"class":321},"DrizzleModule",[234,540,402],{"class":317},[234,542,405],{"class":373},[234,544,377],{"class":321},[234,546,377],{"class":317},[234,548,550],{"class":549},"sHdIc","resolve",[234,552,462],{"class":317},[234,554,555],{"class":487}," =>",[234,557,558],{"class":317}," {\n",[234,560,561,564,567,570,573,575,577],{"class":236,"line":367},[234,562,563],{"class":487},"  const",[234,565,566],{"class":321}," config",[234,568,569],{"class":317}," =",[234,571,572],{"class":373}," resolve",[234,574,377],{"class":386},[234,576,500],{"class":321},[234,578,481],{"class":386},[234,580,581,584],{"class":236,"line":383},[234,582,583],{"class":313},"  return",[234,585,558],{"class":317},[234,587,588,591,593,595,597,599],{"class":236,"line":396},[234,589,590],{"class":386},"    dialect",[234,592,390],{"class":317},[234,594,331],{"class":317},[234,596,422],{"class":244},[234,598,425],{"class":317},[234,600,428],{"class":317},[234,602,603,606,608],{"class":236,"line":412},[234,604,605],{"class":386},"    connection",[234,607,390],{"class":317},[234,609,558],{"class":317},[234,611,612,615,617,619,621,624,626,628,631,633,635],{"class":236,"line":431},[234,613,614],{"class":386},"      url",[234,616,390],{"class":317},[234,618,566],{"class":321},[234,620,402],{"class":317},[234,622,623],{"class":373},"getOrThrow",[234,625,377],{"class":386},[234,627,425],{"class":317},[234,629,630],{"class":244},"DATABASE_URL",[234,632,425],{"class":317},[234,634,462],{"class":386},[234,636,428],{"class":317},[234,638,639,642,644,646,649,651,655,658,661,663,666],{"class":236,"line":456},[234,640,641],{"class":386},"      retry",[234,643,390],{"class":317},[234,645,318],{"class":317},[234,647,648],{"class":386}," attempts",[234,650,390],{"class":317},[234,652,654],{"class":653},"sbssI"," 10",[234,656,657],{"class":317},",",[234,659,660],{"class":386}," delay",[234,662,390],{"class":317},[234,664,665],{"class":653}," 10_000",[234,667,453],{"class":317},[234,669,670],{"class":236,"line":467},[234,671,672],{"class":317},"    },\n",[234,674,675],{"class":236,"line":475},[234,676,677],{"class":317},"  }\n",[234,679,680,682],{"class":236,"line":484},[234,681,478],{"class":317},[234,683,481],{"class":321},[298,685,687],{"id":686},"configuration-options","Configuration options",[224,689,691],{"className":304,"code":690,"language":306,"meta":230,"style":230},"interface DrizzleModuleOptions {\n  dialect: 'postgres' | 'mysql' | 'sqlite'\n  connection: {\n    url: string\n    retry?: {\n      attempts?: number  \u002F\u002F Default: 10\n      delay?: number     \u002F\u002F Default: 10_000 ms\n    }\n  }\n  schema?: Record\u003Cstring, unknown>\n  casing?: 'snake_case' | 'camelCase'\n}\n",[185,692,693,703,735,744,754,764,778,790,795,799,823,846],{"__ignoreMap":230},[234,694,695,698,701],{"class":236,"line":237},[234,696,697],{"class":487},"interface",[234,699,700],{"class":240}," DrizzleModuleOptions",[234,702,558],{"class":317},[234,704,705,708,710,712,714,716,719,721,724,726,728,730,733],{"class":236,"line":340},[234,706,707],{"class":386},"  dialect",[234,709,390],{"class":317},[234,711,331],{"class":317},[234,713,422],{"class":244},[234,715,425],{"class":317},[234,717,718],{"class":317}," |",[234,720,331],{"class":317},[234,722,723],{"class":244},"mysql",[234,725,425],{"class":317},[234,727,718],{"class":317},[234,729,331],{"class":317},[234,731,732],{"class":244},"sqlite",[234,734,337],{"class":317},[234,736,737,740,742],{"class":236,"line":360},[234,738,739],{"class":386},"  connection",[234,741,390],{"class":317},[234,743,558],{"class":317},[234,745,746,749,751],{"class":236,"line":367},[234,747,748],{"class":386},"    url",[234,750,390],{"class":317},[234,752,753],{"class":240}," string\n",[234,755,756,759,762],{"class":236,"line":383},[234,757,758],{"class":386},"    retry",[234,760,761],{"class":317},"?:",[234,763,558],{"class":317},[234,765,766,769,771,774],{"class":236,"line":396},[234,767,768],{"class":386},"      attempts",[234,770,761],{"class":317},[234,772,773],{"class":240}," number",[234,775,777],{"class":776},"sHwdD","  \u002F\u002F Default: 10\n",[234,779,780,783,785,787],{"class":236,"line":412},[234,781,782],{"class":386},"      delay",[234,784,761],{"class":317},[234,786,773],{"class":240},[234,788,789],{"class":776},"     \u002F\u002F Default: 10_000 ms\n",[234,791,792],{"class":236,"line":431},[234,793,794],{"class":317},"    }\n",[234,796,797],{"class":236,"line":456},[234,798,677],{"class":317},[234,800,801,804,806,809,812,815,817,820],{"class":236,"line":467},[234,802,803],{"class":386},"  schema",[234,805,761],{"class":317},[234,807,808],{"class":240}," Record",[234,810,811],{"class":317},"\u003C",[234,813,814],{"class":240},"string",[234,816,657],{"class":317},[234,818,819],{"class":240}," unknown",[234,821,822],{"class":317},">\n",[234,824,825,828,830,832,835,837,839,841,844],{"class":236,"line":475},[234,826,827],{"class":386},"  casing",[234,829,761],{"class":317},[234,831,331],{"class":317},[234,833,834],{"class":244},"snake_case",[234,836,425],{"class":317},[234,838,718],{"class":317},[234,840,331],{"class":317},[234,842,843],{"class":244},"camelCase",[234,845,337],{"class":317},[234,847,848],{"class":236,"line":484},[234,849,850],{"class":317},"}\n",[198,852,854],{"id":853},"define-schemas","Define schemas",[182,856,857],{},"Use standard Drizzle table definitions:",[224,859,861],{"className":304,"code":860,"language":306,"meta":230,"style":230},"import { pgTable, serial, varchar, timestamp } from 'drizzle-orm\u002Fpg-core'\nimport { sql } from 'drizzle-orm'\n\nexport const users = pgTable('users', {\n  id: serial('id').primaryKey(),\n  name: varchar('name', { length: 255 }).notNull(),\n  email: varchar('email', { length: 255 }).notNull().unique(),\n  role: varchar('role', { length: 50 }).notNull().default('user'),\n  createdAt: timestamp('created_at').default(sql`now()`),\n})\n",[185,862,863,898,918,922,951,981,1024,1071,1128,1169],{"__ignoreMap":230},[234,864,865,867,869,872,874,877,879,882,884,887,889,891,893,896],{"class":236,"line":237},[234,866,314],{"class":313},[234,868,318],{"class":317},[234,870,871],{"class":321}," pgTable",[234,873,657],{"class":317},[234,875,876],{"class":321}," serial",[234,878,657],{"class":317},[234,880,881],{"class":321}," varchar",[234,883,657],{"class":317},[234,885,886],{"class":321}," timestamp",[234,888,325],{"class":317},[234,890,328],{"class":313},[234,892,331],{"class":317},[234,894,895],{"class":244},"drizzle-orm\u002Fpg-core",[234,897,337],{"class":317},[234,899,900,902,904,907,909,911,913,916],{"class":236,"line":340},[234,901,314],{"class":313},[234,903,318],{"class":317},[234,905,906],{"class":321}," sql",[234,908,325],{"class":317},[234,910,328],{"class":313},[234,912,331],{"class":317},[234,914,915],{"class":244},"drizzle-orm",[234,917,337],{"class":317},[234,919,920],{"class":236,"line":360},[234,921,364],{"emptyLinePlaceholder":363},[234,923,924,927,930,933,936,938,940,942,945,947,949],{"class":236,"line":367},[234,925,926],{"class":313},"export",[234,928,929],{"class":487}," const",[234,931,932],{"class":321}," users ",[234,934,935],{"class":317},"=",[234,937,871],{"class":373},[234,939,377],{"class":321},[234,941,425],{"class":317},[234,943,944],{"class":244},"users",[234,946,425],{"class":317},[234,948,657],{"class":317},[234,950,558],{"class":317},[234,952,953,956,958,960,962,964,967,969,971,973,976,979],{"class":236,"line":383},[234,954,955],{"class":386},"  id",[234,957,390],{"class":317},[234,959,876],{"class":373},[234,961,377],{"class":321},[234,963,425],{"class":317},[234,965,966],{"class":244},"id",[234,968,425],{"class":317},[234,970,462],{"class":321},[234,972,402],{"class":317},[234,974,975],{"class":373},"primaryKey",[234,977,978],{"class":321},"()",[234,980,428],{"class":317},[234,982,983,986,988,990,992,994,997,999,1001,1003,1006,1008,1011,1013,1015,1017,1020,1022],{"class":236,"line":396},[234,984,985],{"class":386},"  name",[234,987,390],{"class":317},[234,989,881],{"class":373},[234,991,377],{"class":321},[234,993,425],{"class":317},[234,995,996],{"class":244},"name",[234,998,425],{"class":317},[234,1000,657],{"class":317},[234,1002,318],{"class":317},[234,1004,1005],{"class":386}," length",[234,1007,390],{"class":317},[234,1009,1010],{"class":653}," 255",[234,1012,325],{"class":317},[234,1014,462],{"class":321},[234,1016,402],{"class":317},[234,1018,1019],{"class":373},"notNull",[234,1021,978],{"class":321},[234,1023,428],{"class":317},[234,1025,1026,1029,1031,1033,1035,1037,1040,1042,1044,1046,1048,1050,1052,1054,1056,1058,1060,1062,1064,1067,1069],{"class":236,"line":412},[234,1027,1028],{"class":386},"  email",[234,1030,390],{"class":317},[234,1032,881],{"class":373},[234,1034,377],{"class":321},[234,1036,425],{"class":317},[234,1038,1039],{"class":244},"email",[234,1041,425],{"class":317},[234,1043,657],{"class":317},[234,1045,318],{"class":317},[234,1047,1005],{"class":386},[234,1049,390],{"class":317},[234,1051,1010],{"class":653},[234,1053,325],{"class":317},[234,1055,462],{"class":321},[234,1057,402],{"class":317},[234,1059,1019],{"class":373},[234,1061,978],{"class":321},[234,1063,402],{"class":317},[234,1065,1066],{"class":373},"unique",[234,1068,978],{"class":321},[234,1070,428],{"class":317},[234,1072,1073,1076,1078,1080,1082,1084,1087,1089,1091,1093,1095,1097,1100,1102,1104,1106,1108,1110,1112,1115,1117,1119,1122,1124,1126],{"class":236,"line":431},[234,1074,1075],{"class":386},"  role",[234,1077,390],{"class":317},[234,1079,881],{"class":373},[234,1081,377],{"class":321},[234,1083,425],{"class":317},[234,1085,1086],{"class":244},"role",[234,1088,425],{"class":317},[234,1090,657],{"class":317},[234,1092,318],{"class":317},[234,1094,1005],{"class":386},[234,1096,390],{"class":317},[234,1098,1099],{"class":653}," 50",[234,1101,325],{"class":317},[234,1103,462],{"class":321},[234,1105,402],{"class":317},[234,1107,1019],{"class":373},[234,1109,978],{"class":321},[234,1111,402],{"class":317},[234,1113,1114],{"class":373},"default",[234,1116,377],{"class":321},[234,1118,425],{"class":317},[234,1120,1121],{"class":244},"user",[234,1123,425],{"class":317},[234,1125,462],{"class":321},[234,1127,428],{"class":317},[234,1129,1130,1133,1135,1137,1139,1141,1144,1146,1148,1150,1152,1154,1157,1160,1163,1165,1167],{"class":236,"line":456},[234,1131,1132],{"class":386},"  createdAt",[234,1134,390],{"class":317},[234,1136,886],{"class":373},[234,1138,377],{"class":321},[234,1140,425],{"class":317},[234,1142,1143],{"class":244},"created_at",[234,1145,425],{"class":317},[234,1147,462],{"class":321},[234,1149,402],{"class":317},[234,1151,1114],{"class":373},[234,1153,377],{"class":321},[234,1155,1156],{"class":373},"sql",[234,1158,1159],{"class":317},"`",[234,1161,1162],{"class":244},"now()",[234,1164,1159],{"class":317},[234,1166,462],{"class":321},[234,1168,428],{"class":317},[234,1170,1171,1173],{"class":236,"line":467},[234,1172,478],{"class":317},[234,1174,481],{"class":321},[198,1176,1178],{"id":1177},"register-schemas","Register schemas",[182,1180,1181,1182,1185,1186,1189,1190,1193],{},"All schemas live in ",[185,1183,1184],{},"DrizzleModule.configure({ schema })",". Drizzle is schema-first - tables are imported directly into services as values, so there is no per-feature DI registration. Use a barrel file (",[185,1187,1188],{},"src\u002Fdb.schema.ts",") that re-exports every table for a single ",[185,1191,1192],{},"typeof schema"," reference:",[224,1195,1197],{"className":304,"code":1196,"language":306,"meta":230,"style":230},"\u002F\u002F src\u002Fdb.schema.ts\nexport * from '.\u002Fuser\u002Fuser.schema.js'\nexport * from '.\u002Fpost\u002Fpost.schema.js'\n",[185,1198,1199,1204,1220],{"__ignoreMap":230},[234,1200,1201],{"class":236,"line":237},[234,1202,1203],{"class":776},"\u002F\u002F src\u002Fdb.schema.ts\n",[234,1205,1206,1208,1211,1213,1215,1218],{"class":236,"line":340},[234,1207,926],{"class":313},[234,1209,1210],{"class":317}," *",[234,1212,328],{"class":313},[234,1214,331],{"class":317},[234,1216,1217],{"class":244},".\u002Fuser\u002Fuser.schema.js",[234,1219,337],{"class":317},[234,1221,1222,1224,1226,1228,1230,1233],{"class":236,"line":360},[234,1223,926],{"class":313},[234,1225,1210],{"class":317},[234,1227,328],{"class":313},[234,1229,331],{"class":317},[234,1231,1232],{"class":244},".\u002Fpost\u002Fpost.schema.js",[234,1234,337],{"class":317},[224,1236,1238],{"className":304,"code":1237,"language":306,"meta":230,"style":230},"\u002F\u002F src\u002Fapp.module.ts\nimport * as schema from '.\u002Fdb.schema.js'\n\n@Module({\n  imports: [\n    DrizzleModule.configure({\n      dialect: 'postgres',\n      connection: { url: DATABASE_URL },\n      schema,\n    }),\n  ],\n})\nclass AppModule {}\n",[185,1239,1240,1245,1267,1271,1281,1289,1301,1315,1333,1340,1348,1354,1360],{"__ignoreMap":230},[234,1241,1242],{"class":236,"line":237},[234,1243,1244],{"class":776},"\u002F\u002F src\u002Fapp.module.ts\n",[234,1246,1247,1249,1251,1254,1257,1260,1262,1265],{"class":236,"line":340},[234,1248,314],{"class":313},[234,1250,1210],{"class":317},[234,1252,1253],{"class":313}," as",[234,1255,1256],{"class":321}," schema ",[234,1258,1259],{"class":313},"from",[234,1261,331],{"class":317},[234,1263,1264],{"class":244},".\u002Fdb.schema.js",[234,1266,337],{"class":317},[234,1268,1269],{"class":236,"line":360},[234,1270,364],{"emptyLinePlaceholder":363},[234,1272,1273,1275,1277,1279],{"class":236,"line":367},[234,1274,370],{"class":317},[234,1276,374],{"class":373},[234,1278,377],{"class":321},[234,1280,380],{"class":317},[234,1282,1283,1285,1287],{"class":236,"line":383},[234,1284,387],{"class":386},[234,1286,390],{"class":317},[234,1288,393],{"class":321},[234,1290,1291,1293,1295,1297,1299],{"class":236,"line":396},[234,1292,399],{"class":321},[234,1294,402],{"class":317},[234,1296,405],{"class":373},[234,1298,377],{"class":321},[234,1300,380],{"class":317},[234,1302,1303,1305,1307,1309,1311,1313],{"class":236,"line":412},[234,1304,415],{"class":386},[234,1306,390],{"class":317},[234,1308,331],{"class":317},[234,1310,422],{"class":244},[234,1312,425],{"class":317},[234,1314,428],{"class":317},[234,1316,1317,1319,1321,1323,1325,1327,1330],{"class":236,"line":431},[234,1318,434],{"class":386},[234,1320,390],{"class":317},[234,1322,318],{"class":317},[234,1324,441],{"class":386},[234,1326,390],{"class":317},[234,1328,1329],{"class":321}," DATABASE_URL ",[234,1331,1332],{"class":317},"},\n",[234,1334,1335,1338],{"class":236,"line":456},[234,1336,1337],{"class":321},"      schema",[234,1339,428],{"class":317},[234,1341,1342,1344,1346],{"class":236,"line":467},[234,1343,459],{"class":317},[234,1345,462],{"class":321},[234,1347,428],{"class":317},[234,1349,1350,1352],{"class":236,"line":475},[234,1351,470],{"class":321},[234,1353,428],{"class":317},[234,1355,1356,1358],{"class":236,"line":484},[234,1357,478],{"class":317},[234,1359,481],{"class":321},[234,1361,1363,1365,1367],{"class":236,"line":1362},13,[234,1364,488],{"class":487},[234,1366,491],{"class":240},[234,1368,494],{"class":317},[198,1370,1372],{"id":1371},"use-in-services","Use in services",[182,1374,1375,1376,1379,1380,1383],{},"Define a typed DI token once with ",[185,1377,1378],{},"drizzleDb\u003CTDb>()"," and inject it with the framework's standard ",[185,1381,1382],{},"inject()"," helper:",[224,1385,1387],{"className":304,"code":1386,"language":306,"meta":230,"style":230},"\u002F\u002F src\u002Fdb.ts\nimport { drizzleDb } from '@miiajs\u002Fdrizzle'\nimport type { PostgresJsDatabase } from 'drizzle-orm\u002Fpostgres-js'\nimport type * as schema from '.\u002Fdb.schema.js'\n\nexport const db = drizzleDb\u003CPostgresJsDatabase\u003Ctypeof schema>>()\n",[185,1388,1389,1394,1413,1436,1456,1460],{"__ignoreMap":230},[234,1390,1391],{"class":236,"line":237},[234,1392,1393],{"class":776},"\u002F\u002F src\u002Fdb.ts\n",[234,1395,1396,1398,1400,1403,1405,1407,1409,1411],{"class":236,"line":340},[234,1397,314],{"class":313},[234,1399,318],{"class":317},[234,1401,1402],{"class":321}," drizzleDb",[234,1404,325],{"class":317},[234,1406,328],{"class":313},[234,1408,331],{"class":317},[234,1410,187],{"class":244},[234,1412,337],{"class":317},[234,1414,1415,1417,1420,1422,1425,1427,1429,1431,1434],{"class":236,"line":360},[234,1416,314],{"class":313},[234,1418,1419],{"class":313}," type",[234,1421,318],{"class":317},[234,1423,1424],{"class":321}," PostgresJsDatabase",[234,1426,325],{"class":317},[234,1428,328],{"class":313},[234,1430,331],{"class":317},[234,1432,1433],{"class":244},"drizzle-orm\u002Fpostgres-js",[234,1435,337],{"class":317},[234,1437,1438,1440,1442,1444,1446,1448,1450,1452,1454],{"class":236,"line":367},[234,1439,314],{"class":313},[234,1441,1419],{"class":313},[234,1443,1210],{"class":317},[234,1445,1253],{"class":313},[234,1447,1256],{"class":321},[234,1449,1259],{"class":313},[234,1451,331],{"class":317},[234,1453,1264],{"class":244},[234,1455,337],{"class":317},[234,1457,1458],{"class":236,"line":383},[234,1459,364],{"emptyLinePlaceholder":363},[234,1461,1462,1464,1466,1469,1471,1473,1475,1478,1481,1484,1487],{"class":236,"line":396},[234,1463,926],{"class":313},[234,1465,929],{"class":487},[234,1467,1468],{"class":321}," db ",[234,1470,935],{"class":317},[234,1472,1402],{"class":373},[234,1474,811],{"class":317},[234,1476,1477],{"class":240},"PostgresJsDatabase",[234,1479,1480],{"class":317},"\u003Ctypeof",[234,1482,1483],{"class":321}," schema",[234,1485,1486],{"class":317},">>",[234,1488,1489],{"class":321},"()\n",[224,1491,1493],{"className":304,"code":1492,"language":306,"meta":230,"style":230},"\u002F\u002F src\u002Fuser\u002Fuser.service.ts\nimport { Injectable, inject } from '@miiajs\u002Fcore'\nimport { eq } from 'drizzle-orm'\nimport { db } from '..\u002Fdb.js'\nimport { users } from '.\u002Fuser.schema.js'\n\n@Injectable()\nclass UserService {\n  private db = inject(db)\n\n  async findAll() {\n    return this.db.select().from(users)\n  }\n\n  async findById(id: number) {\n    const [user] = await this.db\n      .select()\n      .from(users)\n      .where(eq(users.id, id))\n    return user ?? null\n  }\n\n  async create(data: { name: string; email: string }) {\n    const [user] = await this.db\n      .insert(users)\n      .values(data)\n      .returning()\n    return user\n  }\n\n  async update(id: number, data: Partial\u003C{ name: string; email: string }>) {\n    const [user] = await this.db\n      .update(users)\n      .set(data)\n      .where(eq(users.id, id))\n      .returning()\n    return user\n  }\n\n  async delete(id: number) {\n    await this.db.delete(users).where(eq(users.id, id))\n  }\n}\n",[185,1494,1495,1500,1524,1543,1563,1583,1587,1596,1605,1619,1623,1635,1663,1667,1672,1692,1716,1726,1739,1768,1782,1787,1792,1832,1851,1865,1879,1889,1897,1902,1907,1955,1974,1988,2002,2027,2036,2043,2048,2053,2073,2116,2121],{"__ignoreMap":230},[234,1496,1497],{"class":236,"line":237},[234,1498,1499],{"class":776},"\u002F\u002F src\u002Fuser\u002Fuser.service.ts\n",[234,1501,1502,1504,1506,1509,1511,1514,1516,1518,1520,1522],{"class":236,"line":340},[234,1503,314],{"class":313},[234,1505,318],{"class":317},[234,1507,1508],{"class":321}," Injectable",[234,1510,657],{"class":317},[234,1512,1513],{"class":321}," inject",[234,1515,325],{"class":317},[234,1517,328],{"class":313},[234,1519,331],{"class":317},[234,1521,334],{"class":244},[234,1523,337],{"class":317},[234,1525,1526,1528,1530,1533,1535,1537,1539,1541],{"class":236,"line":360},[234,1527,314],{"class":313},[234,1529,318],{"class":317},[234,1531,1532],{"class":321}," eq",[234,1534,325],{"class":317},[234,1536,328],{"class":313},[234,1538,331],{"class":317},[234,1540,915],{"class":244},[234,1542,337],{"class":317},[234,1544,1545,1547,1549,1552,1554,1556,1558,1561],{"class":236,"line":367},[234,1546,314],{"class":313},[234,1548,318],{"class":317},[234,1550,1551],{"class":321}," db",[234,1553,325],{"class":317},[234,1555,328],{"class":313},[234,1557,331],{"class":317},[234,1559,1560],{"class":244},"..\u002Fdb.js",[234,1562,337],{"class":317},[234,1564,1565,1567,1569,1572,1574,1576,1578,1581],{"class":236,"line":383},[234,1566,314],{"class":313},[234,1568,318],{"class":317},[234,1570,1571],{"class":321}," users",[234,1573,325],{"class":317},[234,1575,328],{"class":313},[234,1577,331],{"class":317},[234,1579,1580],{"class":244},".\u002Fuser.schema.js",[234,1582,337],{"class":317},[234,1584,1585],{"class":236,"line":396},[234,1586,364],{"emptyLinePlaceholder":363},[234,1588,1589,1591,1594],{"class":236,"line":412},[234,1590,370],{"class":317},[234,1592,1593],{"class":373},"Injectable",[234,1595,1489],{"class":321},[234,1597,1598,1600,1603],{"class":236,"line":431},[234,1599,488],{"class":487},[234,1601,1602],{"class":240}," UserService",[234,1604,558],{"class":317},[234,1606,1607,1610,1612,1614,1616],{"class":236,"line":456},[234,1608,1609],{"class":487},"  private",[234,1611,1551],{"class":386},[234,1613,569],{"class":317},[234,1615,1513],{"class":386},[234,1617,1618],{"class":321},"(db)\n",[234,1620,1621],{"class":236,"line":467},[234,1622,364],{"emptyLinePlaceholder":363},[234,1624,1625,1628,1631,1633],{"class":236,"line":475},[234,1626,1627],{"class":487},"  async",[234,1629,1630],{"class":386}," findAll",[234,1632,978],{"class":317},[234,1634,558],{"class":317},[234,1636,1637,1640,1643,1646,1648,1651,1653,1655,1657,1659,1661],{"class":236,"line":484},[234,1638,1639],{"class":313},"    return",[234,1641,1642],{"class":317}," this.",[234,1644,1645],{"class":321},"db",[234,1647,402],{"class":317},[234,1649,1650],{"class":373},"select",[234,1652,978],{"class":386},[234,1654,402],{"class":317},[234,1656,1259],{"class":373},[234,1658,377],{"class":386},[234,1660,944],{"class":321},[234,1662,481],{"class":386},[234,1664,1665],{"class":236,"line":1362},[234,1666,677],{"class":317},[234,1668,1670],{"class":236,"line":1669},14,[234,1671,364],{"emptyLinePlaceholder":363},[234,1673,1675,1677,1680,1682,1684,1686,1688,1690],{"class":236,"line":1674},15,[234,1676,1627],{"class":487},[234,1678,1679],{"class":386}," findById",[234,1681,377],{"class":317},[234,1683,966],{"class":549},[234,1685,390],{"class":317},[234,1687,773],{"class":240},[234,1689,462],{"class":317},[234,1691,558],{"class":317},[234,1693,1695,1698,1701,1703,1706,1708,1711,1713],{"class":236,"line":1694},16,[234,1696,1697],{"class":487},"    const",[234,1699,1700],{"class":317}," [",[234,1702,1121],{"class":321},[234,1704,1705],{"class":317},"]",[234,1707,569],{"class":317},[234,1709,1710],{"class":313}," await",[234,1712,1642],{"class":317},[234,1714,1715],{"class":321},"db\n",[234,1717,1719,1722,1724],{"class":236,"line":1718},17,[234,1720,1721],{"class":317},"      .",[234,1723,1650],{"class":373},[234,1725,1489],{"class":386},[234,1727,1729,1731,1733,1735,1737],{"class":236,"line":1728},18,[234,1730,1721],{"class":317},[234,1732,1259],{"class":373},[234,1734,377],{"class":386},[234,1736,944],{"class":321},[234,1738,481],{"class":386},[234,1740,1742,1744,1747,1749,1752,1754,1756,1758,1760,1762,1765],{"class":236,"line":1741},19,[234,1743,1721],{"class":317},[234,1745,1746],{"class":373},"where",[234,1748,377],{"class":386},[234,1750,1751],{"class":373},"eq",[234,1753,377],{"class":386},[234,1755,944],{"class":321},[234,1757,402],{"class":317},[234,1759,966],{"class":321},[234,1761,657],{"class":317},[234,1763,1764],{"class":321}," id",[234,1766,1767],{"class":386},"))\n",[234,1769,1771,1773,1776,1779],{"class":236,"line":1770},20,[234,1772,1639],{"class":313},[234,1774,1775],{"class":321}," user",[234,1777,1778],{"class":317}," ??",[234,1780,1781],{"class":317}," null\n",[234,1783,1785],{"class":236,"line":1784},21,[234,1786,677],{"class":317},[234,1788,1790],{"class":236,"line":1789},22,[234,1791,364],{"emptyLinePlaceholder":363},[234,1793,1795,1797,1800,1802,1805,1807,1809,1812,1814,1817,1820,1823,1825,1827,1830],{"class":236,"line":1794},23,[234,1796,1627],{"class":487},[234,1798,1799],{"class":386}," create",[234,1801,377],{"class":317},[234,1803,1804],{"class":549},"data",[234,1806,390],{"class":317},[234,1808,318],{"class":317},[234,1810,1811],{"class":386}," name",[234,1813,390],{"class":317},[234,1815,1816],{"class":240}," string",[234,1818,1819],{"class":317},";",[234,1821,1822],{"class":386}," email",[234,1824,390],{"class":317},[234,1826,1816],{"class":240},[234,1828,1829],{"class":317}," })",[234,1831,558],{"class":317},[234,1833,1835,1837,1839,1841,1843,1845,1847,1849],{"class":236,"line":1834},24,[234,1836,1697],{"class":487},[234,1838,1700],{"class":317},[234,1840,1121],{"class":321},[234,1842,1705],{"class":317},[234,1844,569],{"class":317},[234,1846,1710],{"class":313},[234,1848,1642],{"class":317},[234,1850,1715],{"class":321},[234,1852,1854,1856,1859,1861,1863],{"class":236,"line":1853},25,[234,1855,1721],{"class":317},[234,1857,1858],{"class":373},"insert",[234,1860,377],{"class":386},[234,1862,944],{"class":321},[234,1864,481],{"class":386},[234,1866,1868,1870,1873,1875,1877],{"class":236,"line":1867},26,[234,1869,1721],{"class":317},[234,1871,1872],{"class":373},"values",[234,1874,377],{"class":386},[234,1876,1804],{"class":321},[234,1878,481],{"class":386},[234,1880,1882,1884,1887],{"class":236,"line":1881},27,[234,1883,1721],{"class":317},[234,1885,1886],{"class":373},"returning",[234,1888,1489],{"class":386},[234,1890,1892,1894],{"class":236,"line":1891},28,[234,1893,1639],{"class":313},[234,1895,1896],{"class":321}," user\n",[234,1898,1900],{"class":236,"line":1899},29,[234,1901,677],{"class":317},[234,1903,1905],{"class":236,"line":1904},30,[234,1906,364],{"emptyLinePlaceholder":363},[234,1908,1910,1912,1915,1917,1919,1921,1923,1925,1928,1930,1933,1936,1938,1940,1942,1944,1946,1948,1950,1953],{"class":236,"line":1909},31,[234,1911,1627],{"class":487},[234,1913,1914],{"class":386}," update",[234,1916,377],{"class":317},[234,1918,966],{"class":549},[234,1920,390],{"class":317},[234,1922,773],{"class":240},[234,1924,657],{"class":317},[234,1926,1927],{"class":549}," data",[234,1929,390],{"class":317},[234,1931,1932],{"class":240}," Partial",[234,1934,1935],{"class":317},"\u003C{",[234,1937,1811],{"class":386},[234,1939,390],{"class":317},[234,1941,1816],{"class":240},[234,1943,1819],{"class":317},[234,1945,1822],{"class":386},[234,1947,390],{"class":317},[234,1949,1816],{"class":240},[234,1951,1952],{"class":317}," }>)",[234,1954,558],{"class":317},[234,1956,1958,1960,1962,1964,1966,1968,1970,1972],{"class":236,"line":1957},32,[234,1959,1697],{"class":487},[234,1961,1700],{"class":317},[234,1963,1121],{"class":321},[234,1965,1705],{"class":317},[234,1967,569],{"class":317},[234,1969,1710],{"class":313},[234,1971,1642],{"class":317},[234,1973,1715],{"class":321},[234,1975,1977,1979,1982,1984,1986],{"class":236,"line":1976},33,[234,1978,1721],{"class":317},[234,1980,1981],{"class":373},"update",[234,1983,377],{"class":386},[234,1985,944],{"class":321},[234,1987,481],{"class":386},[234,1989,1991,1993,1996,1998,2000],{"class":236,"line":1990},34,[234,1992,1721],{"class":317},[234,1994,1995],{"class":373},"set",[234,1997,377],{"class":386},[234,1999,1804],{"class":321},[234,2001,481],{"class":386},[234,2003,2005,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025],{"class":236,"line":2004},35,[234,2006,1721],{"class":317},[234,2008,1746],{"class":373},[234,2010,377],{"class":386},[234,2012,1751],{"class":373},[234,2014,377],{"class":386},[234,2016,944],{"class":321},[234,2018,402],{"class":317},[234,2020,966],{"class":321},[234,2022,657],{"class":317},[234,2024,1764],{"class":321},[234,2026,1767],{"class":386},[234,2028,2030,2032,2034],{"class":236,"line":2029},36,[234,2031,1721],{"class":317},[234,2033,1886],{"class":373},[234,2035,1489],{"class":386},[234,2037,2039,2041],{"class":236,"line":2038},37,[234,2040,1639],{"class":313},[234,2042,1896],{"class":321},[234,2044,2046],{"class":236,"line":2045},38,[234,2047,677],{"class":317},[234,2049,2051],{"class":236,"line":2050},39,[234,2052,364],{"emptyLinePlaceholder":363},[234,2054,2056,2058,2061,2063,2065,2067,2069,2071],{"class":236,"line":2055},40,[234,2057,1627],{"class":487},[234,2059,2060],{"class":386}," delete",[234,2062,377],{"class":317},[234,2064,966],{"class":549},[234,2066,390],{"class":317},[234,2068,773],{"class":240},[234,2070,462],{"class":317},[234,2072,558],{"class":317},[234,2074,2076,2079,2081,2083,2085,2088,2090,2092,2094,2096,2098,2100,2102,2104,2106,2108,2110,2112,2114],{"class":236,"line":2075},41,[234,2077,2078],{"class":313},"    await",[234,2080,1642],{"class":317},[234,2082,1645],{"class":321},[234,2084,402],{"class":317},[234,2086,2087],{"class":373},"delete",[234,2089,377],{"class":386},[234,2091,944],{"class":321},[234,2093,462],{"class":386},[234,2095,402],{"class":317},[234,2097,1746],{"class":373},[234,2099,377],{"class":386},[234,2101,1751],{"class":373},[234,2103,377],{"class":386},[234,2105,944],{"class":321},[234,2107,402],{"class":317},[234,2109,966],{"class":321},[234,2111,657],{"class":317},[234,2113,1764],{"class":321},[234,2115,1767],{"class":386},[234,2117,2119],{"class":236,"line":2118},42,[234,2120,677],{"class":317},[234,2122,2124],{"class":236,"line":2123},43,[234,2125,850],{"class":317},[198,2127,2129],{"id":2128},"type-safety","Type safety",[182,2131,2132,2134,2135,2138,2139,211,2141,211,2143,211,2145,211,2147,2150,2151,2154],{},[185,2133,1378],{}," accepts the concrete Drizzle database type as a generic parameter. The type flows through ",[185,2136,2137],{},"inject(db)"," so every call site gets full autocompletion for ",[185,2140,1650],{},[185,2142,1858],{},[185,2144,1981],{},[185,2146,2087],{},[185,2148,2149],{},"execute",", and - when you pass a schema - ",[185,2152,2153],{},"db.query.*"," relational queries.",[182,2156,2157,2158,2161,2162,215,2165,2161,2168,402],{},"For MySQL and SQLite, swap the type accordingly: ",[185,2159,2160],{},"MySql2Database\u003Ctypeof schema>"," from ",[185,2163,2164],{},"drizzle-orm\u002Fmysql2",[185,2166,2167],{},"BetterSQLite3Database\u003Ctypeof schema>",[185,2169,2170],{},"drizzle-orm\u002Fbetter-sqlite3",[2172,2173,2174],"caution",{},[182,2175,2176,2183,2184,2187,2188,2191,2192,2195,2196,2198,2199,2201,2202,2205,2206,2209],{},[2177,2178,2179,2182],"strong",{},[185,2180,2181],{},"db.ts"," is the single source of truth."," ",[185,2185,2186],{},"drizzleDb()"," memoizes by name only - the generic is compile-time. Calling ",[185,2189,2190],{},"drizzleDb\u003CTypeA>()"," in one file and ",[185,2193,2194],{},"drizzleDb\u003CTypeB>()"," in another resolves to the same runtime DI token, but projects different TypeScript types at each site. TypeScript will not catch the mismatch. Always import the typed ",[185,2197,1645],{}," from your single ",[185,2200,2181],{}," (or ",[185,2203,2204],{},"analytics.ts",", etc) - do not re-call ",[185,2207,2208],{},"drizzleDb\u003C...>()"," elsewhere.",[298,2211,2213],{"id":2212},"relational-queries","Relational queries",[182,2215,2216,2217,211,2222,2224,2225,2227],{},"When schemas include ",[190,2218,2221],{"href":2219,"rel":2220},"https:\u002F\u002Form.drizzle.team\u002Fdocs\u002Frqb",[194],"relations",[185,2223,2153],{}," is typed automatically through the ",[185,2226,1192],{}," generic:",[224,2229,2231],{"className":304,"code":2230,"language":306,"meta":230,"style":230},"import { relations } from 'drizzle-orm'\n\nexport const usersRelations = relations(users, ({ many }) => ({\n  posts: many(posts),\n}))\n",[185,2232,2233,2252,2256,2289,2303],{"__ignoreMap":230},[234,2234,2235,2237,2239,2242,2244,2246,2248,2250],{"class":236,"line":237},[234,2236,314],{"class":313},[234,2238,318],{"class":317},[234,2240,2241],{"class":321}," relations",[234,2243,325],{"class":317},[234,2245,328],{"class":313},[234,2247,331],{"class":317},[234,2249,915],{"class":244},[234,2251,337],{"class":317},[234,2253,2254],{"class":236,"line":340},[234,2255,364],{"emptyLinePlaceholder":363},[234,2257,2258,2260,2262,2265,2267,2269,2272,2274,2277,2280,2282,2284,2287],{"class":236,"line":360},[234,2259,926],{"class":313},[234,2261,929],{"class":487},[234,2263,2264],{"class":321}," usersRelations ",[234,2266,935],{"class":317},[234,2268,2241],{"class":373},[234,2270,2271],{"class":321},"(users",[234,2273,657],{"class":317},[234,2275,2276],{"class":317}," ({",[234,2278,2279],{"class":549}," many",[234,2281,1829],{"class":317},[234,2283,555],{"class":487},[234,2285,2286],{"class":321}," (",[234,2288,380],{"class":317},[234,2290,2291,2294,2296,2298,2301],{"class":236,"line":367},[234,2292,2293],{"class":386},"  posts",[234,2295,390],{"class":317},[234,2297,2279],{"class":373},[234,2299,2300],{"class":321},"(posts)",[234,2302,428],{"class":317},[234,2304,2305,2307],{"class":236,"line":383},[234,2306,478],{"class":317},[234,2308,1767],{"class":321},[182,2310,2311,2312,2314],{},"Make sure the relations live in the schema barrel so they are part of ",[185,2313,1192],{},". Then:",[224,2316,2318],{"className":304,"code":2317,"language":306,"meta":230,"style":230},"const usersWithPosts = await this.db.query.users.findMany({\n  with: { posts: true },\n})\n",[185,2319,2320,2354,2374],{"__ignoreMap":230},[234,2321,2322,2325,2328,2330,2332,2334,2336,2338,2341,2343,2345,2347,2350,2352],{"class":236,"line":237},[234,2323,2324],{"class":487},"const",[234,2326,2327],{"class":321}," usersWithPosts ",[234,2329,935],{"class":317},[234,2331,1710],{"class":313},[234,2333,1642],{"class":317},[234,2335,1645],{"class":321},[234,2337,402],{"class":317},[234,2339,2340],{"class":321},"query",[234,2342,402],{"class":317},[234,2344,944],{"class":321},[234,2346,402],{"class":317},[234,2348,2349],{"class":373},"findMany",[234,2351,377],{"class":321},[234,2353,380],{"class":317},[234,2355,2356,2359,2361,2363,2366,2368,2372],{"class":236,"line":340},[234,2357,2358],{"class":386},"  with",[234,2360,390],{"class":317},[234,2362,318],{"class":317},[234,2364,2365],{"class":386}," posts",[234,2367,390],{"class":317},[234,2369,2371],{"class":2370},"sfNiH"," true",[234,2373,453],{"class":317},[234,2375,2376,2378],{"class":236,"line":360},[234,2377,478],{"class":317},[234,2379,481],{"class":321},[198,2381,2383],{"id":2382},"migrations","Migrations",[182,2385,2386,2388,2389,2392,2393,402],{},[185,2387,187],{}," handles the runtime connection, but it does not run migrations on startup - ",[185,2390,2391],{},"onInit()"," only connects and retries on transient failures. Schema changes are a build\u002Fdeploy step handled by ",[190,2394,2397],{"href":2395,"rel":2396},"https:\u002F\u002Form.drizzle.team\u002Fdocs\u002Fkit-overview",[194],[185,2398,2399],{},"drizzle-kit",[182,2401,2402],{},"Install it as a dev dependency:",[221,2404,2405,2422,2439,2455],{},[224,2406,2408],{"className":226,"code":2407,"filename":241,"language":229,"meta":230,"style":230},"bun add -D drizzle-kit\n",[185,2409,2410],{"__ignoreMap":230},[234,2411,2412,2414,2416,2419],{"class":236,"line":237},[234,2413,241],{"class":240},[234,2415,245],{"class":244},[234,2417,2418],{"class":244}," -D",[234,2420,2421],{"class":244}," drizzle-kit\n",[224,2423,2426],{"className":226,"code":2424,"filename":2425,"language":229,"meta":230,"style":230},"npm install -D drizzle-kit\n","npm",[185,2427,2428],{"__ignoreMap":230},[234,2429,2430,2432,2435,2437],{"class":236,"line":237},[234,2431,2425],{"class":240},[234,2433,2434],{"class":244}," install",[234,2436,2418],{"class":244},[234,2438,2421],{"class":244},[224,2440,2443],{"className":226,"code":2441,"filename":2442,"language":229,"meta":230,"style":230},"pnpm add -D drizzle-kit\n","pnpm",[185,2444,2445],{"__ignoreMap":230},[234,2446,2447,2449,2451,2453],{"class":236,"line":237},[234,2448,2442],{"class":240},[234,2450,245],{"class":244},[234,2452,2418],{"class":244},[234,2454,2421],{"class":244},[224,2456,2459],{"className":226,"code":2457,"filename":2458,"language":229,"meta":230,"style":230},"yarn add -D drizzle-kit\n","yarn",[185,2460,2461],{"__ignoreMap":230},[234,2462,2463,2465,2467,2469],{"class":236,"line":237},[234,2464,2458],{"class":240},[234,2466,245],{"class":244},[234,2468,2418],{"class":244},[234,2470,2421],{"class":244},[182,2472,2473,2474,2477],{},"Create ",[185,2475,2476],{},"drizzle.config.ts"," at the project root:",[224,2479,2481],{"className":304,"code":2480,"language":306,"meta":230,"style":230},"import { defineConfig } from 'drizzle-kit'\n\nexport default defineConfig({\n  schema: '.\u002Fsrc\u002Fdb.schema.ts',\n  out: '.\u002Fdrizzle',\n  dialect: 'postgresql',\n  dbCredentials: {\n    url: process.env.DATABASE_URL!,\n  },\n})\n",[185,2482,2483,2502,2506,2519,2534,2550,2565,2574,2595,2600],{"__ignoreMap":230},[234,2484,2485,2487,2489,2492,2494,2496,2498,2500],{"class":236,"line":237},[234,2486,314],{"class":313},[234,2488,318],{"class":317},[234,2490,2491],{"class":321}," defineConfig",[234,2493,325],{"class":317},[234,2495,328],{"class":313},[234,2497,331],{"class":317},[234,2499,2399],{"class":244},[234,2501,337],{"class":317},[234,2503,2504],{"class":236,"line":340},[234,2505,364],{"emptyLinePlaceholder":363},[234,2507,2508,2510,2513,2515,2517],{"class":236,"line":360},[234,2509,926],{"class":313},[234,2511,2512],{"class":313}," default",[234,2514,2491],{"class":373},[234,2516,377],{"class":321},[234,2518,380],{"class":317},[234,2520,2521,2523,2525,2527,2530,2532],{"class":236,"line":367},[234,2522,803],{"class":386},[234,2524,390],{"class":317},[234,2526,331],{"class":317},[234,2528,2529],{"class":244},".\u002Fsrc\u002Fdb.schema.ts",[234,2531,425],{"class":317},[234,2533,428],{"class":317},[234,2535,2536,2539,2541,2543,2546,2548],{"class":236,"line":383},[234,2537,2538],{"class":386},"  out",[234,2540,390],{"class":317},[234,2542,331],{"class":317},[234,2544,2545],{"class":244},".\u002Fdrizzle",[234,2547,425],{"class":317},[234,2549,428],{"class":317},[234,2551,2552,2554,2556,2558,2561,2563],{"class":236,"line":396},[234,2553,707],{"class":386},[234,2555,390],{"class":317},[234,2557,331],{"class":317},[234,2559,2560],{"class":244},"postgresql",[234,2562,425],{"class":317},[234,2564,428],{"class":317},[234,2566,2567,2570,2572],{"class":236,"line":412},[234,2568,2569],{"class":386},"  dbCredentials",[234,2571,390],{"class":317},[234,2573,558],{"class":317},[234,2575,2576,2578,2580,2583,2585,2588,2590,2592],{"class":236,"line":431},[234,2577,748],{"class":386},[234,2579,390],{"class":317},[234,2581,2582],{"class":321}," process",[234,2584,402],{"class":317},[234,2586,2587],{"class":321},"env",[234,2589,402],{"class":317},[234,2591,630],{"class":321},[234,2593,2594],{"class":317},"!,\n",[234,2596,2597],{"class":236,"line":456},[234,2598,2599],{"class":317},"  },\n",[234,2601,2602,2604],{"class":236,"line":467},[234,2603,478],{"class":317},[234,2605,481],{"class":321},[182,2607,2608],{},"Then generate and apply migrations:",[224,2610,2612],{"className":226,"code":2611,"language":229,"meta":230,"style":230},"# Generate a new SQL migration from your schema changes\nnpx drizzle-kit generate\n\n# Apply pending migrations against the database\nnpx drizzle-kit migrate\n",[185,2613,2614,2619,2630,2634,2639],{"__ignoreMap":230},[234,2615,2616],{"class":236,"line":237},[234,2617,2618],{"class":776},"# Generate a new SQL migration from your schema changes\n",[234,2620,2621,2624,2627],{"class":236,"line":340},[234,2622,2623],{"class":240},"npx",[234,2625,2626],{"class":244}," drizzle-kit",[234,2628,2629],{"class":244}," generate\n",[234,2631,2632],{"class":236,"line":360},[234,2633,364],{"emptyLinePlaceholder":363},[234,2635,2636],{"class":236,"line":367},[234,2637,2638],{"class":776},"# Apply pending migrations against the database\n",[234,2640,2641,2643,2645],{"class":236,"line":383},[234,2642,2623],{"class":240},[234,2644,2626],{"class":244},[234,2646,2647],{"class":244}," migrate\n",[182,2649,2650,2651,2654,2655,2658,2659,402],{},"Commit both the generated SQL files in ",[185,2652,2653],{},"drizzle\u002F"," and the ",[185,2656,2657],{},"drizzle\u002Fmeta\u002F"," snapshots - the snapshot is the baseline for the next ",[185,2660,2661],{},"generate",[2663,2664,2665],"note",{},[182,2666,2667,2668,2671,2672,2674,2675,2677,2678,2681,2682,2685,2686,2689,2690,402],{},"Bun and Deno auto-load ",[185,2669,2670],{},".env"," when running scripts, so ",[185,2673,2399],{}," sees ",[185,2676,630],{}," through ",[185,2679,2680],{},"process.env"," without extra setup. For Node.js, pass ",[185,2683,2684],{},"node --env-file=.env"," or import ",[185,2687,2688],{},"dotenv\u002Fconfig"," at the top of ",[185,2691,2476],{},[2663,2693,2694],{},[182,2695,2696,2697,2699,2700,2703,2704,2699,2707,2710,2711,2713,2714,2716],{},"Heads up: ",[185,2698,2399],{}," uses ",[185,2701,2702],{},"dialect: 'postgresql'"," while ",[185,2705,2706],{},"DrizzleModule.configure()",[185,2708,2709],{},"dialect: 'postgres'",". That's a naming mismatch between ",[185,2712,2399],{}," and ",[185,2715,1433],{},", not a MiiaJS convention. Use whichever the surrounding API expects.",[182,2718,2719,2720,211,2722,2725,2726,2729,2730,402],{},"A complete working example - including ",[185,2721,2476],{},[185,2723,2724],{},"db:generate"," \u002F ",[185,2727,2728],{},"db:migrate"," scripts, and a committed initial migration - lives in ",[190,2731,2734],{"href":2732,"rel":2733},"https:\u002F\u002Fgithub.com\u002Fmiiajs\u002Fmiia\u002Ftree\u002Fmain\u002Fexamples\u002Fdrizzle-app",[194],[185,2735,2736],{},"examples\u002Fdrizzle-app",[198,2738,2740],{"id":2739},"multiple-connections","Multiple connections",[182,2742,2743,2744,2747],{},"Use named connections for multi-database setups. Each connection gets its own schema barrel and its own typed ",[185,2745,2746],{},"drizzleDb\u003CTDb>(name)"," token:",[224,2749,2751],{"className":304,"code":2750,"language":306,"meta":230,"style":230},"\u002F\u002F src\u002Fdb.ts - tokens for both connections\nimport { drizzleDb } from '@miiajs\u002Fdrizzle'\nimport type { PostgresJsDatabase } from 'drizzle-orm\u002Fpostgres-js'\nimport type * as mainSchema from '.\u002Fdb.schema.js'\nimport type * as analyticsSchema from '.\u002Fanalytics\u002Fdb.schema.js'\n\nexport const db = drizzleDb\u003CPostgresJsDatabase\u003Ctypeof mainSchema>>()\nexport const analytics = drizzleDb\u003CPostgresJsDatabase\u003Ctypeof analyticsSchema>>('analytics')\n",[185,2752,2753,2758,2776,2796,2817,2839,2843,2868],{"__ignoreMap":230},[234,2754,2755],{"class":236,"line":237},[234,2756,2757],{"class":776},"\u002F\u002F src\u002Fdb.ts - tokens for both connections\n",[234,2759,2760,2762,2764,2766,2768,2770,2772,2774],{"class":236,"line":340},[234,2761,314],{"class":313},[234,2763,318],{"class":317},[234,2765,1402],{"class":321},[234,2767,325],{"class":317},[234,2769,328],{"class":313},[234,2771,331],{"class":317},[234,2773,187],{"class":244},[234,2775,337],{"class":317},[234,2777,2778,2780,2782,2784,2786,2788,2790,2792,2794],{"class":236,"line":360},[234,2779,314],{"class":313},[234,2781,1419],{"class":313},[234,2783,318],{"class":317},[234,2785,1424],{"class":321},[234,2787,325],{"class":317},[234,2789,328],{"class":313},[234,2791,331],{"class":317},[234,2793,1433],{"class":244},[234,2795,337],{"class":317},[234,2797,2798,2800,2802,2804,2806,2809,2811,2813,2815],{"class":236,"line":367},[234,2799,314],{"class":313},[234,2801,1419],{"class":313},[234,2803,1210],{"class":317},[234,2805,1253],{"class":313},[234,2807,2808],{"class":321}," mainSchema ",[234,2810,1259],{"class":313},[234,2812,331],{"class":317},[234,2814,1264],{"class":244},[234,2816,337],{"class":317},[234,2818,2819,2821,2823,2825,2827,2830,2832,2834,2837],{"class":236,"line":383},[234,2820,314],{"class":313},[234,2822,1419],{"class":313},[234,2824,1210],{"class":317},[234,2826,1253],{"class":313},[234,2828,2829],{"class":321}," analyticsSchema ",[234,2831,1259],{"class":313},[234,2833,331],{"class":317},[234,2835,2836],{"class":244},".\u002Fanalytics\u002Fdb.schema.js",[234,2838,337],{"class":317},[234,2840,2841],{"class":236,"line":396},[234,2842,364],{"emptyLinePlaceholder":363},[234,2844,2845,2847,2849,2851,2853,2855,2857,2859,2861,2864,2866],{"class":236,"line":412},[234,2846,926],{"class":313},[234,2848,929],{"class":487},[234,2850,1468],{"class":321},[234,2852,935],{"class":317},[234,2854,1402],{"class":373},[234,2856,811],{"class":317},[234,2858,1477],{"class":240},[234,2860,1480],{"class":317},[234,2862,2863],{"class":321}," mainSchema",[234,2865,1486],{"class":317},[234,2867,1489],{"class":321},[234,2869,2870,2872,2874,2877,2879,2881,2883,2885,2887,2890,2892,2894,2896,2899,2901],{"class":236,"line":431},[234,2871,926],{"class":313},[234,2873,929],{"class":487},[234,2875,2876],{"class":321}," analytics ",[234,2878,935],{"class":317},[234,2880,1402],{"class":373},[234,2882,811],{"class":317},[234,2884,1477],{"class":240},[234,2886,1480],{"class":317},[234,2888,2889],{"class":321}," analyticsSchema",[234,2891,1486],{"class":317},[234,2893,377],{"class":321},[234,2895,425],{"class":317},[234,2897,2898],{"class":244},"analytics",[234,2900,425],{"class":317},[234,2902,481],{"class":321},[224,2904,2906],{"className":304,"code":2905,"language":306,"meta":230,"style":230},"\u002F\u002F Root module - one configure() per connection\nimport * as mainSchema from '.\u002Fdb.schema.js'\nimport * as analyticsSchema from '.\u002Fanalytics\u002Fdb.schema.js'\n\n@Module({\n  imports: [\n    DrizzleModule.configure({\n      dialect: 'postgres',\n      connection: { url: MAIN_DB },\n      schema: mainSchema,\n    }),\n    DrizzleModule.configure(\n      {\n        dialect: 'postgres',\n        connection: { url: ANALYTICS_DB },\n        schema: analyticsSchema,\n      },\n      'analytics',\n    ),\n    UserModule,\n    AnalyticsModule,\n  ],\n})\nclass AppModule {}\n",[185,2907,2908,2913,2931,2949,2953,2963,2971,2983,2997,3014,3024,3032,3043,3048,3063,3081,3092,3097,3108,3115,3122,3129,3135,3141],{"__ignoreMap":230},[234,2909,2910],{"class":236,"line":237},[234,2911,2912],{"class":776},"\u002F\u002F Root module - one configure() per connection\n",[234,2914,2915,2917,2919,2921,2923,2925,2927,2929],{"class":236,"line":340},[234,2916,314],{"class":313},[234,2918,1210],{"class":317},[234,2920,1253],{"class":313},[234,2922,2808],{"class":321},[234,2924,1259],{"class":313},[234,2926,331],{"class":317},[234,2928,1264],{"class":244},[234,2930,337],{"class":317},[234,2932,2933,2935,2937,2939,2941,2943,2945,2947],{"class":236,"line":360},[234,2934,314],{"class":313},[234,2936,1210],{"class":317},[234,2938,1253],{"class":313},[234,2940,2829],{"class":321},[234,2942,1259],{"class":313},[234,2944,331],{"class":317},[234,2946,2836],{"class":244},[234,2948,337],{"class":317},[234,2950,2951],{"class":236,"line":367},[234,2952,364],{"emptyLinePlaceholder":363},[234,2954,2955,2957,2959,2961],{"class":236,"line":383},[234,2956,370],{"class":317},[234,2958,374],{"class":373},[234,2960,377],{"class":321},[234,2962,380],{"class":317},[234,2964,2965,2967,2969],{"class":236,"line":396},[234,2966,387],{"class":386},[234,2968,390],{"class":317},[234,2970,393],{"class":321},[234,2972,2973,2975,2977,2979,2981],{"class":236,"line":412},[234,2974,399],{"class":321},[234,2976,402],{"class":317},[234,2978,405],{"class":373},[234,2980,377],{"class":321},[234,2982,380],{"class":317},[234,2984,2985,2987,2989,2991,2993,2995],{"class":236,"line":431},[234,2986,415],{"class":386},[234,2988,390],{"class":317},[234,2990,331],{"class":317},[234,2992,422],{"class":244},[234,2994,425],{"class":317},[234,2996,428],{"class":317},[234,2998,2999,3001,3003,3005,3007,3009,3012],{"class":236,"line":456},[234,3000,434],{"class":386},[234,3002,390],{"class":317},[234,3004,318],{"class":317},[234,3006,441],{"class":386},[234,3008,390],{"class":317},[234,3010,3011],{"class":321}," MAIN_DB ",[234,3013,1332],{"class":317},[234,3015,3016,3018,3020,3022],{"class":236,"line":467},[234,3017,1337],{"class":386},[234,3019,390],{"class":317},[234,3021,2863],{"class":321},[234,3023,428],{"class":317},[234,3025,3026,3028,3030],{"class":236,"line":475},[234,3027,459],{"class":317},[234,3029,462],{"class":321},[234,3031,428],{"class":317},[234,3033,3034,3036,3038,3040],{"class":236,"line":484},[234,3035,399],{"class":321},[234,3037,402],{"class":317},[234,3039,405],{"class":373},[234,3041,3042],{"class":321},"(\n",[234,3044,3045],{"class":236,"line":1362},[234,3046,3047],{"class":317},"      {\n",[234,3049,3050,3053,3055,3057,3059,3061],{"class":236,"line":1669},[234,3051,3052],{"class":386},"        dialect",[234,3054,390],{"class":317},[234,3056,331],{"class":317},[234,3058,422],{"class":244},[234,3060,425],{"class":317},[234,3062,428],{"class":317},[234,3064,3065,3068,3070,3072,3074,3076,3079],{"class":236,"line":1674},[234,3066,3067],{"class":386},"        connection",[234,3069,390],{"class":317},[234,3071,318],{"class":317},[234,3073,441],{"class":386},[234,3075,390],{"class":317},[234,3077,3078],{"class":321}," ANALYTICS_DB ",[234,3080,1332],{"class":317},[234,3082,3083,3086,3088,3090],{"class":236,"line":1694},[234,3084,3085],{"class":386},"        schema",[234,3087,390],{"class":317},[234,3089,2889],{"class":321},[234,3091,428],{"class":317},[234,3093,3094],{"class":236,"line":1718},[234,3095,3096],{"class":317},"      },\n",[234,3098,3099,3102,3104,3106],{"class":236,"line":1728},[234,3100,3101],{"class":317},"      '",[234,3103,2898],{"class":244},[234,3105,425],{"class":317},[234,3107,428],{"class":317},[234,3109,3110,3113],{"class":236,"line":1741},[234,3111,3112],{"class":321},"    )",[234,3114,428],{"class":317},[234,3116,3117,3120],{"class":236,"line":1770},[234,3118,3119],{"class":321},"    UserModule",[234,3121,428],{"class":317},[234,3123,3124,3127],{"class":236,"line":1784},[234,3125,3126],{"class":321},"    AnalyticsModule",[234,3128,428],{"class":317},[234,3130,3131,3133],{"class":236,"line":1789},[234,3132,470],{"class":321},[234,3134,428],{"class":317},[234,3136,3137,3139],{"class":236,"line":1794},[234,3138,478],{"class":317},[234,3140,481],{"class":321},[234,3142,3143,3145,3147],{"class":236,"line":1834},[234,3144,488],{"class":487},[234,3146,491],{"class":240},[234,3148,494],{"class":317},[182,3150,3151],{},"Inject the connection you need:",[224,3153,3155],{"className":304,"code":3154,"language":306,"meta":230,"style":230},"@Injectable()\nclass AnalyticsService {\n  private db = inject(analytics)\n\n  async getEvents() {\n    return this.db.select().from(events)\n  }\n}\n",[185,3156,3157,3165,3174,3187,3191,3202,3227,3231],{"__ignoreMap":230},[234,3158,3159,3161,3163],{"class":236,"line":237},[234,3160,370],{"class":317},[234,3162,1593],{"class":373},[234,3164,1489],{"class":321},[234,3166,3167,3169,3172],{"class":236,"line":340},[234,3168,488],{"class":487},[234,3170,3171],{"class":240}," AnalyticsService",[234,3173,558],{"class":317},[234,3175,3176,3178,3180,3182,3184],{"class":236,"line":360},[234,3177,1609],{"class":487},[234,3179,1551],{"class":386},[234,3181,569],{"class":317},[234,3183,1513],{"class":386},[234,3185,3186],{"class":321},"(analytics)\n",[234,3188,3189],{"class":236,"line":367},[234,3190,364],{"emptyLinePlaceholder":363},[234,3192,3193,3195,3198,3200],{"class":236,"line":383},[234,3194,1627],{"class":487},[234,3196,3197],{"class":386}," getEvents",[234,3199,978],{"class":317},[234,3201,558],{"class":317},[234,3203,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222,3225],{"class":236,"line":396},[234,3205,1639],{"class":313},[234,3207,1642],{"class":317},[234,3209,1645],{"class":321},[234,3211,402],{"class":317},[234,3213,1650],{"class":373},[234,3215,978],{"class":386},[234,3217,402],{"class":317},[234,3219,1259],{"class":373},[234,3221,377],{"class":386},[234,3223,3224],{"class":321},"events",[234,3226,481],{"class":386},[234,3228,3229],{"class":236,"line":412},[234,3230,677],{"class":317},[234,3232,3233],{"class":236,"line":431},[234,3234,850],{"class":317},[198,3236,3238],{"id":3237},"supported-databases","Supported databases",[3240,3241,3242,3258],"table",{},[3243,3244,3245],"thead",{},[3246,3247,3248,3252,3255],"tr",{},[3249,3250,3251],"th",{},"Dialect",[3249,3253,3254],{},"Driver",[3249,3256,3257],{},"Version",[3259,3260,3261,3275,3288],"tbody",{},[3246,3262,3263,3268,3272],{},[3264,3265,3266],"td",{},[185,3267,422],{},[3264,3269,3270],{},[185,3271,422],{},[3264,3273,3274],{},">= 3.0.0",[3246,3276,3277,3281,3286],{},[3264,3278,3279],{},[185,3280,723],{},[3264,3282,3283],{},[185,3284,3285],{},"mysql2",[3264,3287,3274],{},[3246,3289,3290,3294,3299],{},[3264,3291,3292],{},[185,3293,732],{},[3264,3295,3296],{},[185,3297,3298],{},"better-sqlite3",[3264,3300,3301],{},">= 11.0.0",[182,3303,3304],{},"All drivers are optional peer dependencies - install only what you need.",[198,3306,3308],{"id":3307},"connection-lifecycle","Connection lifecycle",[3310,3311,3312,3334],"ul",{},[3313,3314,3315,3318,3319,211,3322,211,3325,211,3328,211,3331,462],"li",{},[2177,3316,3317],{},"onInit"," - establishes connection with automatic retry on transient errors (",[185,3320,3321],{},"ECONNREFUSED",[185,3323,3324],{},"ECONNRESET",[185,3326,3327],{},"ETIMEDOUT",[185,3329,3330],{},"ENOTFOUND",[185,3332,3333],{},"EAI_AGAIN",[3313,3335,3336,3339],{},[2177,3337,3338],{},"onDestroy"," - closes the connection gracefully",[198,3341,33],{"id":3342},"testing",[182,3344,3345,3346,3349],{},"Override services at the DI level with ",[185,3347,3348],{},"TestApp.override()"," - handlers call your service, not the database directly, so you don't need to stub the Drizzle proxy API.",[224,3351,3353],{"className":304,"code":3352,"language":306,"meta":230,"style":230},"import { TestApp } from '@miiajs\u002Fcore\u002Ftesting'\nimport { AppModule } from '.\u002Fapp.module.js'\nimport { UsersService } from '.\u002Fusers\u002Fusers.service.js'\n\nconst app = await TestApp.create(AppModule)\n  .override(UsersService, {\n    findAll: async () => [{ id: 1, name: 'Alice' }]\n  })\n  .compile()\n\nconst res = await app.request('GET', '\u002Fusers')\nexpect(res.status).toBe(200)\nexpect(await res.json()).toEqual([{ id: 1, name: 'Alice' }])\n\nawait app.close()\n",[185,3354,3355,3375,3394,3414,3418,3439,3454,3499,3506,3515,3519,3558,3583,3636,3640],{"__ignoreMap":230},[234,3356,3357,3359,3361,3364,3366,3368,3370,3373],{"class":236,"line":237},[234,3358,314],{"class":313},[234,3360,318],{"class":317},[234,3362,3363],{"class":321}," TestApp",[234,3365,325],{"class":317},[234,3367,328],{"class":313},[234,3369,331],{"class":317},[234,3371,3372],{"class":244},"@miiajs\u002Fcore\u002Ftesting",[234,3374,337],{"class":317},[234,3376,3377,3379,3381,3383,3385,3387,3389,3392],{"class":236,"line":340},[234,3378,314],{"class":313},[234,3380,318],{"class":317},[234,3382,491],{"class":321},[234,3384,325],{"class":317},[234,3386,328],{"class":313},[234,3388,331],{"class":317},[234,3390,3391],{"class":244},".\u002Fapp.module.js",[234,3393,337],{"class":317},[234,3395,3396,3398,3400,3403,3405,3407,3409,3412],{"class":236,"line":360},[234,3397,314],{"class":313},[234,3399,318],{"class":317},[234,3401,3402],{"class":321}," UsersService",[234,3404,325],{"class":317},[234,3406,328],{"class":313},[234,3408,331],{"class":317},[234,3410,3411],{"class":244},".\u002Fusers\u002Fusers.service.js",[234,3413,337],{"class":317},[234,3415,3416],{"class":236,"line":367},[234,3417,364],{"emptyLinePlaceholder":363},[234,3419,3420,3422,3425,3427,3429,3431,3433,3436],{"class":236,"line":383},[234,3421,2324],{"class":487},[234,3423,3424],{"class":321}," app ",[234,3426,935],{"class":317},[234,3428,1710],{"class":313},[234,3430,3363],{"class":321},[234,3432,402],{"class":317},[234,3434,3435],{"class":373},"create",[234,3437,3438],{"class":321},"(AppModule)\n",[234,3440,3441,3444,3447,3450,3452],{"class":236,"line":396},[234,3442,3443],{"class":317},"  .",[234,3445,3446],{"class":373},"override",[234,3448,3449],{"class":321},"(UsersService",[234,3451,657],{"class":317},[234,3453,558],{"class":317},[234,3455,3456,3459,3461,3464,3467,3469,3471,3474,3476,3478,3481,3483,3485,3487,3489,3492,3494,3496],{"class":236,"line":412},[234,3457,3458],{"class":373},"    findAll",[234,3460,390],{"class":317},[234,3462,3463],{"class":487}," async",[234,3465,3466],{"class":317}," ()",[234,3468,555],{"class":487},[234,3470,1700],{"class":321},[234,3472,3473],{"class":317},"{",[234,3475,1764],{"class":386},[234,3477,390],{"class":317},[234,3479,3480],{"class":653}," 1",[234,3482,657],{"class":317},[234,3484,1811],{"class":386},[234,3486,390],{"class":317},[234,3488,331],{"class":317},[234,3490,3491],{"class":244},"Alice",[234,3493,425],{"class":317},[234,3495,325],{"class":317},[234,3497,3498],{"class":321},"]\n",[234,3500,3501,3504],{"class":236,"line":431},[234,3502,3503],{"class":317},"  }",[234,3505,481],{"class":321},[234,3507,3508,3510,3513],{"class":236,"line":456},[234,3509,3443],{"class":317},[234,3511,3512],{"class":373},"compile",[234,3514,1489],{"class":321},[234,3516,3517],{"class":236,"line":467},[234,3518,364],{"emptyLinePlaceholder":363},[234,3520,3521,3523,3526,3528,3530,3533,3535,3538,3540,3542,3545,3547,3549,3551,3554,3556],{"class":236,"line":475},[234,3522,2324],{"class":487},[234,3524,3525],{"class":321}," res ",[234,3527,935],{"class":317},[234,3529,1710],{"class":313},[234,3531,3532],{"class":321}," app",[234,3534,402],{"class":317},[234,3536,3537],{"class":373},"request",[234,3539,377],{"class":321},[234,3541,425],{"class":317},[234,3543,3544],{"class":244},"GET",[234,3546,425],{"class":317},[234,3548,657],{"class":317},[234,3550,331],{"class":317},[234,3552,3553],{"class":244},"\u002Fusers",[234,3555,425],{"class":317},[234,3557,481],{"class":321},[234,3559,3560,3563,3566,3568,3571,3573,3576,3578,3581],{"class":236,"line":484},[234,3561,3562],{"class":373},"expect",[234,3564,3565],{"class":321},"(res",[234,3567,402],{"class":317},[234,3569,3570],{"class":321},"status)",[234,3572,402],{"class":317},[234,3574,3575],{"class":373},"toBe",[234,3577,377],{"class":321},[234,3579,3580],{"class":653},"200",[234,3582,481],{"class":321},[234,3584,3585,3587,3589,3592,3595,3597,3600,3603,3605,3608,3611,3613,3615,3617,3619,3621,3623,3625,3627,3629,3631,3633],{"class":236,"line":1362},[234,3586,3562],{"class":373},[234,3588,377],{"class":321},[234,3590,3591],{"class":313},"await",[234,3593,3594],{"class":321}," res",[234,3596,402],{"class":317},[234,3598,3599],{"class":373},"json",[234,3601,3602],{"class":321},"())",[234,3604,402],{"class":317},[234,3606,3607],{"class":373},"toEqual",[234,3609,3610],{"class":321},"([",[234,3612,3473],{"class":317},[234,3614,1764],{"class":386},[234,3616,390],{"class":317},[234,3618,3480],{"class":653},[234,3620,657],{"class":317},[234,3622,1811],{"class":386},[234,3624,390],{"class":317},[234,3626,331],{"class":317},[234,3628,3491],{"class":244},[234,3630,425],{"class":317},[234,3632,325],{"class":317},[234,3634,3635],{"class":321},"])\n",[234,3637,3638],{"class":236,"line":1669},[234,3639,364],{"emptyLinePlaceholder":363},[234,3641,3642,3644,3646,3648,3651],{"class":236,"line":1674},[234,3643,3591],{"class":313},[234,3645,3532],{"class":321},[234,3647,402],{"class":317},[234,3649,3650],{"class":373},"close",[234,3652,1489],{"class":321},[182,3654,3655],{},"For unit tests that exercise the service itself, override the database token instead:",[224,3657,3659],{"className":304,"code":3658,"language":306,"meta":230,"style":230},"import { drizzleDb } from '@miiajs\u002Fdrizzle'\n\nconst app = await TestApp.create(AppModule)\n  .override(drizzleDb(), mockDb)\n  .compile()\n",[185,3660,3661,3679,3683,3701,3719],{"__ignoreMap":230},[234,3662,3663,3665,3667,3669,3671,3673,3675,3677],{"class":236,"line":237},[234,3664,314],{"class":313},[234,3666,318],{"class":317},[234,3668,1402],{"class":321},[234,3670,325],{"class":317},[234,3672,328],{"class":313},[234,3674,331],{"class":317},[234,3676,187],{"class":244},[234,3678,337],{"class":317},[234,3680,3681],{"class":236,"line":340},[234,3682,364],{"emptyLinePlaceholder":363},[234,3684,3685,3687,3689,3691,3693,3695,3697,3699],{"class":236,"line":360},[234,3686,2324],{"class":487},[234,3688,3424],{"class":321},[234,3690,935],{"class":317},[234,3692,1710],{"class":313},[234,3694,3363],{"class":321},[234,3696,402],{"class":317},[234,3698,3435],{"class":373},[234,3700,3438],{"class":321},[234,3702,3703,3705,3707,3709,3712,3714,3716],{"class":236,"line":367},[234,3704,3443],{"class":317},[234,3706,3446],{"class":373},[234,3708,377],{"class":321},[234,3710,3711],{"class":373},"drizzleDb",[234,3713,978],{"class":321},[234,3715,657],{"class":317},[234,3717,3718],{"class":321}," mockDb)\n",[234,3720,3721,3723,3725],{"class":236,"line":383},[234,3722,3443],{"class":317},[234,3724,3512],{"class":373},[234,3726,1489],{"class":321},[198,3728,3730],{"id":3729},"exports","Exports",[224,3732,3734],{"className":304,"code":3733,"language":306,"meta":230,"style":230},"import {\n  DrizzleModule,\n  drizzleDb,\n  type Dialect,\n  type DrizzleModuleOptions,\n  type DrizzleDbToken,\n} from '@miiajs\u002Fdrizzle'\n",[185,3735,3736,3742,3749,3756,3766,3774,3783],{"__ignoreMap":230},[234,3737,3738,3740],{"class":236,"line":237},[234,3739,314],{"class":313},[234,3741,558],{"class":317},[234,3743,3744,3747],{"class":236,"line":340},[234,3745,3746],{"class":321},"  DrizzleModule",[234,3748,428],{"class":317},[234,3750,3751,3754],{"class":236,"line":360},[234,3752,3753],{"class":321},"  drizzleDb",[234,3755,428],{"class":317},[234,3757,3758,3761,3764],{"class":236,"line":367},[234,3759,3760],{"class":313},"  type",[234,3762,3763],{"class":321}," Dialect",[234,3765,428],{"class":317},[234,3767,3768,3770,3772],{"class":236,"line":383},[234,3769,3760],{"class":313},[234,3771,700],{"class":321},[234,3773,428],{"class":317},[234,3775,3776,3778,3781],{"class":236,"line":396},[234,3777,3760],{"class":313},[234,3779,3780],{"class":321}," DrizzleDbToken",[234,3782,428],{"class":317},[234,3784,3785,3787,3789,3791,3793],{"class":236,"line":412},[234,3786,478],{"class":317},[234,3788,328],{"class":313},[234,3790,331],{"class":317},[234,3792,187],{"class":244},[234,3794,337],{"class":317},[3796,3797,3798],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":230,"searchDepth":340,"depth":340,"links":3800},[3801,3802,3806,3807,3808,3809,3812,3813,3814,3815,3816,3817],{"id":200,"depth":340,"text":13},{"id":295,"depth":340,"text":296,"children":3803},[3804,3805],{"id":300,"depth":360,"text":301},{"id":686,"depth":360,"text":687},{"id":853,"depth":340,"text":854},{"id":1177,"depth":340,"text":1178},{"id":1371,"depth":340,"text":1372},{"id":2128,"depth":340,"text":2129,"children":3810},[3811],{"id":2212,"depth":360,"text":2213},{"id":2382,"depth":340,"text":2383},{"id":2739,"depth":340,"text":2740},{"id":3237,"depth":340,"text":3238},{"id":3307,"depth":340,"text":3308},{"id":3342,"depth":340,"text":33},{"id":3729,"depth":340,"text":3730},"Drizzle ORM integration for PostgreSQL, MySQL, and SQLite.","md",{},{"title":135,"description":3818},"J8s_H2VipVEyFYT-lpazBtZuIec-Bjh8XoIfW205R1o",[3824,3826],{"title":131,"path":132,"stem":133,"description":3825,"children":-1},"Injectable JwtService for signing and verifying JSON Web Tokens - a thin wrapper around jose.",{"title":139,"path":140,"stem":141,"description":3827,"children":-1},"MongoDB integration via Papr with schema validation, model registration, and standard `inject()` API.",1778575273979]