@fragno-dev/db 0.1.15 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/.turbo/turbo-build.log +242 -179
  2. package/CHANGELOG.md +23 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +5 -5
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -21
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -54
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +3 -0
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +36 -28
  14. package/dist/adapters/drizzle/generate.js.map +1 -1
  15. package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
  16. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
  17. package/dist/adapters/generic-sql/driver-config.js +94 -0
  18. package/dist/adapters/generic-sql/driver-config.js.map +1 -0
  19. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
  20. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
  21. package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
  22. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
  23. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
  24. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
  25. package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
  26. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
  27. package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
  28. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
  29. package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
  30. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
  31. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
  32. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
  33. package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
  34. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  35. package/dist/adapters/generic-sql/migration/executor.js +18 -0
  36. package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
  37. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  38. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  39. package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
  40. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
  41. package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
  42. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
  43. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
  44. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
  45. package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
  46. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
  47. package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
  48. package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
  49. package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
  50. package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
  51. package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
  52. package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
  53. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
  54. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
  55. package/dist/adapters/generic-sql/query/select-builder.js +69 -0
  56. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
  57. package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
  58. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
  59. package/dist/adapters/generic-sql/query/where-builder.js +129 -0
  60. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
  61. package/dist/adapters/generic-sql/result-interpreter.js +74 -0
  62. package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
  63. package/dist/adapters/generic-sql/uow-decoder.js +105 -0
  64. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
  65. package/dist/adapters/generic-sql/uow-encoder.js +93 -0
  66. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
  67. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -18
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -165
  70. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  71. package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +47 -61
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{drizzle/shared.d.ts → shared/table-name-mapper.d.ts} +2 -4
  74. package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
  75. package/dist/adapters/shared/table-name-mapper.js +43 -0
  76. package/dist/adapters/shared/table-name-mapper.js.map +1 -0
  77. package/dist/adapters/shared/uow-operation-compiler.js +105 -0
  78. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
  79. package/dist/db-fragment-definition-builder.d.ts +53 -19
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  81. package/dist/db-fragment-definition-builder.js +89 -19
  82. package/dist/db-fragment-definition-builder.js.map +1 -1
  83. package/dist/fragments/internal-fragment.d.ts +39 -5
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  85. package/dist/fragments/internal-fragment.js +82 -10
  86. package/dist/fragments/internal-fragment.js.map +1 -1
  87. package/dist/hooks/hooks.d.ts +51 -0
  88. package/dist/hooks/hooks.d.ts.map +1 -0
  89. package/dist/hooks/hooks.js +88 -0
  90. package/dist/hooks/hooks.js.map +1 -0
  91. package/dist/migration-engine/generation-engine.d.ts +0 -2
  92. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  93. package/dist/migration-engine/generation-engine.js +23 -61
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +34 -10
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +47 -16
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/{rou3@0.7.8 → rou3@0.7.10}/node_modules/rou3/dist/index.js +1 -1
  100. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
  101. package/dist/packages/fragno/dist/api/fragment-instantiator.js +69 -31
  102. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
  103. package/dist/query/column-defaults.js +27 -0
  104. package/dist/query/column-defaults.js.map +1 -0
  105. package/dist/query/cursor.d.ts +4 -4
  106. package/dist/query/cursor.d.ts.map +1 -1
  107. package/dist/query/cursor.js +8 -6
  108. package/dist/query/cursor.js.map +1 -1
  109. package/dist/query/orm/orm.d.ts +1 -1
  110. package/dist/query/orm/orm.js.map +1 -1
  111. package/dist/query/serialize/create-sql-serializer.js +30 -0
  112. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  113. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  114. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  115. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  116. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  117. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  118. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  119. package/dist/query/serialize/sql-serializer.js +67 -0
  120. package/dist/query/serialize/sql-serializer.js.map +1 -0
  121. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +5 -5
  122. package/dist/query/simple-query-interface.d.ts.map +1 -0
  123. package/dist/query/{execute-unit-of-work.d.ts → unit-of-work/execute-unit-of-work.d.ts} +13 -3
  124. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  125. package/dist/query/{execute-unit-of-work.js → unit-of-work/execute-unit-of-work.js} +17 -4
  126. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  127. package/dist/query/{retry-policy.d.ts → unit-of-work/retry-policy.d.ts} +1 -1
  128. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  129. package/dist/query/{retry-policy.js → unit-of-work/retry-policy.js} +1 -1
  130. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  131. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +51 -18
  132. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  133. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +58 -11
  134. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  135. package/dist/query/value-decoding.js +71 -0
  136. package/dist/query/value-decoding.js.map +1 -0
  137. package/dist/query/value-encoding.js +124 -0
  138. package/dist/query/value-encoding.js.map +1 -0
  139. package/dist/schema/create.d.ts +3 -0
  140. package/dist/schema/create.d.ts.map +1 -1
  141. package/dist/schema/create.js +4 -0
  142. package/dist/schema/create.js.map +1 -1
  143. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  144. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  145. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  146. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  147. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  148. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  149. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  150. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  151. package/dist/schema/type-conversion/type-mapping.js +63 -0
  152. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  153. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  154. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  155. package/dist/sql-driver/connection/connection-provider.js +19 -0
  156. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  157. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  158. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  159. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  160. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  161. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  162. package/dist/sql-driver/dialects/dialects.js +3 -0
  163. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  164. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  165. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  166. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  167. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  168. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  169. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  170. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  171. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  172. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  173. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  174. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  175. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  176. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  177. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  178. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  179. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  180. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  181. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  182. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  183. package/dist/sql-driver/sql-driver.d.ts +38 -0
  184. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  185. package/dist/sql-driver/sql-driver.js +1 -0
  186. package/dist/sql-driver/sql.js +50 -0
  187. package/dist/sql-driver/sql.js.map +1 -0
  188. package/dist/with-database.d.ts +6 -2
  189. package/dist/with-database.d.ts.map +1 -1
  190. package/dist/with-database.js +1 -1
  191. package/dist/with-database.js.map +1 -1
  192. package/package.json +37 -10
  193. package/src/adapters/adapters.ts +8 -5
  194. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +60 -169
  195. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +31 -55
  196. package/src/adapters/drizzle/drizzle-adapter.ts +15 -107
  197. package/src/adapters/drizzle/generate.test.ts +2 -2
  198. package/src/adapters/drizzle/generate.ts +78 -34
  199. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  200. package/src/adapters/drizzle/shared.ts +0 -34
  201. package/src/adapters/drizzle/test-utils.ts +3 -3
  202. package/src/adapters/generic-sql/README.md +14 -0
  203. package/src/adapters/generic-sql/driver-config.ts +144 -0
  204. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  205. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  206. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  207. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  208. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  209. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  210. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  211. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  212. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  213. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  214. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  215. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  216. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  217. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  218. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  219. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  220. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  221. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  222. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  223. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  224. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  225. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  226. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  227. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  228. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  229. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  230. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  231. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  232. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  233. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  234. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  235. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  236. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  237. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +26 -76
  238. package/src/adapters/kysely/{kysely-adapter-sqlite.test.ts → kysely-adapter-sqlocal.test.ts} +76 -17
  239. package/src/adapters/kysely/kysely-adapter.ts +10 -250
  240. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +110 -104
  241. package/src/adapters/shared/table-name-mapper.ts +50 -0
  242. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  243. package/src/db-fragment-definition-builder.test.ts +2 -2
  244. package/src/db-fragment-definition-builder.ts +281 -50
  245. package/src/db-fragment-instantiator.test.ts +78 -2
  246. package/src/db-fragment-integration.test.ts +14 -16
  247. package/src/fragments/internal-fragment.test.ts +434 -45
  248. package/src/fragments/internal-fragment.ts +184 -20
  249. package/src/hooks/hooks.test.ts +575 -0
  250. package/src/hooks/hooks.ts +179 -0
  251. package/src/migration-engine/generation-engine.test.ts +44 -54
  252. package/src/migration-engine/generation-engine.ts +48 -94
  253. package/src/mod.ts +117 -29
  254. package/src/query/column-defaults.ts +49 -0
  255. package/src/query/cursor.test.ts +31 -6
  256. package/src/query/cursor.ts +11 -7
  257. package/src/query/orm/orm.ts +1 -1
  258. package/src/query/query-type.test.ts +9 -9
  259. package/src/query/serialize/create-sql-serializer.ts +34 -0
  260. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  261. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  262. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  263. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  264. package/src/query/serialize/sql-serializer.ts +143 -0
  265. package/src/query/{query.ts → simple-query-interface.ts} +2 -2
  266. package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts} +16 -16
  267. package/src/query/{execute-unit-of-work.ts → unit-of-work/execute-unit-of-work.ts} +49 -8
  268. package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts} +41 -43
  269. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +5 -3
  270. package/src/query/{unit-of-work.test.ts → unit-of-work/unit-of-work.test.ts} +100 -9
  271. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +135 -32
  272. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -427
  273. package/src/query/value-decoding.ts +113 -0
  274. package/src/query/value-encoding.test.ts +390 -0
  275. package/src/query/value-encoding.ts +168 -0
  276. package/src/schema/create.test.ts +5 -1
  277. package/src/schema/create.ts +5 -0
  278. package/src/schema/serialize.test.ts +165 -407
  279. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  280. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  281. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  282. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  283. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  284. package/src/schema/type-conversion/type-mapping.ts +153 -0
  285. package/src/shared/connection-pool.ts +5 -5
  286. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  287. package/src/sql-driver/connection/connection-provider.ts +27 -0
  288. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  289. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  290. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  291. package/src/sql-driver/dialects/dialects.ts +1 -0
  292. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  293. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  294. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  295. package/src/sql-driver/query-executor/plugin.ts +22 -0
  296. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  297. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  298. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  299. package/src/sql-driver/sql-driver.ts +53 -0
  300. package/src/sql-driver/sql.ts +57 -0
  301. package/src/sql-driver/sqlocal.test.ts +117 -0
  302. package/src/with-database.ts +35 -23
  303. package/tsdown.config.ts +7 -2
  304. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  305. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  306. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  307. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  308. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  309. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  310. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  311. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -334
  312. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  313. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -123
  314. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  315. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -160
  316. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  317. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  318. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  319. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  320. package/dist/adapters/drizzle/shared.js +0 -35
  321. package/dist/adapters/drizzle/shared.js.map +0 -1
  322. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  323. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  324. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  325. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  326. package/dist/adapters/kysely/kysely-query-compiler.js +0 -67
  327. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  328. package/dist/adapters/kysely/kysely-query.d.ts +0 -23
  329. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  330. package/dist/adapters/kysely/kysely-query.js +0 -230
  331. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  332. package/dist/adapters/kysely/kysely-shared.d.ts +0 -14
  333. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  334. package/dist/adapters/kysely/kysely-shared.js +0 -33
  335. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  336. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -193
  337. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  338. package/dist/adapters/kysely/kysely-uow-executor.js +0 -93
  339. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  340. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  341. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  342. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  343. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  344. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  345. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  346. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  347. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  348. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  349. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  350. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  351. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  352. package/dist/adapters/kysely/migration/execute.js +0 -34
  353. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  354. package/dist/migration-engine/create.d.ts +0 -37
  355. package/dist/migration-engine/create.d.ts.map +0 -1
  356. package/dist/migration-engine/create.js +0 -58
  357. package/dist/migration-engine/create.js.map +0 -1
  358. package/dist/migration-engine/shared.d.ts +0 -112
  359. package/dist/migration-engine/shared.d.ts.map +0 -1
  360. package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +0 -1
  361. package/dist/query/execute-unit-of-work.d.ts.map +0 -1
  362. package/dist/query/execute-unit-of-work.js.map +0 -1
  363. package/dist/query/query.d.ts.map +0 -1
  364. package/dist/query/result-transform.js +0 -170
  365. package/dist/query/result-transform.js.map +0 -1
  366. package/dist/query/retry-policy.d.ts.map +0 -1
  367. package/dist/query/retry-policy.js.map +0 -1
  368. package/dist/query/unit-of-work.d.ts.map +0 -1
  369. package/dist/query/unit-of-work.js.map +0 -1
  370. package/dist/schema/serialize.js +0 -111
  371. package/dist/schema/serialize.js.map +0 -1
  372. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -122
  373. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  374. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  375. package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +0 -1442
  376. package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +0 -1414
  377. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1400
  378. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -677
  379. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -228
  380. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -309
  381. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  382. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  383. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  384. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  385. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  386. package/src/adapters/kysely/kysely-query-compiler.ts +0 -127
  387. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  388. package/src/adapters/kysely/kysely-query.ts +0 -399
  389. package/src/adapters/kysely/kysely-shared.ts +0 -57
  390. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -986
  391. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -350
  392. package/src/adapters/kysely/kysely-uow-executor.ts +0 -164
  393. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -794
  394. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  395. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  396. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  397. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  398. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  399. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  400. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  401. package/src/adapters/kysely/migration/execute.ts +0 -50
  402. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  403. package/src/query/result-transform.ts +0 -274
  404. package/src/schema/serialize.ts +0 -407
  405. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
  406. /package/src/query/{retry-policy.test.ts → unit-of-work/retry-policy.test.ts} +0 -0
  407. /package/src/query/{retry-policy.ts → unit-of-work/retry-policy.ts} +0 -0
package/README.md CHANGED
@@ -1,13 +1,128 @@
1
1
  # @fragno-dev/db
2
2
 
3
- ## Attribution & Original Source
3
+ Optional, ORM-agnostic database layer for Fragno libraries.
4
4
 
5
- **Important:** A significant portion of this package's codebase is adopted from
6
- [fumadb](https://github.com/fuma-nama/fumadb), which is licensed under the MIT License.
5
+ Library authors define a type-safe schema; users plug in their existing Kysely or Drizzle setup so
6
+ data is written directly into their database.
7
7
 
8
- - **Project:** fumadb
9
- - **Author:** Fuma Nama and contributors
10
- - **License:** MIT
11
- - **Source:** https://github.com/fuma-nama/fumadb
8
+ Full docs live at
9
+ [Database integration for library authors](https://fragno.dev/docs/fragno/for-library-authors/database-integration/overview).
12
10
 
13
- We are grateful to Fuma Nama for their excellent work on the original implementation.
11
+ ## Who is this for?
12
+
13
+ - **Library authors** who want to ship a full-stack library that needs persistent storage, without
14
+ owning the user's database.
15
+
16
+ Your library defines the schema and queries; your users provide the database adapter.
17
+
18
+ ## Quick start
19
+
20
+ ### 1. Install
21
+
22
+ ```bash
23
+ npm install @fragno-dev/db @fragno-dev/core
24
+ # or
25
+ pnpm add @fragno-dev/db @fragno-dev/core
26
+ ```
27
+
28
+ And make sure to install the CLI to perform migrations / schema generation:
29
+
30
+ ```bash
31
+ npm install --save-dev @fragno-dev/cli
32
+ # or
33
+ pnpm add --dev @fragno-dev/cli
34
+ ```
35
+
36
+ ### 2. Define a schema
37
+
38
+ ```ts
39
+ // schema.ts
40
+ import { schema, idColumn, column } from "@fragno-dev/db/schema";
41
+
42
+ export const commentSchema = schema((s) => {
43
+ return s
44
+ .addTable("comment", (t) => {
45
+ return t
46
+ .addColumn("id", idColumn())
47
+ .addColumn("content", column("string"))
48
+ .addColumn("userId", column("string"))
49
+ .addColumn("postId", column("string"));
50
+ })
51
+ .addTable("user", (t) => {
52
+ return t.addColumn("id", idColumn()).addColumn("name", column("string"));
53
+ });
54
+ });
55
+ ```
56
+
57
+ ### 3. Attach it to your library
58
+
59
+ ```ts
60
+ // index.ts
61
+ import { defineFragment, instantiate } from "@fragno-dev/core";
62
+ import { withDatabase, type FragnoPublicConfigWithDatabase } from "@fragno-dev/db";
63
+ import { commentSchema } from "./schema";
64
+
65
+ export interface CommentLibraryConfig {
66
+ maxCommentsPerPost?: number;
67
+ }
68
+
69
+ const commentLibraryDef = defineFragment<CommentLibraryConfig>("comment-library")
70
+ // --> use .extend to add the database layer <--
71
+ .extend(withDatabase(commentSchema))
72
+ .providesBaseService(({ db }) => {
73
+ return {
74
+ createComment: async (data: { content: string; userId: string; postId: string }) => {
75
+ const id = await db.create("comment", data);
76
+ return { id: id.toJSON(), ...data };
77
+ },
78
+ };
79
+ })
80
+ .build();
81
+
82
+ export function createCommentLibrary(
83
+ config: CommentLibraryConfig = {},
84
+ options: FragnoPublicConfigWithDatabase,
85
+ ) {
86
+ return instantiate(commentLibraryDef)
87
+ .withConfig(config)
88
+ .withRoutes([])
89
+ .withOptions(options)
90
+ .build();
91
+ }
92
+ ```
93
+
94
+ Your users pass their own database adapter (Kysely or Drizzle) via `options`.
95
+
96
+ ## Key features
97
+
98
+ - **Schema definition**: define tables, columns, indexes, and relations with a fluent, typed API.
99
+ - **Type-safe ORM**: full TypeScript inference for queries and results.
100
+ - **User-owned database**: your library never owns the database; users provide the adapter.
101
+ - **ORM agnostic**: works with Kysely or Drizzle (and more to come).
102
+ - **Namespaced tables**: avoids conflicts with user tables.
103
+
104
+ ## ORM and database support
105
+
106
+ `@fragno-dev/db` works with:
107
+
108
+ - **Kysely**
109
+ - **Drizzle**
110
+
111
+ Backed by Postgres and SQLite, including PGLite and Cloudflare Durable Objects.
112
+
113
+ ## Docs and examples
114
+
115
+ - **Overview**:
116
+ [Database integration for library authors](https://fragno.dev/docs/fragno/for-library-authors/database-integration/overview)
117
+ - **Schemas**:
118
+ [Defining schemas](https://fragno.dev/docs/fragno/for-library-authors/database-integration/defining-schemas)
119
+ - **Querying**:
120
+ [Querying API](https://fragno.dev/docs/fragno/for-library-authors/database-integration/querying)
121
+ - **Example library**:
122
+ [`example-fragments/fragno-db-library`](https://github.com/rejot-dev/fragno/tree/main/example-fragments/fragno-db-library)
123
+
124
+ ## Attribution
125
+
126
+ **Important:** A portion of this package's codebase is adopted from
127
+ [fumadb](https://github.com/fuma-nama/fumadb), which is licensed under the MIT License. We are
128
+ grateful to Fuma Nama (and contributors) for their excellent work on the original implementation.
@@ -1,8 +1,8 @@
1
1
  import { AnySchema } from "../schema/create.js";
2
- import { Migrator } from "../migration-engine/create.js";
3
- import { IUnitOfWork } from "../query/unit-of-work.js";
4
- import { AbstractQuery } from "../query/query.js";
2
+ import { IUnitOfWork } from "../query/unit-of-work/unit-of-work.js";
3
+ import { SimpleQueryInterface } from "../query/simple-query-interface.js";
5
4
  import { SchemaGenerator } from "../schema-generator/schema-generator.js";
5
+ import { PreparedMigrations } from "./generic-sql/migration/prepared-migrations.js";
6
6
  import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
7
7
 
8
8
  //#region src/adapters/adapters.d.ts
@@ -34,8 +34,8 @@ interface DatabaseAdapter<TUOWConfig = void> {
34
34
  * Get current schema version, undefined if not initialized.
35
35
  */
36
36
  getSchemaVersion(namespace: string): Promise<string | undefined>;
37
- createQueryEngine: <const T extends AnySchema>(schema: T, namespace: string) => AbstractQuery<T, TUOWConfig>;
38
- createMigrationEngine?: <const T extends AnySchema>(schema: T, namespace: string) => Migrator;
37
+ createQueryEngine: <const T extends AnySchema>(schema: T, namespace: string) => SimpleQueryInterface<T, TUOWConfig>;
38
+ prepareMigrations?: <const T extends AnySchema>(schema: T, namespace: string) => PreparedMigrations;
39
39
  /**
40
40
  * Generate a combined schema file from one or more fragments.
41
41
  * If not implemented, schema generation is not supported for this adapter.
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;;;cAOa;cACA;AADb;AACA;AAMA;AAOA;AAKiB,KAZL,sBAAA,GAYoB;EAC7B,GAAA,EAZI,WAYJ;CACA;;;;AAamC,UApBrB,eAAA,CAoBqB;EAC1B,UAAA,CAAA,WAAA,EAAA,MAAA,CAAA,EAAA,MAAA;EAES,SAAA,CAAA,YAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;AAAd,UAlBU,eAkBV,CAAA,aAAA,IAAA,CAAA,CAAA;EAEoC,CAnBxC,mCAAA,CAmBwC,EAAA,MAAA;EAAmB,CAlB3D,sCAAA,CAkB2D,EAAA,MAAA;EAAyB;;;;EAiB1D,SAAA,cAAA,EA7BF,qBA6BE,CA7BoB,sBA6BpB,CAAA;EAEd;;;uCA1BwB;sCAED,mBAC1B,yBAEL,cAAc,GAAG;2CAEmB,mBAAmB,yBAAyB;;;;;;YAO9D;;;;QAElB;;;;;gDAMyC;6BAEnB;eAEd"}
1
+ {"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;;;cAOa;cACA;AADb;AACA;AAMA;AAOA;AAKiB,KAZL,sBAAA,GAYoB;EAC7B,GAAA,EAZI,WAYJ;CACA;;;;AAamC,UApBrB,eAAA,CAoBqB;EAC1B,UAAA,CAAA,WAAA,EAAA,MAAA,CAAA,EAAA,MAAA;EAEgB,SAAA,CAAA,YAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;AAArB,UAlBU,eAkBV,CAAA,aAAA,IAAA,CAAA,CAAA;EAEgC,CAnBpC,mCAAA,CAmBoC,EAAA,MAAA;EAC3B,CAnBT,sCAAA,CAmBS,EAAA,MAAA;EAEL;;;;EAiBsB,SAAA,cAAA,EAhCF,qBAgCE,CAhCoB,sBAgCpB,CAAA;EAEd;;;uCA7BwB;sCAED,mBAC1B,yBAEL,qBAAqB,GAAG;uCAEQ,mBAC3B,yBAEL;;;;;;YAOkB;;;;QAElB;;;;;gDAMyC;6BAEnB;eAEd"}
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":["import type { Migrator } from \"../migration-engine/create\";\nimport type { AbstractQuery } from \"../query/query\";\nimport type { SchemaGenerator } from \"../schema-generator/schema-generator\";\nimport type { AnySchema } from \"../schema/create\";\nimport type { RequestContextStorage } from \"@fragno-dev/core/internal/request-context-storage\";\nimport type { IUnitOfWork } from \"../query/unit-of-work\";\n\nexport const fragnoDatabaseAdapterNameFakeSymbol = \"$fragno-database-adapter-name\" as const;\nexport const fragnoDatabaseAdapterVersionFakeSymbol = \"$fragno-database-adapter-version\" as const;\n\n/**\n * Storage type for database context - stores the Unit of Work.\n * This is shared across all fragments using the same adapter.\n */\nexport type DatabaseContextStorage = {\n uow: IUnitOfWork;\n};\n\n/**\n * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)\n */\nexport interface TableNameMapper {\n toPhysical(logicalName: string): string;\n toLogical(physicalName: string): string;\n}\n\nexport interface DatabaseAdapter<TUOWConfig = void> {\n [fragnoDatabaseAdapterNameFakeSymbol]: string;\n [fragnoDatabaseAdapterVersionFakeSymbol]: number;\n\n /**\n * Request context storage shared across all fragments using this adapter.\n * This allows multiple fragments to participate in the same Unit of Work.\n */\n readonly contextStorage: RequestContextStorage<DatabaseContextStorage>;\n\n /**\n * Get current schema version, undefined if not initialized.\n */\n getSchemaVersion(namespace: string): Promise<string | undefined>;\n\n createQueryEngine: <const T extends AnySchema>(\n schema: T,\n namespace: string,\n ) => AbstractQuery<T, TUOWConfig>;\n\n createMigrationEngine?: <const T extends AnySchema>(schema: T, namespace: string) => Migrator;\n\n /**\n * Generate a combined schema file from one or more fragments.\n * If not implemented, schema generation is not supported for this adapter.\n */\n createSchemaGenerator?: (\n fragments: { schema: AnySchema; namespace: string }[],\n options?: { path?: string },\n ) => SchemaGenerator;\n\n /**\n * Creates a table name mapper for the given namespace.\n * Used to convert between logical table names and physical table names.\n */\n createTableNameMapper: (namespace: string) => TableNameMapper;\n\n isConnectionHealthy: () => Promise<boolean>;\n\n close: () => Promise<void>;\n}\n"],"mappings":";AAOA,MAAa,sCAAsC;AACnD,MAAa,yCAAyC"}
1
+ {"version":3,"file":"adapters.js","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":["import type { SimpleQueryInterface } from \"../query/simple-query-interface\";\nimport type { SchemaGenerator } from \"../schema-generator/schema-generator\";\nimport type { AnySchema } from \"../schema/create\";\nimport type { RequestContextStorage } from \"@fragno-dev/core/internal/request-context-storage\";\nimport type { IUnitOfWork } from \"../query/unit-of-work/unit-of-work\";\nimport type { PreparedMigrations } from \"./generic-sql/migration/prepared-migrations\";\n\nexport const fragnoDatabaseAdapterNameFakeSymbol = \"$fragno-database-adapter-name\" as const;\nexport const fragnoDatabaseAdapterVersionFakeSymbol = \"$fragno-database-adapter-version\" as const;\n\n/**\n * Storage type for database context - stores the Unit of Work.\n * This is shared across all fragments using the same adapter.\n */\nexport type DatabaseContextStorage = {\n uow: IUnitOfWork;\n};\n\n/**\n * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)\n */\nexport interface TableNameMapper {\n toPhysical(logicalName: string): string;\n toLogical(physicalName: string): string;\n}\n\nexport interface DatabaseAdapter<TUOWConfig = void> {\n [fragnoDatabaseAdapterNameFakeSymbol]: string;\n [fragnoDatabaseAdapterVersionFakeSymbol]: number;\n\n /**\n * Request context storage shared across all fragments using this adapter.\n * This allows multiple fragments to participate in the same Unit of Work.\n */\n readonly contextStorage: RequestContextStorage<DatabaseContextStorage>;\n\n /**\n * Get current schema version, undefined if not initialized.\n */\n getSchemaVersion(namespace: string): Promise<string | undefined>;\n\n createQueryEngine: <const T extends AnySchema>(\n schema: T,\n namespace: string,\n ) => SimpleQueryInterface<T, TUOWConfig>;\n\n prepareMigrations?: <const T extends AnySchema>(\n schema: T,\n namespace: string,\n ) => PreparedMigrations;\n\n /**\n * Generate a combined schema file from one or more fragments.\n * If not implemented, schema generation is not supported for this adapter.\n */\n createSchemaGenerator?: (\n fragments: { schema: AnySchema; namespace: string }[],\n options?: { path?: string },\n ) => SchemaGenerator;\n\n /**\n * Creates a table name mapper for the given namespace.\n * Used to convert between logical table names and physical table names.\n */\n createTableNameMapper: (namespace: string) => TableNameMapper;\n\n isConnectionHealthy: () => Promise<boolean>;\n\n close: () => Promise<void>;\n}\n"],"mappings":";AAOA,MAAa,sCAAsC;AACnD,MAAa,yCAAyC"}
@@ -1,28 +1,13 @@
1
1
  import { AnySchema } from "../../schema/create.js";
2
- import { AbstractQuery } from "../../query/query.js";
3
2
  import { SchemaGenerator } from "../../schema-generator/schema-generator.js";
4
- import { DatabaseAdapter, DatabaseContextStorage, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
5
- import { TableNameMapper } from "./shared.js";
6
- import { DrizzleUOWConfig } from "./drizzle-query.js";
7
- import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
3
+ import { TableNameMapper } from "../shared/table-name-mapper.js";
4
+ import { DatabaseAdapter } from "../adapters.js";
5
+ import { GenericSQLAdapter, GenericSQLOptions, UnitOfWorkConfig } from "../generic-sql/generic-sql-adapter.js";
8
6
 
9
7
  //#region src/adapters/drizzle/drizzle-adapter.d.ts
10
- interface DrizzleConfig {
11
- db: unknown | (() => unknown | Promise<unknown>);
12
- provider: "sqlite" | "mysql" | "postgresql";
13
- }
14
- declare class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
15
- #private;
16
- constructor(config: DrizzleConfig);
17
- get [fragnoDatabaseAdapterNameFakeSymbol](): string;
18
- get [fragnoDatabaseAdapterVersionFakeSymbol](): number;
19
- get contextStorage(): RequestContextStorage<DatabaseContextStorage>;
20
- close(): Promise<void>;
8
+ declare class DrizzleAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
9
+ constructor(options: GenericSQLOptions);
21
10
  createTableNameMapper(namespace: string): TableNameMapper;
22
- get provider(): "sqlite" | "mysql" | "postgresql";
23
- isConnectionHealthy(): Promise<boolean>;
24
- getSchemaVersion(namespace: string): Promise<string | undefined>;
25
- createQueryEngine<TSchema extends AnySchema>(schema: TSchema, namespace: string): AbstractQuery<TSchema, DrizzleUOWConfig>;
26
11
  createSchemaGenerator(fragments: {
27
12
  schema: AnySchema;
28
13
  namespace: string;
@@ -31,5 +16,5 @@ declare class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
31
16
  }): SchemaGenerator;
32
17
  }
33
18
  //#endregion
34
- export { DrizzleAdapter, DrizzleConfig };
19
+ export { DrizzleAdapter };
35
20
  //# sourceMappingURL=drizzle-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-adapter.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UAiBiB,aAAA;iCACgB;EADhB,QAAA,EAAA,QAAa,GAAA,OACG,GAAA,YAAO;AAIxC;AAAuD,cAA1C,cAAA,YAA0B,eAAgB,CAAA,gBAAA,CAAA,CAAA;EAMjC,CAAA,OAAA;EAQf,WAAA,CAAA,MAAA,EARe,aAQf;EAIA,KAJA,mCAAA,GAIA,EAAA,MAAA;EAIuC,KAJvC,sCAAA,GAIuC,EAAA,MAAA;EAAtB,IAAA,cAAA,CAAA,CAAA,EAAA,qBAAA,CAAsB,sBAAtB,CAAA;EAIP,KAAA,CAAA,CAAA,EAAA,OAAA,CAAA,IAAA,CAAA;EAAO,qBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAAA,eAAA;EAYO,IAAA,QAAA,CAAA,CAAA,EAAA,QAAA,GAAA,OAAA,GAAA,YAAA;EAqBc,mBAAA,CAAA,CAAA,EArBd,OAqBc,CAAA,OAAA,CAAA;EAeT,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAfS,OAeT,CAAA,MAAA,GAAA,SAAA,CAAA;EACxB,iBAAA,CAAA,gBADwB,SACxB,CAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,CAAA,EAEP,aAFO,CAEO,OAFP,EAEgB,gBAFhB,CAAA;EAEO,qBAAA,CAAA,SAAA,EAAA;IAAS,MAAA,EAiBH,SAjBG;IAAvB,SAAA,EAAA,MAAA;EAiBoB,CAAA,EAAA,EAAA,OA9Fc,CA8Fd,EAAA;IAEpB,IAAA,CAAA,EAAA,MAAA;EAhGkC,CAAA,CAAA,EAgGlC,eAhGkC"}
1
+ {"version":3,"file":"drizzle-adapter.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;cAYa,cAAA,SAAuB,iBAAA,YAA6B,gBAAgB;uBAC1D;4CAAiB;EAD3B,qBAAe,CAAA,SAAA,EAAA;IAAqD,MAAA,EAUxD,SAVwD;IAC1D,SAAA,EAAA,MAAA;EAAiB,CAAA,EAAA,EAAA,OAWnC,CAXmC,EAAA;IASf,IAAA,CAAA,EAAA,MAAA;EAEpB,CAAA,CAAA,EAAA,eAAA"}
@@ -1,68 +1,21 @@
1
1
  import "../../schema/create.js";
2
- import { RequestContextStorage } from "../../packages/fragno/dist/api/request-context-storage.js";
3
- import { SETTINGS_TABLE_NAME, settingsSchema } from "../../fragments/internal-fragment.js";
4
- import { fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
5
- import { createTableNameMapper } from "./shared.js";
2
+ import { createTableNameMapper } from "../shared/table-name-mapper.js";
6
3
  import { generateSchema } from "./generate.js";
7
- import { fromDrizzle } from "./drizzle-query.js";
8
- import { createDrizzleConnectionPool } from "./drizzle-connection-pool.js";
9
- import { sql } from "drizzle-orm";
4
+ import { GenericSQLAdapter } from "../generic-sql/generic-sql-adapter.js";
10
5
 
11
6
  //#region src/adapters/drizzle/drizzle-adapter.ts
12
- var DrizzleAdapter = class {
13
- #connectionPool;
14
- #provider;
15
- #schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
16
- #contextStorage;
17
- constructor(config) {
18
- this.#connectionPool = createDrizzleConnectionPool(config.db);
19
- this.#provider = config.provider;
20
- this.#contextStorage = new RequestContextStorage();
21
- }
22
- get [fragnoDatabaseAdapterNameFakeSymbol]() {
23
- return "drizzle";
24
- }
25
- get [fragnoDatabaseAdapterVersionFakeSymbol]() {
26
- return 0;
27
- }
28
- get contextStorage() {
29
- return this.#contextStorage;
30
- }
31
- async close() {
32
- await this.#connectionPool.close();
7
+ var DrizzleAdapter = class extends GenericSQLAdapter {
8
+ constructor(options) {
9
+ super(options);
33
10
  }
34
11
  createTableNameMapper(namespace) {
35
- return createTableNameMapper(namespace);
36
- }
37
- get provider() {
38
- return this.#provider;
39
- }
40
- async isConnectionHealthy() {
41
- const conn = await this.#connectionPool.connect();
42
- try {
43
- const result = await conn.db.execute(sql`SELECT 1 as healthy`);
44
- if (Array.isArray(result)) return result.length > 0 && result[0]["healthy"] === 1;
45
- else return result.rows[0]["healthy"] === 1;
46
- } catch {
47
- return false;
48
- } finally {
49
- await conn.release();
50
- }
51
- }
52
- async getSchemaVersion(namespace) {
53
- const [[result]] = await this.createQueryEngine(settingsSchema, "").createUnitOfWork().find(SETTINGS_TABLE_NAME, (b) => b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.schema_version`))).executeRetrieve();
54
- return result?.value;
55
- }
56
- createQueryEngine(schema, namespace) {
57
- this.#schemaNamespaceMap.set(schema, namespace);
58
- const mapper = namespace ? createTableNameMapper(namespace) : void 0;
59
- return fromDrizzle(schema, this.#connectionPool, this.#provider, mapper, void 0, this.#schemaNamespaceMap);
12
+ return createTableNameMapper(namespace, false);
60
13
  }
61
14
  createSchemaGenerator(fragments, options) {
62
15
  return { generateSchema: (genOptions) => {
63
16
  const path = genOptions?.path ?? options?.path ?? "fragno-schema.ts";
64
17
  return {
65
- schema: generateSchema(fragments, this.#provider),
18
+ schema: generateSchema(fragments, this.driverConfig.databaseType, { mapperFactory: (ns) => ns ? this.createTableNameMapper(ns) : void 0 }),
66
19
  path
67
20
  };
68
21
  } };
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-adapter.js","names":["#connectionPool","#provider","#contextStorage","#schemaNamespaceMap"],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":["import type { DatabaseAdapter, DatabaseContextStorage } from \"../adapters\";\nimport { type AnySchema } from \"../../schema/create\";\nimport type { AbstractQuery } from \"../../query/query\";\nimport type { SchemaGenerator } from \"../../schema-generator/schema-generator\";\nimport { generateSchema } from \"./generate\";\nimport { fromDrizzle, type DrizzleUOWConfig } from \"./drizzle-query\";\nimport { createTableNameMapper, type DBType, type DrizzleResult } from \"./shared\";\nimport { sql } from \"drizzle-orm\";\nimport { settingsSchema, SETTINGS_TABLE_NAME } from \"../../fragments/internal-fragment\";\nimport {\n fragnoDatabaseAdapterNameFakeSymbol,\n fragnoDatabaseAdapterVersionFakeSymbol,\n} from \"../adapters\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\nimport { createDrizzleConnectionPool } from \"./drizzle-connection-pool\";\nimport { RequestContextStorage } from \"@fragno-dev/core/internal/request-context-storage\";\n\nexport interface DrizzleConfig {\n db: unknown | (() => unknown | Promise<unknown>);\n provider: \"sqlite\" | \"mysql\" | \"postgresql\";\n}\n\nexport class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {\n #connectionPool: ConnectionPool<DBType>;\n #provider: \"sqlite\" | \"mysql\" | \"postgresql\";\n #schemaNamespaceMap = new WeakMap<AnySchema, string>();\n #contextStorage: RequestContextStorage<DatabaseContextStorage>;\n\n constructor(config: DrizzleConfig) {\n this.#connectionPool = createDrizzleConnectionPool(\n config.db as DBType | (() => DBType | Promise<DBType>),\n );\n this.#provider = config.provider;\n this.#contextStorage = new RequestContextStorage();\n }\n\n get [fragnoDatabaseAdapterNameFakeSymbol](): string {\n return \"drizzle\";\n }\n\n get [fragnoDatabaseAdapterVersionFakeSymbol](): number {\n return 0;\n }\n\n get contextStorage(): RequestContextStorage<DatabaseContextStorage> {\n return this.#contextStorage;\n }\n\n async close(): Promise<void> {\n await this.#connectionPool.close();\n }\n\n createTableNameMapper(namespace: string) {\n return createTableNameMapper(namespace);\n }\n\n get provider(): \"sqlite\" | \"mysql\" | \"postgresql\" {\n return this.#provider;\n }\n\n async isConnectionHealthy(): Promise<boolean> {\n const conn = await this.#connectionPool.connect();\n try {\n const result = await conn.db.execute(sql`SELECT 1 as healthy`);\n\n // Handle different result formats across providers\n // PostgreSQL/MySQL: { rows: [...] }\n // SQLite: array directly or { rows: [...] }\n if (Array.isArray(result)) {\n return result.length > 0 && result[0][\"healthy\"] === 1;\n } else {\n const drizzleResult = result as DrizzleResult;\n return drizzleResult.rows[0][\"healthy\"] === 1;\n }\n } catch {\n return false;\n } finally {\n await conn.release();\n }\n }\n\n async getSchemaVersion(namespace: string): Promise<string | undefined> {\n // Note: This looks up arbitrary fragment schema versions (e.g., \"my-fragment.schema_version\")\n // which are different from Fragno's internal settings (prefixed with SETTINGS_NAMESPACE)\n // So we can't use the internal fragment here, we need direct query engine access\n const queryEngine = this.createQueryEngine(settingsSchema, \"\");\n\n const uow = queryEngine\n .createUnitOfWork()\n .find(SETTINGS_TABLE_NAME, (b) =>\n b.whereIndex(\"unique_key\", (eb) => eb(\"key\", \"=\", `${namespace}.schema_version`)),\n );\n const [[result]] = await uow.executeRetrieve();\n return result?.value;\n }\n\n createQueryEngine<TSchema extends AnySchema>(\n schema: TSchema,\n namespace: string,\n ): AbstractQuery<TSchema, DrizzleUOWConfig> {\n // Register schema-namespace mapping\n this.#schemaNamespaceMap.set(schema, namespace);\n\n // Only create mapper if namespace is non-empty\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n return fromDrizzle(\n schema,\n this.#connectionPool,\n this.#provider,\n mapper,\n undefined,\n this.#schemaNamespaceMap,\n );\n }\n\n createSchemaGenerator(\n fragments: { schema: AnySchema; namespace: string }[],\n options?: { path?: string },\n ): SchemaGenerator {\n return {\n generateSchema: (genOptions) => {\n const path = genOptions?.path ?? options?.path ?? \"fragno-schema.ts\";\n\n return {\n schema: generateSchema(fragments, this.#provider),\n path,\n };\n },\n };\n }\n}\n"],"mappings":";;;;;;;;;;;AAsBA,IAAa,iBAAb,MAAyE;CACvE;CACA;CACA,sCAAsB,IAAI,SAA4B;CACtD;CAEA,YAAY,QAAuB;AACjC,QAAKA,iBAAkB,4BACrB,OAAO,GACR;AACD,QAAKC,WAAY,OAAO;AACxB,QAAKC,iBAAkB,IAAI,uBAAuB;;CAGpD,KAAK,uCAA+C;AAClD,SAAO;;CAGT,KAAK,0CAAkD;AACrD,SAAO;;CAGT,IAAI,iBAAgE;AAClE,SAAO,MAAKA;;CAGd,MAAM,QAAuB;AAC3B,QAAM,MAAKF,eAAgB,OAAO;;CAGpC,sBAAsB,WAAmB;AACvC,SAAO,sBAAsB,UAAU;;CAGzC,IAAI,WAA8C;AAChD,SAAO,MAAKC;;CAGd,MAAM,sBAAwC;EAC5C,MAAM,OAAO,MAAM,MAAKD,eAAgB,SAAS;AACjD,MAAI;GACF,MAAM,SAAS,MAAM,KAAK,GAAG,QAAQ,GAAG,sBAAsB;AAK9D,OAAI,MAAM,QAAQ,OAAO,CACvB,QAAO,OAAO,SAAS,KAAK,OAAO,GAAG,eAAe;OAGrD,QADsB,OACD,KAAK,GAAG,eAAe;UAExC;AACN,UAAO;YACC;AACR,SAAM,KAAK,SAAS;;;CAIxB,MAAM,iBAAiB,WAAgD;EAWrE,MAAM,CAAC,CAAC,WAAW,MAPC,KAAK,kBAAkB,gBAAgB,GAAG,CAG3D,kBAAkB,CAClB,KAAK,sBAAsB,MAC1B,EAAE,WAAW,eAAe,OAAO,GAAG,OAAO,KAAK,GAAG,UAAU,iBAAiB,CAAC,CAClF,CAC0B,iBAAiB;AAC9C,SAAO,QAAQ;;CAGjB,kBACE,QACA,WAC0C;AAE1C,QAAKG,mBAAoB,IAAI,QAAQ,UAAU;EAG/C,MAAM,SAAS,YAAY,sBAAsB,UAAU,GAAG;AAC9D,SAAO,YACL,QACA,MAAKH,gBACL,MAAKC,UACL,QACA,QACA,MAAKE,mBACN;;CAGH,sBACE,WACA,SACiB;AACjB,SAAO,EACL,iBAAiB,eAAe;GAC9B,MAAM,OAAO,YAAY,QAAQ,SAAS,QAAQ;AAElD,UAAO;IACL,QAAQ,eAAe,WAAW,MAAKF,SAAU;IACjD;IACD;KAEJ"}
1
+ {"version":3,"file":"drizzle-adapter.js","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":["import type { DatabaseAdapter } from \"../adapters\";\nimport { type AnySchema } from \"../../schema/create\";\nimport type { SchemaGenerator } from \"../../schema-generator/schema-generator\";\nimport { generateSchema } from \"./generate\";\nimport { createTableNameMapper } from \"../shared/table-name-mapper\";\n\nimport {\n GenericSQLAdapter,\n type GenericSQLOptions,\n type UnitOfWorkConfig,\n} from \"../generic-sql/generic-sql-adapter\";\n\nexport class DrizzleAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {\n constructor(options: GenericSQLOptions) {\n super(options);\n }\n\n override createTableNameMapper(namespace: string) {\n return createTableNameMapper(namespace, false);\n }\n\n createSchemaGenerator(\n fragments: { schema: AnySchema; namespace: string }[],\n options?: { path?: string },\n ): SchemaGenerator {\n return {\n generateSchema: (genOptions) => {\n const path = genOptions?.path ?? options?.path ?? \"fragno-schema.ts\";\n\n return {\n schema: generateSchema(fragments, this.driverConfig.databaseType, {\n mapperFactory: (ns) => (ns ? this.createTableNameMapper(ns) : undefined),\n }),\n path,\n };\n },\n };\n }\n}\n"],"mappings":";;;;;;AAYA,IAAa,iBAAb,cAAoC,kBAA+D;CACjG,YAAY,SAA4B;AACtC,QAAM,QAAQ;;CAGhB,AAAS,sBAAsB,WAAmB;AAChD,SAAO,sBAAsB,WAAW,MAAM;;CAGhD,sBACE,WACA,SACiB;AACjB,SAAO,EACL,iBAAiB,eAAe;GAC9B,MAAM,OAAO,YAAY,QAAQ,SAAS,QAAQ;AAElD,UAAO;IACL,QAAQ,eAAe,WAAW,KAAK,aAAa,cAAc,EAChE,gBAAgB,OAAQ,KAAK,KAAK,sBAAsB,GAAG,GAAG,QAC/D,CAAC;IACF;IACD;KAEJ"}
@@ -1,4 +1,5 @@
1
1
  import { AnySchema } from "../../schema/create.js";
2
+ import { TableNameMapper } from "../shared/table-name-mapper.js";
2
3
  import { SQLProvider } from "../../shared/providers.js";
3
4
 
4
5
  //#region src/adapters/drizzle/generate.d.ts
@@ -11,6 +12,8 @@ interface GenerateSchemaOptions {
11
12
  /** Module to import from */
12
13
  from: string;
13
14
  };
15
+ /** Optional mapper factory for creating table name mappers with custom sanitization */
16
+ mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined;
14
17
  }
15
18
  /**
16
19
  * Generate a settings table for storing fragment versions
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","names":[],"sources":["../../../src/adapters/drizzle/generate.ts"],"sourcesContent":[],"mappings":";;;;KA6BY,iBAAA,GAAoB,QAAQ;UAyjBvB,qBAAA;EAzjBL;EAyjBK,iBAAA,CAAA,EAAA;IAgBD;IAC0B,IAAA,EAAA,MAAA;IAC9B;IACA,IAAA,EAAA,MAAA;EAAqB,CAAA;;;;;;;;iBAHjB,cAAA;;UAC0B;eAC9B,6BACA"}
1
+ {"version":3,"file":"generate.d.ts","names":[],"sources":["../../../src/adapters/drizzle/generate.ts"],"sourcesContent":[],"mappings":";;;;;KAkCY,iBAAA,GAAoB,QAAQ;UAulBvB,qBAAA;EAvlBL;EAulBK,iBAAA,CAAA,EAAA;IAkBD;IAC0B,IAAA,EAAA,MAAA;IAC9B;IACA,IAAA,EAAA,MAAA;EAAqB,CAAA;;qDAZoB;;;;;;;;iBASrC,cAAA;;UAC0B;eAC9B,6BACA"}
@@ -1,8 +1,8 @@
1
1
  import { InternalIdColumn } from "../../schema/create.js";
2
- import { schemaToDBType } from "../../schema/serialize.js";
3
2
  import { importGenerator } from "../../util/import-generator.js";
4
3
  import { ident, parseVarchar } from "../../util/parse.js";
5
- import { createTableNameMapper, sanitizeNamespace } from "./shared.js";
4
+ import { createTableNameMapper, sanitizeNamespace } from "../shared/table-name-mapper.js";
5
+ import { createSQLTypeMapper } from "../../schema/type-conversion/create-sql-type-mapper.js";
6
6
 
7
7
  //#region src/adapters/drizzle/generate.ts
8
8
  const PROVIDER_IMPORTS = {
@@ -50,7 +50,7 @@ function generateBinaryCustomType(ctx, customTypes) {
50
50
  const code = generateCustomType(ctx, name, {
51
51
  dataType: "Uint8Array",
52
52
  driverDataType: "Buffer",
53
- databaseDataType: schemaToDBType({ type: "binary" }, ctx.provider),
53
+ databaseDataType: createSQLTypeMapper(ctx.provider).getDatabaseType({ type: "binary" }),
54
54
  fromDriverCode: "return new Uint8Array(value.buffer, value.byteOffset, value.byteLength)",
55
55
  toDriverCode: `return value instanceof Buffer? value : Buffer.from(value)`
56
56
  });
@@ -59,10 +59,10 @@ function generateBinaryCustomType(ctx, customTypes) {
59
59
  }
60
60
  /**
61
61
  * Maps SQL database types to Drizzle function names and parameters.
62
- * Uses schemaToDBType as the source of truth for type conversion.
62
+ * Uses SQLTypeMapper as the source of truth for type conversion.
63
63
  */
64
64
  function getColumnTypeFunction(ctx, column, customTypes) {
65
- return mapDBTypeToDrizzleFunction(ctx, schemaToDBType(column, ctx.provider), column, customTypes);
65
+ return mapDBTypeToDrizzleFunction(ctx, createSQLTypeMapper(ctx.provider).getDatabaseType(column), column, customTypes);
66
66
  }
67
67
  /**
68
68
  * Maps a database type string to a Drizzle function name and parameters.
@@ -142,6 +142,13 @@ function mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes) {
142
142
  }
143
143
  return { name: dbType };
144
144
  }
145
+ /**
146
+ * Get the physical table name (with namespace suffix) using the mapper if available
147
+ */
148
+ function getPhysicalTableName(logicalName, namespace, mapper) {
149
+ if (!namespace) return logicalName;
150
+ return mapper ? mapper.toPhysical(logicalName) : `${logicalName}_${sanitizeNamespace(namespace)}`;
151
+ }
145
152
  function generateColumnDefinition(ctx, column, customTypes) {
146
153
  const parts = [];
147
154
  const typeFn = getColumnTypeFunction(ctx, column, customTypes);
@@ -180,8 +187,7 @@ function generateColumnDefinition(ctx, column, customTypes) {
180
187
  function generateAllColumns(ctx, table, customTypes) {
181
188
  return Object.values(table.columns).map((column) => generateColumnDefinition(ctx, column, customTypes));
182
189
  }
183
- function generateForeignKeys(ctx, table, namespace) {
184
- const mapper = namespace ? createTableNameMapper(namespace) : void 0;
190
+ function generateForeignKeys(ctx, table, namespace, mapper) {
185
191
  const keys = [];
186
192
  for (const relation of Object.values(table.relations)) {
187
193
  if (relation.type === "many") continue;
@@ -222,21 +228,21 @@ function generateIndexes(ctx, table, namespace) {
222
228
  }
223
229
  return indexes;
224
230
  }
225
- function generateTableConstraints(ctx, table, namespace) {
226
- return [...generateForeignKeys(ctx, table, namespace), ...generateIndexes(ctx, table, namespace)];
231
+ function generateTableConstraints(ctx, table, namespace, mapper) {
232
+ return [...generateForeignKeys(ctx, table, namespace, mapper), ...generateIndexes(ctx, table, namespace)];
227
233
  }
228
- function generateTable(ctx, table, customTypes, namespace) {
234
+ function generateTable(ctx, table, customTypes, namespace, mapper) {
229
235
  const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];
230
236
  ctx.imports.addImport(tableFn, ctx.importSource);
231
237
  const columns = generateAllColumns(ctx, table, customTypes);
232
- const constraints = generateTableConstraints(ctx, table, namespace);
233
- const physicalTableName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
234
- const exportName = physicalTableName;
238
+ const constraints = generateTableConstraints(ctx, table, namespace, mapper);
239
+ const physicalTableName = getPhysicalTableName(table.ormName, namespace, mapper);
240
+ const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
235
241
  const args = [`"${physicalTableName}"`, `{\n${columns.join(",\n")}\n}`];
236
242
  if (constraints.length > 0) args.push(`(table) => [\n${ident(constraints.join(",\n"))}\n]`);
237
243
  return `export const ${exportName} = ${tableFn}(${args.join(", ")})`;
238
244
  }
239
- function generateRelation(ctx, table, namespace, inverseRelations) {
245
+ function generateRelation(ctx, table, namespace, inverseRelations, _mapper) {
240
246
  const relations = [];
241
247
  let hasOne = false;
242
248
  let hasMany = false;
@@ -247,10 +253,10 @@ function generateRelation(ctx, table, namespace, inverseRelations) {
247
253
  if (relation.type === "one") {
248
254
  const fields = [];
249
255
  const references = [];
250
- const tableRef$1 = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
256
+ const tableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
251
257
  const relatedTableRef = namespace ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}` : relation.table.ormName;
252
258
  for (const [left, right] of relation.on) {
253
- fields.push(`${tableRef$1}.${left}`);
259
+ fields.push(`${tableRef}.${left}`);
254
260
  const actualRight = right === "id" ? "_internalId" : right;
255
261
  references.push(`${relatedTableRef}.${actualRight}`);
256
262
  }
@@ -274,10 +280,10 @@ function generateRelation(ctx, table, namespace, inverseRelations) {
274
280
  if (hasOne) params.push("one");
275
281
  if (hasMany) params.push("many");
276
282
  const relationParams = params.length > 0 ? `{ ${params.join(", ")} }` : "{}";
277
- const tableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
278
- const relationsName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}Relations` : `${table.ormName}Relations`;
283
+ const exportTableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
284
+ const relationsName = namespace ? `${exportTableRef}Relations` : `${table.ormName}Relations`;
279
285
  ctx.imports.addImport("relations", "drizzle-orm");
280
- return `export const ${relationsName} = relations(${tableRef}, (${relationParams}) => ({
286
+ return `export const ${relationsName} = relations(${exportTableRef}, (${relationParams}) => ({
281
287
  ${relations.join(",\n")}
282
288
  }));`;
283
289
  }
@@ -285,19 +291,19 @@ ${relations.join(",\n")}
285
291
  * Generate a schema export object for a fragment
286
292
  * This groups all tables by their logical names for easier access
287
293
  */
288
- function generateFragmentSchemaExport(schema, namespace, tablesWithRelations) {
294
+ function generateFragmentSchemaExport(schema, namespace, tablesWithRelations, _mapper) {
289
295
  const drizzleEntries = [];
290
296
  for (const table of Object.values(schema.tables)) {
291
- const physicalExportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
292
- drizzleEntries.push(` ${physicalExportName}: ${physicalExportName}`);
297
+ const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
298
+ drizzleEntries.push(` ${exportName}: ${exportName}`);
293
299
  if (tablesWithRelations?.has(table.name)) {
294
- const relationsName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}Relations` : `${table.ormName}Relations`;
300
+ const relationsName = namespace ? `${exportName}Relations` : `${table.ormName}Relations`;
295
301
  drizzleEntries.push(` ${relationsName}: ${relationsName}`);
296
302
  }
297
303
  if (namespace) {
298
- drizzleEntries.push(` ${table.ormName}: ${physicalExportName}`);
304
+ drizzleEntries.push(` ${table.ormName}: ${exportName}`);
299
305
  if (tablesWithRelations?.has(table.name)) {
300
- const physicalRelationsName = `${table.ormName}_${sanitizeNamespace(namespace)}Relations`;
306
+ const physicalRelationsName = `${exportName}Relations`;
301
307
  const aliasRelationsName = `${table.ormName}Relations`;
302
308
  drizzleEntries.push(` ${aliasRelationsName}: ${physicalRelationsName}`);
303
309
  }
@@ -316,14 +322,16 @@ function generateSchema(fragments, provider, options) {
316
322
  const ctx = createContext(provider, options?.idGeneratorImport);
317
323
  const customTypes = [];
318
324
  const sections = [];
325
+ const getMapper = options?.mapperFactory || ((ns) => ns ? createTableNameMapper(ns, true) : void 0);
319
326
  for (const { schema, namespace } of fragments) {
320
327
  const fragmentTables = [];
328
+ const mapper = getMapper(namespace);
321
329
  fragmentTables.push("");
322
330
  fragmentTables.push("// ============================================================================");
323
331
  fragmentTables.push(`// Fragment: ${namespace}`);
324
332
  fragmentTables.push("// ============================================================================");
325
333
  for (const table of Object.values(schema.tables)) {
326
- const tableCode = generateTable(ctx, table, customTypes, namespace);
334
+ const tableCode = generateTable(ctx, table, customTypes, namespace, mapper);
327
335
  fragmentTables.push("");
328
336
  fragmentTables.push(tableCode);
329
337
  }
@@ -338,7 +346,7 @@ function generateSchema(fragments, provider, options) {
338
346
  }
339
347
  const tablesWithRelations = /* @__PURE__ */ new Set();
340
348
  for (const table of Object.values(schema.tables)) {
341
- const relationCode = generateRelation(ctx, table, namespace, inverseRelations.get(table.name));
349
+ const relationCode = generateRelation(ctx, table, namespace, inverseRelations.get(table.name), mapper);
342
350
  if (relationCode) {
343
351
  fragmentTables.push("");
344
352
  fragmentTables.push(relationCode);
@@ -347,7 +355,7 @@ function generateSchema(fragments, provider, options) {
347
355
  }
348
356
  if (namespace !== "") {
349
357
  fragmentTables.push("");
350
- fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations));
358
+ fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations, mapper));
351
359
  }
352
360
  sections.push(...fragmentTables);
353
361
  }