@fragno-dev/db 0.2.2 → 0.4.1

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 (587) hide show
  1. package/.turbo/turbo-build.log +404 -175
  2. package/CHANGELOG.md +109 -0
  3. package/README.md +54 -9
  4. package/dist/adapters/adapters.d.ts +23 -21
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/generic-sql/driver-config.d.ts +16 -1
  8. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -1
  9. package/dist/adapters/generic-sql/driver-config.js +23 -1
  10. package/dist/adapters/generic-sql/driver-config.js.map +1 -1
  11. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +24 -9
  12. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
  13. package/dist/adapters/generic-sql/generic-sql-adapter.js +60 -22
  14. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
  15. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +169 -3
  16. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
  17. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
  18. package/dist/adapters/generic-sql/migration/dialect/mysql.js +25 -6
  19. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
  20. package/dist/adapters/generic-sql/migration/dialect/postgres.js +7 -6
  21. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
  22. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +193 -16
  23. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
  24. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
  25. package/dist/adapters/generic-sql/migration/executor.js +30 -3
  26. package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
  27. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
  28. package/dist/adapters/generic-sql/migration/prepared-migrations.js +9 -9
  29. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
  30. package/dist/adapters/generic-sql/migration/sql-generator.js +75 -52
  31. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
  32. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +7 -6
  33. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
  34. package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
  35. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
  36. package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
  37. package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
  38. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +32 -21
  39. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
  40. package/dist/adapters/generic-sql/query/select-builder.js +5 -3
  41. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
  42. package/dist/adapters/generic-sql/query/sql-query-compiler.js +49 -18
  43. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
  44. package/dist/adapters/generic-sql/query/where-builder.js +43 -29
  45. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
  46. package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
  47. package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  48. package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
  49. package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
  50. package/dist/adapters/generic-sql/uow-decoder.js +6 -2
  51. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
  52. package/dist/adapters/generic-sql/uow-encoder.js +27 -8
  53. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
  54. package/dist/adapters/in-memory/condition-evaluator.js +135 -0
  55. package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
  56. package/dist/adapters/in-memory/errors.d.ts +13 -0
  57. package/dist/adapters/in-memory/errors.d.ts.map +1 -0
  58. package/dist/adapters/in-memory/errors.js +23 -0
  59. package/dist/adapters/in-memory/errors.js.map +1 -0
  60. package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
  61. package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
  62. package/dist/adapters/in-memory/in-memory-adapter.js +196 -0
  63. package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
  64. package/dist/adapters/in-memory/in-memory-uow.js +871 -0
  65. package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
  66. package/dist/adapters/in-memory/index.d.ts +4 -0
  67. package/dist/adapters/in-memory/index.js +4 -0
  68. package/dist/adapters/in-memory/options.d.ts +30 -0
  69. package/dist/adapters/in-memory/options.d.ts.map +1 -0
  70. package/dist/adapters/in-memory/options.js +62 -0
  71. package/dist/adapters/in-memory/options.js.map +1 -0
  72. package/dist/adapters/in-memory/reference-resolution.js +26 -0
  73. package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
  74. package/dist/adapters/in-memory/sorted-array-index.js +129 -0
  75. package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
  76. package/dist/adapters/in-memory/store.js +71 -0
  77. package/dist/adapters/in-memory/store.js.map +1 -0
  78. package/dist/adapters/in-memory/value-comparison.js +28 -0
  79. package/dist/adapters/in-memory/value-comparison.js.map +1 -0
  80. package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
  81. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
  82. package/dist/adapters/shared/uow-operation-compiler.js +11 -11
  83. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
  84. package/dist/adapters/sql/index.d.ts +5 -0
  85. package/dist/adapters/sql/index.js +4 -0
  86. package/dist/browser/adapters/adapters.d.ts +61 -0
  87. package/dist/browser/adapters/adapters.d.ts.map +1 -0
  88. package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
  89. package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  90. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  91. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  92. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
  93. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  94. package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
  95. package/dist/browser/adapters/in-memory/index.d.ts +2 -0
  96. package/dist/browser/adapters/in-memory/options.d.ts +1 -0
  97. package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
  98. package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
  99. package/dist/browser/durable-hooks.d.ts +3 -0
  100. package/dist/browser/fragments/internal-fragment.d.ts +317 -0
  101. package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
  102. package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
  103. package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
  104. package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
  105. package/dist/browser/hooks/hooks.d.ts +146 -0
  106. package/dist/browser/hooks/hooks.d.ts.map +1 -0
  107. package/dist/browser/id.js +1 -0
  108. package/dist/browser/internal/adapter-registry.d.ts +4 -0
  109. package/dist/browser/internal/outbox-state.d.ts +2 -0
  110. package/dist/browser/mod.d.ts +15 -0
  111. package/dist/browser/mod.d.ts.map +1 -0
  112. package/dist/browser/mod.js +17 -0
  113. package/dist/browser/mod.js.map +1 -0
  114. package/dist/browser/mod2.d.ts +48 -0
  115. package/dist/browser/mod2.d.ts.map +1 -0
  116. package/dist/browser/naming/sql-naming.d.ts +19 -0
  117. package/dist/browser/naming/sql-naming.d.ts.map +1 -0
  118. package/dist/browser/outbox/outbox.d.ts +21 -0
  119. package/dist/browser/outbox/outbox.d.ts.map +1 -0
  120. package/dist/browser/query/column-defaults.js +1 -0
  121. package/dist/browser/query/condition-builder.d.ts +44 -0
  122. package/dist/browser/query/condition-builder.d.ts.map +1 -0
  123. package/dist/browser/query/condition-builder.js +97 -0
  124. package/dist/browser/query/condition-builder.js.map +1 -0
  125. package/dist/browser/query/cursor.d.ts +105 -0
  126. package/dist/browser/query/cursor.d.ts.map +1 -0
  127. package/dist/browser/query/cursor.js +150 -0
  128. package/dist/browser/query/cursor.js.map +1 -0
  129. package/dist/browser/query/db-now.d.ts +22 -0
  130. package/dist/browser/query/db-now.d.ts.map +1 -0
  131. package/dist/browser/query/db-now.js +33 -0
  132. package/dist/browser/query/db-now.js.map +1 -0
  133. package/dist/browser/query/orm/orm.d.ts +18 -0
  134. package/dist/browser/query/orm/orm.d.ts.map +1 -0
  135. package/dist/browser/query/simple-query-interface.d.ts +108 -0
  136. package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
  137. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
  138. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  139. package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
  140. package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  141. package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
  142. package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
  143. package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
  144. package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
  145. package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
  146. package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  147. package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
  148. package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
  149. package/dist/browser/query/value-encoding.js +38 -0
  150. package/dist/browser/query/value-encoding.js.map +1 -0
  151. package/dist/browser/schema/create.d.ts +326 -0
  152. package/dist/browser/schema/create.d.ts.map +1 -0
  153. package/dist/browser/schema/create.js +89 -0
  154. package/dist/browser/schema/create.js.map +1 -0
  155. package/dist/browser/schema/generate-id.js +28 -0
  156. package/dist/browser/schema/generate-id.js.map +1 -0
  157. package/dist/browser/shared/providers.d.ts +6 -0
  158. package/dist/browser/shared/providers.d.ts.map +1 -0
  159. package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
  160. package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
  161. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  162. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  163. package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
  164. package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  165. package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
  166. package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
  167. package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
  168. package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  169. package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
  170. package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  171. package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
  172. package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
  173. package/dist/browser/sync/commands.d.ts +15 -0
  174. package/dist/browser/sync/commands.d.ts.map +1 -0
  175. package/dist/browser/sync/commands.js +27 -0
  176. package/dist/browser/sync/commands.js.map +1 -0
  177. package/dist/browser/sync/types.d.ts +63 -0
  178. package/dist/browser/sync/types.d.ts.map +1 -0
  179. package/dist/browser/util/types.d.ts +8 -0
  180. package/dist/browser/util/types.d.ts.map +1 -0
  181. package/dist/browser/with-database.d.ts +29 -0
  182. package/dist/browser/with-database.d.ts.map +1 -0
  183. package/dist/client.d.ts +4 -0
  184. package/dist/client.js +5 -0
  185. package/dist/db-fragment-definition-builder.d.ts +101 -33
  186. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  187. package/dist/db-fragment-definition-builder.js +450 -60
  188. package/dist/db-fragment-definition-builder.js.map +1 -1
  189. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
  190. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
  191. package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
  192. package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
  193. package/dist/dispatchers/cloudflare-do/index.d.ts +11 -0
  194. package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
  195. package/dist/dispatchers/cloudflare-do/index.js +31 -0
  196. package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
  197. package/dist/dispatchers/node/dispatcher.d.ts +14 -0
  198. package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
  199. package/dist/dispatchers/node/dispatcher.js +80 -0
  200. package/dist/dispatchers/node/dispatcher.js.map +1 -0
  201. package/dist/dispatchers/node/index.d.ts +12 -0
  202. package/dist/dispatchers/node/index.d.ts.map +1 -0
  203. package/dist/dispatchers/node/index.js +27 -0
  204. package/dist/dispatchers/node/index.js.map +1 -0
  205. package/dist/durable-hooks.d.ts +31 -0
  206. package/dist/durable-hooks.d.ts.map +1 -0
  207. package/dist/durable-hooks.js +23 -0
  208. package/dist/durable-hooks.js.map +1 -0
  209. package/dist/fragments/internal-fragment.d.ts +186 -8
  210. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  211. package/dist/fragments/internal-fragment.js +203 -38
  212. package/dist/fragments/internal-fragment.js.map +1 -1
  213. package/dist/fragments/internal-fragment.routes.js +164 -0
  214. package/dist/fragments/internal-fragment.routes.js.map +1 -0
  215. package/dist/fragments/internal-fragment.schema.d.ts +15 -0
  216. package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
  217. package/dist/fragments/internal-fragment.schema.js +39 -0
  218. package/dist/fragments/internal-fragment.schema.js.map +1 -0
  219. package/dist/hooks/durable-hooks-logger.d.ts +10 -0
  220. package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
  221. package/dist/hooks/durable-hooks-logger.js +75 -0
  222. package/dist/hooks/durable-hooks-logger.js.map +1 -0
  223. package/dist/hooks/durable-hooks-processor.d.ts +1 -0
  224. package/dist/hooks/durable-hooks-processor.js +80 -0
  225. package/dist/hooks/durable-hooks-processor.js.map +1 -0
  226. package/dist/hooks/durable-hooks-runtime.js +44 -0
  227. package/dist/hooks/durable-hooks-runtime.js.map +1 -0
  228. package/dist/hooks/hooks.d.ts +100 -1
  229. package/dist/hooks/hooks.d.ts.map +1 -1
  230. package/dist/hooks/hooks.js +254 -27
  231. package/dist/hooks/hooks.js.map +1 -1
  232. package/dist/id.d.ts +2 -2
  233. package/dist/id.js +2 -2
  234. package/dist/internal/adapter-registry.d.ts +11 -0
  235. package/dist/internal/adapter-registry.d.ts.map +1 -0
  236. package/dist/internal/adapter-registry.js +135 -0
  237. package/dist/internal/adapter-registry.js.map +1 -0
  238. package/dist/internal/outbox-state.d.ts +2 -0
  239. package/dist/internal/outbox-state.js +26 -0
  240. package/dist/internal/outbox-state.js.map +1 -0
  241. package/dist/migration-engine/auto-from-schema.d.ts +33 -0
  242. package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
  243. package/dist/migration-engine/auto-from-schema.js +223 -37
  244. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  245. package/dist/migration-engine/generation-engine.d.ts +16 -10
  246. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  247. package/dist/migration-engine/generation-engine.js +86 -35
  248. package/dist/migration-engine/generation-engine.js.map +1 -1
  249. package/dist/migration-engine/shared.d.ts +113 -0
  250. package/dist/migration-engine/shared.d.ts.map +1 -0
  251. package/dist/migration-engine/shared.js.map +1 -1
  252. package/dist/mod.d.ts +20 -12
  253. package/dist/mod.d.ts.map +1 -1
  254. package/dist/mod.js +18 -12
  255. package/dist/mod.js.map +1 -1
  256. package/dist/naming/sql-naming.d.ts +19 -0
  257. package/dist/naming/sql-naming.d.ts.map +1 -0
  258. package/dist/naming/sql-naming.js +116 -0
  259. package/dist/naming/sql-naming.js.map +1 -0
  260. package/dist/outbox/outbox-builder.js +156 -0
  261. package/dist/outbox/outbox-builder.js.map +1 -0
  262. package/dist/outbox/outbox.d.ts +54 -0
  263. package/dist/outbox/outbox.d.ts.map +1 -0
  264. package/dist/outbox/outbox.js +37 -0
  265. package/dist/outbox/outbox.js.map +1 -0
  266. package/dist/query/column-defaults.js +20 -4
  267. package/dist/query/column-defaults.js.map +1 -1
  268. package/dist/query/condition-builder.d.ts +7 -1
  269. package/dist/query/condition-builder.d.ts.map +1 -1
  270. package/dist/query/condition-builder.js +5 -1
  271. package/dist/query/condition-builder.js.map +1 -1
  272. package/dist/query/cursor-client.d.ts +105 -0
  273. package/dist/query/cursor-client.d.ts.map +1 -0
  274. package/dist/query/cursor-client.js +165 -0
  275. package/dist/query/cursor-client.js.map +1 -0
  276. package/dist/query/cursor.d.ts +3 -1
  277. package/dist/query/cursor.d.ts.map +1 -1
  278. package/dist/query/cursor.js +51 -14
  279. package/dist/query/cursor.js.map +1 -1
  280. package/dist/query/db-now.d.ts +22 -0
  281. package/dist/query/db-now.d.ts.map +1 -0
  282. package/dist/query/db-now.js +35 -0
  283. package/dist/query/db-now.js.map +1 -0
  284. package/dist/query/orm/orm.js.map +1 -1
  285. package/dist/query/serialize/create-sql-serializer.js +5 -4
  286. package/dist/query/serialize/create-sql-serializer.js.map +1 -1
  287. package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
  288. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
  289. package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
  290. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
  291. package/dist/query/serialize/dialect/sqlite-serializer.js +60 -12
  292. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
  293. package/dist/query/serialize/sql-serializer.js +2 -2
  294. package/dist/query/serialize/sql-serializer.js.map +1 -1
  295. package/dist/query/simple-query-interface.d.ts +13 -4
  296. package/dist/query/simple-query-interface.d.ts.map +1 -1
  297. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
  298. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  299. package/dist/query/unit-of-work/execute-unit-of-work.js +50 -24
  300. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  301. package/dist/query/unit-of-work/unit-of-work.d.ts +92 -30
  302. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  303. package/dist/query/unit-of-work/unit-of-work.js +136 -11
  304. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  305. package/dist/query/value-decoding.js +16 -6
  306. package/dist/query/value-decoding.js.map +1 -1
  307. package/dist/query/value-encoding.js +29 -9
  308. package/dist/query/value-encoding.js.map +1 -1
  309. package/dist/schema/create.d.ts +103 -35
  310. package/dist/schema/create.d.ts.map +1 -1
  311. package/dist/schema/create.js +172 -58
  312. package/dist/schema/create.js.map +1 -1
  313. package/dist/schema/generate-id.js +2 -2
  314. package/dist/schema/generate-id.js.map +1 -1
  315. package/dist/schema/type-conversion/create-sql-type-mapper.js +4 -3
  316. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  317. package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
  318. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  319. package/dist/schema/validator.d.ts +10 -0
  320. package/dist/schema/validator.d.ts.map +1 -0
  321. package/dist/schema/validator.js +123 -0
  322. package/dist/schema/validator.js.map +1 -0
  323. package/dist/schema-output/drizzle.d.ts +30 -0
  324. package/dist/schema-output/drizzle.d.ts.map +1 -0
  325. package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +88 -60
  326. package/dist/schema-output/drizzle.js.map +1 -0
  327. package/dist/schema-output/prisma.d.ts +17 -0
  328. package/dist/schema-output/prisma.d.ts.map +1 -0
  329. package/dist/schema-output/prisma.js +307 -0
  330. package/dist/schema-output/prisma.js.map +1 -0
  331. package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
  332. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
  333. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
  334. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
  335. package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
  336. package/dist/sql-driver/sql.js.map +1 -1
  337. package/dist/sync/commands.d.ts +15 -0
  338. package/dist/sync/commands.d.ts.map +1 -0
  339. package/dist/sync/commands.js +27 -0
  340. package/dist/sync/commands.js.map +1 -0
  341. package/dist/sync/index.d.ts +4 -0
  342. package/dist/sync/index.js +4 -0
  343. package/dist/sync/read-tracking.d.ts +25 -0
  344. package/dist/sync/read-tracking.d.ts.map +1 -0
  345. package/dist/sync/read-tracking.js +148 -0
  346. package/dist/sync/read-tracking.js.map +1 -0
  347. package/dist/sync/submit.js +213 -0
  348. package/dist/sync/submit.js.map +1 -0
  349. package/dist/sync/types.d.ts +63 -0
  350. package/dist/sync/types.d.ts.map +1 -0
  351. package/dist/util/default-database-adapter.js +66 -0
  352. package/dist/util/default-database-adapter.js.map +1 -0
  353. package/dist/with-database.d.ts +3 -6
  354. package/dist/with-database.d.ts.map +1 -1
  355. package/dist/with-database.js +8 -7
  356. package/dist/with-database.js.map +1 -1
  357. package/package.json +62 -55
  358. package/src/adapters/adapters.ts +33 -26
  359. package/src/adapters/drizzle/migrate-drizzle.test.ts +99 -41
  360. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +601 -0
  361. package/src/adapters/drizzle/test-utils.ts +13 -8
  362. package/src/adapters/generic-sql/driver-config.ts +38 -0
  363. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +10 -8
  364. package/src/adapters/generic-sql/generic-sql-adapter.ts +117 -34
  365. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +55 -0
  366. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +297 -3
  367. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +120 -0
  368. package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
  369. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +27 -8
  370. package/src/adapters/generic-sql/migration/dialect/mysql.ts +47 -8
  371. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +28 -9
  372. package/src/adapters/generic-sql/migration/dialect/postgres.ts +9 -4
  373. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +839 -8
  374. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +396 -53
  375. package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
  376. package/src/adapters/generic-sql/migration/executor.ts +47 -4
  377. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +238 -46
  378. package/src/adapters/generic-sql/migration/prepared-migrations.ts +21 -13
  379. package/src/adapters/generic-sql/migration/sql-generator.ts +145 -66
  380. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +11 -8
  381. package/src/adapters/generic-sql/query/cursor-utils.test.ts +272 -0
  382. package/src/adapters/generic-sql/query/cursor-utils.ts +42 -7
  383. package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
  384. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +171 -35
  385. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +53 -40
  386. package/src/adapters/generic-sql/query/select-builder.test.ts +16 -11
  387. package/src/adapters/generic-sql/query/select-builder.ts +7 -3
  388. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +75 -6
  389. package/src/adapters/generic-sql/query/sql-query-compiler.ts +129 -24
  390. package/src/adapters/generic-sql/query/where-builder.test.ts +96 -20
  391. package/src/adapters/generic-sql/query/where-builder.ts +112 -41
  392. package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +11 -20
  393. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +851 -0
  394. package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +18 -15
  395. package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +282 -14
  396. package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +129 -12
  397. package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +9 -7
  398. package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
  399. package/src/adapters/generic-sql/uow-decoder.test.ts +5 -4
  400. package/src/adapters/generic-sql/uow-decoder.ts +23 -5
  401. package/src/adapters/generic-sql/uow-encoder.test.ts +36 -3
  402. package/src/adapters/generic-sql/uow-encoder.ts +48 -13
  403. package/src/adapters/in-memory/condition-evaluator.test.ts +194 -0
  404. package/src/adapters/in-memory/condition-evaluator.ts +280 -0
  405. package/src/adapters/in-memory/errors.ts +20 -0
  406. package/src/adapters/in-memory/in-memory-adapter.ts +388 -0
  407. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +344 -0
  408. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +255 -0
  409. package/src/adapters/in-memory/in-memory-uow.ts +1724 -0
  410. package/src/adapters/in-memory/index.ts +3 -0
  411. package/src/adapters/in-memory/options.test.ts +42 -0
  412. package/src/adapters/in-memory/options.ts +91 -0
  413. package/src/adapters/in-memory/outbox.test.ts +361 -0
  414. package/src/adapters/in-memory/reference-resolution.test.ts +51 -0
  415. package/src/adapters/in-memory/reference-resolution.ts +67 -0
  416. package/src/adapters/in-memory/sorted-array-index.test.ts +124 -0
  417. package/src/adapters/in-memory/sorted-array-index.ts +228 -0
  418. package/src/adapters/in-memory/store.test.ts +69 -0
  419. package/src/adapters/in-memory/store.ts +145 -0
  420. package/src/adapters/in-memory/value-comparison.ts +53 -0
  421. package/src/adapters/in-memory/value-normalization.test.ts +58 -0
  422. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1207 -0
  423. package/src/adapters/shared/from-unit-of-work-compiler.ts +159 -47
  424. package/src/adapters/shared/uow-operation-compiler.ts +28 -18
  425. package/src/adapters/sql/index.ts +12 -0
  426. package/src/browser/mod.ts +64 -0
  427. package/src/client.ts +19 -0
  428. package/src/db-fragment-definition-builder.test.ts +845 -53
  429. package/src/db-fragment-definition-builder.ts +911 -95
  430. package/src/db-fragment-instantiator.test.ts +210 -94
  431. package/src/db-fragment-integration.test.ts +17 -12
  432. package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
  433. package/src/dispatchers/cloudflare-do/index.test.ts +206 -0
  434. package/src/dispatchers/cloudflare-do/index.ts +63 -0
  435. package/src/dispatchers/node/dispatcher.ts +112 -0
  436. package/src/dispatchers/node/index.test.ts +120 -0
  437. package/src/dispatchers/node/index.ts +50 -0
  438. package/src/durable-hooks.test.ts +80 -0
  439. package/src/durable-hooks.ts +67 -0
  440. package/src/fragments/internal-fragment.routes.test.ts +570 -0
  441. package/src/fragments/internal-fragment.routes.ts +334 -0
  442. package/src/fragments/internal-fragment.schema.ts +95 -0
  443. package/src/fragments/internal-fragment.test.ts +505 -83
  444. package/src/fragments/internal-fragment.ts +453 -70
  445. package/src/hooks/durable-hooks-logger.ts +126 -0
  446. package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
  447. package/src/hooks/durable-hooks-processor.test.ts +282 -0
  448. package/src/hooks/durable-hooks-processor.ts +173 -0
  449. package/src/hooks/durable-hooks-runtime.test.ts +65 -0
  450. package/src/hooks/durable-hooks-runtime.ts +81 -0
  451. package/src/hooks/hooks.test.ts +455 -34
  452. package/src/hooks/hooks.ts +501 -34
  453. package/src/id.test.ts +34 -0
  454. package/src/id.ts +1 -3
  455. package/src/internal/adapter-registry.test.ts +93 -0
  456. package/src/internal/adapter-registry.ts +239 -0
  457. package/src/internal/outbox-state.ts +43 -0
  458. package/src/migration-engine/auto-from-schema.test.ts +107 -14
  459. package/src/migration-engine/auto-from-schema.ts +365 -44
  460. package/src/migration-engine/create.test.ts +4 -3
  461. package/src/migration-engine/create.ts +1 -1
  462. package/src/migration-engine/generation-engine.test.ts +292 -110
  463. package/src/migration-engine/generation-engine.ts +117 -66
  464. package/src/migration-engine/shared.ts +14 -0
  465. package/src/mod.ts +95 -39
  466. package/src/naming/sql-naming.ts +181 -0
  467. package/src/outbox/outbox-builder.ts +241 -0
  468. package/src/outbox/outbox.test.ts +424 -0
  469. package/src/outbox/outbox.ts +139 -0
  470. package/src/query/column-defaults.ts +42 -4
  471. package/src/query/condition-builder.test.ts +18 -3
  472. package/src/query/condition-builder.ts +7 -0
  473. package/src/query/cursor-client.test.ts +70 -0
  474. package/src/query/cursor-client.ts +263 -0
  475. package/src/query/cursor.test.ts +119 -20
  476. package/src/query/cursor.ts +88 -27
  477. package/src/query/db-now.ts +73 -0
  478. package/src/query/orm/orm.ts +2 -2
  479. package/src/query/query-type.test.ts +4 -3
  480. package/src/query/serialize/create-sql-serializer.ts +10 -5
  481. package/src/query/serialize/dialect/mysql-serializer.ts +13 -5
  482. package/src/query/serialize/dialect/postgres-serializer.ts +35 -5
  483. package/src/query/serialize/dialect/sqlite-serializer.test.ts +90 -3
  484. package/src/query/serialize/dialect/sqlite-serializer.ts +108 -12
  485. package/src/query/serialize/sql-serializer.ts +4 -4
  486. package/src/query/simple-query-interface.ts +15 -4
  487. package/src/query/unit-of-work/execute-unit-of-work.test.ts +372 -10
  488. package/src/query/unit-of-work/execute-unit-of-work.ts +87 -27
  489. package/src/query/unit-of-work/retry-policy.test.ts +1 -0
  490. package/src/query/unit-of-work/tx-builder.test.ts +73 -1
  491. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +17 -16
  492. package/src/query/unit-of-work/unit-of-work-types.test.ts +42 -12
  493. package/src/query/unit-of-work/unit-of-work.test.ts +196 -39
  494. package/src/query/unit-of-work/unit-of-work.ts +309 -38
  495. package/src/query/value-decoding.test.ts +63 -4
  496. package/src/query/value-decoding.ts +32 -6
  497. package/src/query/value-encoding.test.ts +86 -2
  498. package/src/query/value-encoding.ts +56 -6
  499. package/src/schema/create.test.ts +293 -47
  500. package/src/schema/create.ts +406 -70
  501. package/src/schema/generate-id.test.ts +3 -2
  502. package/src/schema/generate-id.ts +2 -2
  503. package/src/schema/serialize.test.ts +18 -5
  504. package/src/schema/type-conversion/create-sql-type-mapper.ts +8 -3
  505. package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
  506. package/src/schema/type-conversion/type-mapping.test.ts +26 -1
  507. package/src/schema/validator.test.ts +199 -0
  508. package/src/schema/validator.ts +232 -0
  509. package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +232 -129
  510. package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +155 -99
  511. package/src/schema-output/prisma.test.ts +694 -0
  512. package/src/schema-output/prisma.ts +593 -0
  513. package/src/sql-driver/better-sqlite3.test.ts +5 -3
  514. package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
  515. package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
  516. package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
  517. package/src/sql-driver/query-executor/query-executor.ts +1 -1
  518. package/src/sql-driver/sql-driver-adapter.ts +2 -2
  519. package/src/sql-driver/sql.ts +2 -1
  520. package/src/sql-driver/sqlocal.test.ts +4 -2
  521. package/src/sync/commands.test.ts +39 -0
  522. package/src/sync/commands.ts +51 -0
  523. package/src/sync/conflict-checker.test.ts +450 -0
  524. package/src/sync/conflict-checker.ts +248 -0
  525. package/src/sync/index.ts +14 -0
  526. package/src/sync/plan.ts +9 -0
  527. package/src/sync/read-tracking.test.ts +177 -0
  528. package/src/sync/read-tracking.ts +287 -0
  529. package/src/sync/submit.test.ts +205 -0
  530. package/src/sync/submit.ts +328 -0
  531. package/src/sync/types.ts +80 -0
  532. package/src/util/default-database-adapter.ts +119 -0
  533. package/src/with-database.ts +20 -31
  534. package/tsconfig.json +1 -1
  535. package/tsdown.config.ts +38 -24
  536. package/vitest.config.ts +1 -0
  537. package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
  538. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
  539. package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
  540. package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
  541. package/dist/adapters/drizzle/generate.d.ts +0 -30
  542. package/dist/adapters/drizzle/generate.d.ts.map +0 -1
  543. package/dist/adapters/drizzle/generate.js.map +0 -1
  544. package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
  545. package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
  546. package/dist/adapters/kysely/kysely-adapter.js +0 -17
  547. package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
  548. package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
  549. package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
  550. package/dist/adapters/shared/table-name-mapper.js +0 -43
  551. package/dist/adapters/shared/table-name-mapper.js.map +0 -1
  552. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +0 -165
  553. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
  554. package/dist/packages/fragno/dist/api/bind-services.js +0 -20
  555. package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
  556. package/dist/packages/fragno/dist/api/error.js +0 -48
  557. package/dist/packages/fragno/dist/api/error.js.map +0 -1
  558. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -320
  559. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
  560. package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -525
  561. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
  562. package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
  563. package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
  564. package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
  565. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
  566. package/dist/packages/fragno/dist/api/internal/route.js +0 -10
  567. package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
  568. package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
  569. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
  570. package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
  571. package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
  572. package/dist/packages/fragno/dist/api/request-input-context.js +0 -118
  573. package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
  574. package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
  575. package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
  576. package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
  577. package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
  578. package/dist/packages/fragno/dist/api/route.js +0 -17
  579. package/dist/packages/fragno/dist/api/route.js.map +0 -1
  580. package/dist/packages/fragno/dist/internal/symbols.js +0 -10
  581. package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
  582. package/dist/schema-generator/schema-generator.d.ts +0 -15
  583. package/dist/schema-generator/schema-generator.d.ts.map +0 -1
  584. package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
  585. package/src/adapters/kysely/kysely-adapter.ts +0 -27
  586. package/src/adapters/shared/table-name-mapper.ts +0 -50
  587. package/src/schema-generator/schema-generator.ts +0 -12
@@ -0,0 +1,307 @@
1
+ import { createNamingResolver, sanitizeNamespace } from "../naming/sql-naming.js";
2
+ import { defaultNamingStrategyForDatabase } from "../adapters/generic-sql/driver-config.js";
3
+ import { sqliteStorageDefault, sqliteStoragePrisma } from "../adapters/generic-sql/sqlite-storage.js";
4
+ import { internalSchema } from "../fragments/internal-fragment.schema.js";
5
+ import { parseVarchar } from "../util/parse.js";
6
+
7
+ //#region src/schema-output/prisma.ts
8
+ const VALID_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
9
+ function isValidIdentifier(name) {
10
+ return VALID_IDENTIFIER.test(name);
11
+ }
12
+ function sanitizeIdentifier(name) {
13
+ const sanitized = name.replace(/[^A-Za-z0-9_]/g, "_");
14
+ if (sanitized.length === 0) return "_";
15
+ if (/^[0-9]/.test(sanitized)) return `_${sanitized}`;
16
+ return sanitized;
17
+ }
18
+ function ensureUniqueName(base, used) {
19
+ if (!used.has(base)) return base;
20
+ let index = 1;
21
+ let candidate = `${base}_${index}`;
22
+ while (used.has(candidate)) {
23
+ index += 1;
24
+ candidate = `${base}_${index}`;
25
+ }
26
+ return candidate;
27
+ }
28
+ function toPascalCase(value) {
29
+ return value.split(/[_-]+/).filter(Boolean).map((part) => part[0]?.toUpperCase() + part.slice(1)).join("");
30
+ }
31
+ function isVarcharType(value) {
32
+ return value.startsWith("varchar(");
33
+ }
34
+ function getModelName(table, namespace) {
35
+ const base = toPascalCase(table.name);
36
+ if (!namespace) return base;
37
+ return `${base}_${sanitizeNamespace(namespace)}`;
38
+ }
39
+ function getPhysicalTableName(table, resolver) {
40
+ return resolver ? resolver.getTableName(table.name) : table.name;
41
+ }
42
+ function getRelationName(namespace, from, referenceName, to) {
43
+ if (!namespace) return `${from}_${referenceName}_${to}`;
44
+ return `${namespace}_${from}_${referenceName}_${to}`;
45
+ }
46
+ function getForeignKeyMapName(table, relation, _namespace, resolver) {
47
+ if (resolver) return resolver.getForeignKeyName({
48
+ logicalTable: table.name,
49
+ logicalReferencedTable: relation.table.name,
50
+ referenceName: relation.name
51
+ });
52
+ return `${table.name}_${relation.table.name}_${relation.name}_fk`;
53
+ }
54
+ function getIndexMapName(indexName, tableName, namespace, resolver, unique) {
55
+ if (!resolver) return namespace ? `${indexName}_${namespace}` : indexName;
56
+ return unique ? resolver.getUniqueIndexName(indexName, tableName) : resolver.getIndexName(indexName, tableName);
57
+ }
58
+ function getPrismaScalarType(column, provider, sqliteStorageMode) {
59
+ const internalIdType = provider === "sqlite" ? "Int" : "BigInt";
60
+ if (column.role === "internal-id") return { type: internalIdType };
61
+ if (column.role === "reference") return { type: internalIdType };
62
+ if (isVarcharType(column.type)) {
63
+ const length = parseVarchar(column.type);
64
+ if (provider === "postgresql" || provider === "mysql") return {
65
+ type: "String",
66
+ nativeType: `@db.VarChar(${length})`
67
+ };
68
+ return { type: "String" };
69
+ }
70
+ switch (column.type) {
71
+ case "string": return { type: "String" };
72
+ case "integer": return { type: "Int" };
73
+ case "bigint":
74
+ if (provider === "sqlite" && sqliteStorageMode.bigintStorage === "blob") return { type: "Bytes" };
75
+ return { type: "BigInt" };
76
+ case "bool": return { type: "Boolean" };
77
+ case "decimal":
78
+ if (provider === "sqlite") return { type: "Float" };
79
+ return { type: "Decimal" };
80
+ case "binary": return { type: "Bytes" };
81
+ case "json":
82
+ if (provider === "postgresql") return {
83
+ type: "Json",
84
+ nativeType: "@db.Json"
85
+ };
86
+ return { type: "Json" };
87
+ case "timestamp":
88
+ if (provider === "sqlite" && sqliteStorageMode.timestampStorage === "epoch-ms") return { type: "Int" };
89
+ return { type: "DateTime" };
90
+ case "date":
91
+ if (provider === "sqlite" && sqliteStorageMode.dateStorage === "epoch-ms") return { type: "Int" };
92
+ if (provider === "postgresql" || provider === "mysql") return {
93
+ type: "DateTime",
94
+ nativeType: "@db.Date"
95
+ };
96
+ return { type: "DateTime" };
97
+ default: {
98
+ const exhaustiveCheck = column.type;
99
+ throw new Error(`Unsupported column type: ${exhaustiveCheck}`);
100
+ }
101
+ }
102
+ }
103
+ function formatDefaultValue(value) {
104
+ if (value instanceof Date) return JSON.stringify(value.toISOString());
105
+ if (typeof value === "bigint") return value.toString();
106
+ return JSON.stringify(value);
107
+ }
108
+ function getColumnDefault(column, provider, sqliteStorageMode) {
109
+ if (!column.default) return;
110
+ if ("value" in column.default) return `@default(${formatDefaultValue(column.default.value)})`;
111
+ if ("dbSpecial" in column.default && column.default.dbSpecial === "now") {
112
+ if (getPrismaScalarType(column, provider, sqliteStorageMode).type === "DateTime") return "@default(now())";
113
+ if (provider === "sqlite") {
114
+ if ((column.type === "date" ? sqliteStorageMode.dateStorage : sqliteStorageMode.timestampStorage) === "epoch-ms") return `@default(dbgenerated("CURRENT_TIMESTAMP"))`;
115
+ }
116
+ }
117
+ }
118
+ function getColumnFieldName(columnName, usedNames) {
119
+ const fieldName = ensureUniqueName(isValidIdentifier(columnName) ? columnName : sanitizeIdentifier(columnName), usedNames);
120
+ return {
121
+ fieldName,
122
+ needsMap: fieldName !== columnName
123
+ };
124
+ }
125
+ function getRelationFieldName(baseName, usedNames) {
126
+ return ensureUniqueName(isValidIdentifier(baseName) ? baseName : sanitizeIdentifier(baseName), usedNames);
127
+ }
128
+ function isRelationOptional(relation, columnFieldNames) {
129
+ for (const [localColumn] of relation.on) if (columnFieldNames.get(localColumn)?.isNullable) return true;
130
+ return false;
131
+ }
132
+ function getColumnFieldMappings(table) {
133
+ const fieldNameByColumn = /* @__PURE__ */ new Map();
134
+ const columnByName = /* @__PURE__ */ new Map();
135
+ const usedNames = /* @__PURE__ */ new Set();
136
+ for (const column of Object.values(table.columns)) {
137
+ const { fieldName } = getColumnFieldName(column.name, usedNames);
138
+ usedNames.add(fieldName);
139
+ fieldNameByColumn.set(column.name, fieldName);
140
+ columnByName.set(column.name, column);
141
+ }
142
+ return {
143
+ fieldNameByColumn,
144
+ columnByName
145
+ };
146
+ }
147
+ function areInverseRelations(one, many) {
148
+ if (one.type !== "one" || many.type !== "many") return false;
149
+ if (one.foreignKey === false || many.foreignKey === false) return false;
150
+ if (one.referencer !== many.table || one.table !== many.referencer) return false;
151
+ return one.on.every(([left, right]) => many.on.some(([manyLeft, manyRight]) => manyLeft === right && manyRight === left));
152
+ }
153
+ function findMatchingManyRelation(one) {
154
+ for (const relation of Object.values(one.table.relations)) {
155
+ if (relation.type !== "many") continue;
156
+ if (relation.foreignKey === false) continue;
157
+ if (areInverseRelations(one, relation)) return relation;
158
+ }
159
+ }
160
+ function findMatchingOneRelation(many) {
161
+ for (const relation of Object.values(many.table.relations)) {
162
+ if (relation.type !== "one") continue;
163
+ if (relation.foreignKey === false) continue;
164
+ if (areInverseRelations(relation, many)) return relation;
165
+ }
166
+ }
167
+ function generateColumnFields(table, provider, sqliteStorageMode, fieldNameByColumn, resolver) {
168
+ const lines = [];
169
+ for (const column of Object.values(table.columns)) {
170
+ const fieldName = fieldNameByColumn.get(column.name);
171
+ const scalar = getPrismaScalarType(column, provider, sqliteStorageMode);
172
+ const isOptional = column.isNullable;
173
+ const attributes = [];
174
+ if (column.role === "internal-id") attributes.push("@id", "@default(autoincrement())");
175
+ if (column.role === "external-id") attributes.push("@unique", "@default(cuid())");
176
+ const defaultValue = getColumnDefault(column, provider, sqliteStorageMode);
177
+ if (defaultValue) attributes.push(defaultValue);
178
+ if (scalar.nativeType) attributes.push(scalar.nativeType);
179
+ const physicalName = resolver ? resolver.getColumnName(table.name, column.name) : column.name;
180
+ if (fieldName !== physicalName) attributes.push(`@map("${physicalName}")`);
181
+ const suffix = isOptional ? "?" : "";
182
+ const attrSuffix = attributes.length > 0 ? ` ${attributes.join(" ")}` : "";
183
+ lines.push(` ${fieldName} ${scalar.type}${suffix}${attrSuffix}`);
184
+ }
185
+ return lines;
186
+ }
187
+ function generateRelationFields(table, namespace, fieldNameByColumn, columnByName, fieldNameByTableColumn, resolver) {
188
+ const lines = [];
189
+ const usedNames = new Set(fieldNameByColumn.values());
190
+ const relations = Object.values(table.relations).slice().sort((a, b) => a.name.localeCompare(b.name));
191
+ for (const relation of relations) {
192
+ if (relation.type !== "one") continue;
193
+ if (relation.foreignKey === false) continue;
194
+ const fieldName = getRelationFieldName(relation.name, usedNames);
195
+ usedNames.add(fieldName);
196
+ const relationName = getRelationName(namespace, table.name, relation.name, relation.table.name);
197
+ const relatedModel = getModelName(relation.table, namespace);
198
+ const localFields = relation.on.map(([left]) => fieldNameByColumn.get(left) ?? left);
199
+ const referenceFields = relation.on.map(([, right]) => {
200
+ const actualRight = right === "id" ? "_internalId" : right;
201
+ return fieldNameByTableColumn.get(relation.table)?.get(actualRight) ?? actualRight;
202
+ });
203
+ const fkMapName = getForeignKeyMapName(table, relation, namespace, resolver);
204
+ const relationParts = [
205
+ `"${relationName}"`,
206
+ `fields: [${localFields.join(", ")}]`,
207
+ `references: [${referenceFields.join(", ")}]`,
208
+ `map: "${fkMapName}"`
209
+ ];
210
+ const suffix = isRelationOptional(relation, columnByName) ? "?" : "";
211
+ lines.push(` ${fieldName} ${relatedModel}${suffix} @relation(${relationParts.join(", ")})`);
212
+ }
213
+ for (const relation of relations) {
214
+ if (relation.type !== "many") continue;
215
+ if (relation.foreignKey === false) continue;
216
+ const matchingOne = findMatchingOneRelation(relation);
217
+ const relationName = matchingOne ? getRelationName(namespace, matchingOne.referencer.name, matchingOne.name, matchingOne.table.name) : getRelationName(namespace, relation.referencer.name, relation.name, relation.table.name);
218
+ const fieldName = getRelationFieldName(relation.name, usedNames);
219
+ usedNames.add(fieldName);
220
+ const relatedModel = getModelName(relation.table, namespace);
221
+ lines.push(` ${fieldName} ${relatedModel}[] @relation("${relationName}")`);
222
+ }
223
+ const inverseCandidates = [];
224
+ for (const sourceTable of fieldNameByTableColumn.keys()) for (const rel of Object.values(sourceTable.relations)) if (rel.type === "one" && rel.table === table && rel.foreignKey !== false) inverseCandidates.push(rel);
225
+ for (const rel of inverseCandidates.sort((a, b) => a.name.localeCompare(b.name))) {
226
+ if (findMatchingManyRelation(rel)) continue;
227
+ const baseName = rel.referencer.name;
228
+ let fieldName = baseName;
229
+ if (usedNames.has(fieldName)) fieldName = `${baseName}_${rel.name}`;
230
+ fieldName = getRelationFieldName(fieldName, usedNames);
231
+ usedNames.add(fieldName);
232
+ const relationName = getRelationName(namespace, rel.referencer.name, rel.name, rel.table.name);
233
+ const relatedModel = getModelName(rel.referencer, namespace);
234
+ lines.push(` ${fieldName} ${relatedModel}[] @relation("${relationName}")`);
235
+ }
236
+ return lines;
237
+ }
238
+ function generateModel(table, namespace, provider, sqliteStorageMode, fieldNameByTableColumn, columnByTableName, resolver) {
239
+ const modelName = getModelName(table, namespace);
240
+ const physicalName = getPhysicalTableName(table, resolver);
241
+ const fieldNameByColumn = fieldNameByTableColumn.get(table);
242
+ const columnByName = columnByTableName.get(table);
243
+ const fieldLines = [...generateColumnFields(table, provider, sqliteStorageMode, fieldNameByColumn, resolver), ...generateRelationFields(table, namespace, fieldNameByColumn, columnByName, fieldNameByTableColumn, resolver)];
244
+ const indexLines = [];
245
+ const sortedIndexes = Object.values(table.indexes).slice().sort((a, b) => a.name.localeCompare(b.name));
246
+ for (const index of sortedIndexes) {
247
+ const fields = index.columnNames.map((name) => fieldNameByColumn.get(name) ?? name).join(", ");
248
+ const mapName = getIndexMapName(index.name, table.name, namespace, resolver, index.unique);
249
+ const directive = index.unique ? "@@unique" : "@@index";
250
+ indexLines.push(` ${directive}([${fields}], map: "${mapName}")`);
251
+ }
252
+ indexLines.push(` @@map("${physicalName}")`);
253
+ return [
254
+ `model ${modelName} {`,
255
+ ...fieldLines,
256
+ ...indexLines,
257
+ `}`
258
+ ].join("\n");
259
+ }
260
+ function generatePrismaSchema(fragments, provider, options) {
261
+ const sqliteStorageMode = options?.sqliteStorageMode ?? (provider === "sqlite" ? sqliteStoragePrisma : sqliteStorageDefault);
262
+ const namingStrategy = options?.namingStrategy ?? defaultNamingStrategyForDatabase(provider);
263
+ const sortedFragments = [...fragments].sort((a, b) => {
264
+ const aInternal = a.schema === internalSchema;
265
+ const bInternal = b.schema === internalSchema;
266
+ if (aInternal) return -1;
267
+ if (bInternal) return 1;
268
+ return a.schema.name.localeCompare(b.schema.name);
269
+ });
270
+ const namespaces = [];
271
+ const seenNamespaces = /* @__PURE__ */ new Set();
272
+ for (const fragment of sortedFragments) if (!seenNamespaces.has(fragment.namespace)) {
273
+ seenNamespaces.add(fragment.namespace);
274
+ namespaces.push(fragment.namespace);
275
+ }
276
+ const fieldNameByTableColumn = /* @__PURE__ */ new Map();
277
+ const columnByTableName = /* @__PURE__ */ new Map();
278
+ for (const fragment of sortedFragments) for (const table of Object.values(fragment.schema.tables)) {
279
+ const mapping = getColumnFieldMappings(table);
280
+ fieldNameByTableColumn.set(table, mapping.fieldNameByColumn);
281
+ columnByTableName.set(table, mapping.columnByName);
282
+ }
283
+ const headerNamespaces = namespaces.filter(Boolean);
284
+ const headerSuffix = headerNamespaces.length > 0 ? headerNamespaces.join(", ") : "(internal)";
285
+ const lines = [
286
+ "// Generated by Fragno Prisma adapter.",
287
+ `// Provider: ${provider}`,
288
+ `// Namespaces: ${headerSuffix}`,
289
+ ""
290
+ ];
291
+ const models = [];
292
+ for (const fragment of sortedFragments) {
293
+ const resolver = createNamingResolver(fragment.schema, fragment.namespace, namingStrategy);
294
+ const tables = Object.values(fragment.schema.tables).slice().sort((a, b) => {
295
+ const aName = getPhysicalTableName(a, resolver);
296
+ const bName = getPhysicalTableName(b, resolver);
297
+ return aName.localeCompare(bName);
298
+ });
299
+ for (const table of tables) models.push(generateModel(table, fragment.namespace, provider, sqliteStorageMode, fieldNameByTableColumn, columnByTableName, resolver));
300
+ }
301
+ lines.push(models.join("\n\n"));
302
+ return lines.join("\n");
303
+ }
304
+
305
+ //#endregion
306
+ export { generatePrismaSchema };
307
+ //# sourceMappingURL=prisma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma.js","names":["exhaustiveCheck: never","lines: string[]","attributes: string[]","inverseCandidates: Relation[]","indexLines: string[]","namespaces: Array<string | null>","models: string[]"],"sources":["../../src/schema-output/prisma.ts"],"sourcesContent":["import {\n defaultNamingStrategyForDatabase,\n type SupportedDatabase,\n} from \"../adapters/generic-sql/driver-config\";\nimport type { SQLiteStorageMode } from \"../adapters/generic-sql/sqlite-storage\";\nimport { sqliteStorageDefault, sqliteStoragePrisma } from \"../adapters/generic-sql/sqlite-storage\";\nimport { internalSchema } from \"../fragments/internal-fragment.schema\";\nimport {\n sanitizeNamespace,\n createNamingResolver,\n type NamingResolver,\n type SqlNamingStrategy,\n} from \"../naming/sql-naming\";\nimport type { AnyColumn, AnySchema, AnyTable, Relation } from \"../schema/create\";\nimport { parseVarchar } from \"../util/parse\";\n\nexport interface GeneratePrismaSchemaOptions {\n sqliteStorageMode?: SQLiteStorageMode;\n namingStrategy?: SqlNamingStrategy;\n}\n\nconst VALID_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nfunction isValidIdentifier(name: string): boolean {\n return VALID_IDENTIFIER.test(name);\n}\n\nfunction sanitizeIdentifier(name: string): string {\n const sanitized = name.replace(/[^A-Za-z0-9_]/g, \"_\");\n if (sanitized.length === 0) {\n return \"_\";\n }\n if (/^[0-9]/.test(sanitized)) {\n return `_${sanitized}`;\n }\n return sanitized;\n}\n\nfunction ensureUniqueName(base: string, used: Set<string>): string {\n if (!used.has(base)) {\n return base;\n }\n let index = 1;\n let candidate = `${base}_${index}`;\n while (used.has(candidate)) {\n index += 1;\n candidate = `${base}_${index}`;\n }\n return candidate;\n}\n\nfunction toPascalCase(value: string): string {\n return value\n .split(/[_-]+/)\n .filter(Boolean)\n .map((part) => part[0]?.toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction isVarcharType(value: string): value is `varchar(${number})` {\n return value.startsWith(\"varchar(\");\n}\n\nfunction getModelName(table: AnyTable, namespace: string | null): string {\n const base = toPascalCase(table.name);\n if (!namespace) {\n return base;\n }\n return `${base}_${sanitizeNamespace(namespace)}`;\n}\n\nfunction getPhysicalTableName(table: AnyTable, resolver?: NamingResolver): string {\n return resolver ? resolver.getTableName(table.name) : table.name;\n}\n\nfunction getRelationName(\n namespace: string | null,\n from: string,\n referenceName: string,\n to: string,\n): string {\n if (!namespace) {\n return `${from}_${referenceName}_${to}`;\n }\n return `${namespace}_${from}_${referenceName}_${to}`;\n}\n\nfunction getForeignKeyMapName(\n table: AnyTable,\n relation: Relation,\n _namespace: string | null,\n resolver?: NamingResolver,\n): string {\n if (resolver) {\n return resolver.getForeignKeyName({\n logicalTable: table.name,\n logicalReferencedTable: relation.table.name,\n referenceName: relation.name,\n });\n }\n return `${table.name}_${relation.table.name}_${relation.name}_fk`;\n}\n\nfunction getIndexMapName(\n indexName: string,\n tableName: string,\n namespace: string | null,\n resolver?: NamingResolver,\n unique?: boolean,\n): string {\n if (!resolver) {\n return namespace ? `${indexName}_${namespace}` : indexName;\n }\n return unique\n ? resolver.getUniqueIndexName(indexName, tableName)\n : resolver.getIndexName(indexName, tableName);\n}\n\nfunction getPrismaScalarType(\n column: AnyColumn,\n provider: SupportedDatabase,\n sqliteStorageMode: SQLiteStorageMode,\n): { type: string; nativeType?: string } {\n const internalIdType = provider === \"sqlite\" ? \"Int\" : \"BigInt\";\n\n if (column.role === \"internal-id\") {\n return { type: internalIdType };\n }\n\n if (column.role === \"reference\") {\n return { type: internalIdType };\n }\n\n if (isVarcharType(column.type)) {\n const length = parseVarchar(column.type);\n if (provider === \"postgresql\" || provider === \"mysql\") {\n return { type: \"String\", nativeType: `@db.VarChar(${length})` };\n }\n return { type: \"String\" };\n }\n\n switch (column.type) {\n case \"string\":\n return { type: \"String\" };\n case \"integer\":\n return { type: \"Int\" };\n case \"bigint\":\n if (provider === \"sqlite\" && sqliteStorageMode.bigintStorage === \"blob\") {\n return { type: \"Bytes\" };\n }\n return { type: \"BigInt\" };\n case \"bool\":\n return { type: \"Boolean\" };\n case \"decimal\":\n if (provider === \"sqlite\") {\n return { type: \"Float\" };\n }\n return { type: \"Decimal\" };\n case \"binary\":\n return { type: \"Bytes\" };\n case \"json\":\n if (provider === \"postgresql\") {\n return { type: \"Json\", nativeType: \"@db.Json\" };\n }\n return { type: \"Json\" };\n case \"timestamp\":\n if (provider === \"sqlite\" && sqliteStorageMode.timestampStorage === \"epoch-ms\") {\n return { type: \"Int\" };\n }\n return { type: \"DateTime\" };\n case \"date\":\n if (provider === \"sqlite\" && sqliteStorageMode.dateStorage === \"epoch-ms\") {\n return { type: \"Int\" };\n }\n if (provider === \"postgresql\" || provider === \"mysql\") {\n return { type: \"DateTime\", nativeType: \"@db.Date\" };\n }\n return { type: \"DateTime\" };\n default: {\n const exhaustiveCheck: never = column.type;\n throw new Error(`Unsupported column type: ${exhaustiveCheck}`);\n }\n }\n}\n\nfunction formatDefaultValue(value: unknown): string {\n if (value instanceof Date) {\n return JSON.stringify(value.toISOString());\n }\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return JSON.stringify(value);\n}\n\nfunction getColumnDefault(\n column: AnyColumn,\n provider: SupportedDatabase,\n sqliteStorageMode: SQLiteStorageMode,\n): string | undefined {\n if (!column.default) {\n return undefined;\n }\n\n if (\"value\" in column.default) {\n return `@default(${formatDefaultValue(column.default.value)})`;\n }\n\n if (\"dbSpecial\" in column.default && column.default.dbSpecial === \"now\") {\n const scalar = getPrismaScalarType(column, provider, sqliteStorageMode);\n if (scalar.type === \"DateTime\") {\n return \"@default(now())\";\n }\n if (provider === \"sqlite\") {\n const storage =\n column.type === \"date\" ? sqliteStorageMode.dateStorage : sqliteStorageMode.timestampStorage;\n if (storage === \"epoch-ms\") {\n return `@default(dbgenerated(\"CURRENT_TIMESTAMP\"))`;\n }\n }\n }\n\n return undefined;\n}\n\nfunction getColumnFieldName(\n columnName: string,\n usedNames: Set<string>,\n): { fieldName: string; needsMap: boolean } {\n const isValid = isValidIdentifier(columnName);\n const baseName = isValid ? columnName : sanitizeIdentifier(columnName);\n const fieldName = ensureUniqueName(baseName, usedNames);\n return { fieldName, needsMap: fieldName !== columnName };\n}\n\nfunction getRelationFieldName(baseName: string, usedNames: Set<string>): string {\n const validBase = isValidIdentifier(baseName) ? baseName : sanitizeIdentifier(baseName);\n return ensureUniqueName(validBase, usedNames);\n}\n\nfunction isRelationOptional(relation: Relation, columnFieldNames: Map<string, AnyColumn>): boolean {\n for (const [localColumn] of relation.on) {\n const column = columnFieldNames.get(localColumn);\n if (column?.isNullable) {\n return true;\n }\n }\n return false;\n}\n\nfunction getColumnFieldMappings(table: AnyTable): {\n fieldNameByColumn: Map<string, string>;\n columnByName: Map<string, AnyColumn>;\n} {\n const fieldNameByColumn = new Map<string, string>();\n const columnByName = new Map<string, AnyColumn>();\n const usedNames = new Set<string>();\n\n for (const column of Object.values(table.columns)) {\n const { fieldName } = getColumnFieldName(column.name, usedNames);\n usedNames.add(fieldName);\n fieldNameByColumn.set(column.name, fieldName);\n columnByName.set(column.name, column);\n }\n\n return { fieldNameByColumn, columnByName };\n}\n\nfunction areInverseRelations(one: Relation, many: Relation): boolean {\n if (one.type !== \"one\" || many.type !== \"many\") {\n return false;\n }\n if (one.foreignKey === false || many.foreignKey === false) {\n return false;\n }\n if (one.referencer !== many.table || one.table !== many.referencer) {\n return false;\n }\n return one.on.every(([left, right]) =>\n many.on.some(([manyLeft, manyRight]) => manyLeft === right && manyRight === left),\n );\n}\n\nfunction findMatchingManyRelation(one: Relation): Relation | undefined {\n for (const relation of Object.values(one.table.relations)) {\n if (relation.type !== \"many\") {\n continue;\n }\n if (relation.foreignKey === false) {\n continue;\n }\n if (areInverseRelations(one, relation)) {\n return relation;\n }\n }\n return undefined;\n}\n\nfunction findMatchingOneRelation(many: Relation): Relation | undefined {\n for (const relation of Object.values(many.table.relations)) {\n if (relation.type !== \"one\") {\n continue;\n }\n if (relation.foreignKey === false) {\n continue;\n }\n if (areInverseRelations(relation, many)) {\n return relation;\n }\n }\n return undefined;\n}\n\nfunction generateColumnFields(\n table: AnyTable,\n provider: SupportedDatabase,\n sqliteStorageMode: SQLiteStorageMode,\n fieldNameByColumn: Map<string, string>,\n resolver?: NamingResolver,\n): string[] {\n const lines: string[] = [];\n\n for (const column of Object.values(table.columns)) {\n const fieldName = fieldNameByColumn.get(column.name)!;\n const scalar = getPrismaScalarType(column, provider, sqliteStorageMode);\n const isOptional = column.isNullable;\n\n const attributes: string[] = [];\n\n if (column.role === \"internal-id\") {\n attributes.push(\"@id\", \"@default(autoincrement())\");\n }\n\n if (column.role === \"external-id\") {\n attributes.push(\"@unique\", \"@default(cuid())\");\n }\n\n const defaultValue = getColumnDefault(column, provider, sqliteStorageMode);\n if (defaultValue) {\n attributes.push(defaultValue);\n }\n\n if (scalar.nativeType) {\n attributes.push(scalar.nativeType);\n }\n\n const physicalName = resolver ? resolver.getColumnName(table.name, column.name) : column.name;\n if (fieldName !== physicalName) {\n attributes.push(`@map(\"${physicalName}\")`);\n }\n\n const suffix = isOptional ? \"?\" : \"\";\n const attrSuffix = attributes.length > 0 ? ` ${attributes.join(\" \")}` : \"\";\n lines.push(` ${fieldName} ${scalar.type}${suffix}${attrSuffix}`);\n }\n\n return lines;\n}\n\nfunction generateRelationFields(\n table: AnyTable,\n namespace: string | null,\n fieldNameByColumn: Map<string, string>,\n columnByName: Map<string, AnyColumn>,\n fieldNameByTableColumn: Map<AnyTable, Map<string, string>>,\n resolver?: NamingResolver,\n): string[] {\n const lines: string[] = [];\n const usedNames = new Set<string>(fieldNameByColumn.values());\n const relations = Object.values(table.relations)\n .slice()\n .sort((a, b) => a.name.localeCompare(b.name));\n\n for (const relation of relations) {\n if (relation.type !== \"one\") {\n continue;\n }\n if (relation.foreignKey === false) {\n continue;\n }\n\n const fieldName = getRelationFieldName(relation.name, usedNames);\n usedNames.add(fieldName);\n\n const relationName = getRelationName(namespace, table.name, relation.name, relation.table.name);\n\n const relatedModel = getModelName(relation.table, namespace);\n const localFields = relation.on.map(([left]) => fieldNameByColumn.get(left) ?? left);\n const referenceFields = relation.on.map(([, right]) => {\n const actualRight = right === \"id\" ? \"_internalId\" : right;\n const refFieldNames = fieldNameByTableColumn.get(relation.table);\n return refFieldNames?.get(actualRight) ?? actualRight;\n });\n\n const fkMapName = getForeignKeyMapName(table, relation, namespace, resolver);\n\n const relationParts = [\n `\"${relationName}\"`,\n `fields: [${localFields.join(\", \")}]`,\n `references: [${referenceFields.join(\", \")}]`,\n `map: \"${fkMapName}\"`,\n ];\n\n const optional = isRelationOptional(relation, columnByName);\n const suffix = optional ? \"?\" : \"\";\n\n lines.push(` ${fieldName} ${relatedModel}${suffix} @relation(${relationParts.join(\", \")})`);\n }\n\n for (const relation of relations) {\n if (relation.type !== \"many\") {\n continue;\n }\n if (relation.foreignKey === false) {\n continue;\n }\n\n const matchingOne = findMatchingOneRelation(relation);\n const relationName = matchingOne\n ? getRelationName(\n namespace,\n matchingOne.referencer.name,\n matchingOne.name,\n matchingOne.table.name,\n )\n : getRelationName(namespace, relation.referencer.name, relation.name, relation.table.name);\n\n const fieldName = getRelationFieldName(relation.name, usedNames);\n usedNames.add(fieldName);\n\n const relatedModel = getModelName(relation.table, namespace);\n lines.push(` ${fieldName} ${relatedModel}[] @relation(\"${relationName}\")`);\n }\n\n const inverseCandidates: Relation[] = [];\n for (const sourceTable of fieldNameByTableColumn.keys()) {\n for (const rel of Object.values(sourceTable.relations)) {\n if (rel.type === \"one\" && rel.table === table && rel.foreignKey !== false) {\n inverseCandidates.push(rel);\n }\n }\n }\n\n for (const rel of inverseCandidates.sort((a, b) => a.name.localeCompare(b.name))) {\n const matchingMany = findMatchingManyRelation(rel);\n if (matchingMany) {\n continue;\n }\n\n const baseName = rel.referencer.name;\n let fieldName = baseName;\n if (usedNames.has(fieldName)) {\n fieldName = `${baseName}_${rel.name}`;\n }\n fieldName = getRelationFieldName(fieldName, usedNames);\n usedNames.add(fieldName);\n\n const relationName = getRelationName(namespace, rel.referencer.name, rel.name, rel.table.name);\n\n const relatedModel = getModelName(rel.referencer, namespace);\n lines.push(` ${fieldName} ${relatedModel}[] @relation(\"${relationName}\")`);\n }\n\n return lines;\n}\n\nfunction generateModel(\n table: AnyTable,\n namespace: string | null,\n provider: SupportedDatabase,\n sqliteStorageMode: SQLiteStorageMode,\n fieldNameByTableColumn: Map<AnyTable, Map<string, string>>,\n columnByTableName: Map<AnyTable, Map<string, AnyColumn>>,\n resolver?: NamingResolver,\n): string {\n const modelName = getModelName(table, namespace);\n const physicalName = getPhysicalTableName(table, resolver);\n\n const fieldNameByColumn = fieldNameByTableColumn.get(table)!;\n const columnByName = columnByTableName.get(table)!;\n\n const fieldLines = [\n ...generateColumnFields(table, provider, sqliteStorageMode, fieldNameByColumn, resolver),\n ...generateRelationFields(\n table,\n namespace,\n fieldNameByColumn,\n columnByName,\n fieldNameByTableColumn,\n resolver,\n ),\n ];\n\n const indexLines: string[] = [];\n const sortedIndexes = Object.values(table.indexes)\n .slice()\n .sort((a, b) => a.name.localeCompare(b.name));\n\n for (const index of sortedIndexes) {\n const fields = index.columnNames\n .map((name) => fieldNameByColumn.get(name as string) ?? name)\n .join(\", \");\n const mapName = getIndexMapName(index.name, table.name, namespace, resolver, index.unique);\n const directive = index.unique ? \"@@unique\" : \"@@index\";\n indexLines.push(` ${directive}([${fields}], map: \"${mapName}\")`);\n }\n\n indexLines.push(` @@map(\"${physicalName}\")`);\n\n const lines = [`model ${modelName} {`, ...fieldLines, ...indexLines, `}`];\n return lines.join(\"\\n\");\n}\n\nexport function generatePrismaSchema(\n fragments: { namespace: string | null; schema: AnySchema }[],\n provider: SupportedDatabase,\n options?: GeneratePrismaSchemaOptions,\n): string {\n const sqliteStorageMode =\n options?.sqliteStorageMode ??\n (provider === \"sqlite\" ? sqliteStoragePrisma : sqliteStorageDefault);\n const namingStrategy = options?.namingStrategy ?? defaultNamingStrategyForDatabase(provider);\n const sortedFragments = [...fragments].sort((a, b) => {\n const aInternal = a.schema === internalSchema;\n const bInternal = b.schema === internalSchema;\n if (aInternal) {\n return -1;\n }\n if (bInternal) {\n return 1;\n }\n return a.schema.name.localeCompare(b.schema.name);\n });\n\n const namespaces: Array<string | null> = [];\n const seenNamespaces = new Set<string | null>();\n for (const fragment of sortedFragments) {\n if (!seenNamespaces.has(fragment.namespace)) {\n seenNamespaces.add(fragment.namespace);\n namespaces.push(fragment.namespace);\n }\n }\n\n const fieldNameByTableColumn = new Map<AnyTable, Map<string, string>>();\n const columnByTableName = new Map<AnyTable, Map<string, AnyColumn>>();\n\n for (const fragment of sortedFragments) {\n for (const table of Object.values(fragment.schema.tables)) {\n const mapping = getColumnFieldMappings(table);\n fieldNameByTableColumn.set(table, mapping.fieldNameByColumn);\n columnByTableName.set(table, mapping.columnByName);\n }\n }\n\n const headerNamespaces = namespaces.filter(Boolean);\n const headerSuffix = headerNamespaces.length > 0 ? headerNamespaces.join(\", \") : \"(internal)\";\n const lines: string[] = [\n \"// Generated by Fragno Prisma adapter.\",\n `// Provider: ${provider}`,\n `// Namespaces: ${headerSuffix}`,\n \"\",\n ];\n\n const models: string[] = [];\n\n for (const fragment of sortedFragments) {\n const resolver = createNamingResolver(fragment.schema, fragment.namespace, namingStrategy);\n const tables = Object.values(fragment.schema.tables)\n .slice()\n .sort((a, b) => {\n const aName = getPhysicalTableName(a, resolver);\n const bName = getPhysicalTableName(b, resolver);\n return aName.localeCompare(bName);\n });\n\n for (const table of tables) {\n models.push(\n generateModel(\n table,\n fragment.namespace,\n provider,\n sqliteStorageMode,\n fieldNameByTableColumn,\n columnByTableName,\n resolver,\n ),\n );\n }\n }\n\n lines.push(models.join(\"\\n\\n\"));\n return lines.join(\"\\n\");\n}\n"],"mappings":"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"}
@@ -34,14 +34,12 @@ var DurableObjectDialect = class {
34
34
  };
35
35
  var DurableObjectDriver = class {
36
36
  #config;
37
- #connection = null;
38
37
  constructor(config) {
39
38
  this.#config = config;
40
39
  }
41
40
  async init() {}
42
41
  async acquireConnection() {
43
- if (!this.#connection) this.#connection = new DOConnection(this.#config);
44
- return this.#connection;
42
+ return new DOConnection(this.#config);
45
43
  }
46
44
  async beginTransaction(conn) {
47
45
  return await conn.beginTransaction();
@@ -52,12 +50,8 @@ var DurableObjectDriver = class {
52
50
  async rollbackTransaction(conn) {
53
51
  return await conn.rollbackTransaction();
54
52
  }
55
- async releaseConnection(_conn) {
56
- this.#connection = null;
57
- }
58
- async destroy() {
59
- this.#connection = null;
60
- }
53
+ async releaseConnection(_conn) {}
54
+ async destroy() {}
61
55
  };
62
56
  var DOConnection = class {
63
57
  #config;
@@ -1 +1 @@
1
- {"version":3,"file":"durable-object-dialect.js","names":["#config","#connection","#transactionPromise","transactionReady: (() => void) | null","#txn","#transactionControl"],"sources":["../../../src/sql-driver/dialects/durable-object-dialect.ts"],"sourcesContent":["import {\n CompiledQuery,\n Kysely,\n SqliteAdapter,\n SqliteIntrospector,\n SqliteQueryCompiler,\n type DatabaseConnection,\n type DatabaseIntrospector,\n type Dialect,\n type Driver,\n type QueryCompiler,\n type QueryResult,\n} from \"kysely\";\n\ninterface DurableObjectId {\n toString(): string;\n equals(other: DurableObjectId): boolean;\n readonly name?: string;\n}\n\ninterface DurableObjectTransaction {\n rollback(): void;\n}\n\ntype SqlStorageValue = ArrayBuffer | string | number | null;\n\ninterface SqlStorage {\n exec<T extends Record<string, SqlStorageValue>>(\n query: string,\n // oxlint-disable-next-line no-explicit-any\n ...bindings: any[]\n ): SqlStorageCursor<T>;\n Cursor: typeof SqlStorageCursor;\n Statement: typeof SqlStorageStatement;\n}\n\ndeclare abstract class SqlStorageStatement {}\ndeclare abstract class SqlStorageCursor<T extends Record<string, SqlStorageValue>> {\n next():\n | {\n done?: false;\n value: T;\n }\n | {\n done: true;\n value?: never;\n };\n toArray(): T[];\n one(): T;\n raw<U extends SqlStorageValue[]>(): IterableIterator<U>;\n columnNames: string[];\n get rowsRead(): number;\n get rowsWritten(): number;\n [Symbol.iterator](): IterableIterator<T>;\n}\n\ninterface DurableObjectStorage {\n transaction<T>(closure: (txn: DurableObjectTransaction) => Promise<T>): Promise<T>;\n\n readonly sql: SqlStorage;\n}\n\ninterface DurableObjectState {\n readonly id: DurableObjectId;\n readonly storage: DurableObjectStorage;\n}\n\n/**\n * Config for the Durable Objects dialect. Pass your Durable Object state to this object.\n */\nexport interface DODialectConfig {\n ctx: DurableObjectState;\n}\n\n/**\n * DO dialect that adds support for [Cloudflare Durable Objects][0] in [Kysely][1].\n * The constructor takes the Durable Object state context.\n *\n * ```typescript\n * new DurableObjectDialect({\n * ctx: this.ctx,\n * })\n * ```\n *\n * [0]: https://developers.cloudflare.com/durable-objects/\n * [1]: https://github.com/koskimas/kysely\n */\nexport class DurableObjectDialect implements Dialect {\n #config: DODialectConfig;\n\n constructor(config: DODialectConfig) {\n this.#config = config;\n }\n\n createAdapter() {\n return new SqliteAdapter();\n }\n\n createDriver(): Driver {\n return new DurableObjectDriver(this.#config);\n }\n\n createQueryCompiler(): QueryCompiler {\n return new SqliteQueryCompiler();\n }\n\n createIntrospector(db: Kysely<unknown>): DatabaseIntrospector {\n return new SqliteIntrospector(db);\n }\n}\n\nclass DurableObjectDriver implements Driver {\n #config: DODialectConfig;\n #connection: DOConnection | null = null;\n\n constructor(config: DODialectConfig) {\n this.#config = config;\n }\n\n async init(): Promise<void> {}\n\n async acquireConnection(): Promise<DatabaseConnection> {\n // Ensure only one connection exists\n if (!this.#connection) {\n this.#connection = new DOConnection(this.#config);\n }\n return this.#connection;\n }\n\n async beginTransaction(conn: DOConnection): Promise<void> {\n return await conn.beginTransaction();\n }\n\n async commitTransaction(conn: DOConnection): Promise<void> {\n return await conn.commitTransaction();\n }\n\n async rollbackTransaction(conn: DOConnection): Promise<void> {\n return await conn.rollbackTransaction();\n }\n\n async releaseConnection(_conn: DOConnection): Promise<void> {\n this.#connection = null;\n }\n\n async destroy(): Promise<void> {\n this.#connection = null;\n }\n}\n\nclass DOConnection implements DatabaseConnection {\n #config: DODialectConfig;\n #transactionPromise: Promise<void> | null = null;\n #transactionControl: {\n resolve: () => void;\n reject: (error: Error) => void;\n } | null = null;\n #txn: DurableObjectTransaction | null = null;\n\n constructor(config: DODialectConfig) {\n this.#config = config;\n }\n\n async executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>> {\n const cursor = this.#config.ctx.storage.sql.exec(\n compiledQuery.sql,\n ...compiledQuery.parameters,\n );\n\n const rows = cursor.toArray() as O[];\n const numAffectedRows = cursor.rowsWritten > 0 ? BigInt(cursor.rowsWritten) : undefined;\n\n return {\n insertId: undefined, // Durable Objects doesn't provide last_row_id like D1\n rows: rows || [],\n numAffectedRows,\n };\n }\n\n async beginTransaction() {\n if (this.#transactionPromise) {\n throw new Error(\"Transaction already in progress\");\n }\n\n // Use a promise to wait for the transaction closure to actually start\n let transactionReady: (() => void) | null = null;\n const readyPromise = new Promise<void>((resolve) => {\n transactionReady = resolve;\n });\n\n // Start the transaction - all queries executed will be inside this closure\n this.#transactionPromise = this.#config.ctx.storage\n .transaction(async (txn) => {\n this.#txn = txn;\n\n // Wait for commit or rollback to be called\n await new Promise<void>((resolve, reject) => {\n this.#transactionControl = { resolve, reject };\n // Signal that transaction is ready\n if (transactionReady) {\n transactionReady();\n }\n });\n })\n .catch((error) => {\n // Don't clear state here - let commit/rollback handle it\n throw error;\n });\n\n // Wait for the transaction closure to set up before returning\n await readyPromise;\n }\n\n async commitTransaction() {\n if (!this.#transactionPromise || !this.#transactionControl) {\n throw new Error(\"No transaction to commit\");\n }\n\n try {\n // Signal commit and wait for transaction to complete\n this.#transactionControl.resolve();\n await this.#transactionPromise;\n } finally {\n this.#transactionPromise = null;\n this.#transactionControl = null;\n this.#txn = null;\n }\n }\n\n async rollbackTransaction() {\n if (!this.#transactionPromise || !this.#transactionControl) {\n throw new Error(\"No transaction to rollback\");\n }\n\n try {\n // Signal rollback\n if (this.#txn) {\n this.#txn.rollback();\n }\n this.#transactionControl.reject(new Error(\"Transaction rolled back\"));\n\n // Wait for transaction to complete (will reject, but we catch it)\n await this.#transactionPromise.catch(() => {\n /* Expected to reject on rollback */\n });\n } finally {\n this.#transactionPromise = null;\n this.#transactionControl = null;\n this.#txn = null;\n }\n }\n\n // oxlint-disable-next-line require-yield\n async *streamQuery<O>(\n _compiledQuery: CompiledQuery,\n _chunkSize: number,\n ): AsyncIterableIterator<QueryResult<O>> {\n throw new Error(\"DO Driver does not support streaming\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAuFA,IAAa,uBAAb,MAAqD;CACnD;CAEA,YAAY,QAAyB;AACnC,QAAKA,SAAU;;CAGjB,gBAAgB;AACd,SAAO,IAAI,eAAe;;CAG5B,eAAuB;AACrB,SAAO,IAAI,oBAAoB,MAAKA,OAAQ;;CAG9C,sBAAqC;AACnC,SAAO,IAAI,qBAAqB;;CAGlC,mBAAmB,IAA2C;AAC5D,SAAO,IAAI,mBAAmB,GAAG;;;AAIrC,IAAM,sBAAN,MAA4C;CAC1C;CACA,cAAmC;CAEnC,YAAY,QAAyB;AACnC,QAAKA,SAAU;;CAGjB,MAAM,OAAsB;CAE5B,MAAM,oBAAiD;AAErD,MAAI,CAAC,MAAKC,WACR,OAAKA,aAAc,IAAI,aAAa,MAAKD,OAAQ;AAEnD,SAAO,MAAKC;;CAGd,MAAM,iBAAiB,MAAmC;AACxD,SAAO,MAAM,KAAK,kBAAkB;;CAGtC,MAAM,kBAAkB,MAAmC;AACzD,SAAO,MAAM,KAAK,mBAAmB;;CAGvC,MAAM,oBAAoB,MAAmC;AAC3D,SAAO,MAAM,KAAK,qBAAqB;;CAGzC,MAAM,kBAAkB,OAAoC;AAC1D,QAAKA,aAAc;;CAGrB,MAAM,UAAyB;AAC7B,QAAKA,aAAc;;;AAIvB,IAAM,eAAN,MAAiD;CAC/C;CACA,sBAA4C;CAC5C,sBAGW;CACX,OAAwC;CAExC,YAAY,QAAyB;AACnC,QAAKD,SAAU;;CAGjB,MAAM,aAAgB,eAAuD;EAC3E,MAAM,SAAS,MAAKA,OAAQ,IAAI,QAAQ,IAAI,KAC1C,cAAc,KACd,GAAG,cAAc,WAClB;EAED,MAAM,OAAO,OAAO,SAAS;EAC7B,MAAM,kBAAkB,OAAO,cAAc,IAAI,OAAO,OAAO,YAAY,GAAG;AAE9E,SAAO;GACL,UAAU;GACV,MAAM,QAAQ,EAAE;GAChB;GACD;;CAGH,MAAM,mBAAmB;AACvB,MAAI,MAAKE,mBACP,OAAM,IAAI,MAAM,kCAAkC;EAIpD,IAAIC,mBAAwC;EAC5C,MAAM,eAAe,IAAI,SAAe,YAAY;AAClD,sBAAmB;IACnB;AAGF,QAAKD,qBAAsB,MAAKF,OAAQ,IAAI,QACzC,YAAY,OAAO,QAAQ;AAC1B,SAAKI,MAAO;AAGZ,SAAM,IAAI,SAAe,SAAS,WAAW;AAC3C,UAAKC,qBAAsB;KAAE;KAAS;KAAQ;AAE9C,QAAI,iBACF,mBAAkB;KAEpB;IACF,CACD,OAAO,UAAU;AAEhB,SAAM;IACN;AAGJ,QAAM;;CAGR,MAAM,oBAAoB;AACxB,MAAI,CAAC,MAAKH,sBAAuB,CAAC,MAAKG,mBACrC,OAAM,IAAI,MAAM,2BAA2B;AAG7C,MAAI;AAEF,SAAKA,mBAAoB,SAAS;AAClC,SAAM,MAAKH;YACH;AACR,SAAKA,qBAAsB;AAC3B,SAAKG,qBAAsB;AAC3B,SAAKD,MAAO;;;CAIhB,MAAM,sBAAsB;AAC1B,MAAI,CAAC,MAAKF,sBAAuB,CAAC,MAAKG,mBACrC,OAAM,IAAI,MAAM,6BAA6B;AAG/C,MAAI;AAEF,OAAI,MAAKD,IACP,OAAKA,IAAK,UAAU;AAEtB,SAAKC,mBAAoB,uBAAO,IAAI,MAAM,0BAA0B,CAAC;AAGrE,SAAM,MAAKH,mBAAoB,YAAY,GAEzC;YACM;AACR,SAAKA,qBAAsB;AAC3B,SAAKG,qBAAsB;AAC3B,SAAKD,MAAO;;;CAKhB,OAAO,YACL,gBACA,YACuC;AACvC,QAAM,IAAI,MAAM,uCAAuC"}
1
+ {"version":3,"file":"durable-object-dialect.js","names":["#config","#transactionPromise","transactionReady: (() => void) | null","#txn","#transactionControl"],"sources":["../../../src/sql-driver/dialects/durable-object-dialect.ts"],"sourcesContent":["import {\n CompiledQuery,\n Kysely,\n SqliteAdapter,\n SqliteIntrospector,\n SqliteQueryCompiler,\n type DatabaseConnection,\n type DatabaseIntrospector,\n type Dialect,\n type Driver,\n type QueryCompiler,\n type QueryResult,\n} from \"kysely\";\n\ninterface DurableObjectId {\n toString(): string;\n equals(other: DurableObjectId): boolean;\n readonly name?: string;\n}\n\ninterface DurableObjectTransaction {\n rollback(): void;\n}\n\ntype SqlStorageValue = ArrayBuffer | string | number | null;\n\ninterface SqlStorage {\n exec<T extends Record<string, SqlStorageValue>>(\n query: string,\n // oxlint-disable-next-line no-explicit-any\n ...bindings: any[]\n ): SqlStorageCursor<T>;\n Cursor: typeof SqlStorageCursor;\n Statement: typeof SqlStorageStatement;\n}\n\ndeclare abstract class SqlStorageStatement {}\ndeclare abstract class SqlStorageCursor<T extends Record<string, SqlStorageValue>> {\n next():\n | {\n done?: false;\n value: T;\n }\n | {\n done: true;\n value?: never;\n };\n toArray(): T[];\n one(): T;\n raw<U extends SqlStorageValue[]>(): IterableIterator<U>;\n columnNames: string[];\n get rowsRead(): number;\n get rowsWritten(): number;\n [Symbol.iterator](): IterableIterator<T>;\n}\n\ninterface DurableObjectStorage {\n transaction<T>(closure: (txn: DurableObjectTransaction) => Promise<T>): Promise<T>;\n\n readonly sql: SqlStorage;\n}\n\ninterface DurableObjectState {\n readonly id: DurableObjectId;\n readonly storage: DurableObjectStorage;\n}\n\n/**\n * Config for the Durable Objects dialect. Pass your Durable Object state to this object.\n */\nexport interface DODialectConfig {\n ctx: DurableObjectState;\n}\n\n/**\n * DO dialect that adds support for [Cloudflare Durable Objects][0] in [Kysely][1].\n * The constructor takes the Durable Object state context.\n *\n * ```typescript\n * new DurableObjectDialect({\n * ctx: this.ctx,\n * })\n * ```\n *\n * [0]: https://developers.cloudflare.com/durable-objects/\n * [1]: https://github.com/koskimas/kysely\n */\nexport class DurableObjectDialect implements Dialect {\n #config: DODialectConfig;\n\n constructor(config: DODialectConfig) {\n this.#config = config;\n }\n\n createAdapter() {\n return new SqliteAdapter();\n }\n\n createDriver(): Driver {\n return new DurableObjectDriver(this.#config);\n }\n\n createQueryCompiler(): QueryCompiler {\n return new SqliteQueryCompiler();\n }\n\n createIntrospector(db: Kysely<unknown>): DatabaseIntrospector {\n return new SqliteIntrospector(db);\n }\n}\n\nclass DurableObjectDriver implements Driver {\n #config: DODialectConfig;\n\n constructor(config: DODialectConfig) {\n this.#config = config;\n }\n\n async init(): Promise<void> {}\n\n async acquireConnection(): Promise<DatabaseConnection> {\n return new DOConnection(this.#config);\n }\n\n async beginTransaction(conn: DOConnection): Promise<void> {\n return await conn.beginTransaction();\n }\n\n async commitTransaction(conn: DOConnection): Promise<void> {\n return await conn.commitTransaction();\n }\n\n async rollbackTransaction(conn: DOConnection): Promise<void> {\n return await conn.rollbackTransaction();\n }\n\n async releaseConnection(_conn: DOConnection): Promise<void> {\n // No-op\n }\n\n async destroy(): Promise<void> {\n // No-op\n }\n}\n\nclass DOConnection implements DatabaseConnection {\n #config: DODialectConfig;\n #transactionPromise: Promise<void> | null = null;\n #transactionControl: {\n resolve: () => void;\n reject: (error: Error) => void;\n } | null = null;\n #txn: DurableObjectTransaction | null = null;\n\n constructor(config: DODialectConfig) {\n this.#config = config;\n }\n\n async executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>> {\n const cursor = this.#config.ctx.storage.sql.exec(\n compiledQuery.sql,\n ...compiledQuery.parameters,\n );\n\n const rows = cursor.toArray() as O[];\n const numAffectedRows = cursor.rowsWritten > 0 ? BigInt(cursor.rowsWritten) : undefined;\n\n return {\n insertId: undefined, // Durable Objects doesn't provide last_row_id like D1\n rows: rows || [],\n numAffectedRows,\n };\n }\n\n async beginTransaction() {\n if (this.#transactionPromise) {\n throw new Error(\"Transaction already in progress\");\n }\n\n // Use a promise to wait for the transaction closure to actually start\n let transactionReady: (() => void) | null = null;\n const readyPromise = new Promise<void>((resolve) => {\n transactionReady = resolve;\n });\n\n // Start the transaction - all queries executed will be inside this closure\n this.#transactionPromise = this.#config.ctx.storage\n .transaction(async (txn) => {\n this.#txn = txn;\n\n // Wait for commit or rollback to be called\n await new Promise<void>((resolve, reject) => {\n this.#transactionControl = { resolve, reject };\n // Signal that transaction is ready\n if (transactionReady) {\n transactionReady();\n }\n });\n })\n .catch((error) => {\n // Don't clear state here - let commit/rollback handle it\n throw error;\n });\n\n // Wait for the transaction closure to set up before returning\n await readyPromise;\n }\n\n async commitTransaction() {\n if (!this.#transactionPromise || !this.#transactionControl) {\n throw new Error(\"No transaction to commit\");\n }\n\n try {\n // Signal commit and wait for transaction to complete\n this.#transactionControl.resolve();\n await this.#transactionPromise;\n } finally {\n this.#transactionPromise = null;\n this.#transactionControl = null;\n this.#txn = null;\n }\n }\n\n async rollbackTransaction() {\n if (!this.#transactionPromise || !this.#transactionControl) {\n throw new Error(\"No transaction to rollback\");\n }\n\n try {\n // Signal rollback\n if (this.#txn) {\n this.#txn.rollback();\n }\n this.#transactionControl.reject(new Error(\"Transaction rolled back\"));\n\n // Wait for transaction to complete (will reject, but we catch it)\n await this.#transactionPromise.catch(() => {\n /* Expected to reject on rollback */\n });\n } finally {\n this.#transactionPromise = null;\n this.#transactionControl = null;\n this.#txn = null;\n }\n }\n\n // oxlint-disable-next-line require-yield\n async *streamQuery<O>(\n _compiledQuery: CompiledQuery,\n _chunkSize: number,\n ): AsyncIterableIterator<QueryResult<O>> {\n throw new Error(\"DO Driver does not support streaming\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAuFA,IAAa,uBAAb,MAAqD;CACnD;CAEA,YAAY,QAAyB;AACnC,QAAKA,SAAU;;CAGjB,gBAAgB;AACd,SAAO,IAAI,eAAe;;CAG5B,eAAuB;AACrB,SAAO,IAAI,oBAAoB,MAAKA,OAAQ;;CAG9C,sBAAqC;AACnC,SAAO,IAAI,qBAAqB;;CAGlC,mBAAmB,IAA2C;AAC5D,SAAO,IAAI,mBAAmB,GAAG;;;AAIrC,IAAM,sBAAN,MAA4C;CAC1C;CAEA,YAAY,QAAyB;AACnC,QAAKA,SAAU;;CAGjB,MAAM,OAAsB;CAE5B,MAAM,oBAAiD;AACrD,SAAO,IAAI,aAAa,MAAKA,OAAQ;;CAGvC,MAAM,iBAAiB,MAAmC;AACxD,SAAO,MAAM,KAAK,kBAAkB;;CAGtC,MAAM,kBAAkB,MAAmC;AACzD,SAAO,MAAM,KAAK,mBAAmB;;CAGvC,MAAM,oBAAoB,MAAmC;AAC3D,SAAO,MAAM,KAAK,qBAAqB;;CAGzC,MAAM,kBAAkB,OAAoC;CAI5D,MAAM,UAAyB;;AAKjC,IAAM,eAAN,MAAiD;CAC/C;CACA,sBAA4C;CAC5C,sBAGW;CACX,OAAwC;CAExC,YAAY,QAAyB;AACnC,QAAKA,SAAU;;CAGjB,MAAM,aAAgB,eAAuD;EAC3E,MAAM,SAAS,MAAKA,OAAQ,IAAI,QAAQ,IAAI,KAC1C,cAAc,KACd,GAAG,cAAc,WAClB;EAED,MAAM,OAAO,OAAO,SAAS;EAC7B,MAAM,kBAAkB,OAAO,cAAc,IAAI,OAAO,OAAO,YAAY,GAAG;AAE9E,SAAO;GACL,UAAU;GACV,MAAM,QAAQ,EAAE;GAChB;GACD;;CAGH,MAAM,mBAAmB;AACvB,MAAI,MAAKC,mBACP,OAAM,IAAI,MAAM,kCAAkC;EAIpD,IAAIC,mBAAwC;EAC5C,MAAM,eAAe,IAAI,SAAe,YAAY;AAClD,sBAAmB;IACnB;AAGF,QAAKD,qBAAsB,MAAKD,OAAQ,IAAI,QACzC,YAAY,OAAO,QAAQ;AAC1B,SAAKG,MAAO;AAGZ,SAAM,IAAI,SAAe,SAAS,WAAW;AAC3C,UAAKC,qBAAsB;KAAE;KAAS;KAAQ;AAE9C,QAAI,iBACF,mBAAkB;KAEpB;IACF,CACD,OAAO,UAAU;AAEhB,SAAM;IACN;AAGJ,QAAM;;CAGR,MAAM,oBAAoB;AACxB,MAAI,CAAC,MAAKH,sBAAuB,CAAC,MAAKG,mBACrC,OAAM,IAAI,MAAM,2BAA2B;AAG7C,MAAI;AAEF,SAAKA,mBAAoB,SAAS;AAClC,SAAM,MAAKH;YACH;AACR,SAAKA,qBAAsB;AAC3B,SAAKG,qBAAsB;AAC3B,SAAKD,MAAO;;;CAIhB,MAAM,sBAAsB;AAC1B,MAAI,CAAC,MAAKF,sBAAuB,CAAC,MAAKG,mBACrC,OAAM,IAAI,MAAM,6BAA6B;AAG/C,MAAI;AAEF,OAAI,MAAKD,IACP,OAAKA,IAAK,UAAU;AAEtB,SAAKC,mBAAoB,uBAAO,IAAI,MAAM,0BAA0B,CAAC;AAGrE,SAAM,MAAKH,mBAAoB,YAAY,GAEzC;YACM;AACR,SAAKA,qBAAsB;AAC3B,SAAKG,qBAAsB;AAC3B,SAAKD,MAAO;;;CAKhB,OAAO,YACL,gBACA,YACuC;AACvC,QAAM,IAAI,MAAM,uCAAuC"}
@@ -1 +1 @@
1
- {"version":3,"file":"default-query-executor.js","names":["#connectionProvider"],"sources":["../../../src/sql-driver/query-executor/default-query-executor.ts"],"sourcesContent":["/**\n * Adapted from Kysely's DefaultQueryExecutor\n * Modified from: https://github.com/kysely-org/kysely\n * License: MIT\n * Copyright (c) 2022 Sami Koskimäki\n *\n * Simplified to remove query compilation.\n */\n\nimport type { DatabaseConnection } from \"../sql-driver\";\nimport type { ConnectionProvider } from \"../connection/connection-provider\";\nimport type { GenericSQLPlugin } from \"./plugin\";\nimport { QueryExecutorBase } from \"./query-executor-base\";\n\nexport class DefaultQueryExecutor extends QueryExecutorBase {\n readonly #connectionProvider: ConnectionProvider;\n\n constructor(connectionProvider: ConnectionProvider, plugins: GenericSQLPlugin[] = []) {\n super(plugins);\n this.#connectionProvider = connectionProvider;\n }\n\n provideConnection<T>(consumer: (connection: DatabaseConnection) => Promise<T>): Promise<T> {\n return this.#connectionProvider.provideConnection(consumer);\n }\n\n withConnectionProvider(connectionProvider: ConnectionProvider): DefaultQueryExecutor {\n return new DefaultQueryExecutor(connectionProvider, [...this.plugins]);\n }\n\n withPlugin(plugin: GenericSQLPlugin): DefaultQueryExecutor {\n return new DefaultQueryExecutor(this.#connectionProvider, [...this.plugins, plugin]);\n }\n\n withoutPlugins(): DefaultQueryExecutor {\n return new DefaultQueryExecutor(this.#connectionProvider, []);\n }\n}\n"],"mappings":";;;AAcA,IAAa,uBAAb,MAAa,6BAA6B,kBAAkB;CAC1D,CAASA;CAET,YAAY,oBAAwC,UAA8B,EAAE,EAAE;AACpF,QAAM,QAAQ;AACd,QAAKA,qBAAsB;;CAG7B,kBAAqB,UAAsE;AACzF,SAAO,MAAKA,mBAAoB,kBAAkB,SAAS;;CAG7D,uBAAuB,oBAA8D;AACnF,SAAO,IAAI,qBAAqB,oBAAoB,CAAC,GAAG,KAAK,QAAQ,CAAC;;CAGxE,WAAW,QAAgD;AACzD,SAAO,IAAI,qBAAqB,MAAKA,oBAAqB,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC;;CAGtF,iBAAuC;AACrC,SAAO,IAAI,qBAAqB,MAAKA,oBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"default-query-executor.js","names":["#connectionProvider"],"sources":["../../../src/sql-driver/query-executor/default-query-executor.ts"],"sourcesContent":["/**\n * Adapted from Kysely's DefaultQueryExecutor\n * Modified from: https://github.com/kysely-org/kysely\n * License: MIT\n * Copyright (c) 2022 Sami Koskimäki\n *\n * Simplified to remove query compilation.\n */\n\nimport type { ConnectionProvider } from \"../connection/connection-provider\";\nimport type { DatabaseConnection } from \"../sql-driver\";\nimport type { GenericSQLPlugin } from \"./plugin\";\nimport { QueryExecutorBase } from \"./query-executor-base\";\n\nexport class DefaultQueryExecutor extends QueryExecutorBase {\n readonly #connectionProvider: ConnectionProvider;\n\n constructor(connectionProvider: ConnectionProvider, plugins: GenericSQLPlugin[] = []) {\n super(plugins);\n this.#connectionProvider = connectionProvider;\n }\n\n provideConnection<T>(consumer: (connection: DatabaseConnection) => Promise<T>): Promise<T> {\n return this.#connectionProvider.provideConnection(consumer);\n }\n\n withConnectionProvider(connectionProvider: ConnectionProvider): DefaultQueryExecutor {\n return new DefaultQueryExecutor(connectionProvider, [...this.plugins]);\n }\n\n withPlugin(plugin: GenericSQLPlugin): DefaultQueryExecutor {\n return new DefaultQueryExecutor(this.#connectionProvider, [...this.plugins, plugin]);\n }\n\n withoutPlugins(): DefaultQueryExecutor {\n return new DefaultQueryExecutor(this.#connectionProvider, []);\n }\n}\n"],"mappings":";;;AAcA,IAAa,uBAAb,MAAa,6BAA6B,kBAAkB;CAC1D,CAASA;CAET,YAAY,oBAAwC,UAA8B,EAAE,EAAE;AACpF,QAAM,QAAQ;AACd,QAAKA,qBAAsB;;CAG7B,kBAAqB,UAAsE;AACzF,SAAO,MAAKA,mBAAoB,kBAAkB,SAAS;;CAG7D,uBAAuB,oBAA8D;AACnF,SAAO,IAAI,qBAAqB,oBAAoB,CAAC,GAAG,KAAK,QAAQ,CAAC;;CAGxE,WAAW,QAAgD;AACzD,SAAO,IAAI,qBAAqB,MAAKA,oBAAqB,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC;;CAGtF,iBAAuC;AACrC,SAAO,IAAI,qBAAqB,MAAKA,oBAAqB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"query-executor-base.js","names":["NO_PLUGINS: ReadonlyArray<GenericSQLPlugin>","#plugins","#transformResult"],"sources":["../../../src/sql-driver/query-executor/query-executor-base.ts"],"sourcesContent":["/**\n * Adapted from Kysely's QueryExecutorBase\n * Modified from: https://github.com/kysely-org/kysely\n * License: MIT\n * Copyright (c) 2022 Sami Koskimäki\n *\n * Simplified to remove query compilation, streaming, and batching.\n */\n\nimport type { DatabaseConnection, CompiledQuery, QueryResult } from \"../sql-driver\";\nimport type { ConnectionProvider } from \"../connection/connection-provider\";\nimport type { GenericSQLPlugin } from \"./plugin\";\nimport type { QueryExecutor } from \"./query-executor\";\n\nconst NO_PLUGINS: ReadonlyArray<GenericSQLPlugin> = Object.freeze([]);\n\nexport abstract class QueryExecutorBase implements QueryExecutor {\n readonly #plugins: ReadonlyArray<GenericSQLPlugin>;\n\n constructor(plugins: ReadonlyArray<GenericSQLPlugin> = NO_PLUGINS) {\n this.#plugins = plugins;\n }\n\n get plugins(): ReadonlyArray<GenericSQLPlugin> {\n return this.#plugins;\n }\n\n abstract provideConnection<T>(\n consumer: (connection: DatabaseConnection) => Promise<T>,\n ): Promise<T>;\n\n async executeQuery<R>(compiledQuery: CompiledQuery): Promise<QueryResult<R>> {\n return await this.provideConnection(async (connection) => {\n const result = await connection.executeQuery(compiledQuery);\n return await this.#transformResult(result);\n });\n }\n\n abstract withConnectionProvider(connectionProvider: ConnectionProvider): QueryExecutorBase;\n\n abstract withPlugin(plugin: GenericSQLPlugin): QueryExecutorBase;\n\n abstract withoutPlugins(): QueryExecutorBase;\n\n // oxlint-disable-next-line no-explicit-any\n async #transformResult<T>(result: QueryResult<any>): Promise<QueryResult<T>> {\n for (const plugin of this.#plugins) {\n result = await plugin.transformResult({ result });\n }\n\n return result;\n }\n}\n"],"mappings":";AAcA,MAAMA,aAA8C,OAAO,OAAO,EAAE,CAAC;AAErE,IAAsB,oBAAtB,MAAiE;CAC/D,CAASC;CAET,YAAY,UAA2C,YAAY;AACjE,QAAKA,UAAW;;CAGlB,IAAI,UAA2C;AAC7C,SAAO,MAAKA;;CAOd,MAAM,aAAgB,eAAuD;AAC3E,SAAO,MAAM,KAAK,kBAAkB,OAAO,eAAe;GACxD,MAAM,SAAS,MAAM,WAAW,aAAa,cAAc;AAC3D,UAAO,MAAM,MAAKC,gBAAiB,OAAO;IAC1C;;CAUJ,OAAMA,gBAAoB,QAAmD;AAC3E,OAAK,MAAM,UAAU,MAAKD,QACxB,UAAS,MAAM,OAAO,gBAAgB,EAAE,QAAQ,CAAC;AAGnD,SAAO"}
1
+ {"version":3,"file":"query-executor-base.js","names":["NO_PLUGINS: ReadonlyArray<GenericSQLPlugin>","#plugins","#transformResult"],"sources":["../../../src/sql-driver/query-executor/query-executor-base.ts"],"sourcesContent":["/**\n * Adapted from Kysely's QueryExecutorBase\n * Modified from: https://github.com/kysely-org/kysely\n * License: MIT\n * Copyright (c) 2022 Sami Koskimäki\n *\n * Simplified to remove query compilation, streaming, and batching.\n */\n\nimport type { ConnectionProvider } from \"../connection/connection-provider\";\nimport type { DatabaseConnection, CompiledQuery, QueryResult } from \"../sql-driver\";\nimport type { GenericSQLPlugin } from \"./plugin\";\nimport type { QueryExecutor } from \"./query-executor\";\n\nconst NO_PLUGINS: ReadonlyArray<GenericSQLPlugin> = Object.freeze([]);\n\nexport abstract class QueryExecutorBase implements QueryExecutor {\n readonly #plugins: ReadonlyArray<GenericSQLPlugin>;\n\n constructor(plugins: ReadonlyArray<GenericSQLPlugin> = NO_PLUGINS) {\n this.#plugins = plugins;\n }\n\n get plugins(): ReadonlyArray<GenericSQLPlugin> {\n return this.#plugins;\n }\n\n abstract provideConnection<T>(\n consumer: (connection: DatabaseConnection) => Promise<T>,\n ): Promise<T>;\n\n async executeQuery<R>(compiledQuery: CompiledQuery): Promise<QueryResult<R>> {\n return await this.provideConnection(async (connection) => {\n const result = await connection.executeQuery(compiledQuery);\n return await this.#transformResult(result);\n });\n }\n\n abstract withConnectionProvider(connectionProvider: ConnectionProvider): QueryExecutorBase;\n\n abstract withPlugin(plugin: GenericSQLPlugin): QueryExecutorBase;\n\n abstract withoutPlugins(): QueryExecutorBase;\n\n // oxlint-disable-next-line no-explicit-any\n async #transformResult<T>(result: QueryResult<any>): Promise<QueryResult<T>> {\n for (const plugin of this.#plugins) {\n result = await plugin.transformResult({ result });\n }\n\n return result;\n }\n}\n"],"mappings":";AAcA,MAAMA,aAA8C,OAAO,OAAO,EAAE,CAAC;AAErE,IAAsB,oBAAtB,MAAiE;CAC/D,CAASC;CAET,YAAY,UAA2C,YAAY;AACjE,QAAKA,UAAW;;CAGlB,IAAI,UAA2C;AAC7C,SAAO,MAAKA;;CAOd,MAAM,aAAgB,eAAuD;AAC3E,SAAO,MAAM,KAAK,kBAAkB,OAAO,eAAe;GACxD,MAAM,SAAS,MAAM,WAAW,aAAa,cAAc;AAC3D,UAAO,MAAM,MAAKC,gBAAiB,OAAO;IAC1C;;CAUJ,OAAMA,gBAAoB,QAAmD;AAC3E,OAAK,MAAM,UAAU,MAAKD,QACxB,UAAS,MAAM,OAAO,gBAAgB,EAAE,QAAQ,CAAC;AAGnD,SAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"sql-driver-adapter.js","names":["#dialect","#driver","#executor"],"sources":["../../src/sql-driver/sql-driver-adapter.ts"],"sourcesContent":["/**\n * Adapted from Kysely patterns\n * Modified from: https://github.com/kysely-org/kysely\n * License: MIT\n * Copyright (c) 2022 Sami Koskimäki\n */\n\nimport type { CompiledQuery, Dialect, QueryResult } from \"./sql-driver\";\nimport { DefaultConnectionProvider } from \"./connection/connection-provider\";\nimport { SingleConnectionProvider } from \"./connection/single-connection-provider\";\nimport { RuntimeDriver } from \"./driver/runtime-driver\";\nimport type { GenericSQLPlugin } from \"./query-executor/plugin\";\nimport type { QueryExecutor } from \"./query-executor/query-executor\";\nimport { DefaultQueryExecutor } from \"./query-executor/default-query-executor\";\n\nexport class SqlDriverAdapter {\n readonly #dialect: Dialect;\n readonly #driver: RuntimeDriver | null;\n readonly #executor: QueryExecutor;\n\n constructor(dialect: Dialect);\n constructor(dialect: Dialect, executor: QueryExecutor, driver: RuntimeDriver | null);\n constructor(dialect: Dialect, executor?: QueryExecutor, driver?: RuntimeDriver | null) {\n this.#dialect = dialect;\n\n if (executor) {\n this.#driver = driver ?? null;\n this.#executor = executor;\n } else {\n const rawDriver = dialect.createDriver();\n const runtimeDriver = new RuntimeDriver(rawDriver);\n const connectionProvider = new DefaultConnectionProvider(runtimeDriver);\n this.#driver = runtimeDriver;\n this.#executor = new DefaultQueryExecutor(connectionProvider);\n }\n }\n\n async executeQuery(query: CompiledQuery): Promise<QueryResult<Record<string, unknown>>> {\n return await this.#executor.executeQuery(query);\n }\n\n async transaction<T>(callback: (trx: SqlDriverAdapter) => Promise<T>): Promise<T> {\n if (this.#driver === null) {\n throw new Error(\"Cannot start transaction: adapter was created with custom executor\");\n }\n\n const driver = this.#driver;\n\n return await this.#executor.provideConnection(async (connection) => {\n const singleConnectionProvider = new SingleConnectionProvider(connection);\n const transactionExecutor = this.#executor.withConnectionProvider(singleConnectionProvider);\n const transactionAdapter = new SqlDriverAdapter(this.#dialect, transactionExecutor, driver);\n\n let transactionBegun = false;\n try {\n await driver.beginTransaction(connection, {});\n transactionBegun = true;\n\n const result = await callback(transactionAdapter);\n\n await driver.commitTransaction(connection);\n\n return result;\n } catch (error) {\n if (transactionBegun) {\n await driver.rollbackTransaction(connection);\n }\n\n throw error;\n }\n });\n }\n\n /**\n * Returns a copy of this adapter with the given plugin installed.\n */\n withPlugin(plugin: GenericSQLPlugin): SqlDriverAdapter {\n return new SqlDriverAdapter(this.#dialect, this.#executor.withPlugin(plugin), this.#driver);\n }\n\n /**\n * Returns a copy of this adapter without any plugins.\n */\n withoutPlugins(): SqlDriverAdapter {\n return new SqlDriverAdapter(this.#dialect, this.#executor.withoutPlugins(), this.#driver);\n }\n\n /**\n * Releases all resources and disconnects from the database.\n */\n async destroy(): Promise<void> {\n if (this.#driver !== null) {\n await this.#driver.destroy();\n }\n }\n}\n"],"mappings":";;;;;;AAeA,IAAa,mBAAb,MAAa,iBAAiB;CAC5B,CAASA;CACT,CAASC;CACT,CAASC;CAIT,YAAY,SAAkB,UAA0B,QAA+B;AACrF,QAAKF,UAAW;AAEhB,MAAI,UAAU;AACZ,SAAKC,SAAU,UAAU;AACzB,SAAKC,WAAY;SACZ;GAEL,MAAM,gBAAgB,IAAI,cADR,QAAQ,cAAc,CACU;GAClD,MAAM,qBAAqB,IAAI,0BAA0B,cAAc;AACvE,SAAKD,SAAU;AACf,SAAKC,WAAY,IAAI,qBAAqB,mBAAmB;;;CAIjE,MAAM,aAAa,OAAqE;AACtF,SAAO,MAAM,MAAKA,SAAU,aAAa,MAAM;;CAGjD,MAAM,YAAe,UAA6D;AAChF,MAAI,MAAKD,WAAY,KACnB,OAAM,IAAI,MAAM,qEAAqE;EAGvF,MAAM,SAAS,MAAKA;AAEpB,SAAO,MAAM,MAAKC,SAAU,kBAAkB,OAAO,eAAe;GAClE,MAAM,2BAA2B,IAAI,yBAAyB,WAAW;GACzE,MAAM,sBAAsB,MAAKA,SAAU,uBAAuB,yBAAyB;GAC3F,MAAM,qBAAqB,IAAI,iBAAiB,MAAKF,SAAU,qBAAqB,OAAO;GAE3F,IAAI,mBAAmB;AACvB,OAAI;AACF,UAAM,OAAO,iBAAiB,YAAY,EAAE,CAAC;AAC7C,uBAAmB;IAEnB,MAAM,SAAS,MAAM,SAAS,mBAAmB;AAEjD,UAAM,OAAO,kBAAkB,WAAW;AAE1C,WAAO;YACA,OAAO;AACd,QAAI,iBACF,OAAM,OAAO,oBAAoB,WAAW;AAG9C,UAAM;;IAER;;;;;CAMJ,WAAW,QAA4C;AACrD,SAAO,IAAI,iBAAiB,MAAKA,SAAU,MAAKE,SAAU,WAAW,OAAO,EAAE,MAAKD,OAAQ;;;;;CAM7F,iBAAmC;AACjC,SAAO,IAAI,iBAAiB,MAAKD,SAAU,MAAKE,SAAU,gBAAgB,EAAE,MAAKD,OAAQ;;;;;CAM3F,MAAM,UAAyB;AAC7B,MAAI,MAAKA,WAAY,KACnB,OAAM,MAAKA,OAAQ,SAAS"}
1
+ {"version":3,"file":"sql-driver-adapter.js","names":["#dialect","#driver","#executor"],"sources":["../../src/sql-driver/sql-driver-adapter.ts"],"sourcesContent":["/**\n * Adapted from Kysely patterns\n * Modified from: https://github.com/kysely-org/kysely\n * License: MIT\n * Copyright (c) 2022 Sami Koskimäki\n */\n\nimport { DefaultConnectionProvider } from \"./connection/connection-provider\";\nimport { SingleConnectionProvider } from \"./connection/single-connection-provider\";\nimport { RuntimeDriver } from \"./driver/runtime-driver\";\nimport { DefaultQueryExecutor } from \"./query-executor/default-query-executor\";\nimport type { GenericSQLPlugin } from \"./query-executor/plugin\";\nimport type { QueryExecutor } from \"./query-executor/query-executor\";\nimport type { CompiledQuery, Dialect, QueryResult } from \"./sql-driver\";\n\nexport class SqlDriverAdapter {\n readonly #dialect: Dialect;\n readonly #driver: RuntimeDriver | null;\n readonly #executor: QueryExecutor;\n\n constructor(dialect: Dialect);\n constructor(dialect: Dialect, executor: QueryExecutor, driver: RuntimeDriver | null);\n constructor(dialect: Dialect, executor?: QueryExecutor, driver?: RuntimeDriver | null) {\n this.#dialect = dialect;\n\n if (executor) {\n this.#driver = driver ?? null;\n this.#executor = executor;\n } else {\n const rawDriver = dialect.createDriver();\n const runtimeDriver = new RuntimeDriver(rawDriver);\n const connectionProvider = new DefaultConnectionProvider(runtimeDriver);\n this.#driver = runtimeDriver;\n this.#executor = new DefaultQueryExecutor(connectionProvider);\n }\n }\n\n async executeQuery(query: CompiledQuery): Promise<QueryResult<Record<string, unknown>>> {\n return await this.#executor.executeQuery(query);\n }\n\n async transaction<T>(callback: (trx: SqlDriverAdapter) => Promise<T>): Promise<T> {\n if (this.#driver === null) {\n throw new Error(\"Cannot start transaction: adapter was created with custom executor\");\n }\n\n const driver = this.#driver;\n\n return await this.#executor.provideConnection(async (connection) => {\n const singleConnectionProvider = new SingleConnectionProvider(connection);\n const transactionExecutor = this.#executor.withConnectionProvider(singleConnectionProvider);\n const transactionAdapter = new SqlDriverAdapter(this.#dialect, transactionExecutor, driver);\n\n let transactionBegun = false;\n try {\n await driver.beginTransaction(connection, {});\n transactionBegun = true;\n\n const result = await callback(transactionAdapter);\n\n await driver.commitTransaction(connection);\n\n return result;\n } catch (error) {\n if (transactionBegun) {\n await driver.rollbackTransaction(connection);\n }\n\n throw error;\n }\n });\n }\n\n /**\n * Returns a copy of this adapter with the given plugin installed.\n */\n withPlugin(plugin: GenericSQLPlugin): SqlDriverAdapter {\n return new SqlDriverAdapter(this.#dialect, this.#executor.withPlugin(plugin), this.#driver);\n }\n\n /**\n * Returns a copy of this adapter without any plugins.\n */\n withoutPlugins(): SqlDriverAdapter {\n return new SqlDriverAdapter(this.#dialect, this.#executor.withoutPlugins(), this.#driver);\n }\n\n /**\n * Releases all resources and disconnects from the database.\n */\n async destroy(): Promise<void> {\n if (this.#driver !== null) {\n await this.#driver.destroy();\n }\n }\n}\n"],"mappings":";;;;;;AAeA,IAAa,mBAAb,MAAa,iBAAiB;CAC5B,CAASA;CACT,CAASC;CACT,CAASC;CAIT,YAAY,SAAkB,UAA0B,QAA+B;AACrF,QAAKF,UAAW;AAEhB,MAAI,UAAU;AACZ,SAAKC,SAAU,UAAU;AACzB,SAAKC,WAAY;SACZ;GAEL,MAAM,gBAAgB,IAAI,cADR,QAAQ,cAAc,CACU;GAClD,MAAM,qBAAqB,IAAI,0BAA0B,cAAc;AACvE,SAAKD,SAAU;AACf,SAAKC,WAAY,IAAI,qBAAqB,mBAAmB;;;CAIjE,MAAM,aAAa,OAAqE;AACtF,SAAO,MAAM,MAAKA,SAAU,aAAa,MAAM;;CAGjD,MAAM,YAAe,UAA6D;AAChF,MAAI,MAAKD,WAAY,KACnB,OAAM,IAAI,MAAM,qEAAqE;EAGvF,MAAM,SAAS,MAAKA;AAEpB,SAAO,MAAM,MAAKC,SAAU,kBAAkB,OAAO,eAAe;GAClE,MAAM,2BAA2B,IAAI,yBAAyB,WAAW;GACzE,MAAM,sBAAsB,MAAKA,SAAU,uBAAuB,yBAAyB;GAC3F,MAAM,qBAAqB,IAAI,iBAAiB,MAAKF,SAAU,qBAAqB,OAAO;GAE3F,IAAI,mBAAmB;AACvB,OAAI;AACF,UAAM,OAAO,iBAAiB,YAAY,EAAE,CAAC;AAC7C,uBAAmB;IAEnB,MAAM,SAAS,MAAM,SAAS,mBAAmB;AAEjD,UAAM,OAAO,kBAAkB,WAAW;AAE1C,WAAO;YACA,OAAO;AACd,QAAI,iBACF,OAAM,OAAO,oBAAoB,WAAW;AAG9C,UAAM;;IAER;;;;;CAMJ,WAAW,QAA4C;AACrD,SAAO,IAAI,iBAAiB,MAAKA,SAAU,MAAKE,SAAU,WAAW,OAAO,EAAE,MAAKD,OAAQ;;;;;CAM7F,iBAAmC;AACjC,SAAO,IAAI,iBAAiB,MAAKD,SAAU,MAAKE,SAAU,gBAAgB,EAAE,MAAKD,OAAQ;;;;;CAM3F,MAAM,UAAyB;AAC7B,MAAI,MAAKA,WAAY,KACnB,OAAM,MAAKA,OAAQ,SAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"sql.js","names":["#kyselyBuilder","sql","kyselySql"],"sources":["../../src/sql-driver/sql.ts"],"sourcesContent":["import type { CompiledQuery, Dialect } from \"./sql-driver\";\nimport {\n sql as kyselySql,\n type QueryExecutor,\n type CompiledQuery as KyselyCompiledQuery,\n} from \"kysely\";\n\n/**\n * Wrapper around Kysely's RawBuilder that provides a compile() method with a dialect parameter.\n */\nexport class RawBuilder {\n #kyselyBuilder: ReturnType<typeof kyselySql>;\n\n constructor(kyselyBuilder: ReturnType<typeof kyselySql>) {\n this.#kyselyBuilder = kyselyBuilder;\n }\n\n /**\n * Compiles the SQL query using the provided Kysely dialect.\n * Creates a minimal query executor with the dialect's adapter and query compiler.\n *\n * @param dialect - Kysely dialect (e.g., SqliteDialect, PostgresDialect, MysqlDialect)\n * @returns Compiled query with SQL string and parameters\n */\n compile(dialect: Dialect): CompiledQuery {\n const queryCompiler = dialect.createQueryCompiler();\n\n return this.#kyselyBuilder.compile({\n getExecutor(): QueryExecutor {\n return {\n transformQuery(node, _queryId) {\n return node;\n },\n compileQuery(node, queryId) {\n return queryCompiler.compileQuery(node, queryId) as KyselyCompiledQuery;\n },\n } as QueryExecutor;\n },\n });\n }\n}\n\n/**\n * Tagged template function for building SQL queries with parameters.\n * Wraps Kysely's sql function to provide a compile() method without arguments.\n *\n * @example\n * ```ts\n * const userId = 123;\n * const query = sql`SELECT * FROM users WHERE id = ${userId}`;\n * const compiled = query.compile();\n * ```\n */\nexport function sql(strings: TemplateStringsArray, ...values: unknown[]): RawBuilder {\n const kyselyBuilder = kyselySql(strings, ...values);\n return new RawBuilder(kyselyBuilder);\n}\n"],"mappings":";;;;;;AAUA,IAAa,aAAb,MAAwB;CACtB;CAEA,YAAY,eAA6C;AACvD,QAAKA,gBAAiB;;;;;;;;;CAUxB,QAAQ,SAAiC;EACvC,MAAM,gBAAgB,QAAQ,qBAAqB;AAEnD,SAAO,MAAKA,cAAe,QAAQ,EACjC,cAA6B;AAC3B,UAAO;IACL,eAAe,MAAM,UAAU;AAC7B,YAAO;;IAET,aAAa,MAAM,SAAS;AAC1B,YAAO,cAAc,aAAa,MAAM,QAAQ;;IAEnD;KAEJ,CAAC;;;;;;;;;;;;;;AAeN,SAAgBC,MAAI,SAA+B,GAAG,QAA+B;AAEnF,QAAO,IAAI,WADWC,IAAU,SAAS,GAAG,OAAO,CACf"}
1
+ {"version":3,"file":"sql.js","names":["#kyselyBuilder","sql","kyselySql"],"sources":["../../src/sql-driver/sql.ts"],"sourcesContent":["import {\n sql as kyselySql,\n type QueryExecutor,\n type CompiledQuery as KyselyCompiledQuery,\n} from \"kysely\";\n\nimport type { CompiledQuery, Dialect } from \"./sql-driver\";\n\n/**\n * Wrapper around Kysely's RawBuilder that provides a compile() method with a dialect parameter.\n */\nexport class RawBuilder {\n #kyselyBuilder: ReturnType<typeof kyselySql>;\n\n constructor(kyselyBuilder: ReturnType<typeof kyselySql>) {\n this.#kyselyBuilder = kyselyBuilder;\n }\n\n /**\n * Compiles the SQL query using the provided Kysely dialect.\n * Creates a minimal query executor with the dialect's adapter and query compiler.\n *\n * @param dialect - Kysely dialect (e.g., SqliteDialect, PostgresDialect, MysqlDialect)\n * @returns Compiled query with SQL string and parameters\n */\n compile(dialect: Dialect): CompiledQuery {\n const queryCompiler = dialect.createQueryCompiler();\n\n return this.#kyselyBuilder.compile({\n getExecutor(): QueryExecutor {\n return {\n transformQuery(node, _queryId) {\n return node;\n },\n compileQuery(node, queryId) {\n return queryCompiler.compileQuery(node, queryId) as KyselyCompiledQuery;\n },\n } as QueryExecutor;\n },\n });\n }\n}\n\n/**\n * Tagged template function for building SQL queries with parameters.\n * Wraps Kysely's sql function to provide a compile() method without arguments.\n *\n * @example\n * ```ts\n * const userId = 123;\n * const query = sql`SELECT * FROM users WHERE id = ${userId}`;\n * const compiled = query.compile();\n * ```\n */\nexport function sql(strings: TemplateStringsArray, ...values: unknown[]): RawBuilder {\n const kyselyBuilder = kyselySql(strings, ...values);\n return new RawBuilder(kyselyBuilder);\n}\n"],"mappings":";;;;;;AAWA,IAAa,aAAb,MAAwB;CACtB;CAEA,YAAY,eAA6C;AACvD,QAAKA,gBAAiB;;;;;;;;;CAUxB,QAAQ,SAAiC;EACvC,MAAM,gBAAgB,QAAQ,qBAAqB;AAEnD,SAAO,MAAKA,cAAe,QAAQ,EACjC,cAA6B;AAC3B,UAAO;IACL,eAAe,MAAM,UAAU;AAC7B,YAAO;;IAET,aAAa,MAAM,SAAS;AAC1B,YAAO,cAAc,aAAa,MAAM,QAAQ;;IAEnD;KAEJ,CAAC;;;;;;;;;;;;;;AAeN,SAAgBC,MAAI,SAA+B,GAAG,QAA+B;AAEnF,QAAO,IAAI,WADWC,IAAU,SAAS,GAAG,OAAO,CACf"}
@@ -0,0 +1,15 @@
1
+ import { AnySchema } from "../schema/create.js";
2
+ import { SyncCommandDefinition, SyncCommandRegistry } from "./types.js";
3
+
4
+ //#region src/sync/commands.d.ts
5
+ type DefineSyncCommandsContext = {
6
+ defineCommand: <TInput, TContext>(definition: SyncCommandDefinition<TInput, TContext>) => SyncCommandDefinition<TInput, TContext>;
7
+ };
8
+ declare const defineSyncCommands: <TSchema extends AnySchema>(options: {
9
+ schema: TSchema;
10
+ }) => {
11
+ create: <const TCommands extends readonly SyncCommandDefinition[]>(factory: (context: DefineSyncCommandsContext) => TCommands) => SyncCommandRegistry;
12
+ };
13
+ //#endregion
14
+ export { defineSyncCommands };
15
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","names":[],"sources":["../../src/sync/commands.ts"],"sourcesContent":[],"mappings":";;;;KAGK,yBAAA;gDAEW,sBAAsB,QAAQ,cACvC,sBAAsB,QAAQ;AALqC,CAAA;AAIpC,cAmCzB,kBAnCyB,EAAA,CAAA,gBAmCa,SAnCb,CAAA,CAAA,OAAA,EAAA;EAAQ,MAAA,EAmCmC,OAnCnC;CAA9B,EAAA,GAAA;EACa,MAAA,EAAA,CAAA,wBAAA,SAqCiB,qBArCjB,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,OAAA,EAsCJ,yBAtCI,EAAA,GAsC0B,SAtC1B,EAAA,GAuCtB,mBAvCsB;CAAQ"}
@@ -0,0 +1,27 @@
1
+ //#region src/sync/commands.ts
2
+ const createRegistry = (schemaName, commandList) => {
3
+ const commands = /* @__PURE__ */ new Map();
4
+ for (const command of commandList) {
5
+ if (!command || typeof command !== "object") throw new Error("Sync commands must be objects.");
6
+ const name = command.name;
7
+ if (typeof name !== "string" || name.trim().length === 0) throw new Error("Sync command name must be a non-empty string.");
8
+ const existing = commands.get(name);
9
+ if (existing && existing !== command) throw new Error(`Sync command "${name}" is already defined for schema "${schemaName}".`);
10
+ commands.set(name, command);
11
+ }
12
+ return {
13
+ schemaName,
14
+ commands,
15
+ getCommand: (name) => commands.get(name)
16
+ };
17
+ };
18
+ const defineSyncCommands = (options) => {
19
+ const schemaName = options.schema.name;
20
+ return { create: (factory) => {
21
+ return createRegistry(schemaName, factory({ defineCommand: (definition) => definition }));
22
+ } };
23
+ };
24
+
25
+ //#endregion
26
+ export { defineSyncCommands };
27
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","names":[],"sources":["../../src/sync/commands.ts"],"sourcesContent":["import type { AnySchema } from \"../schema/create\";\nimport type { SyncCommandDefinition, SyncCommandRegistry } from \"./types\";\n\ntype DefineSyncCommandsContext = {\n defineCommand: <TInput, TContext>(\n definition: SyncCommandDefinition<TInput, TContext>,\n ) => SyncCommandDefinition<TInput, TContext>;\n};\n\nconst createRegistry = (\n schemaName: string,\n commandList: readonly SyncCommandDefinition[],\n): SyncCommandRegistry => {\n const commands = new Map<string, SyncCommandDefinition>();\n\n for (const command of commandList) {\n if (!command || typeof command !== \"object\") {\n throw new Error(\"Sync commands must be objects.\");\n }\n\n const name = command.name;\n if (typeof name !== \"string\" || name.trim().length === 0) {\n throw new Error(\"Sync command name must be a non-empty string.\");\n }\n\n const existing = commands.get(name);\n if (existing && existing !== command) {\n throw new Error(`Sync command \"${name}\" is already defined for schema \"${schemaName}\".`);\n }\n\n commands.set(name, command);\n }\n\n return {\n schemaName,\n commands,\n getCommand: (name) => commands.get(name),\n };\n};\n\nexport const defineSyncCommands = <TSchema extends AnySchema>(options: { schema: TSchema }) => {\n const schemaName = options.schema.name;\n return {\n create: <const TCommands extends readonly SyncCommandDefinition[]>(\n factory: (context: DefineSyncCommandsContext) => TCommands,\n ): SyncCommandRegistry => {\n const commands = factory({ defineCommand: (definition) => definition });\n return createRegistry(schemaName, commands);\n },\n };\n};\n"],"mappings":";AASA,MAAM,kBACJ,YACA,gBACwB;CACxB,MAAM,2BAAW,IAAI,KAAoC;AAEzD,MAAK,MAAM,WAAW,aAAa;AACjC,MAAI,CAAC,WAAW,OAAO,YAAY,SACjC,OAAM,IAAI,MAAM,iCAAiC;EAGnD,MAAM,OAAO,QAAQ;AACrB,MAAI,OAAO,SAAS,YAAY,KAAK,MAAM,CAAC,WAAW,EACrD,OAAM,IAAI,MAAM,gDAAgD;EAGlE,MAAM,WAAW,SAAS,IAAI,KAAK;AACnC,MAAI,YAAY,aAAa,QAC3B,OAAM,IAAI,MAAM,iBAAiB,KAAK,mCAAmC,WAAW,IAAI;AAG1F,WAAS,IAAI,MAAM,QAAQ;;AAG7B,QAAO;EACL;EACA;EACA,aAAa,SAAS,SAAS,IAAI,KAAK;EACzC;;AAGH,MAAa,sBAAiD,YAAiC;CAC7F,MAAM,aAAa,QAAQ,OAAO;AAClC,QAAO,EACL,SACE,YACwB;AAExB,SAAO,eAAe,YADL,QAAQ,EAAE,gBAAgB,eAAe,YAAY,CAAC,CAC5B;IAE9C"}
@@ -0,0 +1,4 @@
1
+ import { SyncCommandDefinition, SyncCommandHandler, SyncCommandRegistry, SyncCommandTxFactory } from "./types.js";
2
+ import { defineSyncCommands } from "./commands.js";
3
+ import { ReadKey, ReadScope, collectReadKeys, collectReadScopes, collectWriteKeys, stripReadTrackingResults } from "./read-tracking.js";
4
+ export { type ReadKey, type ReadScope, type SyncCommandDefinition, type SyncCommandHandler, type SyncCommandRegistry, type SyncCommandTxFactory, collectReadKeys, collectReadScopes, collectWriteKeys, defineSyncCommands, stripReadTrackingResults };
@@ -0,0 +1,4 @@
1
+ import { defineSyncCommands } from "./commands.js";
2
+ import { collectReadKeys, collectReadScopes, collectWriteKeys, stripReadTrackingResults } from "./read-tracking.js";
3
+
4
+ export { collectReadKeys, collectReadScopes, collectWriteKeys, defineSyncCommands, stripReadTrackingResults };
@@ -0,0 +1,25 @@
1
+ import { AnySchema, AnyTable } from "../schema/create.js";
2
+ import { Condition } from "../query/condition-builder.js";
3
+ import { CompiledJoin } from "../query/orm/orm.js";
4
+ import { MutationOperation, RetrievalOperation } from "../query/unit-of-work/unit-of-work.js";
5
+
6
+ //#region src/sync/read-tracking.d.ts
7
+ type ReadKey = {
8
+ schema: string;
9
+ table: string;
10
+ externalId: string;
11
+ };
12
+ type ReadScope = {
13
+ schema: string;
14
+ table: AnyTable;
15
+ indexName: string;
16
+ condition?: Condition;
17
+ joins?: CompiledJoin[];
18
+ };
19
+ declare const collectReadScopes: (operations: ReadonlyArray<RetrievalOperation<AnySchema>>) => ReadScope[];
20
+ declare const collectReadKeys: (operations: ReadonlyArray<RetrievalOperation<AnySchema>>, results: unknown[]) => ReadKey[];
21
+ declare const collectWriteKeys: (operations: ReadonlyArray<MutationOperation<AnySchema>>) => ReadKey[];
22
+ declare const stripReadTrackingResults: (operations: ReadonlyArray<RetrievalOperation<AnySchema>>, results: unknown[]) => void;
23
+ //#endregion
24
+ export { ReadKey, ReadScope, collectReadKeys, collectReadScopes, collectWriteKeys, stripReadTrackingResults };
25
+ //# sourceMappingURL=read-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-tracking.d.ts","names":[],"sources":["../../src/sync/read-tracking.ts"],"sourcesContent":[],"mappings":";;;;;;KASY,OAAA;;EAAA,KAAA,EAAA,MAAO;EAMP,UAAA,EAAS,MAAA;CAEZ;AAEK,KAJF,SAAA,GAIE;EACJ,MAAA,EAAA,MAAA;EAAY,KAAA,EAHb,QAGa;EA6HT,SAAA,EAAA,MAAA;EACkC,SAAA,CAAA,EA/HjC,SA+HiC;EAAnB,KAAA,CAAA,EA9HlB,YA8HkB,EAAA;CAAd;AACX,cAFU,iBAEV,EAAA,CAAA,UAAA,EADW,aACX,CADyB,kBACzB,CAD4C,SAC5C,CAAA,CAAA,EAAA,GAAA,SAAA,EAAA;AAAS,cA8CC,eA9CD,EAAA,CAAA,UAAA,EA+CE,aA/CF,CA+CgB,kBA/ChB,CA+CmC,SA/CnC,CAAA,CAAA,EAAA,OAAA,EAAA,OAAA,EAAA,EAAA,GAiDT,OAjDS,EAAA;AA8CC,cA+BA,gBAFZ,EAAA,CAAA,UAAA,EAGa,aAHb,CAG2B,iBAH3B,CAG6C,SAH7C,CAAA,CAAA,EAAA,GAIE,OAJF,EAAA;AA5B8C,cAgElC,wBAhEkC,EAAA,CAAA,UAAA,EAiEjC,aAjEiC,CAiEnB,kBAjEmB,CAiEA,SAjEA,CAAA,CAAA,EAAA,OAAA,EAAA,OAAA,EAAA,EAAA,GAAA,IAAA"}