@fragno-dev/db 0.3.0 → 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 (516) hide show
  1. package/.turbo/turbo-build.log +327 -160
  2. package/CHANGELOG.md +74 -0
  3. package/README.md +24 -0
  4. package/dist/adapters/adapters.d.ts +1 -1
  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/generic-sql-adapter.d.ts +0 -3
  8. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
  9. package/dist/adapters/generic-sql/generic-sql-adapter.js +11 -12
  10. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
  11. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +46 -6
  12. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
  13. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
  14. package/dist/adapters/generic-sql/migration/dialect/mysql.js +1 -1
  15. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
  16. package/dist/adapters/generic-sql/migration/dialect/postgres.js +1 -1
  17. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
  18. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +185 -19
  19. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
  20. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
  21. package/dist/adapters/generic-sql/migration/executor.js +30 -3
  22. package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
  23. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
  24. package/dist/adapters/generic-sql/migration/prepared-migrations.js +3 -3
  25. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
  26. package/dist/adapters/generic-sql/migration/sql-generator.js +1 -1
  27. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
  28. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +1 -1
  29. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
  30. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
  31. package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
  32. package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
  33. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +9 -6
  34. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
  35. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
  36. package/dist/adapters/generic-sql/query/sql-query-compiler.js +37 -9
  37. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
  38. package/dist/adapters/generic-sql/query/where-builder.js +24 -20
  39. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
  40. package/dist/adapters/generic-sql/uow-decoder.js +1 -1
  41. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
  42. package/dist/adapters/generic-sql/uow-encoder.js +8 -9
  43. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
  44. package/dist/adapters/in-memory/condition-evaluator.js +10 -6
  45. package/dist/adapters/in-memory/condition-evaluator.js.map +1 -1
  46. package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -1
  47. package/dist/adapters/in-memory/in-memory-adapter.js +45 -25
  48. package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -1
  49. package/dist/adapters/in-memory/in-memory-uow.js +236 -13
  50. package/dist/adapters/in-memory/in-memory-uow.js.map +1 -1
  51. package/dist/adapters/in-memory/options.d.ts +2 -0
  52. package/dist/adapters/in-memory/options.d.ts.map +1 -1
  53. package/dist/adapters/in-memory/options.js +3 -2
  54. package/dist/adapters/in-memory/options.js.map +1 -1
  55. package/dist/adapters/in-memory/reference-resolution.js.map +1 -1
  56. package/dist/adapters/in-memory/store.js +1 -1
  57. package/dist/adapters/in-memory/store.js.map +1 -1
  58. package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
  59. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
  60. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
  61. package/dist/browser/adapters/adapters.d.ts +61 -0
  62. package/dist/browser/adapters/adapters.d.ts.map +1 -0
  63. package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
  64. package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  65. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  66. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  67. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
  68. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  69. package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
  70. package/dist/browser/adapters/in-memory/index.d.ts +2 -0
  71. package/dist/browser/adapters/in-memory/options.d.ts +1 -0
  72. package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
  73. package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
  74. package/dist/browser/durable-hooks.d.ts +3 -0
  75. package/dist/browser/fragments/internal-fragment.d.ts +317 -0
  76. package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
  77. package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
  78. package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
  79. package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
  80. package/dist/browser/hooks/hooks.d.ts +146 -0
  81. package/dist/browser/hooks/hooks.d.ts.map +1 -0
  82. package/dist/browser/id.js +1 -0
  83. package/dist/browser/internal/adapter-registry.d.ts +4 -0
  84. package/dist/browser/internal/outbox-state.d.ts +2 -0
  85. package/dist/browser/mod.d.ts +15 -0
  86. package/dist/browser/mod.d.ts.map +1 -0
  87. package/dist/browser/mod.js +17 -0
  88. package/dist/browser/mod.js.map +1 -0
  89. package/dist/browser/mod2.d.ts +48 -0
  90. package/dist/browser/mod2.d.ts.map +1 -0
  91. package/dist/browser/naming/sql-naming.d.ts +19 -0
  92. package/dist/browser/naming/sql-naming.d.ts.map +1 -0
  93. package/dist/browser/outbox/outbox.d.ts +21 -0
  94. package/dist/browser/outbox/outbox.d.ts.map +1 -0
  95. package/dist/browser/query/column-defaults.js +1 -0
  96. package/dist/browser/query/condition-builder.d.ts +44 -0
  97. package/dist/browser/query/condition-builder.d.ts.map +1 -0
  98. package/dist/browser/query/condition-builder.js +97 -0
  99. package/dist/browser/query/condition-builder.js.map +1 -0
  100. package/dist/browser/query/cursor.d.ts +105 -0
  101. package/dist/browser/query/cursor.d.ts.map +1 -0
  102. package/dist/browser/query/cursor.js +150 -0
  103. package/dist/browser/query/cursor.js.map +1 -0
  104. package/dist/browser/query/db-now.d.ts +22 -0
  105. package/dist/browser/query/db-now.d.ts.map +1 -0
  106. package/dist/browser/query/db-now.js +33 -0
  107. package/dist/browser/query/db-now.js.map +1 -0
  108. package/dist/browser/query/orm/orm.d.ts +18 -0
  109. package/dist/browser/query/orm/orm.d.ts.map +1 -0
  110. package/dist/browser/query/simple-query-interface.d.ts +108 -0
  111. package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
  112. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
  113. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  114. package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
  115. package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  116. package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
  117. package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
  118. package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
  119. package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
  120. package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
  121. package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  122. package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
  123. package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
  124. package/dist/browser/query/value-encoding.js +38 -0
  125. package/dist/browser/query/value-encoding.js.map +1 -0
  126. package/dist/browser/schema/create.d.ts +326 -0
  127. package/dist/browser/schema/create.d.ts.map +1 -0
  128. package/dist/browser/schema/create.js +89 -0
  129. package/dist/browser/schema/create.js.map +1 -0
  130. package/dist/browser/schema/generate-id.js +28 -0
  131. package/dist/browser/schema/generate-id.js.map +1 -0
  132. package/dist/browser/shared/providers.d.ts +6 -0
  133. package/dist/browser/shared/providers.d.ts.map +1 -0
  134. package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
  135. package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
  136. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  137. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  138. package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
  139. package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  140. package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
  141. package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
  142. package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
  143. package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  144. package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
  145. package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  146. package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
  147. package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
  148. package/dist/browser/sync/commands.d.ts +15 -0
  149. package/dist/browser/sync/commands.d.ts.map +1 -0
  150. package/dist/browser/sync/commands.js +27 -0
  151. package/dist/browser/sync/commands.js.map +1 -0
  152. package/dist/browser/sync/types.d.ts +63 -0
  153. package/dist/browser/sync/types.d.ts.map +1 -0
  154. package/dist/browser/util/types.d.ts +8 -0
  155. package/dist/browser/util/types.d.ts.map +1 -0
  156. package/dist/browser/with-database.d.ts +29 -0
  157. package/dist/browser/with-database.d.ts.map +1 -0
  158. package/dist/client.d.ts +4 -0
  159. package/dist/client.js +5 -0
  160. package/dist/db-fragment-definition-builder.d.ts +85 -28
  161. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  162. package/dist/db-fragment-definition-builder.js +374 -46
  163. package/dist/db-fragment-definition-builder.js.map +1 -1
  164. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
  165. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
  166. package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
  167. package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
  168. package/dist/dispatchers/cloudflare-do/index.d.ts +5 -20
  169. package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -1
  170. package/dist/dispatchers/cloudflare-do/index.js +23 -55
  171. package/dist/dispatchers/cloudflare-do/index.js.map +1 -1
  172. package/dist/dispatchers/node/dispatcher.d.ts +14 -0
  173. package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
  174. package/dist/dispatchers/node/dispatcher.js +80 -0
  175. package/dist/dispatchers/node/dispatcher.js.map +1 -0
  176. package/dist/dispatchers/node/index.d.ts +5 -10
  177. package/dist/dispatchers/node/index.d.ts.map +1 -1
  178. package/dist/dispatchers/node/index.js +21 -53
  179. package/dist/dispatchers/node/index.js.map +1 -1
  180. package/dist/durable-hooks.d.ts +31 -0
  181. package/dist/durable-hooks.d.ts.map +1 -0
  182. package/dist/durable-hooks.js +23 -0
  183. package/dist/durable-hooks.js.map +1 -0
  184. package/dist/fragments/internal-fragment.d.ts +128 -27
  185. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  186. package/dist/fragments/internal-fragment.js +125 -78
  187. package/dist/fragments/internal-fragment.js.map +1 -1
  188. package/dist/fragments/internal-fragment.routes.js +138 -3
  189. package/dist/fragments/internal-fragment.routes.js.map +1 -1
  190. package/dist/fragments/internal-fragment.schema.d.ts +7 -1
  191. package/dist/fragments/internal-fragment.schema.d.ts.map +1 -1
  192. package/dist/fragments/internal-fragment.schema.js +18 -1
  193. package/dist/fragments/internal-fragment.schema.js.map +1 -1
  194. package/dist/hooks/durable-hooks-logger.d.ts +10 -0
  195. package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
  196. package/dist/hooks/durable-hooks-logger.js +75 -0
  197. package/dist/hooks/durable-hooks-logger.js.map +1 -0
  198. package/dist/hooks/durable-hooks-processor.d.ts +1 -14
  199. package/dist/hooks/durable-hooks-processor.js +58 -10
  200. package/dist/hooks/durable-hooks-processor.js.map +1 -1
  201. package/dist/hooks/durable-hooks-runtime.js +44 -0
  202. package/dist/hooks/durable-hooks-runtime.js.map +1 -0
  203. package/dist/hooks/hooks.d.ts +60 -2
  204. package/dist/hooks/hooks.d.ts.map +1 -1
  205. package/dist/hooks/hooks.js +214 -53
  206. package/dist/hooks/hooks.js.map +1 -1
  207. package/dist/id.d.ts +2 -2
  208. package/dist/id.js +2 -2
  209. package/dist/internal/adapter-registry.d.ts +11 -0
  210. package/dist/internal/adapter-registry.d.ts.map +1 -0
  211. package/dist/internal/adapter-registry.js +135 -0
  212. package/dist/internal/adapter-registry.js.map +1 -0
  213. package/dist/internal/outbox-state.d.ts +2 -0
  214. package/dist/internal/outbox-state.js +26 -0
  215. package/dist/internal/outbox-state.js.map +1 -0
  216. package/dist/migration-engine/auto-from-schema.d.ts +33 -0
  217. package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
  218. package/dist/migration-engine/auto-from-schema.js +210 -27
  219. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  220. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  221. package/dist/migration-engine/generation-engine.js +17 -5
  222. package/dist/migration-engine/generation-engine.js.map +1 -1
  223. package/dist/migration-engine/shared.d.ts +113 -0
  224. package/dist/migration-engine/shared.d.ts.map +1 -0
  225. package/dist/migration-engine/shared.js.map +1 -1
  226. package/dist/mod.d.ts +12 -11
  227. package/dist/mod.d.ts.map +1 -1
  228. package/dist/mod.js +10 -10
  229. package/dist/mod.js.map +1 -1
  230. package/dist/naming/sql-naming.d.ts.map +1 -1
  231. package/dist/naming/sql-naming.js.map +1 -1
  232. package/dist/outbox/outbox-builder.js.map +1 -1
  233. package/dist/outbox/outbox.d.ts +3 -1
  234. package/dist/outbox/outbox.d.ts.map +1 -1
  235. package/dist/outbox/outbox.js.map +1 -1
  236. package/dist/query/column-defaults.js.map +1 -1
  237. package/dist/query/condition-builder.d.ts +7 -1
  238. package/dist/query/condition-builder.d.ts.map +1 -1
  239. package/dist/query/condition-builder.js +5 -1
  240. package/dist/query/condition-builder.js.map +1 -1
  241. package/dist/query/cursor-client.d.ts +105 -0
  242. package/dist/query/cursor-client.d.ts.map +1 -0
  243. package/dist/query/cursor-client.js +165 -0
  244. package/dist/query/cursor-client.js.map +1 -0
  245. package/dist/query/cursor.d.ts.map +1 -1
  246. package/dist/query/cursor.js +7 -1
  247. package/dist/query/cursor.js.map +1 -1
  248. package/dist/query/db-now.d.ts +15 -1
  249. package/dist/query/db-now.d.ts.map +1 -1
  250. package/dist/query/db-now.js +30 -2
  251. package/dist/query/db-now.js.map +1 -1
  252. package/dist/query/orm/orm.js.map +1 -1
  253. package/dist/query/serialize/create-sql-serializer.js +2 -2
  254. package/dist/query/serialize/create-sql-serializer.js.map +1 -1
  255. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
  256. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
  257. package/dist/query/serialize/dialect/sqlite-serializer.js +6 -2
  258. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
  259. package/dist/query/simple-query-interface.d.ts +7 -3
  260. package/dist/query/simple-query-interface.d.ts.map +1 -1
  261. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
  262. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  263. package/dist/query/unit-of-work/execute-unit-of-work.js +39 -18
  264. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  265. package/dist/query/unit-of-work/unit-of-work.d.ts +42 -16
  266. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  267. package/dist/query/unit-of-work/unit-of-work.js +50 -6
  268. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  269. package/dist/query/value-decoding.js +8 -1
  270. package/dist/query/value-decoding.js.map +1 -1
  271. package/dist/query/value-encoding.js.map +1 -1
  272. package/dist/schema/create.d.ts +69 -25
  273. package/dist/schema/create.d.ts.map +1 -1
  274. package/dist/schema/create.js +91 -16
  275. package/dist/schema/create.js.map +1 -1
  276. package/dist/schema/type-conversion/create-sql-type-mapper.js +1 -1
  277. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  278. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  279. package/dist/schema/validator.d.ts.map +1 -1
  280. package/dist/schema/validator.js.map +1 -1
  281. package/dist/schema-output/drizzle.d.ts.map +1 -1
  282. package/dist/schema-output/drizzle.js +8 -6
  283. package/dist/schema-output/drizzle.js.map +1 -1
  284. package/dist/schema-output/prisma.d.ts.map +1 -1
  285. package/dist/schema-output/prisma.js +21 -10
  286. package/dist/schema-output/prisma.js.map +1 -1
  287. package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
  288. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
  289. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
  290. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
  291. package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
  292. package/dist/sql-driver/sql.js.map +1 -1
  293. package/dist/sync/commands.d.ts +15 -0
  294. package/dist/sync/commands.d.ts.map +1 -0
  295. package/dist/sync/commands.js +27 -0
  296. package/dist/sync/commands.js.map +1 -0
  297. package/dist/sync/index.d.ts +4 -0
  298. package/dist/sync/index.js +4 -0
  299. package/dist/sync/read-tracking.d.ts +25 -0
  300. package/dist/sync/read-tracking.d.ts.map +1 -0
  301. package/dist/sync/read-tracking.js +148 -0
  302. package/dist/sync/read-tracking.js.map +1 -0
  303. package/dist/sync/submit.js +213 -0
  304. package/dist/sync/submit.js.map +1 -0
  305. package/dist/sync/types.d.ts +63 -0
  306. package/dist/sync/types.d.ts.map +1 -0
  307. package/dist/util/default-database-adapter.js +6 -1
  308. package/dist/util/default-database-adapter.js.map +1 -1
  309. package/dist/with-database.d.ts +3 -6
  310. package/dist/with-database.d.ts.map +1 -1
  311. package/dist/with-database.js +7 -15
  312. package/dist/with-database.js.map +1 -1
  313. package/package.json +33 -41
  314. package/src/adapters/adapters.ts +5 -4
  315. package/src/adapters/drizzle/migrate-drizzle.test.ts +46 -9
  316. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +5 -3
  317. package/src/adapters/drizzle/test-utils.ts +2 -1
  318. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -3
  319. package/src/adapters/generic-sql/generic-sql-adapter.ts +21 -24
  320. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +1 -0
  321. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +81 -15
  322. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +4 -2
  323. package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
  324. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +3 -2
  325. package/src/adapters/generic-sql/migration/dialect/mysql.ts +1 -0
  326. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +5 -4
  327. package/src/adapters/generic-sql/migration/dialect/postgres.ts +2 -1
  328. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +795 -3
  329. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +385 -57
  330. package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
  331. package/src/adapters/generic-sql/migration/executor.ts +47 -4
  332. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +117 -14
  333. package/src/adapters/generic-sql/migration/prepared-migrations.ts +9 -8
  334. package/src/adapters/generic-sql/migration/sql-generator.ts +5 -3
  335. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +3 -3
  336. package/src/adapters/generic-sql/query/cursor-utils.test.ts +3 -2
  337. package/src/adapters/generic-sql/query/cursor-utils.ts +1 -1
  338. package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
  339. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +144 -8
  340. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +16 -17
  341. package/src/adapters/generic-sql/query/select-builder.test.ts +1 -0
  342. package/src/adapters/generic-sql/query/select-builder.ts +2 -2
  343. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +24 -5
  344. package/src/adapters/generic-sql/query/sql-query-compiler.ts +83 -13
  345. package/src/adapters/generic-sql/query/where-builder.test.ts +7 -5
  346. package/src/adapters/generic-sql/query/where-builder.ts +48 -29
  347. package/src/adapters/generic-sql/sql-adapter-pglite-migrations.test.ts +6 -15
  348. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +52 -7
  349. package/src/adapters/generic-sql/sql-adapter-pglite-queries.test.ts +9 -6
  350. package/src/adapters/generic-sql/sql-adapter-sqlite3-driver.test.ts +273 -5
  351. package/src/adapters/generic-sql/sql-adapter-sqlite3-uow.test.ts +123 -6
  352. package/src/adapters/generic-sql/sql-adapter-sqlocal.test.ts +4 -2
  353. package/src/adapters/generic-sql/uow-decoder.test.ts +4 -3
  354. package/src/adapters/generic-sql/uow-decoder.ts +3 -3
  355. package/src/adapters/generic-sql/uow-encoder.test.ts +4 -2
  356. package/src/adapters/generic-sql/uow-encoder.ts +14 -18
  357. package/src/adapters/in-memory/condition-evaluator.test.ts +2 -1
  358. package/src/adapters/in-memory/condition-evaluator.ts +9 -4
  359. package/src/adapters/in-memory/in-memory-adapter.ts +155 -44
  360. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +50 -2
  361. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +158 -3
  362. package/src/adapters/in-memory/in-memory-uow.ts +402 -26
  363. package/src/adapters/in-memory/options.test.ts +1 -0
  364. package/src/adapters/in-memory/options.ts +5 -1
  365. package/src/adapters/in-memory/outbox.test.ts +361 -0
  366. package/src/adapters/in-memory/reference-resolution.test.ts +3 -2
  367. package/src/adapters/in-memory/reference-resolution.ts +2 -2
  368. package/src/adapters/in-memory/sorted-array-index.test.ts +1 -0
  369. package/src/adapters/in-memory/store.test.ts +1 -0
  370. package/src/adapters/in-memory/store.ts +3 -3
  371. package/src/adapters/in-memory/value-normalization.test.ts +1 -0
  372. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +51 -7
  373. package/src/adapters/shared/from-unit-of-work-compiler.ts +156 -46
  374. package/src/adapters/shared/uow-operation-compiler.ts +3 -3
  375. package/src/browser/mod.ts +64 -0
  376. package/src/client.ts +19 -0
  377. package/src/db-fragment-definition-builder.test.ts +821 -47
  378. package/src/db-fragment-definition-builder.ts +857 -110
  379. package/src/db-fragment-instantiator.test.ts +114 -90
  380. package/src/db-fragment-integration.test.ts +9 -6
  381. package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
  382. package/src/dispatchers/cloudflare-do/index.test.ts +145 -12
  383. package/src/dispatchers/cloudflare-do/index.ts +49 -90
  384. package/src/dispatchers/node/dispatcher.ts +112 -0
  385. package/src/dispatchers/node/index.test.ts +43 -14
  386. package/src/dispatchers/node/index.ts +38 -75
  387. package/src/durable-hooks.test.ts +80 -0
  388. package/src/durable-hooks.ts +67 -0
  389. package/src/fragments/internal-fragment.routes.test.ts +570 -0
  390. package/src/fragments/internal-fragment.routes.ts +297 -5
  391. package/src/fragments/internal-fragment.schema.ts +45 -1
  392. package/src/fragments/internal-fragment.test.ts +223 -251
  393. package/src/fragments/internal-fragment.ts +278 -154
  394. package/src/hooks/durable-hooks-logger.ts +126 -0
  395. package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
  396. package/src/hooks/durable-hooks-processor.test.ts +179 -14
  397. package/src/hooks/durable-hooks-processor.ts +120 -14
  398. package/src/hooks/durable-hooks-runtime.test.ts +65 -0
  399. package/src/hooks/durable-hooks-runtime.ts +81 -0
  400. package/src/hooks/hooks.test.ts +314 -53
  401. package/src/hooks/hooks.ts +360 -81
  402. package/src/id.test.ts +34 -0
  403. package/src/id.ts +1 -3
  404. package/src/internal/adapter-registry.test.ts +93 -0
  405. package/src/internal/adapter-registry.ts +239 -0
  406. package/src/internal/outbox-state.ts +43 -0
  407. package/src/migration-engine/auto-from-schema.test.ts +93 -0
  408. package/src/migration-engine/auto-from-schema.ts +360 -42
  409. package/src/migration-engine/create.test.ts +2 -1
  410. package/src/migration-engine/create.ts +1 -1
  411. package/src/migration-engine/generation-engine.test.ts +66 -9
  412. package/src/migration-engine/generation-engine.ts +31 -10
  413. package/src/migration-engine/shared.ts +13 -0
  414. package/src/mod.ts +45 -27
  415. package/src/naming/sql-naming.ts +1 -0
  416. package/src/outbox/outbox-builder.ts +2 -2
  417. package/src/outbox/outbox.test.ts +216 -45
  418. package/src/outbox/outbox.ts +3 -1
  419. package/src/query/column-defaults.ts +1 -1
  420. package/src/query/condition-builder.test.ts +15 -0
  421. package/src/query/condition-builder.ts +7 -0
  422. package/src/query/cursor-client.test.ts +70 -0
  423. package/src/query/cursor-client.ts +263 -0
  424. package/src/query/cursor.test.ts +3 -2
  425. package/src/query/cursor.ts +15 -3
  426. package/src/query/db-now.ts +69 -2
  427. package/src/query/orm/orm.ts +2 -2
  428. package/src/query/query-type.test.ts +2 -1
  429. package/src/query/serialize/create-sql-serializer.ts +3 -3
  430. package/src/query/serialize/dialect/mysql-serializer.ts +1 -1
  431. package/src/query/serialize/dialect/postgres-serializer.ts +1 -1
  432. package/src/query/serialize/dialect/sqlite-serializer.test.ts +39 -2
  433. package/src/query/serialize/dialect/sqlite-serializer.ts +18 -5
  434. package/src/query/simple-query-interface.ts +10 -4
  435. package/src/query/unit-of-work/execute-unit-of-work.test.ts +347 -9
  436. package/src/query/unit-of-work/execute-unit-of-work.ts +63 -20
  437. package/src/query/unit-of-work/retry-policy.test.ts +1 -0
  438. package/src/query/unit-of-work/tx-builder.test.ts +73 -1
  439. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +5 -4
  440. package/src/query/unit-of-work/unit-of-work-types.test.ts +41 -11
  441. package/src/query/unit-of-work/unit-of-work.test.ts +28 -2
  442. package/src/query/unit-of-work/unit-of-work.ts +105 -19
  443. package/src/query/value-decoding.test.ts +50 -2
  444. package/src/query/value-decoding.ts +17 -4
  445. package/src/query/value-encoding.test.ts +1 -0
  446. package/src/query/value-encoding.ts +1 -1
  447. package/src/schema/create.test.ts +164 -5
  448. package/src/schema/create.ts +222 -24
  449. package/src/schema/generate-id.test.ts +1 -0
  450. package/src/schema/serialize.test.ts +4 -3
  451. package/src/schema/type-conversion/create-sql-type-mapper.ts +1 -1
  452. package/src/schema/type-conversion/dialect/sqlite.ts +2 -2
  453. package/src/schema/type-conversion/type-mapping.test.ts +2 -1
  454. package/src/schema/validator.test.ts +4 -2
  455. package/src/schema/validator.ts +1 -0
  456. package/src/schema-output/drizzle.test.ts +72 -19
  457. package/src/schema-output/drizzle.ts +24 -18
  458. package/src/schema-output/prisma.test.ts +172 -14
  459. package/src/schema-output/prisma.ts +34 -14
  460. package/src/sql-driver/better-sqlite3.test.ts +5 -3
  461. package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
  462. package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
  463. package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
  464. package/src/sql-driver/query-executor/query-executor.ts +1 -1
  465. package/src/sql-driver/sql-driver-adapter.ts +2 -2
  466. package/src/sql-driver/sql.ts +2 -1
  467. package/src/sql-driver/sqlocal.test.ts +4 -2
  468. package/src/sync/commands.test.ts +39 -0
  469. package/src/sync/commands.ts +51 -0
  470. package/src/sync/conflict-checker.test.ts +450 -0
  471. package/src/sync/conflict-checker.ts +248 -0
  472. package/src/sync/index.ts +14 -0
  473. package/src/sync/plan.ts +9 -0
  474. package/src/sync/read-tracking.test.ts +177 -0
  475. package/src/sync/read-tracking.ts +287 -0
  476. package/src/sync/submit.test.ts +205 -0
  477. package/src/sync/submit.ts +328 -0
  478. package/src/sync/types.ts +80 -0
  479. package/src/util/default-database-adapter.ts +15 -2
  480. package/src/with-database.ts +20 -50
  481. package/tsconfig.json +1 -1
  482. package/tsdown.config.ts +38 -26
  483. package/vitest.config.ts +1 -0
  484. package/dist/hooks/durable-hooks-processor.d.ts.map +0 -1
  485. package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js +0 -168
  486. package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +0 -1
  487. package/dist/packages/fragno/dist/api/bind-services.js +0 -20
  488. package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
  489. package/dist/packages/fragno/dist/api/error.js +0 -48
  490. package/dist/packages/fragno/dist/api/error.js.map +0 -1
  491. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -321
  492. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
  493. package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -669
  494. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
  495. package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
  496. package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
  497. package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
  498. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
  499. package/dist/packages/fragno/dist/api/internal/route.js +0 -10
  500. package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
  501. package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
  502. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
  503. package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
  504. package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
  505. package/dist/packages/fragno/dist/api/request-input-context.js +0 -185
  506. package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
  507. package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
  508. package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
  509. package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
  510. package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
  511. package/dist/packages/fragno/dist/api/route.js +0 -30
  512. package/dist/packages/fragno/dist/api/route.js.map +0 -1
  513. package/dist/packages/fragno/dist/internal/symbols.js +0 -10
  514. package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
  515. package/dist/packages/fragno/dist/internal/trace-context.js +0 -12
  516. package/dist/packages/fragno/dist/internal/trace-context.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory-uow.js","names":["selected: InMemoryRow","prefixed: InMemoryRow","matches: InMemoryRow[]","outputs: InMemoryRow[]","nextOutputs: InMemoryRow[]","results: InMemoryRow[]","row: InMemoryRow","resolvedUpdateValues: InMemoryRow","updatedRow: InMemoryRow","applied: typeof indexUpdates","removedEntries: typeof indexEntries","results: InMemoryRawResult[]","createdInternalIds: (bigint | null)[]","rollbackActions: Array<() => void>","#resolverFactory","output: Record<string, unknown>","columnValues: Record<string, unknown>","relationData: Record<string, Record<string, unknown>>","cursor: Cursor | undefined"],"sources":["../../../src/adapters/in-memory/in-memory-uow.ts"],"sourcesContent":["import type { AnySchema, AnyTable } from \"../../schema/create\";\nimport { FragnoId, FragnoReference } from \"../../schema/create\";\nimport { SQLocalDriverConfig } from \"../generic-sql/driver-config\";\nimport type {\n CompiledMutation,\n MutationOperation,\n MutationResult,\n RetrievalOperation,\n UOWCompiler,\n UOWDecoder,\n UOWExecutor,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport { buildCondition } from \"../../query/condition-builder\";\nimport {\n encodeValues,\n encodeValuesWithDbDefaults,\n ReferenceSubquery,\n} from \"../../query/value-encoding\";\nimport { isDbNow } from \"../../query/db-now\";\nimport { createSQLSerializer } from \"../../query/serialize/create-sql-serializer\";\nimport type { CompiledJoin } from \"../../query/orm/orm\";\nimport {\n createCursorFromRecord,\n decodeCursor,\n type Cursor,\n type CursorResult,\n} from \"../../query/cursor\";\nimport type {\n InMemoryNamespaceStore,\n InMemoryRow,\n InMemoryStore,\n InMemoryTableStore,\n} from \"./store\";\nimport { buildIndexKey, ensureNamespaceStore, normalizeIndexValue } from \"./store\";\nimport { evaluateCondition } from \"./condition-evaluator\";\nimport { resolveReferenceSubqueries } from \"./reference-resolution\";\nimport type { ResolvedInMemoryAdapterOptions } from \"./options\";\nimport { compareNormalizedValues } from \"./value-comparison\";\nimport type { NamingResolver } from \"../../naming/sql-naming\";\n\ntype InMemoryCompiledQuery = RetrievalOperation<AnySchema> | MutationOperation<AnySchema>;\ntype InMemoryRawResult = InMemoryRow[] | { count: number }[];\ntype CursorInput = string | Cursor | undefined;\ntype ResolverFactory = (schema: AnySchema, namespace: string | null) => NamingResolver;\n\nconst getResolver = (\n schema: AnySchema,\n namespace: string | null | undefined,\n resolverFactory?: ResolverFactory,\n) => (resolverFactory ? resolverFactory(schema, namespace ?? null) : undefined);\n\nconst getPhysicalTableName = (table: AnyTable, resolver?: NamingResolver) =>\n resolver ? resolver.getTableName(table.name) : table.name;\n\nconst getPhysicalColumnName = (table: AnyTable, columnName: string, resolver?: NamingResolver) =>\n resolver ? resolver.getColumnName(table.name, columnName) : columnName;\n\nconst cursorSerializer = createSQLSerializer(new SQLocalDriverConfig());\n\nclass VersionConflictError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"VersionConflictError\";\n }\n}\n\nconst getNamespaceStore = (\n store: InMemoryStore,\n schema: AnySchema,\n namespace: string | null | undefined,\n resolver?: NamingResolver,\n): InMemoryNamespaceStore => {\n const namespaceKey = namespace ?? schema.name;\n return ensureNamespaceStore(store, namespaceKey, schema, resolver);\n};\n\nconst getTableStore = (\n namespaceStore: InMemoryNamespaceStore,\n table: AnyTable,\n resolver?: NamingResolver,\n): InMemoryTableStore => {\n const physicalTableName = getPhysicalTableName(table, resolver);\n const tableStore = namespaceStore.tables.get(physicalTableName);\n if (!tableStore) {\n throw new Error(`Missing in-memory table store for \"${physicalTableName}\".`);\n }\n return tableStore;\n};\n\nconst buildSelection = (\n table: AnyTable,\n select: undefined | true | readonly string[],\n _resolver?: NamingResolver,\n): Set<string> => {\n const selection = new Set<string>();\n\n if (!select || select === true) {\n for (const columnName of Object.keys(table.columns)) {\n selection.add(columnName);\n }\n } else {\n for (const columnName of select) {\n selection.add(columnName);\n }\n }\n\n selection.add(\"_internalId\");\n selection.add(\"_version\");\n\n return selection;\n};\n\nconst selectRow = (\n row: InMemoryRow,\n table: AnyTable,\n select: undefined | true | readonly string[],\n resolver?: NamingResolver,\n): InMemoryRow => {\n const selection = buildSelection(table, select, resolver);\n const selected: InMemoryRow = {};\n for (const columnName of selection) {\n const physicalColumnName = getPhysicalColumnName(table, columnName, resolver);\n if (Object.prototype.hasOwnProperty.call(row, physicalColumnName)) {\n selected[columnName] = row[physicalColumnName];\n }\n }\n return selected;\n};\n\nconst isNullish = (value: unknown): value is null | undefined =>\n value === null || value === undefined;\n\nconst prefixSelection = (\n row: InMemoryRow,\n table: AnyTable,\n select: undefined | true | readonly string[],\n prefix: string,\n resolver?: NamingResolver,\n): InMemoryRow => {\n const selected = selectRow(row, table, select, resolver);\n const prefixed: InMemoryRow = {};\n\n for (const key in selected) {\n prefixed[`${prefix}:${key}`] = selected[key];\n }\n\n return prefixed;\n};\n\nconst orderRows = (\n rows: InMemoryRow[],\n orderBy: [AnyTable[\"columns\"][string], \"asc\" | \"desc\"][] | undefined,\n resolver?: NamingResolver,\n): InMemoryRow[] => {\n if (!orderBy || orderBy.length === 0) {\n return rows;\n }\n\n return rows.slice().sort((left, right) => {\n for (const [column, direction] of orderBy) {\n const columnName = resolver\n ? resolver.getColumnName(column.tableName, column.name)\n : column.name;\n const leftValue = normalizeIndexValue(left[columnName], column);\n const rightValue = normalizeIndexValue(right[columnName], column);\n const comparison = compareNormalizedValues(leftValue, rightValue);\n if (comparison !== 0) {\n return direction === \"asc\" ? comparison : -comparison;\n }\n }\n return 0;\n });\n};\n\nconst assertOrderByIndexOnly = (\n table: AnyTable,\n orderBy: [AnyTable[\"columns\"][string], \"asc\" | \"desc\"][] | undefined,\n resolver?: NamingResolver,\n): void => {\n if (!orderBy || orderBy.length === 0) {\n return;\n }\n\n const direction = orderBy[0][1];\n if (!orderBy.every(([, dir]) => dir === direction)) {\n throw new Error(\n `In-memory adapter only supports orderByIndex; mixed orderBy directions found on table \"${table.name}\".`,\n );\n }\n\n const orderColumnNames = orderBy.map(([column]) =>\n resolver ? resolver.getColumnName(table.name, column.name) : column.name,\n );\n const idColumnName = resolver\n ? resolver.getColumnName(table.name, table.getIdColumn().name)\n : table.getIdColumn().name;\n if (orderColumnNames.length === 1 && orderColumnNames[0] === idColumnName) {\n return;\n }\n\n for (const index of Object.values(table.indexes)) {\n const indexColumnNames = (index.columnNames as readonly string[]).map((columnName) =>\n resolver ? resolver.getColumnName(table.name, columnName) : columnName,\n );\n if (indexColumnNames.length !== orderColumnNames.length) {\n continue;\n }\n let matches = true;\n for (let i = 0; i < indexColumnNames.length; i += 1) {\n if (indexColumnNames[i] !== orderColumnNames[i]) {\n matches = false;\n break;\n }\n }\n if (matches) {\n return;\n }\n }\n\n throw new Error(\n `In-memory adapter only supports orderByIndex; received orderBy on table \"${table.name}\".`,\n );\n};\n\nconst findJoinMatches = (\n parentRow: InMemoryRow,\n parentTable: AnyTable,\n join: CompiledJoin,\n namespaceStore: InMemoryNamespaceStore,\n resolver?: NamingResolver,\n now: () => Date = () => new Date(),\n): InMemoryRow[] => {\n const { relation, options } = join;\n if (options === false) {\n return [];\n }\n\n const targetTable = relation.table;\n const targetStore = getTableStore(namespaceStore, targetTable, resolver);\n const matches: InMemoryRow[] = [];\n\n assertOrderByIndexOnly(targetTable, options.orderBy, resolver);\n\n for (const row of targetStore.rows.values()) {\n let matchesJoin = true;\n\n for (const [left, right] of relation.on) {\n const leftColumn = parentTable.columns[left];\n if (!leftColumn) {\n throw new Error(`Column \"${left}\" not found on table \"${parentTable.name}\".`);\n }\n\n const rightColumn = targetTable.columns[right];\n if (!rightColumn) {\n throw new Error(`Column \"${right}\" not found on table \"${targetTable.name}\".`);\n }\n\n const actualRight = rightColumn.role === \"external-id\" ? \"_internalId\" : right;\n const actualRightColumn = targetTable.columns[actualRight];\n if (!actualRightColumn) {\n throw new Error(`Column \"${actualRight}\" not found on table \"${targetTable.name}\".`);\n }\n\n const leftValue = parentRow[getPhysicalColumnName(parentTable, left, resolver)];\n const rightValue = row[getPhysicalColumnName(targetTable, actualRight, resolver)];\n if (isNullish(leftValue) || isNullish(rightValue)) {\n matchesJoin = false;\n break;\n }\n\n const leftNormalized = normalizeIndexValue(leftValue, leftColumn);\n const rightNormalized = normalizeIndexValue(rightValue, actualRightColumn);\n if (compareNormalizedValues(leftNormalized, rightNormalized) !== 0) {\n matchesJoin = false;\n break;\n }\n }\n\n if (!matchesJoin) {\n continue;\n }\n\n if (\n options.where &&\n !evaluateCondition(options.where, targetTable, row, namespaceStore, resolver, now)\n ) {\n continue;\n }\n\n matches.push(row);\n }\n\n const ordered = orderRows(matches, options.orderBy, resolver);\n if (options.limit !== undefined) {\n return ordered.slice(0, Math.max(0, options.limit));\n }\n\n return ordered;\n};\n\nconst applyJoins = (\n baseOutput: InMemoryRow,\n parentRow: InMemoryRow,\n parentTable: AnyTable,\n joins: CompiledJoin[] | undefined,\n namespaceStore: InMemoryNamespaceStore,\n resolver?: NamingResolver,\n now: () => Date = () => new Date(),\n parentPath = \"\",\n): InMemoryRow[] => {\n if (!joins || joins.length === 0) {\n return [baseOutput];\n }\n\n let outputs: InMemoryRow[] = [baseOutput];\n\n for (const join of joins) {\n if (join.options === false) {\n continue;\n }\n\n const relationPath = parentPath ? `${parentPath}:${join.relation.name}` : join.relation.name;\n const nextOutputs: InMemoryRow[] = [];\n\n for (const currentOutput of outputs) {\n const matches = findJoinMatches(parentRow, parentTable, join, namespaceStore, resolver, now);\n\n if (matches.length === 0) {\n nextOutputs.push(currentOutput);\n continue;\n }\n\n for (const matchRow of matches) {\n const prefixed = prefixSelection(\n matchRow,\n join.relation.table,\n join.options.select,\n relationPath,\n resolver,\n );\n const merged = { ...currentOutput, ...prefixed };\n\n if (join.options.join && join.options.join.length > 0) {\n nextOutputs.push(\n ...applyJoins(\n merged,\n matchRow,\n join.relation.table,\n join.options.join,\n namespaceStore,\n resolver,\n now,\n relationPath,\n ),\n );\n } else {\n nextOutputs.push(merged);\n }\n }\n }\n\n outputs = nextOutputs;\n }\n\n return outputs;\n};\n\nconst getExternalId = (id: FragnoId | string): string =>\n typeof id === \"string\" ? id : id.externalId;\n\nconst getVersionToCheck = (id: FragnoId | string, checkVersion: boolean): number | undefined => {\n if (!checkVersion) {\n return undefined;\n }\n\n if (typeof id === \"string\") {\n throw new Error(\n \"Cannot use checkVersion with a string ID. Version checking requires a FragnoId.\",\n );\n }\n\n return id.version;\n};\n\nconst resolveReferenceSubqueriesOrThrow = (\n namespaceStore: InMemoryNamespaceStore,\n table: AnyTable,\n encodedValues: Record<string, unknown>,\n resolver?: NamingResolver,\n): Record<string, unknown> => {\n const resolved = resolveReferenceSubqueries(namespaceStore, encodedValues, resolver);\n for (const [key, value] of Object.entries(encodedValues)) {\n if (!(value instanceof ReferenceSubquery)) {\n continue;\n }\n\n if (resolved[key] === null || resolved[key] === undefined) {\n throw new Error(\n `Foreign key constraint violation on table \"${table.name}\" for column \"${key}\".`,\n );\n }\n }\n return resolved;\n};\n\nconst getReferencedColumn = (\n table: AnyTable,\n columnName: string,\n resolver?: NamingResolver,\n): { name: string; column: AnyTable[\"columns\"][string] } => {\n const column = table.columns[columnName];\n if (!column) {\n throw new Error(`Column \"${columnName}\" not found on table \"${table.name}\".`);\n }\n\n const actualName = column.role === \"external-id\" ? \"_internalId\" : columnName;\n const actualColumn = table.columns[actualName];\n if (!actualColumn) {\n throw new Error(`Column \"${actualName}\" not found on table \"${table.name}\".`);\n }\n\n return {\n name: getPhysicalColumnName(table, actualName, resolver),\n column: actualColumn,\n };\n};\n\nconst enforceOutgoingForeignKeys = (\n namespaceStore: InMemoryNamespaceStore,\n table: AnyTable,\n row: InMemoryRow,\n columnsToCheck?: Set<string>,\n resolver?: NamingResolver,\n): void => {\n for (const relation of Object.values(table.relations)) {\n if (relation.type !== \"one\") {\n continue;\n }\n\n const localColumnNames = relation.on.map(([local]) => local);\n if (columnsToCheck && !localColumnNames.some((name) => columnsToCheck.has(name))) {\n continue;\n }\n\n const localValues = localColumnNames.map(\n (name) => row[getPhysicalColumnName(table, name, resolver)],\n );\n if (localValues.some((value) => value === null || value === undefined)) {\n continue;\n }\n\n const referencedTable = relation.table;\n const referencedStore = getTableStore(namespaceStore, referencedTable, resolver);\n let foundMatch = false;\n\n for (const targetRow of referencedStore.rows.values()) {\n let matches = true;\n for (const [localName, foreignName] of relation.on) {\n if (!table.columns[localName]) {\n throw new Error(`Column \"${localName}\" not found on table \"${table.name}\".`);\n }\n\n const { name: actualForeignName, column: foreignColumn } = getReferencedColumn(\n referencedTable,\n foreignName,\n resolver,\n );\n const localValue = row[getPhysicalColumnName(table, localName, resolver)];\n const targetValue = targetRow[actualForeignName];\n\n const normalizedLocal = normalizeIndexValue(localValue, foreignColumn);\n const normalizedTarget = normalizeIndexValue(targetValue, foreignColumn);\n\n if (compareNormalizedValues(normalizedLocal, normalizedTarget) !== 0) {\n matches = false;\n break;\n }\n }\n\n if (matches) {\n foundMatch = true;\n break;\n }\n }\n\n if (!foundMatch) {\n throw new Error(\n `Foreign key constraint violation on table \"${table.name}\" for relation \"${relation.name}\".`,\n );\n }\n }\n};\n\nconst enforceNoIncomingForeignKeys = (\n namespaceStore: InMemoryNamespaceStore,\n schema: AnySchema,\n table: AnyTable,\n row: InMemoryRow,\n resolver?: NamingResolver,\n): void => {\n for (const sourceTable of Object.values(schema.tables)) {\n for (const relation of Object.values(sourceTable.relations)) {\n if (relation.type !== \"one\") {\n continue;\n }\n\n if (relation.table.name !== table.name) {\n continue;\n }\n\n const sourceStore = getTableStore(namespaceStore, sourceTable, resolver);\n const targetColumnInfo = relation.on.map(([, foreignName]) =>\n getReferencedColumn(table, foreignName, resolver),\n );\n const targetValues = targetColumnInfo.map(({ name }) => row[name]);\n if (targetValues.some((value) => value === null || value === undefined)) {\n continue;\n }\n\n for (const sourceRow of sourceStore.rows.values()) {\n let matches = true;\n for (let i = 0; i < relation.on.length; i += 1) {\n const [localName] = relation.on[i]!;\n const { column } = targetColumnInfo[i]!;\n const localValue = sourceRow[getPhysicalColumnName(sourceTable, localName, resolver)];\n if (localValue === null || localValue === undefined) {\n matches = false;\n break;\n }\n\n const normalizedLocal = normalizeIndexValue(localValue, column);\n const normalizedTarget = normalizeIndexValue(targetValues[i], column);\n if (compareNormalizedValues(normalizedLocal, normalizedTarget) !== 0) {\n matches = false;\n break;\n }\n }\n\n if (matches) {\n throw new Error(\n `Foreign key constraint violation on table \"${table.name}\" for relation \"${relation.name}\".`,\n );\n }\n }\n }\n }\n};\n\nconst findRowByExternalId = (\n tableStore: InMemoryTableStore,\n table: AnyTable,\n externalId: string,\n resolver?: NamingResolver,\n): { internalId: bigint; row: InMemoryRow } | undefined => {\n const idColumn = table.getIdColumn();\n const idColumnName = getPhysicalColumnName(table, idColumn.name, resolver);\n for (const [internalId, row] of tableStore.rows) {\n if (row[idColumnName] === externalId) {\n return { internalId, row };\n }\n }\n return undefined;\n};\n\nconst resolveCursorValue = (value: unknown, column: AnyTable[\"columns\"][string]): unknown => {\n if (value && typeof value === \"object\") {\n const maybeExternalId = (value as { externalId?: unknown }).externalId;\n const maybeInternalId = (value as { internalId?: unknown }).internalId;\n\n if (typeof maybeExternalId === \"string\") {\n if (column.role === \"external-id\") {\n return maybeExternalId;\n }\n if ((column.role === \"internal-id\" || column.role === \"reference\") && maybeInternalId) {\n return typeof maybeInternalId === \"string\" ? BigInt(maybeInternalId) : maybeInternalId;\n }\n }\n }\n\n return value;\n};\n\nconst buildCursorKey = (\n cursor: CursorInput,\n table: AnyTable,\n columnNames: readonly string[],\n resolver?: NamingResolver,\n): readonly unknown[] | undefined => {\n if (!cursor) {\n return undefined;\n }\n\n const cursorObj = typeof cursor === \"string\" ? decodeCursor(cursor) : cursor;\n\n const columnMap = resolver ? resolver.getColumnNameMap(table) : undefined;\n\n return columnNames.map((columnName) => {\n const logicalName = columnMap?.[columnName] ?? columnName;\n const column = table.columns[logicalName];\n if (!column) {\n throw new Error(`Column \"${logicalName}\" not found on table \"${table.name}\".`);\n }\n\n const rawValue = resolveCursorValue(cursorObj.indexValues[column.name], column);\n if (rawValue === undefined) {\n return undefined;\n }\n\n const deserialized = cursorSerializer.deserialize(rawValue, column);\n return normalizeIndexValue(deserialized, column);\n });\n};\n\nconst findRows = (\n op: Extract<RetrievalOperation<AnySchema>, { type: \"find\" }>,\n namespaceStore: InMemoryNamespaceStore,\n tableStore: InMemoryTableStore,\n resolver?: NamingResolver,\n now: () => Date = () => new Date(),\n): InMemoryRow[] => {\n const table = op.table;\n const orderByIndex = op.options.orderByIndex;\n const orderIndexName = orderByIndex?.indexName ?? op.indexName;\n const orderIndex = tableStore.indexes.get(orderIndexName);\n if (!orderIndex) {\n throw new Error(`Missing in-memory index \"${orderIndexName}\" on table \"${table.name}\".`);\n }\n const direction = orderByIndex?.direction ?? \"asc\";\n const afterKey = buildCursorKey(\n op.options.after,\n table,\n orderIndex.definition.columnNames,\n resolver,\n );\n const beforeKey = buildCursorKey(\n op.options.before,\n table,\n orderIndex.definition.columnNames,\n resolver,\n );\n const limit =\n op.withCursor && op.options.pageSize !== undefined\n ? op.options.pageSize + 1\n : op.options.pageSize;\n\n const scanOptions = {\n direction,\n limit,\n start: undefined as readonly unknown[] | undefined,\n startInclusive: true,\n end: undefined as readonly unknown[] | undefined,\n endInclusive: true,\n };\n\n if (afterKey) {\n if (direction === \"asc\") {\n scanOptions.start = afterKey;\n scanOptions.startInclusive = false;\n } else {\n scanOptions.end = afterKey;\n scanOptions.endInclusive = false;\n }\n }\n\n if (beforeKey) {\n if (direction === \"asc\") {\n scanOptions.end = beforeKey;\n scanOptions.endInclusive = false;\n } else {\n scanOptions.start = beforeKey;\n scanOptions.startInclusive = false;\n }\n }\n\n const entries = orderIndex.index.scan(scanOptions);\n\n const whereResult = op.options.where\n ? buildCondition(table.columns, op.options.where)\n : undefined;\n\n if (whereResult === false) {\n return [];\n }\n\n const condition = whereResult === true ? undefined : whereResult;\n const results: InMemoryRow[] = [];\n\n for (const entry of entries) {\n const row = tableStore.rows.get(entry.value);\n if (!row) {\n continue;\n }\n if (condition && !evaluateCondition(condition, table, row, namespaceStore, resolver, now)) {\n continue;\n }\n\n const baseOutput = selectRow(\n row,\n table,\n op.options.select as readonly string[] | true | undefined,\n resolver,\n );\n\n if (op.options.joins && op.options.joins.length > 0) {\n const joined = applyJoins(\n baseOutput,\n row,\n table,\n op.options.joins,\n namespaceStore,\n resolver,\n now,\n );\n for (const joinedRow of joined) {\n results.push(joinedRow);\n if (limit !== undefined && results.length >= limit) {\n break;\n }\n }\n } else {\n results.push(baseOutput);\n }\n\n if (limit !== undefined && results.length >= limit) {\n break;\n }\n }\n\n return results;\n};\n\nconst countRows = (\n op: Extract<RetrievalOperation<AnySchema>, { type: \"count\" }>,\n namespaceStore: InMemoryNamespaceStore,\n tableStore: InMemoryTableStore,\n resolver?: NamingResolver,\n now: () => Date = () => new Date(),\n): number => {\n const table = op.table;\n const whereResult = op.options.where\n ? buildCondition(table.columns, op.options.where)\n : undefined;\n\n if (whereResult === false) {\n return 0;\n }\n\n const condition = whereResult === true ? undefined : whereResult;\n let count = 0;\n\n for (const row of tableStore.rows.values()) {\n if (condition && !evaluateCondition(condition, table, row, namespaceStore, resolver, now)) {\n continue;\n }\n count += 1;\n }\n\n return count;\n};\n\nconst resolveDbNowValue = (value: unknown, options: ResolvedInMemoryAdapterOptions): unknown =>\n isDbNow(value) ? options.clock.now() : value;\n\nconst createRow = (\n op: Extract<MutationOperation<AnySchema>, { type: \"create\" }>,\n namespaceStore: InMemoryNamespaceStore,\n tableStore: InMemoryTableStore,\n options: ResolvedInMemoryAdapterOptions,\n resolver?: NamingResolver,\n): bigint => {\n const table = op.schema.tables[op.table];\n if (!table) {\n throw new Error(`Invalid table name ${op.table}.`);\n }\n\n const encoded = encodeValuesWithDbDefaults(\n op.values,\n table,\n {\n now: options.clock.now,\n createId: options.idGenerator,\n },\n resolver,\n );\n const resolvedValues = options.enforceConstraints\n ? resolveReferenceSubqueriesOrThrow(namespaceStore, table, encoded, resolver)\n : resolveReferenceSubqueries(namespaceStore, encoded, resolver);\n\n const row: InMemoryRow = {};\n for (const columnName of Object.keys(table.columns)) {\n const column = table.columns[columnName];\n if (!column || column.role === \"internal-id\") {\n continue;\n }\n\n const physicalColumnName = getPhysicalColumnName(table, column.name, resolver);\n const value = resolvedValues[physicalColumnName];\n if (value === undefined) {\n if (column.isNullable) {\n row[physicalColumnName] = null;\n continue;\n }\n\n if (column.role === \"version\") {\n row[physicalColumnName] = 0;\n continue;\n }\n\n throw new Error(`Missing required value for column \"${column.name}\".`);\n }\n\n row[physicalColumnName] = resolveDbNowValue(value, options);\n }\n\n const internalId = options.internalIdGeneratorProvided\n ? options.internalIdGenerator()\n : tableStore.nextInternalId;\n if (!options.internalIdGeneratorProvided) {\n tableStore.nextInternalId += 1n;\n }\n\n const internalIdColumnName = getPhysicalColumnName(table, \"_internalId\", resolver);\n const versionColumnName = getPhysicalColumnName(table, \"_version\", resolver);\n row[internalIdColumnName] = internalId;\n row[versionColumnName] = row[versionColumnName] ?? 0;\n\n if (options.enforceConstraints) {\n enforceOutgoingForeignKeys(namespaceStore, table, row, undefined, resolver);\n }\n\n tableStore.rows.set(internalId, row);\n\n for (const indexStore of tableStore.indexes.values()) {\n const key = buildIndexKey(table, indexStore.definition, row, resolver);\n indexStore.index.insert(key, internalId, { enforceUnique: options.enforceConstraints });\n }\n\n return internalId;\n};\n\nconst updateRow = (\n op: Extract<MutationOperation<AnySchema>, { type: \"update\" }>,\n namespaceStore: InMemoryNamespaceStore,\n tableStore: InMemoryTableStore,\n options: ResolvedInMemoryAdapterOptions,\n resolver?: NamingResolver,\n): (() => void) | null => {\n const table = op.schema.tables[op.table];\n if (!table) {\n throw new Error(`Invalid table name ${op.table}.`);\n }\n\n const externalId = getExternalId(op.id);\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n const existing = findRowByExternalId(tableStore, table, externalId, resolver);\n if (!existing) {\n if (versionToCheck !== undefined) {\n throw new VersionConflictError(`Version conflict: row \"${externalId}\" not found.`);\n }\n return null;\n }\n\n const versionColumnName = getPhysicalColumnName(table, \"_version\", resolver);\n const currentVersion = Number(existing.row[versionColumnName] ?? 0);\n if (versionToCheck !== undefined && currentVersion !== versionToCheck) {\n throw new VersionConflictError(`Version conflict: row \"${externalId}\" has changed.`);\n }\n\n const encoded = encodeValues(op.set as Record<string, unknown>, table, false, {}, resolver);\n const resolvedValues = options.enforceConstraints\n ? resolveReferenceSubqueriesOrThrow(namespaceStore, table, encoded, resolver)\n : resolveReferenceSubqueries(namespaceStore, encoded, resolver);\n\n const resolvedUpdateValues: InMemoryRow = {};\n for (const [columnName, value] of Object.entries(resolvedValues)) {\n resolvedUpdateValues[columnName] = resolveDbNowValue(value, options);\n }\n\n const updatedRow: InMemoryRow = { ...existing.row, ...resolvedUpdateValues };\n updatedRow[versionColumnName] = currentVersion + 1;\n\n if (options.enforceConstraints) {\n enforceOutgoingForeignKeys(\n namespaceStore,\n table,\n updatedRow,\n new Set(Object.keys(resolvedValues)),\n resolver,\n );\n }\n\n const indexUpdates = Array.from(tableStore.indexes.values()).map((indexStore) => ({\n indexStore,\n oldKey: buildIndexKey(table, indexStore.definition, existing.row, resolver),\n newKey: buildIndexKey(table, indexStore.definition, updatedRow, resolver),\n }));\n\n const applied: typeof indexUpdates = [];\n try {\n for (const update of indexUpdates) {\n update.indexStore.index.update(update.oldKey, update.newKey, existing.internalId, {\n enforceUnique: options.enforceConstraints,\n });\n applied.push(update);\n }\n } catch (error) {\n for (const update of applied.reverse()) {\n update.indexStore.index.update(update.newKey, update.oldKey, existing.internalId, {\n enforceUnique: options.enforceConstraints,\n });\n }\n throw error;\n }\n\n tableStore.rows.set(existing.internalId, updatedRow);\n\n return () => {\n for (const update of indexUpdates.slice().reverse()) {\n update.indexStore.index.update(update.newKey, update.oldKey, existing.internalId, {\n enforceUnique: options.enforceConstraints,\n });\n }\n tableStore.rows.set(existing.internalId, existing.row);\n };\n};\n\nconst deleteRow = (\n op: Extract<MutationOperation<AnySchema>, { type: \"delete\" }>,\n namespaceStore: InMemoryNamespaceStore,\n tableStore: InMemoryTableStore,\n table: AnyTable,\n options: ResolvedInMemoryAdapterOptions,\n resolver?: NamingResolver,\n): (() => void) | null => {\n const externalId = getExternalId(op.id);\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n const existing = findRowByExternalId(tableStore, table, externalId, resolver);\n if (!existing) {\n if (versionToCheck !== undefined) {\n throw new VersionConflictError(`Version conflict: row \"${externalId}\" not found.`);\n }\n return null;\n }\n\n const versionColumnName = getPhysicalColumnName(table, \"_version\", resolver);\n const currentVersion = Number(existing.row[versionColumnName] ?? 0);\n if (versionToCheck !== undefined && currentVersion !== versionToCheck) {\n throw new VersionConflictError(`Version conflict: row \"${externalId}\" has changed.`);\n }\n\n if (options.enforceConstraints) {\n enforceNoIncomingForeignKeys(namespaceStore, op.schema, table, existing.row, resolver);\n }\n\n const indexEntries = Array.from(tableStore.indexes.values()).map((indexStore) => ({\n indexStore,\n key: buildIndexKey(table, indexStore.definition, existing.row, resolver),\n }));\n\n const removedEntries: typeof indexEntries = [];\n for (const entry of indexEntries) {\n const removed = entry.indexStore.index.remove(entry.key, existing.internalId);\n if (!removed) {\n for (const removedEntry of removedEntries) {\n removedEntry.indexStore.index.insert(removedEntry.key, existing.internalId, {\n enforceUnique: options.enforceConstraints,\n });\n }\n throw new Error(\"Failed to remove index entry during delete.\");\n }\n removedEntries.push(entry);\n }\n\n tableStore.rows.delete(existing.internalId);\n\n return () => {\n tableStore.rows.set(existing.internalId, existing.row);\n for (const entry of indexEntries) {\n entry.indexStore.index.insert(entry.key, existing.internalId, {\n enforceUnique: options.enforceConstraints,\n });\n }\n };\n};\n\nconst checkRow = (\n op: Extract<MutationOperation<AnySchema>, { type: \"check\" }>,\n tableStore: InMemoryTableStore,\n table: AnyTable,\n resolver?: NamingResolver,\n): void => {\n const existing = findRowByExternalId(tableStore, table, op.id.externalId, resolver);\n if (!existing) {\n throw new VersionConflictError(`Version conflict: row \"${op.id.externalId}\" not found.`);\n }\n\n const versionColumnName = getPhysicalColumnName(table, \"_version\", resolver);\n const currentVersion = Number(existing.row[versionColumnName] ?? 0);\n if (currentVersion !== op.id.version) {\n throw new VersionConflictError(`Version conflict: row \"${op.id.externalId}\" has changed.`);\n }\n};\n\nexport const createInMemoryUowCompiler = (): UOWCompiler<InMemoryCompiledQuery> => ({\n compileRetrievalOperation(op: RetrievalOperation<AnySchema>): InMemoryCompiledQuery | null {\n return op;\n },\n compileMutationOperation(\n op: MutationOperation<AnySchema>,\n ): CompiledMutation<InMemoryCompiledQuery> | null {\n return {\n query: op,\n operation: op,\n op: op.type,\n expectedAffectedRows: null,\n expectedReturnedRows: null,\n };\n },\n});\n\nexport const createInMemoryUowExecutor = (\n store: InMemoryStore,\n options: ResolvedInMemoryAdapterOptions,\n resolverFactory?: ResolverFactory,\n): UOWExecutor<InMemoryCompiledQuery, InMemoryRawResult> => ({\n async executeRetrievalPhase(\n retrievalBatch: InMemoryCompiledQuery[],\n ): Promise<InMemoryRawResult[]> {\n const results: InMemoryRawResult[] = [];\n\n for (const compiled of retrievalBatch) {\n if (compiled.type === \"count\" || compiled.type === \"find\") {\n const resolver = getResolver(compiled.schema, compiled.namespace, resolverFactory);\n const namespaceStore = getNamespaceStore(\n store,\n compiled.schema,\n compiled.namespace,\n resolver,\n );\n const tableStore = getTableStore(namespaceStore, compiled.table, resolver);\n\n if (compiled.type === \"find\") {\n results.push(findRows(compiled, namespaceStore, tableStore, resolver, options.clock.now));\n } else {\n results.push([\n { count: countRows(compiled, namespaceStore, tableStore, resolver, options.clock.now) },\n ]);\n }\n continue;\n }\n\n throw new Error(`Unsupported in-memory retrieval operation: ${compiled.type}`);\n }\n\n return results;\n },\n\n async executeMutationPhase(\n mutationBatch: CompiledMutation<InMemoryCompiledQuery>[],\n ): Promise<MutationResult> {\n const createdInternalIds: (bigint | null)[] = [];\n const rollbackActions: Array<() => void> = [];\n\n try {\n for (const compiled of mutationBatch) {\n const operation = compiled.query;\n\n if (operation.type === \"create\") {\n const resolver = getResolver(operation.schema, operation.namespace, resolverFactory);\n const namespaceStore = getNamespaceStore(\n store,\n operation.schema,\n operation.namespace,\n resolver,\n );\n const table = operation.schema.tables[operation.table];\n if (!table) {\n throw new Error(`Invalid table name ${operation.table}.`);\n }\n const tableStore = getTableStore(namespaceStore, table, resolver);\n const previousInternalId = tableStore.nextInternalId;\n const internalId = createRow(operation, namespaceStore, tableStore, options, resolver);\n createdInternalIds.push(internalId);\n rollbackActions.push(() => {\n const row = tableStore.rows.get(internalId);\n if (row) {\n for (const indexStore of tableStore.indexes.values()) {\n const key = buildIndexKey(table, indexStore.definition, row, resolver);\n indexStore.index.remove(key, internalId);\n }\n tableStore.rows.delete(internalId);\n }\n tableStore.nextInternalId = previousInternalId;\n });\n continue;\n }\n\n if (operation.type === \"update\") {\n const resolver = getResolver(operation.schema, operation.namespace, resolverFactory);\n const namespaceStore = getNamespaceStore(\n store,\n operation.schema,\n operation.namespace,\n resolver,\n );\n const table = operation.schema.tables[operation.table];\n if (!table) {\n throw new Error(`Invalid table name ${operation.table}.`);\n }\n const tableStore = getTableStore(namespaceStore, table, resolver);\n const rollback = updateRow(operation, namespaceStore, tableStore, options, resolver);\n if (rollback) {\n rollbackActions.push(rollback);\n }\n continue;\n }\n\n if (operation.type === \"delete\") {\n const resolver = getResolver(operation.schema, operation.namespace, resolverFactory);\n const namespaceStore = getNamespaceStore(\n store,\n operation.schema,\n operation.namespace,\n resolver,\n );\n const table = operation.schema.tables[operation.table];\n if (!table) {\n throw new Error(`Invalid table name ${operation.table}.`);\n }\n const tableStore = getTableStore(namespaceStore, table, resolver);\n const rollback = deleteRow(\n operation,\n namespaceStore,\n tableStore,\n table,\n options,\n resolver,\n );\n if (rollback) {\n rollbackActions.push(rollback);\n }\n continue;\n }\n\n if (operation.type === \"check\") {\n const resolver = getResolver(operation.schema, operation.namespace, resolverFactory);\n const namespaceStore = getNamespaceStore(\n store,\n operation.schema,\n operation.namespace,\n resolver,\n );\n const table = operation.schema.tables[operation.table];\n if (!table) {\n throw new Error(`Invalid table name ${operation.table}.`);\n }\n const tableStore = getTableStore(namespaceStore, table, resolver);\n checkRow(operation, tableStore, table, resolver);\n continue;\n }\n\n throw new Error(`Unsupported in-memory mutation \"${operation.type}\".`);\n }\n } catch (error) {\n for (const rollback of rollbackActions.reverse()) {\n rollback();\n }\n if (error instanceof VersionConflictError) {\n return { success: false };\n }\n throw error;\n }\n\n return { success: true, createdInternalIds };\n },\n});\n\nexport class InMemoryUowDecoder implements UOWDecoder<InMemoryRawResult> {\n readonly #resolverFactory?: ResolverFactory;\n\n constructor(resolverFactory?: ResolverFactory) {\n this.#resolverFactory = resolverFactory;\n }\n\n decode(rawResults: InMemoryRawResult[], operations: RetrievalOperation<AnySchema>[]): unknown[] {\n if (rawResults.length !== operations.length) {\n throw new Error(\"rawResults and ops must have the same length\");\n }\n\n return rawResults.map((result, index) => {\n const op = operations[index];\n if (!op) {\n throw new Error(\"op must be defined\");\n }\n\n if (op.type === \"count\") {\n return this.decodeCount(result);\n }\n\n const resolver = getResolver(op.schema, op.namespace, this.#resolverFactory);\n const rows = result as InMemoryRow[];\n const decodedRows = rows.map((row) => this.decodeRow(row, op.table, resolver));\n\n if (op.withCursor) {\n return this.decodeCursorResult(decodedRows, op.table, op);\n }\n\n return decodedRows;\n });\n }\n\n private decodeCount(result: InMemoryRawResult): number {\n if (typeof result === \"number\") {\n return result;\n }\n\n const rows = result as { count: number }[];\n const first = rows[0];\n if (!first) {\n return 0;\n }\n const count = Number(first.count);\n if (Number.isNaN(count)) {\n throw new Error(`Unexpected result for count, received: ${first.count}`);\n }\n return count;\n }\n\n private decodeRow(\n row: InMemoryRow,\n table: AnyTable,\n resolver?: NamingResolver,\n ): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n const columnValues: Record<string, unknown> = {};\n const relationData: Record<string, Record<string, unknown>> = {};\n const columnMap = resolver ? resolver.getColumnNameMap(table) : undefined;\n\n for (const key in row) {\n const colonIndex = key.indexOf(\":\");\n if (colonIndex === -1) {\n const logicalName = columnMap?.[key] ?? key;\n if (table.columns[logicalName]) {\n columnValues[logicalName] = row[key];\n }\n continue;\n }\n\n const relationName = key.slice(0, colonIndex);\n const remainder = key.slice(colonIndex + 1);\n const relation = table.relations[relationName];\n if (!relation) {\n continue;\n }\n\n relationData[relationName] ??= {};\n relationData[relationName][remainder] = row[key];\n }\n\n for (const relationName in relationData) {\n const relation = table.relations[relationName];\n if (!relation) {\n continue;\n }\n output[relationName] = this.decodeRow(relationData[relationName], relation.table, resolver);\n }\n\n for (const key in columnValues) {\n const column = table.columns[key];\n if (!column) {\n continue;\n }\n if (column.isHidden) {\n continue;\n }\n\n if (column.role === \"external-id\" && columnValues[\"_internalId\"] !== undefined) {\n output[key] = new FragnoId({\n externalId: columnValues[key] as string,\n internalId: columnValues[\"_internalId\"] as bigint,\n version: columnValues[\"_version\"] as number,\n });\n continue;\n }\n\n if (column.role === \"reference\") {\n const value = columnValues[key];\n output[key] =\n value === null || value === undefined\n ? null\n : FragnoReference.fromInternal(value as bigint);\n continue;\n }\n\n output[key] = columnValues[key];\n }\n\n return output;\n }\n\n private decodeCursorResult(\n decodedRows: Record<string, unknown>[],\n table: AnyTable,\n operation: Extract<RetrievalOperation<AnySchema>, { type: \"find\" }>,\n ): CursorResult<unknown> {\n let cursor: Cursor | undefined;\n let hasNextPage = false;\n let items = decodedRows;\n\n if (\n operation.options.pageSize &&\n operation.options.pageSize > 0 &&\n decodedRows.length > operation.options.pageSize\n ) {\n hasNextPage = true;\n items = decodedRows.slice(0, operation.options.pageSize);\n\n if (operation.options.orderByIndex) {\n const lastItem = items[items.length - 1];\n const indexName = operation.options.orderByIndex.indexName;\n\n let indexColumns;\n if (indexName === \"_primary\") {\n indexColumns = [table.getIdColumn()];\n } else {\n const index = table.indexes[indexName];\n if (index) {\n indexColumns = index.columns;\n }\n }\n\n if (indexColumns && lastItem) {\n cursor = createCursorFromRecord(lastItem, indexColumns, {\n indexName: operation.options.orderByIndex.indexName,\n orderDirection: operation.options.orderByIndex.direction,\n pageSize: operation.options.pageSize,\n });\n }\n }\n }\n\n return {\n items,\n cursor,\n hasNextPage,\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"in-memory-uow.js","names":["selected: InMemoryRow","prefixed: InMemoryRow","matches: InMemoryRow[]","outputs: InMemoryRow[]","nextOutputs: InMemoryRow[]","results: InMemoryRow[]","row: InMemoryRow","resolvedUpdateValues: InMemoryRow","updatedRow: InMemoryRow","applied: typeof indexUpdates","removedEntries: typeof indexEntries","createOp: Extract<MutationOperation<AnySchema>, { type: \"create\" }>","refMap: OutboxRefMap","rollbackActions: Array<() => void>","results: InMemoryRawResult[]","createdInternalIds: (bigint | null)[]","outboxVersion: bigint | null","#resolverFactory","output: Record<string, unknown>","columnValues: Record<string, unknown>","relationData: Record<string, Record<string, unknown>>","cursor: Cursor | undefined"],"sources":["../../../src/adapters/in-memory/in-memory-uow.ts"],"sourcesContent":["import superjson from \"superjson\";\n\nimport {\n SETTINGS_NAMESPACE,\n SETTINGS_TABLE_NAME,\n internalSchema,\n} from \"../../fragments/internal-fragment\";\nimport type { NamingResolver } from \"../../naming/sql-naming\";\nimport {\n type OutboxRefLookup,\n type OutboxRefMap,\n encodeVersionstamp,\n versionstampToHex,\n parseOutboxVersionValue,\n} from \"../../outbox/outbox\";\nimport { buildOutboxPlan, finalizeOutboxPayload } from \"../../outbox/outbox-builder\";\nimport { buildCondition } from \"../../query/condition-builder\";\nimport {\n createCursorFromRecord,\n decodeCursor,\n type Cursor,\n type CursorResult,\n} from \"../../query/cursor\";\nimport { getDbNowOffsetMs, isDbNow } from \"../../query/db-now\";\nimport type { CompiledJoin } from \"../../query/orm/orm\";\nimport { createSQLSerializer } from \"../../query/serialize/create-sql-serializer\";\nimport type {\n CompiledMutation,\n MutationOperation,\n MutationResult,\n RetrievalOperation,\n UOWCompiler,\n UOWDecoder,\n UOWExecutor,\n} from \"../../query/unit-of-work/unit-of-work\";\nimport {\n encodeValues,\n encodeValuesWithDbDefaults,\n ReferenceSubquery,\n} from \"../../query/value-encoding\";\nimport type { AnySchema, AnyTable } from \"../../schema/create\";\nimport { FragnoId, FragnoReference } from \"../../schema/create\";\nimport { SQLocalDriverConfig } from \"../generic-sql/driver-config\";\nimport { evaluateCondition } from \"./condition-evaluator\";\nimport type { ResolvedInMemoryAdapterOptions } from \"./options\";\nimport { resolveReferenceSubqueries } from \"./reference-resolution\";\nimport type {\n InMemoryNamespaceStore,\n InMemoryRow,\n InMemoryStore,\n InMemoryTableStore,\n} from \"./store\";\nimport { buildIndexKey, ensureNamespaceStore, normalizeIndexValue } from \"./store\";\nimport { compareNormalizedValues } from \"./value-comparison\";\n\ntype InMemoryCompiledQuery = RetrievalOperation<AnySchema> | MutationOperation<AnySchema>;\ntype InMemoryRawResult = InMemoryRow[] | { count: number }[];\ntype CursorInput = string | Cursor | undefined;\ntype ResolverFactory = (schema: AnySchema, namespace: string | null) => NamingResolver;\ntype SchemaNamespaceEntry = { schema: AnySchema; namespace: string | null };\n\nconst OUTBOX_VERSION_KEY = `${SETTINGS_NAMESPACE}.outbox_version`;\n\nconst getResolver = (\n schema: AnySchema,\n namespace: string | null | undefined,\n resolverFactory?: ResolverFactory,\n) => (resolverFactory ? resolverFactory(schema, namespace ?? null) : undefined);\n\nconst getPhysicalTableName = (table: AnyTable, resolver?: NamingResolver) =>\n resolver ? resolver.getTableName(table.name) : table.name;\n\nconst getPhysicalColumnName = (table: AnyTable, columnName: string, resolver?: NamingResolver) =>\n resolver ? resolver.getColumnName(table.name, columnName) : columnName;\n\nconst cursorSerializer = createSQLSerializer(new SQLocalDriverConfig());\n\nclass VersionConflictError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"VersionConflictError\";\n }\n}\n\nconst getNamespaceStore = (\n store: InMemoryStore,\n schema: AnySchema,\n namespace: string | null | undefined,\n resolver?: NamingResolver,\n): InMemoryNamespaceStore => {\n const namespaceKey = namespace ?? schema.name;\n return ensureNamespaceStore(store, namespaceKey, schema, resolver);\n};\n\nconst getTableStore = (\n namespaceStore: InMemoryNamespaceStore,\n table: AnyTable,\n resolver?: NamingResolver,\n): InMemoryTableStore => {\n const physicalTableName = getPhysicalTableName(table, resolver);\n const tableStore = namespaceStore.tables.get(physicalTableName);\n if (!tableStore) {\n throw new Error(`Missing in-memory table store for \"${physicalTableName}\".`);\n }\n return tableStore;\n};\n\nconst buildSelection = (\n table: AnyTable,\n select: undefined | true | readonly string[],\n _resolver?: NamingResolver,\n): Set<string> => {\n const selection = new Set<string>();\n\n if (!select || select === true) {\n for (const columnName of Object.keys(table.columns)) {\n selection.add(columnName);\n }\n } else {\n for (const columnName of select) {\n selection.add(columnName);\n }\n }\n\n selection.add(\"_internalId\");\n selection.add(\"_version\");\n\n return selection;\n};\n\nconst selectRow = (\n row: InMemoryRow,\n table: AnyTable,\n select: undefined | true | readonly string[],\n resolver?: NamingResolver,\n): InMemoryRow => {\n const selection = buildSelection(table, select, resolver);\n const selected: InMemoryRow = {};\n for (const columnName of selection) {\n const physicalColumnName = getPhysicalColumnName(table, columnName, resolver);\n if (Object.prototype.hasOwnProperty.call(row, physicalColumnName)) {\n selected[columnName] = row[physicalColumnName];\n }\n }\n return selected;\n};\n\nconst isNullish = (value: unknown): value is null | undefined =>\n value === null || value === undefined;\n\nconst prefixSelection = (\n row: InMemoryRow,\n table: AnyTable,\n select: undefined | true | readonly string[],\n prefix: string,\n resolver?: NamingResolver,\n): InMemoryRow => {\n const selected = selectRow(row, table, select, resolver);\n const prefixed: InMemoryRow = {};\n\n for (const key in selected) {\n prefixed[`${prefix}:${key}`] = selected[key];\n }\n\n return prefixed;\n};\n\nconst orderRows = (\n rows: InMemoryRow[],\n orderBy: [AnyTable[\"columns\"][string], \"asc\" | \"desc\"][] | undefined,\n resolver?: NamingResolver,\n): InMemoryRow[] => {\n if (!orderBy || orderBy.length === 0) {\n return rows;\n }\n\n return rows.slice().sort((left, right) => {\n for (const [column, direction] of orderBy) {\n const columnName = resolver\n ? resolver.getColumnName(column.tableName, column.name)\n : column.name;\n const leftValue = normalizeIndexValue(left[columnName], column);\n const rightValue = normalizeIndexValue(right[columnName], column);\n const comparison = compareNormalizedValues(leftValue, rightValue);\n if (comparison !== 0) {\n return direction === \"asc\" ? comparison : -comparison;\n }\n }\n return 0;\n });\n};\n\nconst assertOrderByIndexOnly = (\n table: AnyTable,\n orderBy: [AnyTable[\"columns\"][string], \"asc\" | \"desc\"][] | undefined,\n resolver?: NamingResolver,\n): void => {\n if (!orderBy || orderBy.length === 0) {\n return;\n }\n\n const direction = orderBy[0][1];\n if (!orderBy.every(([, dir]) => dir === direction)) {\n throw new Error(\n `In-memory adapter only supports orderByIndex; mixed orderBy directions found on table \"${table.name}\".`,\n );\n }\n\n const orderColumnNames = orderBy.map(([column]) =>\n resolver ? resolver.getColumnName(table.name, column.name) : column.name,\n );\n const idColumnName = resolver\n ? resolver.getColumnName(table.name, table.getIdColumn().name)\n : table.getIdColumn().name;\n if (orderColumnNames.length === 1 && orderColumnNames[0] === idColumnName) {\n return;\n }\n\n for (const index of Object.values(table.indexes)) {\n const indexColumnNames = (index.columnNames as readonly string[]).map((columnName) =>\n resolver ? resolver.getColumnName(table.name, columnName) : columnName,\n );\n if (indexColumnNames.length !== orderColumnNames.length) {\n continue;\n }\n let matches = true;\n for (let i = 0; i < indexColumnNames.length; i += 1) {\n if (indexColumnNames[i] !== orderColumnNames[i]) {\n matches = false;\n break;\n }\n }\n if (matches) {\n return;\n }\n }\n\n throw new Error(\n `In-memory adapter only supports orderByIndex; received orderBy on table \"${table.name}\".`,\n );\n};\n\nconst findJoinMatches = (\n parentRow: InMemoryRow,\n parentTable: AnyTable,\n join: CompiledJoin,\n namespaceStore: InMemoryNamespaceStore,\n resolver?: NamingResolver,\n now: () => Date = () => new Date(),\n): InMemoryRow[] => {\n const { relation, options } = join;\n if (options === false) {\n return [];\n }\n\n const targetTable = relation.table;\n const targetStore = getTableStore(namespaceStore, targetTable, resolver);\n const matches: InMemoryRow[] = [];\n\n assertOrderByIndexOnly(targetTable, options.orderBy, resolver);\n\n for (const row of targetStore.rows.values()) {\n let matchesJoin = true;\n\n for (const [left, right] of relation.on) {\n const leftColumn = parentTable.columns[left];\n if (!leftColumn) {\n throw new Error(`Column \"${left}\" not found on table \"${parentTable.name}\".`);\n }\n\n const rightColumn = targetTable.columns[right];\n if (!rightColumn) {\n throw new Error(`Column \"${right}\" not found on table \"${targetTable.name}\".`);\n }\n\n const actualLeft =\n leftColumn.role === \"external-id\" && rightColumn.role !== \"external-id\"\n ? \"_internalId\"\n : left;\n const actualLeftColumn = parentTable.columns[actualLeft];\n if (!actualLeftColumn) {\n throw new Error(`Column \"${actualLeft}\" not found on table \"${parentTable.name}\".`);\n }\n\n const actualRight =\n rightColumn.role === \"external-id\" && leftColumn.role !== \"external-id\"\n ? \"_internalId\"\n : right;\n const actualRightColumn = targetTable.columns[actualRight];\n if (!actualRightColumn) {\n throw new Error(`Column \"${actualRight}\" not found on table \"${targetTable.name}\".`);\n }\n\n const leftValue = parentRow[getPhysicalColumnName(parentTable, actualLeft, resolver)];\n const rightValue = row[getPhysicalColumnName(targetTable, actualRight, resolver)];\n if (isNullish(leftValue) || isNullish(rightValue)) {\n matchesJoin = false;\n break;\n }\n\n const leftNormalized = normalizeIndexValue(leftValue, actualLeftColumn);\n const rightNormalized = normalizeIndexValue(rightValue, actualRightColumn);\n if (compareNormalizedValues(leftNormalized, rightNormalized) !== 0) {\n matchesJoin = false;\n break;\n }\n }\n\n if (!matchesJoin) {\n continue;\n }\n\n if (\n options.where &&\n !evaluateCondition(options.where, targetTable, row, namespaceStore, resolver, now)\n ) {\n continue;\n }\n\n matches.push(row);\n }\n\n const ordered = orderRows(matches, options.orderBy, resolver);\n if (options.limit !== undefined) {\n return ordered.slice(0, Math.max(0, options.limit));\n }\n\n return ordered;\n};\n\nconst applyJoins = (\n baseOutput: InMemoryRow,\n parentRow: InMemoryRow,\n parentTable: AnyTable,\n joins: CompiledJoin[] | undefined,\n namespaceStore: InMemoryNamespaceStore,\n resolver?: NamingResolver,\n now: () => Date = () => new Date(),\n parentPath = \"\",\n): InMemoryRow[] => {\n if (!joins || joins.length === 0) {\n return [baseOutput];\n }\n\n let outputs: InMemoryRow[] = [baseOutput];\n\n for (const join of joins) {\n if (join.options === false) {\n continue;\n }\n\n const relationPath = parentPath ? `${parentPath}:${join.relation.name}` : join.relation.name;\n const nextOutputs: InMemoryRow[] = [];\n\n for (const currentOutput of outputs) {\n const matches = findJoinMatches(parentRow, parentTable, join, namespaceStore, resolver, now);\n\n if (matches.length === 0) {\n nextOutputs.push(currentOutput);\n continue;\n }\n\n for (const matchRow of matches) {\n const prefixed = prefixSelection(\n matchRow,\n join.relation.table,\n join.options.select,\n relationPath,\n resolver,\n );\n const merged = { ...currentOutput, ...prefixed };\n\n if (join.options.join && join.options.join.length > 0) {\n nextOutputs.push(\n ...applyJoins(\n merged,\n matchRow,\n join.relation.table,\n join.options.join,\n namespaceStore,\n resolver,\n now,\n relationPath,\n ),\n );\n } else {\n nextOutputs.push(merged);\n }\n }\n }\n\n outputs = nextOutputs;\n }\n\n return outputs;\n};\n\nconst getExternalId = (id: FragnoId | string): string =>\n typeof id === \"string\" ? id : id.externalId;\n\nconst getVersionToCheck = (id: FragnoId | string, checkVersion: boolean): number | undefined => {\n if (!checkVersion) {\n return undefined;\n }\n\n if (typeof id === \"string\") {\n throw new Error(\n \"Cannot use checkVersion with a string ID. Version checking requires a FragnoId.\",\n );\n }\n\n return id.version;\n};\n\nconst resolveReferenceSubqueriesOrThrow = (\n namespaceStore: InMemoryNamespaceStore,\n table: AnyTable,\n encodedValues: Record<string, unknown>,\n resolver?: NamingResolver,\n): Record<string, unknown> => {\n const resolved = resolveReferenceSubqueries(namespaceStore, encodedValues, resolver);\n for (const [key, value] of Object.entries(encodedValues)) {\n if (!(value instanceof ReferenceSubquery)) {\n continue;\n }\n\n if (resolved[key] === null || resolved[key] === undefined) {\n throw new Error(\n `Foreign key constraint violation on table \"${table.name}\" for column \"${key}\".`,\n );\n }\n }\n return resolved;\n};\n\nconst getReferencedColumn = (\n table: AnyTable,\n columnName: string,\n resolver?: NamingResolver,\n): { name: string; column: AnyTable[\"columns\"][string] } => {\n const column = table.columns[columnName];\n if (!column) {\n throw new Error(`Column \"${columnName}\" not found on table \"${table.name}\".`);\n }\n\n const actualName = column.role === \"external-id\" ? \"_internalId\" : columnName;\n const actualColumn = table.columns[actualName];\n if (!actualColumn) {\n throw new Error(`Column \"${actualName}\" not found on table \"${table.name}\".`);\n }\n\n return {\n name: getPhysicalColumnName(table, actualName, resolver),\n column: actualColumn,\n };\n};\n\nconst enforceOutgoingForeignKeys = (\n namespaceStore: InMemoryNamespaceStore,\n table: AnyTable,\n row: InMemoryRow,\n columnsToCheck?: Set<string>,\n resolver?: NamingResolver,\n): void => {\n for (const relation of Object.values(table.relations)) {\n if (relation.type !== \"one\" || relation.foreignKey === false) {\n continue;\n }\n\n const localColumnNames = relation.on.map(([local]) => local);\n if (columnsToCheck && !localColumnNames.some((name) => columnsToCheck.has(name))) {\n continue;\n }\n\n const localValues = localColumnNames.map(\n (name) => row[getPhysicalColumnName(table, name, resolver)],\n );\n if (localValues.some((value) => value === null || value === undefined)) {\n continue;\n }\n\n const referencedTable = relation.table;\n const referencedStore = getTableStore(namespaceStore, referencedTable, resolver);\n let foundMatch = false;\n\n for (const targetRow of referencedStore.rows.values()) {\n let matches = true;\n for (const [localName, foreignName] of relation.on) {\n if (!table.columns[localName]) {\n throw new Error(`Column \"${localName}\" not found on table \"${table.name}\".`);\n }\n\n const { name: actualForeignName, column: foreignColumn } = getReferencedColumn(\n referencedTable,\n foreignName,\n resolver,\n );\n const localValue = row[getPhysicalColumnName(table, localName, resolver)];\n const targetValue = targetRow[actualForeignName];\n\n const normalizedLocal = normalizeIndexValue(localValue, foreignColumn);\n const normalizedTarget = normalizeIndexValue(targetValue, foreignColumn);\n\n if (compareNormalizedValues(normalizedLocal, normalizedTarget) !== 0) {\n matches = false;\n break;\n }\n }\n\n if (matches) {\n foundMatch = true;\n break;\n }\n }\n\n if (!foundMatch) {\n throw new Error(\n `Foreign key constraint violation on table \"${table.name}\" for relation \"${relation.name}\".`,\n );\n }\n }\n};\n\nconst enforceNoIncomingForeignKeys = (\n namespaceStore: InMemoryNamespaceStore,\n schema: AnySchema,\n table: AnyTable,\n row: InMemoryRow,\n resolver?: NamingResolver,\n): void => {\n for (const sourceTable of Object.values(schema.tables)) {\n for (const relation of Object.values(sourceTable.relations)) {\n if (relation.type !== \"one\" || relation.foreignKey === false) {\n continue;\n }\n\n if (relation.table.name !== table.name) {\n continue;\n }\n\n const sourceStore = getTableStore(namespaceStore, sourceTable, resolver);\n const targetColumnInfo = relation.on.map(([, foreignName]) =>\n getReferencedColumn(table, foreignName, resolver),\n );\n const targetValues = targetColumnInfo.map(({ name }) => row[name]);\n if (targetValues.some((value) => value === null || value === undefined)) {\n continue;\n }\n\n for (const sourceRow of sourceStore.rows.values()) {\n let matches = true;\n for (let i = 0; i < relation.on.length; i += 1) {\n const [localName] = relation.on[i]!;\n const { column } = targetColumnInfo[i]!;\n const localValue = sourceRow[getPhysicalColumnName(sourceTable, localName, resolver)];\n if (localValue === null || localValue === undefined) {\n matches = false;\n break;\n }\n\n const normalizedLocal = normalizeIndexValue(localValue, column);\n const normalizedTarget = normalizeIndexValue(targetValues[i], column);\n if (compareNormalizedValues(normalizedLocal, normalizedTarget) !== 0) {\n matches = false;\n break;\n }\n }\n\n if (matches) {\n throw new Error(\n `Foreign key constraint violation on table \"${table.name}\" for relation \"${relation.name}\".`,\n );\n }\n }\n }\n }\n};\n\nconst findRowByExternalId = (\n tableStore: InMemoryTableStore,\n table: AnyTable,\n externalId: string,\n resolver?: NamingResolver,\n): { internalId: bigint; row: InMemoryRow } | undefined => {\n const idColumn = table.getIdColumn();\n const idColumnName = getPhysicalColumnName(table, idColumn.name, resolver);\n for (const [internalId, row] of tableStore.rows) {\n if (row[idColumnName] === externalId) {\n return { internalId, row };\n }\n }\n return undefined;\n};\n\nconst resolveCursorValue = (value: unknown, column: AnyTable[\"columns\"][string]): unknown => {\n if (value && typeof value === \"object\") {\n const maybeExternalId = (value as { externalId?: unknown }).externalId;\n const maybeInternalId = (value as { internalId?: unknown }).internalId;\n\n if (typeof maybeExternalId === \"string\") {\n if (column.role === \"external-id\") {\n return maybeExternalId;\n }\n if ((column.role === \"internal-id\" || column.role === \"reference\") && maybeInternalId) {\n return typeof maybeInternalId === \"string\" ? BigInt(maybeInternalId) : maybeInternalId;\n }\n }\n }\n\n return value;\n};\n\nconst buildCursorKey = (\n cursor: CursorInput,\n table: AnyTable,\n columnNames: readonly string[],\n resolver?: NamingResolver,\n): readonly unknown[] | undefined => {\n if (!cursor) {\n return undefined;\n }\n\n const cursorObj = typeof cursor === \"string\" ? decodeCursor(cursor) : cursor;\n\n const columnMap = resolver ? resolver.getColumnNameMap(table) : undefined;\n\n return columnNames.map((columnName) => {\n const logicalName = columnMap?.[columnName] ?? columnName;\n const column = table.columns[logicalName];\n if (!column) {\n throw new Error(`Column \"${logicalName}\" not found on table \"${table.name}\".`);\n }\n\n const rawValue = resolveCursorValue(cursorObj.indexValues[column.name], column);\n if (rawValue === undefined) {\n return undefined;\n }\n\n const deserialized = cursorSerializer.deserialize(rawValue, column);\n return normalizeIndexValue(deserialized, column);\n });\n};\n\nconst findRows = (\n op: Extract<RetrievalOperation<AnySchema>, { type: \"find\" }>,\n namespaceStore: InMemoryNamespaceStore,\n tableStore: InMemoryTableStore,\n resolver?: NamingResolver,\n now: () => Date = () => new Date(),\n): InMemoryRow[] => {\n const table = op.table;\n const orderByIndex = op.options.orderByIndex;\n const orderIndexName = orderByIndex?.indexName ?? op.indexName;\n const orderIndex = tableStore.indexes.get(orderIndexName);\n if (!orderIndex) {\n throw new Error(`Missing in-memory index \"${orderIndexName}\" on table \"${table.name}\".`);\n }\n const direction = orderByIndex?.direction ?? \"asc\";\n const afterKey = buildCursorKey(\n op.options.after,\n table,\n orderIndex.definition.columnNames,\n resolver,\n );\n const beforeKey = buildCursorKey(\n op.options.before,\n table,\n orderIndex.definition.columnNames,\n resolver,\n );\n const limit =\n op.withCursor && op.options.pageSize !== undefined\n ? op.options.pageSize + 1\n : op.options.pageSize;\n\n const scanOptions = {\n direction,\n // Apply result limits after where/join filtering. Passing the limit into the\n // raw index scan can drop matching rows that appear later in the index.\n limit: undefined as number | undefined,\n start: undefined as readonly unknown[] | undefined,\n startInclusive: true,\n end: undefined as readonly unknown[] | undefined,\n endInclusive: true,\n };\n\n if (afterKey) {\n if (direction === \"asc\") {\n scanOptions.start = afterKey;\n scanOptions.startInclusive = false;\n } else {\n scanOptions.end = afterKey;\n scanOptions.endInclusive = false;\n }\n }\n\n if (beforeKey) {\n if (direction === \"asc\") {\n scanOptions.end = beforeKey;\n scanOptions.endInclusive = false;\n } else {\n scanOptions.start = beforeKey;\n scanOptions.startInclusive = false;\n }\n }\n\n const entries = orderIndex.index.scan(scanOptions);\n\n const whereResult = op.options.where\n ? buildCondition(table.columns, op.options.where)\n : undefined;\n\n if (whereResult === false) {\n return [];\n }\n\n const condition = whereResult === true ? undefined : whereResult;\n const results: InMemoryRow[] = [];\n\n for (const entry of entries) {\n const row = tableStore.rows.get(entry.value);\n if (!row) {\n continue;\n }\n if (condition && !evaluateCondition(condition, table, row, namespaceStore, resolver, now)) {\n continue;\n }\n\n const baseOutput = selectRow(\n row,\n table,\n op.options.select as readonly string[] | true | undefined,\n resolver,\n );\n\n if (op.options.joins && op.options.joins.length > 0) {\n const joined = applyJoins(\n baseOutput,\n row,\n table,\n op.options.joins,\n namespaceStore,\n resolver,\n now,\n );\n for (const joinedRow of joined) {\n results.push(joinedRow);\n if (limit !== undefined && results.length >= limit) {\n break;\n }\n }\n } else {\n results.push(baseOutput);\n }\n\n if (limit !== undefined && results.length >= limit) {\n break;\n }\n }\n\n return results;\n};\n\nconst countRows = (\n op: Extract<RetrievalOperation<AnySchema>, { type: \"count\" }>,\n namespaceStore: InMemoryNamespaceStore,\n tableStore: InMemoryTableStore,\n resolver?: NamingResolver,\n now: () => Date = () => new Date(),\n): number => {\n const table = op.table;\n const whereResult = op.options.where\n ? buildCondition(table.columns, op.options.where)\n : undefined;\n\n if (whereResult === false) {\n return 0;\n }\n\n const condition = whereResult === true ? undefined : whereResult;\n let count = 0;\n\n for (const row of tableStore.rows.values()) {\n if (condition && !evaluateCondition(condition, table, row, namespaceStore, resolver, now)) {\n continue;\n }\n count += 1;\n }\n\n return count;\n};\n\nconst resolveDbNowValue = (value: unknown, options: ResolvedInMemoryAdapterOptions): unknown => {\n if (!isDbNow(value)) {\n return value;\n }\n const now = options.clock.now();\n const offsetMs = getDbNowOffsetMs(value);\n return offsetMs === 0 ? now : new Date(now.getTime() + offsetMs);\n};\n\nconst createRow = (\n op: Extract<MutationOperation<AnySchema>, { type: \"create\" }>,\n namespaceStore: InMemoryNamespaceStore,\n tableStore: InMemoryTableStore,\n options: ResolvedInMemoryAdapterOptions,\n resolver?: NamingResolver,\n): bigint => {\n const table = op.schema.tables[op.table];\n if (!table) {\n throw new Error(`Invalid table name ${op.table}.`);\n }\n\n const encoded = encodeValuesWithDbDefaults(\n op.values,\n table,\n {\n now: options.clock.now,\n createId: options.idGenerator,\n },\n resolver,\n );\n const resolvedValues = options.enforceConstraints\n ? resolveReferenceSubqueriesOrThrow(namespaceStore, table, encoded, resolver)\n : resolveReferenceSubqueries(namespaceStore, encoded, resolver);\n\n const row: InMemoryRow = {};\n for (const columnName of Object.keys(table.columns)) {\n const column = table.columns[columnName];\n if (!column || column.role === \"internal-id\") {\n continue;\n }\n\n const physicalColumnName = getPhysicalColumnName(table, column.name, resolver);\n const value = resolvedValues[physicalColumnName];\n if (value === undefined) {\n if (column.isNullable) {\n row[physicalColumnName] = null;\n continue;\n }\n\n if (column.role === \"version\") {\n row[physicalColumnName] = 0;\n continue;\n }\n\n throw new Error(`Missing required value for column \"${column.name}\".`);\n }\n\n row[physicalColumnName] = resolveDbNowValue(value, options);\n }\n\n const internalId = options.internalIdGeneratorProvided\n ? options.internalIdGenerator()\n : tableStore.nextInternalId;\n if (!options.internalIdGeneratorProvided) {\n tableStore.nextInternalId += 1n;\n }\n\n const internalIdColumnName = getPhysicalColumnName(table, \"_internalId\", resolver);\n const versionColumnName = getPhysicalColumnName(table, \"_version\", resolver);\n row[internalIdColumnName] = internalId;\n row[versionColumnName] = row[versionColumnName] ?? 0;\n\n if (options.enforceConstraints) {\n enforceOutgoingForeignKeys(namespaceStore, table, row, undefined, resolver);\n }\n\n tableStore.rows.set(internalId, row);\n\n for (const indexStore of tableStore.indexes.values()) {\n const key = buildIndexKey(table, indexStore.definition, row, resolver);\n indexStore.index.insert(key, internalId, { enforceUnique: options.enforceConstraints });\n }\n\n return internalId;\n};\n\nconst updateRow = (\n op: Extract<MutationOperation<AnySchema>, { type: \"update\" }>,\n namespaceStore: InMemoryNamespaceStore,\n tableStore: InMemoryTableStore,\n options: ResolvedInMemoryAdapterOptions,\n resolver?: NamingResolver,\n): (() => void) | null => {\n const table = op.schema.tables[op.table];\n if (!table) {\n throw new Error(`Invalid table name ${op.table}.`);\n }\n\n const externalId = getExternalId(op.id);\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n const existing = findRowByExternalId(tableStore, table, externalId, resolver);\n if (!existing) {\n if (versionToCheck !== undefined) {\n throw new VersionConflictError(`Version conflict: row \"${externalId}\" not found.`);\n }\n return null;\n }\n\n const versionColumnName = getPhysicalColumnName(table, \"_version\", resolver);\n const currentVersion = Number(existing.row[versionColumnName] ?? 0);\n if (versionToCheck !== undefined && currentVersion !== versionToCheck) {\n throw new VersionConflictError(`Version conflict: row \"${externalId}\" has changed.`);\n }\n\n const encoded = encodeValues(op.set as Record<string, unknown>, table, false, {}, resolver);\n const resolvedValues = options.enforceConstraints\n ? resolveReferenceSubqueriesOrThrow(namespaceStore, table, encoded, resolver)\n : resolveReferenceSubqueries(namespaceStore, encoded, resolver);\n\n const resolvedUpdateValues: InMemoryRow = {};\n for (const [columnName, value] of Object.entries(resolvedValues)) {\n resolvedUpdateValues[columnName] = resolveDbNowValue(value, options);\n }\n\n const updatedRow: InMemoryRow = { ...existing.row, ...resolvedUpdateValues };\n updatedRow[versionColumnName] = currentVersion + 1;\n\n if (options.enforceConstraints) {\n enforceOutgoingForeignKeys(\n namespaceStore,\n table,\n updatedRow,\n new Set(Object.keys(resolvedValues)),\n resolver,\n );\n }\n\n const indexUpdates = Array.from(tableStore.indexes.values()).map((indexStore) => ({\n indexStore,\n oldKey: buildIndexKey(table, indexStore.definition, existing.row, resolver),\n newKey: buildIndexKey(table, indexStore.definition, updatedRow, resolver),\n }));\n\n const applied: typeof indexUpdates = [];\n try {\n for (const update of indexUpdates) {\n update.indexStore.index.update(update.oldKey, update.newKey, existing.internalId, {\n enforceUnique: options.enforceConstraints,\n });\n applied.push(update);\n }\n } catch (error) {\n for (const update of applied.reverse()) {\n update.indexStore.index.update(update.newKey, update.oldKey, existing.internalId, {\n enforceUnique: options.enforceConstraints,\n });\n }\n throw error;\n }\n\n tableStore.rows.set(existing.internalId, updatedRow);\n\n return () => {\n for (const update of indexUpdates.slice().reverse()) {\n update.indexStore.index.update(update.newKey, update.oldKey, existing.internalId, {\n enforceUnique: options.enforceConstraints,\n });\n }\n tableStore.rows.set(existing.internalId, existing.row);\n };\n};\n\nconst deleteRow = (\n op: Extract<MutationOperation<AnySchema>, { type: \"delete\" }>,\n namespaceStore: InMemoryNamespaceStore,\n tableStore: InMemoryTableStore,\n table: AnyTable,\n options: ResolvedInMemoryAdapterOptions,\n resolver?: NamingResolver,\n): (() => void) | null => {\n const externalId = getExternalId(op.id);\n const versionToCheck = getVersionToCheck(op.id, op.checkVersion);\n const existing = findRowByExternalId(tableStore, table, externalId, resolver);\n if (!existing) {\n if (versionToCheck !== undefined) {\n throw new VersionConflictError(`Version conflict: row \"${externalId}\" not found.`);\n }\n return null;\n }\n\n const versionColumnName = getPhysicalColumnName(table, \"_version\", resolver);\n const currentVersion = Number(existing.row[versionColumnName] ?? 0);\n if (versionToCheck !== undefined && currentVersion !== versionToCheck) {\n throw new VersionConflictError(`Version conflict: row \"${externalId}\" has changed.`);\n }\n\n if (options.enforceConstraints) {\n enforceNoIncomingForeignKeys(namespaceStore, op.schema, table, existing.row, resolver);\n }\n\n const indexEntries = Array.from(tableStore.indexes.values()).map((indexStore) => ({\n indexStore,\n key: buildIndexKey(table, indexStore.definition, existing.row, resolver),\n }));\n\n const removedEntries: typeof indexEntries = [];\n for (const entry of indexEntries) {\n const removed = entry.indexStore.index.remove(entry.key, existing.internalId);\n if (!removed) {\n for (const removedEntry of removedEntries) {\n removedEntry.indexStore.index.insert(removedEntry.key, existing.internalId, {\n enforceUnique: options.enforceConstraints,\n });\n }\n throw new Error(\"Failed to remove index entry during delete.\");\n }\n removedEntries.push(entry);\n }\n\n tableStore.rows.delete(existing.internalId);\n\n return () => {\n tableStore.rows.set(existing.internalId, existing.row);\n for (const entry of indexEntries) {\n entry.indexStore.index.insert(entry.key, existing.internalId, {\n enforceUnique: options.enforceConstraints,\n });\n }\n };\n};\n\nconst checkRow = (\n op: Extract<MutationOperation<AnySchema>, { type: \"check\" }>,\n tableStore: InMemoryTableStore,\n table: AnyTable,\n resolver?: NamingResolver,\n): void => {\n const existing = findRowByExternalId(tableStore, table, op.id.externalId, resolver);\n if (!existing) {\n throw new VersionConflictError(`Version conflict: row \"${op.id.externalId}\" not found.`);\n }\n\n const versionColumnName = getPhysicalColumnName(table, \"_version\", resolver);\n const currentVersion = Number(existing.row[versionColumnName] ?? 0);\n if (currentVersion !== op.id.version) {\n throw new VersionConflictError(`Version conflict: row \"${op.id.externalId}\" has changed.`);\n }\n};\n\nconst resolveSchemaForLookup = (\n table: AnyTable,\n namespace: string | undefined,\n schemaByNamespace?: Map<string, SchemaNamespaceEntry>,\n): SchemaNamespaceEntry | null => {\n if (!schemaByNamespace) {\n return null;\n }\n\n if (namespace !== undefined) {\n const entry = schemaByNamespace.get(namespace);\n if (entry && entry.schema.tables[table.name] === table) {\n return entry;\n }\n return null;\n }\n\n for (const entry of schemaByNamespace.values()) {\n if (entry.schema.tables[table.name] === table) {\n return entry;\n }\n }\n\n return null;\n};\n\nconst reserveOutboxVersion = (\n store: InMemoryStore,\n options: ResolvedInMemoryAdapterOptions,\n resolverFactory?: ResolverFactory,\n): { version: bigint; rollback: () => void } => {\n const resolver = getResolver(internalSchema, null, resolverFactory);\n const namespaceStore = getNamespaceStore(store, internalSchema, null, resolver);\n const settingsTable = internalSchema.tables[SETTINGS_TABLE_NAME];\n if (!settingsTable) {\n throw new Error(\"Missing internal settings table definition.\");\n }\n const tableStore = getTableStore(namespaceStore, settingsTable, resolver);\n const keyColumnName = getPhysicalColumnName(settingsTable, \"key\", resolver);\n const valueColumnName = getPhysicalColumnName(settingsTable, \"value\", resolver);\n const idColumnName = getPhysicalColumnName(\n settingsTable,\n settingsTable.getIdColumn().name,\n resolver,\n );\n\n for (const row of tableStore.rows.values()) {\n if (row[keyColumnName] !== OUTBOX_VERSION_KEY) {\n continue;\n }\n\n const rawValue = row[valueColumnName];\n const current = parseOutboxVersionValue(rawValue);\n const next = current + 1n;\n const externalId = row[idColumnName];\n if (typeof externalId !== \"string\") {\n throw new Error(\"Outbox version row is missing external id.\");\n }\n\n const updateOp: Extract<MutationOperation<AnySchema>, { type: \"update\" }> = {\n type: \"update\",\n schema: internalSchema,\n namespace: null,\n table: settingsTable.name,\n id: externalId,\n checkVersion: false,\n set: { value: next.toString() },\n };\n const rollback = updateRow(updateOp, namespaceStore, tableStore, options, resolver);\n return { version: next, rollback: rollback ?? (() => {}) };\n }\n\n const createOp: Extract<MutationOperation<AnySchema>, { type: \"create\" }> = {\n type: \"create\",\n schema: internalSchema,\n namespace: null,\n table: settingsTable.name,\n values: { key: OUTBOX_VERSION_KEY, value: \"0\" },\n generatedExternalId: options.idGenerator(),\n };\n const previousInternalId = tableStore.nextInternalId;\n const internalId = createRow(createOp, namespaceStore, tableStore, options, resolver);\n const rollback = () => {\n const existingRow = tableStore.rows.get(internalId);\n if (existingRow) {\n for (const indexStore of tableStore.indexes.values()) {\n const key = buildIndexKey(settingsTable, indexStore.definition, existingRow, resolver);\n indexStore.index.remove(key, internalId);\n }\n tableStore.rows.delete(internalId);\n }\n tableStore.nextInternalId = previousInternalId;\n };\n\n return { version: 0n, rollback };\n};\n\nconst resolveOutboxRefMap = (\n store: InMemoryStore,\n lookups: OutboxRefLookup[],\n resolverFactory: ResolverFactory | undefined,\n schemaByNamespace?: Map<string, SchemaNamespaceEntry>,\n): OutboxRefMap | undefined => {\n if (lookups.length === 0) {\n return undefined;\n }\n\n const refMap: OutboxRefMap = {};\n\n for (const lookup of lookups) {\n const schemaEntry = resolveSchemaForLookup(lookup.table, lookup.namespace, schemaByNamespace);\n if (!schemaEntry) {\n throw new Error(`Failed to resolve schema for outbox lookup on ${lookup.table.name}.`);\n }\n\n const resolver = getResolver(schemaEntry.schema, schemaEntry.namespace, resolverFactory);\n const namespaceStore = getNamespaceStore(\n store,\n schemaEntry.schema,\n schemaEntry.namespace,\n resolver,\n );\n const tableStore = getTableStore(namespaceStore, lookup.table, resolver);\n const internalId =\n typeof lookup.internalId === \"number\" ? BigInt(lookup.internalId) : lookup.internalId;\n const row = tableStore.rows.get(internalId);\n\n if (!row) {\n const tableName = resolver ? resolver.getTableName(lookup.table.name) : lookup.table.name;\n const internalColumn = resolver\n ? resolver.getColumnName(lookup.table.name, lookup.table.getInternalIdColumn().name)\n : lookup.table.getInternalIdColumn().name;\n throw new Error(\n `Failed to resolve outbox reference for ${tableName}.${internalColumn}=${String(lookup.internalId)}`,\n );\n }\n\n const externalColumnName = getPhysicalColumnName(\n lookup.table,\n lookup.table.getIdColumn().name,\n resolver,\n );\n const externalId = row[externalColumnName];\n if (typeof externalId !== \"string\") {\n throw new Error(\"Outbox reference row is missing external id.\");\n }\n\n refMap[lookup.key] = externalId;\n }\n\n return Object.keys(refMap).length > 0 ? refMap : undefined;\n};\n\nconst insertOutboxRow = (\n store: InMemoryStore,\n options: ResolvedInMemoryAdapterOptions,\n resolverFactory: ResolverFactory | undefined,\n payload: {\n versionstamp: string;\n uowId: string;\n payload: { json: unknown; meta?: Record<string, unknown> };\n refMap?: OutboxRefMap;\n },\n): (() => void) => {\n const resolver = getResolver(internalSchema, null, resolverFactory);\n const namespaceStore = getNamespaceStore(store, internalSchema, null, resolver);\n const outboxTable = internalSchema.tables.fragno_db_outbox;\n if (!outboxTable) {\n throw new Error(\"Missing internal outbox table definition.\");\n }\n const tableStore = getTableStore(namespaceStore, outboxTable, resolver);\n const createOp: Extract<MutationOperation<AnySchema>, { type: \"create\" }> = {\n type: \"create\",\n schema: internalSchema,\n namespace: null,\n table: outboxTable.name,\n values: {\n versionstamp: payload.versionstamp,\n uowId: payload.uowId,\n payload: payload.payload,\n ...(payload.refMap ? { refMap: payload.refMap } : {}),\n },\n generatedExternalId: options.idGenerator(),\n };\n const previousInternalId = tableStore.nextInternalId;\n const internalId = createRow(createOp, namespaceStore, tableStore, options, resolver);\n\n return () => {\n const existingRow = tableStore.rows.get(internalId);\n if (existingRow) {\n for (const indexStore of tableStore.indexes.values()) {\n const key = buildIndexKey(outboxTable, indexStore.definition, existingRow, resolver);\n indexStore.index.remove(key, internalId);\n }\n tableStore.rows.delete(internalId);\n }\n tableStore.nextInternalId = previousInternalId;\n };\n};\n\nconst insertOutboxMutationRows = (\n store: InMemoryStore,\n options: ResolvedInMemoryAdapterOptions,\n resolverFactory: ResolverFactory | undefined,\n payload: {\n entryVersionstamp: string;\n uowId: string;\n mutations: {\n versionstamp: string;\n schema: string;\n table: string;\n externalId: string;\n op: string;\n }[];\n },\n): Array<() => void> => {\n if (payload.mutations.length === 0) {\n return [];\n }\n\n const resolver = getResolver(internalSchema, null, resolverFactory);\n const namespaceStore = getNamespaceStore(store, internalSchema, null, resolver);\n const mutationsTable = internalSchema.tables.fragno_db_outbox_mutations;\n if (!mutationsTable) {\n throw new Error(\"Missing internal outbox mutations table definition.\");\n }\n const tableStore = getTableStore(namespaceStore, mutationsTable, resolver);\n const rollbackActions: Array<() => void> = [];\n\n try {\n for (const mutation of payload.mutations) {\n const createOp: Extract<MutationOperation<AnySchema>, { type: \"create\" }> = {\n type: \"create\",\n schema: internalSchema,\n namespace: null,\n table: mutationsTable.name,\n values: {\n entryVersionstamp: payload.entryVersionstamp,\n mutationVersionstamp: mutation.versionstamp,\n uowId: payload.uowId,\n schema: mutation.schema,\n table: mutation.table,\n externalId: mutation.externalId,\n op: mutation.op,\n },\n generatedExternalId: options.idGenerator(),\n };\n\n const previousInternalId = tableStore.nextInternalId;\n const internalId = createRow(createOp, namespaceStore, tableStore, options, resolver);\n\n rollbackActions.push(() => {\n const existingRow = tableStore.rows.get(internalId);\n if (existingRow) {\n for (const indexStore of tableStore.indexes.values()) {\n const key = buildIndexKey(mutationsTable, indexStore.definition, existingRow, resolver);\n indexStore.index.remove(key, internalId);\n }\n tableStore.rows.delete(internalId);\n }\n tableStore.nextInternalId = previousInternalId;\n });\n }\n } catch (error) {\n for (const rollback of rollbackActions.reverse()) {\n rollback();\n }\n throw error;\n }\n\n return rollbackActions;\n};\n\nexport const createInMemoryUowCompiler = (): UOWCompiler<InMemoryCompiledQuery> => ({\n compileRetrievalOperation(op: RetrievalOperation<AnySchema>): InMemoryCompiledQuery | null {\n return op;\n },\n compileMutationOperation(\n op: MutationOperation<AnySchema>,\n ): CompiledMutation<InMemoryCompiledQuery> | null {\n return {\n query: op,\n operation: op,\n op: op.type,\n expectedAffectedRows: null,\n expectedReturnedRows: null,\n };\n },\n});\n\nexport const createInMemoryUowExecutor = (\n store: InMemoryStore,\n options: ResolvedInMemoryAdapterOptions,\n resolverFactory?: ResolverFactory,\n schemaByNamespace?: Map<string, SchemaNamespaceEntry>,\n): UOWExecutor<InMemoryCompiledQuery, InMemoryRawResult> => ({\n async executeRetrievalPhase(\n retrievalBatch: InMemoryCompiledQuery[],\n ): Promise<InMemoryRawResult[]> {\n const results: InMemoryRawResult[] = [];\n\n for (const compiled of retrievalBatch) {\n if (compiled.type === \"count\" || compiled.type === \"find\") {\n const resolver = getResolver(compiled.schema, compiled.namespace, resolverFactory);\n const namespaceStore = getNamespaceStore(\n store,\n compiled.schema,\n compiled.namespace,\n resolver,\n );\n const tableStore = getTableStore(namespaceStore, compiled.table, resolver);\n\n if (compiled.type === \"find\") {\n results.push(findRows(compiled, namespaceStore, tableStore, resolver, options.clock.now));\n } else {\n results.push([\n { count: countRows(compiled, namespaceStore, tableStore, resolver, options.clock.now) },\n ]);\n }\n continue;\n }\n\n throw new Error(`Unsupported in-memory retrieval operation: ${compiled.type}`);\n }\n\n return results;\n },\n\n async executeMutationPhase(\n mutationBatch: CompiledMutation<InMemoryCompiledQuery>[],\n ): Promise<MutationResult> {\n const createdInternalIds: (bigint | null)[] = [];\n const rollbackActions: Array<() => void> = [];\n const outboxEnabled = options.outbox?.enabled ?? false;\n const shouldInclude = options.outbox?.shouldInclude;\n const outboxOperations = outboxEnabled\n ? mutationBatch.flatMap((mutation) => {\n const operation = mutation.operation;\n if (!operation) {\n return [];\n }\n if (shouldInclude && !shouldInclude(operation)) {\n return [];\n }\n return [operation];\n })\n : [];\n const outboxPlan = outboxOperations.length > 0 ? buildOutboxPlan(outboxOperations) : null;\n const shouldWriteOutbox = outboxEnabled && outboxPlan !== null && outboxPlan.drafts.length > 0;\n let outboxVersion: bigint | null = null;\n\n try {\n if (shouldWriteOutbox) {\n const reservation = reserveOutboxVersion(store, options, resolverFactory);\n outboxVersion = reservation.version;\n rollbackActions.push(reservation.rollback);\n }\n\n for (const compiled of mutationBatch) {\n const operation = compiled.query;\n\n if (operation.type === \"create\") {\n const resolver = getResolver(operation.schema, operation.namespace, resolverFactory);\n const namespaceStore = getNamespaceStore(\n store,\n operation.schema,\n operation.namespace,\n resolver,\n );\n const table = operation.schema.tables[operation.table];\n if (!table) {\n throw new Error(`Invalid table name ${operation.table}.`);\n }\n const tableStore = getTableStore(namespaceStore, table, resolver);\n const previousInternalId = tableStore.nextInternalId;\n const internalId = createRow(operation, namespaceStore, tableStore, options, resolver);\n createdInternalIds.push(internalId);\n rollbackActions.push(() => {\n const row = tableStore.rows.get(internalId);\n if (row) {\n for (const indexStore of tableStore.indexes.values()) {\n const key = buildIndexKey(table, indexStore.definition, row, resolver);\n indexStore.index.remove(key, internalId);\n }\n tableStore.rows.delete(internalId);\n }\n tableStore.nextInternalId = previousInternalId;\n });\n continue;\n }\n\n if (operation.type === \"update\") {\n const resolver = getResolver(operation.schema, operation.namespace, resolverFactory);\n const namespaceStore = getNamespaceStore(\n store,\n operation.schema,\n operation.namespace,\n resolver,\n );\n const table = operation.schema.tables[operation.table];\n if (!table) {\n throw new Error(`Invalid table name ${operation.table}.`);\n }\n const tableStore = getTableStore(namespaceStore, table, resolver);\n const rollback = updateRow(operation, namespaceStore, tableStore, options, resolver);\n if (rollback) {\n rollbackActions.push(rollback);\n }\n continue;\n }\n\n if (operation.type === \"delete\") {\n const resolver = getResolver(operation.schema, operation.namespace, resolverFactory);\n const namespaceStore = getNamespaceStore(\n store,\n operation.schema,\n operation.namespace,\n resolver,\n );\n const table = operation.schema.tables[operation.table];\n if (!table) {\n throw new Error(`Invalid table name ${operation.table}.`);\n }\n const tableStore = getTableStore(namespaceStore, table, resolver);\n const rollback = deleteRow(\n operation,\n namespaceStore,\n tableStore,\n table,\n options,\n resolver,\n );\n if (rollback) {\n rollbackActions.push(rollback);\n }\n continue;\n }\n\n if (operation.type === \"check\") {\n const resolver = getResolver(operation.schema, operation.namespace, resolverFactory);\n const namespaceStore = getNamespaceStore(\n store,\n operation.schema,\n operation.namespace,\n resolver,\n );\n const table = operation.schema.tables[operation.table];\n if (!table) {\n throw new Error(`Invalid table name ${operation.table}.`);\n }\n const tableStore = getTableStore(namespaceStore, table, resolver);\n checkRow(operation, tableStore, table, resolver);\n continue;\n }\n\n throw new Error(`Unsupported in-memory mutation \"${operation.type}\".`);\n }\n\n if (shouldWriteOutbox && outboxPlan && outboxVersion !== null) {\n const uowId = mutationBatch[0]?.uowId;\n if (!uowId) {\n throw new Error(\"Outbox mutation batch is missing uowId.\");\n }\n\n const refMap = resolveOutboxRefMap(\n store,\n outboxPlan.lookups,\n resolverFactory,\n schemaByNamespace,\n );\n const payload = finalizeOutboxPayload(outboxPlan, outboxVersion);\n const payloadSerialized = superjson.serialize(payload);\n const versionstamp = versionstampToHex(encodeVersionstamp(outboxVersion, 0));\n rollbackActions.push(\n ...insertOutboxMutationRows(store, options, resolverFactory, {\n entryVersionstamp: versionstamp,\n uowId,\n mutations: payload.mutations,\n }),\n );\n const rollback = insertOutboxRow(store, options, resolverFactory, {\n versionstamp,\n uowId,\n payload: payloadSerialized,\n refMap,\n });\n rollbackActions.push(rollback);\n }\n } catch (error) {\n for (const rollback of rollbackActions.reverse()) {\n rollback();\n }\n if (error instanceof VersionConflictError) {\n return { success: false };\n }\n throw error;\n }\n\n return { success: true, createdInternalIds };\n },\n});\n\nexport class InMemoryUowDecoder implements UOWDecoder<InMemoryRawResult> {\n readonly #resolverFactory?: ResolverFactory;\n\n constructor(resolverFactory?: ResolverFactory) {\n this.#resolverFactory = resolverFactory;\n }\n\n decode(rawResults: InMemoryRawResult[], operations: RetrievalOperation<AnySchema>[]): unknown[] {\n if (rawResults.length !== operations.length) {\n throw new Error(\"rawResults and ops must have the same length\");\n }\n\n return rawResults.map((result, index) => {\n const op = operations[index];\n if (!op) {\n throw new Error(\"op must be defined\");\n }\n\n if (op.type === \"count\") {\n return this.decodeCount(result);\n }\n\n const resolver = getResolver(op.schema, op.namespace, this.#resolverFactory);\n const rows = result as InMemoryRow[];\n const decodedRows = rows.map((row) => this.decodeRow(row, op.table, resolver));\n\n if (op.withCursor) {\n return this.decodeCursorResult(decodedRows, op.table, op);\n }\n\n return decodedRows;\n });\n }\n\n private decodeCount(result: InMemoryRawResult): number {\n if (typeof result === \"number\") {\n return result;\n }\n\n const rows = result as { count: number }[];\n const first = rows[0];\n if (!first) {\n return 0;\n }\n const count = Number(first.count);\n if (Number.isNaN(count)) {\n throw new Error(`Unexpected result for count, received: ${first.count}`);\n }\n return count;\n }\n\n private decodeRow(\n row: InMemoryRow,\n table: AnyTable,\n resolver?: NamingResolver,\n ): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n const columnValues: Record<string, unknown> = {};\n const relationData: Record<string, Record<string, unknown>> = {};\n const columnMap = resolver ? resolver.getColumnNameMap(table) : undefined;\n\n for (const key in row) {\n const colonIndex = key.indexOf(\":\");\n if (colonIndex === -1) {\n const logicalName = columnMap?.[key] ?? key;\n if (table.columns[logicalName]) {\n columnValues[logicalName] = row[key];\n }\n continue;\n }\n\n const relationName = key.slice(0, colonIndex);\n const remainder = key.slice(colonIndex + 1);\n const relation = table.relations[relationName];\n if (!relation) {\n continue;\n }\n\n relationData[relationName] ??= {};\n relationData[relationName][remainder] = row[key];\n }\n\n for (const relationName in relationData) {\n const relation = table.relations[relationName];\n if (!relation) {\n continue;\n }\n const relationRow = relationData[relationName];\n const internalIdKey = relation.table.getInternalIdColumn().name;\n if (\n Object.prototype.hasOwnProperty.call(relationRow, internalIdKey) &&\n isNullish(relationRow[internalIdKey])\n ) {\n output[relationName] = relation.type === \"many\" ? [] : null;\n continue;\n }\n\n output[relationName] = this.decodeRow(relationRow, relation.table, resolver);\n }\n\n for (const key in columnValues) {\n const column = table.columns[key];\n if (!column) {\n continue;\n }\n if (column.isHidden) {\n continue;\n }\n\n if (column.role === \"external-id\" && columnValues[\"_internalId\"] !== undefined) {\n output[key] = new FragnoId({\n externalId: columnValues[key] as string,\n internalId: columnValues[\"_internalId\"] as bigint,\n version: columnValues[\"_version\"] as number,\n });\n continue;\n }\n\n if (column.role === \"reference\") {\n const value = columnValues[key];\n output[key] =\n value === null || value === undefined\n ? null\n : FragnoReference.fromInternal(value as bigint);\n continue;\n }\n\n output[key] = columnValues[key];\n }\n\n return output;\n }\n\n private decodeCursorResult(\n decodedRows: Record<string, unknown>[],\n table: AnyTable,\n operation: Extract<RetrievalOperation<AnySchema>, { type: \"find\" }>,\n ): CursorResult<unknown> {\n let cursor: Cursor | undefined;\n let hasNextPage = false;\n let items = decodedRows;\n\n if (\n operation.options.pageSize &&\n operation.options.pageSize > 0 &&\n decodedRows.length > operation.options.pageSize\n ) {\n hasNextPage = true;\n items = decodedRows.slice(0, operation.options.pageSize);\n\n if (operation.options.orderByIndex) {\n const lastItem = items[items.length - 1];\n const indexName = operation.options.orderByIndex.indexName;\n\n let indexColumns;\n if (indexName === \"_primary\") {\n indexColumns = [table.getIdColumn()];\n } else {\n const index = table.indexes[indexName];\n if (index) {\n indexColumns = index.columns;\n }\n }\n\n if (indexColumns && lastItem) {\n cursor = createCursorFromRecord(lastItem, indexColumns, {\n indexName: operation.options.orderByIndex.indexName,\n orderDirection: operation.options.orderByIndex.direction,\n pageSize: operation.options.pageSize,\n });\n }\n }\n }\n\n return {\n items,\n cursor,\n hasNextPage,\n };\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { SqlNamingStrategy } from "../../naming/sql-naming.js";
2
+ import { OutboxConfig } from "../../outbox/outbox.js";
2
3
 
3
4
  //#region src/adapters/in-memory/options.d.ts
4
5
  type InMemoryAdapterOptions = {
@@ -22,6 +23,7 @@ type ResolvedInMemoryAdapterOptions = {
22
23
  internalIdGeneratorProvided: boolean;
23
24
  enforceConstraints: boolean;
24
25
  btreeOrder: number;
26
+ outbox?: OutboxConfig;
25
27
  };
26
28
  //#endregion
27
29
  export { InMemoryAdapterOptions, ResolvedInMemoryAdapterOptions };
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","names":[],"sources":["../../../src/adapters/in-memory/options.ts"],"sourcesContent":[],"mappings":";;;KAGY,sBAAA;;IAAA,GAAA,EAAA,GAAA,GACW,IADX;EAUA,CAAA;;;;;;mBAHO;;KAGP,8BAAA;;eACU"}
1
+ {"version":3,"file":"options.d.ts","names":[],"sources":["../../../src/adapters/in-memory/options.ts"],"sourcesContent":[],"mappings":";;;;KAKY,sBAAA;;IAAA,GAAA,EAAA,GAAA,GACW,IADX;EAUA,CAAA;;;;;;mBAHO;;KAGP,8BAAA;;eACU;;;;;;;;WAOX"}
@@ -1,4 +1,4 @@
1
- import { createId, init } from "@paralleldrive/cuid2";
1
+ import { createId, init } from "@fragno-dev/core";
2
2
 
3
3
  //#region src/adapters/in-memory/options.ts
4
4
  const defaultClock = { now: () => /* @__PURE__ */ new Date() };
@@ -52,7 +52,8 @@ const resolveInMemoryAdapterOptions = (options = {}) => {
52
52
  internalIdGenerator: options.internalIdGenerator ?? createInternalIdGenerator(),
53
53
  internalIdGeneratorProvided,
54
54
  enforceConstraints: options.enforceConstraints ?? defaultEnforceConstraints,
55
- btreeOrder: options.btreeOrder ?? defaultBtreeOrder
55
+ btreeOrder: options.btreeOrder ?? defaultBtreeOrder,
56
+ outbox: void 0
56
57
  };
57
58
  };
58
59
 
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","names":[],"sources":["../../../src/adapters/in-memory/options.ts"],"sourcesContent":["import { createId, init } from \"@paralleldrive/cuid2\";\nimport type { SqlNamingStrategy } from \"../../naming/sql-naming\";\n\nexport type InMemoryAdapterOptions = {\n clock?: { now: () => Date };\n idGenerator?: () => string;\n idSeed?: string;\n internalIdGenerator?: () => bigint;\n enforceConstraints?: boolean;\n btreeOrder?: number;\n namingStrategy?: SqlNamingStrategy;\n};\n\nexport type ResolvedInMemoryAdapterOptions = {\n clock: { now: () => Date };\n idGenerator: () => string;\n idSeed: string;\n internalIdGenerator: () => bigint;\n internalIdGeneratorProvided: boolean;\n enforceConstraints: boolean;\n btreeOrder: number;\n};\n\nconst defaultClock = {\n now: () => new Date(),\n};\n\nconst defaultBtreeOrder = 32;\nconst defaultEnforceConstraints = true;\nconst initialCountMax = 476782367;\nconst seededRandomStep = 1831565813;\n\nconst createCounter = (start: number) => {\n let value = start;\n return () => value++;\n};\n\nconst hashSeed = (seed: string): number => {\n let hash = 2166136261;\n for (let i = 0; i < seed.length; i += 1) {\n hash ^= seed.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n};\n\nconst createSeededRandom = (seed: string) => {\n let state = hashSeed(seed);\n return () => {\n state |= 0;\n state = (state + seededRandomStep) | 0;\n let t = Math.imul(state ^ (state >>> 15), 1 | state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n};\n\nconst createSeededIdGenerator = (seed: string): (() => string) => {\n const random = createSeededRandom(seed);\n const counter = createCounter(Math.floor(random() * initialCountMax));\n return init({ random, counter });\n};\n\nconst createInternalIdGenerator = (): (() => bigint) => {\n let current = 0n;\n return () => {\n current += 1n;\n return current;\n };\n};\n\nexport const resolveInMemoryAdapterOptions = (\n options: InMemoryAdapterOptions = {},\n): ResolvedInMemoryAdapterOptions => {\n const idSeed = options.idSeed ?? createId();\n const internalIdGeneratorProvided = options.internalIdGenerator !== undefined;\n\n return {\n clock: options.clock ?? defaultClock,\n idGenerator: options.idGenerator ?? createSeededIdGenerator(idSeed),\n idSeed,\n internalIdGenerator: options.internalIdGenerator ?? createInternalIdGenerator(),\n internalIdGeneratorProvided,\n enforceConstraints: options.enforceConstraints ?? defaultEnforceConstraints,\n btreeOrder: options.btreeOrder ?? defaultBtreeOrder,\n };\n};\n"],"mappings":";;;AAuBA,MAAM,eAAe,EACnB,2BAAW,IAAI,MAAM,EACtB;AAED,MAAM,oBAAoB;AAC1B,MAAM,4BAA4B;AAClC,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;AAEzB,MAAM,iBAAiB,UAAkB;CACvC,IAAI,QAAQ;AACZ,cAAa;;AAGf,MAAM,YAAY,SAAyB;CACzC,IAAI,OAAO;AACX,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAQ,KAAK,WAAW,EAAE;AAC1B,SAAO,KAAK,KAAK,MAAM,SAAS;;AAElC,QAAO,SAAS;;AAGlB,MAAM,sBAAsB,SAAiB;CAC3C,IAAI,QAAQ,SAAS,KAAK;AAC1B,cAAa;AACX,WAAS;AACT,UAAS,QAAQ,mBAAoB;EACrC,IAAI,IAAI,KAAK,KAAK,QAAS,UAAU,IAAK,IAAI,MAAM;AACpD,MAAK,IAAI,KAAK,KAAK,IAAK,MAAM,GAAI,KAAK,EAAE,GAAI;AAC7C,WAAS,IAAK,MAAM,QAAS,KAAK;;;AAItC,MAAM,2BAA2B,SAAiC;CAChE,MAAM,SAAS,mBAAmB,KAAK;AAEvC,QAAO,KAAK;EAAE;EAAQ,SADN,cAAc,KAAK,MAAM,QAAQ,GAAG,gBAAgB,CAAC;EACtC,CAAC;;AAGlC,MAAM,kCAAkD;CACtD,IAAI,UAAU;AACd,cAAa;AACX,aAAW;AACX,SAAO;;;AAIX,MAAa,iCACX,UAAkC,EAAE,KACD;CACnC,MAAM,SAAS,QAAQ,UAAU,UAAU;CAC3C,MAAM,8BAA8B,QAAQ,wBAAwB;AAEpE,QAAO;EACL,OAAO,QAAQ,SAAS;EACxB,aAAa,QAAQ,eAAe,wBAAwB,OAAO;EACnE;EACA,qBAAqB,QAAQ,uBAAuB,2BAA2B;EAC/E;EACA,oBAAoB,QAAQ,sBAAsB;EAClD,YAAY,QAAQ,cAAc;EACnC"}
1
+ {"version":3,"file":"options.js","names":[],"sources":["../../../src/adapters/in-memory/options.ts"],"sourcesContent":["import { createId, init } from \"@fragno-dev/core\";\n\nimport type { SqlNamingStrategy } from \"../../naming/sql-naming\";\nimport type { OutboxConfig } from \"../../outbox/outbox\";\n\nexport type InMemoryAdapterOptions = {\n clock?: { now: () => Date };\n idGenerator?: () => string;\n idSeed?: string;\n internalIdGenerator?: () => bigint;\n enforceConstraints?: boolean;\n btreeOrder?: number;\n namingStrategy?: SqlNamingStrategy;\n};\n\nexport type ResolvedInMemoryAdapterOptions = {\n clock: { now: () => Date };\n idGenerator: () => string;\n idSeed: string;\n internalIdGenerator: () => bigint;\n internalIdGeneratorProvided: boolean;\n enforceConstraints: boolean;\n btreeOrder: number;\n outbox?: OutboxConfig;\n};\n\nconst defaultClock = {\n now: () => new Date(),\n};\n\nconst defaultBtreeOrder = 32;\nconst defaultEnforceConstraints = true;\nconst initialCountMax = 476782367;\nconst seededRandomStep = 1831565813;\n\nconst createCounter = (start: number) => {\n let value = start;\n return () => value++;\n};\n\nconst hashSeed = (seed: string): number => {\n let hash = 2166136261;\n for (let i = 0; i < seed.length; i += 1) {\n hash ^= seed.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n};\n\nconst createSeededRandom = (seed: string) => {\n let state = hashSeed(seed);\n return () => {\n state |= 0;\n state = (state + seededRandomStep) | 0;\n let t = Math.imul(state ^ (state >>> 15), 1 | state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n};\n\nconst createSeededIdGenerator = (seed: string): (() => string) => {\n const random = createSeededRandom(seed);\n const counter = createCounter(Math.floor(random() * initialCountMax));\n return init({ random, counter });\n};\n\nconst createInternalIdGenerator = (): (() => bigint) => {\n let current = 0n;\n return () => {\n current += 1n;\n return current;\n };\n};\n\nexport const resolveInMemoryAdapterOptions = (\n options: InMemoryAdapterOptions = {},\n): ResolvedInMemoryAdapterOptions => {\n const idSeed = options.idSeed ?? createId();\n const internalIdGeneratorProvided = options.internalIdGenerator !== undefined;\n\n return {\n clock: options.clock ?? defaultClock,\n idGenerator: options.idGenerator ?? createSeededIdGenerator(idSeed),\n idSeed,\n internalIdGenerator: options.internalIdGenerator ?? createInternalIdGenerator(),\n internalIdGeneratorProvided,\n enforceConstraints: options.enforceConstraints ?? defaultEnforceConstraints,\n btreeOrder: options.btreeOrder ?? defaultBtreeOrder,\n outbox: undefined,\n };\n};\n"],"mappings":";;;AA0BA,MAAM,eAAe,EACnB,2BAAW,IAAI,MAAM,EACtB;AAED,MAAM,oBAAoB;AAC1B,MAAM,4BAA4B;AAClC,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;AAEzB,MAAM,iBAAiB,UAAkB;CACvC,IAAI,QAAQ;AACZ,cAAa;;AAGf,MAAM,YAAY,SAAyB;CACzC,IAAI,OAAO;AACX,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAQ,KAAK,WAAW,EAAE;AAC1B,SAAO,KAAK,KAAK,MAAM,SAAS;;AAElC,QAAO,SAAS;;AAGlB,MAAM,sBAAsB,SAAiB;CAC3C,IAAI,QAAQ,SAAS,KAAK;AAC1B,cAAa;AACX,WAAS;AACT,UAAS,QAAQ,mBAAoB;EACrC,IAAI,IAAI,KAAK,KAAK,QAAS,UAAU,IAAK,IAAI,MAAM;AACpD,MAAK,IAAI,KAAK,KAAK,IAAK,MAAM,GAAI,KAAK,EAAE,GAAI;AAC7C,WAAS,IAAK,MAAM,QAAS,KAAK;;;AAItC,MAAM,2BAA2B,SAAiC;CAChE,MAAM,SAAS,mBAAmB,KAAK;AAEvC,QAAO,KAAK;EAAE;EAAQ,SADN,cAAc,KAAK,MAAM,QAAQ,GAAG,gBAAgB,CAAC;EACtC,CAAC;;AAGlC,MAAM,kCAAkD;CACtD,IAAI,UAAU;AACd,cAAa;AACX,aAAW;AACX,SAAO;;;AAIX,MAAa,iCACX,UAAkC,EAAE,KACD;CACnC,MAAM,SAAS,QAAQ,UAAU,UAAU;CAC3C,MAAM,8BAA8B,QAAQ,wBAAwB;AAEpE,QAAO;EACL,OAAO,QAAQ,SAAS;EACxB,aAAa,QAAQ,eAAe,wBAAwB,OAAO;EACnE;EACA,qBAAqB,QAAQ,uBAAuB,2BAA2B;EAC/E;EACA,oBAAoB,QAAQ,sBAAsB;EAClD,YAAY,QAAQ,cAAc;EAClC,QAAQ;EACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"reference-resolution.js","names":["resolved: Record<string, unknown>"],"sources":["../../../src/adapters/in-memory/reference-resolution.ts"],"sourcesContent":["import type { AnyTable } from \"../../schema/create\";\nimport { ReferenceSubquery } from \"../../query/value-encoding\";\nimport type { InMemoryNamespaceStore, InMemoryTableStore } from \"./store\";\nimport type { NamingResolver } from \"../../naming/sql-naming\";\n\nconst getTableStore = (\n namespaceStore: InMemoryNamespaceStore,\n table: AnyTable,\n resolver?: NamingResolver,\n): InMemoryTableStore => {\n const tableName = resolver ? resolver.getTableName(table.name) : table.name;\n const store = namespaceStore.tables.get(tableName);\n if (!store) {\n throw new Error(`Missing in-memory table store for \"${tableName}\".`);\n }\n return store;\n};\n\nconst resolveExternalIdToInternalId = (\n tableStore: InMemoryTableStore,\n table: AnyTable,\n externalId: string,\n resolver?: NamingResolver,\n): bigint | undefined => {\n const idColumnName = table.getIdColumn().name;\n const physicalIdColumnName = resolver\n ? resolver.getColumnName(table.name, idColumnName)\n : idColumnName;\n for (const [internalId, row] of tableStore.rows) {\n if (row[physicalIdColumnName] === externalId) {\n return internalId;\n }\n }\n return undefined;\n};\n\nexport const resolveReferenceSubquery = (\n namespaceStore: InMemoryNamespaceStore,\n reference: ReferenceSubquery,\n resolver?: NamingResolver,\n): bigint | null => {\n const tableStore = getTableStore(namespaceStore, reference.referencedTable, resolver);\n const resolved = resolveExternalIdToInternalId(\n tableStore,\n reference.referencedTable,\n reference.externalIdValue,\n resolver,\n );\n return resolved ?? null;\n};\n\nexport const resolveReferenceSubqueries = (\n namespaceStore: InMemoryNamespaceStore,\n values: Record<string, unknown>,\n resolver?: NamingResolver,\n): Record<string, unknown> => {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(values)) {\n resolved[key] =\n value instanceof ReferenceSubquery\n ? resolveReferenceSubquery(namespaceStore, value, resolver)\n : value;\n }\n\n return resolved;\n};\n"],"mappings":";;;AAKA,MAAM,iBACJ,gBACA,OACA,aACuB;CACvB,MAAM,YAAY,WAAW,SAAS,aAAa,MAAM,KAAK,GAAG,MAAM;CACvE,MAAM,QAAQ,eAAe,OAAO,IAAI,UAAU;AAClD,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,sCAAsC,UAAU,IAAI;AAEtE,QAAO;;AAGT,MAAM,iCACJ,YACA,OACA,YACA,aACuB;CACvB,MAAM,eAAe,MAAM,aAAa,CAAC;CACzC,MAAM,uBAAuB,WACzB,SAAS,cAAc,MAAM,MAAM,aAAa,GAChD;AACJ,MAAK,MAAM,CAAC,YAAY,QAAQ,WAAW,KACzC,KAAI,IAAI,0BAA0B,WAChC,QAAO;;AAMb,MAAa,4BACX,gBACA,WACA,aACkB;AAQlB,QANiB,8BADE,cAAc,gBAAgB,UAAU,iBAAiB,SAAS,EAGnF,UAAU,iBACV,UAAU,iBACV,SACD,IACkB;;AAGrB,MAAa,8BACX,gBACA,QACA,aAC4B;CAC5B,MAAMA,WAAoC,EAAE;AAE5C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,CAC/C,UAAS,OACP,iBAAiB,oBACb,yBAAyB,gBAAgB,OAAO,SAAS,GACzD;AAGR,QAAO"}
1
+ {"version":3,"file":"reference-resolution.js","names":["resolved: Record<string, unknown>"],"sources":["../../../src/adapters/in-memory/reference-resolution.ts"],"sourcesContent":["import type { NamingResolver } from \"../../naming/sql-naming\";\nimport { ReferenceSubquery } from \"../../query/value-encoding\";\nimport type { AnyTable } from \"../../schema/create\";\nimport type { InMemoryNamespaceStore, InMemoryTableStore } from \"./store\";\n\nconst getTableStore = (\n namespaceStore: InMemoryNamespaceStore,\n table: AnyTable,\n resolver?: NamingResolver,\n): InMemoryTableStore => {\n const tableName = resolver ? resolver.getTableName(table.name) : table.name;\n const store = namespaceStore.tables.get(tableName);\n if (!store) {\n throw new Error(`Missing in-memory table store for \"${tableName}\".`);\n }\n return store;\n};\n\nconst resolveExternalIdToInternalId = (\n tableStore: InMemoryTableStore,\n table: AnyTable,\n externalId: string,\n resolver?: NamingResolver,\n): bigint | undefined => {\n const idColumnName = table.getIdColumn().name;\n const physicalIdColumnName = resolver\n ? resolver.getColumnName(table.name, idColumnName)\n : idColumnName;\n for (const [internalId, row] of tableStore.rows) {\n if (row[physicalIdColumnName] === externalId) {\n return internalId;\n }\n }\n return undefined;\n};\n\nexport const resolveReferenceSubquery = (\n namespaceStore: InMemoryNamespaceStore,\n reference: ReferenceSubquery,\n resolver?: NamingResolver,\n): bigint | null => {\n const tableStore = getTableStore(namespaceStore, reference.referencedTable, resolver);\n const resolved = resolveExternalIdToInternalId(\n tableStore,\n reference.referencedTable,\n reference.externalIdValue,\n resolver,\n );\n return resolved ?? null;\n};\n\nexport const resolveReferenceSubqueries = (\n namespaceStore: InMemoryNamespaceStore,\n values: Record<string, unknown>,\n resolver?: NamingResolver,\n): Record<string, unknown> => {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(values)) {\n resolved[key] =\n value instanceof ReferenceSubquery\n ? resolveReferenceSubquery(namespaceStore, value, resolver)\n : value;\n }\n\n return resolved;\n};\n"],"mappings":";;;AAKA,MAAM,iBACJ,gBACA,OACA,aACuB;CACvB,MAAM,YAAY,WAAW,SAAS,aAAa,MAAM,KAAK,GAAG,MAAM;CACvE,MAAM,QAAQ,eAAe,OAAO,IAAI,UAAU;AAClD,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,sCAAsC,UAAU,IAAI;AAEtE,QAAO;;AAGT,MAAM,iCACJ,YACA,OACA,YACA,aACuB;CACvB,MAAM,eAAe,MAAM,aAAa,CAAC;CACzC,MAAM,uBAAuB,WACzB,SAAS,cAAc,MAAM,MAAM,aAAa,GAChD;AACJ,MAAK,MAAM,CAAC,YAAY,QAAQ,WAAW,KACzC,KAAI,IAAI,0BAA0B,WAChC,QAAO;;AAMb,MAAa,4BACX,gBACA,WACA,aACkB;AAQlB,QANiB,8BADE,cAAc,gBAAgB,UAAU,iBAAiB,SAAS,EAGnF,UAAU,iBACV,UAAU,iBACV,SACD,IACkB;;AAGrB,MAAa,8BACX,gBACA,QACA,aAC4B;CAC5B,MAAMA,WAAoC,EAAE;AAE5C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,CAC/C,UAAS,OACP,iBAAiB,oBACb,yBAAyB,gBAAgB,OAAO,SAAS,GACzD;AAGR,QAAO"}
@@ -1,5 +1,5 @@
1
- import { createSQLSerializer } from "../../query/serialize/create-sql-serializer.js";
2
1
  import { SQLocalDriverConfig } from "../generic-sql/driver-config.js";
2
+ import { createSQLSerializer } from "../../query/serialize/create-sql-serializer.js";
3
3
  import { SortedArrayIndex } from "./sorted-array-index.js";
4
4
  import { compareNormalizedValues } from "./value-comparison.js";
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","names":["primaryDefinition: InMemoryIndexDefinition"],"sources":["../../../src/adapters/in-memory/store.ts"],"sourcesContent":["import type { AnyColumn, AnySchema, AnyTable } from \"../../schema/create\";\nimport { SortedArrayIndex } from \"./sorted-array-index\";\nimport { SQLocalDriverConfig } from \"../generic-sql/driver-config\";\nimport { createSQLSerializer } from \"../../query/serialize/create-sql-serializer\";\nimport { compareNormalizedValues } from \"./value-comparison\";\nimport type { NamingResolver } from \"../../naming/sql-naming\";\n\nexport type InMemoryRow = Record<string, unknown>;\n\nexport type InMemoryIndexDefinition = {\n name: string;\n columnNames: string[];\n unique: boolean;\n};\n\nexport type InMemoryIndexStore = {\n definition: InMemoryIndexDefinition;\n index: SortedArrayIndex<bigint>;\n};\n\nexport type InMemoryTableStore = {\n rows: Map<bigint, InMemoryRow>;\n nextInternalId: bigint;\n indexes: Map<string, InMemoryIndexStore>;\n};\n\nexport type InMemoryNamespaceStore = {\n tables: Map<string, InMemoryTableStore>;\n};\n\nexport type InMemoryStore = {\n namespaces: Map<string, InMemoryNamespaceStore>;\n};\n\nconst sqliteSerializer = createSQLSerializer(new SQLocalDriverConfig());\n\nexport const normalizeIndexValue = (value: unknown, column: AnyColumn): unknown => {\n if (value === undefined) {\n return undefined;\n }\n return sqliteSerializer.serialize(value, column);\n};\n\nexport const buildIndexKey = (\n table: AnyTable,\n index: InMemoryIndexDefinition,\n row: InMemoryRow,\n resolver?: NamingResolver,\n): readonly unknown[] => {\n const columnMap = resolver ? resolver.getColumnNameMap(table) : undefined;\n return index.columnNames.map((columnName) => {\n const logicalName = columnMap?.[columnName] ?? columnName;\n const column = table.columns[logicalName];\n if (!column) {\n throw new Error(\n `Column \"${columnName}\" not found in table \"${table.name}\" for index \"${index.name}\".`,\n );\n }\n return normalizeIndexValue(row[columnName], column);\n });\n};\n\nconst createTableIndexes = (\n table: AnyTable,\n resolver?: NamingResolver,\n): Map<string, InMemoryIndexStore> => {\n const indexes = new Map<string, InMemoryIndexStore>();\n const primaryIndex = table.indexes[\"_primary\"];\n const primaryColumnNames = primaryIndex\n ? primaryIndex.columnNames.map((columnName) =>\n resolver ? resolver.getColumnName(table.name, columnName) : columnName,\n )\n : [\n resolver\n ? resolver.getColumnName(table.name, table.getIdColumn().name)\n : table.getIdColumn().name,\n ];\n const primaryDefinition: InMemoryIndexDefinition = {\n name: \"_primary\",\n columnNames: primaryColumnNames,\n unique: primaryIndex?.unique ?? true,\n };\n indexes.set(\"_primary\", {\n definition: primaryDefinition,\n index: new SortedArrayIndex(compareNormalizedValues, { unique: primaryDefinition.unique }),\n });\n\n for (const [name, index] of Object.entries(table.indexes)) {\n if (name === \"_primary\") {\n continue;\n }\n indexes.set(name, {\n definition: {\n name,\n columnNames: index.columnNames.map((columnName) =>\n resolver ? resolver.getColumnName(table.name, columnName) : columnName,\n ),\n unique: index.unique,\n },\n index: new SortedArrayIndex(compareNormalizedValues, { unique: index.unique }),\n });\n }\n\n return indexes;\n};\n\nconst createTableStore = (table: AnyTable, resolver?: NamingResolver): InMemoryTableStore => ({\n rows: new Map(),\n nextInternalId: 1n,\n indexes: createTableIndexes(table, resolver),\n});\n\nexport const createNamespaceStore = (\n schema: AnySchema,\n resolver?: NamingResolver,\n): InMemoryNamespaceStore => {\n const tables = new Map<string, InMemoryTableStore>();\n for (const tableName of Object.keys(schema.tables)) {\n const table = schema.tables[tableName];\n const storeKey = resolver ? resolver.getTableName(table.name) : table.name;\n tables.set(storeKey, createTableStore(table, resolver));\n }\n\n return { tables };\n};\n\nexport const createInMemoryStore = (): InMemoryStore => ({\n namespaces: new Map(),\n});\n\nexport const ensureNamespaceStore = (\n store: InMemoryStore,\n namespace: string,\n schema: AnySchema,\n resolver?: NamingResolver,\n): InMemoryNamespaceStore => {\n const existing = store.namespaces.get(namespace);\n if (existing) {\n return existing;\n }\n\n const created = createNamespaceStore(schema, resolver);\n store.namespaces.set(namespace, created);\n return created;\n};\n"],"mappings":";;;;;;AAkCA,MAAM,mBAAmB,oBAAoB,IAAI,qBAAqB,CAAC;AAEvE,MAAa,uBAAuB,OAAgB,WAA+B;AACjF,KAAI,UAAU,OACZ;AAEF,QAAO,iBAAiB,UAAU,OAAO,OAAO;;AAGlD,MAAa,iBACX,OACA,OACA,KACA,aACuB;CACvB,MAAM,YAAY,WAAW,SAAS,iBAAiB,MAAM,GAAG;AAChE,QAAO,MAAM,YAAY,KAAK,eAAe;EAC3C,MAAM,cAAc,YAAY,eAAe;EAC/C,MAAM,SAAS,MAAM,QAAQ;AAC7B,MAAI,CAAC,OACH,OAAM,IAAI,MACR,WAAW,WAAW,wBAAwB,MAAM,KAAK,eAAe,MAAM,KAAK,IACpF;AAEH,SAAO,oBAAoB,IAAI,aAAa,OAAO;GACnD;;AAGJ,MAAM,sBACJ,OACA,aACoC;CACpC,MAAM,0BAAU,IAAI,KAAiC;CACrD,MAAM,eAAe,MAAM,QAAQ;CAUnC,MAAMA,oBAA6C;EACjD,MAAM;EACN,aAXyB,eACvB,aAAa,YAAY,KAAK,eAC5B,WAAW,SAAS,cAAc,MAAM,MAAM,WAAW,GAAG,WAC7D,GACD,CACE,WACI,SAAS,cAAc,MAAM,MAAM,MAAM,aAAa,CAAC,KAAK,GAC5D,MAAM,aAAa,CAAC,KACzB;EAIH,QAAQ,cAAc,UAAU;EACjC;AACD,SAAQ,IAAI,YAAY;EACtB,YAAY;EACZ,OAAO,IAAI,iBAAiB,yBAAyB,EAAE,QAAQ,kBAAkB,QAAQ,CAAC;EAC3F,CAAC;AAEF,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,QAAQ,EAAE;AACzD,MAAI,SAAS,WACX;AAEF,UAAQ,IAAI,MAAM;GAChB,YAAY;IACV;IACA,aAAa,MAAM,YAAY,KAAK,eAClC,WAAW,SAAS,cAAc,MAAM,MAAM,WAAW,GAAG,WAC7D;IACD,QAAQ,MAAM;IACf;GACD,OAAO,IAAI,iBAAiB,yBAAyB,EAAE,QAAQ,MAAM,QAAQ,CAAC;GAC/E,CAAC;;AAGJ,QAAO;;AAGT,MAAM,oBAAoB,OAAiB,cAAmD;CAC5F,sBAAM,IAAI,KAAK;CACf,gBAAgB;CAChB,SAAS,mBAAmB,OAAO,SAAS;CAC7C;AAED,MAAa,wBACX,QACA,aAC2B;CAC3B,MAAM,yBAAS,IAAI,KAAiC;AACpD,MAAK,MAAM,aAAa,OAAO,KAAK,OAAO,OAAO,EAAE;EAClD,MAAM,QAAQ,OAAO,OAAO;EAC5B,MAAM,WAAW,WAAW,SAAS,aAAa,MAAM,KAAK,GAAG,MAAM;AACtE,SAAO,IAAI,UAAU,iBAAiB,OAAO,SAAS,CAAC;;AAGzD,QAAO,EAAE,QAAQ;;AAGnB,MAAa,6BAA4C,EACvD,4BAAY,IAAI,KAAK,EACtB;AAED,MAAa,wBACX,OACA,WACA,QACA,aAC2B;CAC3B,MAAM,WAAW,MAAM,WAAW,IAAI,UAAU;AAChD,KAAI,SACF,QAAO;CAGT,MAAM,UAAU,qBAAqB,QAAQ,SAAS;AACtD,OAAM,WAAW,IAAI,WAAW,QAAQ;AACxC,QAAO"}
1
+ {"version":3,"file":"store.js","names":["primaryDefinition: InMemoryIndexDefinition"],"sources":["../../../src/adapters/in-memory/store.ts"],"sourcesContent":["import type { NamingResolver } from \"../../naming/sql-naming\";\nimport { createSQLSerializer } from \"../../query/serialize/create-sql-serializer\";\nimport type { AnyColumn, AnySchema, AnyTable } from \"../../schema/create\";\nimport { SQLocalDriverConfig } from \"../generic-sql/driver-config\";\nimport { SortedArrayIndex } from \"./sorted-array-index\";\nimport { compareNormalizedValues } from \"./value-comparison\";\n\nexport type InMemoryRow = Record<string, unknown>;\n\nexport type InMemoryIndexDefinition = {\n name: string;\n columnNames: string[];\n unique: boolean;\n};\n\nexport type InMemoryIndexStore = {\n definition: InMemoryIndexDefinition;\n index: SortedArrayIndex<bigint>;\n};\n\nexport type InMemoryTableStore = {\n rows: Map<bigint, InMemoryRow>;\n nextInternalId: bigint;\n indexes: Map<string, InMemoryIndexStore>;\n};\n\nexport type InMemoryNamespaceStore = {\n tables: Map<string, InMemoryTableStore>;\n};\n\nexport type InMemoryStore = {\n namespaces: Map<string, InMemoryNamespaceStore>;\n};\n\nconst sqliteSerializer = createSQLSerializer(new SQLocalDriverConfig());\n\nexport const normalizeIndexValue = (value: unknown, column: AnyColumn): unknown => {\n if (value === undefined) {\n return undefined;\n }\n return sqliteSerializer.serialize(value, column);\n};\n\nexport const buildIndexKey = (\n table: AnyTable,\n index: InMemoryIndexDefinition,\n row: InMemoryRow,\n resolver?: NamingResolver,\n): readonly unknown[] => {\n const columnMap = resolver ? resolver.getColumnNameMap(table) : undefined;\n return index.columnNames.map((columnName) => {\n const logicalName = columnMap?.[columnName] ?? columnName;\n const column = table.columns[logicalName];\n if (!column) {\n throw new Error(\n `Column \"${columnName}\" not found in table \"${table.name}\" for index \"${index.name}\".`,\n );\n }\n return normalizeIndexValue(row[columnName], column);\n });\n};\n\nconst createTableIndexes = (\n table: AnyTable,\n resolver?: NamingResolver,\n): Map<string, InMemoryIndexStore> => {\n const indexes = new Map<string, InMemoryIndexStore>();\n const primaryIndex = table.indexes[\"_primary\"];\n const primaryColumnNames = primaryIndex\n ? primaryIndex.columnNames.map((columnName) =>\n resolver ? resolver.getColumnName(table.name, columnName) : columnName,\n )\n : [\n resolver\n ? resolver.getColumnName(table.name, table.getIdColumn().name)\n : table.getIdColumn().name,\n ];\n const primaryDefinition: InMemoryIndexDefinition = {\n name: \"_primary\",\n columnNames: primaryColumnNames,\n unique: primaryIndex?.unique ?? true,\n };\n indexes.set(\"_primary\", {\n definition: primaryDefinition,\n index: new SortedArrayIndex(compareNormalizedValues, { unique: primaryDefinition.unique }),\n });\n\n for (const [name, index] of Object.entries(table.indexes)) {\n if (name === \"_primary\") {\n continue;\n }\n indexes.set(name, {\n definition: {\n name,\n columnNames: index.columnNames.map((columnName) =>\n resolver ? resolver.getColumnName(table.name, columnName) : columnName,\n ),\n unique: index.unique,\n },\n index: new SortedArrayIndex(compareNormalizedValues, { unique: index.unique }),\n });\n }\n\n return indexes;\n};\n\nconst createTableStore = (table: AnyTable, resolver?: NamingResolver): InMemoryTableStore => ({\n rows: new Map(),\n nextInternalId: 1n,\n indexes: createTableIndexes(table, resolver),\n});\n\nexport const createNamespaceStore = (\n schema: AnySchema,\n resolver?: NamingResolver,\n): InMemoryNamespaceStore => {\n const tables = new Map<string, InMemoryTableStore>();\n for (const tableName of Object.keys(schema.tables)) {\n const table = schema.tables[tableName];\n const storeKey = resolver ? resolver.getTableName(table.name) : table.name;\n tables.set(storeKey, createTableStore(table, resolver));\n }\n\n return { tables };\n};\n\nexport const createInMemoryStore = (): InMemoryStore => ({\n namespaces: new Map(),\n});\n\nexport const ensureNamespaceStore = (\n store: InMemoryStore,\n namespace: string,\n schema: AnySchema,\n resolver?: NamingResolver,\n): InMemoryNamespaceStore => {\n const existing = store.namespaces.get(namespace);\n if (existing) {\n return existing;\n }\n\n const created = createNamespaceStore(schema, resolver);\n store.namespaces.set(namespace, created);\n return created;\n};\n"],"mappings":";;;;;;AAkCA,MAAM,mBAAmB,oBAAoB,IAAI,qBAAqB,CAAC;AAEvE,MAAa,uBAAuB,OAAgB,WAA+B;AACjF,KAAI,UAAU,OACZ;AAEF,QAAO,iBAAiB,UAAU,OAAO,OAAO;;AAGlD,MAAa,iBACX,OACA,OACA,KACA,aACuB;CACvB,MAAM,YAAY,WAAW,SAAS,iBAAiB,MAAM,GAAG;AAChE,QAAO,MAAM,YAAY,KAAK,eAAe;EAC3C,MAAM,cAAc,YAAY,eAAe;EAC/C,MAAM,SAAS,MAAM,QAAQ;AAC7B,MAAI,CAAC,OACH,OAAM,IAAI,MACR,WAAW,WAAW,wBAAwB,MAAM,KAAK,eAAe,MAAM,KAAK,IACpF;AAEH,SAAO,oBAAoB,IAAI,aAAa,OAAO;GACnD;;AAGJ,MAAM,sBACJ,OACA,aACoC;CACpC,MAAM,0BAAU,IAAI,KAAiC;CACrD,MAAM,eAAe,MAAM,QAAQ;CAUnC,MAAMA,oBAA6C;EACjD,MAAM;EACN,aAXyB,eACvB,aAAa,YAAY,KAAK,eAC5B,WAAW,SAAS,cAAc,MAAM,MAAM,WAAW,GAAG,WAC7D,GACD,CACE,WACI,SAAS,cAAc,MAAM,MAAM,MAAM,aAAa,CAAC,KAAK,GAC5D,MAAM,aAAa,CAAC,KACzB;EAIH,QAAQ,cAAc,UAAU;EACjC;AACD,SAAQ,IAAI,YAAY;EACtB,YAAY;EACZ,OAAO,IAAI,iBAAiB,yBAAyB,EAAE,QAAQ,kBAAkB,QAAQ,CAAC;EAC3F,CAAC;AAEF,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,QAAQ,EAAE;AACzD,MAAI,SAAS,WACX;AAEF,UAAQ,IAAI,MAAM;GAChB,YAAY;IACV;IACA,aAAa,MAAM,YAAY,KAAK,eAClC,WAAW,SAAS,cAAc,MAAM,MAAM,WAAW,GAAG,WAC7D;IACD,QAAQ,MAAM;IACf;GACD,OAAO,IAAI,iBAAiB,yBAAyB,EAAE,QAAQ,MAAM,QAAQ,CAAC;GAC/E,CAAC;;AAGJ,QAAO;;AAGT,MAAM,oBAAoB,OAAiB,cAAmD;CAC5F,sBAAM,IAAI,KAAK;CACf,gBAAgB;CAChB,SAAS,mBAAmB,OAAO,SAAS;CAC7C;AAED,MAAa,wBACX,QACA,aAC2B;CAC3B,MAAM,yBAAS,IAAI,KAAiC;AACpD,MAAK,MAAM,aAAa,OAAO,KAAK,OAAO,OAAO,EAAE;EAClD,MAAM,QAAQ,OAAO,OAAO;EAC5B,MAAM,WAAW,WAAW,SAAS,aAAa,MAAM,KAAK,GAAG,MAAM;AACtE,SAAO,IAAI,UAAU,iBAAiB,OAAO,SAAS,CAAC;;AAGzD,QAAO,EAAE,QAAQ;;AAGnB,MAAa,6BAA4C,EACvD,4BAAY,IAAI,KAAK,EACtB;AAED,MAAa,wBACX,OACA,WACA,QACA,aAC2B;CAC3B,MAAM,WAAW,MAAM,WAAW,IAAI,UAAU;AAChD,KAAI,SACF,QAAO;CAGT,MAAM,UAAU,qBAAqB,QAAQ,SAAS;AACtD,OAAM,WAAW,IAAI,WAAW,QAAQ;AACxC,QAAO"}
@@ -1,3 +1,4 @@
1
+ import { dbInterval, dbNow } from "../../query/db-now.js";
1
2
  import { UnitOfWork } from "../../query/unit-of-work/unit-of-work.js";
2
3
 
3
4
  //#region src/adapters/shared/from-unit-of-work-compiler.ts
@@ -26,6 +27,12 @@ var UpdateManySpecialBuilder = class {
26
27
  this.#setValues = values;
27
28
  return this;
28
29
  }
30
+ now() {
31
+ return dbNow();
32
+ }
33
+ interval(input) {
34
+ return dbInterval(input);
35
+ }
29
36
  getConfig() {
30
37
  return {
31
38
  indexName: this.#indexName,
@@ -62,36 +69,47 @@ var UpdateManySpecialBuilder = class {
62
69
  */
63
70
  function fromUnitOfWorkCompiler(schema, factory) {
64
71
  const { compiler, executor, decoder, uowConfig, schemaNamespaceMap } = factory;
65
- function createUOW(opts) {
66
- const { onQuery,...restUowConfig } = opts.config ?? {};
67
- return new UnitOfWork(compiler, executor, decoder, opts.name, {
72
+ function normalizeUowConfig(config) {
73
+ if (!config) return;
74
+ const { onQuery,...restUowConfig } = config;
75
+ return {
68
76
  ...restUowConfig,
69
77
  onQuery: onQuery ? (query) => {
70
78
  onQuery(isCompiledMutation(query) ? query.query : query);
71
79
  } : void 0
72
- }, schemaNamespaceMap).forSchema(schema);
80
+ };
81
+ }
82
+ function createBaseUow(opts) {
83
+ return new UnitOfWork(compiler, executor, decoder, opts.name, normalizeUowConfig(opts.config), schemaNamespaceMap);
84
+ }
85
+ function createUOW(opts) {
86
+ return createBaseUow(opts).forSchema(schema);
87
+ }
88
+ async function find(tableName, builderFn) {
89
+ const uow = createUOW({ config: uowConfig });
90
+ if (builderFn) uow.find(tableName, builderFn);
91
+ else uow.find(tableName);
92
+ const [result] = await uow.executeRetrieve();
93
+ return result ?? [];
94
+ }
95
+ async function findWithCursor(tableName, builderFn) {
96
+ const [result] = await createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn).executeRetrieve();
97
+ return result;
98
+ }
99
+ async function findFirst(tableName, builderFn) {
100
+ const uow = createUOW({ config: uowConfig });
101
+ if (builderFn) uow.find(tableName, (b) => {
102
+ builderFn(b);
103
+ return b.pageSize(1);
104
+ });
105
+ else uow.find(tableName, (b) => b.whereIndex("primary").pageSize(1));
106
+ const [result] = await uow.executeRetrieve();
107
+ return result?.[0] ?? null;
73
108
  }
74
109
  return {
75
- async find(tableName, builderFn) {
76
- const uow = createUOW({ config: uowConfig });
77
- uow.find(tableName, builderFn);
78
- const [result] = await uow.executeRetrieve();
79
- return result ?? [];
80
- },
81
- async findWithCursor(tableName, builderFn) {
82
- const [result] = await createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn).executeRetrieve();
83
- return result;
84
- },
85
- async findFirst(tableName, builderFn) {
86
- const uow = createUOW({ config: uowConfig });
87
- if (builderFn) uow.find(tableName, (b) => {
88
- builderFn(b);
89
- return b.pageSize(1);
90
- });
91
- else uow.find(tableName, (b) => b.whereIndex("primary").pageSize(1));
92
- const [result] = await uow.executeRetrieve();
93
- return result?.[0] ?? null;
94
- },
110
+ find,
111
+ findWithCursor,
112
+ findFirst,
95
113
  async create(tableName, values) {
96
114
  const uow = createUOW({ config: uowConfig });
97
115
  uow.create(tableName, values);
@@ -163,6 +181,15 @@ function fromUnitOfWorkCompiler(schema, factory) {
163
181
  ...nestedUowConfig
164
182
  }
165
183
  });
184
+ },
185
+ createBaseUnitOfWork(name, nestedUowConfig) {
186
+ return createBaseUow({
187
+ name,
188
+ config: {
189
+ ...uowConfig,
190
+ ...nestedUowConfig
191
+ }
192
+ });
166
193
  }
167
194
  };
168
195
  }