@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
@@ -1,19 +1,13 @@
1
- import { drizzle } from "drizzle-orm/libsql";
2
- import { createClient } from "@libsql/client";
1
+ import SQLite from "better-sqlite3";
2
+ import { SqliteDialect } from "kysely";
3
3
  import { DrizzleAdapter } from "./drizzle-adapter";
4
4
  import { beforeAll, describe, expect, expectTypeOf, it, assert } from "vitest";
5
5
  import { column, idColumn, referenceColumn, schema, type FragnoId } from "../../schema/create";
6
- import type { DBType } from "./shared";
7
- import { createRequire } from "node:module";
8
- import { writeAndLoadSchema } from "./test-utils";
9
6
  import { Cursor } from "../../query/cursor";
10
- import { executeUnitOfWork } from "../../query/execute-unit-of-work";
11
- import { ExponentialBackoffRetryPolicy } from "../../query/retry-policy";
12
-
13
- // Import drizzle-kit for migrations
14
- const require = createRequire(import.meta.url);
15
- const { generateSQLiteDrizzleJson, generateSQLiteMigration } =
16
- require("drizzle-kit/api") as typeof import("drizzle-kit/api");
7
+ import { executeUnitOfWork } from "../../query/unit-of-work/execute-unit-of-work";
8
+ import { ExponentialBackoffRetryPolicy } from "../../query/unit-of-work/retry-policy";
9
+ import { BetterSQLite3DriverConfig } from "../generic-sql/driver-config";
10
+ import { internalSchema } from "../../fragments/internal-fragment";
17
11
 
18
12
  describe("DrizzleAdapter SQLite", () => {
19
13
  const testSchema = schema((s) => {
@@ -98,56 +92,38 @@ describe("DrizzleAdapter SQLite", () => {
98
92
  });
99
93
 
100
94
  let adapter: DrizzleAdapter;
101
- let db: DBType;
102
- // let sqliteDb: Database.Database;
95
+ let sqliteDatabase: InstanceType<typeof SQLite>;
103
96
 
104
97
  beforeAll(async () => {
105
- // Write schema to file and dynamically import it
106
- const { schemaModule, cleanup } = await writeAndLoadSchema(
107
- "drizzle-adapter-sqlite",
108
- testSchema,
109
- "sqlite",
110
- "namespace",
111
- );
112
-
113
- // Write second schema to file and dynamically import it
114
- const { schemaModule: schemaModule2, cleanup: cleanup2 } = await writeAndLoadSchema(
115
- "drizzle-adapter-sqlite-schema2",
116
- schema2,
117
- "sqlite",
118
- "namespace2",
119
- );
98
+ sqliteDatabase = new SQLite(":memory:");
120
99
 
121
- const client = createClient({
122
- url: "file::memory:?cache=shared",
100
+ const dialect = new SqliteDialect({
101
+ database: sqliteDatabase,
123
102
  });
124
103
 
125
- // Merge both schema modules for the db
126
- const mergedSchema = { ...schemaModule, ...schemaModule2 };
127
-
128
- db = drizzle(client, {
129
- schema: mergedSchema,
130
- }) as unknown as DBType;
131
-
132
- // Generate and run migrations for both schemas
133
- const emptyJson = await generateSQLiteDrizzleJson({});
134
- const targetJson = await generateSQLiteDrizzleJson(mergedSchema);
104
+ adapter = new DrizzleAdapter({
105
+ dialect,
106
+ driverConfig: new BetterSQLite3DriverConfig(),
107
+ });
135
108
 
136
- const migrationStatements = await generateSQLiteMigration(emptyJson, targetJson);
109
+ // Create settings table first (needed for version tracking)
110
+ {
111
+ const migrations = adapter.prepareMigrations(internalSchema, "");
112
+ await migrations.executeWithDriver(adapter.driver, 0);
113
+ }
137
114
 
138
- for (const statement of migrationStatements) {
139
- await client.execute(statement);
115
+ {
116
+ const migrations = adapter.prepareMigrations(testSchema, "namespace");
117
+ await migrations.executeWithDriver(adapter.driver, 0);
140
118
  }
141
119
 
142
- adapter = new DrizzleAdapter({
143
- db,
144
- provider: "sqlite",
145
- });
120
+ {
121
+ const migrations = adapter.prepareMigrations(schema2, "namespace2");
122
+ await migrations.executeWithDriver(adapter.driver, 0);
123
+ }
146
124
 
147
125
  return async () => {
148
- client.close();
149
- await cleanup();
150
- await cleanup2();
126
+ await adapter.close();
151
127
  };
152
128
  }, 12000);
153
129
 
@@ -383,17 +359,17 @@ describe("DrizzleAdapter SQLite", () => {
383
359
  expect(email).toMatchObject({
384
360
  id: expect.objectContaining({
385
361
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
386
- internalId: expect.any(Number),
362
+ internalId: expect.any(BigInt),
387
363
  }),
388
364
  user_id: expect.objectContaining({
389
- internalId: expect.any(Number),
365
+ internalId: expect.any(BigInt),
390
366
  }),
391
367
  email: "test@example.com",
392
368
  is_primary: true,
393
369
  user: {
394
370
  id: expect.objectContaining({
395
371
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
396
- internalId: expect.any(Number),
372
+ internalId: expect.any(BigInt),
397
373
  }),
398
374
  name: "Email User",
399
375
  age: 20,
@@ -476,7 +452,7 @@ describe("DrizzleAdapter SQLite", () => {
476
452
  expect(comment).toMatchObject({
477
453
  id: expect.objectContaining({
478
454
  externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
479
- internalId: expect.any(Number),
455
+ internalId: expect.any(BigInt),
480
456
  }),
481
457
  text: "Great post!",
482
458
  // Post join (first level)
@@ -1,116 +1,22 @@
1
- import type { DatabaseAdapter, DatabaseContextStorage } from "../adapters";
1
+ import type { DatabaseAdapter } from "../adapters";
2
2
  import { type AnySchema } from "../../schema/create";
3
- import type { AbstractQuery } from "../../query/query";
4
3
  import type { SchemaGenerator } from "../../schema-generator/schema-generator";
5
4
  import { generateSchema } from "./generate";
6
- import { fromDrizzle, type DrizzleUOWConfig } from "./drizzle-query";
7
- import { createTableNameMapper, type DBType, type DrizzleResult } from "./shared";
8
- import { sql } from "drizzle-orm";
9
- import { settingsSchema, SETTINGS_TABLE_NAME } from "../../fragments/internal-fragment";
10
- import {
11
- fragnoDatabaseAdapterNameFakeSymbol,
12
- fragnoDatabaseAdapterVersionFakeSymbol,
13
- } from "../adapters";
14
- import type { ConnectionPool } from "../../shared/connection-pool";
15
- import { createDrizzleConnectionPool } from "./drizzle-connection-pool";
16
- import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
17
-
18
- export interface DrizzleConfig {
19
- db: unknown | (() => unknown | Promise<unknown>);
20
- provider: "sqlite" | "mysql" | "postgresql";
21
- }
22
-
23
- export class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
24
- #connectionPool: ConnectionPool<DBType>;
25
- #provider: "sqlite" | "mysql" | "postgresql";
26
- #schemaNamespaceMap = new WeakMap<AnySchema, string>();
27
- #contextStorage: RequestContextStorage<DatabaseContextStorage>;
28
-
29
- constructor(config: DrizzleConfig) {
30
- this.#connectionPool = createDrizzleConnectionPool(
31
- config.db as DBType | (() => DBType | Promise<DBType>),
32
- );
33
- this.#provider = config.provider;
34
- this.#contextStorage = new RequestContextStorage();
35
- }
36
-
37
- get [fragnoDatabaseAdapterNameFakeSymbol](): string {
38
- return "drizzle";
39
- }
40
-
41
- get [fragnoDatabaseAdapterVersionFakeSymbol](): number {
42
- return 0;
43
- }
44
-
45
- get contextStorage(): RequestContextStorage<DatabaseContextStorage> {
46
- return this.#contextStorage;
47
- }
5
+ import { createTableNameMapper } from "../shared/table-name-mapper";
48
6
 
49
- async close(): Promise<void> {
50
- await this.#connectionPool.close();
51
- }
52
-
53
- createTableNameMapper(namespace: string) {
54
- return createTableNameMapper(namespace);
55
- }
56
-
57
- get provider(): "sqlite" | "mysql" | "postgresql" {
58
- return this.#provider;
59
- }
60
-
61
- async isConnectionHealthy(): Promise<boolean> {
62
- const conn = await this.#connectionPool.connect();
63
- try {
64
- const result = await conn.db.execute(sql`SELECT 1 as healthy`);
65
-
66
- // Handle different result formats across providers
67
- // PostgreSQL/MySQL: { rows: [...] }
68
- // SQLite: array directly or { rows: [...] }
69
- if (Array.isArray(result)) {
70
- return result.length > 0 && result[0]["healthy"] === 1;
71
- } else {
72
- const drizzleResult = result as DrizzleResult;
73
- return drizzleResult.rows[0]["healthy"] === 1;
74
- }
75
- } catch {
76
- return false;
77
- } finally {
78
- await conn.release();
79
- }
80
- }
81
-
82
- async getSchemaVersion(namespace: string): Promise<string | undefined> {
83
- // Note: This looks up arbitrary fragment schema versions (e.g., "my-fragment.schema_version")
84
- // which are different from Fragno's internal settings (prefixed with SETTINGS_NAMESPACE)
85
- // So we can't use the internal fragment here, we need direct query engine access
86
- const queryEngine = this.createQueryEngine(settingsSchema, "");
7
+ import {
8
+ GenericSQLAdapter,
9
+ type GenericSQLOptions,
10
+ type UnitOfWorkConfig,
11
+ } from "../generic-sql/generic-sql-adapter";
87
12
 
88
- const uow = queryEngine
89
- .createUnitOfWork()
90
- .find(SETTINGS_TABLE_NAME, (b) =>
91
- b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.schema_version`)),
92
- );
93
- const [[result]] = await uow.executeRetrieve();
94
- return result?.value;
13
+ export class DrizzleAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
14
+ constructor(options: GenericSQLOptions) {
15
+ super(options);
95
16
  }
96
17
 
97
- createQueryEngine<TSchema extends AnySchema>(
98
- schema: TSchema,
99
- namespace: string,
100
- ): AbstractQuery<TSchema, DrizzleUOWConfig> {
101
- // Register schema-namespace mapping
102
- this.#schemaNamespaceMap.set(schema, namespace);
103
-
104
- // Only create mapper if namespace is non-empty
105
- const mapper = namespace ? createTableNameMapper(namespace) : undefined;
106
- return fromDrizzle(
107
- schema,
108
- this.#connectionPool,
109
- this.#provider,
110
- mapper,
111
- undefined,
112
- this.#schemaNamespaceMap,
113
- );
18
+ override createTableNameMapper(namespace: string) {
19
+ return createTableNameMapper(namespace, false);
114
20
  }
115
21
 
116
22
  createSchemaGenerator(
@@ -122,7 +28,9 @@ export class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
122
28
  const path = genOptions?.path ?? options?.path ?? "fragno-schema.ts";
123
29
 
124
30
  return {
125
- schema: generateSchema(fragments, this.#provider),
31
+ schema: generateSchema(fragments, this.driverConfig.databaseType, {
32
+ mapperFactory: (ns) => (ns ? this.createTableNameMapper(ns) : undefined),
33
+ }),
126
34
  path,
127
35
  };
128
36
  },
@@ -1,7 +1,7 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { column, idColumn, referenceColumn, schema } from "../../schema/create";
3
3
  import { generateSchema } from "./generate";
4
- import { settingsSchema } from "../../fragments/internal-fragment";
4
+ import { internalSchema } from "../../fragments/internal-fragment";
5
5
 
6
6
  describe("generateSchema", () => {
7
7
  const testSchema = schema((s) => {
@@ -1072,7 +1072,7 @@ describe("generateSchema", () => {
1072
1072
  // This test verifies generateSchema works correctly with already-deduplicated inputs
1073
1073
  const generated = generateSchema(
1074
1074
  [
1075
- { namespace: "", schema: settingsSchema }, // Internal fragment (namespace: "")
1075
+ { namespace: "", schema: internalSchema }, // Internal fragment (namespace: "")
1076
1076
  { namespace: "fragment1", schema: fragment1Schema },
1077
1077
  { namespace: "fragment2", schema: fragment2Schema },
1078
1078
  ],
@@ -8,8 +8,13 @@ import {
8
8
  InternalIdColumn,
9
9
  } from "../../schema/create";
10
10
  import type { SQLProvider } from "../../shared/providers";
11
- import { schemaToDBType, type DBTypeLiteral } from "../../schema/serialize";
12
- import { createTableNameMapper, sanitizeNamespace } from "./shared";
11
+ import {
12
+ createTableNameMapper,
13
+ sanitizeNamespace,
14
+ type TableNameMapper,
15
+ } from "../shared/table-name-mapper";
16
+ import { type DatabaseTypeLiteral } from "../../schema/type-conversion/type-mapping";
17
+ import { createSQLTypeMapper } from "../../schema/type-conversion/create-sql-type-mapper";
13
18
 
14
19
  // ============================================================================
15
20
  // PROVIDER CONFIGURATION
@@ -98,10 +103,11 @@ function generateCustomType(
98
103
 
99
104
  function generateBinaryCustomType(ctx: GeneratorContext, customTypes: string[]): string {
100
105
  const name = "customBinary";
106
+ const typeMapper = createSQLTypeMapper(ctx.provider);
101
107
  const code = generateCustomType(ctx, name, {
102
108
  dataType: "Uint8Array",
103
109
  driverDataType: "Buffer",
104
- databaseDataType: schemaToDBType({ type: "binary" }, ctx.provider),
110
+ databaseDataType: typeMapper.getDatabaseType({ type: "binary" }),
105
111
  fromDriverCode: "return new Uint8Array(value.buffer, value.byteOffset, value.byteLength)",
106
112
  toDriverCode: `return value instanceof Buffer? value : Buffer.from(value)`,
107
113
  });
@@ -124,15 +130,16 @@ interface ColumnTypeFunction {
124
130
 
125
131
  /**
126
132
  * Maps SQL database types to Drizzle function names and parameters.
127
- * Uses schemaToDBType as the source of truth for type conversion.
133
+ * Uses SQLTypeMapper as the source of truth for type conversion.
128
134
  */
129
135
  function getColumnTypeFunction(
130
136
  ctx: GeneratorContext,
131
137
  column: AnyColumn,
132
138
  customTypes: string[],
133
139
  ): ColumnTypeFunction {
134
- // Get the canonical database type from schemaToDBType
135
- const dbType = schemaToDBType(column, ctx.provider);
140
+ // Get the canonical database type from type mapper
141
+ const typeMapper = createSQLTypeMapper(ctx.provider);
142
+ const dbType = typeMapper.getDatabaseType(column);
136
143
 
137
144
  // Map database types to Drizzle function names
138
145
  return mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes);
@@ -143,7 +150,7 @@ function getColumnTypeFunction(
143
150
  */
144
151
  function mapDBTypeToDrizzleFunction(
145
152
  ctx: GeneratorContext,
146
- dbType: DBTypeLiteral,
153
+ dbType: DatabaseTypeLiteral,
147
154
  column: AnyColumn,
148
155
  customTypes: string[],
149
156
  ): ColumnTypeFunction {
@@ -231,6 +238,24 @@ function mapDBTypeToDrizzleFunction(
231
238
  return { name: dbType };
232
239
  }
233
240
 
241
+ // ============================================================================
242
+ // TABLE NAME HELPERS
243
+ // ============================================================================
244
+
245
+ /**
246
+ * Get the physical table name (with namespace suffix) using the mapper if available
247
+ */
248
+ function getPhysicalTableName(
249
+ logicalName: string,
250
+ namespace: string | undefined,
251
+ mapper: TableNameMapper | undefined,
252
+ ): string {
253
+ if (!namespace) {
254
+ return logicalName;
255
+ }
256
+ return mapper ? mapper.toPhysical(logicalName) : `${logicalName}_${sanitizeNamespace(namespace)}`;
257
+ }
258
+
234
259
  // ============================================================================
235
260
  // COLUMN GENERATION
236
261
  // ============================================================================
@@ -318,8 +343,12 @@ function generateAllColumns(
318
343
  // CONSTRAINT GENERATION
319
344
  // ============================================================================
320
345
 
321
- function generateForeignKeys(ctx: GeneratorContext, table: AnyTable, namespace?: string): string[] {
322
- const mapper = namespace ? createTableNameMapper(namespace) : undefined;
346
+ function generateForeignKeys(
347
+ ctx: GeneratorContext,
348
+ table: AnyTable,
349
+ namespace?: string,
350
+ mapper?: TableNameMapper,
351
+ ): string[] {
323
352
  const keys: string[] = [];
324
353
 
325
354
  for (const relation of Object.values(table.relations)) {
@@ -341,7 +370,7 @@ function generateForeignKeys(ctx: GeneratorContext, table: AnyTable, namespace?:
341
370
  if (isSelfReference) {
342
371
  foreignColumns.push(`table.${actualRefCol}`);
343
372
  } else {
344
- // Suffix the foreign table reference with namespace if provided
373
+ // Use sanitized TypeScript export name for identifier reference
345
374
  const foreignTableRef = namespace
346
375
  ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`
347
376
  : relation.table.ormName;
@@ -391,8 +420,12 @@ function generateTableConstraints(
391
420
  ctx: GeneratorContext,
392
421
  table: AnyTable,
393
422
  namespace?: string,
423
+ mapper?: TableNameMapper,
394
424
  ): string[] {
395
- return [...generateForeignKeys(ctx, table, namespace), ...generateIndexes(ctx, table, namespace)];
425
+ return [
426
+ ...generateForeignKeys(ctx, table, namespace, mapper),
427
+ ...generateIndexes(ctx, table, namespace),
428
+ ];
396
429
  }
397
430
 
398
431
  // ============================================================================
@@ -404,20 +437,18 @@ function generateTable(
404
437
  table: AnyTable,
405
438
  customTypes: string[],
406
439
  namespace?: string,
440
+ mapper?: TableNameMapper,
407
441
  ): string {
408
442
  const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];
409
443
  ctx.imports.addImport(tableFn, ctx.importSource);
410
444
 
411
445
  const columns = generateAllColumns(ctx, table, customTypes);
412
- const constraints = generateTableConstraints(ctx, table, namespace);
446
+ const constraints = generateTableConstraints(ctx, table, namespace, mapper);
413
447
 
414
- // Suffix table name with namespace if provided, and sanitize for use as database table name
415
- // Database table names must also be valid identifiers to work with Drizzle's relational query system
416
- const physicalTableName = namespace
417
- ? `${table.ormName}_${sanitizeNamespace(namespace)}`
418
- : table.ormName;
419
- // Same sanitized name for TypeScript export
420
- const exportName = physicalTableName;
448
+ // Physical table name in the database (respects mapper configuration)
449
+ const physicalTableName = getPhysicalTableName(table.ormName, namespace, mapper);
450
+ // TypeScript export name must always be sanitized to be a valid JavaScript identifier
451
+ const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
421
452
 
422
453
  const args: string[] = [`"${physicalTableName}"`, `{\n${columns.join(",\n")}\n}`];
423
454
 
@@ -437,6 +468,7 @@ function generateRelation(
437
468
  table: AnyTable,
438
469
  namespace?: string,
439
470
  inverseRelations?: Array<{ fromTable: AnyTable; relation: Relation }>,
471
+ _mapper?: TableNameMapper,
440
472
  ): string | undefined {
441
473
  const relations: string[] = [];
442
474
  let hasOne = false;
@@ -458,7 +490,7 @@ function generateRelation(
458
490
  const fields: string[] = [];
459
491
  const references: string[] = [];
460
492
 
461
- // Use sanitized namespace for identifier references
493
+ // Use sanitized TypeScript export names for identifier references
462
494
  const tableRef = namespace
463
495
  ? `${table.ormName}_${sanitizeNamespace(namespace)}`
464
496
  : table.ormName;
@@ -496,6 +528,7 @@ function generateRelation(
496
528
  if (relation.type === "one") {
497
529
  hasMany = true;
498
530
 
531
+ // Use sanitized TypeScript export name for identifier reference
499
532
  const fromTableRef = namespace
500
533
  ? `${fromTable.ormName}_${sanitizeNamespace(namespace)}`
501
534
  : fromTable.ormName;
@@ -526,13 +559,14 @@ function generateRelation(
526
559
  }
527
560
  const relationParams = params.length > 0 ? `{ ${params.join(", ")} }` : "{}";
528
561
 
529
- const tableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
530
- const relationsName = namespace
531
- ? `${table.ormName}_${sanitizeNamespace(namespace)}Relations`
532
- : `${table.ormName}Relations`;
562
+ // Use sanitized names for TypeScript export identifiers
563
+ const exportTableRef = namespace
564
+ ? `${table.ormName}_${sanitizeNamespace(namespace)}`
565
+ : table.ormName;
566
+ const relationsName = namespace ? `${exportTableRef}Relations` : `${table.ormName}Relations`;
533
567
 
534
568
  ctx.imports.addImport("relations", "drizzle-orm");
535
- return `export const ${relationsName} = relations(${tableRef}, (${relationParams}) => ({
569
+ return `export const ${relationsName} = relations(${exportTableRef}, (${relationParams}) => ({
536
570
  ${relations.join(",\n")}
537
571
  }));`;
538
572
  }
@@ -549,22 +583,22 @@ function generateFragmentSchemaExport(
549
583
  schema: AnySchema,
550
584
  namespace: string,
551
585
  tablesWithRelations?: Set<string>,
586
+ _mapper?: TableNameMapper,
552
587
  ): string {
553
588
  const drizzleEntries: string[] = [];
554
589
 
555
590
  for (const table of Object.values(schema.tables)) {
556
- const physicalExportName = namespace
591
+ // TypeScript export name (always sanitized for valid JS identifiers)
592
+ const exportName = namespace
557
593
  ? `${table.ormName}_${sanitizeNamespace(namespace)}`
558
594
  : table.ormName;
559
595
 
560
596
  // Add physical table name to drizzle schema
561
- drizzleEntries.push(` ${physicalExportName}: ${physicalExportName}`);
597
+ drizzleEntries.push(` ${exportName}: ${exportName}`);
562
598
 
563
599
  // Include relations for this table if they exist (either explicit or inverse)
564
600
  if (tablesWithRelations?.has(table.name)) {
565
- const relationsName = namespace
566
- ? `${table.ormName}_${sanitizeNamespace(namespace)}Relations`
567
- : `${table.ormName}Relations`;
601
+ const relationsName = namespace ? `${exportName}Relations` : `${table.ormName}Relations`;
568
602
 
569
603
  drizzleEntries.push(` ${relationsName}: ${relationsName}`);
570
604
  }
@@ -573,11 +607,11 @@ function generateFragmentSchemaExport(
573
607
  // The key insight: Drizzle needs BOTH the table alias AND its relations alias
574
608
  // in the same schema object for relational queries to work
575
609
  if (namespace) {
576
- drizzleEntries.push(` ${table.ormName}: ${physicalExportName}`);
610
+ drizzleEntries.push(` ${table.ormName}: ${exportName}`);
577
611
 
578
612
  // Also add the relations under the aliased name if they exist
579
613
  if (tablesWithRelations?.has(table.name)) {
580
- const physicalRelationsName = `${table.ormName}_${sanitizeNamespace(namespace)}Relations`;
614
+ const physicalRelationsName = `${exportName}Relations`;
581
615
  const aliasRelationsName = `${table.ormName}Relations`;
582
616
  drizzleEntries.push(` ${aliasRelationsName}: ${physicalRelationsName}`);
583
617
  }
@@ -587,6 +621,7 @@ function generateFragmentSchemaExport(
587
621
  // Add schema version as a number
588
622
  drizzleEntries.push(` schemaVersion: ${schema.version}`);
589
623
 
624
+ // Use logical name (not physical) for the schema export variable name, sanitized for valid JS identifier
590
625
  const exportName = namespace ? `${sanitizeNamespace(namespace)}_schema` : "_schema";
591
626
 
592
627
  return `export const ${exportName} = {\n${drizzleEntries.join(",\n")}\n}`;
@@ -604,6 +639,8 @@ export interface GenerateSchemaOptions {
604
639
  /** Module to import from */
605
640
  from: string;
606
641
  };
642
+ /** Optional mapper factory for creating table name mappers with custom sanitization */
643
+ mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined;
607
644
  }
608
645
 
609
646
  /**
@@ -620,9 +657,13 @@ export function generateSchema(
620
657
  const ctx = createContext(provider, options?.idGeneratorImport);
621
658
  const customTypes: string[] = [];
622
659
  const sections: string[] = [];
660
+ const getMapper =
661
+ options?.mapperFactory ||
662
+ ((ns: string | undefined) => (ns ? createTableNameMapper(ns, true) : undefined));
623
663
 
624
664
  for (const { schema, namespace } of fragments) {
625
665
  const fragmentTables: string[] = [];
666
+ const mapper = getMapper(namespace);
626
667
 
627
668
  // Add section header
628
669
  fragmentTables.push("");
@@ -636,7 +677,7 @@ export function generateSchema(
636
677
 
637
678
  // Generate tables for this fragment
638
679
  for (const table of Object.values(schema.tables)) {
639
- const tableCode = generateTable(ctx, table, customTypes, namespace);
680
+ const tableCode = generateTable(ctx, table, customTypes, namespace, mapper);
640
681
  fragmentTables.push("");
641
682
  fragmentTables.push(tableCode);
642
683
  }
@@ -663,6 +704,7 @@ export function generateSchema(
663
704
  table,
664
705
  namespace,
665
706
  inverseRelations.get(table.name),
707
+ mapper,
666
708
  );
667
709
  if (relationCode) {
668
710
  fragmentTables.push("");
@@ -674,7 +716,9 @@ export function generateSchema(
674
716
  // Generate schema export object (skip for empty namespace to avoid duplicate _schema exports)
675
717
  if (namespace !== "") {
676
718
  fragmentTables.push("");
677
- fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations));
719
+ fragmentTables.push(
720
+ generateFragmentSchemaExport(schema, namespace, tablesWithRelations, mapper),
721
+ );
678
722
  }
679
723
 
680
724
  sections.push(...fragmentTables);
@@ -158,6 +158,23 @@ describe("generateSchema and migrate", () => {
158
158
  "_version" integer DEFAULT 0 NOT NULL
159
159
  );
160
160
 
161
+ CREATE TABLE "fragno_hooks" (
162
+ "id" varchar(30) NOT NULL,
163
+ "namespace" text NOT NULL,
164
+ "hookName" text NOT NULL,
165
+ "payload" json NOT NULL,
166
+ "status" text NOT NULL,
167
+ "attempts" integer DEFAULT 0 NOT NULL,
168
+ "maxAttempts" integer DEFAULT 5 NOT NULL,
169
+ "lastAttemptAt" timestamp,
170
+ "nextRetryAt" timestamp,
171
+ "error" text,
172
+ "createdAt" timestamp DEFAULT now() NOT NULL,
173
+ "nonce" text NOT NULL,
174
+ "_internalId" bigserial PRIMARY KEY NOT NULL,
175
+ "_version" integer DEFAULT 0 NOT NULL
176
+ );
177
+
161
178
  CREATE TABLE "users" (
162
179
  "id" varchar(30) NOT NULL,
163
180
  "name" text NOT NULL,
@@ -231,6 +248,8 @@ describe("generateSchema and migrate", () => {
231
248
  ALTER TABLE "postTags" ADD CONSTRAINT "postTags_posts_post_fk" FOREIGN KEY ("postId") REFERENCES "public"."posts"("_internalId") ON DELETE no action ON UPDATE no action;
232
249
  ALTER TABLE "postTags" ADD CONSTRAINT "postTags_tags_tag_fk" FOREIGN KEY ("tagId") REFERENCES "public"."tags"("_internalId") ON DELETE no action ON UPDATE no action;
233
250
  CREATE UNIQUE INDEX "unique_key" ON "fragno_db_settings" USING btree ("key");
251
+ CREATE INDEX "idx_namespace_status_retry" ON "fragno_hooks" USING btree ("namespace","status","nextRetryAt");
252
+ CREATE INDEX "idx_nonce" ON "fragno_hooks" USING btree ("nonce");
234
253
  CREATE UNIQUE INDEX "idx_users_email" ON "users" USING btree ("email");
235
254
  CREATE INDEX "idx_users_name" ON "users" USING btree ("name");
236
255
  CREATE INDEX "idx_users_active" ON "users" USING btree ("isActive");
@@ -22,40 +22,6 @@ export function parseDrizzle(drizzle: unknown) {
22
22
  return [db, drizzleTables] as const;
23
23
  }
24
24
 
25
- /**
26
- * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)
27
- */
28
- export interface TableNameMapper {
29
- toPhysical(logicalName: string): string;
30
- toLogical(physicalName: string): string;
31
- }
32
-
33
- /**
34
- * Sanitize a namespace to be a valid JavaScript identifier
35
- * Replaces hyphens and other invalid characters with underscores
36
- */
37
- export function sanitizeNamespace(namespace: string): string {
38
- return namespace.replace(/[^a-zA-Z0-9_]/g, "_");
39
- }
40
-
41
- /**
42
- * Creates a table name mapper for a given namespace.
43
- * Physical names have format: {logicalName}_{sanitizedNamespace}
44
- * The namespace is sanitized to match TypeScript export names used in the schema
45
- */
46
- export function createTableNameMapper(namespace: string): TableNameMapper {
47
- const sanitized = sanitizeNamespace(namespace);
48
- return {
49
- toPhysical: (logicalName: string) => `${logicalName}_${sanitized}`,
50
- toLogical: (physicalName: string) => {
51
- if (physicalName.endsWith(`_${sanitized}`)) {
52
- return physicalName.slice(0, -(sanitized.length + 1));
53
- }
54
- return physicalName;
55
- },
56
- };
57
- }
58
-
59
25
  export interface DrizzleResult {
60
26
  rows: Record<string, unknown>[];
61
27
  affectedRows: number;