@fragno-dev/db 0.1.14 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. package/.turbo/turbo-build.log +242 -139
  2. package/CHANGELOG.md +47 -0
  3. package/README.md +123 -8
  4. package/dist/adapters/adapters.d.ts +19 -5
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts +6 -19
  8. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js +7 -47
  10. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  11. package/dist/adapters/drizzle/generate.d.ts +7 -1
  12. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  13. package/dist/adapters/drizzle/generate.js +46 -45
  14. package/dist/adapters/drizzle/generate.js.map +1 -1
  15. package/dist/adapters/generic-sql/driver-config.d.ts +74 -0
  16. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -0
  17. package/dist/adapters/generic-sql/driver-config.js +94 -0
  18. package/dist/adapters/generic-sql/driver-config.js.map +1 -0
  19. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +43 -0
  20. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -0
  21. package/dist/adapters/generic-sql/generic-sql-adapter.js +87 -0
  22. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -0
  23. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +67 -0
  24. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -0
  25. package/dist/adapters/generic-sql/migration/cold-kysely.js +33 -0
  26. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -0
  27. package/dist/adapters/generic-sql/migration/dialect/mysql.js +60 -0
  28. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -0
  29. package/dist/adapters/generic-sql/migration/dialect/postgres.js +59 -0
  30. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -0
  31. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +96 -0
  32. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -0
  33. package/dist/adapters/generic-sql/migration/executor.d.ts +15 -0
  34. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  35. package/dist/adapters/generic-sql/migration/executor.js +18 -0
  36. package/dist/adapters/generic-sql/migration/executor.js.map +1 -0
  37. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  38. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  39. package/dist/adapters/generic-sql/migration/prepared-migrations.js +68 -0
  40. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -0
  41. package/dist/adapters/generic-sql/migration/sql-generator.js +212 -0
  42. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -0
  43. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +32 -0
  44. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -0
  45. package/dist/adapters/generic-sql/query/cursor-utils.js +37 -0
  46. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -0
  47. package/dist/adapters/generic-sql/query/dialect/mysql.js +33 -0
  48. package/dist/adapters/generic-sql/query/dialect/mysql.js.map +1 -0
  49. package/dist/adapters/generic-sql/query/dialect/postgres.js +32 -0
  50. package/dist/adapters/generic-sql/query/dialect/postgres.js.map +1 -0
  51. package/dist/adapters/generic-sql/query/dialect/sqlite.js +32 -0
  52. package/dist/adapters/generic-sql/query/dialect/sqlite.js.map +1 -0
  53. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +152 -0
  54. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -0
  55. package/dist/adapters/generic-sql/query/select-builder.js +69 -0
  56. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -0
  57. package/dist/adapters/generic-sql/query/sql-query-compiler.js +145 -0
  58. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -0
  59. package/dist/adapters/generic-sql/query/where-builder.js +129 -0
  60. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -0
  61. package/dist/adapters/generic-sql/result-interpreter.js +74 -0
  62. package/dist/adapters/generic-sql/result-interpreter.js.map +1 -0
  63. package/dist/adapters/generic-sql/uow-decoder.js +105 -0
  64. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -0
  65. package/dist/adapters/generic-sql/uow-encoder.js +93 -0
  66. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -0
  67. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -16
  68. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  69. package/dist/adapters/kysely/kysely-adapter.js +6 -159
  70. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  71. package/dist/adapters/{drizzle/drizzle-query.js → shared/from-unit-of-work-compiler.js} +48 -62
  72. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -0
  73. package/dist/adapters/{kysely/kysely-shared.d.ts → shared/table-name-mapper.d.ts} +3 -2
  74. package/dist/adapters/shared/table-name-mapper.d.ts.map +1 -0
  75. package/dist/adapters/shared/table-name-mapper.js +43 -0
  76. package/dist/adapters/shared/table-name-mapper.js.map +1 -0
  77. package/dist/adapters/shared/uow-operation-compiler.js +105 -0
  78. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -0
  79. package/dist/db-fragment-definition-builder.d.ts +186 -0
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -0
  81. package/dist/db-fragment-definition-builder.js +207 -0
  82. package/dist/db-fragment-definition-builder.js.map +1 -0
  83. package/dist/fragments/internal-fragment.d.ts +53 -0
  84. package/dist/fragments/internal-fragment.d.ts.map +1 -0
  85. package/dist/fragments/internal-fragment.js +111 -0
  86. package/dist/fragments/internal-fragment.js.map +1 -0
  87. package/dist/hooks/hooks.d.ts +51 -0
  88. package/dist/hooks/hooks.d.ts.map +1 -0
  89. package/dist/hooks/hooks.js +88 -0
  90. package/dist/hooks/hooks.js.map +1 -0
  91. package/dist/migration-engine/generation-engine.d.ts +0 -2
  92. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  93. package/dist/migration-engine/generation-engine.js +38 -56
  94. package/dist/migration-engine/generation-engine.js.map +1 -1
  95. package/dist/mod.d.ts +35 -23
  96. package/dist/mod.d.ts.map +1 -1
  97. package/dist/mod.js +48 -45
  98. package/dist/mod.js.map +1 -1
  99. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +165 -0
  100. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +1 -0
  101. package/dist/packages/fragno/dist/api/bind-services.js +20 -0
  102. package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
  103. package/dist/packages/fragno/dist/api/error.js +48 -0
  104. package/dist/packages/fragno/dist/api/error.js.map +1 -0
  105. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
  106. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
  107. package/dist/packages/fragno/dist/api/fragment-instantiator.js +525 -0
  108. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
  109. package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
  110. package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
  111. package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
  112. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
  113. package/dist/packages/fragno/dist/api/internal/route.js +10 -0
  114. package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
  115. package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
  116. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
  117. package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
  118. package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
  119. package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
  120. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
  121. package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
  122. package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
  123. package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
  124. package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
  125. package/dist/packages/fragno/dist/api/route.js +17 -0
  126. package/dist/packages/fragno/dist/api/route.js.map +1 -0
  127. package/dist/packages/fragno/dist/internal/symbols.js +10 -0
  128. package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
  129. package/dist/query/column-defaults.js +27 -0
  130. package/dist/query/column-defaults.js.map +1 -0
  131. package/dist/query/cursor.d.ts +14 -6
  132. package/dist/query/cursor.d.ts.map +1 -1
  133. package/dist/query/cursor.js +16 -7
  134. package/dist/query/cursor.js.map +1 -1
  135. package/dist/query/orm/orm.d.ts +1 -1
  136. package/dist/query/orm/orm.js.map +1 -1
  137. package/dist/query/serialize/create-sql-serializer.js +30 -0
  138. package/dist/query/serialize/create-sql-serializer.js.map +1 -0
  139. package/dist/query/serialize/dialect/mysql-serializer.js +87 -0
  140. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -0
  141. package/dist/query/serialize/dialect/postgres-serializer.js +80 -0
  142. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -0
  143. package/dist/query/serialize/dialect/sqlite-serializer.js +93 -0
  144. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -0
  145. package/dist/query/serialize/sql-serializer.js +67 -0
  146. package/dist/query/serialize/sql-serializer.js.map +1 -0
  147. package/dist/query/{query.d.ts → simple-query-interface.d.ts} +6 -6
  148. package/dist/query/simple-query-interface.d.ts.map +1 -0
  149. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +133 -0
  150. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  151. package/dist/query/unit-of-work/execute-unit-of-work.js +197 -0
  152. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  153. package/dist/query/unit-of-work/retry-policy.d.ts +88 -0
  154. package/dist/query/unit-of-work/retry-policy.d.ts.map +1 -0
  155. package/dist/query/unit-of-work/retry-policy.js +61 -0
  156. package/dist/query/unit-of-work/retry-policy.js.map +1 -0
  157. package/dist/query/{unit-of-work.d.ts → unit-of-work/unit-of-work.d.ts} +145 -58
  158. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  159. package/dist/query/{unit-of-work.js → unit-of-work/unit-of-work.js} +435 -198
  160. package/dist/query/unit-of-work/unit-of-work.js.map +1 -0
  161. package/dist/query/value-decoding.js +71 -0
  162. package/dist/query/value-decoding.js.map +1 -0
  163. package/dist/query/value-encoding.js +124 -0
  164. package/dist/query/value-encoding.js.map +1 -0
  165. package/dist/schema/create.d.ts +3 -0
  166. package/dist/schema/create.d.ts.map +1 -1
  167. package/dist/schema/create.js +4 -0
  168. package/dist/schema/create.js.map +1 -1
  169. package/dist/schema/type-conversion/create-sql-type-mapper.js +29 -0
  170. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -0
  171. package/dist/schema/type-conversion/dialect/mysql.js +57 -0
  172. package/dist/schema/type-conversion/dialect/mysql.js.map +1 -0
  173. package/dist/schema/type-conversion/dialect/postgres.js +56 -0
  174. package/dist/schema/type-conversion/dialect/postgres.js.map +1 -0
  175. package/dist/schema/type-conversion/dialect/sqlite.js +52 -0
  176. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -0
  177. package/dist/schema/type-conversion/type-mapping.js +63 -0
  178. package/dist/schema/type-conversion/type-mapping.js.map +1 -0
  179. package/dist/sql-driver/connection/connection-provider.d.ts +13 -0
  180. package/dist/sql-driver/connection/connection-provider.d.ts.map +1 -0
  181. package/dist/sql-driver/connection/connection-provider.js +19 -0
  182. package/dist/sql-driver/connection/connection-provider.js.map +1 -0
  183. package/dist/sql-driver/connection/single-connection-provider.js +23 -0
  184. package/dist/sql-driver/connection/single-connection-provider.js.map +1 -0
  185. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  186. package/dist/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  187. package/dist/sql-driver/dialects/dialects.d.ts +2 -0
  188. package/dist/sql-driver/dialects/dialects.js +3 -0
  189. package/dist/sql-driver/dialects/durable-object-dialect.d.ts +72 -0
  190. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -0
  191. package/dist/sql-driver/dialects/durable-object-dialect.js +130 -0
  192. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -0
  193. package/dist/sql-driver/driver/runtime-driver.d.ts +23 -0
  194. package/dist/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  195. package/dist/sql-driver/driver/runtime-driver.js +56 -0
  196. package/dist/sql-driver/driver/runtime-driver.js.map +1 -0
  197. package/dist/sql-driver/query-executor/default-query-executor.js +26 -0
  198. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -0
  199. package/dist/sql-driver/query-executor/plugin.d.ts +17 -0
  200. package/dist/sql-driver/query-executor/plugin.d.ts.map +1 -0
  201. package/dist/sql-driver/query-executor/query-executor-base.js +25 -0
  202. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -0
  203. package/dist/sql-driver/query-executor/query-executor.d.ts +36 -0
  204. package/dist/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  205. package/dist/sql-driver/sql-driver-adapter.d.ts +29 -0
  206. package/dist/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  207. package/dist/sql-driver/sql-driver-adapter.js +68 -0
  208. package/dist/sql-driver/sql-driver-adapter.js.map +1 -0
  209. package/dist/sql-driver/sql-driver.d.ts +38 -0
  210. package/dist/sql-driver/sql-driver.d.ts.map +1 -0
  211. package/dist/sql-driver/sql-driver.js +1 -0
  212. package/dist/sql-driver/sql.js +50 -0
  213. package/dist/sql-driver/sql.js.map +1 -0
  214. package/dist/with-database.d.ts +32 -0
  215. package/dist/with-database.d.ts.map +1 -0
  216. package/dist/with-database.js +34 -0
  217. package/dist/with-database.js.map +1 -0
  218. package/package.json +43 -9
  219. package/src/adapters/adapters.ts +23 -4
  220. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +140 -185
  221. package/src/adapters/drizzle/{drizzle-adapter-sqlite.test.ts → drizzle-adapter-sqlite3.test.ts} +187 -55
  222. package/src/adapters/drizzle/drizzle-adapter.ts +14 -93
  223. package/src/adapters/drizzle/generate.test.ts +102 -269
  224. package/src/adapters/drizzle/generate.ts +89 -63
  225. package/src/adapters/drizzle/migrate-drizzle.test.ts +19 -0
  226. package/src/adapters/drizzle/shared.ts +0 -34
  227. package/src/adapters/drizzle/test-utils.ts +36 -5
  228. package/src/adapters/generic-sql/README.md +14 -0
  229. package/src/adapters/generic-sql/driver-config.ts +144 -0
  230. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +50 -0
  231. package/src/adapters/generic-sql/generic-sql-adapter.ts +146 -0
  232. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +130 -0
  233. package/src/adapters/generic-sql/migration/cold-kysely.ts +55 -0
  234. package/src/adapters/{kysely/migration/execute-mysql.test.ts → generic-sql/migration/dialect/mysql.test.ts} +342 -484
  235. package/src/adapters/generic-sql/migration/dialect/mysql.ts +104 -0
  236. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +1008 -0
  237. package/src/adapters/generic-sql/migration/dialect/postgres.ts +113 -0
  238. package/src/adapters/{kysely/migration/execute-sqlite.test.ts → generic-sql/migration/dialect/sqlite.test.ts} +307 -510
  239. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +189 -0
  240. package/src/adapters/generic-sql/migration/executor.ts +33 -0
  241. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +661 -0
  242. package/src/adapters/generic-sql/migration/prepared-migrations.ts +214 -0
  243. package/src/adapters/generic-sql/migration/sql-generator.ts +413 -0
  244. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +36 -0
  245. package/src/adapters/generic-sql/query/cursor-utils.ts +56 -0
  246. package/src/adapters/generic-sql/query/dialect/mysql.ts +34 -0
  247. package/src/adapters/generic-sql/query/dialect/postgres.ts +32 -0
  248. package/src/adapters/generic-sql/query/dialect/sqlite.ts +32 -0
  249. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +1568 -0
  250. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +314 -0
  251. package/src/adapters/generic-sql/query/select-builder.test.ts +256 -0
  252. package/src/adapters/generic-sql/query/select-builder.ts +137 -0
  253. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +195 -0
  254. package/src/adapters/generic-sql/query/sql-query-compiler.ts +367 -0
  255. package/src/adapters/generic-sql/query/where-builder.test.ts +744 -0
  256. package/src/adapters/generic-sql/query/where-builder.ts +211 -0
  257. package/src/adapters/generic-sql/result-interpreter.ts +102 -0
  258. package/src/adapters/generic-sql/test/generic-drizzle-adapter-sqlite3.test.ts +899 -0
  259. package/src/adapters/generic-sql/uow-decoder.test.ts +399 -0
  260. package/src/adapters/generic-sql/uow-decoder.ts +152 -0
  261. package/src/adapters/generic-sql/uow-encoder.test.ts +183 -0
  262. package/src/adapters/generic-sql/uow-encoder.ts +131 -0
  263. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +90 -96
  264. package/src/adapters/kysely/kysely-adapter-sqlocal.test.ts +215 -0
  265. package/src/adapters/kysely/kysely-adapter.ts +10 -242
  266. package/src/adapters/{drizzle/drizzle-query.ts → shared/from-unit-of-work-compiler.ts} +111 -106
  267. package/src/adapters/shared/table-name-mapper.ts +50 -0
  268. package/src/adapters/shared/uow-operation-compiler.ts +211 -0
  269. package/src/db-fragment-definition-builder.test.ts +887 -0
  270. package/src/db-fragment-definition-builder.ts +737 -0
  271. package/src/db-fragment-instantiator.test.ts +543 -0
  272. package/src/db-fragment-integration.test.ts +406 -0
  273. package/src/fragments/internal-fragment.test.ts +549 -0
  274. package/src/fragments/internal-fragment.ts +249 -0
  275. package/src/hooks/hooks.test.ts +575 -0
  276. package/src/hooks/hooks.ts +179 -0
  277. package/src/migration-engine/generation-engine.test.ts +60 -27
  278. package/src/migration-engine/generation-engine.ts +99 -92
  279. package/src/mod.ts +139 -78
  280. package/src/query/column-defaults.ts +49 -0
  281. package/src/query/cursor.test.ts +147 -3
  282. package/src/query/cursor.ts +25 -8
  283. package/src/query/orm/orm.ts +1 -1
  284. package/src/query/query-type.test.ts +9 -9
  285. package/src/query/serialize/create-sql-serializer.ts +34 -0
  286. package/src/query/serialize/dialect/mysql-serializer.ts +142 -0
  287. package/src/query/serialize/dialect/postgres-serializer.ts +129 -0
  288. package/src/query/serialize/dialect/sqlite-serializer.test.ts +251 -0
  289. package/src/query/serialize/dialect/sqlite-serializer.ts +156 -0
  290. package/src/query/serialize/sql-serializer.ts +143 -0
  291. package/src/query/{query.ts → simple-query-interface.ts} +4 -4
  292. package/src/query/unit-of-work/execute-unit-of-work.test.ts +1310 -0
  293. package/src/query/unit-of-work/execute-unit-of-work.ts +504 -0
  294. package/src/query/unit-of-work/retry-policy.test.ts +217 -0
  295. package/src/query/unit-of-work/retry-policy.ts +141 -0
  296. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +831 -0
  297. package/src/query/{unit-of-work-types.test.ts → unit-of-work/unit-of-work-types.test.ts} +7 -5
  298. package/src/query/unit-of-work/unit-of-work.test.ts +1716 -0
  299. package/src/query/{unit-of-work.ts → unit-of-work/unit-of-work.ts} +716 -420
  300. package/src/query/{result-transform.test.ts → value-decoding.test.ts} +45 -298
  301. package/src/query/value-decoding.ts +113 -0
  302. package/src/query/value-encoding.test.ts +390 -0
  303. package/src/query/value-encoding.ts +168 -0
  304. package/src/schema/create.test.ts +5 -1
  305. package/src/schema/create.ts +5 -0
  306. package/src/schema/serialize.test.ts +165 -407
  307. package/src/schema/type-conversion/create-sql-type-mapper.ts +28 -0
  308. package/src/schema/type-conversion/dialect/mysql.ts +64 -0
  309. package/src/schema/type-conversion/dialect/postgres.ts +62 -0
  310. package/src/schema/type-conversion/dialect/sqlite.ts +63 -0
  311. package/src/schema/type-conversion/type-mapping.test.ts +137 -0
  312. package/src/schema/type-conversion/type-mapping.ts +153 -0
  313. package/src/shared/connection-pool.ts +5 -5
  314. package/src/sql-driver/better-sqlite3.test.ts +126 -0
  315. package/src/sql-driver/connection/connection-provider.ts +27 -0
  316. package/src/sql-driver/connection/single-connection-provider.ts +42 -0
  317. package/src/sql-driver/dialect-adapter/dialect-adapter.ts +9 -0
  318. package/src/sql-driver/dialect-adapter/sqlite-dialect-adapter.ts +7 -0
  319. package/src/sql-driver/dialects/dialects.ts +1 -0
  320. package/src/sql-driver/dialects/durable-object-dialect.ts +260 -0
  321. package/src/sql-driver/driver/runtime-driver.ts +91 -0
  322. package/src/sql-driver/query-executor/default-query-executor.ts +38 -0
  323. package/src/sql-driver/query-executor/plugin.ts +22 -0
  324. package/src/sql-driver/query-executor/query-executor-base.ts +53 -0
  325. package/src/sql-driver/query-executor/query-executor.ts +44 -0
  326. package/src/sql-driver/sql-driver-adapter.ts +96 -0
  327. package/src/sql-driver/sql-driver.ts +53 -0
  328. package/src/sql-driver/sql.ts +57 -0
  329. package/src/sql-driver/sqlocal.test.ts +117 -0
  330. package/src/with-database.ts +152 -0
  331. package/tsdown.config.ts +8 -2
  332. package/dist/adapters/drizzle/drizzle-connection-pool.js +0 -40
  333. package/dist/adapters/drizzle/drizzle-connection-pool.js.map +0 -1
  334. package/dist/adapters/drizzle/drizzle-query.d.ts +0 -23
  335. package/dist/adapters/drizzle/drizzle-query.d.ts.map +0 -1
  336. package/dist/adapters/drizzle/drizzle-query.js.map +0 -1
  337. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -10
  338. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +0 -1
  339. package/dist/adapters/drizzle/drizzle-uow-compiler.js +0 -315
  340. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +0 -1
  341. package/dist/adapters/drizzle/drizzle-uow-decoder.js +0 -116
  342. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +0 -1
  343. package/dist/adapters/drizzle/drizzle-uow-executor.js +0 -149
  344. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +0 -1
  345. package/dist/adapters/drizzle/join-column-utils.js +0 -28
  346. package/dist/adapters/drizzle/join-column-utils.js.map +0 -1
  347. package/dist/adapters/drizzle/shared.d.ts +0 -14
  348. package/dist/adapters/drizzle/shared.d.ts.map +0 -1
  349. package/dist/adapters/drizzle/shared.js +0 -35
  350. package/dist/adapters/drizzle/shared.js.map +0 -1
  351. package/dist/adapters/kysely/kysely-connection-pool.js +0 -41
  352. package/dist/adapters/kysely/kysely-connection-pool.js.map +0 -1
  353. package/dist/adapters/kysely/kysely-query-builder.js +0 -321
  354. package/dist/adapters/kysely/kysely-query-builder.js.map +0 -1
  355. package/dist/adapters/kysely/kysely-query-compiler.js +0 -66
  356. package/dist/adapters/kysely/kysely-query-compiler.js.map +0 -1
  357. package/dist/adapters/kysely/kysely-query.d.ts +0 -22
  358. package/dist/adapters/kysely/kysely-query.d.ts.map +0 -1
  359. package/dist/adapters/kysely/kysely-query.js +0 -223
  360. package/dist/adapters/kysely/kysely-query.js.map +0 -1
  361. package/dist/adapters/kysely/kysely-shared.d.ts.map +0 -1
  362. package/dist/adapters/kysely/kysely-shared.js +0 -18
  363. package/dist/adapters/kysely/kysely-shared.js.map +0 -1
  364. package/dist/adapters/kysely/kysely-uow-compiler.js +0 -170
  365. package/dist/adapters/kysely/kysely-uow-compiler.js.map +0 -1
  366. package/dist/adapters/kysely/kysely-uow-executor.js +0 -89
  367. package/dist/adapters/kysely/kysely-uow-executor.js.map +0 -1
  368. package/dist/adapters/kysely/migration/execute-base.js +0 -128
  369. package/dist/adapters/kysely/migration/execute-base.js.map +0 -1
  370. package/dist/adapters/kysely/migration/execute-factory.js +0 -34
  371. package/dist/adapters/kysely/migration/execute-factory.js.map +0 -1
  372. package/dist/adapters/kysely/migration/execute-mssql.js +0 -112
  373. package/dist/adapters/kysely/migration/execute-mssql.js.map +0 -1
  374. package/dist/adapters/kysely/migration/execute-mysql.js +0 -93
  375. package/dist/adapters/kysely/migration/execute-mysql.js.map +0 -1
  376. package/dist/adapters/kysely/migration/execute-postgres.js +0 -104
  377. package/dist/adapters/kysely/migration/execute-postgres.js.map +0 -1
  378. package/dist/adapters/kysely/migration/execute-sqlite.js +0 -123
  379. package/dist/adapters/kysely/migration/execute-sqlite.js.map +0 -1
  380. package/dist/adapters/kysely/migration/execute.js +0 -34
  381. package/dist/adapters/kysely/migration/execute.js.map +0 -1
  382. package/dist/bind-services.d.ts +0 -7
  383. package/dist/bind-services.d.ts.map +0 -1
  384. package/dist/bind-services.js +0 -14
  385. package/dist/bind-services.js.map +0 -1
  386. package/dist/fragment.d.ts +0 -173
  387. package/dist/fragment.d.ts.map +0 -1
  388. package/dist/fragment.js +0 -191
  389. package/dist/fragment.js.map +0 -1
  390. package/dist/migration-engine/create.d.ts +0 -37
  391. package/dist/migration-engine/create.d.ts.map +0 -1
  392. package/dist/migration-engine/create.js +0 -58
  393. package/dist/migration-engine/create.js.map +0 -1
  394. package/dist/migration-engine/shared.d.ts +0 -112
  395. package/dist/migration-engine/shared.d.ts.map +0 -1
  396. package/dist/query/query.d.ts.map +0 -1
  397. package/dist/query/result-transform.js +0 -168
  398. package/dist/query/result-transform.js.map +0 -1
  399. package/dist/query/unit-of-work.d.ts.map +0 -1
  400. package/dist/query/unit-of-work.js.map +0 -1
  401. package/dist/schema/serialize.js +0 -106
  402. package/dist/schema/serialize.js.map +0 -1
  403. package/dist/shared/settings-schema.js +0 -36
  404. package/dist/shared/settings-schema.js.map +0 -1
  405. package/src/adapters/drizzle/drizzle-adapter.test.ts +0 -170
  406. package/src/adapters/drizzle/drizzle-connection-pool.ts +0 -66
  407. package/src/adapters/drizzle/drizzle-query.test.ts +0 -499
  408. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +0 -1383
  409. package/src/adapters/drizzle/drizzle-uow-compiler.ts +0 -636
  410. package/src/adapters/drizzle/drizzle-uow-decoder.ts +0 -218
  411. package/src/adapters/drizzle/drizzle-uow-executor.ts +0 -276
  412. package/src/adapters/drizzle/join-column-utils.test.ts +0 -79
  413. package/src/adapters/drizzle/join-column-utils.ts +0 -39
  414. package/src/adapters/kysely/kysely-connection-pool.ts +0 -70
  415. package/src/adapters/kysely/kysely-query-builder.test.ts +0 -1344
  416. package/src/adapters/kysely/kysely-query-builder.ts +0 -666
  417. package/src/adapters/kysely/kysely-query-compiler.ts +0 -132
  418. package/src/adapters/kysely/kysely-query.test.ts +0 -498
  419. package/src/adapters/kysely/kysely-query.ts +0 -390
  420. package/src/adapters/kysely/kysely-shared.ts +0 -23
  421. package/src/adapters/kysely/kysely-uow-compiler.test.ts +0 -998
  422. package/src/adapters/kysely/kysely-uow-compiler.ts +0 -318
  423. package/src/adapters/kysely/kysely-uow-executor.ts +0 -145
  424. package/src/adapters/kysely/kysely-uow-joins.test.ts +0 -811
  425. package/src/adapters/kysely/migration/execute-base.ts +0 -256
  426. package/src/adapters/kysely/migration/execute-factory.ts +0 -53
  427. package/src/adapters/kysely/migration/execute-mssql.ts +0 -250
  428. package/src/adapters/kysely/migration/execute-mysql.ts +0 -211
  429. package/src/adapters/kysely/migration/execute-postgres.test.ts +0 -2657
  430. package/src/adapters/kysely/migration/execute-postgres.ts +0 -234
  431. package/src/adapters/kysely/migration/execute-sqlite.ts +0 -247
  432. package/src/adapters/kysely/migration/execute.ts +0 -50
  433. package/src/adapters/kysely/migration/kysely-migrator.test.ts +0 -261
  434. package/src/bind-services.test.ts +0 -214
  435. package/src/bind-services.ts +0 -37
  436. package/src/db-fragment.test.ts +0 -800
  437. package/src/fragment.ts +0 -727
  438. package/src/query/result-transform.ts +0 -271
  439. package/src/query/unit-of-work-multi-schema.test.ts +0 -64
  440. package/src/query/unit-of-work.test.ts +0 -943
  441. package/src/schema/serialize.ts +0 -396
  442. package/src/shared/settings-schema.ts +0 -61
  443. package/src/uow-context-integration.test.ts +0 -102
  444. package/src/uow-context.test.ts +0 -182
  445. /package/dist/query/{query.js → simple-query-interface.js} +0 -0
@@ -1,261 +0,0 @@
1
- import { Kysely, PostgresDialect, SqliteDialect } from "kysely";
2
- import { describe, expect, beforeAll, test } from "vitest";
3
- import { KyselyAdapter } from "../kysely-adapter";
4
- import { column, idColumn, referenceColumn, schema } from "../../../schema/create";
5
-
6
- describe("KyselyMigrator", () => {
7
- const testSchema = schema((s) => {
8
- return s
9
- .addTable("users", (t) => {
10
- return t.addColumn("id", idColumn()).addColumn("name", column("string"));
11
- })
12
- .alterTable("users", (t) => {
13
- return t
14
- .addColumn("age", column("integer").nullable())
15
- .createIndex("name_idx", ["name"])
16
- .createIndex("age_idx", ["age"]);
17
- })
18
- .addTable("posts", (t) => {
19
- return t
20
- .addColumn("id", idColumn())
21
- .addColumn("title", column("string"))
22
- .addColumn("user_id", column("string"));
23
- })
24
- .addReference("author", {
25
- type: "one",
26
- from: { table: "posts", column: "user_id" },
27
- to: { table: "users", column: "id" },
28
- });
29
- });
30
-
31
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
- let db: Kysely<any>;
33
- let adapter: KyselyAdapter;
34
-
35
- beforeAll(async () => {
36
- // Create a Kysely instance with a PostgresDialect, but not actually connected to a database
37
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
- db = new Kysely({ dialect: new PostgresDialect({} as any) });
39
- adapter = new KyselyAdapter({ db, provider: "postgresql" });
40
- });
41
-
42
- test("generate SQL for migration 0 -> 1 (create users table)", async () => {
43
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
44
- const preparedMigration = await migrator.prepareMigrationTo(1, {
45
- updateSettings: true,
46
- fromVersion: 0,
47
- });
48
-
49
- expect(preparedMigration.operations.length).toBeGreaterThan(0);
50
- const sql = preparedMigration.getSQL?.();
51
- expect(sql).toBeDefined();
52
- expect(sql).toMatchInlineSnapshot(`
53
- "create table "users_test_namespace" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
54
-
55
- insert into "fragno_db_settings" ("id", "key", "value") values ('jprP_43K5uMwxAFiepbbrQ', 'test_namespace.schema_version', '1');"
56
- `);
57
- });
58
-
59
- test("generate SQL for migration 0 -> 2 (create users table and add age)", async () => {
60
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
61
- const preparedMigration = await migrator.prepareMigrationTo(2, {
62
- updateSettings: true,
63
- fromVersion: 0,
64
- });
65
-
66
- expect(preparedMigration.operations.length).toBeGreaterThan(0);
67
- const sql = preparedMigration.getSQL?.();
68
- expect(sql).toBeDefined();
69
- expect(sql).toMatchInlineSnapshot(`
70
- "create table "users_test_namespace" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
71
-
72
- alter table "users_test_namespace" add column "age" integer;
73
-
74
- create index "name_idx" on "users_test_namespace" ("name");
75
-
76
- create index "age_idx" on "users_test_namespace" ("age");
77
-
78
- insert into "fragno_db_settings" ("id", "key", "value") values ('jprP_43K5uMwxAFiepbbrQ', 'test_namespace.schema_version', '2');"
79
- `);
80
- });
81
-
82
- test("generate SQL for migration 1 -> 2 (add age column and indexes)", async () => {
83
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
84
- const preparedMigration = await migrator.prepareMigrationTo(2, {
85
- updateSettings: true,
86
- fromVersion: 1,
87
- });
88
-
89
- expect(preparedMigration.operations.length).toBeGreaterThan(0);
90
- const sql = preparedMigration.getSQL?.();
91
- expect(sql).toBeDefined();
92
- expect(sql).toMatchInlineSnapshot(`
93
- "alter table "users_test_namespace" add column "age" integer;
94
-
95
- create index "name_idx" on "users_test_namespace" ("name");
96
-
97
- create index "age_idx" on "users_test_namespace" ("age");
98
-
99
- update "fragno_db_settings" set "value" = '2' where "key" = 'test_namespace.schema_version';"
100
- `);
101
- });
102
-
103
- test("generate SQL for migration 0 -> 3 (full schema)", async () => {
104
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
105
- const preparedMigration = await migrator.prepareMigrationTo(3, {
106
- updateSettings: true,
107
- fromVersion: 0,
108
- });
109
-
110
- expect(preparedMigration.operations.length).toBeGreaterThan(0);
111
- const sql = preparedMigration.getSQL?.();
112
- expect(sql).toBeDefined();
113
- expect(sql).toMatchInlineSnapshot(`
114
- "create table "users_test_namespace" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
115
-
116
- alter table "users_test_namespace" add column "age" integer;
117
-
118
- create index "name_idx" on "users_test_namespace" ("name");
119
-
120
- create index "age_idx" on "users_test_namespace" ("age");
121
-
122
- create table "posts_test_namespace" ("id" varchar(30) not null unique, "title" text not null, "user_id" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
123
-
124
- insert into "fragno_db_settings" ("id", "key", "value") values ('jprP_43K5uMwxAFiepbbrQ', 'test_namespace.schema_version', '3');"
125
- `);
126
- });
127
-
128
- test("generate SQL for migration 2 -> 3 (add posts table)", async () => {
129
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
130
- const preparedMigration = await migrator.prepareMigrationTo(3, {
131
- updateSettings: true,
132
- fromVersion: 2,
133
- });
134
-
135
- expect(preparedMigration.operations.length).toBeGreaterThan(0);
136
- const sql = preparedMigration.getSQL?.();
137
- expect(sql).toBeDefined();
138
- expect(sql).toMatchInlineSnapshot(`
139
- "create table "posts_test_namespace" ("id" varchar(30) not null unique, "title" text not null, "user_id" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
140
-
141
- update "fragno_db_settings" set "value" = '3' where "key" = 'test_namespace.schema_version';"
142
- `);
143
- });
144
-
145
- test("generate empty SQL for migration 2 -> 2 (no changes)", async () => {
146
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
147
- const preparedMigration = await migrator.prepareMigrationTo(2, {
148
- updateSettings: true,
149
- fromVersion: 2,
150
- });
151
-
152
- expect(preparedMigration.operations.length).toBe(0);
153
- const sql = preparedMigration.getSQL?.();
154
- expect(sql).toBeDefined();
155
- expect(sql).toBe("");
156
- });
157
-
158
- test("throw error for backward migration", async () => {
159
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
160
-
161
- await expect(
162
- migrator.prepareMigrationTo(1, {
163
- updateSettings: true,
164
- fromVersion: 2,
165
- }),
166
- ).rejects.toThrow("Cannot migrate backwards");
167
- });
168
-
169
- test("throw error for version beyond schema", async () => {
170
- const migrator = adapter.createMigrationEngine(testSchema, "test_namespace");
171
-
172
- await expect(
173
- migrator.prepareMigrationTo(10, {
174
- updateSettings: true,
175
- fromVersion: 0,
176
- }),
177
- ).rejects.toThrow("schema only has version 4");
178
- });
179
- });
180
-
181
- describe("KyselyMigrator - SQLite Foreign Key Merging", () => {
182
- // Test the user's exact example schema
183
- const userExampleSchema = schema((s) => {
184
- return s
185
- .addTable("users", (t) => {
186
- return t.addColumn("id", idColumn());
187
- })
188
- .addTable("posts", (t) => {
189
- return t.addColumn("id", idColumn()).addColumn("authorId", referenceColumn());
190
- })
191
- .addReference("author", {
192
- type: "one",
193
- from: { table: "posts", column: "authorId" },
194
- to: { table: "users", column: "id" },
195
- });
196
- });
197
-
198
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
199
- let db: Kysely<any>;
200
- let adapter: KyselyAdapter;
201
-
202
- beforeAll(async () => {
203
- // Create a Kysely instance with SQLite dialect
204
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
205
- db = new Kysely({ dialect: new SqliteDialect({} as any) });
206
- adapter = new KyselyAdapter({ db, provider: "sqlite" });
207
- });
208
-
209
- test("SQLite should merge foreign keys into create-table operations", async () => {
210
- const migrator = adapter.createMigrationEngine(userExampleSchema, "test");
211
-
212
- // Migrate from 0 -> 3 (all tables + FK in one batch)
213
- const preparedMigration = await migrator.prepareMigrationTo(3, {
214
- updateSettings: true,
215
- fromVersion: 0,
216
- });
217
-
218
- expect(preparedMigration.operations.length).toBeGreaterThan(0);
219
- const sql = preparedMigration.getSQL?.();
220
- expect(sql).toBeDefined();
221
-
222
- // The SQL should have PRAGMA defer_foreign_keys
223
- expect(sql).toContain("PRAGMA defer_foreign_keys = ON");
224
-
225
- // Should create users table
226
- expect(sql).toContain('create table "users_test"');
227
-
228
- // Should create posts table WITH inline foreign key constraint
229
- expect(sql).toContain('create table "posts_test"');
230
- expect(sql).toContain("foreign key");
231
- expect(sql).toContain("authorId");
232
- expect(sql).toContain('references "users_test"');
233
-
234
- // Should NOT have a separate ALTER TABLE ADD FOREIGN KEY
235
- // (SQLite doesn't support it, and we've merged it into create-table)
236
- expect(sql).not.toMatch(/alter table.*add.*foreign key/i);
237
- });
238
-
239
- test("SQLite FK merging full schema verification", async () => {
240
- const migrator = adapter.createMigrationEngine(userExampleSchema, "test");
241
-
242
- const preparedMigration = await migrator.prepareMigrationTo(3, {
243
- updateSettings: true,
244
- fromVersion: 0,
245
- });
246
-
247
- const sql = preparedMigration.getSQL?.();
248
- expect(sql).toBeDefined();
249
-
250
- // Verify the complete SQL snapshot
251
- expect(sql).toMatchInlineSnapshot(`
252
- "PRAGMA defer_foreign_keys = ON;
253
-
254
- create table "users_test" ("id" text not null unique, "_internalId" integer not null primary key autoincrement, "_version" integer default 0 not null);
255
-
256
- create table "posts_test" ("id" text not null unique, "authorId" integer not null, "_internalId" integer not null primary key autoincrement, "_version" integer default 0 not null, constraint "posts_users_author_fk" foreign key ("authorId") references "users_test" ("_internalId") on delete restrict on update restrict);
257
-
258
- insert into "fragno_db_settings" ("id", "key", "value") values ('BflimUWc1NbCMMDD9SM3gQ', 'test.schema_version', '3');"
259
- `);
260
- });
261
- });
@@ -1,214 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { bindServicesToContext } from "./bind-services";
3
- import { withUnitOfWork, type DatabaseRequestThisContext } from "./fragment";
4
- import type { IUnitOfWorkBase } from "./query/unit-of-work";
5
- import { schema, idColumn } from "./schema/create";
6
-
7
- // Create a simple test schema for tests
8
- const testSchema = schema((s) => {
9
- return s.addTable("test", (t) => {
10
- return t.addColumn("id", idColumn());
11
- });
12
- });
13
-
14
- describe("bindServicesToContext", () => {
15
- it("should bind simple function to context", async () => {
16
- const mockSchemaView = { test: "schema-view" };
17
- const mockUow = {
18
- test: "uow",
19
- forSchema: () => mockSchemaView,
20
- } as unknown as IUnitOfWorkBase;
21
-
22
- const services = {
23
- testMethod: function (this: DatabaseRequestThisContext) {
24
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
- return this.getUnitOfWork(testSchema as any);
26
- },
27
- };
28
-
29
- const bound = bindServicesToContext(services);
30
-
31
- const result = await withUnitOfWork(mockUow, () => bound.testMethod());
32
-
33
- expect(result).toBe(mockSchemaView);
34
- });
35
-
36
- it("should bind multiple functions", async () => {
37
- const mockSchemaView = { test: "schema-view" };
38
- const mockUow = {
39
- test: "uow",
40
- forSchema: () => mockSchemaView,
41
- } as unknown as IUnitOfWorkBase;
42
-
43
- const services = {
44
- method1: function (this: DatabaseRequestThisContext) {
45
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
- return this.getUnitOfWork(testSchema as any);
47
- },
48
- method2: function (this: DatabaseRequestThisContext) {
49
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
- return this.getUnitOfWork(testSchema as any);
51
- },
52
- };
53
-
54
- const bound = bindServicesToContext(services);
55
-
56
- await withUnitOfWork(mockUow, () => {
57
- expect(bound.method1()).toBe(mockSchemaView);
58
- expect(bound.method2()).toBe(mockSchemaView);
59
- });
60
- });
61
-
62
- it("should bind nested service objects", async () => {
63
- const mockSchemaView = { test: "schema-view" };
64
- const mockUow = {
65
- test: "uow",
66
- forSchema: () => mockSchemaView,
67
- } as unknown as IUnitOfWorkBase;
68
-
69
- const services = {
70
- nested: {
71
- method: function (this: DatabaseRequestThisContext) {
72
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
- return this.getUnitOfWork(testSchema as any);
74
- },
75
- },
76
- };
77
-
78
- const bound = bindServicesToContext(services);
79
-
80
- const result = await withUnitOfWork(mockUow, () => bound.nested.method());
81
-
82
- expect(result).toBe(mockSchemaView);
83
- });
84
-
85
- it("should preserve non-function properties", () => {
86
- const services = {
87
- method: function () {
88
- return "test";
89
- },
90
- constant: "value",
91
- number: 42,
92
- };
93
-
94
- const bound = bindServicesToContext(services);
95
-
96
- expect(bound.constant).toBe("value");
97
- expect(bound.number).toBe(42);
98
- expect(bound.method()).toBe("test");
99
- });
100
-
101
- it("should handle functions with parameters", async () => {
102
- const mockSchemaView = { test: "schema-view" };
103
- const mockUow = {
104
- test: "uow",
105
- forSchema: () => mockSchemaView,
106
- } as unknown as IUnitOfWorkBase;
107
-
108
- const services = {
109
- testMethod: function (this: DatabaseRequestThisContext, param1: string, param2: number) {
110
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
111
- const uow = this.getUnitOfWork(testSchema as any);
112
- return { uow, param1, param2 };
113
- },
114
- };
115
-
116
- const bound = bindServicesToContext(services);
117
-
118
- const result = await withUnitOfWork(mockUow, () => bound.testMethod("hello", 123));
119
-
120
- expect(result.uow).toBe(mockSchemaView);
121
- expect(result.param1).toBe("hello");
122
- expect(result.param2).toBe(123);
123
- });
124
-
125
- it("should handle async functions", async () => {
126
- const mockSchemaView = { test: "schema-view" };
127
- const mockUow = {
128
- test: "uow",
129
- forSchema: () => mockSchemaView,
130
- } as unknown as IUnitOfWorkBase;
131
-
132
- const services = {
133
- asyncMethod: async function (this: DatabaseRequestThisContext) {
134
- await new Promise((resolve) => setTimeout(resolve, 10));
135
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
136
- return this.getUnitOfWork(testSchema as any);
137
- },
138
- };
139
-
140
- const bound = bindServicesToContext(services);
141
-
142
- const result = await withUnitOfWork(mockUow, async () => await bound.asyncMethod());
143
-
144
- expect(result).toBe(mockSchemaView);
145
- });
146
-
147
- it("should not bind arrays", () => {
148
- const services = {
149
- array: [1, 2, 3],
150
- method: function () {
151
- return "test";
152
- },
153
- };
154
-
155
- const bound = bindServicesToContext(services);
156
-
157
- expect(bound.array).toEqual([1, 2, 3]);
158
- expect(Array.isArray(bound.array)).toBe(true);
159
- });
160
-
161
- it("should handle deeply nested objects", async () => {
162
- const mockSchemaView = { test: "schema-view" };
163
- const mockUow = {
164
- test: "uow",
165
- forSchema: () => mockSchemaView,
166
- } as unknown as IUnitOfWorkBase;
167
-
168
- const services = {
169
- level1: {
170
- level2: {
171
- level3: {
172
- method: function (this: DatabaseRequestThisContext) {
173
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
174
- return this.getUnitOfWork(testSchema as any);
175
- },
176
- },
177
- },
178
- },
179
- };
180
-
181
- const bound = bindServicesToContext(services);
182
-
183
- const result = await withUnitOfWork(mockUow, () => bound.level1.level2.level3.method());
184
-
185
- expect(result).toBe(mockSchemaView);
186
- });
187
-
188
- it("should allow bound services to access UOW independently", async () => {
189
- const mockSchemaView = { test: "schema-view" };
190
- const mockUow = {
191
- test: "uow",
192
- forSchema: () => mockSchemaView,
193
- } as unknown as IUnitOfWorkBase;
194
-
195
- const services = {
196
- getUow: function (this: DatabaseRequestThisContext) {
197
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
198
- return this.getUnitOfWork(testSchema as any);
199
- },
200
- callOther: function (this: DatabaseRequestThisContext) {
201
- // Both methods can access UOW via their own `this` context
202
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
203
- return this.getUnitOfWork(testSchema as any);
204
- },
205
- };
206
-
207
- const bound = bindServicesToContext(services);
208
-
209
- await withUnitOfWork(mockUow, () => {
210
- expect(bound.getUow()).toBe(mockSchemaView);
211
- expect(bound.callOther()).toBe(mockSchemaView);
212
- });
213
- });
214
- });
@@ -1,37 +0,0 @@
1
- import { serviceContext } from "./fragment";
2
-
3
- // Type helper to remove 'this' parameter from functions
4
- type OmitThisParameter<T> = T extends (this: infer _This, ...args: infer A) => infer R
5
- ? (...args: A) => R
6
- : T;
7
-
8
- // Recursively remove 'this' parameter from all functions in an object
9
- export type BoundServices<T> = {
10
- [K in keyof T]: T[K] extends (...args: never[]) => unknown
11
- ? OmitThisParameter<T[K]>
12
- : T[K] extends Record<string, unknown>
13
- ? BoundServices<T[K]>
14
- : T[K];
15
- };
16
-
17
- export function bindServicesToContext<T extends Record<string, unknown>>(
18
- services: T,
19
- ): BoundServices<T> {
20
- const bound = {} as BoundServices<T>;
21
-
22
- for (const [key, value] of Object.entries(services)) {
23
- if (typeof value === "function") {
24
- // Bind function to serviceContext
25
- bound[key as keyof T] = value.bind(serviceContext) as BoundServices<T>[keyof T];
26
- } else if (value && typeof value === "object" && !Array.isArray(value)) {
27
- // Recursively bind nested service objects
28
- bound[key as keyof T] = bindServicesToContext(
29
- value as Record<string, unknown>,
30
- ) as BoundServices<T>[keyof T];
31
- } else {
32
- bound[key as keyof T] = value as BoundServices<T>[keyof T];
33
- }
34
- }
35
-
36
- return bound;
37
- }