@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
@@ -1 +1 @@
1
- {"version":3,"file":"from-unit-of-work-compiler.js","names":["#indexName","#condition","#setValues"],"sources":["../../../src/adapters/shared/from-unit-of-work-compiler.ts"],"sourcesContent":["import type { SimpleQueryInterface, TableToUpdateValues } from \"../../query/simple-query-interface\";\nimport type { AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport type {\n CompiledMutation,\n UOWCompiler,\n UOWDecoder,\n UOWExecutor,\n ValidIndexName,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport { UnitOfWork } from \"../../query/unit-of-work/unit-of-work\";\nimport type { CursorResult } from \"../../query/cursor\";\nimport type { CompiledQuery } from \"../../sql-driver/sql-driver\";\n\n/**\n * Configuration options for creating a Unit of Work with generic SQL\n */\nexport interface UnitOfWorkConfig {\n /**\n * Optional callback to receive compiled SQL queries for logging/debugging\n * This callback is invoked for each query as it's compiled\n */\n onQuery?: (query: CompiledQuery) => void;\n /**\n * If true, the query will not be executed and the query will be returned. Not respected for UOWs\n * since those have to be manually executed.\n */\n dryRun?: boolean;\n}\n\n/**\n * Factory interface for creating Unit of Work instances\n */\nexport interface UnitOfWorkFactory {\n /**\n * UOW compiler for compiling operations to SQL\n */\n compiler: UOWCompiler<CompiledQuery>;\n /**\n * UOW executor for running compiled queries\n */\n executor: UOWExecutor<CompiledQuery, unknown>;\n /**\n * UOW decoder for transforming raw results\n */\n decoder: UOWDecoder<unknown>;\n /**\n * Optional UOW configuration\n */\n uowConfig?: UnitOfWorkConfig;\n /**\n * Optional WeakMap for schema-to-namespace lookups\n */\n schemaNamespaceMap?: WeakMap<AnySchema, string>;\n}\n\n/**\n * Type guard to check if a query is a CompiledMutation\n */\nfunction isCompiledMutation(query: unknown): query is CompiledMutation<CompiledQuery> {\n return (\n query !== null &&\n typeof query === \"object\" &&\n \"expectedAffectedRows\" in query &&\n \"query\" in query\n );\n}\n\n/**\n * Type guard to check if a record has an id field\n */\nfunction hasIdField(record: unknown): record is { id: string | FragnoId } {\n return record !== null && typeof record === \"object\" && \"id\" in record;\n}\n\nclass UpdateManySpecialBuilder<TTable extends AnyTable> {\n #indexName?: ValidIndexName<TTable>;\n #condition?: unknown;\n #setValues?: TableToUpdateValues<TTable>;\n\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: unknown,\n ): this {\n this.#indexName = indexName;\n this.#condition = condition;\n return this;\n }\n\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n getConfig() {\n return {\n indexName: this.#indexName,\n condition: this.#condition,\n setValues: this.#setValues,\n };\n }\n}\n\n/**\n * Creates a generic SQL-based query engine for the given schema using a UnitOfWorkFactory.\n *\n * This is the main entry point for creating a database query interface using a Unit of Work compiler.\n * It uses a compiler-based architecture where queries are compiled to SQL and then executed,\n * enabling features like SQL snapshot testing.\n *\n * @param schema - The database schema definition\n * @param factory - Factory containing compiler, executor, decoder, and optional configuration\n * @returns An SimpleQueryInterface instance for performing database operations\n *\n * @example\n * ```ts\n * const operationCompiler = new GenericSQLUOWOperationCompiler(driverConfig);\n * const factory: UnitOfWorkFactory = {\n * compiler: createUOWCompilerFromOperationCompiler(operationCompiler),\n * executor: createExecutor(sqlDriver),\n * decoder: createKyselyUOWDecoder(driverConfig.databaseType),\n * };\n * const queryEngine = fromUnitOfWorkCompiler(mySchema, factory);\n *\n * const users = await queryEngine.find('users', (b) =>\n * b.whereIndex('age').where((eb) => eb('age', '>', 18))\n * );\n * ```\n */\nexport function fromUnitOfWorkCompiler<T extends AnySchema>(\n schema: T,\n factory: UnitOfWorkFactory,\n): SimpleQueryInterface<T, UnitOfWorkConfig> {\n const { compiler, executor, decoder, uowConfig, schemaNamespaceMap } = factory;\n\n function createUOW(opts: { name?: string; config?: UnitOfWorkConfig }) {\n const { onQuery, ...restUowConfig } = opts.config ?? {};\n\n return new UnitOfWork(\n compiler,\n executor,\n decoder,\n opts.name,\n {\n ...restUowConfig,\n onQuery: onQuery\n ? (query) => {\n // Extract the actual query from CompiledMutation if needed\n const actualQuery = isCompiledMutation(query)\n ? query.query\n : (query as CompiledQuery);\n onQuery(actualQuery);\n }\n : undefined,\n },\n schemaNamespaceMap,\n ).forSchema(schema);\n }\n\n return {\n async find(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.find(tableName, builderFn);\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result ?? [];\n },\n\n async findWithCursor(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn);\n const [result] = await uow.executeRetrieve();\n // Result from findWithCursor is always a CursorResult - the UOW decoder handles the conversion\n return result as CursorResult<unknown>;\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n if (builderFn) {\n uow.find(tableName, (b) => {\n builderFn(b);\n return b.pageSize(1);\n });\n } else {\n uow.find(tableName, (b) => b.whereIndex(\"primary\").pageSize(1));\n }\n // executeRetrieve runs an array of `find` operation results, which each return an array of rows\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result?.[0] ?? null;\n },\n\n async create(tableName, values) {\n const uow = createUOW({ config: uowConfig });\n uow.create(tableName, values);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create record\");\n }\n\n const createdIds = uow.getCreatedIds();\n const createdId = createdIds[0];\n if (!createdId) {\n throw new Error(\"Failed to get created ID\");\n }\n return createdId;\n },\n\n async createMany(tableName, valuesArray) {\n const uow = createUOW({ config: uowConfig });\n for (const values of valuesArray) {\n uow.create(tableName, values);\n }\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create records\");\n }\n\n return uow.getCreatedIds();\n },\n\n async update(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.update(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update record (version conflict or record not found)\");\n }\n },\n\n async updateMany(tableName, builderFn) {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const specialBuilder = new UpdateManySpecialBuilder<typeof table>();\n builderFn(specialBuilder);\n\n const { indexName, condition, setValues } = specialBuilder.getConfig();\n\n if (!indexName) {\n throw new Error(\"whereIndex() must be called in updateMany\");\n }\n if (!setValues) {\n throw new Error(\"set() must be called in updateMany\");\n }\n\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, (b) => {\n // Condition might be null or undefined, only pass if defined and not null\n if (condition !== undefined && condition !== null) {\n // TypeScript can't infer the complex condition type from the builder\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return b.whereIndex(indexName, condition as any);\n }\n return b.whereIndex(indexName);\n });\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW({ config: uowConfig });\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n updateUow.update(tableName, record.id, (b) => b.set(setValues));\n }\n const { success } = await updateUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update records (version conflict)\");\n }\n },\n\n async delete(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.delete(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete record (version conflict or record not found)\");\n }\n },\n\n async deleteMany(tableName, builderFn) {\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, builderFn);\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW({ config: uowConfig });\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n deleteUow.delete(tableName, record.id);\n }\n const { success } = await deleteUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete records (version conflict)\");\n }\n },\n\n createUnitOfWork(name, nestedUowConfig) {\n return createUOW({\n name,\n config: {\n ...uowConfig,\n ...nestedUowConfig,\n },\n });\n },\n } as SimpleQueryInterface<T, UnitOfWorkConfig>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"from-unit-of-work-compiler.js","names":["#indexName","#condition","#setValues"],"sources":["../../../src/adapters/shared/from-unit-of-work-compiler.ts"],"sourcesContent":["import type { SimpleQueryInterface, TableToUpdateValues } from \"../../query/simple-query-interface\";\nimport type { AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport type {\n CompiledMutation,\n UOWCompiler,\n UOWDecoder,\n UOWExecutor,\n UOWInstrumentation,\n ValidIndexName,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport { UnitOfWork } from \"../../query/unit-of-work/unit-of-work\";\nimport type { CursorResult } from \"../../query/cursor\";\nimport type { CompiledQuery } from \"../../sql-driver/sql-driver\";\n\n/**\n * Configuration options for creating a Unit of Work with generic SQL\n */\nexport interface UnitOfWorkConfig {\n /**\n * Optional callback to receive compiled SQL queries for logging/debugging\n * This callback is invoked for each query as it's compiled\n */\n onQuery?: (query: CompiledQuery) => void;\n /**\n * If true, the query will not be executed and the query will be returned. Not respected for UOWs\n * since those have to be manually executed.\n */\n dryRun?: boolean;\n instrumentation?: UOWInstrumentation;\n}\n\n/**\n * Factory interface for creating Unit of Work instances\n */\nexport interface UnitOfWorkFactory {\n /**\n * UOW compiler for compiling operations to SQL\n */\n compiler: UOWCompiler<CompiledQuery>;\n /**\n * UOW executor for running compiled queries\n */\n executor: UOWExecutor<CompiledQuery, unknown>;\n /**\n * UOW decoder for transforming raw results\n */\n decoder: UOWDecoder<unknown>;\n /**\n * Optional UOW configuration\n */\n uowConfig?: UnitOfWorkConfig;\n /**\n * Optional WeakMap for schema-to-namespace lookups\n */\n schemaNamespaceMap?: WeakMap<AnySchema, string | null>;\n}\n\n/**\n * Type guard to check if a query is a CompiledMutation\n */\nfunction isCompiledMutation(query: unknown): query is CompiledMutation<CompiledQuery> {\n return (\n query !== null &&\n typeof query === \"object\" &&\n \"expectedAffectedRows\" in query &&\n \"query\" in query\n );\n}\n\n/**\n * Type guard to check if a record has an id field\n */\nfunction hasIdField(record: unknown): record is { id: string | FragnoId } {\n return record !== null && typeof record === \"object\" && \"id\" in record;\n}\n\nclass UpdateManySpecialBuilder<TTable extends AnyTable> {\n #indexName?: ValidIndexName<TTable>;\n #condition?: unknown;\n #setValues?: TableToUpdateValues<TTable>;\n\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: unknown,\n ): this {\n this.#indexName = indexName;\n this.#condition = condition;\n return this;\n }\n\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n getConfig() {\n return {\n indexName: this.#indexName,\n condition: this.#condition,\n setValues: this.#setValues,\n };\n }\n}\n\n/**\n * Creates a generic SQL-based query engine for the given schema using a UnitOfWorkFactory.\n *\n * This is the main entry point for creating a database query interface using a Unit of Work compiler.\n * It uses a compiler-based architecture where queries are compiled to SQL and then executed,\n * enabling features like SQL snapshot testing.\n *\n * @param schema - The database schema definition\n * @param factory - Factory containing compiler, executor, decoder, and optional configuration\n * @returns An SimpleQueryInterface instance for performing database operations\n *\n * @example\n * ```ts\n * const operationCompiler = new GenericSQLUOWOperationCompiler(driverConfig);\n * const factory: UnitOfWorkFactory = {\n * compiler: createUOWCompilerFromOperationCompiler(operationCompiler),\n * executor: createExecutor(sqlDriver),\n * decoder: createKyselyUOWDecoder(driverConfig.databaseType),\n * };\n * const queryEngine = fromUnitOfWorkCompiler(mySchema, factory);\n *\n * const users = await queryEngine.find('users', (b) =>\n * b.whereIndex('age').where((eb) => eb('age', '>', 18))\n * );\n * ```\n */\nexport function fromUnitOfWorkCompiler<T extends AnySchema>(\n schema: T,\n factory: UnitOfWorkFactory,\n): SimpleQueryInterface<T, UnitOfWorkConfig> {\n const { compiler, executor, decoder, uowConfig, schemaNamespaceMap } = factory;\n\n function createUOW(opts: { name?: string; config?: UnitOfWorkConfig }) {\n const { onQuery, ...restUowConfig } = opts.config ?? {};\n\n return new UnitOfWork(\n compiler,\n executor,\n decoder,\n opts.name,\n {\n ...restUowConfig,\n onQuery: onQuery\n ? (query) => {\n // Extract the actual query from CompiledMutation if needed\n const actualQuery = isCompiledMutation(query)\n ? query.query\n : (query as CompiledQuery);\n onQuery(actualQuery);\n }\n : undefined,\n },\n schemaNamespaceMap,\n ).forSchema(schema);\n }\n\n return {\n async find(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.find(tableName, builderFn);\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result ?? [];\n },\n\n async findWithCursor(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn);\n const [result] = await uow.executeRetrieve();\n // Result from findWithCursor is always a CursorResult - the UOW decoder handles the conversion\n return result as CursorResult<unknown>;\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n if (builderFn) {\n uow.find(tableName, (b) => {\n builderFn(b);\n return b.pageSize(1);\n });\n } else {\n uow.find(tableName, (b) => b.whereIndex(\"primary\").pageSize(1));\n }\n // executeRetrieve runs an array of `find` operation results, which each return an array of rows\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result?.[0] ?? null;\n },\n\n async create(tableName, values) {\n const uow = createUOW({ config: uowConfig });\n uow.create(tableName, values);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create record\");\n }\n\n const createdIds = uow.getCreatedIds();\n const createdId = createdIds[0];\n if (!createdId) {\n throw new Error(\"Failed to get created ID\");\n }\n return createdId;\n },\n\n async createMany(tableName, valuesArray) {\n const uow = createUOW({ config: uowConfig });\n for (const values of valuesArray) {\n uow.create(tableName, values);\n }\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create records\");\n }\n\n return uow.getCreatedIds();\n },\n\n async update(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.update(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update record (version conflict or record not found)\");\n }\n },\n\n async updateMany(tableName, builderFn) {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const specialBuilder = new UpdateManySpecialBuilder<typeof table>();\n builderFn(specialBuilder);\n\n const { indexName, condition, setValues } = specialBuilder.getConfig();\n\n if (!indexName) {\n throw new Error(\"whereIndex() must be called in updateMany\");\n }\n if (!setValues) {\n throw new Error(\"set() must be called in updateMany\");\n }\n\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, (b) => {\n // Condition might be null or undefined, only pass if defined and not null\n if (condition !== undefined && condition !== null) {\n // TypeScript can't infer the complex condition type from the builder\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return b.whereIndex(indexName, condition as any);\n }\n return b.whereIndex(indexName);\n });\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW({ config: uowConfig });\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n updateUow.update(tableName, record.id, (b) => b.set(setValues));\n }\n const { success } = await updateUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update records (version conflict)\");\n }\n },\n\n async delete(tableName, id, builderFn) {\n const uow = createUOW({ config: uowConfig });\n uow.delete(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete record (version conflict or record not found)\");\n }\n },\n\n async deleteMany(tableName, builderFn) {\n const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, builderFn);\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW({ config: uowConfig });\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n deleteUow.delete(tableName, record.id);\n }\n const { success } = await deleteUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete records (version conflict)\");\n }\n },\n\n createUnitOfWork(name, nestedUowConfig) {\n return createUOW({\n name,\n config: {\n ...uowConfig,\n ...nestedUowConfig,\n },\n });\n },\n } as SimpleQueryInterface<T, UnitOfWorkConfig>;\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
+ import { createNamingResolver } from "../../naming/sql-naming.js";
1
2
  import "../../query/cursor.js";
2
- import { createTableNameMapper } from "./table-name-mapper.js";
3
3
 
4
4
  //#region src/adapters/shared/uow-operation-compiler.ts
5
5
  /**
@@ -15,22 +15,23 @@ import { createTableNameMapper } from "./table-name-mapper.js";
15
15
  */
16
16
  var UOWOperationCompiler = class {
17
17
  #driverConfig;
18
- #mapperFactory;
19
- constructor(driverConfig, mapperFactory) {
18
+ #resolverFactory;
19
+ constructor(driverConfig, resolverFactory) {
20
20
  this.#driverConfig = driverConfig;
21
- this.#mapperFactory = mapperFactory;
21
+ this.#resolverFactory = resolverFactory;
22
22
  }
23
23
  get driverConfig() {
24
24
  return this.#driverConfig;
25
25
  }
26
- get mapperFactory() {
27
- return this.#mapperFactory;
26
+ get resolverFactory() {
27
+ return this.#resolverFactory;
28
28
  }
29
29
  /**
30
30
  * Get the mapper for a specific operation based on its namespace
31
31
  */
32
- getMapperForOperation(namespace) {
33
- return this.#mapperFactory ? this.#mapperFactory(namespace) : namespace ? createTableNameMapper(namespace) : void 0;
32
+ getNamingResolver(schema, namespace) {
33
+ if (this.#resolverFactory) return this.#resolverFactory(schema, namespace ?? null);
34
+ return createNamingResolver(schema, namespace ?? null, this.#driverConfig.defaultNamingStrategy);
34
35
  }
35
36
  /**
36
37
  * Get a table from a schema by name
@@ -60,9 +61,8 @@ var UOWOperationCompiler = class {
60
61
  /**
61
62
  * Get the physical table name for an operation, applying namespace mapping if needed
62
63
  */
63
- getPhysicalTableName(logicalName, namespace) {
64
- const mapper = this.getMapperForOperation(namespace);
65
- return mapper ? mapper.toPhysical(logicalName) : logicalName;
64
+ getPhysicalTableName(schema, logicalName, namespace) {
65
+ return this.getNamingResolver(schema, namespace ?? null).getTableName(logicalName);
66
66
  }
67
67
  };
68
68
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"uow-operation-compiler.js","names":["#driverConfig","#mapperFactory","exhaustiveCheck: never"],"sources":["../../../src/adapters/shared/uow-operation-compiler.ts"],"sourcesContent":["import type { AnyColumn, AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport type { Condition } from \"../../query/condition-builder\";\nimport type {\n CompiledMutation,\n RetrievalOperation,\n MutationOperation,\n UOWCompiler,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport { Cursor } from \"../../query/cursor\";\nimport type { DriverConfig } from \"../generic-sql/driver-config\";\nimport { createTableNameMapper, type TableNameMapper } from \"./table-name-mapper\";\n\n/**\n * Options for compiling a find operation with cursor pagination\n */\nexport interface FindCompilationOptions {\n /** Index columns used for ordering */\n indexColumns: AnyColumn[];\n /** Order direction for the index */\n orderDirection: \"asc\" | \"desc\";\n /** User-provided where condition */\n userWhere: Condition | boolean | undefined;\n /** Cursor string or Cursor object for pagination (after) */\n after?: string | Cursor;\n /** Cursor string or Cursor object for pagination (before) */\n before?: string | Cursor;\n /** Page size for pagination */\n pageSize?: number;\n /** Whether this is a high-level cursor API call (affects limit calculation) */\n withCursor?: boolean;\n /** Driver config for cursor serialization */\n driverConfig: DriverConfig;\n}\n\n/**\n * Result of cursor condition building\n */\nexport interface CursorConditionResult {\n /** The combined where condition (user where + cursor condition) */\n where: Condition | undefined;\n /** The effective limit to use (may be pageSize + 1 for cursor detection) */\n limit: number | undefined;\n}\n\n/**\n * Abstract base class for Unit of Work operation compilers\n *\n * This class provides a structure and utilities for implementing UOW compilers\n * for different ORM/query builders (Kysely, Drizzle, etc.).\n *\n * Subclasses must implement the abstract methods for each operation type,\n * and can use the provided utility methods for common tasks.\n *\n * @template TCompiledQuery - The type of compiled query for the target ORM\n */\nexport abstract class UOWOperationCompiler<TCompiledQuery> {\n #driverConfig: DriverConfig;\n #mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined;\n\n constructor(\n driverConfig: DriverConfig,\n mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined,\n ) {\n this.#driverConfig = driverConfig;\n this.#mapperFactory = mapperFactory;\n }\n\n protected get driverConfig(): DriverConfig {\n return this.#driverConfig;\n }\n\n protected get mapperFactory():\n | ((namespace: string | undefined) => TableNameMapper | undefined)\n | undefined {\n return this.#mapperFactory;\n }\n\n abstract compileCount(\n op: RetrievalOperation<AnySchema> & { type: \"count\" },\n ): TCompiledQuery | null;\n\n abstract compileFind(op: RetrievalOperation<AnySchema> & { type: \"find\" }): TCompiledQuery | null;\n\n /**\n * Compile a create operation\n */\n abstract compileCreate(\n op: MutationOperation<AnySchema> & { type: \"create\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n abstract compileUpdate(\n op: MutationOperation<AnySchema> & { type: \"update\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n abstract compileDelete(\n op: MutationOperation<AnySchema> & { type: \"delete\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n abstract compileCheck(\n op: MutationOperation<AnySchema> & { type: \"check\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n // ==================== Utility Methods ====================\n\n /**\n * Get the mapper for a specific operation based on its namespace\n */\n protected getMapperForOperation(namespace: string | undefined): TableNameMapper | undefined {\n return this.#mapperFactory\n ? this.#mapperFactory(namespace)\n : namespace\n ? createTableNameMapper(namespace)\n : undefined;\n }\n\n /**\n * Get a table from a schema by name\n * @throws Error if table is not found\n */\n protected getTable(schema: AnySchema, tableName: string): AnyTable {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Invalid table name ${tableName}.`);\n }\n return table;\n }\n\n /**\n * Get the version to check for a given ID and checkVersion flag\n * @returns The version to check or undefined if no check is required\n * @throws Error if the ID is a string and checkVersion is true\n */\n protected getVersionToCheck(id: FragnoId | string, checkVersion: boolean): number | undefined {\n if (!checkVersion) {\n return undefined;\n }\n\n if (typeof id === \"string\") {\n throw new Error(\n `Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`,\n );\n }\n\n return id.version;\n }\n\n /**\n * Extract external ID from FragnoId or string\n */\n protected getExternalId(id: FragnoId | string): string {\n return typeof id === \"string\" ? id : id.externalId;\n }\n\n /**\n * Get the physical table name for an operation, applying namespace mapping if needed\n */\n protected getPhysicalTableName(logicalName: string, namespace: string | undefined): string {\n const mapper = this.getMapperForOperation(namespace);\n return mapper ? mapper.toPhysical(logicalName) : logicalName;\n }\n}\n\n/**\n * Creates a UOWCompiler from a UOWOperationCompiler by dispatching operations\n * to the appropriate specific compilation methods based on operation type.\n *\n * @template TCompiledQuery - The type of compiled query for the target ORM\n * @param operationCompiler - The operation compiler to wrap\n * @returns A UOWCompiler instance that delegates to the operation compiler\n */\nexport function createUOWCompilerFromOperationCompiler<TCompiledQuery>(\n operationCompiler: UOWOperationCompiler<TCompiledQuery>,\n): UOWCompiler<TCompiledQuery> {\n return {\n compileRetrievalOperation(op: RetrievalOperation<AnySchema>): TCompiledQuery | null {\n switch (op.type) {\n case \"count\":\n return operationCompiler.compileCount(op);\n case \"find\":\n return operationCompiler.compileFind(op);\n default: {\n const exhaustiveCheck: never = op;\n throw new Error(\n `Unknown retrieval operation type: ${(exhaustiveCheck as RetrievalOperation<AnySchema>).type}`,\n );\n }\n }\n },\n\n compileMutationOperation(\n op: MutationOperation<AnySchema>,\n ): CompiledMutation<TCompiledQuery> | null {\n switch (op.type) {\n case \"create\":\n return operationCompiler.compileCreate(op);\n case \"update\":\n return operationCompiler.compileUpdate(op);\n case \"delete\":\n return operationCompiler.compileDelete(op);\n case \"check\":\n return operationCompiler.compileCheck(op);\n default: {\n const exhaustiveCheck: never = op;\n throw new Error(\n `Unknown mutation operation type: ${(exhaustiveCheck as MutationOperation<AnySchema>).type}`,\n );\n }\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuDA,IAAsB,uBAAtB,MAA2D;CACzD;CACA;CAEA,YACE,cACA,eACA;AACA,QAAKA,eAAgB;AACrB,QAAKC,gBAAiB;;CAGxB,IAAc,eAA6B;AACzC,SAAO,MAAKD;;CAGd,IAAc,gBAEA;AACZ,SAAO,MAAKC;;;;;CAiCd,AAAU,sBAAsB,WAA4D;AAC1F,SAAO,MAAKA,gBACR,MAAKA,cAAe,UAAU,GAC9B,YACE,sBAAsB,UAAU,GAChC;;;;;;CAOR,AAAU,SAAS,QAAmB,WAA6B;EACjE,MAAM,QAAQ,OAAO,OAAO;AAC5B,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,sBAAsB,UAAU,GAAG;AAErD,SAAO;;;;;;;CAQT,AAAU,kBAAkB,IAAuB,cAA2C;AAC5F,MAAI,CAAC,aACH;AAGF,MAAI,OAAO,OAAO,SAChB,OAAM,IAAI,MACR,2GACD;AAGH,SAAO,GAAG;;;;;CAMZ,AAAU,cAAc,IAA+B;AACrD,SAAO,OAAO,OAAO,WAAW,KAAK,GAAG;;;;;CAM1C,AAAU,qBAAqB,aAAqB,WAAuC;EACzF,MAAM,SAAS,KAAK,sBAAsB,UAAU;AACpD,SAAO,SAAS,OAAO,WAAW,YAAY,GAAG;;;;;;;;;;;AAYrD,SAAgB,uCACd,mBAC6B;AAC7B,QAAO;EACL,0BAA0B,IAA0D;AAClF,WAAQ,GAAG,MAAX;IACE,KAAK,QACH,QAAO,kBAAkB,aAAa,GAAG;IAC3C,KAAK,OACH,QAAO,kBAAkB,YAAY,GAAG;IAC1C,SAAS;KACP,MAAMC,kBAAyB;AAC/B,WAAM,IAAI,MACR,qCAAsC,gBAAkD,OACzF;;;;EAKP,yBACE,IACyC;AACzC,WAAQ,GAAG,MAAX;IACE,KAAK,SACH,QAAO,kBAAkB,cAAc,GAAG;IAC5C,KAAK,SACH,QAAO,kBAAkB,cAAc,GAAG;IAC5C,KAAK,SACH,QAAO,kBAAkB,cAAc,GAAG;IAC5C,KAAK,QACH,QAAO,kBAAkB,aAAa,GAAG;IAC3C,SAAS;KACP,MAAMA,kBAAyB;AAC/B,WAAM,IAAI,MACR,oCAAqC,gBAAiD,OACvF;;;;EAIR"}
1
+ {"version":3,"file":"uow-operation-compiler.js","names":["#driverConfig","#resolverFactory","exhaustiveCheck: never"],"sources":["../../../src/adapters/shared/uow-operation-compiler.ts"],"sourcesContent":["import type { AnyColumn, AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport type { Condition } from \"../../query/condition-builder\";\nimport type {\n CompiledMutation,\n RetrievalOperation,\n MutationOperation,\n UOWCompiler,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport { Cursor } from \"../../query/cursor\";\nimport type { DriverConfig } from \"../generic-sql/driver-config\";\nimport { createNamingResolver, type NamingResolver } from \"../../naming/sql-naming\";\n\n/**\n * Options for compiling a find operation with cursor pagination\n */\nexport interface FindCompilationOptions {\n /** Index columns used for ordering */\n indexColumns: AnyColumn[];\n /** Order direction for the index */\n orderDirection: \"asc\" | \"desc\";\n /** User-provided where condition */\n userWhere: Condition | boolean | undefined;\n /** Cursor string or Cursor object for pagination (after) */\n after?: string | Cursor;\n /** Cursor string or Cursor object for pagination (before) */\n before?: string | Cursor;\n /** Page size for pagination */\n pageSize?: number;\n /** Whether this is a high-level cursor API call (affects limit calculation) */\n withCursor?: boolean;\n /** Driver config for cursor serialization */\n driverConfig: DriverConfig;\n}\n\n/**\n * Result of cursor condition building\n */\nexport interface CursorConditionResult {\n /** The combined where condition (user where + cursor condition) */\n where: Condition | undefined;\n /** The effective limit to use (may be pageSize + 1 for cursor detection) */\n limit: number | undefined;\n}\n\n/**\n * Abstract base class for Unit of Work operation compilers\n *\n * This class provides a structure and utilities for implementing UOW compilers\n * for different ORM/query builders (Kysely, Drizzle, etc.).\n *\n * Subclasses must implement the abstract methods for each operation type,\n * and can use the provided utility methods for common tasks.\n *\n * @template TCompiledQuery - The type of compiled query for the target ORM\n */\nexport abstract class UOWOperationCompiler<TCompiledQuery> {\n #driverConfig: DriverConfig;\n #resolverFactory?: (schema: AnySchema, namespace: string | null) => NamingResolver;\n\n constructor(\n driverConfig: DriverConfig,\n resolverFactory?: (schema: AnySchema, namespace: string | null) => NamingResolver,\n ) {\n this.#driverConfig = driverConfig;\n this.#resolverFactory = resolverFactory;\n }\n\n protected get driverConfig(): DriverConfig {\n return this.#driverConfig;\n }\n\n protected get resolverFactory():\n | ((schema: AnySchema, namespace: string | null) => NamingResolver)\n | undefined {\n return this.#resolverFactory;\n }\n\n abstract compileCount(\n op: RetrievalOperation<AnySchema> & { type: \"count\" },\n ): TCompiledQuery | null;\n\n abstract compileFind(op: RetrievalOperation<AnySchema> & { type: \"find\" }): TCompiledQuery | null;\n\n /**\n * Compile a create operation\n */\n abstract compileCreate(\n op: MutationOperation<AnySchema> & { type: \"create\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n abstract compileUpdate(\n op: MutationOperation<AnySchema> & { type: \"update\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n abstract compileDelete(\n op: MutationOperation<AnySchema> & { type: \"delete\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n abstract compileCheck(\n op: MutationOperation<AnySchema> & { type: \"check\" },\n ): CompiledMutation<TCompiledQuery> | null;\n\n // ==================== Utility Methods ====================\n\n /**\n * Get the mapper for a specific operation based on its namespace\n */\n protected getNamingResolver(\n schema: AnySchema,\n namespace: string | null | undefined,\n ): NamingResolver {\n if (this.#resolverFactory) {\n return this.#resolverFactory(schema, namespace ?? null);\n }\n return createNamingResolver(\n schema,\n namespace ?? null,\n this.#driverConfig.defaultNamingStrategy,\n );\n }\n\n /**\n * Get a table from a schema by name\n * @throws Error if table is not found\n */\n protected getTable(schema: AnySchema, tableName: string): AnyTable {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Invalid table name ${tableName}.`);\n }\n return table;\n }\n\n /**\n * Get the version to check for a given ID and checkVersion flag\n * @returns The version to check or undefined if no check is required\n * @throws Error if the ID is a string and checkVersion is true\n */\n protected getVersionToCheck(id: FragnoId | string, checkVersion: boolean): number | undefined {\n if (!checkVersion) {\n return undefined;\n }\n\n if (typeof id === \"string\") {\n throw new Error(\n `Cannot use checkVersion with a string ID. Version checking requires a FragnoId with version information.`,\n );\n }\n\n return id.version;\n }\n\n /**\n * Extract external ID from FragnoId or string\n */\n protected getExternalId(id: FragnoId | string): string {\n return typeof id === \"string\" ? id : id.externalId;\n }\n\n /**\n * Get the physical table name for an operation, applying namespace mapping if needed\n */\n protected getPhysicalTableName(\n schema: AnySchema,\n logicalName: string,\n namespace: string | undefined,\n ): string {\n const resolver = this.getNamingResolver(schema, namespace ?? null);\n return resolver.getTableName(logicalName);\n }\n}\n\n/**\n * Creates a UOWCompiler from a UOWOperationCompiler by dispatching operations\n * to the appropriate specific compilation methods based on operation type.\n *\n * @template TCompiledQuery - The type of compiled query for the target ORM\n * @param operationCompiler - The operation compiler to wrap\n * @returns A UOWCompiler instance that delegates to the operation compiler\n */\nexport function createUOWCompilerFromOperationCompiler<TCompiledQuery>(\n operationCompiler: UOWOperationCompiler<TCompiledQuery>,\n): UOWCompiler<TCompiledQuery> {\n return {\n compileRetrievalOperation(op: RetrievalOperation<AnySchema>): TCompiledQuery | null {\n switch (op.type) {\n case \"count\":\n return operationCompiler.compileCount(op);\n case \"find\":\n return operationCompiler.compileFind(op);\n default: {\n const exhaustiveCheck: never = op;\n throw new Error(\n `Unknown retrieval operation type: ${(exhaustiveCheck as RetrievalOperation<AnySchema>).type}`,\n );\n }\n }\n },\n\n compileMutationOperation(\n op: MutationOperation<AnySchema>,\n ): CompiledMutation<TCompiledQuery> | null {\n switch (op.type) {\n case \"create\":\n return operationCompiler.compileCreate(op);\n case \"update\":\n return operationCompiler.compileUpdate(op);\n case \"delete\":\n return operationCompiler.compileDelete(op);\n case \"check\":\n return operationCompiler.compileCheck(op);\n default: {\n const exhaustiveCheck: never = op;\n throw new Error(\n `Unknown mutation operation type: ${(exhaustiveCheck as MutationOperation<AnySchema>).type}`,\n );\n }\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuDA,IAAsB,uBAAtB,MAA2D;CACzD;CACA;CAEA,YACE,cACA,iBACA;AACA,QAAKA,eAAgB;AACrB,QAAKC,kBAAmB;;CAG1B,IAAc,eAA6B;AACzC,SAAO,MAAKD;;CAGd,IAAc,kBAEA;AACZ,SAAO,MAAKC;;;;;CAiCd,AAAU,kBACR,QACA,WACgB;AAChB,MAAI,MAAKA,gBACP,QAAO,MAAKA,gBAAiB,QAAQ,aAAa,KAAK;AAEzD,SAAO,qBACL,QACA,aAAa,MACb,MAAKD,aAAc,sBACpB;;;;;;CAOH,AAAU,SAAS,QAAmB,WAA6B;EACjE,MAAM,QAAQ,OAAO,OAAO;AAC5B,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,sBAAsB,UAAU,GAAG;AAErD,SAAO;;;;;;;CAQT,AAAU,kBAAkB,IAAuB,cAA2C;AAC5F,MAAI,CAAC,aACH;AAGF,MAAI,OAAO,OAAO,SAChB,OAAM,IAAI,MACR,2GACD;AAGH,SAAO,GAAG;;;;;CAMZ,AAAU,cAAc,IAA+B;AACrD,SAAO,OAAO,OAAO,WAAW,KAAK,GAAG;;;;;CAM1C,AAAU,qBACR,QACA,aACA,WACQ;AAER,SADiB,KAAK,kBAAkB,QAAQ,aAAa,KAAK,CAClD,aAAa,YAAY;;;;;;;;;;;AAY7C,SAAgB,uCACd,mBAC6B;AAC7B,QAAO;EACL,0BAA0B,IAA0D;AAClF,WAAQ,GAAG,MAAX;IACE,KAAK,QACH,QAAO,kBAAkB,aAAa,GAAG;IAC3C,KAAK,OACH,QAAO,kBAAkB,YAAY,GAAG;IAC1C,SAAS;KACP,MAAME,kBAAyB;AAC/B,WAAM,IAAI,MACR,qCAAsC,gBAAkD,OACzF;;;;EAKP,yBACE,IACyC;AACzC,WAAQ,GAAG,MAAX;IACE,KAAK,SACH,QAAO,kBAAkB,cAAc,GAAG;IAC5C,KAAK,SACH,QAAO,kBAAkB,cAAc,GAAG;IAC5C,KAAK,SACH,QAAO,kBAAkB,cAAc,GAAG;IAC5C,KAAK,QACH,QAAO,kBAAkB,aAAa,GAAG;IAC3C,SAAS;KACP,MAAMA,kBAAyB;AAC/B,WAAM,IAAI,MACR,oCAAqC,gBAAiD,OACvF;;;;EAIR"}
@@ -0,0 +1,5 @@
1
+ import { SQLiteStorageMode, sqliteStorageDefault, sqliteStoragePrisma } from "../generic-sql/sqlite-storage.js";
2
+ import { OutboxConfig } from "../../outbox/outbox.js";
3
+ import { SQLiteProfile } from "../adapters.js";
4
+ import { SqlAdapter, SqlAdapterOptions, UnitOfWorkConfig, sqliteProfiles } from "../generic-sql/generic-sql-adapter.js";
5
+ export { type OutboxConfig, type SQLiteProfile, type SQLiteStorageMode, SqlAdapter, type SqlAdapterOptions, type UnitOfWorkConfig, sqliteProfiles, sqliteStorageDefault, sqliteStoragePrisma };
@@ -0,0 +1,4 @@
1
+ import { sqliteStorageDefault, sqliteStoragePrisma } from "../generic-sql/sqlite-storage.js";
2
+ import { SqlAdapter, sqliteProfiles } from "../generic-sql/generic-sql-adapter.js";
3
+
4
+ export { SqlAdapter, sqliteProfiles, sqliteStorageDefault, sqliteStoragePrisma };
@@ -1,6 +1,6 @@
1
1
  import { AnySchema } from "./schema/create.js";
2
2
  import { ExecuteTxOptions, HandlerTxBuilder, ServiceTxBuilder } from "./query/unit-of-work/execute-unit-of-work.js";
3
- import { HookContext, HookFn, HooksMap } from "./hooks/hooks.js";
3
+ import { DurableHooksProcessingOptions, HookContext, HookFn, HooksMap } from "./hooks/hooks.js";
4
4
  import { IUnitOfWork } from "./query/unit-of-work/unit-of-work.js";
5
5
  import { SimpleQueryInterface } from "./query/simple-query-interface.js";
6
6
  import { DatabaseAdapter } from "./adapters/adapters.js";
@@ -9,11 +9,21 @@ import { AnyFragnoInstantiatedFragment, FragmentDefinition, FragmentDefinitionBu
9
9
  //#region src/db-fragment-definition-builder.d.ts
10
10
 
11
11
  /**
12
- * Extended FragnoPublicConfig that includes a database adapter.
13
- * Use this type when creating fragments with database support.
12
+ * Extended FragnoPublicConfig for database fragments.
13
+ * If databaseAdapter is omitted and better-sqlite3 is available, a default SQLite adapter is used.
14
14
  */
15
15
  type FragnoPublicConfigWithDatabase = FragnoPublicConfig & {
16
- databaseAdapter: DatabaseAdapter<any>;
16
+ databaseAdapter?: DatabaseAdapter<any>;
17
+ /**
18
+ * Optional durable hooks processing configuration.
19
+ */
20
+ durableHooks?: DurableHooksProcessingOptions;
21
+ /**
22
+ * Optional override for database namespace. If provided (including null), it is used as-is
23
+ * without sanitization — the caller is responsible for providing a valid namespace.
24
+ * When omitted, defaults to a sanitized version of schema.name.
25
+ */
26
+ databaseNamespace?: string | null;
17
27
  };
18
28
  /**
19
29
  * Implicit dependencies that database fragments get automatically.
@@ -22,6 +32,7 @@ type FragnoPublicConfigWithDatabase = FragnoPublicConfig & {
22
32
  type ImplicitDatabaseDependencies<TSchema extends AnySchema> = {
23
33
  /**
24
34
  * Database query engine for the fragment's schema.
35
+ * @deprecated Prefer handlerTx/serviceTx instead of direct db usage.
25
36
  */
26
37
  db: SimpleQueryInterface<TSchema>;
27
38
  /**
@@ -31,7 +42,7 @@ type ImplicitDatabaseDependencies<TSchema extends AnySchema> = {
31
42
  /**
32
43
  * The database namespace for this fragment.
33
44
  */
34
- namespace: string;
45
+ namespace: string | null;
35
46
  /**
36
47
  * Create a new Unit of Work for database operations.
37
48
  */
@@ -106,11 +117,11 @@ type DatabaseRequestStorage = {
106
117
  * Builder for database fragments that wraps the core fragment builder
107
118
  * and provides database-specific functionality.
108
119
  *
109
- * Database fragments always require FragnoPublicConfigWithDatabase (which includes databaseAdapter).
120
+ * Database fragments use FragnoPublicConfigWithDatabase and default the adapter when possible.
110
121
  */
111
122
  declare class DatabaseFragmentDefinitionBuilder<TSchema extends AnySchema, TConfig, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices, THooks extends HooksMap = {}, TServiceThisContext extends RequestThisContext = DatabaseHandlerContext, THandlerThisContext extends RequestThisContext = DatabaseHandlerContext, TLinkedFragments extends Record<string, AnyFragnoInstantiatedFragment> = {}> {
112
123
  #private;
113
- constructor(baseBuilder: FragmentDefinitionBuilder<TConfig, FragnoPublicConfigWithDatabase, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices, TServiceThisContext, THandlerThisContext, DatabaseRequestStorage, TLinkedFragments>, schema: TSchema, namespace?: string, hooksFactory?: (context: {
124
+ constructor(baseBuilder: FragmentDefinitionBuilder<TConfig, FragnoPublicConfigWithDatabase, TDeps, TBaseServices, TServices, TServiceDependencies, TPrivateServices, TServiceThisContext, THandlerThisContext, DatabaseRequestStorage, TLinkedFragments>, schema: TSchema, hooksFactory?: (context: {
114
125
  config: TConfig;
115
126
  options: FragnoPublicConfigWithDatabase;
116
127
  }) => THooks);
@@ -1 +1 @@
1
- {"version":3,"file":"db-fragment-definition-builder.d.ts","names":[],"sources":["../src/db-fragment-definition-builder.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"db-fragment-definition-builder.d.ts","names":[],"sources":["../src/db-fragment-definition-builder.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,34 +1,37 @@
1
1
  import { createHandlerTxBuilder, createServiceTxBuilder } from "./query/unit-of-work/execute-unit-of-work.js";
2
- import { prepareHookMutations, processHooks } from "./hooks/hooks.js";
2
+ import { createHookScheduler, prepareHookMutations } from "./hooks/hooks.js";
3
+ import { sanitizeNamespace } from "./naming/sql-naming.js";
4
+ import { resolveDatabaseAdapter } from "./util/default-database-adapter.js";
3
5
 
4
6
  //#region src/db-fragment-definition-builder.ts
5
7
  /**
6
8
  * Create database context from options.
7
9
  * This extracts the database adapter and creates the ORM instance.
8
10
  */
9
- function createDatabaseContext(options, schema, namespace) {
10
- const databaseAdapter = options.databaseAdapter;
11
- if (!databaseAdapter) throw new Error("Database fragment requires a database adapter to be provided in options.databaseAdapter");
11
+ function createDatabaseContext(options, schema) {
12
+ const databaseAdapter = resolveDatabaseAdapter(options, schema);
13
+ const namespace = resolveDatabaseNamespace(options, schema);
12
14
  return {
13
15
  databaseAdapter,
14
16
  db: databaseAdapter.createQueryEngine(schema, namespace)
15
17
  };
16
18
  }
19
+ function resolveDatabaseNamespace(options, schema) {
20
+ return options.databaseNamespace !== void 0 ? options.databaseNamespace ?? null : sanitizeNamespace(schema.name);
21
+ }
17
22
  /**
18
23
  * Builder for database fragments that wraps the core fragment builder
19
24
  * and provides database-specific functionality.
20
25
  *
21
- * Database fragments always require FragnoPublicConfigWithDatabase (which includes databaseAdapter).
26
+ * Database fragments use FragnoPublicConfigWithDatabase and default the adapter when possible.
22
27
  */
23
28
  var DatabaseFragmentDefinitionBuilder = class DatabaseFragmentDefinitionBuilder {
24
29
  #baseBuilder;
25
30
  #schema;
26
- #namespace;
27
31
  #hooksFactory;
28
- constructor(baseBuilder, schema, namespace, hooksFactory) {
32
+ constructor(baseBuilder, schema, hooksFactory) {
29
33
  this.#baseBuilder = baseBuilder;
30
34
  this.#schema = schema;
31
- this.#namespace = namespace ?? baseBuilder.name;
32
35
  this.#hooksFactory = hooksFactory;
33
36
  }
34
37
  /**
@@ -37,7 +40,8 @@ var DatabaseFragmentDefinitionBuilder = class DatabaseFragmentDefinitionBuilder
37
40
  */
38
41
  withDependencies(fn) {
39
42
  const wrappedFn = (context) => {
40
- const dbContext = createDatabaseContext(context.options, this.#schema, this.#namespace);
43
+ const dbContext = createDatabaseContext(context.options, this.#schema);
44
+ const namespace = resolveDatabaseNamespace(context.options, this.#schema);
41
45
  const userDeps = fn({
42
46
  config: context.config,
43
47
  options: context.options,
@@ -48,7 +52,7 @@ var DatabaseFragmentDefinitionBuilder = class DatabaseFragmentDefinitionBuilder
48
52
  const implicitDeps = {
49
53
  db: dbContext.db,
50
54
  schema: this.#schema,
51
- namespace: this.#namespace,
55
+ namespace,
52
56
  createUnitOfWork: createUow
53
57
  };
54
58
  return {
@@ -56,13 +60,13 @@ var DatabaseFragmentDefinitionBuilder = class DatabaseFragmentDefinitionBuilder
56
60
  ...implicitDeps
57
61
  };
58
62
  };
59
- return new DatabaseFragmentDefinitionBuilder(this.#baseBuilder.withDependencies(wrappedFn), this.#schema, this.#namespace, this.#hooksFactory);
63
+ return new DatabaseFragmentDefinitionBuilder(this.#baseBuilder.withDependencies(wrappedFn), this.#schema, this.#hooksFactory);
60
64
  }
61
65
  providesBaseService(fn) {
62
- return new DatabaseFragmentDefinitionBuilder(this.#baseBuilder.providesBaseService(fn), this.#schema, this.#namespace, this.#hooksFactory);
66
+ return new DatabaseFragmentDefinitionBuilder(this.#baseBuilder.providesBaseService(fn), this.#schema, this.#hooksFactory);
63
67
  }
64
68
  providesService(serviceName, fn) {
65
- return new DatabaseFragmentDefinitionBuilder(this.#baseBuilder.providesService(serviceName, fn), this.#schema, this.#namespace, this.#hooksFactory);
69
+ return new DatabaseFragmentDefinitionBuilder(this.#baseBuilder.providesService(serviceName, fn), this.#schema, this.#hooksFactory);
66
70
  }
67
71
  /**
68
72
  * Provide a private service that is only accessible to the fragment author.
@@ -72,7 +76,7 @@ var DatabaseFragmentDefinitionBuilder = class DatabaseFragmentDefinitionBuilder
72
76
  * to later ones.
73
77
  */
74
78
  providesPrivateService(serviceName, fn) {
75
- return new DatabaseFragmentDefinitionBuilder(this.#baseBuilder.providesPrivateService(serviceName, fn), this.#schema, this.#namespace, this.#hooksFactory);
79
+ return new DatabaseFragmentDefinitionBuilder(this.#baseBuilder.providesPrivateService(serviceName, fn), this.#schema, this.#hooksFactory);
76
80
  }
77
81
  /**
78
82
  * Define durable hooks for this fragment.
@@ -102,7 +106,7 @@ var DatabaseFragmentDefinitionBuilder = class DatabaseFragmentDefinitionBuilder
102
106
  defineHook
103
107
  });
104
108
  };
105
- const newBuilder = new DatabaseFragmentDefinitionBuilder(this.#baseBuilder, this.#schema, this.#namespace);
109
+ const newBuilder = new DatabaseFragmentDefinitionBuilder(this.#baseBuilder, this.#schema);
106
110
  newBuilder.#hooksFactory = hooksFactory;
107
111
  return newBuilder;
108
112
  }
@@ -111,14 +115,14 @@ var DatabaseFragmentDefinitionBuilder = class DatabaseFragmentDefinitionBuilder
111
115
  * Delegates to the base builder.
112
116
  */
113
117
  usesService(serviceName) {
114
- return new DatabaseFragmentDefinitionBuilder(this.#baseBuilder.usesService(serviceName), this.#schema, this.#namespace, this.#hooksFactory);
118
+ return new DatabaseFragmentDefinitionBuilder(this.#baseBuilder.usesService(serviceName), this.#schema, this.#hooksFactory);
115
119
  }
116
120
  /**
117
121
  * Declare that this fragment uses an optional service provided by the runtime.
118
122
  * Delegates to the base builder.
119
123
  */
120
124
  usesOptionalService(serviceName) {
121
- return new DatabaseFragmentDefinitionBuilder(this.#baseBuilder.usesOptionalService(serviceName), this.#schema, this.#namespace, this.#hooksFactory);
125
+ return new DatabaseFragmentDefinitionBuilder(this.#baseBuilder.usesOptionalService(serviceName), this.#schema, this.#hooksFactory);
122
126
  }
123
127
  /**
124
128
  * Build the final database fragment definition.
@@ -137,11 +141,12 @@ var DatabaseFragmentDefinitionBuilder = class DatabaseFragmentDefinitionBuilder
137
141
  userDeps = {};
138
142
  } else throw error;
139
143
  }
140
- const { db } = createDatabaseContext(context.options, this.#schema, this.#namespace);
144
+ const { db } = createDatabaseContext(context.options, this.#schema);
145
+ const namespace = resolveDatabaseNamespace(context.options, this.#schema);
141
146
  const implicitDeps = {
142
147
  db,
143
148
  schema: this.#schema,
144
- namespace: this.#namespace,
149
+ namespace,
145
150
  createUnitOfWork: () => db.createUnitOfWork()
146
151
  };
147
152
  return {
@@ -150,57 +155,114 @@ var DatabaseFragmentDefinitionBuilder = class DatabaseFragmentDefinitionBuilder
150
155
  };
151
156
  };
152
157
  const builderWithStorage = this.#baseBuilder.withExternalRequestStorage(({ options }) => {
153
- return createDatabaseContext(options, this.#schema, this.#namespace).databaseAdapter.contextStorage;
158
+ return createDatabaseContext(options, this.#schema).databaseAdapter.contextStorage;
154
159
  }).withRequestStorage(({ options }) => {
155
- return { uow: createDatabaseContext(options, this.#schema, this.#namespace).db.createUnitOfWork() };
160
+ return { uow: createDatabaseContext(options, this.#schema).db.createUnitOfWork() };
156
161
  });
157
162
  const internalFragmentFactory = baseDef.linkedFragments?.["_fragno_internal"];
158
- return {
159
- ...builderWithStorage.withThisContext(({ storage, config, options }) => {
160
- const hooksConfig = this.#hooksFactory ? {
161
- hooks: this.#hooksFactory({
162
- config,
163
- options
164
- }),
165
- namespace: this.#namespace,
166
- internalFragment: internalFragmentFactory({
167
- config,
168
- options
169
- })
170
- } : void 0;
171
- function serviceTx(schema) {
172
- const uow = storage.getStore()?.uow;
173
- if (!uow) throw new Error("No UnitOfWork in context. Service must be called within a route handler OR using `withUnitOfWork`.");
174
- return createServiceTxBuilder(schema, uow, hooksConfig?.hooks);
175
- }
176
- const serviceContext = { serviceTx };
177
- function handlerTx(execOptions) {
178
- const currentStorage = storage.getStore();
179
- if (!currentStorage) throw new Error("No storage in context. Handler must be called within a request context.");
163
+ const hooksConfigCache = /* @__PURE__ */ new WeakMap();
164
+ const createHooksConfig = (context) => {
165
+ if (!this.#hooksFactory) return;
166
+ const depsKey = typeof context.deps === "object" && context.deps !== null ? context.deps : void 0;
167
+ const cachedHooksConfig = depsKey ? hooksConfigCache.get(depsKey) : void 0;
168
+ if (cachedHooksConfig) return cachedHooksConfig;
169
+ const namespaceKey = resolveDatabaseNamespace(context.options, this.#schema) ?? this.#schema.name;
170
+ const durableHooksOptions = context.options.durableHooks;
171
+ const baseAdapter = resolveDatabaseAdapter(context.options, this.#schema);
172
+ const hookAdapter = baseAdapter.getHookProcessingAdapter?.() ?? baseAdapter;
173
+ const hookOptions = hookAdapter === baseAdapter ? context.options : {
174
+ ...context.options,
175
+ databaseAdapter: hookAdapter
176
+ };
177
+ const dbContextForHooks = createDatabaseContext(hookOptions, this.#schema);
178
+ const hooksConfig = {
179
+ hooks: this.#hooksFactory(context),
180
+ namespace: namespaceKey,
181
+ internalFragment: internalFragmentFactory({
182
+ config: context.config,
183
+ options: hookOptions
184
+ }),
185
+ handlerTx: (execOptions) => {
180
186
  const userOnBeforeMutate = execOptions?.onBeforeMutate;
181
187
  const userOnAfterMutate = execOptions?.onAfterMutate;
182
188
  return createHandlerTxBuilder({
183
189
  ...execOptions,
184
190
  createUnitOfWork: () => {
185
- currentStorage.uow.reset();
186
- if (hooksConfig) currentStorage.uow.registerSchema(hooksConfig.internalFragment.$internal.deps.schema, hooksConfig.internalFragment.$internal.deps.namespace);
187
- return currentStorage.uow;
191
+ const uow = dbContextForHooks.db.createUnitOfWork();
192
+ uow.registerSchema(hooksConfig.internalFragment.$internal.deps.schema, hooksConfig.internalFragment.$internal.deps.namespace);
193
+ return uow;
188
194
  },
189
195
  onBeforeMutate: (uow) => {
190
- if (hooksConfig) prepareHookMutations(uow, hooksConfig);
196
+ prepareHookMutations(uow, hooksConfig);
191
197
  if (userOnBeforeMutate) userOnBeforeMutate(uow);
192
198
  },
193
199
  onAfterMutate: async (uow) => {
194
- if (hooksConfig) await processHooks(hooksConfig);
200
+ hooksConfig.scheduler?.schedule().catch((error) => {
201
+ console.error("Durable hooks processing failed", error);
202
+ });
195
203
  if (userOnAfterMutate) await userOnAfterMutate(uow);
196
204
  }
197
205
  });
198
- }
199
- return {
200
- serviceContext,
201
- handlerContext: { handlerTx }
202
- };
203
- }).build(),
206
+ },
207
+ stuckProcessingTimeoutMinutes: durableHooksOptions?.stuckProcessingTimeoutMinutes,
208
+ onStuckProcessingHooks: durableHooksOptions?.onStuckProcessingHooks
209
+ };
210
+ hooksConfig.scheduler = createHookScheduler(hooksConfig);
211
+ if (depsKey) hooksConfigCache.set(depsKey, hooksConfig);
212
+ return hooksConfig;
213
+ };
214
+ const finalDef = builderWithStorage.withThisContext(({ storage, config, options, deps }) => {
215
+ const hooksConfig = createHooksConfig({
216
+ config,
217
+ options,
218
+ deps
219
+ });
220
+ const internalFragment = hooksConfig?.internalFragment ?? (internalFragmentFactory ? internalFragmentFactory({
221
+ config,
222
+ options
223
+ }) : void 0);
224
+ function serviceTx(schema) {
225
+ const uow = storage.getStore()?.uow;
226
+ if (!uow) throw new Error("No UnitOfWork in context. Service must be called within a route handler OR using `withUnitOfWork`.");
227
+ return createServiceTxBuilder(schema, uow, hooksConfig?.hooks);
228
+ }
229
+ const serviceContext = { serviceTx };
230
+ function handlerTx(execOptions) {
231
+ const currentStorage = storage.getStore();
232
+ if (!currentStorage) throw new Error("No storage in context. Handler must be called within a request context.");
233
+ const userOnBeforeMutate = execOptions?.onBeforeMutate;
234
+ const userOnAfterMutate = execOptions?.onAfterMutate;
235
+ return createHandlerTxBuilder({
236
+ ...execOptions,
237
+ createUnitOfWork: () => {
238
+ currentStorage.uow.reset();
239
+ if (internalFragment) currentStorage.uow.registerSchema(internalFragment.$internal.deps.schema, internalFragment.$internal.deps.namespace);
240
+ return currentStorage.uow;
241
+ },
242
+ onBeforeMutate: (uow) => {
243
+ if (hooksConfig) prepareHookMutations(uow, hooksConfig);
244
+ if (userOnBeforeMutate) userOnBeforeMutate(uow);
245
+ },
246
+ onAfterMutate: async (uow) => {
247
+ if (hooksConfig?.scheduler) hooksConfig.scheduler.schedule().catch((error) => {
248
+ console.error("Durable hooks processing failed", error);
249
+ });
250
+ if (userOnAfterMutate) await userOnAfterMutate(uow);
251
+ }
252
+ });
253
+ }
254
+ return {
255
+ serviceContext,
256
+ handlerContext: { handlerTx }
257
+ };
258
+ }).build();
259
+ if (this.#hooksFactory) finalDef.internalDataFactory = ({ config, options, deps }) => ({ durableHooks: createHooksConfig({
260
+ config,
261
+ options,
262
+ deps
263
+ }) });
264
+ return {
265
+ ...finalDef,
204
266
  dependencies
205
267
  };
206
268
  }