@fragno-dev/db 0.2.1 → 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 (362) hide show
  1. package/.turbo/turbo-build.log +206 -140
  2. package/CHANGELOG.md +67 -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 +38 -28
  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 +45 -96
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  81. package/dist/db-fragment-definition-builder.js +121 -99
  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 +172 -9
  92. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  93. package/dist/fragments/internal-fragment.js +193 -74
  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 +47 -4
  106. package/dist/hooks/hooks.d.ts.map +1 -1
  107. package/dist/hooks/hooks.js +106 -39
  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 +17 -10
  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 +351 -100
  165. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  166. package/dist/query/unit-of-work/execute-unit-of-work.js +440 -267
  167. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  168. package/dist/query/unit-of-work/unit-of-work.d.ts +67 -22
  169. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  170. package/dist/query/unit-of-work/unit-of-work.js +110 -13
  171. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  172. package/dist/query/value-decoding.js +8 -5
  173. package/dist/query/value-decoding.js.map +1 -1
  174. package/dist/query/value-encoding.js +29 -9
  175. package/dist/query/value-encoding.js.map +1 -1
  176. package/dist/schema/create.d.ts +40 -14
  177. package/dist/schema/create.d.ts.map +1 -1
  178. package/dist/schema/create.js +82 -42
  179. package/dist/schema/create.js.map +1 -1
  180. package/dist/schema/generate-id.d.ts +20 -0
  181. package/dist/schema/generate-id.d.ts.map +1 -0
  182. package/dist/schema/generate-id.js +28 -0
  183. package/dist/schema/generate-id.js.map +1 -0
  184. package/dist/schema/type-conversion/create-sql-type-mapper.js +3 -2
  185. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  186. package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
  187. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  188. package/dist/schema/validator.d.ts +10 -0
  189. package/dist/schema/validator.d.ts.map +1 -0
  190. package/dist/schema/validator.js +123 -0
  191. package/dist/schema/validator.js.map +1 -0
  192. package/dist/schema-output/drizzle.d.ts +30 -0
  193. package/dist/schema-output/drizzle.d.ts.map +1 -0
  194. package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +82 -56
  195. package/dist/schema-output/drizzle.js.map +1 -0
  196. package/dist/schema-output/prisma.d.ts +17 -0
  197. package/dist/schema-output/prisma.d.ts.map +1 -0
  198. package/dist/schema-output/prisma.js +296 -0
  199. package/dist/schema-output/prisma.js.map +1 -0
  200. package/dist/util/default-database-adapter.js +61 -0
  201. package/dist/util/default-database-adapter.js.map +1 -0
  202. package/dist/with-database.d.ts +1 -1
  203. package/dist/with-database.d.ts.map +1 -1
  204. package/dist/with-database.js +12 -3
  205. package/dist/with-database.js.map +1 -1
  206. package/package.json +43 -28
  207. package/src/adapters/adapters.ts +30 -24
  208. package/src/adapters/drizzle/migrate-drizzle.test.ts +54 -33
  209. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +599 -0
  210. package/src/adapters/drizzle/test-utils.ts +12 -8
  211. package/src/adapters/generic-sql/driver-config.ts +38 -0
  212. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -5
  213. package/src/adapters/generic-sql/generic-sql-adapter.ts +110 -24
  214. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +54 -0
  215. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +231 -3
  216. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +118 -0
  217. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +26 -8
  218. package/src/adapters/generic-sql/migration/dialect/mysql.ts +46 -8
  219. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +25 -7
  220. package/src/adapters/generic-sql/migration/dialect/postgres.ts +8 -4
  221. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +47 -8
  222. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +27 -12
  223. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +128 -39
  224. package/src/adapters/generic-sql/migration/prepared-migrations.ts +15 -8
  225. package/src/adapters/generic-sql/migration/sql-generator.ts +142 -65
  226. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +9 -6
  227. package/src/adapters/generic-sql/query/cursor-utils.test.ts +271 -0
  228. package/src/adapters/generic-sql/query/cursor-utils.ts +41 -6
  229. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +27 -27
  230. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +38 -24
  231. package/src/adapters/generic-sql/query/select-builder.test.ts +15 -11
  232. package/src/adapters/generic-sql/query/select-builder.ts +6 -2
  233. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +52 -2
  234. package/src/adapters/generic-sql/query/sql-query-compiler.ts +50 -15
  235. package/src/adapters/generic-sql/query/where-builder.test.ts +91 -17
  236. package/src/adapters/generic-sql/query/where-builder.ts +90 -38
  237. package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +6 -6
  238. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +806 -0
  239. package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +11 -11
  240. package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +49 -35
  241. package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +48 -32
  242. package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +6 -6
  243. package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
  244. package/src/adapters/generic-sql/uow-decoder.test.ts +1 -1
  245. package/src/adapters/generic-sql/uow-decoder.ts +21 -3
  246. package/src/adapters/generic-sql/uow-encoder.test.ts +33 -2
  247. package/src/adapters/generic-sql/uow-encoder.ts +50 -11
  248. package/src/adapters/in-memory/condition-evaluator.test.ts +193 -0
  249. package/src/adapters/in-memory/condition-evaluator.ts +275 -0
  250. package/src/adapters/in-memory/errors.ts +20 -0
  251. package/src/adapters/in-memory/in-memory-adapter.ts +277 -0
  252. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +296 -0
  253. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +100 -0
  254. package/src/adapters/in-memory/in-memory-uow.ts +1348 -0
  255. package/src/adapters/in-memory/index.ts +3 -0
  256. package/src/adapters/in-memory/options.test.ts +41 -0
  257. package/src/adapters/in-memory/options.ts +87 -0
  258. package/src/adapters/in-memory/reference-resolution.test.ts +50 -0
  259. package/src/adapters/in-memory/reference-resolution.ts +67 -0
  260. package/src/adapters/in-memory/sorted-array-index.test.ts +123 -0
  261. package/src/adapters/in-memory/sorted-array-index.ts +228 -0
  262. package/src/adapters/in-memory/store.test.ts +68 -0
  263. package/src/adapters/in-memory/store.ts +145 -0
  264. package/src/adapters/in-memory/value-comparison.ts +53 -0
  265. package/src/adapters/in-memory/value-normalization.test.ts +57 -0
  266. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1163 -0
  267. package/src/adapters/shared/from-unit-of-work-compiler.ts +3 -1
  268. package/src/adapters/shared/uow-operation-compiler.ts +26 -16
  269. package/src/adapters/sql/index.ts +12 -0
  270. package/src/db-fragment-definition-builder.test.ts +88 -54
  271. package/src/db-fragment-definition-builder.ts +201 -322
  272. package/src/db-fragment-instantiator.test.ts +169 -101
  273. package/src/db-fragment-integration.test.ts +301 -149
  274. package/src/dispatchers/cloudflare-do/index.test.ts +73 -0
  275. package/src/dispatchers/cloudflare-do/index.ts +104 -0
  276. package/src/dispatchers/node/index.test.ts +91 -0
  277. package/src/dispatchers/node/index.ts +87 -0
  278. package/src/fragments/internal-fragment.routes.ts +42 -0
  279. package/src/fragments/internal-fragment.schema.ts +51 -0
  280. package/src/fragments/internal-fragment.test.ts +730 -274
  281. package/src/fragments/internal-fragment.ts +447 -154
  282. package/src/hooks/durable-hooks-processor.test.ts +117 -0
  283. package/src/hooks/durable-hooks-processor.ts +67 -0
  284. package/src/hooks/hooks.test.ts +411 -259
  285. package/src/hooks/hooks.ts +265 -66
  286. package/src/migration-engine/auto-from-schema.test.ts +14 -14
  287. package/src/migration-engine/auto-from-schema.ts +5 -2
  288. package/src/migration-engine/create.test.ts +2 -2
  289. package/src/migration-engine/generation-engine.test.ts +229 -104
  290. package/src/migration-engine/generation-engine.ts +94 -64
  291. package/src/migration-engine/shared.ts +1 -0
  292. package/src/mod.ts +78 -30
  293. package/src/naming/sql-naming.ts +180 -0
  294. package/src/outbox/outbox-builder.ts +241 -0
  295. package/src/outbox/outbox.test.ts +253 -0
  296. package/src/outbox/outbox.ts +137 -0
  297. package/src/query/column-defaults.ts +41 -3
  298. package/src/query/condition-builder.test.ts +3 -3
  299. package/src/query/cursor.test.ts +116 -18
  300. package/src/query/cursor.ts +75 -26
  301. package/src/query/db-now.ts +6 -0
  302. package/src/query/query-type.test.ts +2 -2
  303. package/src/query/serialize/create-sql-serializer.ts +7 -2
  304. package/src/query/serialize/dialect/mysql-serializer.ts +12 -4
  305. package/src/query/serialize/dialect/postgres-serializer.ts +34 -4
  306. package/src/query/serialize/dialect/sqlite-serializer.test.ts +51 -1
  307. package/src/query/serialize/dialect/sqlite-serializer.ts +92 -9
  308. package/src/query/serialize/sql-serializer.ts +4 -4
  309. package/src/query/simple-query-interface.ts +5 -0
  310. package/src/query/unit-of-work/execute-unit-of-work.test.ts +1512 -1458
  311. package/src/query/unit-of-work/execute-unit-of-work.ts +1708 -596
  312. package/src/query/unit-of-work/tx-builder.test.ts +1041 -0
  313. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +32 -32
  314. package/src/query/unit-of-work/unit-of-work-types.test.ts +1 -1
  315. package/src/query/unit-of-work/unit-of-work.test.ts +231 -36
  316. package/src/query/unit-of-work/unit-of-work.ts +229 -31
  317. package/src/query/value-decoding.test.ts +13 -2
  318. package/src/query/value-decoding.ts +17 -4
  319. package/src/query/value-encoding.test.ts +85 -2
  320. package/src/query/value-encoding.ts +56 -6
  321. package/src/schema/create.test.ts +129 -42
  322. package/src/schema/create.ts +187 -47
  323. package/src/schema/generate-id.test.ts +57 -0
  324. package/src/schema/generate-id.ts +38 -0
  325. package/src/schema/serialize.test.ts +14 -2
  326. package/src/schema/type-conversion/create-sql-type-mapper.ts +7 -2
  327. package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
  328. package/src/schema/type-conversion/type-mapping.test.ts +25 -1
  329. package/src/schema/validator.test.ts +197 -0
  330. package/src/schema/validator.ts +231 -0
  331. package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +179 -129
  332. package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +143 -93
  333. package/src/schema-output/prisma.test.ts +536 -0
  334. package/src/schema-output/prisma.ts +573 -0
  335. package/src/util/default-database-adapter.ts +106 -0
  336. package/src/with-database.ts +22 -3
  337. package/tsdown.config.ts +6 -4
  338. package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
  339. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
  340. package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
  341. package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
  342. package/dist/adapters/drizzle/generate.d.ts +0 -30
  343. package/dist/adapters/drizzle/generate.d.ts.map +0 -1
  344. package/dist/adapters/drizzle/generate.js.map +0 -1
  345. package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
  346. package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
  347. package/dist/adapters/kysely/kysely-adapter.js +0 -17
  348. package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
  349. package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
  350. package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
  351. package/dist/adapters/shared/table-name-mapper.js +0 -43
  352. package/dist/adapters/shared/table-name-mapper.js.map +0 -1
  353. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
  354. package/dist/schema-generator/schema-generator.d.ts +0 -15
  355. package/dist/schema-generator/schema-generator.d.ts.map +0 -1
  356. package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
  357. package/src/adapters/kysely/kysely-adapter.ts +0 -27
  358. package/src/adapters/shared/table-name-mapper.ts +0 -50
  359. package/src/schema-generator/schema-generator.ts +0 -12
  360. package/src/shared/config.ts +0 -10
  361. package/src/shared/connection-pool.ts +0 -24
  362. package/src/shared/prisma.ts +0 -45
@@ -5,6 +5,7 @@ import type {
5
5
  UOWCompiler,
6
6
  UOWDecoder,
7
7
  UOWExecutor,
8
+ UOWInstrumentation,
8
9
  ValidIndexName,
9
10
  } from "../../query/unit-of-work/unit-of-work";
10
11
  import { UnitOfWork } from "../../query/unit-of-work/unit-of-work";
@@ -25,6 +26,7 @@ export interface UnitOfWorkConfig {
25
26
  * since those have to be manually executed.
26
27
  */
27
28
  dryRun?: boolean;
29
+ instrumentation?: UOWInstrumentation;
28
30
  }
29
31
 
30
32
  /**
@@ -50,7 +52,7 @@ export interface UnitOfWorkFactory {
50
52
  /**
51
53
  * Optional WeakMap for schema-to-namespace lookups
52
54
  */
53
- schemaNamespaceMap?: WeakMap<AnySchema, string>;
55
+ schemaNamespaceMap?: WeakMap<AnySchema, string | null>;
54
56
  }
55
57
 
56
58
  /**
@@ -8,7 +8,7 @@ import type {
8
8
  } from "../../query/unit-of-work/unit-of-work";
9
9
  import { Cursor } from "../../query/cursor";
10
10
  import type { DriverConfig } from "../generic-sql/driver-config";
11
- import { createTableNameMapper, type TableNameMapper } from "./table-name-mapper";
11
+ import { createNamingResolver, type NamingResolver } from "../../naming/sql-naming";
12
12
 
13
13
  /**
14
14
  * Options for compiling a find operation with cursor pagination
@@ -55,24 +55,24 @@ export interface CursorConditionResult {
55
55
  */
56
56
  export abstract class UOWOperationCompiler<TCompiledQuery> {
57
57
  #driverConfig: DriverConfig;
58
- #mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined;
58
+ #resolverFactory?: (schema: AnySchema, namespace: string | null) => NamingResolver;
59
59
 
60
60
  constructor(
61
61
  driverConfig: DriverConfig,
62
- mapperFactory?: (namespace: string | undefined) => TableNameMapper | undefined,
62
+ resolverFactory?: (schema: AnySchema, namespace: string | null) => NamingResolver,
63
63
  ) {
64
64
  this.#driverConfig = driverConfig;
65
- this.#mapperFactory = mapperFactory;
65
+ this.#resolverFactory = resolverFactory;
66
66
  }
67
67
 
68
68
  protected get driverConfig(): DriverConfig {
69
69
  return this.#driverConfig;
70
70
  }
71
71
 
72
- protected get mapperFactory():
73
- | ((namespace: string | undefined) => TableNameMapper | undefined)
72
+ protected get resolverFactory():
73
+ | ((schema: AnySchema, namespace: string | null) => NamingResolver)
74
74
  | undefined {
75
- return this.#mapperFactory;
75
+ return this.#resolverFactory;
76
76
  }
77
77
 
78
78
  abstract compileCount(
@@ -105,12 +105,18 @@ export abstract class UOWOperationCompiler<TCompiledQuery> {
105
105
  /**
106
106
  * Get the mapper for a specific operation based on its namespace
107
107
  */
108
- protected getMapperForOperation(namespace: string | undefined): TableNameMapper | undefined {
109
- return this.#mapperFactory
110
- ? this.#mapperFactory(namespace)
111
- : namespace
112
- ? createTableNameMapper(namespace)
113
- : undefined;
108
+ protected getNamingResolver(
109
+ schema: AnySchema,
110
+ namespace: string | null | undefined,
111
+ ): NamingResolver {
112
+ if (this.#resolverFactory) {
113
+ return this.#resolverFactory(schema, namespace ?? null);
114
+ }
115
+ return createNamingResolver(
116
+ schema,
117
+ namespace ?? null,
118
+ this.#driverConfig.defaultNamingStrategy,
119
+ );
114
120
  }
115
121
 
116
122
  /**
@@ -154,9 +160,13 @@ export abstract class UOWOperationCompiler<TCompiledQuery> {
154
160
  /**
155
161
  * Get the physical table name for an operation, applying namespace mapping if needed
156
162
  */
157
- protected getPhysicalTableName(logicalName: string, namespace: string | undefined): string {
158
- const mapper = this.getMapperForOperation(namespace);
159
- return mapper ? mapper.toPhysical(logicalName) : logicalName;
163
+ protected getPhysicalTableName(
164
+ schema: AnySchema,
165
+ logicalName: string,
166
+ namespace: string | undefined,
167
+ ): string {
168
+ const resolver = this.getNamingResolver(schema, namespace ?? null);
169
+ return resolver.getTableName(logicalName);
160
170
  }
161
171
  }
162
172
 
@@ -0,0 +1,12 @@
1
+ export {
2
+ SqlAdapter,
3
+ type SqlAdapterOptions,
4
+ type UnitOfWorkConfig,
5
+ type OutboxConfig,
6
+ sqliteProfiles,
7
+ sqliteStorageDefault,
8
+ sqliteStoragePrisma,
9
+ type SQLiteStorageMode,
10
+ } from "../generic-sql/generic-sql-adapter";
11
+
12
+ export type { SQLiteProfile } from "../adapters";
@@ -1,3 +1,6 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
1
4
  import { describe, it, expect, vi, expectTypeOf } from "vitest";
2
5
  import { defineFragment } from "@fragno-dev/core";
3
6
  import {
@@ -8,9 +11,12 @@ import { withDatabase } from "./with-database";
8
11
  import { schema, column, idColumn } from "./schema/create";
9
12
  import type { SimpleQueryInterface } from "./query/simple-query-interface";
10
13
  import type { DatabaseAdapter } from "./adapters/adapters";
14
+ import * as executeUnitOfWork from "./query/unit-of-work/execute-unit-of-work";
15
+ import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
16
+ import { suffixNamingStrategy } from "./naming/sql-naming";
11
17
 
12
18
  // Create a test schema
13
- const testSchema = schema((s) => {
19
+ const testSchema = schema("test", (s) => {
14
20
  return s.addTable("users", (t) => {
15
21
  return t
16
22
  .addColumn("id", idColumn())
@@ -28,13 +34,17 @@ function createMockAdapter(): DatabaseAdapter {
28
34
  forSchema: vi.fn(),
29
35
  executeRetrieve: vi.fn(),
30
36
  executeMutations: vi.fn(),
37
+ registerSchema: vi.fn(),
38
+ reset: vi.fn(),
31
39
  })),
32
40
  } as unknown as SimpleQueryInterface<TestSchema>;
33
41
 
34
42
  return {
35
43
  createQueryEngine: vi.fn(() => mockdb),
36
- migrate: vi.fn(),
44
+ getSchemaVersion: vi.fn(async () => undefined),
37
45
  close: vi.fn(),
46
+ contextStorage: new RequestContextStorage(),
47
+ namingStrategy: suffixNamingStrategy,
38
48
  } as unknown as DatabaseAdapter;
39
49
  }
40
50
 
@@ -697,7 +707,7 @@ describe("DatabaseFragmentDefinitionBuilder", () => {
697
707
  expect(storage.uow).toBeDefined();
698
708
  });
699
709
 
700
- it("should provide DatabaseServiceContext with forSchema and DatabaseHandlerContext with executeRestrictedUnitOfWork", () => {
710
+ it("should provide DatabaseServiceContext with serviceTx and DatabaseHandlerContext with handlerTx", () => {
701
711
  const mockAdapter = createMockAdapter();
702
712
 
703
713
  const definition = withDatabase(testSchema)(defineFragment("db-frag")).build();
@@ -716,8 +726,8 @@ describe("DatabaseFragmentDefinitionBuilder", () => {
716
726
  storage: mockStorage,
717
727
  });
718
728
 
719
- expect(typeof contexts.serviceContext.uow).toBe("function");
720
- expect(typeof contexts.handlerContext.uow).toBe("function");
729
+ expect(typeof contexts.serviceContext.serviceTx).toBe("function");
730
+ expect(typeof contexts.handlerContext.handlerTx).toBe("function");
721
731
  });
722
732
  });
723
733
 
@@ -734,10 +744,7 @@ describe("DatabaseFragmentDefinitionBuilder", () => {
734
744
 
735
745
  const mockAdapter = createMockAdapter();
736
746
 
737
- const definition = withDatabase(
738
- testSchema,
739
- "my-namespace",
740
- )(defineFragment<Config>("complex-db-frag"))
747
+ const definition = withDatabase(testSchema)(defineFragment<Config>("complex-db-frag"))
741
748
  .withDependencies(({ config }) => ({
742
749
  connectionString: config.dbConnectionString,
743
750
  debug: config.debug,
@@ -805,17 +812,29 @@ describe("DatabaseFragmentDefinitionBuilder", () => {
805
812
  });
806
813
  });
807
814
 
808
- describe("error handling", () => {
809
- it("should throw error if database adapter is missing", () => {
815
+ describe("default adapter", () => {
816
+ it("should default to sqlite adapter when database adapter is missing", () => {
817
+ const previous = process.env["FRAGNO_DATA_DIR"];
818
+ const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "fragno-db-default-"));
819
+ process.env["FRAGNO_DATA_DIR"] = dataDir;
820
+
810
821
  const definition = withDatabase(testSchema)(defineFragment("db-frag")).build();
811
822
 
812
- expect(() => {
813
- definition.dependencies!({
823
+ try {
824
+ const deps = definition.dependencies!({
814
825
  config: {},
815
- // @ts-expect-error No databaseAdapter - intentionally invalid for runtime error test
816
826
  options: {},
817
827
  });
818
- }).toThrow("Database fragment requires a database adapter");
828
+
829
+ expect(deps.db).toBeDefined();
830
+ expect(deps.createUnitOfWork).toBeDefined();
831
+ } finally {
832
+ if (previous === undefined) {
833
+ delete process.env["FRAGNO_DATA_DIR"];
834
+ } else {
835
+ process.env["FRAGNO_DATA_DIR"] = previous;
836
+ }
837
+ }
819
838
  });
820
839
  });
821
840
 
@@ -845,43 +864,58 @@ describe("DatabaseFragmentDefinitionBuilder", () => {
845
864
  });
846
865
  });
847
866
 
848
- // describe("defineService", () => {
849
- // it("getUnitOfWork should be available in defineService", () => {
850
- // const mockAdapter = createMockAdapter();
851
-
852
- // const definition = withDatabase(testSchema)(defineFragment("db-frag"))
853
- // .withDependencies(() => ({ apiKey: "key" }))
854
- // .providesBaseService(({ deps, defineService }) => {
855
- // expect(deps.apiKey).toBe("key");
856
- // expect(deps.db).toBeDefined();
857
- // expect(defineService).toBeDefined();
858
-
859
- // return defineService({
860
- // getUsers: function () {
861
- // return typeof this.getUnitOfWork;
862
- // },
863
- // });
864
- // })
865
- // .build();
866
-
867
- // expect(definition.baseServices).toBeDefined();
868
-
869
- // // Get implicit deps first
870
- // const deps = definition.dependencies!({
871
- // config: {},
872
- // options: { databaseAdapter: mockAdapter },
873
- // });
874
-
875
- // const services = definition.baseServices!({
876
- // config: {},
877
- // options: { databaseAdapter: mockAdapter },
878
- // deps,
879
- // serviceDeps: {},
880
- // privateServices: {},
881
- // defineService: (svc) => svc,
882
- // });
883
-
884
- // expect(services.getUsers()).toBe("function");
885
- // });
886
- // });
867
+ describe("serviceTx hooks propagation", () => {
868
+ it("should pass hooks to createServiceTxBuilder", () => {
869
+ const mockAdapter = createMockAdapter();
870
+
871
+ // Define hooks type
872
+ type TestHooks = {
873
+ onUserCreated: (payload: { email: string }) => void;
874
+ };
875
+
876
+ // Create a fragment with hooks
877
+ const definition = withDatabase(testSchema)(defineFragment("db-frag-with-hooks"))
878
+ .provideHooks<TestHooks>(({ defineHook }) => ({
879
+ onUserCreated: defineHook(function (payload: { email: string }) {
880
+ // Hook implementation
881
+ console.log("User created:", payload.email);
882
+ }),
883
+ }))
884
+ .build();
885
+
886
+ // Create a mock storage
887
+ const mockStorage = {
888
+ getStore: () => ({
889
+ uow: mockAdapter.createQueryEngine(testSchema, "test").createUnitOfWork(),
890
+ }),
891
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
892
+ } as any;
893
+
894
+ // Spy on createServiceTxBuilder
895
+ const createServiceTxBuilderSpy = vi.spyOn(executeUnitOfWork, "createServiceTxBuilder");
896
+
897
+ // Get the contexts which includes serviceTx
898
+ const contexts = definition.createThisContext!({
899
+ config: {},
900
+ options: { databaseAdapter: mockAdapter },
901
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
902
+ deps: {} as any,
903
+ storage: mockStorage,
904
+ });
905
+
906
+ // Call serviceTx - this should pass hooks to createServiceTxBuilder
907
+ contexts.serviceContext.serviceTx(testSchema);
908
+
909
+ // Verify createServiceTxBuilder was called with 3 arguments (schema, uow, hooks)
910
+ expect(createServiceTxBuilderSpy).toHaveBeenCalledOnce();
911
+ const callArgs = createServiceTxBuilderSpy.mock.calls[0];
912
+ expect(callArgs).toHaveLength(3);
913
+ expect(callArgs[0]).toBe(testSchema); // schema
914
+ expect(callArgs[1]).toBeDefined(); // uow
915
+ expect(callArgs[2]).toBeDefined(); // hooks - this is what we're testing
916
+ expect(callArgs[2]).toHaveProperty("onUserCreated");
917
+
918
+ createServiceTxBuilderSpy.mockRestore();
919
+ });
920
+ });
887
921
  });