@fragno-dev/db 0.1.14 → 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 (445) hide show
  1. package/.turbo/turbo-build.log +242 -139
  2. package/CHANGELOG.md +47 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +19 -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 -19
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +7 -1
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +46 -45
  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 -16
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -159
  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} +48 -62
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
  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 +186 -0
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -0
  81. package/dist/db-fragment-definition-builder.js +207 -0
  82. package/dist/db-fragment-definition-builder.js.map +1 -0
  83. package/dist/fragments/internal-fragment.d.ts +53 -0
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -0
  85. package/dist/fragments/internal-fragment.js +111 -0
  86. package/dist/fragments/internal-fragment.js.map +1 -0
  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 +38 -56
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +35 -23
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +48 -45
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
  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/bind-services.js +20 -0
  102. package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
  103. package/dist/packages/fragno/dist/api/error.js +48 -0
  104. package/dist/packages/fragno/dist/api/error.js.map +1 -0
  105. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
  106. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
  107. package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
  108. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
  109. package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
  110. package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
  111. package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
  112. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
  113. package/dist/packages/fragno/dist/api/internal/route.js +10 -0
  114. package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
  115. package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
  116. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
  117. package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
  118. package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
  119. package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
  120. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
  121. package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
  122. package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
  123. package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
  124. package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
  125. package/dist/packages/fragno/dist/api/route.js +17 -0
  126. package/dist/packages/fragno/dist/api/route.js.map +1 -0
  127. package/dist/packages/fragno/dist/internal/symbols.js +10 -0
  128. package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
  129. package/dist/query/column-defaults.js +27 -0
  130. package/dist/query/column-defaults.js.map +1 -0
  131. package/dist/query/cursor.d.ts +14 -6
  132. package/dist/query/cursor.d.ts.map +1 -1
  133. package/dist/query/cursor.js +16 -7
  134. package/dist/query/cursor.js.map +1 -1
  135. package/dist/query/orm/orm.d.ts +1 -1
  136. package/dist/query/orm/orm.js.map +1 -1
  137. package/dist/query/serialize/create-sql-serializer.js +30 -0
  138. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  139. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  140. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  141. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  142. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  143. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  144. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  145. package/dist/query/serialize/sql-serializer.js +67 -0
  146. package/dist/query/serialize/sql-serializer.js.map +1 -0
  147. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +6 -6
  148. package/dist/query/simple-query-interface.d.ts.map +1 -0
  149. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
  150. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  151. package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
  152. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  153. package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
  154. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  155. package/dist/query/unit-of-work/retry-policy.js +61 -0
  156. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  157. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +145 -58
  158. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  159. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +435 -198
  160. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  161. package/dist/query/value-decoding.js +71 -0
  162. package/dist/query/value-decoding.js.map +1 -0
  163. package/dist/query/value-encoding.js +124 -0
  164. package/dist/query/value-encoding.js.map +1 -0
  165. package/dist/schema/create.d.ts +3 -0
  166. package/dist/schema/create.d.ts.map +1 -1
  167. package/dist/schema/create.js +4 -0
  168. package/dist/schema/create.js.map +1 -1
  169. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  170. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  171. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  172. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  173. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  174. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  175. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  176. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  177. package/dist/schema/type-conversion/type-mapping.js +63 -0
  178. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  179. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  180. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  181. package/dist/sql-driver/connection/connection-provider.js +19 -0
  182. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  183. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  184. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  185. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  186. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  187. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  188. package/dist/sql-driver/dialects/dialects.js +3 -0
  189. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  190. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  191. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  192. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  193. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  194. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  195. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  196. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  197. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  198. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  199. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  200. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  201. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  202. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  203. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  204. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  205. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  206. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  207. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  208. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  209. package/dist/sql-driver/sql-driver.d.ts +38 -0
  210. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  211. package/dist/sql-driver/sql-driver.js +1 -0
  212. package/dist/sql-driver/sql.js +50 -0
  213. package/dist/sql-driver/sql.js.map +1 -0
  214. package/dist/with-database.d.ts +32 -0
  215. package/dist/with-database.d.ts.map +1 -0
  216. package/dist/with-database.js +34 -0
  217. package/dist/with-database.js.map +1 -0
  218. package/package.json +43 -9
  219. package/src/adapters/adapters.ts +23 -4
  220. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
  221. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
  222. package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
  223. package/src/adapters/drizzle/generate.test.ts +102 -269
  224. package/src/adapters/drizzle/generate.ts +89 -63
  225. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  226. package/src/adapters/drizzle/shared.ts +0 -34
  227. package/src/adapters/drizzle/test-utils.ts +36 -5
  228. package/src/adapters/generic-sql/README.md +14 -0
  229. package/src/adapters/generic-sql/driver-config.ts +144 -0
  230. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  231. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  232. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  233. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  234. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  235. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  236. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  237. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  238. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  239. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  240. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  241. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  242. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  243. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  244. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  245. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  246. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  247. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  248. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  249. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  250. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  251. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  252. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  253. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  254. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  255. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  256. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  257. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  258. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  259. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  260. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  261. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  262. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  263. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +90 -96
  264. package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
  265. package/src/adapters/kysely/kysely-adapter.ts +10 -242
  266. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
  267. package/src/adapters/shared/table-name-mapper.ts +50 -0
  268. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  269. package/src/db-fragment-definition-builder.test.ts +887 -0
  270. package/src/db-fragment-definition-builder.ts +737 -0
  271. package/src/db-fragment-instantiator.test.ts +543 -0
  272. package/src/db-fragment-integration.test.ts +406 -0
  273. package/src/fragments/internal-fragment.test.ts +549 -0
  274. package/src/fragments/internal-fragment.ts +249 -0
  275. package/src/hooks/hooks.test.ts +575 -0
  276. package/src/hooks/hooks.ts +179 -0
  277. package/src/migration-engine/generation-engine.test.ts +60 -27
  278. package/src/migration-engine/generation-engine.ts +99 -92
  279. package/src/mod.ts +139 -78
  280. package/src/query/column-defaults.ts +49 -0
  281. package/src/query/cursor.test.ts +147 -3
  282. package/src/query/cursor.ts +25 -8
  283. package/src/query/orm/orm.ts +1 -1
  284. package/src/query/query-type.test.ts +9 -9
  285. package/src/query/serialize/create-sql-serializer.ts +34 -0
  286. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  287. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  288. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  289. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  290. package/src/query/serialize/sql-serializer.ts +143 -0
  291. package/src/query/{query.ts → simple-query-interface.ts} +4 -4
  292. package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
  293. package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
  294. package/src/query/unit-of-work/retry-policy.test.ts +217 -0
  295. package/src/query/unit-of-work/retry-policy.ts +141 -0
  296. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
  297. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
  298. package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
  299. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
  300. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
  301. package/src/query/value-decoding.ts +113 -0
  302. package/src/query/value-encoding.test.ts +390 -0
  303. package/src/query/value-encoding.ts +168 -0
  304. package/src/schema/create.test.ts +5 -1
  305. package/src/schema/create.ts +5 -0
  306. package/src/schema/serialize.test.ts +165 -407
  307. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  308. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  309. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  310. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  311. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  312. package/src/schema/type-conversion/type-mapping.ts +153 -0
  313. package/src/shared/connection-pool.ts +5 -5
  314. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  315. package/src/sql-driver/connection/connection-provider.ts +27 -0
  316. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  317. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  318. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  319. package/src/sql-driver/dialects/dialects.ts +1 -0
  320. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  321. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  322. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  323. package/src/sql-driver/query-executor/plugin.ts +22 -0
  324. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  325. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  326. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  327. package/src/sql-driver/sql-driver.ts +53 -0
  328. package/src/sql-driver/sql.ts +57 -0
  329. package/src/sql-driver/sqlocal.test.ts +117 -0
  330. package/src/with-database.ts +152 -0
  331. package/tsdown.config.ts +8 -2
  332. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  333. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  334. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  335. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  336. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  337. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  338. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  339. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -315
  340. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  341. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
  342. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  343. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
  344. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  345. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  346. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  347. package/dist/adapters/drizzle/shared.d.ts +0 -14
  348. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  349. package/dist/adapters/drizzle/shared.js +0 -35
  350. package/dist/adapters/drizzle/shared.js.map +0 -1
  351. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  352. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  353. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  354. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  355. package/dist/adapters/kysely/kysely-query-compiler.js +0 -66
  356. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  357. package/dist/adapters/kysely/kysely-query.d.ts +0 -22
  358. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  359. package/dist/adapters/kysely/kysely-query.js +0 -223
  360. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  361. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  362. package/dist/adapters/kysely/kysely-shared.js +0 -18
  363. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  364. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
  365. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  366. package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
  367. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  368. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  369. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  370. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  371. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  372. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  373. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  374. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  375. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  376. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  377. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  378. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  379. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  380. package/dist/adapters/kysely/migration/execute.js +0 -34
  381. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  382. package/dist/bind-services.d.ts +0 -7
  383. package/dist/bind-services.d.ts.map +0 -1
  384. package/dist/bind-services.js +0 -14
  385. package/dist/bind-services.js.map +0 -1
  386. package/dist/fragment.d.ts +0 -173
  387. package/dist/fragment.d.ts.map +0 -1
  388. package/dist/fragment.js +0 -191
  389. package/dist/fragment.js.map +0 -1
  390. package/dist/migration-engine/create.d.ts +0 -37
  391. package/dist/migration-engine/create.d.ts.map +0 -1
  392. package/dist/migration-engine/create.js +0 -58
  393. package/dist/migration-engine/create.js.map +0 -1
  394. package/dist/migration-engine/shared.d.ts +0 -112
  395. package/dist/migration-engine/shared.d.ts.map +0 -1
  396. package/dist/query/query.d.ts.map +0 -1
  397. package/dist/query/result-transform.js +0 -168
  398. package/dist/query/result-transform.js.map +0 -1
  399. package/dist/query/unit-of-work.d.ts.map +0 -1
  400. package/dist/query/unit-of-work.js.map +0 -1
  401. package/dist/schema/serialize.js +0 -106
  402. package/dist/schema/serialize.js.map +0 -1
  403. package/dist/shared/settings-schema.js +0 -36
  404. package/dist/shared/settings-schema.js.map +0 -1
  405. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
  406. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  407. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  408. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1383
  409. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
  410. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
  411. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
  412. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  413. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  414. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  415. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  416. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  417. package/src/adapters/kysely/kysely-query-compiler.ts +0 -132
  418. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  419. package/src/adapters/kysely/kysely-query.ts +0 -390
  420. package/src/adapters/kysely/kysely-shared.ts +0 -23
  421. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
  422. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
  423. package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
  424. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
  425. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  426. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  427. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  428. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  429. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  430. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  431. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  432. package/src/adapters/kysely/migration/execute.ts +0 -50
  433. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  434. package/src/bind-services.test.ts +0 -214
  435. package/src/bind-services.ts +0 -37
  436. package/src/db-fragment.test.ts +0 -800
  437. package/src/fragment.ts +0 -727
  438. package/src/query/result-transform.ts +0 -271
  439. package/src/query/unit-of-work-multi-schema.test.ts +0 -64
  440. package/src/query/unit-of-work.test.ts +0 -943
  441. package/src/schema/serialize.ts +0 -396
  442. package/src/shared/settings-schema.ts +0 -61
  443. package/src/uow-context-integration.test.ts +0 -102
  444. package/src/uow-context.test.ts +0 -182
  445. /package/dist/query/{query.js → simple-query-interface.js} +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,11 +1,20 @@
1
1
  import { AnySchema } from "../schema/create.js";
2
- import { Migrator } from "../migration-engine/create.js";
3
- 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";
4
4
  import { SchemaGenerator } from "../schema-generator/schema-generator.js";
5
+ import { PreparedMigrations } from "./generic-sql/migration/prepared-migrations.js";
6
+ import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
5
7
 
6
8
  //#region src/adapters/adapters.d.ts
7
9
  declare const fragnoDatabaseAdapterNameFakeSymbol: "$fragno-database-adapter-name";
8
10
  declare const fragnoDatabaseAdapterVersionFakeSymbol: "$fragno-database-adapter-version";
11
+ /**
12
+ * Storage type for database context - stores the Unit of Work.
13
+ * This is shared across all fragments using the same adapter.
14
+ */
15
+ type DatabaseContextStorage = {
16
+ uow: IUnitOfWork;
17
+ };
9
18
  /**
10
19
  * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)
11
20
  */
@@ -16,12 +25,17 @@ interface TableNameMapper {
16
25
  interface DatabaseAdapter<TUOWConfig = void> {
17
26
  [fragnoDatabaseAdapterNameFakeSymbol]: string;
18
27
  [fragnoDatabaseAdapterVersionFakeSymbol]: number;
28
+ /**
29
+ * Request context storage shared across all fragments using this adapter.
30
+ * This allows multiple fragments to participate in the same Unit of Work.
31
+ */
32
+ readonly contextStorage: RequestContextStorage<DatabaseContextStorage>;
19
33
  /**
20
34
  * Get current schema version, undefined if not initialized.
21
35
  */
22
36
  getSchemaVersion(namespace: string): Promise<string | undefined>;
23
- createQueryEngine: <const T extends AnySchema>(schema: T, namespace: string) => AbstractQuery<T, TUOWConfig>;
24
- 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;
25
39
  /**
26
40
  * Generate a combined schema file from one or more fragments.
27
41
  * If not implemented, schema generation is not supported for this adapter.
@@ -41,5 +55,5 @@ interface DatabaseAdapter<TUOWConfig = void> {
41
55
  close: () => Promise<void>;
42
56
  }
43
57
  //#endregion
44
- export { DatabaseAdapter, TableNameMapper, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol };
58
+ export { DatabaseAdapter, DatabaseContextStorage, TableNameMapper, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol };
45
59
  //# sourceMappingURL=adapters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;cAKa;cACA;AADb;AACA;AAKA;AAKiB,UALA,eAAA,CAKe;EAC7B,UAAA,CAAA,WAAA,EAAA,MAAA,CAAA,EAAA,MAAA;EACA,SAAA,CAAA,YAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;AAOmC,UATrB,eASqB,CAAA,aAAA,IAAA,CAAA,CAAA;EAC1B,CATT,mCAAA,CASS,EAAA,MAAA;EAES,CAVlB,sCAAA,CAUkB,EAAA,MAAA;EAAG;;;EAEsC,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAPvB,OAOuB,CAAA,MAAA,GAAA,SAAA,CAAA;EAAyB,iBAAA,EAAA,CAAA,gBALjD,SAKiD,CAAA,CAAA,MAAA,EAJ3E,CAI2E,EAAA,SAAA,EAAA,MAAA,EAAA,GAFhF,aAEgF,CAFlE,CAEkE,EAF/D,UAE+D,CAAA;EAO9D,qBAAA,CAAA,EAAA,CAAA,gBAPkB,SAOlB,CAAA,CAAA,MAAA,EAPqC,CAOrC,EAAA,SAAA,EAAA,MAAA,EAAA,GAP8D,QAO9D;EAElB;;;;EAUe,qBAAA,CAAA,EAAA,CAAA,SAAA,EAAA;YAZG;;;;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\";\n\nexport const fragnoDatabaseAdapterNameFakeSymbol = \"$fragno-database-adapter-name\" as const;\nexport const fragnoDatabaseAdapterVersionFakeSymbol = \"$fragno-database-adapter-version\" as const;\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 * 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":";AAKA,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,26 +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, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
5
- import { TableNameMapper } from "./shared.js";
6
- import { DrizzleUOWConfig } from "./drizzle-query.js";
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";
7
6
 
8
7
  //#region src/adapters/drizzle/drizzle-adapter.d.ts
9
- interface DrizzleConfig {
10
- db: unknown | (() => unknown | Promise<unknown>);
11
- provider: "sqlite" | "mysql" | "postgresql";
12
- }
13
- declare class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
14
- #private;
15
- constructor(config: DrizzleConfig);
16
- get [fragnoDatabaseAdapterNameFakeSymbol](): string;
17
- get [fragnoDatabaseAdapterVersionFakeSymbol](): number;
18
- close(): Promise<void>;
8
+ declare class DrizzleAdapter extends GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
9
+ constructor(options: GenericSQLOptions);
19
10
  createTableNameMapper(namespace: string): TableNameMapper;
20
- get provider(): "sqlite" | "mysql" | "postgresql";
21
- isConnectionHealthy(): Promise<boolean>;
22
- getSchemaVersion(namespace: string): Promise<string | undefined>;
23
- createQueryEngine<TSchema extends AnySchema>(schema: TSchema, namespace: string): AbstractQuery<TSchema, DrizzleUOWConfig>;
24
11
  createSchemaGenerator(fragments: {
25
12
  schema: AnySchema;
26
13
  namespace: string;
@@ -29,5 +16,5 @@ declare class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
29
16
  }): SchemaGenerator;
30
17
  }
31
18
  //#endregion
32
- export { DrizzleAdapter, DrizzleConfig };
19
+ export { DrizzleAdapter };
33
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":";;;;;;;;UAgBiB,aAAA;iCACgB;EADhB,QAAA,EAAA,QAAa,GAAA,OAAA,GACG,YAAO;AAIxC;AAAuD,cAA1C,cAAA,YAA0B,eAAgB,CAAA,gBAAA,CAAA,CAAA;EAKjC,CAAA,OAAA;EAOf,WAAA,CAAA,MAAA,EAPe,aAOf;EAIA,KAJA,mCAAA,GAIA,EAAA,MAAA;EAIU,KAJV,sCAAA,GAIU,EAAA,MAAA;EAAO,KAAA,CAAA,CAAA,EAAP,OAAO,CAAA,IAAA,CAAA;EAYO,qBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAZP,eAYO;EAqBc,IAAA,QAAA,CAAA,CAAA,EAAA,QAAA,GAAA,OAAA,GAAA,YAAA;EAST,mBAAA,CAAA,CAAA,EA9BL,OA8BK,CAAA,OAAA,CAAA;EACxB,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAViC,OAUjC,CAAA,MAAA,GAAA,SAAA,CAAA;EAEO,iBAAA,CAAA,gBAHiB,SAGjB,CAAA,CAAA,MAAA,EAFP,OAEO,EAAA,SAAA,EAAA,MAAA,CAAA,EAAd,aAAc,CAAA,OAAA,EAAS,gBAAT,CAAA;EAAS,qBAAA,CAAA,SAAA,EAAA;IAAvB,MAAA,EAiBoB,SAjBpB;IAiBoB,SAAA,EAAA,MAAA;EAEpB,CAAA,EAAA,EAAA,OApFiD,CAoFjD,EAAA;IApFkC,IAAA,CAAA,EAAA,MAAA;EAAe,CAAA,CAAA,EAoFjD,eApFiD"}
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,61 +1,21 @@
1
1
  import "../../schema/create.js";
2
- import { fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
3
- import { createSettingsManager, settingsSchema } from "../../shared/settings-schema.js";
4
- import { createTableNameMapper } from "./shared.js";
2
+ import { createTableNameMapper } from "../shared/table-name-mapper.js";
5
3
  import { generateSchema } from "./generate.js";
6
- import { fromDrizzle } from "./drizzle-query.js";
7
- import { createDrizzleConnectionPool } from "./drizzle-connection-pool.js";
8
- import { sql } from "drizzle-orm";
4
+ import { GenericSQLAdapter } from "../generic-sql/generic-sql-adapter.js";
9
5
 
10
6
  //#region src/adapters/drizzle/drizzle-adapter.ts
11
- var DrizzleAdapter = class {
12
- #connectionPool;
13
- #provider;
14
- #schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
15
- constructor(config) {
16
- this.#connectionPool = createDrizzleConnectionPool(config.db);
17
- this.#provider = config.provider;
18
- }
19
- get [fragnoDatabaseAdapterNameFakeSymbol]() {
20
- return "drizzle";
21
- }
22
- get [fragnoDatabaseAdapterVersionFakeSymbol]() {
23
- return 0;
24
- }
25
- async close() {
26
- await this.#connectionPool.close();
7
+ var DrizzleAdapter = class extends GenericSQLAdapter {
8
+ constructor(options) {
9
+ super(options);
27
10
  }
28
11
  createTableNameMapper(namespace) {
29
- return createTableNameMapper(namespace);
30
- }
31
- get provider() {
32
- return this.#provider;
33
- }
34
- async isConnectionHealthy() {
35
- const conn = await this.#connectionPool.connect();
36
- try {
37
- const result = await conn.db.execute(sql`SELECT 1 as healthy`);
38
- if (Array.isArray(result)) return result.length > 0 && result[0]["healthy"] === 1;
39
- else return result.rows[0]["healthy"] === 1;
40
- } catch {
41
- return false;
42
- } finally {
43
- await conn.release();
44
- }
45
- }
46
- async getSchemaVersion(namespace) {
47
- return (await createSettingsManager(this.createQueryEngine(settingsSchema, namespace), namespace).get("version"))?.value;
48
- }
49
- createQueryEngine(schema, namespace) {
50
- this.#schemaNamespaceMap.set(schema, namespace);
51
- const mapper = namespace ? createTableNameMapper(namespace) : void 0;
52
- return fromDrizzle(schema, this.#connectionPool, this.#provider, mapper, void 0, this.#schemaNamespaceMap);
12
+ return createTableNameMapper(namespace, false);
53
13
  }
54
14
  createSchemaGenerator(fragments, options) {
55
15
  return { generateSchema: (genOptions) => {
56
16
  const path = genOptions?.path ?? options?.path ?? "fragno-schema.ts";
57
17
  return {
58
- schema: generateSchema(fragments, this.#provider),
18
+ schema: generateSchema(fragments, this.driverConfig.databaseType, { mapperFactory: (ns) => ns ? this.createTableNameMapper(ns) : void 0 }),
59
19
  path
60
20
  };
61
21
  } };
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-adapter.js","names":["#connectionPool","#provider","#schemaNamespaceMap"],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":["import type { DatabaseAdapter } 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 { createSettingsManager, settingsSchema } from \"../../shared/settings-schema\";\nimport { sql } from \"drizzle-orm\";\nimport {\n fragnoDatabaseAdapterNameFakeSymbol,\n fragnoDatabaseAdapterVersionFakeSymbol,\n} from \"../adapters\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\nimport { createDrizzleConnectionPool } from \"./drizzle-connection-pool\";\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\n constructor(config: DrizzleConfig) {\n this.#connectionPool = createDrizzleConnectionPool(\n config.db as DBType | (() => DBType | Promise<DBType>),\n );\n this.#provider = config.provider;\n }\n\n get [fragnoDatabaseAdapterNameFakeSymbol](): string {\n return \"drizzle\";\n }\n\n get [fragnoDatabaseAdapterVersionFakeSymbol](): number {\n return 0;\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 const queryEngine = this.createQueryEngine(settingsSchema, namespace);\n const manager = createSettingsManager(queryEngine, namespace);\n\n // Try to read the version key directly\n const result = await manager.get(\"version\");\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":";;;;;;;;;;AAqBA,IAAa,iBAAb,MAAyE;CACvE;CACA;CACA,sCAAsB,IAAI,SAA4B;CAEtD,YAAY,QAAuB;AACjC,QAAKA,iBAAkB,4BACrB,OAAO,GACR;AACD,QAAKC,WAAY,OAAO;;CAG1B,KAAK,uCAA+C;AAClD,SAAO;;CAGT,KAAK,0CAAkD;AACrD,SAAO;;CAGT,MAAM,QAAuB;AAC3B,QAAM,MAAKD,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;AAMrE,UADe,MAHC,sBADI,KAAK,kBAAkB,gBAAgB,UAAU,EAClB,UAAU,CAGhC,IAAI,UAAU,GAC5B;;CAGjB,kBACE,QACA,WAC0C;AAE1C,QAAKE,mBAAoB,IAAI,QAAQ,UAAU;EAG/C,MAAM,SAAS,YAAY,sBAAsB,UAAU,GAAG;AAC9D,SAAO,YACL,QACA,MAAKF,gBACL,MAAKC,UACL,QACA,QACA,MAAKC,mBACN;;CAGH,sBACE,WACA,SACiB;AACjB,SAAO,EACL,iBAAiB,eAAe;GAC9B,MAAM,OAAO,YAAY,QAAQ,SAAS,QAAQ;AAElD,UAAO;IACL,QAAQ,eAAe,WAAW,MAAKD,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,9 +12,14 @@ 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
- * Generate a schema file from one or more fragments with a shared settings table
19
+ * Generate a settings table for storing fragment versions
20
+ */
21
+ /**
22
+ * Generate a schema file from one or more fragments with automatic de-duplication
17
23
  */
18
24
  declare function generateSchema(fragments: {
19
25
  namespace: string;
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","names":[],"sources":["../../../src/adapters/drizzle/generate.ts"],"sourcesContent":[],"mappings":";;;;KA8BY,iBAAA,GAAoB,QAAQ;UAqjBvB,qBAAA;EArjBL;EAqjBK,iBAAA,CAAA,EAAA;IA4BD;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,9 +1,8 @@
1
1
  import { InternalIdColumn } from "../../schema/create.js";
2
- import { schemaToDBType } from "../../schema/serialize.js";
3
- import { SETTINGS_TABLE_NAME, settingsSchema } from "../../shared/settings-schema.js";
4
2
  import { importGenerator } from "../../util/import-generator.js";
5
3
  import { ident, parseVarchar } from "../../util/parse.js";
6
- 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";
7
6
 
8
7
  //#region src/adapters/drizzle/generate.ts
9
8
  const PROVIDER_IMPORTS = {
@@ -51,7 +50,7 @@ function generateBinaryCustomType(ctx, customTypes) {
51
50
  const code = generateCustomType(ctx, name, {
52
51
  dataType: "Uint8Array",
53
52
  driverDataType: "Buffer",
54
- databaseDataType: schemaToDBType({ type: "binary" }, ctx.provider),
53
+ databaseDataType: createSQLTypeMapper(ctx.provider).getDatabaseType({ type: "binary" }),
55
54
  fromDriverCode: "return new Uint8Array(value.buffer, value.byteOffset, value.byteLength)",
56
55
  toDriverCode: `return value instanceof Buffer? value : Buffer.from(value)`
57
56
  });
@@ -60,10 +59,10 @@ function generateBinaryCustomType(ctx, customTypes) {
60
59
  }
61
60
  /**
62
61
  * Maps SQL database types to Drizzle function names and parameters.
63
- * Uses schemaToDBType as the source of truth for type conversion.
62
+ * Uses SQLTypeMapper as the source of truth for type conversion.
64
63
  */
65
64
  function getColumnTypeFunction(ctx, column, customTypes) {
66
- return mapDBTypeToDrizzleFunction(ctx, schemaToDBType(column, ctx.provider), column, customTypes);
65
+ return mapDBTypeToDrizzleFunction(ctx, createSQLTypeMapper(ctx.provider).getDatabaseType(column), column, customTypes);
67
66
  }
68
67
  /**
69
68
  * Maps a database type string to a Drizzle function name and parameters.
@@ -100,7 +99,11 @@ function mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes) {
100
99
  name: generateBinaryCustomType(ctx, customTypes),
101
100
  isCustomType: true
102
101
  };
103
- case "bigint": return { name: "bigint" };
102
+ case "bigint": return {
103
+ name: "bigint",
104
+ params: [`{ mode: "number" }`]
105
+ };
106
+ case "integer": return { name: "int" };
104
107
  default:
105
108
  if (dbType.startsWith("varchar(")) return {
106
109
  name: "varchar",
@@ -139,6 +142,13 @@ function mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes) {
139
142
  }
140
143
  return { name: dbType };
141
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
+ }
142
152
  function generateColumnDefinition(ctx, column, customTypes) {
143
153
  const parts = [];
144
154
  const typeFn = getColumnTypeFunction(ctx, column, customTypes);
@@ -177,8 +187,7 @@ function generateColumnDefinition(ctx, column, customTypes) {
177
187
  function generateAllColumns(ctx, table, customTypes) {
178
188
  return Object.values(table.columns).map((column) => generateColumnDefinition(ctx, column, customTypes));
179
189
  }
180
- function generateForeignKeys(ctx, table, namespace) {
181
- const mapper = namespace ? createTableNameMapper(namespace) : void 0;
190
+ function generateForeignKeys(ctx, table, namespace, mapper) {
182
191
  const keys = [];
183
192
  for (const relation of Object.values(table.relations)) {
184
193
  if (relation.type === "many") continue;
@@ -219,21 +228,21 @@ function generateIndexes(ctx, table, namespace) {
219
228
  }
220
229
  return indexes;
221
230
  }
222
- function generateTableConstraints(ctx, table, namespace) {
223
- 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)];
224
233
  }
225
- function generateTable(ctx, table, customTypes, namespace) {
234
+ function generateTable(ctx, table, customTypes, namespace, mapper) {
226
235
  const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];
227
236
  ctx.imports.addImport(tableFn, ctx.importSource);
228
237
  const columns = generateAllColumns(ctx, table, customTypes);
229
- const constraints = generateTableConstraints(ctx, table, namespace);
230
- const physicalTableName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
231
- 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;
232
241
  const args = [`"${physicalTableName}"`, `{\n${columns.join(",\n")}\n}`];
233
242
  if (constraints.length > 0) args.push(`(table) => [\n${ident(constraints.join(",\n"))}\n]`);
234
243
  return `export const ${exportName} = ${tableFn}(${args.join(", ")})`;
235
244
  }
236
- function generateRelation(ctx, table, namespace, inverseRelations) {
245
+ function generateRelation(ctx, table, namespace, inverseRelations, _mapper) {
237
246
  const relations = [];
238
247
  let hasOne = false;
239
248
  let hasMany = false;
@@ -244,10 +253,10 @@ function generateRelation(ctx, table, namespace, inverseRelations) {
244
253
  if (relation.type === "one") {
245
254
  const fields = [];
246
255
  const references = [];
247
- const tableRef$1 = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
256
+ const tableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
248
257
  const relatedTableRef = namespace ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}` : relation.table.ormName;
249
258
  for (const [left, right] of relation.on) {
250
- fields.push(`${tableRef$1}.${left}`);
259
+ fields.push(`${tableRef}.${left}`);
251
260
  const actualRight = right === "id" ? "_internalId" : right;
252
261
  references.push(`${relatedTableRef}.${actualRight}`);
253
262
  }
@@ -271,10 +280,10 @@ function generateRelation(ctx, table, namespace, inverseRelations) {
271
280
  if (hasOne) params.push("one");
272
281
  if (hasMany) params.push("many");
273
282
  const relationParams = params.length > 0 ? `{ ${params.join(", ")} }` : "{}";
274
- const tableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
275
- 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`;
276
285
  ctx.imports.addImport("relations", "drizzle-orm");
277
- return `export const ${relationsName} = relations(${tableRef}, (${relationParams}) => ({
286
+ return `export const ${relationsName} = relations(${exportTableRef}, (${relationParams}) => ({
278
287
  ${relations.join(",\n")}
279
288
  }));`;
280
289
  }
@@ -282,19 +291,19 @@ ${relations.join(",\n")}
282
291
  * Generate a schema export object for a fragment
283
292
  * This groups all tables by their logical names for easier access
284
293
  */
285
- function generateFragmentSchemaExport(schema, namespace, tablesWithRelations) {
294
+ function generateFragmentSchemaExport(schema, namespace, tablesWithRelations, _mapper) {
286
295
  const drizzleEntries = [];
287
296
  for (const table of Object.values(schema.tables)) {
288
- const physicalExportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
289
- drizzleEntries.push(` ${physicalExportName}: ${physicalExportName}`);
297
+ const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
298
+ drizzleEntries.push(` ${exportName}: ${exportName}`);
290
299
  if (tablesWithRelations?.has(table.name)) {
291
- const relationsName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}Relations` : `${table.ormName}Relations`;
300
+ const relationsName = namespace ? `${exportName}Relations` : `${table.ormName}Relations`;
292
301
  drizzleEntries.push(` ${relationsName}: ${relationsName}`);
293
302
  }
294
303
  if (namespace) {
295
- drizzleEntries.push(` ${table.ormName}: ${physicalExportName}`);
304
+ drizzleEntries.push(` ${table.ormName}: ${exportName}`);
296
305
  if (tablesWithRelations?.has(table.name)) {
297
- const physicalRelationsName = `${table.ormName}_${sanitizeNamespace(namespace)}Relations`;
306
+ const physicalRelationsName = `${exportName}Relations`;
298
307
  const aliasRelationsName = `${table.ormName}Relations`;
299
308
  drizzleEntries.push(` ${aliasRelationsName}: ${physicalRelationsName}`);
300
309
  }
@@ -306,33 +315,23 @@ function generateFragmentSchemaExport(schema, namespace, tablesWithRelations) {
306
315
  /**
307
316
  * Generate a settings table for storing fragment versions
308
317
  */
309
- function generateSettingsTable(ctx) {
310
- const settingsTable = settingsSchema.tables[SETTINGS_TABLE_NAME];
311
- return generateTable(ctx, settingsTable, []);
312
- }
313
318
  /**
314
- * Generate a schema file from one or more fragments with a shared settings table
319
+ * Generate a schema file from one or more fragments with automatic de-duplication
315
320
  */
316
321
  function generateSchema(fragments, provider, options) {
317
322
  const ctx = createContext(provider, options?.idGeneratorImport);
318
323
  const customTypes = [];
319
324
  const sections = [];
320
- sections.push("");
321
- sections.push("// ============================================================================");
322
- sections.push("// Settings Table (shared across all fragments)");
323
- sections.push("// ============================================================================");
324
- sections.push("");
325
- sections.push(generateSettingsTable(ctx));
326
- sections.push("");
327
- sections.push(`export const fragnoDbSettingSchemaVersion = ${settingsSchema.version};`);
328
- for (const { namespace, schema } of fragments) {
325
+ const getMapper = options?.mapperFactory || ((ns) => ns ? createTableNameMapper(ns, true) : void 0);
326
+ for (const { schema, namespace } of fragments) {
329
327
  const fragmentTables = [];
328
+ const mapper = getMapper(namespace);
330
329
  fragmentTables.push("");
331
330
  fragmentTables.push("// ============================================================================");
332
331
  fragmentTables.push(`// Fragment: ${namespace}`);
333
332
  fragmentTables.push("// ============================================================================");
334
333
  for (const table of Object.values(schema.tables)) {
335
- const tableCode = generateTable(ctx, table, customTypes, namespace);
334
+ const tableCode = generateTable(ctx, table, customTypes, namespace, mapper);
336
335
  fragmentTables.push("");
337
336
  fragmentTables.push(tableCode);
338
337
  }
@@ -347,15 +346,17 @@ function generateSchema(fragments, provider, options) {
347
346
  }
348
347
  const tablesWithRelations = /* @__PURE__ */ new Set();
349
348
  for (const table of Object.values(schema.tables)) {
350
- const relationCode = generateRelation(ctx, table, namespace, inverseRelations.get(table.name));
349
+ const relationCode = generateRelation(ctx, table, namespace, inverseRelations.get(table.name), mapper);
351
350
  if (relationCode) {
352
351
  fragmentTables.push("");
353
352
  fragmentTables.push(relationCode);
354
353
  tablesWithRelations.add(table.name);
355
354
  }
356
355
  }
357
- fragmentTables.push("");
358
- fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations));
356
+ if (namespace !== "") {
357
+ fragmentTables.push("");
358
+ fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations, mapper));
359
+ }
359
360
  sections.push(...fragmentTables);
360
361
  }
361
362
  return [