@fragno-dev/db 0.2.2 → 0.3.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 (355) hide show
  1. package/.turbo/turbo-build.log +202 -140
  2. package/CHANGELOG.md +35 -0
  3. package/README.md +30 -9
  4. package/dist/adapters/adapters.d.ts +23 -21
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/generic-sql/driver-config.d.ts +16 -1
  8. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -1
  9. package/dist/adapters/generic-sql/driver-config.js +23 -1
  10. package/dist/adapters/generic-sql/driver-config.js.map +1 -1
  11. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +27 -9
  12. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
  13. package/dist/adapters/generic-sql/generic-sql-adapter.js +55 -16
  14. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
  15. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +129 -3
  16. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
  17. package/dist/adapters/generic-sql/migration/dialect/mysql.js +24 -5
  18. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
  19. package/dist/adapters/generic-sql/migration/dialect/postgres.js +6 -5
  20. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
  21. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +21 -10
  22. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
  23. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
  24. package/dist/adapters/generic-sql/migration/prepared-migrations.js +8 -8
  25. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
  26. package/dist/adapters/generic-sql/migration/sql-generator.js +74 -51
  27. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
  28. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +6 -5
  29. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
  30. package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
  31. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
  32. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +25 -17
  33. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
  34. package/dist/adapters/generic-sql/query/select-builder.js +5 -3
  35. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
  36. package/dist/adapters/generic-sql/query/sql-query-compiler.js +15 -12
  37. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
  38. package/dist/adapters/generic-sql/query/where-builder.js +39 -29
  39. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
  40. package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
  41. package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  42. package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
  43. package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
  44. package/dist/adapters/generic-sql/uow-decoder.js +7 -3
  45. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
  46. package/dist/adapters/generic-sql/uow-encoder.js +28 -8
  47. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
  48. package/dist/adapters/in-memory/condition-evaluator.js +131 -0
  49. package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
  50. package/dist/adapters/in-memory/errors.d.ts +13 -0
  51. package/dist/adapters/in-memory/errors.d.ts.map +1 -0
  52. package/dist/adapters/in-memory/errors.js +23 -0
  53. package/dist/adapters/in-memory/errors.js.map +1 -0
  54. package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
  55. package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
  56. package/dist/adapters/in-memory/in-memory-adapter.js +176 -0
  57. package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
  58. package/dist/adapters/in-memory/in-memory-uow.js +648 -0
  59. package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
  60. package/dist/adapters/in-memory/index.d.ts +4 -0
  61. package/dist/adapters/in-memory/index.js +4 -0
  62. package/dist/adapters/in-memory/options.d.ts +28 -0
  63. package/dist/adapters/in-memory/options.d.ts.map +1 -0
  64. package/dist/adapters/in-memory/options.js +61 -0
  65. package/dist/adapters/in-memory/options.js.map +1 -0
  66. package/dist/adapters/in-memory/reference-resolution.js +26 -0
  67. package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
  68. package/dist/adapters/in-memory/sorted-array-index.js +129 -0
  69. package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
  70. package/dist/adapters/in-memory/store.js +71 -0
  71. package/dist/adapters/in-memory/store.js.map +1 -0
  72. package/dist/adapters/in-memory/value-comparison.js +28 -0
  73. package/dist/adapters/in-memory/value-comparison.js.map +1 -0
  74. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
  75. package/dist/adapters/shared/uow-operation-compiler.js +11 -11
  76. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
  77. package/dist/adapters/sql/index.d.ts +5 -0
  78. package/dist/adapters/sql/index.js +4 -0
  79. package/dist/db-fragment-definition-builder.d.ts +18 -7
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  81. package/dist/db-fragment-definition-builder.js +116 -54
  82. package/dist/db-fragment-definition-builder.js.map +1 -1
  83. package/dist/dispatchers/cloudflare-do/index.d.ts +26 -0
  84. package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
  85. package/dist/dispatchers/cloudflare-do/index.js +63 -0
  86. package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
  87. package/dist/dispatchers/node/index.d.ts +17 -0
  88. package/dist/dispatchers/node/index.d.ts.map +1 -0
  89. package/dist/dispatchers/node/index.js +59 -0
  90. package/dist/dispatchers/node/index.js.map +1 -0
  91. package/dist/fragments/internal-fragment.d.ts +79 -2
  92. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  93. package/dist/fragments/internal-fragment.js +150 -32
  94. package/dist/fragments/internal-fragment.js.map +1 -1
  95. package/dist/fragments/internal-fragment.routes.js +29 -0
  96. package/dist/fragments/internal-fragment.routes.js.map +1 -0
  97. package/dist/fragments/internal-fragment.schema.d.ts +9 -0
  98. package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
  99. package/dist/fragments/internal-fragment.schema.js +22 -0
  100. package/dist/fragments/internal-fragment.schema.js.map +1 -0
  101. package/dist/hooks/durable-hooks-processor.d.ts +14 -0
  102. package/dist/hooks/durable-hooks-processor.d.ts.map +1 -0
  103. package/dist/hooks/durable-hooks-processor.js +32 -0
  104. package/dist/hooks/durable-hooks-processor.js.map +1 -0
  105. package/dist/hooks/hooks.d.ts +42 -1
  106. package/dist/hooks/hooks.d.ts.map +1 -1
  107. package/dist/hooks/hooks.js +72 -6
  108. package/dist/hooks/hooks.js.map +1 -1
  109. package/dist/migration-engine/auto-from-schema.js +14 -11
  110. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  111. package/dist/migration-engine/generation-engine.d.ts +16 -10
  112. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  113. package/dist/migration-engine/generation-engine.js +72 -33
  114. package/dist/migration-engine/generation-engine.js.map +1 -1
  115. package/dist/migration-engine/shared.js.map +1 -1
  116. package/dist/mod.d.ts +15 -8
  117. package/dist/mod.d.ts.map +1 -1
  118. package/dist/mod.js +14 -8
  119. package/dist/mod.js.map +1 -1
  120. package/dist/naming/sql-naming.d.ts +19 -0
  121. package/dist/naming/sql-naming.d.ts.map +1 -0
  122. package/dist/naming/sql-naming.js +116 -0
  123. package/dist/naming/sql-naming.js.map +1 -0
  124. package/dist/node_modules/.pnpm/{rou3@0.7.10 → rou3@0.7.12}/node_modules/rou3/dist/index.js +8 -5
  125. package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +1 -0
  126. package/dist/outbox/outbox-builder.js +156 -0
  127. package/dist/outbox/outbox-builder.js.map +1 -0
  128. package/dist/outbox/outbox.d.ts +52 -0
  129. package/dist/outbox/outbox.d.ts.map +1 -0
  130. package/dist/outbox/outbox.js +37 -0
  131. package/dist/outbox/outbox.js.map +1 -0
  132. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +3 -2
  133. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -1
  134. package/dist/packages/fragno/dist/api/fragment-instantiator.js +164 -20
  135. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
  136. package/dist/packages/fragno/dist/api/request-input-context.js +67 -0
  137. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -1
  138. package/dist/packages/fragno/dist/api/route.js +14 -1
  139. package/dist/packages/fragno/dist/api/route.js.map +1 -1
  140. package/dist/packages/fragno/dist/internal/trace-context.js +12 -0
  141. package/dist/packages/fragno/dist/internal/trace-context.js.map +1 -0
  142. package/dist/query/column-defaults.js +20 -4
  143. package/dist/query/column-defaults.js.map +1 -1
  144. package/dist/query/cursor.d.ts +3 -1
  145. package/dist/query/cursor.d.ts.map +1 -1
  146. package/dist/query/cursor.js +45 -14
  147. package/dist/query/cursor.js.map +1 -1
  148. package/dist/query/db-now.d.ts +8 -0
  149. package/dist/query/db-now.d.ts.map +1 -0
  150. package/dist/query/db-now.js +7 -0
  151. package/dist/query/db-now.js.map +1 -0
  152. package/dist/query/serialize/create-sql-serializer.js +3 -2
  153. package/dist/query/serialize/create-sql-serializer.js.map +1 -1
  154. package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
  155. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
  156. package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
  157. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
  158. package/dist/query/serialize/dialect/sqlite-serializer.js +55 -11
  159. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
  160. package/dist/query/serialize/sql-serializer.js +2 -2
  161. package/dist/query/serialize/sql-serializer.js.map +1 -1
  162. package/dist/query/simple-query-interface.d.ts +6 -1
  163. package/dist/query/simple-query-interface.d.ts.map +1 -1
  164. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  165. package/dist/query/unit-of-work/execute-unit-of-work.js +11 -6
  166. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  167. package/dist/query/unit-of-work/unit-of-work.d.ts +50 -14
  168. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  169. package/dist/query/unit-of-work/unit-of-work.js +86 -5
  170. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  171. package/dist/query/value-decoding.js +9 -6
  172. package/dist/query/value-decoding.js.map +1 -1
  173. package/dist/query/value-encoding.js +29 -9
  174. package/dist/query/value-encoding.js.map +1 -1
  175. package/dist/schema/create.d.ts +38 -14
  176. package/dist/schema/create.d.ts.map +1 -1
  177. package/dist/schema/create.js +81 -42
  178. package/dist/schema/create.js.map +1 -1
  179. package/dist/schema/generate-id.js +2 -2
  180. package/dist/schema/generate-id.js.map +1 -1
  181. package/dist/schema/type-conversion/create-sql-type-mapper.js +3 -2
  182. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  183. package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
  184. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  185. package/dist/schema/validator.d.ts +10 -0
  186. package/dist/schema/validator.d.ts.map +1 -0
  187. package/dist/schema/validator.js +123 -0
  188. package/dist/schema/validator.js.map +1 -0
  189. package/dist/schema-output/drizzle.d.ts +30 -0
  190. package/dist/schema-output/drizzle.d.ts.map +1 -0
  191. package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +82 -56
  192. package/dist/schema-output/drizzle.js.map +1 -0
  193. package/dist/schema-output/prisma.d.ts +17 -0
  194. package/dist/schema-output/prisma.d.ts.map +1 -0
  195. package/dist/schema-output/prisma.js +296 -0
  196. package/dist/schema-output/prisma.js.map +1 -0
  197. package/dist/util/default-database-adapter.js +61 -0
  198. package/dist/util/default-database-adapter.js.map +1 -0
  199. package/dist/with-database.d.ts +1 -1
  200. package/dist/with-database.d.ts.map +1 -1
  201. package/dist/with-database.js +12 -3
  202. package/dist/with-database.js.map +1 -1
  203. package/package.json +43 -28
  204. package/src/adapters/adapters.ts +30 -24
  205. package/src/adapters/drizzle/migrate-drizzle.test.ts +54 -33
  206. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +599 -0
  207. package/src/adapters/drizzle/test-utils.ts +12 -8
  208. package/src/adapters/generic-sql/driver-config.ts +38 -0
  209. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -5
  210. package/src/adapters/generic-sql/generic-sql-adapter.ts +110 -24
  211. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +54 -0
  212. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +231 -3
  213. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +118 -0
  214. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +26 -8
  215. package/src/adapters/generic-sql/migration/dialect/mysql.ts +46 -8
  216. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +25 -7
  217. package/src/adapters/generic-sql/migration/dialect/postgres.ts +8 -4
  218. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +47 -8
  219. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +27 -12
  220. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +128 -39
  221. package/src/adapters/generic-sql/migration/prepared-migrations.ts +15 -8
  222. package/src/adapters/generic-sql/migration/sql-generator.ts +142 -65
  223. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +9 -6
  224. package/src/adapters/generic-sql/query/cursor-utils.test.ts +271 -0
  225. package/src/adapters/generic-sql/query/cursor-utils.ts +41 -6
  226. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +27 -27
  227. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +38 -24
  228. package/src/adapters/generic-sql/query/select-builder.test.ts +15 -11
  229. package/src/adapters/generic-sql/query/select-builder.ts +6 -2
  230. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +52 -2
  231. package/src/adapters/generic-sql/query/sql-query-compiler.ts +50 -15
  232. package/src/adapters/generic-sql/query/where-builder.test.ts +91 -17
  233. package/src/adapters/generic-sql/query/where-builder.ts +90 -38
  234. package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +6 -6
  235. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +806 -0
  236. package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +11 -11
  237. package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +10 -10
  238. package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +7 -7
  239. package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +6 -6
  240. package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
  241. package/src/adapters/generic-sql/uow-decoder.test.ts +1 -1
  242. package/src/adapters/generic-sql/uow-decoder.ts +21 -3
  243. package/src/adapters/generic-sql/uow-encoder.test.ts +33 -2
  244. package/src/adapters/generic-sql/uow-encoder.ts +50 -11
  245. package/src/adapters/in-memory/condition-evaluator.test.ts +193 -0
  246. package/src/adapters/in-memory/condition-evaluator.ts +275 -0
  247. package/src/adapters/in-memory/errors.ts +20 -0
  248. package/src/adapters/in-memory/in-memory-adapter.ts +277 -0
  249. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +296 -0
  250. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +100 -0
  251. package/src/adapters/in-memory/in-memory-uow.ts +1348 -0
  252. package/src/adapters/in-memory/index.ts +3 -0
  253. package/src/adapters/in-memory/options.test.ts +41 -0
  254. package/src/adapters/in-memory/options.ts +87 -0
  255. package/src/adapters/in-memory/reference-resolution.test.ts +50 -0
  256. package/src/adapters/in-memory/reference-resolution.ts +67 -0
  257. package/src/adapters/in-memory/sorted-array-index.test.ts +123 -0
  258. package/src/adapters/in-memory/sorted-array-index.ts +228 -0
  259. package/src/adapters/in-memory/store.test.ts +68 -0
  260. package/src/adapters/in-memory/store.ts +145 -0
  261. package/src/adapters/in-memory/value-comparison.ts +53 -0
  262. package/src/adapters/in-memory/value-normalization.test.ts +57 -0
  263. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1163 -0
  264. package/src/adapters/shared/from-unit-of-work-compiler.ts +3 -1
  265. package/src/adapters/shared/uow-operation-compiler.ts +26 -16
  266. package/src/adapters/sql/index.ts +12 -0
  267. package/src/db-fragment-definition-builder.test.ts +30 -12
  268. package/src/db-fragment-definition-builder.ts +142 -73
  269. package/src/db-fragment-instantiator.test.ts +105 -13
  270. package/src/db-fragment-integration.test.ts +9 -7
  271. package/src/dispatchers/cloudflare-do/index.test.ts +73 -0
  272. package/src/dispatchers/cloudflare-do/index.ts +104 -0
  273. package/src/dispatchers/node/index.test.ts +91 -0
  274. package/src/dispatchers/node/index.ts +87 -0
  275. package/src/fragments/internal-fragment.routes.ts +42 -0
  276. package/src/fragments/internal-fragment.schema.ts +51 -0
  277. package/src/fragments/internal-fragment.test.ts +458 -8
  278. package/src/fragments/internal-fragment.ts +322 -63
  279. package/src/hooks/durable-hooks-processor.test.ts +117 -0
  280. package/src/hooks/durable-hooks-processor.ts +67 -0
  281. package/src/hooks/hooks.test.ts +165 -5
  282. package/src/hooks/hooks.ts +197 -9
  283. package/src/migration-engine/auto-from-schema.test.ts +14 -14
  284. package/src/migration-engine/auto-from-schema.ts +5 -2
  285. package/src/migration-engine/create.test.ts +2 -2
  286. package/src/migration-engine/generation-engine.test.ts +229 -104
  287. package/src/migration-engine/generation-engine.ts +94 -64
  288. package/src/migration-engine/shared.ts +1 -0
  289. package/src/mod.ts +64 -26
  290. package/src/naming/sql-naming.ts +180 -0
  291. package/src/outbox/outbox-builder.ts +241 -0
  292. package/src/outbox/outbox.test.ts +253 -0
  293. package/src/outbox/outbox.ts +137 -0
  294. package/src/query/column-defaults.ts +41 -3
  295. package/src/query/condition-builder.test.ts +3 -3
  296. package/src/query/cursor.test.ts +116 -18
  297. package/src/query/cursor.ts +75 -26
  298. package/src/query/db-now.ts +6 -0
  299. package/src/query/query-type.test.ts +2 -2
  300. package/src/query/serialize/create-sql-serializer.ts +7 -2
  301. package/src/query/serialize/dialect/mysql-serializer.ts +12 -4
  302. package/src/query/serialize/dialect/postgres-serializer.ts +34 -4
  303. package/src/query/serialize/dialect/sqlite-serializer.test.ts +51 -1
  304. package/src/query/serialize/dialect/sqlite-serializer.ts +92 -9
  305. package/src/query/serialize/sql-serializer.ts +4 -4
  306. package/src/query/simple-query-interface.ts +5 -0
  307. package/src/query/unit-of-work/execute-unit-of-work.test.ts +25 -1
  308. package/src/query/unit-of-work/execute-unit-of-work.ts +25 -8
  309. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +12 -12
  310. package/src/query/unit-of-work/unit-of-work-types.test.ts +1 -1
  311. package/src/query/unit-of-work/unit-of-work.test.ts +168 -37
  312. package/src/query/unit-of-work/unit-of-work.ts +203 -18
  313. package/src/query/value-decoding.test.ts +13 -2
  314. package/src/query/value-decoding.ts +17 -4
  315. package/src/query/value-encoding.test.ts +85 -2
  316. package/src/query/value-encoding.ts +56 -6
  317. package/src/schema/create.test.ts +129 -42
  318. package/src/schema/create.ts +185 -47
  319. package/src/schema/generate-id.test.ts +2 -2
  320. package/src/schema/generate-id.ts +2 -2
  321. package/src/schema/serialize.test.ts +14 -2
  322. package/src/schema/type-conversion/create-sql-type-mapper.ts +7 -2
  323. package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
  324. package/src/schema/type-conversion/type-mapping.test.ts +25 -1
  325. package/src/schema/validator.test.ts +197 -0
  326. package/src/schema/validator.ts +231 -0
  327. package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +179 -129
  328. package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +143 -93
  329. package/src/schema-output/prisma.test.ts +536 -0
  330. package/src/schema-output/prisma.ts +573 -0
  331. package/src/util/default-database-adapter.ts +106 -0
  332. package/src/with-database.ts +22 -3
  333. package/tsdown.config.ts +6 -4
  334. package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
  335. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
  336. package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
  337. package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
  338. package/dist/adapters/drizzle/generate.d.ts +0 -30
  339. package/dist/adapters/drizzle/generate.d.ts.map +0 -1
  340. package/dist/adapters/drizzle/generate.js.map +0 -1
  341. package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
  342. package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
  343. package/dist/adapters/kysely/kysely-adapter.js +0 -17
  344. package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
  345. package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
  346. package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
  347. package/dist/adapters/shared/table-name-mapper.js +0 -43
  348. package/dist/adapters/shared/table-name-mapper.js.map +0 -1
  349. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
  350. package/dist/schema-generator/schema-generator.d.ts +0 -15
  351. package/dist/schema-generator/schema-generator.d.ts.map +0 -1
  352. package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
  353. package/src/adapters/kysely/kysely-adapter.ts +0 -27
  354. package/src/adapters/shared/table-name-mapper.ts +0 -50
  355. package/src/schema-generator/schema-generator.ts +0 -12
package/README.md CHANGED
@@ -2,8 +2,9 @@
2
2
 
3
3
  Optional, ORM-agnostic database layer for Fragno libraries.
4
4
 
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.
5
+ Library authors define a type-safe schema; users plug in the SqlAdapter (configured with Kysely
6
+ dialects) so data is written directly into their database. Schema output can be generated for SQL
7
+ migrations, Drizzle, or Prisma workflows.
7
8
 
8
9
  Full docs live at
9
10
  [Database integration for library authors](https://fragno.dev/docs/fragno/for-library-authors/database-integration/overview).
@@ -39,7 +40,7 @@ pnpm add --dev @fragno-dev/cli
39
40
  // schema.ts
40
41
  import { schema, idColumn, column } from "@fragno-dev/db/schema";
41
42
 
42
- export const commentSchema = schema((s) => {
43
+ export const commentSchema = schema("comment", (s) => {
43
44
  return s
44
45
  .addTable("comment", (t) => {
45
46
  return t
@@ -91,22 +92,42 @@ export function createCommentLibrary(
91
92
  }
92
93
  ```
93
94
 
94
- Your users pass their own database adapter (Kysely or Drizzle) via `options`.
95
+ Your users pass a SqlAdapter via `options`. If `better-sqlite3` is installed, `databaseAdapter` is
96
+ optional and defaults to a local SQLite file per fragment in `FRAGNO_DATA_DIR` (default:
97
+ `~/.fragno`).
98
+
99
+ ```ts
100
+ // User's application code
101
+ import { SqlAdapter } from "@fragno-dev/db";
102
+ import { PostgresDialect } from "kysely";
103
+ import { Pool } from "pg";
104
+
105
+ const commentLib = createCommentLibrary(
106
+ { maxCommentsPerPost: 10 },
107
+ {
108
+ databaseAdapter: new SqlAdapter({
109
+ dialect: new PostgresDialect({
110
+ pool: new Pool({
111
+ /* connection config */
112
+ }),
113
+ }),
114
+ }),
115
+ },
116
+ );
117
+ ```
95
118
 
96
119
  ## Key features
97
120
 
98
121
  - **Schema definition**: define tables, columns, indexes, and relations with a fluent, typed API.
99
122
  - **Type-safe ORM**: full TypeScript inference for queries and results.
100
123
  - **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).
124
+ - **ORM agnostic**: SQL runtime with explicit schema output formats (SQL, Drizzle, Prisma).
102
125
  - **Namespaced tables**: avoids conflicts with user tables.
103
126
 
104
127
  ## ORM and database support
105
128
 
106
- `@fragno-dev/db` works with:
107
-
108
- - **Kysely**
109
- - **Drizzle**
129
+ `@fragno-dev/db` works with Kysely dialects for runtime execution and supports SQL migrations plus
130
+ Drizzle or Prisma schema outputs.
110
131
 
111
132
  Backed by Postgres and SQLite, including PGLite and Cloudflare Durable Objects.
112
133
 
@@ -1,8 +1,10 @@
1
1
  import { AnySchema } from "../schema/create.js";
2
+ import { SqlNamingStrategy } from "../naming/sql-naming.js";
3
+ import { SQLiteStorageMode } from "./generic-sql/sqlite-storage.js";
2
4
  import { IUnitOfWork } from "../query/unit-of-work/unit-of-work.js";
3
5
  import { SimpleQueryInterface } from "../query/simple-query-interface.js";
4
- import { SchemaGenerator } from "../schema-generator/schema-generator.js";
5
6
  import { PreparedMigrations } from "./generic-sql/migration/prepared-migrations.js";
7
+ import { SQLProvider } from "../shared/providers.js";
6
8
  import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
7
9
 
8
10
  //#region src/adapters/adapters.d.ts
@@ -15,12 +17,11 @@ declare const fragnoDatabaseAdapterVersionFakeSymbol: "$fragno-database-adapter-
15
17
  type DatabaseContextStorage = {
16
18
  uow: IUnitOfWork;
17
19
  };
18
- /**
19
- * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)
20
- */
21
- interface TableNameMapper {
22
- toPhysical(logicalName: string): string;
23
- toLogical(physicalName: string): string;
20
+ type SQLiteProfile = "default" | "prisma";
21
+ interface DatabaseAdapterMetadata {
22
+ databaseType?: SQLProvider;
23
+ sqliteProfile?: SQLiteProfile;
24
+ sqliteStorageMode?: SQLiteStorageMode;
24
25
  }
25
26
  interface DatabaseAdapter<TUOWConfig = void> {
26
27
  [fragnoDatabaseAdapterNameFakeSymbol]: string;
@@ -30,30 +31,31 @@ interface DatabaseAdapter<TUOWConfig = void> {
30
31
  * This allows multiple fragments to participate in the same Unit of Work.
31
32
  */
32
33
  readonly contextStorage: RequestContextStorage<DatabaseContextStorage>;
34
+ /**
35
+ * Optional adapter override used for durable hook processing.
36
+ * Use this when the public adapter wraps another adapter (e.g. model checker).
37
+ */
38
+ getHookProcessingAdapter?: () => DatabaseAdapter<TUOWConfig>;
33
39
  /**
34
40
  * Get current schema version, undefined if not initialized.
35
41
  */
36
42
  getSchemaVersion(namespace: string): Promise<string | undefined>;
37
- createQueryEngine: <const T extends AnySchema>(schema: T, namespace: string) => SimpleQueryInterface<T, TUOWConfig>;
38
- prepareMigrations?: <const T extends AnySchema>(schema: T, namespace: string) => PreparedMigrations;
39
43
  /**
40
- * Generate a combined schema file from one or more fragments.
41
- * If not implemented, schema generation is not supported for this adapter.
44
+ * Optional metadata used by schema output tooling.
45
+ */
46
+ readonly adapterMetadata?: DatabaseAdapterMetadata;
47
+ /**
48
+ * Naming strategy used for physical SQL identifiers.
42
49
  */
43
- createSchemaGenerator?: (fragments: {
44
- schema: AnySchema;
45
- namespace: string;
46
- }[], options?: {
47
- path?: string;
48
- }) => SchemaGenerator;
50
+ readonly namingStrategy: SqlNamingStrategy;
49
51
  /**
50
- * Creates a table name mapper for the given namespace.
51
- * Used to convert between logical table names and physical table names.
52
+ * @deprecated Avoid using query engines directly in fragment code. Prefer handlerTx/serviceTx.
52
53
  */
53
- createTableNameMapper: (namespace: string) => TableNameMapper;
54
+ createQueryEngine: <const T extends AnySchema>(schema: T, namespace: string | null) => SimpleQueryInterface<T, TUOWConfig>;
55
+ prepareMigrations?: <const T extends AnySchema>(schema: T, namespace: string | null) => PreparedMigrations;
54
56
  isConnectionHealthy: () => Promise<boolean>;
55
57
  close: () => Promise<void>;
56
58
  }
57
59
  //#endregion
58
- export { DatabaseAdapter, DatabaseContextStorage, TableNameMapper, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol };
60
+ export { DatabaseAdapter, DatabaseAdapterMetadata, DatabaseContextStorage, SQLiteProfile, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol };
59
61
  //# sourceMappingURL=adapters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;;;cAOa;cACA;AADb;AACA;AAMA;AAOA;AAKiB,KAZL,sBAAA,GAYoB;EAC7B,GAAA,EAZI,WAYJ;CACA;;;;AAamC,UApBrB,eAAA,CAoBqB;EAC1B,UAAA,CAAA,WAAA,EAAA,MAAA,CAAA,EAAA,MAAA;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
+ {"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;cASa;cACA;AADb;AACA;AAMA;AAIA;AAEiB,KANL,sBAAA,GAM4B;EACvB,GAAA,EANV,WAMU;CACC;AACI,KALV,aAAA,GAKU,SAAA,GAAA,QAAA;AAAiB,UAHtB,uBAAA,CAGsB;EAGtB,YAAA,CAAA,EALA,WAKe;EAC7B,aAAA,CAAA,EALe,aAKf;EACA,iBAAA,CAAA,EALmB,iBAKnB;;AAMwB,UARV,eAQU,CAAA,aAAA,IAAA,CAAA,CAAA;EAMwB,CAbhD,mCAAA,CAagD,EAAA,MAAA;EAAhB,CAZhC,sCAAA,CAYgC,EAAA,MAAA;EAKI;;;;EAgB3B,SAAA,cAAA,EA3Be,qBA2Bf,CA3BqC,sBA2BrC,CAAA;EAEgB;;;;EAGhB,wBAAA,CAAA,EAAA,GAAA,GA1BuB,eA0BvB,CA1BuC,UA0BvC,CAAA;EAEL;;;EAIe,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EA3BiB,OA2BjB,CAAA,MAAA,GAAA,SAAA,CAAA;;;;6BAtBO;;;;2BAKF;;;;sCAKW,mBAC1B,gCAEL,qBAAqB,GAAG;uCAEQ,mBAC3B,gCAEL;6BAEsB;eAEd"}
@@ -1 +1 @@
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
+ {"version":3,"file":"adapters.js","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":["import type { SimpleQueryInterface } from \"../query/simple-query-interface\";\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\";\nimport type { SQLProvider } from \"../shared/providers\";\nimport type { SQLiteStorageMode } from \"./generic-sql/sqlite-storage\";\nimport type { SqlNamingStrategy } from \"../naming/sql-naming\";\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\nexport type SQLiteProfile = \"default\" | \"prisma\";\n\nexport interface DatabaseAdapterMetadata {\n databaseType?: SQLProvider;\n sqliteProfile?: SQLiteProfile;\n sqliteStorageMode?: SQLiteStorageMode;\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 * Optional adapter override used for durable hook processing.\n * Use this when the public adapter wraps another adapter (e.g. model checker).\n */\n getHookProcessingAdapter?: () => DatabaseAdapter<TUOWConfig>;\n\n /**\n * Get current schema version, undefined if not initialized.\n */\n getSchemaVersion(namespace: string): Promise<string | undefined>;\n\n /**\n * Optional metadata used by schema output tooling.\n */\n readonly adapterMetadata?: DatabaseAdapterMetadata;\n\n /**\n * Naming strategy used for physical SQL identifiers.\n */\n readonly namingStrategy: SqlNamingStrategy;\n\n /**\n * @deprecated Avoid using query engines directly in fragment code. Prefer handlerTx/serviceTx.\n */\n createQueryEngine: <const T extends AnySchema>(\n schema: T,\n namespace: string | null,\n ) => SimpleQueryInterface<T, TUOWConfig>;\n\n prepareMigrations?: <const T extends AnySchema>(\n schema: T,\n namespace: string | null,\n ) => PreparedMigrations;\n\n isConnectionHealthy: () => Promise<boolean>;\n\n close: () => Promise<void>;\n}\n"],"mappings":";AASA,MAAa,sCAAsC;AACnD,MAAa,yCAAyC"}
@@ -1,3 +1,5 @@
1
+ import { SqlNamingStrategy } from "../../naming/sql-naming.js";
2
+
1
3
  //#region src/adapters/generic-sql/driver-config.d.ts
2
4
  declare const supportedDatabases: readonly ["sqlite", "postgresql", "mysql"];
3
5
  type SupportedDatabase = (typeof supportedDatabases)[number];
@@ -8,12 +10,17 @@ declare abstract class DriverConfig<T extends SupportedDriverType = SupportedDri
8
10
  abstract readonly databaseType: SupportedDatabase;
9
11
  abstract readonly supportsReturning: boolean;
10
12
  abstract readonly supportsJson: boolean;
13
+ abstract readonly outboxVersionstampStrategy: OutboxVersionstampStrategy;
11
14
  /**
12
15
  * Column name for internal ID in RETURNING results.
13
16
  * Only defined if supportsReturning is true.
14
17
  */
15
18
  abstract readonly internalIdColumn: string | undefined;
19
+ /**
20
+ * SQLite storage selection is handled by adapters, not driver config.
21
+ */
16
22
  get supportsRowsAffected(): boolean;
23
+ get defaultNamingStrategy(): SqlNamingStrategy;
17
24
  /**
18
25
  * Extract the number of affected rows from a query result.
19
26
  * Only implemented for drivers that support affected rows reporting.
@@ -24,12 +31,15 @@ declare abstract class DriverConfig<T extends SupportedDriverType = SupportedDri
24
31
  */
25
32
  extractAffectedRows?(result: Record<string, unknown>): bigint;
26
33
  }
34
+ declare const defaultNamingStrategyForDatabase: (databaseType: SupportedDatabase) => SqlNamingStrategy;
35
+ type OutboxVersionstampStrategy = "update-returning" | "insert-on-conflict-returning" | "insert-on-duplicate-last-insert-id";
27
36
  declare class SQLocalDriverConfig extends DriverConfig<"sqlocal"> {
28
37
  readonly driverType = "sqlocal";
29
38
  readonly databaseType = "sqlite";
30
39
  readonly supportsReturning = true;
31
40
  readonly supportsJson = false;
32
41
  readonly internalIdColumn = "_internalId";
42
+ readonly outboxVersionstampStrategy = "insert-on-conflict-returning";
33
43
  }
34
44
  declare class CloudflareDurableObjectsDriverConfig extends DriverConfig<"cloudflare_durable_objects"> {
35
45
  readonly driverType = "cloudflare_durable_objects";
@@ -37,6 +47,7 @@ declare class CloudflareDurableObjectsDriverConfig extends DriverConfig<"cloudfl
37
47
  readonly supportsReturning = true;
38
48
  readonly supportsJson = false;
39
49
  readonly internalIdColumn = "_internalId";
50
+ readonly outboxVersionstampStrategy = "insert-on-conflict-returning";
40
51
  }
41
52
  declare class BetterSQLite3DriverConfig extends DriverConfig<"better-sqlite3"> {
42
53
  readonly driverType = "better-sqlite3";
@@ -44,6 +55,7 @@ declare class BetterSQLite3DriverConfig extends DriverConfig<"better-sqlite3"> {
44
55
  readonly supportsReturning = true;
45
56
  readonly supportsJson = false;
46
57
  readonly internalIdColumn = "_internalId";
58
+ readonly outboxVersionstampStrategy = "insert-on-conflict-returning";
47
59
  extractAffectedRows(result: Record<string, unknown>): bigint;
48
60
  }
49
61
  declare class NodePostgresDriverConfig extends DriverConfig<"pg"> {
@@ -52,6 +64,7 @@ declare class NodePostgresDriverConfig extends DriverConfig<"pg"> {
52
64
  readonly supportsReturning = true;
53
65
  readonly supportsJson = true;
54
66
  readonly internalIdColumn = "_internalId";
67
+ readonly outboxVersionstampStrategy = "insert-on-conflict-returning";
55
68
  extractAffectedRows(result: Record<string, unknown>): bigint;
56
69
  }
57
70
  declare class PGLiteDriverConfig extends DriverConfig<"pglite"> {
@@ -60,6 +73,7 @@ declare class PGLiteDriverConfig extends DriverConfig<"pglite"> {
60
73
  readonly supportsReturning = true;
61
74
  readonly supportsJson = true;
62
75
  readonly internalIdColumn = "_internalId";
76
+ readonly outboxVersionstampStrategy = "insert-on-conflict-returning";
63
77
  extractAffectedRows(result: Record<string, unknown>): bigint;
64
78
  }
65
79
  declare class MySQL2DriverConfig extends DriverConfig<"mysql2"> {
@@ -68,7 +82,8 @@ declare class MySQL2DriverConfig extends DriverConfig<"mysql2"> {
68
82
  readonly supportsReturning = false;
69
83
  readonly supportsJson = true;
70
84
  readonly internalIdColumn: undefined;
85
+ readonly outboxVersionstampStrategy = "insert-on-duplicate-last-insert-id";
71
86
  }
72
87
  //#endregion
73
- export { BetterSQLite3DriverConfig, CloudflareDurableObjectsDriverConfig, DriverConfig, MySQL2DriverConfig, NodePostgresDriverConfig, PGLiteDriverConfig, SQLocalDriverConfig, SupportedDatabase, SupportedDriverType, supportedDatabases, supportedDriverTypes };
88
+ export { BetterSQLite3DriverConfig, CloudflareDurableObjectsDriverConfig, DriverConfig, MySQL2DriverConfig, NodePostgresDriverConfig, OutboxVersionstampStrategy, PGLiteDriverConfig, SQLocalDriverConfig, SupportedDatabase, SupportedDriverType, defaultNamingStrategyForDatabase, supportedDatabases, supportedDriverTypes };
74
89
  //# sourceMappingURL=driver-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"driver-config.d.ts","names":[],"sources":["../../../src/adapters/generic-sql/driver-config.ts"],"sourcesContent":[],"mappings":";cAAa;AAAA,KACD,iBAAA,GADgE,CAAA,OACpC,kBADoC,CAAA,CAAA,MAAA,CAAA;AAChE,cAEC,oBAF2B,EAAA,SAAA,CAAA,SAAkB,EAAA,4BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,CAAA;AAE7C,KASD,mBAAA,GAFF,CAAA,OAEgC,oBAFhC,CAAA,CAAA,MAAA,CAAA;AAEE,uBAEU,YAFoB,CAAA,UAEG,mBAFiB,GAEK,mBAFL,CAAA,CAAA;EAExC,kBAAY,UAAA,EACF,CADE;EAAW,kBAAA,YAAA,EAEX,iBAFW;EAAsB,kBAAA,iBAAA,EAAA,OAAA;EACnC,kBAAA,YAAA,EAAA,OAAA;EACE;;;AA0BlC;EAQa,kBAAA,gBAAA,EAAA,MAAqC,GAAA,SAAQ;EAQ7C,IAAA,oBAAA,CAAA,CAAA,EAA0B,OAAA;EAwB1B;AAgCb;AAuBA;;;;;;+BAlG+B;;cAGlB,mBAAA,SAA4B;;;;;;;cAQ5B,oCAAA,SAA6C;;;;;;;cAQ7C,yBAAA,SAAkC;;;;;;8BAOR;;cAiB1B,wBAAA,SAAiC;;;;;;8BAOP;;cAyB1B,kBAAA,SAA2B;;;;;;8BAOD;;cAgB1B,kBAAA,SAA2B"}
1
+ {"version":3,"file":"driver-config.d.ts","names":[],"sources":["../../../src/adapters/generic-sql/driver-config.ts"],"sourcesContent":[],"mappings":";;;cAMa;KACD,iBAAA,WAA4B;AAD3B,cAGA,oBAH+D,EAAA,SAAA,CAAA,SAAA,EAAA,4BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,CAAA;AAChE,KAWA,mBAAA,GAXiB,CAAA,OAWa,oBAXgB,CAAA,CAAA,MAAA,CAAA;AAE7C,uBAWS,YAJZ,CAAA,UAImC,mBAJnC,GAIyD,mBAJzD,CAAA,CAAA;EAEE,kBAAA,UAAmB,EAGC,CAHD;EAET,kBAAY,YAAA,EAEA,iBAFA;EAAW,kBAAA,iBAAA,EAAA,OAAA;EAAsB,kBAAA,YAAA,EAAA,OAAA;EACnC,kBAAA,0BAAA,EAKgB,0BALhB;EACE;;;;EA+BG,kBAAA,gBAAA,EAAA,MAAA,GAAA,SAAA;EAGxB;AAab;AAKA;EASa,IAAA,oBAAA,CAAA,CAAA,EAAA,OAAA;EASA,IAAA,qBAAA,CAAA,CAAA,EAnDkB,iBA2DQ;EAiB1B;AAiCb;AAwBA;;;;;;+BAzH+B;;cAGlB,iDACG,sBACb;KAWS,0BAAA;cAKC,mBAAA,SAA4B;;;;;;;;cAS5B,oCAAA,SAA6C;;;;;;;;cAS7C,yBAAA,SAAkC;;;;;;;8BAQR;;cAiB1B,wBAAA,SAAiC;;;;;;;8BAQP;;cAyB1B,kBAAA,SAA2B;;;;;;;8BAQD;;cAgB1B,kBAAA,SAA2B"}
@@ -1,3 +1,5 @@
1
+ import { schemaNamingStrategy, suffixNamingStrategy } from "../../naming/sql-naming.js";
2
+
1
3
  //#region src/adapters/generic-sql/driver-config.ts
2
4
  const supportedDatabases = [
3
5
  "sqlite",
@@ -13,9 +15,23 @@ const supportedDriverTypes = [
13
15
  "mysql2"
14
16
  ];
15
17
  var DriverConfig = class {
18
+ /**
19
+ * SQLite storage selection is handled by adapters, not driver config.
20
+ */
16
21
  get supportsRowsAffected() {
17
22
  return !!this.extractAffectedRows;
18
23
  }
24
+ get defaultNamingStrategy() {
25
+ return defaultNamingStrategyForDatabase(this.databaseType);
26
+ }
27
+ };
28
+ const defaultNamingStrategyForDatabase = (databaseType) => {
29
+ switch (databaseType) {
30
+ case "postgresql": return schemaNamingStrategy;
31
+ case "sqlite":
32
+ case "mysql":
33
+ default: return suffixNamingStrategy;
34
+ }
19
35
  };
20
36
  var SQLocalDriverConfig = class extends DriverConfig {
21
37
  driverType = "sqlocal";
@@ -23,6 +39,7 @@ var SQLocalDriverConfig = class extends DriverConfig {
23
39
  supportsReturning = true;
24
40
  supportsJson = false;
25
41
  internalIdColumn = "_internalId";
42
+ outboxVersionstampStrategy = "insert-on-conflict-returning";
26
43
  };
27
44
  var CloudflareDurableObjectsDriverConfig = class extends DriverConfig {
28
45
  driverType = "cloudflare_durable_objects";
@@ -30,6 +47,7 @@ var CloudflareDurableObjectsDriverConfig = class extends DriverConfig {
30
47
  supportsReturning = true;
31
48
  supportsJson = false;
32
49
  internalIdColumn = "_internalId";
50
+ outboxVersionstampStrategy = "insert-on-conflict-returning";
33
51
  };
34
52
  var BetterSQLite3DriverConfig = class extends DriverConfig {
35
53
  driverType = "better-sqlite3";
@@ -37,6 +55,7 @@ var BetterSQLite3DriverConfig = class extends DriverConfig {
37
55
  supportsReturning = true;
38
56
  supportsJson = false;
39
57
  internalIdColumn = "_internalId";
58
+ outboxVersionstampStrategy = "insert-on-conflict-returning";
40
59
  extractAffectedRows(result) {
41
60
  if ("numAffectedRows" in result) {
42
61
  const value = result["numAffectedRows"];
@@ -52,6 +71,7 @@ var NodePostgresDriverConfig = class extends DriverConfig {
52
71
  supportsReturning = true;
53
72
  supportsJson = true;
54
73
  internalIdColumn = "_internalId";
74
+ outboxVersionstampStrategy = "insert-on-conflict-returning";
55
75
  extractAffectedRows(result) {
56
76
  if ("numAffectedRows" in result) {
57
77
  const value = result["numAffectedRows"];
@@ -72,6 +92,7 @@ var PGLiteDriverConfig = class extends DriverConfig {
72
92
  supportsReturning = true;
73
93
  supportsJson = true;
74
94
  internalIdColumn = "_internalId";
95
+ outboxVersionstampStrategy = "insert-on-conflict-returning";
75
96
  extractAffectedRows(result) {
76
97
  if ("affectedRows" in result) {
77
98
  const value = result["affectedRows"];
@@ -87,8 +108,9 @@ var MySQL2DriverConfig = class extends DriverConfig {
87
108
  supportsReturning = false;
88
109
  supportsJson = true;
89
110
  internalIdColumn = void 0;
111
+ outboxVersionstampStrategy = "insert-on-duplicate-last-insert-id";
90
112
  };
91
113
 
92
114
  //#endregion
93
- export { BetterSQLite3DriverConfig, CloudflareDurableObjectsDriverConfig, DriverConfig, MySQL2DriverConfig, NodePostgresDriverConfig, PGLiteDriverConfig, SQLocalDriverConfig, supportedDatabases, supportedDriverTypes };
115
+ export { BetterSQLite3DriverConfig, CloudflareDurableObjectsDriverConfig, DriverConfig, MySQL2DriverConfig, NodePostgresDriverConfig, PGLiteDriverConfig, SQLocalDriverConfig, defaultNamingStrategyForDatabase, supportedDatabases, supportedDriverTypes };
94
116
  //# sourceMappingURL=driver-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"driver-config.js","names":[],"sources":["../../../src/adapters/generic-sql/driver-config.ts"],"sourcesContent":["export const supportedDatabases = [\"sqlite\", \"postgresql\", \"mysql\"] as const;\nexport type SupportedDatabase = (typeof supportedDatabases)[number];\n\nexport const supportedDriverTypes = [\n \"sqlocal\",\n \"cloudflare_durable_objects\",\n \"better-sqlite3\",\n \"pg\",\n \"pglite\",\n \"mysql2\",\n] as const;\n\nexport type SupportedDriverType = (typeof supportedDriverTypes)[number];\n\nexport abstract class DriverConfig<T extends SupportedDriverType = SupportedDriverType> {\n abstract readonly driverType: T;\n abstract readonly databaseType: SupportedDatabase;\n\n abstract readonly supportsReturning: boolean;\n abstract readonly supportsJson: boolean;\n\n /**\n * Column name for internal ID in RETURNING results.\n * Only defined if supportsReturning is true.\n */\n abstract readonly internalIdColumn: string | undefined;\n\n get supportsRowsAffected(): boolean {\n return !!this.extractAffectedRows;\n }\n\n /**\n * Extract the number of affected rows from a query result.\n * Only implemented for drivers that support affected rows reporting.\n *\n * @param result - The query result from the SQL driver\n * @returns The number of affected rows as bigint\n * @throws Error if affected rows information is not found in the result\n */\n extractAffectedRows?(result: Record<string, unknown>): bigint;\n}\n\nexport class SQLocalDriverConfig extends DriverConfig<\"sqlocal\"> {\n override readonly driverType = \"sqlocal\";\n override readonly databaseType = \"sqlite\";\n override readonly supportsReturning = true;\n override readonly supportsJson = false;\n override readonly internalIdColumn = \"_internalId\";\n}\n\nexport class CloudflareDurableObjectsDriverConfig extends DriverConfig<\"cloudflare_durable_objects\"> {\n override readonly driverType = \"cloudflare_durable_objects\";\n override readonly databaseType = \"sqlite\";\n override readonly supportsReturning = true;\n override readonly supportsJson = false;\n override readonly internalIdColumn = \"_internalId\";\n}\n\nexport class BetterSQLite3DriverConfig extends DriverConfig<\"better-sqlite3\"> {\n override readonly driverType = \"better-sqlite3\";\n override readonly databaseType = \"sqlite\";\n override readonly supportsReturning = true;\n override readonly supportsJson = false;\n override readonly internalIdColumn = \"_internalId\";\n\n override extractAffectedRows(result: Record<string, unknown>): bigint {\n if (\"numAffectedRows\" in result) {\n const value = result[\"numAffectedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n\n throw new Error(\n `No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`,\n );\n }\n}\n\nexport class NodePostgresDriverConfig extends DriverConfig<\"pg\"> {\n override readonly driverType = \"pg\";\n override readonly databaseType = \"postgresql\";\n override readonly supportsReturning = true;\n override readonly supportsJson = true;\n override readonly internalIdColumn = \"_internalId\";\n\n override extractAffectedRows(result: Record<string, unknown>): bigint {\n if (\"numAffectedRows\" in result) {\n const value = result[\"numAffectedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n if (\"numChangedRows\" in result) {\n const value = result[\"numChangedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n throw new Error(\n `No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`,\n );\n }\n}\n\nexport class PGLiteDriverConfig extends DriverConfig<\"pglite\"> {\n override readonly driverType = \"pglite\";\n override readonly databaseType = \"postgresql\";\n override readonly supportsReturning = true;\n override readonly supportsJson = true;\n override readonly internalIdColumn = \"_internalId\";\n\n override extractAffectedRows(result: Record<string, unknown>): bigint {\n if (\"affectedRows\" in result) {\n const value = result[\"affectedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n throw new Error(\n `No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`,\n );\n }\n}\n\nexport class MySQL2DriverConfig extends DriverConfig<\"mysql2\"> {\n override readonly driverType = \"mysql2\";\n override readonly databaseType = \"mysql\";\n override readonly supportsReturning = false;\n override readonly supportsJson = true;\n override readonly internalIdColumn = undefined;\n}\n"],"mappings":";AAAA,MAAa,qBAAqB;CAAC;CAAU;CAAc;CAAQ;AAGnE,MAAa,uBAAuB;CAClC;CACA;CACA;CACA;CACA;CACA;CACD;AAID,IAAsB,eAAtB,MAAwF;CAatF,IAAI,uBAAgC;AAClC,SAAO,CAAC,CAAC,KAAK;;;AAclB,IAAa,sBAAb,cAAyC,aAAwB;CAC/D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;;AAGvC,IAAa,uCAAb,cAA0D,aAA2C;CACnG,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;;AAGvC,IAAa,4BAAb,cAA+C,aAA+B;CAC5E,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CAErC,AAAS,oBAAoB,QAAyC;AACpE,MAAI,qBAAqB,QAAQ;GAC/B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAIxB,QAAM,IAAI,MACR,qCAAqC,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,WAAW,wCACxF;;;AAIL,IAAa,2BAAb,cAA8C,aAAmB;CAC/D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CAErC,AAAS,oBAAoB,QAAyC;AACpE,MAAI,qBAAqB,QAAQ;GAC/B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAGxB,MAAI,oBAAoB,QAAQ;GAC9B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAGxB,QAAM,IAAI,MACR,qCAAqC,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,WAAW,wCACxF;;;AAIL,IAAa,qBAAb,cAAwC,aAAuB;CAC7D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CAErC,AAAS,oBAAoB,QAAyC;AACpE,MAAI,kBAAkB,QAAQ;GAC5B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAGxB,QAAM,IAAI,MACR,qCAAqC,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,WAAW,wCACxF;;;AAIL,IAAa,qBAAb,cAAwC,aAAuB;CAC7D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB"}
1
+ {"version":3,"file":"driver-config.js","names":[],"sources":["../../../src/adapters/generic-sql/driver-config.ts"],"sourcesContent":["import {\n schemaNamingStrategy,\n suffixNamingStrategy,\n type SqlNamingStrategy,\n} from \"../../naming/sql-naming\";\n\nexport const supportedDatabases = [\"sqlite\", \"postgresql\", \"mysql\"] as const;\nexport type SupportedDatabase = (typeof supportedDatabases)[number];\n\nexport const supportedDriverTypes = [\n \"sqlocal\",\n \"cloudflare_durable_objects\",\n \"better-sqlite3\",\n \"pg\",\n \"pglite\",\n \"mysql2\",\n] as const;\n\nexport type SupportedDriverType = (typeof supportedDriverTypes)[number];\n\nexport abstract class DriverConfig<T extends SupportedDriverType = SupportedDriverType> {\n abstract readonly driverType: T;\n abstract readonly databaseType: SupportedDatabase;\n\n abstract readonly supportsReturning: boolean;\n abstract readonly supportsJson: boolean;\n abstract readonly outboxVersionstampStrategy: OutboxVersionstampStrategy;\n\n /**\n * Column name for internal ID in RETURNING results.\n * Only defined if supportsReturning is true.\n */\n abstract readonly internalIdColumn: string | undefined;\n\n /**\n * SQLite storage selection is handled by adapters, not driver config.\n */\n get supportsRowsAffected(): boolean {\n return !!this.extractAffectedRows;\n }\n\n get defaultNamingStrategy(): SqlNamingStrategy {\n return defaultNamingStrategyForDatabase(this.databaseType);\n }\n\n /**\n * Extract the number of affected rows from a query result.\n * Only implemented for drivers that support affected rows reporting.\n *\n * @param result - The query result from the SQL driver\n * @returns The number of affected rows as bigint\n * @throws Error if affected rows information is not found in the result\n */\n extractAffectedRows?(result: Record<string, unknown>): bigint;\n}\n\nexport const defaultNamingStrategyForDatabase = (\n databaseType: SupportedDatabase,\n): SqlNamingStrategy => {\n switch (databaseType) {\n case \"postgresql\":\n return schemaNamingStrategy;\n case \"sqlite\":\n case \"mysql\":\n default:\n return suffixNamingStrategy;\n }\n};\n\nexport type OutboxVersionstampStrategy =\n | \"update-returning\"\n | \"insert-on-conflict-returning\"\n | \"insert-on-duplicate-last-insert-id\";\n\nexport class SQLocalDriverConfig extends DriverConfig<\"sqlocal\"> {\n override readonly driverType = \"sqlocal\";\n override readonly databaseType = \"sqlite\";\n override readonly supportsReturning = true;\n override readonly supportsJson = false;\n override readonly internalIdColumn = \"_internalId\";\n override readonly outboxVersionstampStrategy = \"insert-on-conflict-returning\";\n}\n\nexport class CloudflareDurableObjectsDriverConfig extends DriverConfig<\"cloudflare_durable_objects\"> {\n override readonly driverType = \"cloudflare_durable_objects\";\n override readonly databaseType = \"sqlite\";\n override readonly supportsReturning = true;\n override readonly supportsJson = false;\n override readonly internalIdColumn = \"_internalId\";\n override readonly outboxVersionstampStrategy = \"insert-on-conflict-returning\";\n}\n\nexport class BetterSQLite3DriverConfig extends DriverConfig<\"better-sqlite3\"> {\n override readonly driverType = \"better-sqlite3\";\n override readonly databaseType = \"sqlite\";\n override readonly supportsReturning = true;\n override readonly supportsJson = false;\n override readonly internalIdColumn = \"_internalId\";\n override readonly outboxVersionstampStrategy = \"insert-on-conflict-returning\";\n\n override extractAffectedRows(result: Record<string, unknown>): bigint {\n if (\"numAffectedRows\" in result) {\n const value = result[\"numAffectedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n\n throw new Error(\n `No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`,\n );\n }\n}\n\nexport class NodePostgresDriverConfig extends DriverConfig<\"pg\"> {\n override readonly driverType = \"pg\";\n override readonly databaseType = \"postgresql\";\n override readonly supportsReturning = true;\n override readonly supportsJson = true;\n override readonly internalIdColumn = \"_internalId\";\n override readonly outboxVersionstampStrategy = \"insert-on-conflict-returning\";\n\n override extractAffectedRows(result: Record<string, unknown>): bigint {\n if (\"numAffectedRows\" in result) {\n const value = result[\"numAffectedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n if (\"numChangedRows\" in result) {\n const value = result[\"numChangedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n throw new Error(\n `No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`,\n );\n }\n}\n\nexport class PGLiteDriverConfig extends DriverConfig<\"pglite\"> {\n override readonly driverType = \"pglite\";\n override readonly databaseType = \"postgresql\";\n override readonly supportsReturning = true;\n override readonly supportsJson = true;\n override readonly internalIdColumn = \"_internalId\";\n override readonly outboxVersionstampStrategy = \"insert-on-conflict-returning\";\n\n override extractAffectedRows(result: Record<string, unknown>): bigint {\n if (\"affectedRows\" in result) {\n const value = result[\"affectedRows\"];\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"number\") {\n return BigInt(value);\n }\n }\n throw new Error(\n `No affected rows found in result: ${JSON.stringify(result)}. Driver ${this.driverType} is expected to support affected rows.`,\n );\n }\n}\n\nexport class MySQL2DriverConfig extends DriverConfig<\"mysql2\"> {\n override readonly driverType = \"mysql2\";\n override readonly databaseType = \"mysql\";\n override readonly supportsReturning = false;\n override readonly supportsJson = true;\n override readonly internalIdColumn = undefined;\n override readonly outboxVersionstampStrategy = \"insert-on-duplicate-last-insert-id\";\n}\n"],"mappings":";;;AAMA,MAAa,qBAAqB;CAAC;CAAU;CAAc;CAAQ;AAGnE,MAAa,uBAAuB;CAClC;CACA;CACA;CACA;CACA;CACA;CACD;AAID,IAAsB,eAAtB,MAAwF;;;;CAiBtF,IAAI,uBAAgC;AAClC,SAAO,CAAC,CAAC,KAAK;;CAGhB,IAAI,wBAA2C;AAC7C,SAAO,iCAAiC,KAAK,aAAa;;;AAc9D,MAAa,oCACX,iBACsB;AACtB,SAAQ,cAAR;EACE,KAAK,aACH,QAAO;EACT,KAAK;EACL,KAAK;EACL,QACE,QAAO;;;AASb,IAAa,sBAAb,cAAyC,aAAwB;CAC/D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CACrC,AAAkB,6BAA6B;;AAGjD,IAAa,uCAAb,cAA0D,aAA2C;CACnG,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CACrC,AAAkB,6BAA6B;;AAGjD,IAAa,4BAAb,cAA+C,aAA+B;CAC5E,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CACrC,AAAkB,6BAA6B;CAE/C,AAAS,oBAAoB,QAAyC;AACpE,MAAI,qBAAqB,QAAQ;GAC/B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAIxB,QAAM,IAAI,MACR,qCAAqC,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,WAAW,wCACxF;;;AAIL,IAAa,2BAAb,cAA8C,aAAmB;CAC/D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CACrC,AAAkB,6BAA6B;CAE/C,AAAS,oBAAoB,QAAyC;AACpE,MAAI,qBAAqB,QAAQ;GAC/B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAGxB,MAAI,oBAAoB,QAAQ;GAC9B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAGxB,QAAM,IAAI,MACR,qCAAqC,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,WAAW,wCACxF;;;AAIL,IAAa,qBAAb,cAAwC,aAAuB;CAC7D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CACrC,AAAkB,6BAA6B;CAE/C,AAAS,oBAAoB,QAAyC;AACpE,MAAI,kBAAkB,QAAQ;GAC5B,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,UAAU,SACnB,QAAO;AAET,OAAI,OAAO,UAAU,SACnB,QAAO,OAAO,MAAM;;AAGxB,QAAM,IAAI,MACR,qCAAqC,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,WAAW,wCACxF;;;AAIL,IAAa,qBAAb,cAAwC,aAAuB;CAC7D,AAAkB,aAAa;CAC/B,AAAkB,eAAe;CACjC,AAAkB,oBAAoB;CACtC,AAAkB,eAAe;CACjC,AAAkB,mBAAmB;CACrC,AAAkB,6BAA6B"}
@@ -1,43 +1,61 @@
1
1
  import { AnySchema } from "../../schema/create.js";
2
+ import { SqlNamingStrategy } from "../../naming/sql-naming.js";
2
3
  import { DriverConfig } from "./driver-config.js";
4
+ import { SQLiteStorageMode, sqliteStorageDefault, sqliteStoragePrisma } from "./sqlite-storage.js";
5
+ import { OutboxConfig } from "../../outbox/outbox.js";
6
+ import { UOWInstrumentation } from "../../query/unit-of-work/unit-of-work.js";
3
7
  import { SimpleQueryInterface } from "../../query/simple-query-interface.js";
4
8
  import { CompiledQuery, Dialect } from "../../sql-driver/sql-driver.js";
5
9
  import { SqlDriverAdapter } from "../../sql-driver/sql-driver-adapter.js";
6
10
  import { PreparedMigrations } from "./migration/prepared-migrations.js";
7
- import { DatabaseAdapter, DatabaseContextStorage, TableNameMapper, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
11
+ import { DatabaseAdapter, DatabaseAdapterMetadata, DatabaseContextStorage, SQLiteProfile, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
8
12
  import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
9
13
 
10
14
  //#region src/adapters/generic-sql/generic-sql-adapter.d.ts
11
15
  interface UnitOfWorkConfig {
12
16
  onQuery?: (query: CompiledQuery) => void;
13
17
  dryRun?: boolean;
18
+ instrumentation?: UOWInstrumentation;
14
19
  }
15
- interface GenericSQLOptions {
20
+ interface SqlAdapterOptions {
16
21
  dialect: Dialect;
17
22
  driverConfig: DriverConfig;
18
23
  uowConfig?: UnitOfWorkConfig;
24
+ outbox?: OutboxConfig;
25
+ sqliteProfile?: SQLiteProfile;
26
+ sqliteStorageMode?: SQLiteStorageMode;
27
+ namingStrategy?: SqlNamingStrategy;
19
28
  }
20
- declare class GenericSQLAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
29
+ declare const sqliteProfiles: Record<SQLiteProfile, SQLiteStorageMode>;
30
+ declare class SqlAdapter implements DatabaseAdapter<UnitOfWorkConfig> {
21
31
  #private;
22
32
  readonly dialect: Dialect;
23
33
  readonly driverConfig: DriverConfig;
24
34
  readonly uowConfig?: UnitOfWorkConfig;
35
+ readonly outbox?: OutboxConfig;
36
+ readonly sqliteStorageMode?: SQLiteStorageMode;
37
+ readonly sqliteProfile?: SQLiteProfile;
38
+ readonly adapterMetadata: DatabaseAdapterMetadata;
39
+ readonly namingStrategy: SqlNamingStrategy;
25
40
  constructor({
26
41
  dialect,
27
42
  driverConfig,
28
- uowConfig
29
- }: GenericSQLOptions);
43
+ uowConfig,
44
+ outbox,
45
+ sqliteProfile,
46
+ sqliteStorageMode,
47
+ namingStrategy
48
+ }: SqlAdapterOptions);
30
49
  get driver(): SqlDriverAdapter;
31
50
  get [fragnoDatabaseAdapterNameFakeSymbol](): string;
32
51
  get [fragnoDatabaseAdapterVersionFakeSymbol](): number;
33
52
  get contextStorage(): RequestContextStorage<DatabaseContextStorage>;
34
53
  close(): Promise<void>;
35
54
  isConnectionHealthy(): Promise<boolean>;
36
- prepareMigrations<T extends AnySchema>(schema: T, namespace: string): PreparedMigrations;
37
- createTableNameMapper(namespace: string): TableNameMapper;
55
+ prepareMigrations<T extends AnySchema>(schema: T, namespace: string | null): PreparedMigrations;
38
56
  getSchemaVersion(namespace: string): Promise<string | undefined>;
39
- createQueryEngine<T extends AnySchema>(schema: T, namespace: string): SimpleQueryInterface<T, UnitOfWorkConfig>;
57
+ createQueryEngine<T extends AnySchema>(schema: T, namespace: string | null): SimpleQueryInterface<T, UnitOfWorkConfig>;
40
58
  }
41
59
  //#endregion
42
- export { GenericSQLAdapter, GenericSQLOptions, UnitOfWorkConfig };
60
+ export { SqlAdapter, SqlAdapterOptions, UnitOfWorkConfig, sqliteProfiles };
43
61
  //# sourceMappingURL=generic-sql-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generic-sql-adapter.d.ts","names":[],"sources":["../../../src/adapters/generic-sql/generic-sql-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAyBiB,gBAAA;oBACG;EADH,MAAA,CAAA,EAAA,OAAA;AAKjB;AACW,UADM,iBAAA,CACN;EACK,OAAA,EADL,OACK;EACF,YAAA,EADE,YACF;EAAgB,SAAA,CAAA,EAAhB,gBAAgB;AAG9B;AAA0D,cAA7C,iBAAA,YAA6B,eAAgB,CAAA,gBAAA,CAAA,CAAA;EACtC,CAAA,OAAA;EACK,SAAA,OAAA,EADL,OACK;EACF,SAAA,YAAA,EADE,YACF;EAOP,SAAA,SAAA,CAAA,EAPO,gBAOP;EAAS,WAAA,CAAA;IAAA,OAAA;IAAA,YAAA;IAAA;EAAA,CAAA,EAA2B,iBAA3B;EAAc,IAAA,MAAA,CAAA,CAAA,EAWvB,gBAXuB;EAAa,KAe7C,mCAAA,GAf6C,EAAA,MAAA;EAWpC,KAQT,sCAAA,GARS,EAAA,MAAA;EAIT,IAAA,cAAA,CAAA,CAAA,EAQiB,qBARjB,CAQuC,sBARvC,CAAA;EAIA,KAAA,CAAA,CAAA,EAQI,OARJ,CAAA,IAAA,CAAA;EAIuC,mBAAA,CAAA,CAAA,EAQf,OARe,CAAA,OAAA,CAAA;EAAtB,iBAAA,CAAA,UAaM,SAbN,CAAA,CAAA,MAAA,EAayB,CAbzB,EAAA,SAAA,EAAA,MAAA,CAAA,EAagD,kBAbhD;EAIb,qBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAmBiC,eAnBjC;EAIoB,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAmBc,OAnBd,CAAA,MAAA,GAAA,SAAA,CAAA;EAKD,iBAAA,CAAA,UA2CA,SA3CA,CAAA,CAAA,MAAA,EA4ClB,CA5CkB,EAAA,SAAA,EAAA,MAAA,CAAA,EA8CzB,oBA9CyB,CA8CJ,CA9CI,EA8CD,gBA9CC,CAAA"}
1
+ {"version":3,"file":"generic-sql-adapter.d.ts","names":[],"sources":["../../../src/adapters/generic-sql/generic-sql-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;UAmCiB,gBAAA;oBACG;EADH,MAAA,CAAA,EAAA,OAAA;EAMA,eAAA,CAAA,EAHG,kBAGc;;AAElB,UAFC,iBAAA,CAED;EACF,OAAA,EAFH,OAEG;EACH,YAAA,EAFK,YAEL;EACO,SAAA,CAAA,EAFJ,gBAEI;EACI,MAAA,CAAA,EAFX,YAEW;EACH,aAAA,CAAA,EAFD,aAEC;EAAiB,iBAAA,CAAA,EADd,iBACc;EAGvB,cAAA,CAAA,EAHM,iBAMlB;;AAHkD,cAAtC,cAAsC,EAAtB,MAAsB,CAAf,aAAe,EAAA,iBAAA,CAAA;AAAtB,cAKhB,UAAA,YAAsB,eALN,CAKsB,gBALtB,CAAA,CAAA;EAAM,CAAA,OAAA;EAKtB,SAAA,OAAW,EACJ,OADI;EAA2B,SAAA,YAAA,EAE1B,YAF0B;EAC/B,SAAA,SAAA,CAAA,EAEG,gBAFH;EACK,SAAA,MAAA,CAAA,EAEL,YAFK;EACF,SAAA,iBAAA,CAAA,EAEQ,iBAFR;EACH,SAAA,aAAA,CAAA,EAEO,aAFP;EACW,SAAA,eAAA,EAEH,uBAFG;EACJ,SAAA,cAAA,EAEA,iBAFA;EACC,WAAA,CAAA;IAAA,OAAA;IAAA,YAAA;IAAA,SAAA;IAAA,MAAA;IAAA,aAAA;IAAA,iBAAA;IAAA;EAAA,CAAA,EAgBvB,iBAhBuB;EACD,IAAA,MAAA,CAAA,CAAA,EA8CX,gBA9CW;EAQvB,KA0CG,mCAAA,GA1CH,EAAA,MAAA;EACA,KA6CG,sCAAA,GA7CH,EAAA,MAAA;EACA,IAAA,cAAA,CAAA,CAAA,EAgDoB,qBAhDpB,CAgD0C,sBAhD1C,CAAA;EACA,KAAA,CAAA,CAAA,EAmDO,OAnDP,CAAA,IAAA,CAAA;EACA,mBAAA,CAAA,CAAA,EAsD2B,OAtD3B,CAAA,OAAA,CAAA;EACA,iBAAA,CAAA,UA2D0B,SA3D1B,CAAA,CAAA,MAAA,EA2D6C,CA3D7C,EAAA,SAAA,EAAA,MAAA,GAAA,IAAA,CAAA,EA2D2E,kBA3D3E;EACA,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAuEyC,OAvEzC,CAAA,MAAA,GAAA,SAAA,CAAA;EACC,iBAAA,CAAA,UAmGyB,SAnGzB,CAAA,CAAA,MAAA,EAoGO,CApGP,EAAA,SAAA,EAAA,MAAA,GAAA,IAAA,CAAA,EAsGA,oBAtGA,CAsGqB,CAtGrB,EAsGwB,gBAtGxB,CAAA"}
@@ -1,8 +1,10 @@
1
1
  import { RequestContextStorage } from "../../packages/fragno/dist/api/request-context-storage.js";
2
2
  import { fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
3
- import { createTableNameMapper } from "../shared/table-name-mapper.js";
4
3
  import { SqlDriverAdapter } from "../../sql-driver/sql-driver-adapter.js";
5
4
  import { sql } from "../../sql-driver/sql.js";
5
+ import { sqliteStorageDefault, sqliteStoragePrisma } from "./sqlite-storage.js";
6
+ import { createSQLSerializer } from "../../query/serialize/create-sql-serializer.js";
7
+ import { createNamingResolver } from "../../naming/sql-naming.js";
6
8
  import { createExecutor } from "./generic-sql-uow-executor.js";
7
9
  import { UnitOfWorkDecoder } from "./uow-decoder.js";
8
10
  import { createPreparedMigrations } from "./migration/prepared-migrations.js";
@@ -11,17 +13,37 @@ import { GenericSQLUOWOperationCompiler } from "./query/generic-sql-uow-operatio
11
13
  import { fromUnitOfWorkCompiler } from "../shared/from-unit-of-work-compiler.js";
12
14
 
13
15
  //#region src/adapters/generic-sql/generic-sql-adapter.ts
14
- var GenericSQLAdapter = class {
16
+ const sqliteProfiles = {
17
+ default: sqliteStorageDefault,
18
+ prisma: sqliteStoragePrisma
19
+ };
20
+ var SqlAdapter = class {
15
21
  dialect;
16
22
  driverConfig;
17
23
  uowConfig;
24
+ outbox;
25
+ sqliteStorageMode;
26
+ sqliteProfile;
27
+ adapterMetadata;
28
+ namingStrategy;
18
29
  #schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
19
30
  #contextStorage;
20
31
  #driver;
21
- constructor({ dialect, driverConfig, uowConfig }) {
32
+ constructor({ dialect, driverConfig, uowConfig, outbox, sqliteProfile, sqliteStorageMode, namingStrategy }) {
22
33
  this.dialect = dialect;
23
34
  this.driverConfig = driverConfig;
24
35
  this.uowConfig = uowConfig;
36
+ this.outbox = outbox;
37
+ this.namingStrategy = namingStrategy ?? driverConfig.defaultNamingStrategy;
38
+ const resolvedProfile = sqliteProfile ?? "default";
39
+ if (sqliteStorageMode && sqliteProfile) throw new Error("sqliteStorageMode cannot be used together with sqliteProfile.");
40
+ this.sqliteStorageMode = driverConfig.databaseType === "sqlite" ? sqliteStorageMode ?? sqliteProfiles[resolvedProfile] : void 0;
41
+ this.sqliteProfile = driverConfig.databaseType === "sqlite" && !sqliteStorageMode ? resolvedProfile : void 0;
42
+ this.adapterMetadata = {
43
+ databaseType: driverConfig.databaseType,
44
+ sqliteProfile: this.sqliteProfile,
45
+ sqliteStorageMode: this.sqliteStorageMode
46
+ };
25
47
  this.#schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
26
48
  this.#contextStorage = new RequestContextStorage();
27
49
  this.#driver = new SqlDriverAdapter(dialect);
@@ -30,10 +52,10 @@ var GenericSQLAdapter = class {
30
52
  return this.#driver;
31
53
  }
32
54
  get [fragnoDatabaseAdapterNameFakeSymbol]() {
33
- return "generic-sql";
55
+ return "sql";
34
56
  }
35
57
  get [fragnoDatabaseAdapterVersionFakeSymbol]() {
36
- return 0;
58
+ return 1;
37
59
  }
38
60
  get contextStorage() {
39
61
  return this.#contextStorage;
@@ -42,20 +64,21 @@ var GenericSQLAdapter = class {
42
64
  return this.#driver.destroy();
43
65
  }
44
66
  async isConnectionHealthy() {
45
- return (await this.#driver.executeQuery(sql`SELECT 1 as healthy`.compile(this.dialect))).rows[0]["healthy"] === 1;
67
+ const healthyValue = (await this.#driver.executeQuery(sql`SELECT 1 as healthy`.compile(this.dialect))).rows[0]?.["healthy"];
68
+ return healthyValue === 1 || healthyValue === 1n || healthyValue === "1";
46
69
  }
47
70
  prepareMigrations(schema, namespace) {
71
+ const resolver = createNamingResolver(schema, namespace, this.namingStrategy);
48
72
  return createPreparedMigrations({
49
73
  schema,
50
- namespace,
74
+ namespace: namespace ?? schema.name,
51
75
  database: this.driverConfig.databaseType,
52
- mapper: namespace ? this.createTableNameMapper(namespace) : void 0,
76
+ driverConfig: this.driverConfig,
77
+ sqliteStorageMode: this.sqliteStorageMode,
78
+ resolver,
53
79
  driver: this.#driver
54
80
  });
55
81
  }
56
- createTableNameMapper(namespace) {
57
- return createTableNameMapper(namespace, false);
58
- }
59
82
  async getSchemaVersion(namespace) {
60
83
  const query = sql`SELECT value FROM fragno_db_settings WHERE key = ${`${namespace}.schema_version`};`.compile(this.dialect);
61
84
  let result;
@@ -72,16 +95,32 @@ var GenericSQLAdapter = class {
72
95
  }
73
96
  createQueryEngine(schema, namespace) {
74
97
  this.#schemaNamespaceMap.set(schema, namespace);
75
- return fromUnitOfWorkCompiler(schema, {
76
- compiler: createUOWCompilerFromOperationCompiler(new GenericSQLUOWOperationCompiler(this.driverConfig, (ns) => ns ? this.createTableNameMapper(ns) : void 0)),
77
- executor: createExecutor(this.#driver, this.driverConfig, false),
78
- decoder: new UnitOfWorkDecoder(this.driverConfig),
98
+ const resolver = createNamingResolver(schema, namespace, this.namingStrategy);
99
+ const queryEngine = fromUnitOfWorkCompiler(schema, {
100
+ compiler: createUOWCompilerFromOperationCompiler(new GenericSQLUOWOperationCompiler(this.driverConfig, this.sqliteStorageMode, (schemaForResolver, namespaceForResolver) => createNamingResolver(schemaForResolver, namespaceForResolver, this.namingStrategy))),
101
+ executor: createExecutor(this.#driver, this.driverConfig, {
102
+ dialect: this.dialect,
103
+ dryRun: false,
104
+ outbox: this.outbox,
105
+ namingStrategy: this.namingStrategy
106
+ }),
107
+ decoder: new UnitOfWorkDecoder(this.driverConfig, this.sqliteStorageMode, resolver),
79
108
  uowConfig: this.uowConfig,
80
109
  schemaNamespaceMap: this.#schemaNamespaceMap
81
110
  });
111
+ const serializer = createSQLSerializer(this.driverConfig, this.sqliteStorageMode);
112
+ const timestampColumn = { type: "timestamp" };
113
+ return {
114
+ ...queryEngine,
115
+ now: async () => {
116
+ const rawValue = (await this.#driver.executeQuery(sql`SELECT CURRENT_TIMESTAMP as now`.compile(this.dialect))).rows[0]?.["now"];
117
+ if (rawValue === void 0 || rawValue === null) throw new Error("Failed to fetch database time");
118
+ return serializer.deserialize(rawValue, timestampColumn);
119
+ }
120
+ };
82
121
  }
83
122
  };
84
123
 
85
124
  //#endregion
86
- export { GenericSQLAdapter };
125
+ export { SqlAdapter, sqliteProfiles };
87
126
  //# sourceMappingURL=generic-sql-adapter.js.map