@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,396 +0,0 @@
1
- import type { SQLProvider } from "../shared/providers";
2
- import type { AnyColumn } from "./create";
3
- import { FragnoId, FragnoReference } from "./create";
4
-
5
- export interface AdditionalColumnMetadata {
6
- length?: number;
7
- precision?: number;
8
- scale?: number;
9
- }
10
-
11
- /**
12
- * Get the possible column types that the raw DB type can map to.
13
- */
14
- export function dbToSchemaType(
15
- dbType: string,
16
- provider: SQLProvider,
17
- additional: AdditionalColumnMetadata,
18
- ): (AnyColumn["type"] | "varchar(n)")[] {
19
- dbType = dbType.toLowerCase();
20
- if (provider === "sqlite") {
21
- switch (dbType) {
22
- case "integer":
23
- return ["bool", "date", "timestamp", "bigint", "integer"];
24
- case "text":
25
- return ["json", "string", "bigint", "varchar(n)"];
26
- case "real":
27
- case "numeric":
28
- return ["decimal"];
29
- case "blob":
30
- return ["bigint", "binary"];
31
- default:
32
- return [dbType as AnyColumn["type"]];
33
- }
34
- }
35
-
36
- if (provider === "postgresql" || provider === "cockroachdb") {
37
- switch (dbType) {
38
- case "decimal":
39
- case "real":
40
- case "numeric":
41
- case "double precision":
42
- return ["decimal"];
43
- case "timestamp":
44
- case "timestamptz":
45
- return ["timestamp"];
46
- case "varchar": {
47
- const len = additional.length;
48
- if (len != null) {
49
- return [`varchar(${len})`];
50
- }
51
- return ["string"];
52
- }
53
- case "text":
54
- return ["string"];
55
- case "boolean":
56
- case "bool":
57
- return ["bool"];
58
- case "bytea":
59
- return ["binary"];
60
- default:
61
- return [dbType as AnyColumn["type"]];
62
- }
63
- }
64
-
65
- if (provider === "mysql") {
66
- switch (dbType) {
67
- case "bool":
68
- case "boolean":
69
- return ["bool"];
70
- case "integer":
71
- case "int":
72
- return ["integer"];
73
- case "decimal":
74
- case "numeric":
75
- case "float":
76
- case "double":
77
- return ["decimal"];
78
- case "datetime":
79
- return ["timestamp"];
80
- case "varchar": {
81
- const len = additional.length;
82
- if (len != null) {
83
- return [`varchar(${len})`];
84
- }
85
- return ["string"];
86
- }
87
- case "text":
88
- return ["string"];
89
- case "longblob":
90
- case "blob":
91
- case "mediumblob":
92
- case "tinyblob":
93
- return ["binary"];
94
- default:
95
- return [dbType as AnyColumn["type"]];
96
- }
97
- }
98
-
99
- if (provider === "mssql") {
100
- switch (dbType) {
101
- case "int":
102
- return ["integer"];
103
- case "decimal":
104
- case "float":
105
- case "real":
106
- case "numeric":
107
- return ["decimal"];
108
- case "bit":
109
- return ["bool"];
110
- case "datetime":
111
- case "datetime2":
112
- return ["timestamp"];
113
- case "nvarchar":
114
- case "varchar": {
115
- const len = additional.length;
116
- if (len != null) {
117
- return [`varchar(${len})`];
118
- }
119
- return ["string", "json"];
120
- }
121
- case "ntext":
122
- case "text":
123
- case "varchar(max)":
124
- case "nvarchar(max)":
125
- return ["string", "json"];
126
- case "binary":
127
- case "varbinary":
128
- return ["binary"];
129
- default:
130
- return [dbType as AnyColumn["type"]];
131
- }
132
- }
133
-
134
- throw new Error(`unhandled database provider: ${provider}`);
135
- }
136
-
137
- /**
138
- * Database type literals that can be returned by schemaToDBType
139
- */
140
- export type DBTypeLiteral =
141
- // PostgreSQL/CockroachDB types
142
- | "bigserial"
143
- | "serial"
144
- | "boolean"
145
- | "bool"
146
- | "json"
147
- | "text"
148
- | "bytea"
149
- | "timestamp"
150
- | "timestamptz"
151
- | "bigint"
152
- | "integer"
153
- | "decimal"
154
- | "date"
155
- // MySQL types
156
- | "longblob"
157
- | "datetime"
158
- // SQLite types
159
- | "blob"
160
- | "real"
161
- // MSSQL types
162
- | "bit"
163
- | "int"
164
- | "varbinary(max)"
165
- | "varchar(max)"
166
- // varchar with length parameter
167
- | `varchar(${number})`;
168
-
169
- export function schemaToDBType(
170
- column: AnyColumn | Pick<AnyColumn, "type">,
171
- provider: SQLProvider,
172
- ): DBTypeLiteral {
173
- const { type } = column;
174
-
175
- // Handle internal ID columns with auto-increment
176
- if ("role" in column && column.role === "internal-id") {
177
- if (provider === "postgresql" || provider === "cockroachdb") {
178
- return "bigserial";
179
- }
180
- if (provider === "mysql") {
181
- return "bigint";
182
- }
183
- if (provider === "sqlite") {
184
- return "integer"; // SQLite uses INTEGER for auto-increment
185
- }
186
- if (provider === "mssql") {
187
- return "bigint";
188
- }
189
- }
190
-
191
- if ("role" in column && column.role === "reference") {
192
- if (provider === "sqlite") {
193
- return "integer";
194
- }
195
- // Other providers use bigint for references
196
- }
197
-
198
- if (provider === "sqlite") {
199
- switch (type) {
200
- case "integer":
201
- case "timestamp":
202
- case "date":
203
- case "bool":
204
- return "integer";
205
- case "binary":
206
- case "bigint":
207
- return "blob";
208
- case "json":
209
- case "string":
210
- return "text";
211
- case "decimal":
212
- return "real";
213
- default:
214
- // sqlite doesn't support varchar
215
- if (type.startsWith("varchar")) {
216
- return "text";
217
- }
218
- }
219
- }
220
-
221
- if (provider === "mssql") {
222
- switch (type) {
223
- case "bool":
224
- return "bit";
225
- case "timestamp":
226
- return "datetime";
227
- case "integer":
228
- return "int";
229
- case "string":
230
- return "varchar(max)";
231
- case "binary":
232
- return "varbinary(max)";
233
- // only 2025 preview supports JSON natively
234
- case "json":
235
- return "varchar(max)";
236
- default:
237
- if (type.startsWith("varchar")) {
238
- return type as `varchar(${number})`;
239
- }
240
- return type;
241
- }
242
- }
243
-
244
- if (provider === "postgresql" || provider === "cockroachdb") {
245
- switch (type) {
246
- case "bool":
247
- return "boolean";
248
- case "json":
249
- return "json";
250
- case "string":
251
- return "text";
252
- case "binary":
253
- return "bytea";
254
- default:
255
- if (type.startsWith("varchar")) {
256
- return type as `varchar(${number})`;
257
- }
258
- return type;
259
- }
260
- }
261
-
262
- if (provider === "mysql") {
263
- switch (type) {
264
- case "bool":
265
- return "boolean";
266
- case "string":
267
- return "text";
268
- case "binary":
269
- return "longblob";
270
- default:
271
- if (type.startsWith("varchar")) {
272
- return type as `varchar(${number})`;
273
- }
274
- return type;
275
- }
276
- }
277
-
278
- throw new Error(`cannot handle ${provider} ${type}`);
279
- }
280
-
281
- const supportJson: SQLProvider[] = ["postgresql", "cockroachdb", "mysql"];
282
-
283
- /**
284
- * Parse from driver value
285
- */
286
- export function deserialize(value: unknown, col: AnyColumn, provider: SQLProvider) {
287
- if (value === null) {
288
- return null;
289
- }
290
-
291
- if (!supportJson.includes(provider) && col.type === "json" && typeof value === "string") {
292
- return JSON.parse(value);
293
- }
294
-
295
- if (
296
- provider === "sqlite" &&
297
- (col.type === "timestamp" || col.type === "date") &&
298
- (typeof value === "number" || typeof value === "string")
299
- ) {
300
- return new Date(value);
301
- }
302
-
303
- if (
304
- (provider === "postgresql" || provider === "cockroachdb") &&
305
- (col.type === "timestamp" || col.type === "date") &&
306
- typeof value === "string"
307
- ) {
308
- return new Date(value);
309
- }
310
-
311
- if (
312
- provider === "mysql" &&
313
- (col.type === "timestamp" || col.type === "date") &&
314
- typeof value === "string"
315
- ) {
316
- return new Date(value);
317
- }
318
-
319
- if (col.type === "bool" && typeof value === "number") {
320
- return value === 1;
321
- }
322
-
323
- if (col.type === "bigint" && value instanceof Buffer) {
324
- return value.readBigInt64BE(0);
325
- }
326
-
327
- if (col.type === "bigint" && typeof value === "string") {
328
- return BigInt(value);
329
- }
330
-
331
- if (col.type === "binary" && value instanceof Buffer) {
332
- return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
333
- }
334
-
335
- return value;
336
- }
337
-
338
- /**
339
- * Encode to driver value
340
- */
341
- export function serialize(value: unknown, col: AnyColumn, provider: SQLProvider) {
342
- if (value === null) {
343
- return null;
344
- }
345
-
346
- // Handle FragnoReference objects (for reference columns)
347
- if (value instanceof FragnoReference) {
348
- return value.internalId;
349
- }
350
-
351
- // Handle FragnoId objects
352
- if (value instanceof FragnoId) {
353
- // For external ID columns, use the external ID
354
- if (col.role === "external-id") {
355
- return value.externalId;
356
- }
357
- // For internal ID columns, use the internal ID (must be present)
358
- if (col.role === "internal-id") {
359
- if (!value.internalId) {
360
- throw new Error(`FragnoId must have internalId for internal-id column ${col.name}`);
361
- }
362
- return value.internalId;
363
- }
364
- // For reference columns, prefer internal ID if available
365
- if (col.role === "reference") {
366
- return value.databaseId;
367
- }
368
- // Default to external ID for other columns
369
- return value.externalId;
370
- }
371
-
372
- if (!supportJson.includes(provider) && col.type === "json") {
373
- return JSON.stringify(value);
374
- }
375
-
376
- if (provider === "sqlite" && value instanceof Date) {
377
- return value.getTime();
378
- }
379
-
380
- if (provider === "sqlite" && typeof value === "boolean") {
381
- return value ? 1 : 0;
382
- }
383
-
384
- if (provider === "sqlite" && typeof value === "bigint") {
385
- const buf = Buffer.alloc(8);
386
- buf.writeBigInt64BE(value);
387
- return buf;
388
- }
389
-
390
- // most drivers accept Buffer
391
- if (col.type === "binary" && value instanceof Uint8Array) {
392
- return Buffer.from(value);
393
- }
394
-
395
- return value;
396
- }
@@ -1,61 +0,0 @@
1
- import type { AbstractQuery } from "../query/query";
2
- import { schema, idColumn, column, type FragnoId } from "../schema/create";
3
-
4
- export const SETTINGS_TABLE_NAME = "fragno_db_settings" as const;
5
- export const SETTINGS_NAMESPACE = "fragno-db-settings" as const;
6
-
7
- export const settingsSchema = schema((s) => {
8
- return s.addTable(SETTINGS_TABLE_NAME, (t) => {
9
- return t
10
- .addColumn("id", idColumn())
11
- .addColumn("key", column("string"))
12
- .addColumn("value", column("string"))
13
- .createIndex("unique_key", ["key"], { unique: true });
14
- });
15
- });
16
-
17
- export function createSettingsManager(
18
- // oxlint-disable-next-line no-explicit-any
19
- queryEngine: AbstractQuery<typeof settingsSchema, any>,
20
- namespace: string,
21
- ) {
22
- return {
23
- async get(key: string): Promise<{ id: FragnoId; key: string; value: string } | undefined> {
24
- const uow = queryEngine
25
- .createUnitOfWork()
26
- .find(SETTINGS_TABLE_NAME, (b) =>
27
- b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.${key}`)),
28
- );
29
- const [[result]] = await uow.executeRetrieve();
30
- return result; // Safe: result can be undefined if key doesn't exist
31
- },
32
-
33
- async set(key: string, value: string) {
34
- const uow = queryEngine
35
- .createUnitOfWork("createSettingsManager#set")
36
- .find(SETTINGS_TABLE_NAME, (b) =>
37
- b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.${key}`)),
38
- );
39
- const [[existing]] = await uow.executeRetrieve();
40
-
41
- if (existing) {
42
- uow.update(SETTINGS_TABLE_NAME, existing.id, (b) => b.set({ value }).check());
43
- } else {
44
- uow.create(SETTINGS_TABLE_NAME, {
45
- key: `${namespace}.${key}`,
46
- value,
47
- });
48
- }
49
-
50
- const { success } = await uow.executeMutations();
51
-
52
- if (!success) {
53
- throw new Error("Failed to set schema version");
54
- }
55
- },
56
-
57
- async delete(id: FragnoId) {
58
- await queryEngine.delete(SETTINGS_TABLE_NAME, id);
59
- },
60
- };
61
- }
@@ -1,102 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { defineFragmentWithDatabase } from "./fragment";
3
- import { createFragment } from "@fragno-dev/core";
4
- import { schema, column, idColumn } from "./schema/create";
5
-
6
- describe("UOW Context Integration", () => {
7
- it("should bind services to use serviceContext", () => {
8
- // Create a schema
9
- const testSchema = schema((s) => {
10
- return s.addTable("user", (t) => {
11
- return t.addColumn("id", idColumn()).addColumn("name", column("string"));
12
- });
13
- });
14
-
15
- // Define fragment with service that uses this.getUnitOfWork()
16
- const fragmentDef = defineFragmentWithDatabase<{}>("test-fragment")
17
- .withDatabase(testSchema, "test")
18
- .providesService(({ defineService }) =>
19
- defineService({
20
- createUser: function (name: string) {
21
- const uow = this.getUnitOfWork(testSchema);
22
- const userId = uow.create("user", { name });
23
- return { userId: userId.valueOf(), name };
24
- },
25
- }),
26
- );
27
-
28
- // Mock database adapter
29
- const mockSchemaView = {
30
- create: () => ({ valueOf: () => 1 }),
31
- };
32
- const mockUow = {
33
- forSchema: () => mockSchemaView,
34
- };
35
- const mockAdapter = {
36
- createQueryEngine: () => ({
37
- createUnitOfWork: () => mockUow,
38
- }),
39
- };
40
-
41
- // Create fragment instance - services should be bound
42
- const fragment = createFragment(fragmentDef, {}, [], {
43
- mountRoute: "/api/test",
44
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
45
- databaseAdapter: mockAdapter as any,
46
- });
47
-
48
- // Verify services are defined
49
- expect(fragment.services).toBeDefined();
50
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
- expect((fragment.services as any).createUser).toBeDefined();
52
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
- expect(typeof (fragment.services as any).createUser).toBe("function");
54
- });
55
-
56
- it("should bind providesService services properly", () => {
57
- const schema1 = schema((s) => {
58
- return s.addTable("post", (t) => {
59
- return t.addColumn("id", idColumn()).addColumn("title", column("string"));
60
- });
61
- });
62
-
63
- // Fragment with providesService
64
- const fragmentDef = defineFragmentWithDatabase<{}>("fragment1")
65
- .withDatabase(schema1, "fragment1")
66
- .providesService(({ defineService }) =>
67
- defineService({
68
- createPost: function (title: string) {
69
- const uow = this.getUnitOfWork(schema1);
70
- const postId = uow.create("post", { title });
71
- return { postId: postId.valueOf(), title };
72
- },
73
- }),
74
- );
75
-
76
- // Mock adapter
77
- const mockSchemaView = {
78
- create: () => ({ valueOf: () => 2 }),
79
- };
80
- const mockUow = {
81
- forSchema: () => mockSchemaView,
82
- };
83
- const mockAdapter = {
84
- createQueryEngine: () => ({
85
- createUnitOfWork: () => mockUow,
86
- }),
87
- };
88
-
89
- // Create fragment
90
- const fragment = createFragment(fragmentDef, {}, [], {
91
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
92
- databaseAdapter: mockAdapter as any,
93
- });
94
-
95
- // Verify service is properly bound
96
- expect(fragment.services).toBeDefined();
97
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
98
- expect((fragment.services as any).createPost).toBeDefined();
99
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
100
- expect(typeof (fragment.services as any).createPost).toBe("function");
101
- });
102
- });