@fragno-dev/db 0.1.15 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/.turbo/turbo-build.log +242 -179
  2. package/CHANGELOG.md +23 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +5 -5
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -21
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -54
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +3 -0
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +36 -28
  14. package/dist/adapters/drizzle/generate.js.map +1 -1
  15. package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
  16. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
  17. package/dist/adapters/generic-sql/driver-config.js +94 -0
  18. package/dist/adapters/generic-sql/driver-config.js.map +1 -0
  19. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
  20. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
  21. package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
  22. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
  23. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
  24. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
  25. package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
  26. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
  27. package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
  28. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
  29. package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
  30. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
  31. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
  32. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
  33. package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
  34. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  35. package/dist/adapters/generic-sql/migration/executor.js +18 -0
  36. package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
  37. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  38. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  39. package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
  40. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
  41. package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
  42. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
  43. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
  44. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
  45. package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
  46. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
  47. package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
  48. package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
  49. package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
  50. package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
  51. package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
  52. package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
  53. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
  54. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
  55. package/dist/adapters/generic-sql/query/select-builder.js +69 -0
  56. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
  57. package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
  58. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
  59. package/dist/adapters/generic-sql/query/where-builder.js +129 -0
  60. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
  61. package/dist/adapters/generic-sql/result-interpreter.js +74 -0
  62. package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
  63. package/dist/adapters/generic-sql/uow-decoder.js +105 -0
  64. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
  65. package/dist/adapters/generic-sql/uow-encoder.js +93 -0
  66. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
  67. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -18
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -165
  70. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  71. package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +47 -61
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{drizzle/shared.d.ts → shared/table-name-mapper.d.ts} +2 -4
  74. package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
  75. package/dist/adapters/shared/table-name-mapper.js +43 -0
  76. package/dist/adapters/shared/table-name-mapper.js.map +1 -0
  77. package/dist/adapters/shared/uow-operation-compiler.js +105 -0
  78. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
  79. package/dist/db-fragment-definition-builder.d.ts +53 -19
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  81. package/dist/db-fragment-definition-builder.js +89 -19
  82. package/dist/db-fragment-definition-builder.js.map +1 -1
  83. package/dist/fragments/internal-fragment.d.ts +39 -5
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  85. package/dist/fragments/internal-fragment.js +82 -10
  86. package/dist/fragments/internal-fragment.js.map +1 -1
  87. package/dist/hooks/hooks.d.ts +51 -0
  88. package/dist/hooks/hooks.d.ts.map +1 -0
  89. package/dist/hooks/hooks.js +88 -0
  90. package/dist/hooks/hooks.js.map +1 -0
  91. package/dist/migration-engine/generation-engine.d.ts +0 -2
  92. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  93. package/dist/migration-engine/generation-engine.js +23 -61
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +34 -10
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +47 -16
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/{rou3@0.7.8 → rou3@0.7.10}/node_modules/rou3/dist/index.js +1 -1
  100. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
  101. package/dist/packages/fragno/dist/api/fragment-instantiator.js +69 -31
  102. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
  103. package/dist/query/column-defaults.js +27 -0
  104. package/dist/query/column-defaults.js.map +1 -0
  105. package/dist/query/cursor.d.ts +4 -4
  106. package/dist/query/cursor.d.ts.map +1 -1
  107. package/dist/query/cursor.js +8 -6
  108. package/dist/query/cursor.js.map +1 -1
  109. package/dist/query/orm/orm.d.ts +1 -1
  110. package/dist/query/orm/orm.js.map +1 -1
  111. package/dist/query/serialize/create-sql-serializer.js +30 -0
  112. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  113. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  114. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  115. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  116. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  117. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  118. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  119. package/dist/query/serialize/sql-serializer.js +67 -0
  120. package/dist/query/serialize/sql-serializer.js.map +1 -0
  121. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +5 -5
  122. package/dist/query/simple-query-interface.d.ts.map +1 -0
  123. package/dist/query/{execute-unit-of-work.d.ts → unit-of-work/execute-unit-of-work.d.ts} +13 -3
  124. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  125. package/dist/query/{execute-unit-of-work.js → unit-of-work/execute-unit-of-work.js} +17 -4
  126. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  127. package/dist/query/{retry-policy.d.ts → unit-of-work/retry-policy.d.ts} +1 -1
  128. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  129. package/dist/query/{retry-policy.js → unit-of-work/retry-policy.js} +1 -1
  130. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  131. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +51 -18
  132. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  133. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +58 -11
  134. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  135. package/dist/query/value-decoding.js +71 -0
  136. package/dist/query/value-decoding.js.map +1 -0
  137. package/dist/query/value-encoding.js +124 -0
  138. package/dist/query/value-encoding.js.map +1 -0
  139. package/dist/schema/create.d.ts +3 -0
  140. package/dist/schema/create.d.ts.map +1 -1
  141. package/dist/schema/create.js +4 -0
  142. package/dist/schema/create.js.map +1 -1
  143. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  144. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  145. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  146. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  147. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  148. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  149. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  150. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  151. package/dist/schema/type-conversion/type-mapping.js +63 -0
  152. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  153. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  154. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  155. package/dist/sql-driver/connection/connection-provider.js +19 -0
  156. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  157. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  158. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  159. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  160. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  161. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  162. package/dist/sql-driver/dialects/dialects.js +3 -0
  163. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  164. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  165. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  166. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  167. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  168. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  169. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  170. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  171. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  172. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  173. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  174. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  175. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  176. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  177. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  178. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  179. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  180. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  181. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  182. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  183. package/dist/sql-driver/sql-driver.d.ts +38 -0
  184. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  185. package/dist/sql-driver/sql-driver.js +1 -0
  186. package/dist/sql-driver/sql.js +50 -0
  187. package/dist/sql-driver/sql.js.map +1 -0
  188. package/dist/with-database.d.ts +6 -2
  189. package/dist/with-database.d.ts.map +1 -1
  190. package/dist/with-database.js +1 -1
  191. package/dist/with-database.js.map +1 -1
  192. package/package.json +37 -10
  193. package/src/adapters/adapters.ts +8 -5
  194. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +60 -169
  195. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +31 -55
  196. package/src/adapters/drizzle/drizzle-adapter.ts +15 -107
  197. package/src/adapters/drizzle/generate.test.ts +2 -2
  198. package/src/adapters/drizzle/generate.ts +78 -34
  199. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  200. package/src/adapters/drizzle/shared.ts +0 -34
  201. package/src/adapters/drizzle/test-utils.ts +3 -3
  202. package/src/adapters/generic-sql/README.md +14 -0
  203. package/src/adapters/generic-sql/driver-config.ts +144 -0
  204. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  205. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  206. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  207. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  208. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  209. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  210. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  211. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  212. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  213. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  214. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  215. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  216. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  217. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  218. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  219. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  220. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  221. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  222. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  223. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  224. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  225. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  226. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  227. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  228. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  229. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  230. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  231. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  232. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  233. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  234. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  235. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  236. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  237. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +26 -76
  238. package/src/adapters/kysely/{kysely-adapter-sqlite.test.ts → kysely-adapter-sqlocal.test.ts} +76 -17
  239. package/src/adapters/kysely/kysely-adapter.ts +10 -250
  240. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +110 -104
  241. package/src/adapters/shared/table-name-mapper.ts +50 -0
  242. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  243. package/src/db-fragment-definition-builder.test.ts +2 -2
  244. package/src/db-fragment-definition-builder.ts +281 -50
  245. package/src/db-fragment-instantiator.test.ts +78 -2
  246. package/src/db-fragment-integration.test.ts +14 -16
  247. package/src/fragments/internal-fragment.test.ts +434 -45
  248. package/src/fragments/internal-fragment.ts +184 -20
  249. package/src/hooks/hooks.test.ts +575 -0
  250. package/src/hooks/hooks.ts +179 -0
  251. package/src/migration-engine/generation-engine.test.ts +44 -54
  252. package/src/migration-engine/generation-engine.ts +48 -94
  253. package/src/mod.ts +117 -29
  254. package/src/query/column-defaults.ts +49 -0
  255. package/src/query/cursor.test.ts +31 -6
  256. package/src/query/cursor.ts +11 -7
  257. package/src/query/orm/orm.ts +1 -1
  258. package/src/query/query-type.test.ts +9 -9
  259. package/src/query/serialize/create-sql-serializer.ts +34 -0
  260. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  261. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  262. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  263. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  264. package/src/query/serialize/sql-serializer.ts +143 -0
  265. package/src/query/{query.ts → simple-query-interface.ts} +2 -2
  266. package/src/query/{execute-unit-of-work.test.ts → unit-of-work/execute-unit-of-work.test.ts} +16 -16
  267. package/src/query/{execute-unit-of-work.ts → unit-of-work/execute-unit-of-work.ts} +49 -8
  268. package/src/query/{unit-of-work-coordinator.test.ts → unit-of-work/unit-of-work-coordinator.test.ts} +41 -43
  269. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +5 -3
  270. package/src/query/{unit-of-work.test.ts → unit-of-work/unit-of-work.test.ts} +100 -9
  271. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +135 -32
  272. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -427
  273. package/src/query/value-decoding.ts +113 -0
  274. package/src/query/value-encoding.test.ts +390 -0
  275. package/src/query/value-encoding.ts +168 -0
  276. package/src/schema/create.test.ts +5 -1
  277. package/src/schema/create.ts +5 -0
  278. package/src/schema/serialize.test.ts +165 -407
  279. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  280. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  281. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  282. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  283. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  284. package/src/schema/type-conversion/type-mapping.ts +153 -0
  285. package/src/shared/connection-pool.ts +5 -5
  286. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  287. package/src/sql-driver/connection/connection-provider.ts +27 -0
  288. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  289. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  290. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  291. package/src/sql-driver/dialects/dialects.ts +1 -0
  292. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  293. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  294. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  295. package/src/sql-driver/query-executor/plugin.ts +22 -0
  296. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  297. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  298. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  299. package/src/sql-driver/sql-driver.ts +53 -0
  300. package/src/sql-driver/sql.ts +57 -0
  301. package/src/sql-driver/sqlocal.test.ts +117 -0
  302. package/src/with-database.ts +35 -23
  303. package/tsdown.config.ts +7 -2
  304. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  305. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  306. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  307. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  308. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  309. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  310. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  311. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -334
  312. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  313. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -123
  314. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  315. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -160
  316. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  317. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  318. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  319. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  320. package/dist/adapters/drizzle/shared.js +0 -35
  321. package/dist/adapters/drizzle/shared.js.map +0 -1
  322. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  323. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  324. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  325. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  326. package/dist/adapters/kysely/kysely-query-compiler.js +0 -67
  327. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  328. package/dist/adapters/kysely/kysely-query.d.ts +0 -23
  329. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  330. package/dist/adapters/kysely/kysely-query.js +0 -230
  331. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  332. package/dist/adapters/kysely/kysely-shared.d.ts +0 -14
  333. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  334. package/dist/adapters/kysely/kysely-shared.js +0 -33
  335. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  336. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -193
  337. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  338. package/dist/adapters/kysely/kysely-uow-executor.js +0 -93
  339. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  340. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  341. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  342. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  343. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  344. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  345. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  346. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  347. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  348. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  349. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  350. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  351. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  352. package/dist/adapters/kysely/migration/execute.js +0 -34
  353. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  354. package/dist/migration-engine/create.d.ts +0 -37
  355. package/dist/migration-engine/create.d.ts.map +0 -1
  356. package/dist/migration-engine/create.js +0 -58
  357. package/dist/migration-engine/create.js.map +0 -1
  358. package/dist/migration-engine/shared.d.ts +0 -112
  359. package/dist/migration-engine/shared.d.ts.map +0 -1
  360. package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +0 -1
  361. package/dist/query/execute-unit-of-work.d.ts.map +0 -1
  362. package/dist/query/execute-unit-of-work.js.map +0 -1
  363. package/dist/query/query.d.ts.map +0 -1
  364. package/dist/query/result-transform.js +0 -170
  365. package/dist/query/result-transform.js.map +0 -1
  366. package/dist/query/retry-policy.d.ts.map +0 -1
  367. package/dist/query/retry-policy.js.map +0 -1
  368. package/dist/query/unit-of-work.d.ts.map +0 -1
  369. package/dist/query/unit-of-work.js.map +0 -1
  370. package/dist/schema/serialize.js +0 -111
  371. package/dist/schema/serialize.js.map +0 -1
  372. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -122
  373. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  374. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  375. package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +0 -1442
  376. package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +0 -1414
  377. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1400
  378. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -677
  379. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -228
  380. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -309
  381. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  382. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  383. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  384. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  385. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  386. package/src/adapters/kysely/kysely-query-compiler.ts +0 -127
  387. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  388. package/src/adapters/kysely/kysely-query.ts +0 -399
  389. package/src/adapters/kysely/kysely-shared.ts +0 -57
  390. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -986
  391. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -350
  392. package/src/adapters/kysely/kysely-uow-executor.ts +0 -164
  393. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -794
  394. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  395. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  396. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  397. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  398. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  399. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  400. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  401. package/src/adapters/kysely/migration/execute.ts +0 -50
  402. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  403. package/src/query/result-transform.ts +0 -274
  404. package/src/schema/serialize.ts +0 -407
  405. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
  406. /package/src/query/{retry-policy.test.ts → unit-of-work/retry-policy.test.ts} +0 -0
  407. /package/src/query/{retry-policy.ts → unit-of-work/retry-policy.ts} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, vi, assert, expectTypeOf } from "vitest";
2
- import { schema, idColumn, FragnoId } from "../schema/create";
2
+ import { schema, idColumn, FragnoId } from "../../schema/create";
3
3
  import {
4
4
  createUnitOfWork,
5
5
  type TypedUnitOfWork,
@@ -118,7 +118,11 @@ function createMockCompiler(): UOWCompiler<unknown> {
118
118
 
119
119
  // Mock decoder that returns raw results as-is
120
120
  function createMockDecoder(): UOWDecoder {
121
- return (rawResults) => rawResults;
121
+ return {
122
+ decode(rawResults) {
123
+ return rawResults;
124
+ },
125
+ };
122
126
  }
123
127
 
124
128
  // Helper to create a UOW factory that tracks how many times it's called
@@ -838,7 +842,7 @@ describe("executeRestrictedUnitOfWork", () => {
838
842
  });
839
843
 
840
844
  describe("error handling", () => {
841
- it("should throw error from callback", async () => {
845
+ it("should throw error from callback immediately without retry", async () => {
842
846
  const { factory, callCount } = createMockUOWFactory([{ success: true }]);
843
847
 
844
848
  await expect(
@@ -848,13 +852,13 @@ describe("executeRestrictedUnitOfWork", () => {
848
852
  },
849
853
  { createUnitOfWork: factory },
850
854
  ),
851
- ).rejects.toThrow("Unit of Work execution failed: optimistic concurrency conflict");
855
+ ).rejects.toThrow("Callback error");
852
856
 
853
- // Should attempt retries even on callback errors
854
- expect(callCount.value).toBe(6); // Initial + 5 retries (default)
857
+ // Should NOT retry non-conflict errors
858
+ expect(callCount.value).toBe(1); // Only initial attempt
855
859
  });
856
860
 
857
- it("should wrap callback error as cause", async () => {
861
+ it("should throw callback error directly", async () => {
858
862
  const { factory } = createMockUOWFactory([{ success: true }]);
859
863
  const originalError = new Error("Original error");
860
864
 
@@ -870,8 +874,8 @@ describe("executeRestrictedUnitOfWork", () => {
870
874
  );
871
875
  expect.fail("Should have thrown");
872
876
  } catch (error) {
873
- expect(error).toBeInstanceOf(Error);
874
- expect((error as Error).cause).toBe(originalError);
877
+ // Error should be thrown directly, not wrapped
878
+ expect(error).toBe(originalError);
875
879
  }
876
880
  });
877
881
  });
@@ -1292,19 +1296,15 @@ describe("executeRestrictedUnitOfWork", () => {
1292
1296
  );
1293
1297
  expect.fail("Should have thrown an error");
1294
1298
  } catch (error) {
1295
- // The error should be wrapped by executeRestrictedUnitOfWork
1299
+ // The error should be thrown directly (not wrapped) since it's not a concurrency conflict
1296
1300
  expect(error).toBeInstanceOf(Error);
1297
- // Check that the original error is in the cause chain
1298
- expect((error as Error).cause).toBeInstanceOf(Error);
1299
- expect(((error as Error).cause as Error).message).toContain(
1300
- 'relation "settings" does not exist',
1301
- );
1301
+ expect((error as Error).message).toContain('relation "settings" does not exist');
1302
1302
  deferred.resolve((error as Error).message);
1303
1303
  }
1304
1304
 
1305
1305
  // Verify no unhandled rejection occurred
1306
1306
  // If the test completes without throwing, the promise rejection was properly handled
1307
- expect(await deferred.promise).toContain("Unit of Work execution failed");
1307
+ expect(await deferred.promise).toContain('relation "settings" does not exist');
1308
1308
  });
1309
1309
  });
1310
1310
  });
@@ -1,7 +1,19 @@
1
- import type { AnySchema } from "../schema/create";
1
+ import type { AnySchema } from "../../schema/create";
2
2
  import type { TypedUnitOfWork, IUnitOfWork } from "./unit-of-work";
3
+ import type { HooksMap } from "../../hooks/hooks";
3
4
  import { NoRetryPolicy, ExponentialBackoffRetryPolicy, type RetryPolicy } from "./retry-policy";
4
- import type { FragnoId } from "../schema/create";
5
+ import type { FragnoId } from "../../schema/create";
6
+
7
+ /**
8
+ * Error thrown when a Unit of Work execution fails due to optimistic concurrency conflict.
9
+ * This error triggers automatic retry behavior in executeRestrictedUnitOfWork.
10
+ */
11
+ export class ConcurrencyConflictError extends Error {
12
+ constructor(message = "Optimistic concurrency conflict detected") {
13
+ super(message);
14
+ this.name = "ConcurrencyConflictError";
15
+ }
16
+ }
5
17
 
6
18
  /**
7
19
  * Type utility that unwraps promises 1 level deep in objects, arrays, or direct promises
@@ -330,6 +342,18 @@ export interface ExecuteRestrictedUnitOfWorkOptions {
330
342
  * Abort signal to cancel execution
331
343
  */
332
344
  signal?: AbortSignal;
345
+
346
+ /**
347
+ * Callback invoked before mutations are executed.
348
+ * Use this to add additional mutation operations (e.g., hook event records).
349
+ */
350
+ onBeforeMutate?: (uow: IUnitOfWork) => void;
351
+
352
+ /**
353
+ * Callback invoked after successful mutation phase.
354
+ * Use this for post-mutation processing like hook execution.
355
+ */
356
+ onSuccess?: (uow: IUnitOfWork) => Promise<void>;
333
357
  }
334
358
 
335
359
  /**
@@ -370,9 +394,12 @@ export interface ExecuteRestrictedUnitOfWorkOptions {
370
394
  * );
371
395
  * ```
372
396
  */
373
- export async function executeRestrictedUnitOfWork<TResult>(
397
+ export async function executeRestrictedUnitOfWork<TResult, THooks extends HooksMap = {}>(
374
398
  callback: (context: {
375
- forSchema: <S extends AnySchema>(schema: S) => TypedUnitOfWork<S, [], unknown>;
399
+ forSchema: <S extends AnySchema, H extends HooksMap = THooks>(
400
+ schema: S,
401
+ hooks?: H,
402
+ ) => TypedUnitOfWork<S, [], unknown, H>;
376
403
  executeRetrieve: () => Promise<void>;
377
404
  executeMutate: () => Promise<void>;
378
405
  nonce: string;
@@ -401,10 +428,9 @@ export async function executeRestrictedUnitOfWork<TResult>(
401
428
  // Create a fresh UOW for this attempt
402
429
  const baseUow = options.createUnitOfWork();
403
430
 
404
- // Create context object with forSchema, executeRetrieve, executeMutate, nonce, and currentAttempt
405
431
  const context = {
406
- forSchema: <S extends AnySchema>(schema: S) => {
407
- return baseUow.forSchema(schema);
432
+ forSchema: <S extends AnySchema, H extends HooksMap = THooks>(schema: S, hooks?: H) => {
433
+ return baseUow.forSchema(schema, hooks);
408
434
  },
409
435
  executeRetrieve: async () => {
410
436
  await baseUow.executeRetrieve();
@@ -418,9 +444,18 @@ export async function executeRestrictedUnitOfWork<TResult>(
418
444
  await baseUow.executeRetrieve();
419
445
  }
420
446
 
447
+ // Add hook mutations before executing
448
+ if (options.onBeforeMutate) {
449
+ options.onBeforeMutate(baseUow);
450
+ }
451
+
421
452
  const result = await baseUow.executeMutations();
422
453
  if (!result.success) {
423
- throw new Error("Mutations failed due to conflict");
454
+ throw new ConcurrencyConflictError();
455
+ }
456
+
457
+ if (options.onSuccess) {
458
+ await options.onSuccess(baseUow);
424
459
  }
425
460
  },
426
461
  nonce: baseUow.nonce,
@@ -440,6 +475,12 @@ export async function executeRestrictedUnitOfWork<TResult>(
440
475
  throw new Error("Unit of Work execution aborted");
441
476
  }
442
477
 
478
+ // Only retry concurrency conflicts, not other errors
479
+ if (!(error instanceof ConcurrencyConflictError)) {
480
+ // Not a concurrency conflict - throw immediately without retry
481
+ throw error;
482
+ }
483
+
443
484
  if (!retryPolicy.shouldRetry(attempt, error, signal)) {
444
485
  // No more retries - check again if aborted or throw conflict error
445
486
  if (signal?.aborted) {
@@ -1,42 +1,38 @@
1
1
  import { describe, it, expect } from "vitest";
2
- import { schema, idColumn, type FragnoId, referenceColumn } from "../schema/create";
2
+ import { schema, idColumn, type FragnoId, referenceColumn } from "../../schema/create";
3
3
  import {
4
4
  type UOWCompiler,
5
5
  type UOWDecoder,
6
6
  createUnitOfWork,
7
- type RetrievalOperation,
8
- type MutationOperation,
9
7
  type CompiledMutation,
8
+ type UOWExecutor,
10
9
  } from "./unit-of-work";
11
- import type { AnySchema } from "../schema/create";
12
-
13
- // Mock compiler that tracks operations
14
- function createMockCompiler(): UOWCompiler<string> {
15
- return {
16
- compileRetrievalOperation: (op: RetrievalOperation<AnySchema>) => {
17
- return `SELECT from ${op.table.ormName}`;
18
- },
19
- compileMutationOperation: (op: MutationOperation<AnySchema>) => {
20
- return {
21
- query: `${op.type.toUpperCase()} ${op.table}`,
22
- expectedAffectedRows: op.type === "create" ? null : op.type === "check" ? null : 1,
23
- expectedReturnedRows: op.type === "check" ? 1 : null,
24
- };
25
- },
26
- };
10
+ import { GenericSQLUOWOperationCompiler } from "../../adapters/generic-sql/query/generic-sql-uow-operation-compiler";
11
+ import { BetterSQLite3DriverConfig } from "../../adapters/generic-sql/driver-config";
12
+ import { createUOWCompilerFromOperationCompiler } from "../../adapters/shared/uow-operation-compiler";
13
+ import type { CompiledQuery } from "../../sql-driver/sql-driver";
14
+
15
+ // Create compiler using actual implementation
16
+ function createCompiler(): UOWCompiler<CompiledQuery> {
17
+ const driverConfig = new BetterSQLite3DriverConfig();
18
+ const operationCompiler = new GenericSQLUOWOperationCompiler(driverConfig);
19
+ return createUOWCompilerFromOperationCompiler(operationCompiler);
27
20
  }
28
21
 
29
- // Mock executor that tracks execution
30
- function createMockExecutor() {
22
+ // Mock executor that tracks execution and works with CompiledQuery
23
+ function createMockExecutor(): UOWExecutor<CompiledQuery, unknown> & {
24
+ getLog: () => string[];
25
+ clearLog: () => void;
26
+ } {
31
27
  const executionLog: string[] = [];
32
28
 
33
29
  return {
34
- executeRetrievalPhase: async (queries: string[]) => {
30
+ executeRetrievalPhase: async (queries: CompiledQuery[]) => {
35
31
  executionLog.push(`RETRIEVAL: ${queries.length} queries`);
36
32
  // Return mock results for each query
37
33
  return queries.map(() => [{ id: "mock-id", name: "Mock User" }]);
38
34
  },
39
- executeMutationPhase: async (mutations: CompiledMutation<string>[]) => {
35
+ executeMutationPhase: async (mutations: CompiledMutation<CompiledQuery>[]) => {
40
36
  executionLog.push(`MUTATION: ${mutations.length} mutations`);
41
37
  return {
42
38
  success: true,
@@ -51,11 +47,13 @@ function createMockExecutor() {
51
47
  }
52
48
 
53
49
  function createMockDecoder(): UOWDecoder {
54
- return (rawResults, operations) => {
55
- if (rawResults.length !== operations.length) {
56
- throw new Error("rawResults and operations must have the same length");
57
- }
58
- return rawResults;
50
+ return {
51
+ decode(rawResults, operations) {
52
+ if (rawResults.length !== operations.length) {
53
+ throw new Error("rawResults and operations must have the same length");
54
+ }
55
+ return rawResults;
56
+ },
59
57
  };
60
58
  }
61
59
 
@@ -68,7 +66,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
68
66
  );
69
67
 
70
68
  const executor = createMockExecutor();
71
- const parentUow = createUnitOfWork(createMockCompiler(), executor, createMockDecoder());
69
+ const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
72
70
 
73
71
  // Simulate service method 1: adds retrieval operation via child UOW
74
72
  const serviceMethod1 = () => {
@@ -120,7 +118,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
120
118
  );
121
119
 
122
120
  const executor = createMockExecutor();
123
- const parentUow = createUnitOfWork(createMockCompiler(), executor, createMockDecoder());
121
+ const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
124
122
 
125
123
  // Service A: Get user by ID, awaits retrieval phase
126
124
  const getUserById = async (userId: string) => {
@@ -205,7 +203,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
205
203
  );
206
204
 
207
205
  const executor = createMockExecutor();
208
- const parentUow = createUnitOfWork(createMockCompiler(), executor, createMockDecoder());
206
+ const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
209
207
 
210
208
  // Service A: Check if user exists
211
209
  const validateUser = async (userId: string) => {
@@ -327,7 +325,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
327
325
  );
328
326
 
329
327
  const executor = createMockExecutor();
330
- const parentUow = createUnitOfWork(createMockCompiler(), executor, createMockDecoder());
328
+ const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
331
329
 
332
330
  // Level 1: Handler (root)
333
331
  const handler = async () => {
@@ -440,7 +438,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
440
438
  );
441
439
 
442
440
  const executor = createMockExecutor();
443
- const parentUow = createUnitOfWork(createMockCompiler(), executor, createMockDecoder());
441
+ const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
444
442
 
445
443
  // Service method that creates TWO sibling child UOWs
446
444
  const processUserOrder = async (email: string) => {
@@ -548,13 +546,13 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
548
546
 
549
547
  // Create mock executor that returns account data with low balance
550
548
  const executionLog: string[] = [];
551
- const customExecutor = {
552
- executeRetrievalPhase: async (queries: string[]) => {
549
+ const customExecutor: UOWExecutor<CompiledQuery, unknown> = {
550
+ executeRetrievalPhase: async (queries: CompiledQuery[]) => {
553
551
  executionLog.push(`RETRIEVAL: ${queries.length} queries`);
554
552
  // Return mock account data with balance field set to low value
555
553
  return queries.map(() => [{ id: "mock-id", userId: "user-1", balance: 100 }]);
556
554
  },
557
- executeMutationPhase: async (mutations: CompiledMutation<string>[]) => {
555
+ executeMutationPhase: async (mutations: CompiledMutation<CompiledQuery>[]) => {
558
556
  executionLog.push(`MUTATION: ${mutations.length} mutations`);
559
557
  return {
560
558
  success: true,
@@ -563,7 +561,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
563
561
  },
564
562
  };
565
563
 
566
- const parentUow = createUnitOfWork(createMockCompiler(), customExecutor, createMockDecoder());
564
+ const parentUow = createUnitOfWork(createCompiler(), customExecutor, createMockDecoder());
567
565
 
568
566
  // Service: Get account balance
569
567
  const getAccountBalance = async (userId: string) => {
@@ -654,7 +652,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
654
652
  );
655
653
 
656
654
  const executor = createMockExecutor();
657
- const parentUow = createUnitOfWork(createMockCompiler(), executor, createMockDecoder());
655
+ const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
658
656
 
659
657
  // Service A: Validates user and throws if not active
660
658
  const validateActiveUser = async (userId: string) => {
@@ -726,7 +724,7 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
726
724
 
727
725
  it("should inherit nonce from parent to children for idempotent operations", () => {
728
726
  const executor = createMockExecutor();
729
- const parentUow = createUnitOfWork(createMockCompiler(), executor, createMockDecoder());
727
+ const parentUow = createUnitOfWork(createCompiler(), executor, createMockDecoder());
730
728
 
731
729
  // Parent UOW should have a nonce
732
730
  const parentNonce = parentUow.nonce;
@@ -756,8 +754,8 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
756
754
  const executor = createMockExecutor();
757
755
 
758
756
  // Create two separate parent UOWs
759
- const parentUow1 = createUnitOfWork(createMockCompiler(), executor, createMockDecoder());
760
- const parentUow2 = createUnitOfWork(createMockCompiler(), executor, createMockDecoder());
757
+ const parentUow1 = createUnitOfWork(createCompiler(), executor, createMockDecoder());
758
+ const parentUow2 = createUnitOfWork(createCompiler(), executor, createMockDecoder());
761
759
 
762
760
  // They should have different nonces
763
761
  expect(parentUow1.nonce).not.toBe(parentUow2.nonce);
@@ -783,14 +781,14 @@ describe("UOW Coordinator - Parent-Child Execution", () => {
783
781
  );
784
782
 
785
783
  // Create executor that throws "table does not exist" error
786
- const failingExecutor = {
784
+ const failingExecutor: UOWExecutor<CompiledQuery, unknown> = {
787
785
  executeRetrievalPhase: async () => {
788
786
  throw new Error('relation "settings" does not exist');
789
787
  },
790
788
  executeMutationPhase: async () => ({ success: true, createdInternalIds: [] }),
791
789
  };
792
790
 
793
- const parentUow = createUnitOfWork(createMockCompiler(), failingExecutor, createMockDecoder());
791
+ const parentUow = createUnitOfWork(createCompiler(), failingExecutor, createMockDecoder());
794
792
 
795
793
  // Service method that awaits retrievalPhase (simulating settingsService.get())
796
794
  const getSettingValue = async (key: string) => {
@@ -1,7 +1,7 @@
1
1
  import { describe, expectTypeOf, it } from "vitest";
2
- import { column, idColumn, referenceColumn, schema } from "../schema/create";
2
+ import { column, idColumn, referenceColumn, schema } from "../../schema/create";
3
3
  import { JoinFindBuilder, UnitOfWork } from "./unit-of-work";
4
- import type { FragnoId, FragnoReference } from "../schema/create";
4
+ import type { FragnoId, FragnoReference } from "../../schema/create";
5
5
 
6
6
  type Prettify<T> = {
7
7
  [K in keyof T]: T[K];
@@ -94,7 +94,9 @@ describe("UnitOfWork type tests", () => {
94
94
  executeRetrievalPhase: async () => [],
95
95
  executeMutationPhase: async () => ({ success: true, createdInternalIds: [] }),
96
96
  };
97
- const mockDecoder = () => [];
97
+ const mockDecoder = {
98
+ decode: () => [],
99
+ };
98
100
  return new UnitOfWork(mockCompiler, mockExecutor, mockDecoder).forSchema(testSchema);
99
101
  }
100
102
 
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, assert, expectTypeOf } from "vitest";
2
- import { column, schema, idColumn, FragnoId } from "../schema/create";
2
+ import { column, schema, idColumn, FragnoId } from "../../schema/create";
3
3
  import {
4
4
  type UOWCompiler,
5
5
  type UOWDecoder,
@@ -7,8 +7,8 @@ import {
7
7
  type InferIdColumnName,
8
8
  type IndexColumns,
9
9
  } from "./unit-of-work";
10
- import { createIndexedBuilder } from "./condition-builder";
11
- import type { AbstractQuery } from "./query";
10
+ import { createIndexedBuilder } from "../condition-builder";
11
+ import type { SimpleQueryInterface } from "../simple-query-interface";
12
12
 
13
13
  // Mock compiler and executor for testing
14
14
  function createMockCompiler(): UOWCompiler<unknown> {
@@ -26,11 +26,13 @@ function createMockExecutor() {
26
26
  }
27
27
 
28
28
  function createMockDecoder(): UOWDecoder {
29
- return (rawResults, operations) => {
30
- if (rawResults.length !== operations.length) {
31
- throw new Error("rawResults and operations must have the same length");
32
- }
33
- return rawResults;
29
+ return {
30
+ decode(rawResults, operations) {
31
+ if (rawResults.length !== operations.length) {
32
+ throw new Error("rawResults and operations must have the same length");
33
+ }
34
+ return rawResults;
35
+ },
34
36
  };
35
37
  }
36
38
 
@@ -119,6 +121,50 @@ describe("FindBuilder", () => {
119
121
  expect(op.options.pageSize).toBe(5);
120
122
  });
121
123
 
124
+ it("should throw RangeError for pageSize <= 0", () => {
125
+ const testSchema = schema((s) =>
126
+ s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
127
+ );
128
+
129
+ const uow = createUnitOfWork(createMockCompiler(), createMockExecutor(), createMockDecoder());
130
+
131
+ expect(() => {
132
+ uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(0));
133
+ }).toThrow(RangeError);
134
+
135
+ expect(() => {
136
+ uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(-1));
137
+ }).toThrow(RangeError);
138
+
139
+ expect(() => {
140
+ uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(-10));
141
+ }).toThrow(RangeError);
142
+ });
143
+
144
+ it("should throw RangeError for non-integer pageSize", () => {
145
+ const testSchema = schema((s) =>
146
+ s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
147
+ );
148
+
149
+ const uow = createUnitOfWork(createMockCompiler(), createMockExecutor(), createMockDecoder());
150
+
151
+ expect(() => {
152
+ uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(1.5));
153
+ }).toThrow(RangeError);
154
+
155
+ expect(() => {
156
+ uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(3.14));
157
+ }).toThrow(RangeError);
158
+
159
+ expect(() => {
160
+ uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(NaN));
161
+ }).toThrow(RangeError);
162
+
163
+ expect(() => {
164
+ uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary").pageSize(Infinity));
165
+ }).toThrow(RangeError);
166
+ });
167
+
122
168
  it("should throw if index doesn't exist", () => {
123
169
  const testSchema = schema((s) =>
124
170
  s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
@@ -406,6 +452,51 @@ describe("FindBuilder", () => {
406
452
  expect(joinOptions.limit).toBe(5);
407
453
  });
408
454
 
455
+ it("should throw RangeError for invalid pageSize in join", () => {
456
+ const testSchema = schema((s) =>
457
+ s
458
+ .addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string"))
459
+ .addTable("posts", (t) =>
460
+ t
461
+ .addColumn("id", idColumn())
462
+ .addColumn("userId", column("string"))
463
+ .addColumn("title", "string")
464
+ .createIndex("idx_user", ["userId"]),
465
+ )
466
+ .addReference("user", {
467
+ type: "one",
468
+ from: { table: "posts", column: "userId" },
469
+ to: { table: "users", column: "id" },
470
+ }),
471
+ );
472
+
473
+ const uow = createUnitOfWork(createMockCompiler(), createMockExecutor(), createMockDecoder());
474
+
475
+ expect(() => {
476
+ uow
477
+ .forSchema(testSchema)
478
+ .find("posts", (b) =>
479
+ b.whereIndex("primary").join((jb) => jb["user"]((builder) => builder.pageSize(0))),
480
+ );
481
+ }).toThrow(RangeError);
482
+
483
+ expect(() => {
484
+ uow
485
+ .forSchema(testSchema)
486
+ .find("posts", (b) =>
487
+ b.whereIndex("primary").join((jb) => jb["user"]((builder) => builder.pageSize(-5))),
488
+ );
489
+ }).toThrow(RangeError);
490
+
491
+ expect(() => {
492
+ uow
493
+ .forSchema(testSchema)
494
+ .find("posts", (b) =>
495
+ b.whereIndex("primary").join((jb) => jb["user"]((builder) => builder.pageSize(2.5))),
496
+ );
497
+ }).toThrow(RangeError);
498
+ });
499
+
409
500
  it("should support nested joins", () => {
410
501
  const testSchema = schema((s) =>
411
502
  s
@@ -648,7 +739,7 @@ describe("IndexedConditionBuilder", () => {
648
739
  );
649
740
  const uow = baseUow.forSchema(typeTestSchema);
650
741
  expectTypeOf<keyof typeof typeTestSchema.tables>().toEqualTypeOf<"users">();
651
- type _Query = AbstractQuery<typeof typeTestSchema>;
742
+ type _Query = SimpleQueryInterface<typeof typeTestSchema>;
652
743
  expectTypeOf<Parameters<_Query["create"]>[0]>().toEqualTypeOf<"users">();
653
744
 
654
745
  expectTypeOf<Parameters<typeof uow.find>[0]>().toEqualTypeOf<"users">();