@fragno-dev/db 0.2.2 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/.turbo/turbo-build.log +404 -175
  2. package/CHANGELOG.md +109 -0
  3. package/README.md +54 -9
  4. package/dist/adapters/adapters.d.ts +23 -21
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/generic-sql/driver-config.d.ts +16 -1
  8. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -1
  9. package/dist/adapters/generic-sql/driver-config.js +23 -1
  10. package/dist/adapters/generic-sql/driver-config.js.map +1 -1
  11. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +24 -9
  12. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
  13. package/dist/adapters/generic-sql/generic-sql-adapter.js +60 -22
  14. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
  15. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +169 -3
  16. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
  17. package/dist/adapters/generic-sql/migration/cold-kysely.js.map +1 -1
  18. package/dist/adapters/generic-sql/migration/dialect/mysql.js +25 -6
  19. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
  20. package/dist/adapters/generic-sql/migration/dialect/postgres.js +7 -6
  21. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
  22. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +193 -16
  23. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
  24. package/dist/adapters/generic-sql/migration/executor.d.ts.map +1 -1
  25. package/dist/adapters/generic-sql/migration/executor.js +30 -3
  26. package/dist/adapters/generic-sql/migration/executor.js.map +1 -1
  27. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
  28. package/dist/adapters/generic-sql/migration/prepared-migrations.js +9 -9
  29. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
  30. package/dist/adapters/generic-sql/migration/sql-generator.js +75 -52
  31. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
  32. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +7 -6
  33. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
  34. package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
  35. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
  36. package/dist/adapters/generic-sql/query/db-now-sql.js +27 -0
  37. package/dist/adapters/generic-sql/query/db-now-sql.js.map +1 -0
  38. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +32 -21
  39. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
  40. package/dist/adapters/generic-sql/query/select-builder.js +5 -3
  41. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
  42. package/dist/adapters/generic-sql/query/sql-query-compiler.js +49 -18
  43. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
  44. package/dist/adapters/generic-sql/query/where-builder.js +43 -29
  45. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
  46. package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
  47. package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  48. package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
  49. package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
  50. package/dist/adapters/generic-sql/uow-decoder.js +6 -2
  51. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
  52. package/dist/adapters/generic-sql/uow-encoder.js +27 -8
  53. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
  54. package/dist/adapters/in-memory/condition-evaluator.js +135 -0
  55. package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
  56. package/dist/adapters/in-memory/errors.d.ts +13 -0
  57. package/dist/adapters/in-memory/errors.d.ts.map +1 -0
  58. package/dist/adapters/in-memory/errors.js +23 -0
  59. package/dist/adapters/in-memory/errors.js.map +1 -0
  60. package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
  61. package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
  62. package/dist/adapters/in-memory/in-memory-adapter.js +196 -0
  63. package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
  64. package/dist/adapters/in-memory/in-memory-uow.js +871 -0
  65. package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
  66. package/dist/adapters/in-memory/index.d.ts +4 -0
  67. package/dist/adapters/in-memory/index.js +4 -0
  68. package/dist/adapters/in-memory/options.d.ts +30 -0
  69. package/dist/adapters/in-memory/options.d.ts.map +1 -0
  70. package/dist/adapters/in-memory/options.js +62 -0
  71. package/dist/adapters/in-memory/options.js.map +1 -0
  72. package/dist/adapters/in-memory/reference-resolution.js +26 -0
  73. package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
  74. package/dist/adapters/in-memory/sorted-array-index.js +129 -0
  75. package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
  76. package/dist/adapters/in-memory/store.js +71 -0
  77. package/dist/adapters/in-memory/store.js.map +1 -0
  78. package/dist/adapters/in-memory/value-comparison.js +28 -0
  79. package/dist/adapters/in-memory/value-comparison.js.map +1 -0
  80. package/dist/adapters/shared/from-unit-of-work-compiler.js +51 -24
  81. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
  82. package/dist/adapters/shared/uow-operation-compiler.js +11 -11
  83. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
  84. package/dist/adapters/sql/index.d.ts +5 -0
  85. package/dist/adapters/sql/index.js +4 -0
  86. package/dist/browser/adapters/adapters.d.ts +61 -0
  87. package/dist/browser/adapters/adapters.d.ts.map +1 -0
  88. package/dist/browser/adapters/generic-sql/migration/executor.d.ts +15 -0
  89. package/dist/browser/adapters/generic-sql/migration/executor.d.ts.map +1 -0
  90. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts +66 -0
  91. package/dist/browser/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -0
  92. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts +11 -0
  93. package/dist/browser/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  94. package/dist/browser/adapters/in-memory/in-memory-adapter.d.ts +5 -0
  95. package/dist/browser/adapters/in-memory/index.d.ts +2 -0
  96. package/dist/browser/adapters/in-memory/options.d.ts +1 -0
  97. package/dist/browser/db-fragment-definition-builder.d.ts +237 -0
  98. package/dist/browser/db-fragment-definition-builder.d.ts.map +1 -0
  99. package/dist/browser/durable-hooks.d.ts +3 -0
  100. package/dist/browser/fragments/internal-fragment.d.ts +317 -0
  101. package/dist/browser/fragments/internal-fragment.d.ts.map +1 -0
  102. package/dist/browser/fragments/internal-fragment.schema.d.ts +1 -0
  103. package/dist/browser/hooks/durable-hooks-logger.d.ts +10 -0
  104. package/dist/browser/hooks/durable-hooks-logger.d.ts.map +1 -0
  105. package/dist/browser/hooks/hooks.d.ts +146 -0
  106. package/dist/browser/hooks/hooks.d.ts.map +1 -0
  107. package/dist/browser/id.js +1 -0
  108. package/dist/browser/internal/adapter-registry.d.ts +4 -0
  109. package/dist/browser/internal/outbox-state.d.ts +2 -0
  110. package/dist/browser/mod.d.ts +15 -0
  111. package/dist/browser/mod.d.ts.map +1 -0
  112. package/dist/browser/mod.js +17 -0
  113. package/dist/browser/mod.js.map +1 -0
  114. package/dist/browser/mod2.d.ts +48 -0
  115. package/dist/browser/mod2.d.ts.map +1 -0
  116. package/dist/browser/naming/sql-naming.d.ts +19 -0
  117. package/dist/browser/naming/sql-naming.d.ts.map +1 -0
  118. package/dist/browser/outbox/outbox.d.ts +21 -0
  119. package/dist/browser/outbox/outbox.d.ts.map +1 -0
  120. package/dist/browser/query/column-defaults.js +1 -0
  121. package/dist/browser/query/condition-builder.d.ts +44 -0
  122. package/dist/browser/query/condition-builder.d.ts.map +1 -0
  123. package/dist/browser/query/condition-builder.js +97 -0
  124. package/dist/browser/query/condition-builder.js.map +1 -0
  125. package/dist/browser/query/cursor.d.ts +105 -0
  126. package/dist/browser/query/cursor.d.ts.map +1 -0
  127. package/dist/browser/query/cursor.js +150 -0
  128. package/dist/browser/query/cursor.js.map +1 -0
  129. package/dist/browser/query/db-now.d.ts +22 -0
  130. package/dist/browser/query/db-now.d.ts.map +1 -0
  131. package/dist/browser/query/db-now.js +33 -0
  132. package/dist/browser/query/db-now.js.map +1 -0
  133. package/dist/browser/query/orm/orm.d.ts +18 -0
  134. package/dist/browser/query/orm/orm.d.ts.map +1 -0
  135. package/dist/browser/query/simple-query-interface.d.ts +108 -0
  136. package/dist/browser/query/simple-query-interface.d.ts.map +1 -0
  137. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts +423 -0
  138. package/dist/browser/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -0
  139. package/dist/browser/query/unit-of-work/execute-unit-of-work.js +507 -0
  140. package/dist/browser/query/unit-of-work/execute-unit-of-work.js.map +1 -0
  141. package/dist/browser/query/unit-of-work/retry-policy.d.ts +23 -0
  142. package/dist/browser/query/unit-of-work/retry-policy.d.ts.map +1 -0
  143. package/dist/browser/query/unit-of-work/retry-policy.js +40 -0
  144. package/dist/browser/query/unit-of-work/retry-policy.js.map +1 -0
  145. package/dist/browser/query/unit-of-work/unit-of-work.d.ts +703 -0
  146. package/dist/browser/query/unit-of-work/unit-of-work.d.ts.map +1 -0
  147. package/dist/browser/query/unit-of-work/unit-of-work.js +1206 -0
  148. package/dist/browser/query/unit-of-work/unit-of-work.js.map +1 -0
  149. package/dist/browser/query/value-encoding.js +38 -0
  150. package/dist/browser/query/value-encoding.js.map +1 -0
  151. package/dist/browser/schema/create.d.ts +326 -0
  152. package/dist/browser/schema/create.d.ts.map +1 -0
  153. package/dist/browser/schema/create.js +89 -0
  154. package/dist/browser/schema/create.js.map +1 -0
  155. package/dist/browser/schema/generate-id.js +28 -0
  156. package/dist/browser/schema/generate-id.js.map +1 -0
  157. package/dist/browser/shared/providers.d.ts +6 -0
  158. package/dist/browser/shared/providers.d.ts.map +1 -0
  159. package/dist/browser/sql-driver/connection/connection-provider.d.ts +13 -0
  160. package/dist/browser/sql-driver/connection/connection-provider.d.ts.map +1 -0
  161. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts +7 -0
  162. package/dist/browser/sql-driver/dialect-adapter/dialect-adapter.d.ts.map +1 -0
  163. package/dist/browser/sql-driver/driver/runtime-driver.d.ts +23 -0
  164. package/dist/browser/sql-driver/driver/runtime-driver.d.ts.map +1 -0
  165. package/dist/browser/sql-driver/query-executor/plugin.d.ts +17 -0
  166. package/dist/browser/sql-driver/query-executor/plugin.d.ts.map +1 -0
  167. package/dist/browser/sql-driver/query-executor/query-executor.d.ts +36 -0
  168. package/dist/browser/sql-driver/query-executor/query-executor.d.ts.map +1 -0
  169. package/dist/browser/sql-driver/sql-driver-adapter.d.ts +29 -0
  170. package/dist/browser/sql-driver/sql-driver-adapter.d.ts.map +1 -0
  171. package/dist/browser/sql-driver/sql-driver.d.ts +38 -0
  172. package/dist/browser/sql-driver/sql-driver.d.ts.map +1 -0
  173. package/dist/browser/sync/commands.d.ts +15 -0
  174. package/dist/browser/sync/commands.d.ts.map +1 -0
  175. package/dist/browser/sync/commands.js +27 -0
  176. package/dist/browser/sync/commands.js.map +1 -0
  177. package/dist/browser/sync/types.d.ts +63 -0
  178. package/dist/browser/sync/types.d.ts.map +1 -0
  179. package/dist/browser/util/types.d.ts +8 -0
  180. package/dist/browser/util/types.d.ts.map +1 -0
  181. package/dist/browser/with-database.d.ts +29 -0
  182. package/dist/browser/with-database.d.ts.map +1 -0
  183. package/dist/client.d.ts +4 -0
  184. package/dist/client.js +5 -0
  185. package/dist/db-fragment-definition-builder.d.ts +101 -33
  186. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  187. package/dist/db-fragment-definition-builder.js +450 -60
  188. package/dist/db-fragment-definition-builder.js.map +1 -1
  189. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts +20 -0
  190. package/dist/dispatchers/cloudflare-do/dispatcher.d.ts.map +1 -0
  191. package/dist/dispatchers/cloudflare-do/dispatcher.js +147 -0
  192. package/dist/dispatchers/cloudflare-do/dispatcher.js.map +1 -0
  193. package/dist/dispatchers/cloudflare-do/index.d.ts +11 -0
  194. package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
  195. package/dist/dispatchers/cloudflare-do/index.js +31 -0
  196. package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
  197. package/dist/dispatchers/node/dispatcher.d.ts +14 -0
  198. package/dist/dispatchers/node/dispatcher.d.ts.map +1 -0
  199. package/dist/dispatchers/node/dispatcher.js +80 -0
  200. package/dist/dispatchers/node/dispatcher.js.map +1 -0
  201. package/dist/dispatchers/node/index.d.ts +12 -0
  202. package/dist/dispatchers/node/index.d.ts.map +1 -0
  203. package/dist/dispatchers/node/index.js +27 -0
  204. package/dist/dispatchers/node/index.js.map +1 -0
  205. package/dist/durable-hooks.d.ts +31 -0
  206. package/dist/durable-hooks.d.ts.map +1 -0
  207. package/dist/durable-hooks.js +23 -0
  208. package/dist/durable-hooks.js.map +1 -0
  209. package/dist/fragments/internal-fragment.d.ts +186 -8
  210. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  211. package/dist/fragments/internal-fragment.js +203 -38
  212. package/dist/fragments/internal-fragment.js.map +1 -1
  213. package/dist/fragments/internal-fragment.routes.js +164 -0
  214. package/dist/fragments/internal-fragment.routes.js.map +1 -0
  215. package/dist/fragments/internal-fragment.schema.d.ts +15 -0
  216. package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
  217. package/dist/fragments/internal-fragment.schema.js +39 -0
  218. package/dist/fragments/internal-fragment.schema.js.map +1 -0
  219. package/dist/hooks/durable-hooks-logger.d.ts +10 -0
  220. package/dist/hooks/durable-hooks-logger.d.ts.map +1 -0
  221. package/dist/hooks/durable-hooks-logger.js +75 -0
  222. package/dist/hooks/durable-hooks-logger.js.map +1 -0
  223. package/dist/hooks/durable-hooks-processor.d.ts +1 -0
  224. package/dist/hooks/durable-hooks-processor.js +80 -0
  225. package/dist/hooks/durable-hooks-processor.js.map +1 -0
  226. package/dist/hooks/durable-hooks-runtime.js +44 -0
  227. package/dist/hooks/durable-hooks-runtime.js.map +1 -0
  228. package/dist/hooks/hooks.d.ts +100 -1
  229. package/dist/hooks/hooks.d.ts.map +1 -1
  230. package/dist/hooks/hooks.js +254 -27
  231. package/dist/hooks/hooks.js.map +1 -1
  232. package/dist/id.d.ts +2 -2
  233. package/dist/id.js +2 -2
  234. package/dist/internal/adapter-registry.d.ts +11 -0
  235. package/dist/internal/adapter-registry.d.ts.map +1 -0
  236. package/dist/internal/adapter-registry.js +135 -0
  237. package/dist/internal/adapter-registry.js.map +1 -0
  238. package/dist/internal/outbox-state.d.ts +2 -0
  239. package/dist/internal/outbox-state.js +26 -0
  240. package/dist/internal/outbox-state.js.map +1 -0
  241. package/dist/migration-engine/auto-from-schema.d.ts +33 -0
  242. package/dist/migration-engine/auto-from-schema.d.ts.map +1 -0
  243. package/dist/migration-engine/auto-from-schema.js +223 -37
  244. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  245. package/dist/migration-engine/generation-engine.d.ts +16 -10
  246. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  247. package/dist/migration-engine/generation-engine.js +86 -35
  248. package/dist/migration-engine/generation-engine.js.map +1 -1
  249. package/dist/migration-engine/shared.d.ts +113 -0
  250. package/dist/migration-engine/shared.d.ts.map +1 -0
  251. package/dist/migration-engine/shared.js.map +1 -1
  252. package/dist/mod.d.ts +20 -12
  253. package/dist/mod.d.ts.map +1 -1
  254. package/dist/mod.js +18 -12
  255. package/dist/mod.js.map +1 -1
  256. package/dist/naming/sql-naming.d.ts +19 -0
  257. package/dist/naming/sql-naming.d.ts.map +1 -0
  258. package/dist/naming/sql-naming.js +116 -0
  259. package/dist/naming/sql-naming.js.map +1 -0
  260. package/dist/outbox/outbox-builder.js +156 -0
  261. package/dist/outbox/outbox-builder.js.map +1 -0
  262. package/dist/outbox/outbox.d.ts +54 -0
  263. package/dist/outbox/outbox.d.ts.map +1 -0
  264. package/dist/outbox/outbox.js +37 -0
  265. package/dist/outbox/outbox.js.map +1 -0
  266. package/dist/query/column-defaults.js +20 -4
  267. package/dist/query/column-defaults.js.map +1 -1
  268. package/dist/query/condition-builder.d.ts +7 -1
  269. package/dist/query/condition-builder.d.ts.map +1 -1
  270. package/dist/query/condition-builder.js +5 -1
  271. package/dist/query/condition-builder.js.map +1 -1
  272. package/dist/query/cursor-client.d.ts +105 -0
  273. package/dist/query/cursor-client.d.ts.map +1 -0
  274. package/dist/query/cursor-client.js +165 -0
  275. package/dist/query/cursor-client.js.map +1 -0
  276. package/dist/query/cursor.d.ts +3 -1
  277. package/dist/query/cursor.d.ts.map +1 -1
  278. package/dist/query/cursor.js +51 -14
  279. package/dist/query/cursor.js.map +1 -1
  280. package/dist/query/db-now.d.ts +22 -0
  281. package/dist/query/db-now.d.ts.map +1 -0
  282. package/dist/query/db-now.js +35 -0
  283. package/dist/query/db-now.js.map +1 -0
  284. package/dist/query/orm/orm.js.map +1 -1
  285. package/dist/query/serialize/create-sql-serializer.js +5 -4
  286. package/dist/query/serialize/create-sql-serializer.js.map +1 -1
  287. package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
  288. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
  289. package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
  290. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
  291. package/dist/query/serialize/dialect/sqlite-serializer.js +60 -12
  292. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
  293. package/dist/query/serialize/sql-serializer.js +2 -2
  294. package/dist/query/serialize/sql-serializer.js.map +1 -1
  295. package/dist/query/simple-query-interface.d.ts +13 -4
  296. package/dist/query/simple-query-interface.d.ts.map +1 -1
  297. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -2
  298. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  299. package/dist/query/unit-of-work/execute-unit-of-work.js +50 -24
  300. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  301. package/dist/query/unit-of-work/unit-of-work.d.ts +92 -30
  302. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  303. package/dist/query/unit-of-work/unit-of-work.js +136 -11
  304. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  305. package/dist/query/value-decoding.js +16 -6
  306. package/dist/query/value-decoding.js.map +1 -1
  307. package/dist/query/value-encoding.js +29 -9
  308. package/dist/query/value-encoding.js.map +1 -1
  309. package/dist/schema/create.d.ts +103 -35
  310. package/dist/schema/create.d.ts.map +1 -1
  311. package/dist/schema/create.js +172 -58
  312. package/dist/schema/create.js.map +1 -1
  313. package/dist/schema/generate-id.js +2 -2
  314. package/dist/schema/generate-id.js.map +1 -1
  315. package/dist/schema/type-conversion/create-sql-type-mapper.js +4 -3
  316. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  317. package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
  318. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  319. package/dist/schema/validator.d.ts +10 -0
  320. package/dist/schema/validator.d.ts.map +1 -0
  321. package/dist/schema/validator.js +123 -0
  322. package/dist/schema/validator.js.map +1 -0
  323. package/dist/schema-output/drizzle.d.ts +30 -0
  324. package/dist/schema-output/drizzle.d.ts.map +1 -0
  325. package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +88 -60
  326. package/dist/schema-output/drizzle.js.map +1 -0
  327. package/dist/schema-output/prisma.d.ts +17 -0
  328. package/dist/schema-output/prisma.d.ts.map +1 -0
  329. package/dist/schema-output/prisma.js +307 -0
  330. package/dist/schema-output/prisma.js.map +1 -0
  331. package/dist/sql-driver/dialects/durable-object-dialect.js +3 -9
  332. package/dist/sql-driver/dialects/durable-object-dialect.js.map +1 -1
  333. package/dist/sql-driver/query-executor/default-query-executor.js.map +1 -1
  334. package/dist/sql-driver/query-executor/query-executor-base.js.map +1 -1
  335. package/dist/sql-driver/sql-driver-adapter.js.map +1 -1
  336. package/dist/sql-driver/sql.js.map +1 -1
  337. package/dist/sync/commands.d.ts +15 -0
  338. package/dist/sync/commands.d.ts.map +1 -0
  339. package/dist/sync/commands.js +27 -0
  340. package/dist/sync/commands.js.map +1 -0
  341. package/dist/sync/index.d.ts +4 -0
  342. package/dist/sync/index.js +4 -0
  343. package/dist/sync/read-tracking.d.ts +25 -0
  344. package/dist/sync/read-tracking.d.ts.map +1 -0
  345. package/dist/sync/read-tracking.js +148 -0
  346. package/dist/sync/read-tracking.js.map +1 -0
  347. package/dist/sync/submit.js +213 -0
  348. package/dist/sync/submit.js.map +1 -0
  349. package/dist/sync/types.d.ts +63 -0
  350. package/dist/sync/types.d.ts.map +1 -0
  351. package/dist/util/default-database-adapter.js +66 -0
  352. package/dist/util/default-database-adapter.js.map +1 -0
  353. package/dist/with-database.d.ts +3 -6
  354. package/dist/with-database.d.ts.map +1 -1
  355. package/dist/with-database.js +8 -7
  356. package/dist/with-database.js.map +1 -1
  357. package/package.json +62 -55
  358. package/src/adapters/adapters.ts +33 -26
  359. package/src/adapters/drizzle/migrate-drizzle.test.ts +99 -41
  360. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +601 -0
  361. package/src/adapters/drizzle/test-utils.ts +13 -8
  362. package/src/adapters/generic-sql/driver-config.ts +38 -0
  363. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +10 -8
  364. package/src/adapters/generic-sql/generic-sql-adapter.ts +117 -34
  365. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +55 -0
  366. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +297 -3
  367. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +120 -0
  368. package/src/adapters/generic-sql/migration/cold-kysely.ts +1 -0
  369. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +27 -8
  370. package/src/adapters/generic-sql/migration/dialect/mysql.ts +47 -8
  371. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +28 -9
  372. package/src/adapters/generic-sql/migration/dialect/postgres.ts +9 -4
  373. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +839 -8
  374. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +396 -53
  375. package/src/adapters/generic-sql/migration/executor.test.ts +52 -0
  376. package/src/adapters/generic-sql/migration/executor.ts +47 -4
  377. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +238 -46
  378. package/src/adapters/generic-sql/migration/prepared-migrations.ts +21 -13
  379. package/src/adapters/generic-sql/migration/sql-generator.ts +145 -66
  380. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +11 -8
  381. package/src/adapters/generic-sql/query/cursor-utils.test.ts +272 -0
  382. package/src/adapters/generic-sql/query/cursor-utils.ts +42 -7
  383. package/src/adapters/generic-sql/query/db-now-sql.ts +49 -0
  384. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +171 -35
  385. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +53 -40
  386. package/src/adapters/generic-sql/query/select-builder.test.ts +16 -11
  387. package/src/adapters/generic-sql/query/select-builder.ts +7 -3
  388. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +75 -6
  389. package/src/adapters/generic-sql/query/sql-query-compiler.ts +129 -24
  390. package/src/adapters/generic-sql/query/where-builder.test.ts +96 -20
  391. package/src/adapters/generic-sql/query/where-builder.ts +112 -41
  392. package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +11 -20
  393. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +851 -0
  394. package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +18 -15
  395. package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +282 -14
  396. package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +129 -12
  397. package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +9 -7
  398. package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
  399. package/src/adapters/generic-sql/uow-decoder.test.ts +5 -4
  400. package/src/adapters/generic-sql/uow-decoder.ts +23 -5
  401. package/src/adapters/generic-sql/uow-encoder.test.ts +36 -3
  402. package/src/adapters/generic-sql/uow-encoder.ts +48 -13
  403. package/src/adapters/in-memory/condition-evaluator.test.ts +194 -0
  404. package/src/adapters/in-memory/condition-evaluator.ts +280 -0
  405. package/src/adapters/in-memory/errors.ts +20 -0
  406. package/src/adapters/in-memory/in-memory-adapter.ts +388 -0
  407. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +344 -0
  408. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +255 -0
  409. package/src/adapters/in-memory/in-memory-uow.ts +1724 -0
  410. package/src/adapters/in-memory/index.ts +3 -0
  411. package/src/adapters/in-memory/options.test.ts +42 -0
  412. package/src/adapters/in-memory/options.ts +91 -0
  413. package/src/adapters/in-memory/outbox.test.ts +361 -0
  414. package/src/adapters/in-memory/reference-resolution.test.ts +51 -0
  415. package/src/adapters/in-memory/reference-resolution.ts +67 -0
  416. package/src/adapters/in-memory/sorted-array-index.test.ts +124 -0
  417. package/src/adapters/in-memory/sorted-array-index.ts +228 -0
  418. package/src/adapters/in-memory/store.test.ts +69 -0
  419. package/src/adapters/in-memory/store.ts +145 -0
  420. package/src/adapters/in-memory/value-comparison.ts +53 -0
  421. package/src/adapters/in-memory/value-normalization.test.ts +58 -0
  422. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1207 -0
  423. package/src/adapters/shared/from-unit-of-work-compiler.ts +159 -47
  424. package/src/adapters/shared/uow-operation-compiler.ts +28 -18
  425. package/src/adapters/sql/index.ts +12 -0
  426. package/src/browser/mod.ts +64 -0
  427. package/src/client.ts +19 -0
  428. package/src/db-fragment-definition-builder.test.ts +845 -53
  429. package/src/db-fragment-definition-builder.ts +911 -95
  430. package/src/db-fragment-instantiator.test.ts +210 -94
  431. package/src/db-fragment-integration.test.ts +17 -12
  432. package/src/dispatchers/cloudflare-do/dispatcher.ts +204 -0
  433. package/src/dispatchers/cloudflare-do/index.test.ts +206 -0
  434. package/src/dispatchers/cloudflare-do/index.ts +63 -0
  435. package/src/dispatchers/node/dispatcher.ts +112 -0
  436. package/src/dispatchers/node/index.test.ts +120 -0
  437. package/src/dispatchers/node/index.ts +50 -0
  438. package/src/durable-hooks.test.ts +80 -0
  439. package/src/durable-hooks.ts +67 -0
  440. package/src/fragments/internal-fragment.routes.test.ts +570 -0
  441. package/src/fragments/internal-fragment.routes.ts +334 -0
  442. package/src/fragments/internal-fragment.schema.ts +95 -0
  443. package/src/fragments/internal-fragment.test.ts +505 -83
  444. package/src/fragments/internal-fragment.ts +453 -70
  445. package/src/hooks/durable-hooks-logger.ts +126 -0
  446. package/src/hooks/durable-hooks-processor.pglite.test.ts +87 -0
  447. package/src/hooks/durable-hooks-processor.test.ts +282 -0
  448. package/src/hooks/durable-hooks-processor.ts +173 -0
  449. package/src/hooks/durable-hooks-runtime.test.ts +65 -0
  450. package/src/hooks/durable-hooks-runtime.ts +81 -0
  451. package/src/hooks/hooks.test.ts +455 -34
  452. package/src/hooks/hooks.ts +501 -34
  453. package/src/id.test.ts +34 -0
  454. package/src/id.ts +1 -3
  455. package/src/internal/adapter-registry.test.ts +93 -0
  456. package/src/internal/adapter-registry.ts +239 -0
  457. package/src/internal/outbox-state.ts +43 -0
  458. package/src/migration-engine/auto-from-schema.test.ts +107 -14
  459. package/src/migration-engine/auto-from-schema.ts +365 -44
  460. package/src/migration-engine/create.test.ts +4 -3
  461. package/src/migration-engine/create.ts +1 -1
  462. package/src/migration-engine/generation-engine.test.ts +292 -110
  463. package/src/migration-engine/generation-engine.ts +117 -66
  464. package/src/migration-engine/shared.ts +14 -0
  465. package/src/mod.ts +95 -39
  466. package/src/naming/sql-naming.ts +181 -0
  467. package/src/outbox/outbox-builder.ts +241 -0
  468. package/src/outbox/outbox.test.ts +424 -0
  469. package/src/outbox/outbox.ts +139 -0
  470. package/src/query/column-defaults.ts +42 -4
  471. package/src/query/condition-builder.test.ts +18 -3
  472. package/src/query/condition-builder.ts +7 -0
  473. package/src/query/cursor-client.test.ts +70 -0
  474. package/src/query/cursor-client.ts +263 -0
  475. package/src/query/cursor.test.ts +119 -20
  476. package/src/query/cursor.ts +88 -27
  477. package/src/query/db-now.ts +73 -0
  478. package/src/query/orm/orm.ts +2 -2
  479. package/src/query/query-type.test.ts +4 -3
  480. package/src/query/serialize/create-sql-serializer.ts +10 -5
  481. package/src/query/serialize/dialect/mysql-serializer.ts +13 -5
  482. package/src/query/serialize/dialect/postgres-serializer.ts +35 -5
  483. package/src/query/serialize/dialect/sqlite-serializer.test.ts +90 -3
  484. package/src/query/serialize/dialect/sqlite-serializer.ts +108 -12
  485. package/src/query/serialize/sql-serializer.ts +4 -4
  486. package/src/query/simple-query-interface.ts +15 -4
  487. package/src/query/unit-of-work/execute-unit-of-work.test.ts +372 -10
  488. package/src/query/unit-of-work/execute-unit-of-work.ts +87 -27
  489. package/src/query/unit-of-work/retry-policy.test.ts +1 -0
  490. package/src/query/unit-of-work/tx-builder.test.ts +73 -1
  491. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +17 -16
  492. package/src/query/unit-of-work/unit-of-work-types.test.ts +42 -12
  493. package/src/query/unit-of-work/unit-of-work.test.ts +196 -39
  494. package/src/query/unit-of-work/unit-of-work.ts +309 -38
  495. package/src/query/value-decoding.test.ts +63 -4
  496. package/src/query/value-decoding.ts +32 -6
  497. package/src/query/value-encoding.test.ts +86 -2
  498. package/src/query/value-encoding.ts +56 -6
  499. package/src/schema/create.test.ts +293 -47
  500. package/src/schema/create.ts +406 -70
  501. package/src/schema/generate-id.test.ts +3 -2
  502. package/src/schema/generate-id.ts +2 -2
  503. package/src/schema/serialize.test.ts +18 -5
  504. package/src/schema/type-conversion/create-sql-type-mapper.ts +8 -3
  505. package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
  506. package/src/schema/type-conversion/type-mapping.test.ts +26 -1
  507. package/src/schema/validator.test.ts +199 -0
  508. package/src/schema/validator.ts +232 -0
  509. package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +232 -129
  510. package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +155 -99
  511. package/src/schema-output/prisma.test.ts +694 -0
  512. package/src/schema-output/prisma.ts +593 -0
  513. package/src/sql-driver/better-sqlite3.test.ts +5 -3
  514. package/src/sql-driver/dialects/durable-object-dialect.ts +3 -8
  515. package/src/sql-driver/query-executor/default-query-executor.ts +1 -1
  516. package/src/sql-driver/query-executor/query-executor-base.ts +1 -1
  517. package/src/sql-driver/query-executor/query-executor.ts +1 -1
  518. package/src/sql-driver/sql-driver-adapter.ts +2 -2
  519. package/src/sql-driver/sql.ts +2 -1
  520. package/src/sql-driver/sqlocal.test.ts +4 -2
  521. package/src/sync/commands.test.ts +39 -0
  522. package/src/sync/commands.ts +51 -0
  523. package/src/sync/conflict-checker.test.ts +450 -0
  524. package/src/sync/conflict-checker.ts +248 -0
  525. package/src/sync/index.ts +14 -0
  526. package/src/sync/plan.ts +9 -0
  527. package/src/sync/read-tracking.test.ts +177 -0
  528. package/src/sync/read-tracking.ts +287 -0
  529. package/src/sync/submit.test.ts +205 -0
  530. package/src/sync/submit.ts +328 -0
  531. package/src/sync/types.ts +80 -0
  532. package/src/util/default-database-adapter.ts +119 -0
  533. package/src/with-database.ts +20 -31
  534. package/tsconfig.json +1 -1
  535. package/tsdown.config.ts +38 -24
  536. package/vitest.config.ts +1 -0
  537. package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
  538. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
  539. package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
  540. package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
  541. package/dist/adapters/drizzle/generate.d.ts +0 -30
  542. package/dist/adapters/drizzle/generate.d.ts.map +0 -1
  543. package/dist/adapters/drizzle/generate.js.map +0 -1
  544. package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
  545. package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
  546. package/dist/adapters/kysely/kysely-adapter.js +0 -17
  547. package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
  548. package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
  549. package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
  550. package/dist/adapters/shared/table-name-mapper.js +0 -43
  551. package/dist/adapters/shared/table-name-mapper.js.map +0 -1
  552. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js +0 -165
  553. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
  554. package/dist/packages/fragno/dist/api/bind-services.js +0 -20
  555. package/dist/packages/fragno/dist/api/bind-services.js.map +0 -1
  556. package/dist/packages/fragno/dist/api/error.js +0 -48
  557. package/dist/packages/fragno/dist/api/error.js.map +0 -1
  558. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +0 -320
  559. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +0 -1
  560. package/dist/packages/fragno/dist/api/fragment-instantiator.js +0 -525
  561. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +0 -1
  562. package/dist/packages/fragno/dist/api/fragno-response.js +0 -73
  563. package/dist/packages/fragno/dist/api/fragno-response.js.map +0 -1
  564. package/dist/packages/fragno/dist/api/internal/response-stream.js +0 -81
  565. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +0 -1
  566. package/dist/packages/fragno/dist/api/internal/route.js +0 -10
  567. package/dist/packages/fragno/dist/api/internal/route.js.map +0 -1
  568. package/dist/packages/fragno/dist/api/mutable-request-state.js +0 -97
  569. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +0 -1
  570. package/dist/packages/fragno/dist/api/request-context-storage.js +0 -43
  571. package/dist/packages/fragno/dist/api/request-context-storage.js.map +0 -1
  572. package/dist/packages/fragno/dist/api/request-input-context.js +0 -118
  573. package/dist/packages/fragno/dist/api/request-input-context.js.map +0 -1
  574. package/dist/packages/fragno/dist/api/request-middleware.js +0 -83
  575. package/dist/packages/fragno/dist/api/request-middleware.js.map +0 -1
  576. package/dist/packages/fragno/dist/api/request-output-context.js +0 -119
  577. package/dist/packages/fragno/dist/api/request-output-context.js.map +0 -1
  578. package/dist/packages/fragno/dist/api/route.js +0 -17
  579. package/dist/packages/fragno/dist/api/route.js.map +0 -1
  580. package/dist/packages/fragno/dist/internal/symbols.js +0 -10
  581. package/dist/packages/fragno/dist/internal/symbols.js.map +0 -1
  582. package/dist/schema-generator/schema-generator.d.ts +0 -15
  583. package/dist/schema-generator/schema-generator.d.ts.map +0 -1
  584. package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
  585. package/src/adapters/kysely/kysely-adapter.ts +0 -27
  586. package/src/adapters/shared/table-name-mapper.ts +0 -50
  587. package/src/schema-generator/schema-generator.ts +0 -12
@@ -1,6 +1,8 @@
1
- import { createSQLSerializer } from "../../../query/serialize/create-sql-serializer.js";
1
+ import { getDbNowOffsetMs, isDbNow } from "../../../query/db-now.js";
2
2
  import { Column, FragnoId, FragnoReference } from "../../../schema/create.js";
3
+ import { createSQLSerializer } from "../../../query/serialize/create-sql-serializer.js";
3
4
  import { ReferenceSubquery, resolveFragnoIdValue } from "../../../query/value-encoding.js";
5
+ import { buildDbNowSql } from "./db-now-sql.js";
4
6
  import { sql } from "kysely";
5
7
 
6
8
  //#region src/adapters/generic-sql/query/where-builder.ts
@@ -8,12 +10,16 @@ import { sql } from "kysely";
8
10
  * Returns the fully qualified SQL name for a column (table.column).
9
11
  *
10
12
  * @param column - The column to get the full name for
11
- * @param mapper - Optional table name mapper for namespace prefixing
13
+ * @param resolver - Optional naming resolver for namespace prefixing
12
14
  * @returns The fully qualified SQL name in the format "tableName.columnName"
13
15
  * @internal
14
16
  */
15
- function fullSQLName(column, mapper) {
16
- return `${mapper ? mapper.toPhysical(column.tableName) : column.tableName}.${column.name}`;
17
+ function fullSQLName(column, resolver) {
18
+ return `${resolver ? resolver.getTableName(column.tableName) : column.tableName}.${resolver ? resolver.getColumnName(column.tableName, column.name) : column.name}`;
19
+ }
20
+ function fullSQLNameWithAlias(column, resolver, table, tableAlias) {
21
+ if (table && tableAlias && column.tableName === table.name) return `${tableAlias}.${resolver ? resolver.getColumnName(column.tableName, column.name) : column.name}`;
22
+ return fullSQLName(column, resolver);
17
23
  }
18
24
  /**
19
25
  * Builds a WHERE clause expression from a Condition tree.
@@ -25,35 +31,41 @@ function fullSQLName(column, mapper) {
25
31
  * @param condition - The condition tree to build the WHERE clause from
26
32
  * @param eb - Kysely expression builder for constructing SQL expressions
27
33
  * @param database - The database type (affects SQL generation)
28
- * @param mapper - Optional table name mapper for namespace prefixing
34
+ * @param resolver - Optional naming resolver for namespace prefixing
29
35
  * @param table - The table being queried (used for resolving reference columns)
30
36
  * @returns A Kysely expression wrapper representing the WHERE clause
31
37
  * @internal
32
38
  */
33
- function buildWhere(condition, eb, driverConfig, mapper, table) {
34
- const serializer = createSQLSerializer(driverConfig);
39
+ function buildWhere(condition, eb, driverConfig, sqliteStorageMode, resolver, table, tableAlias) {
40
+ const serializer = createSQLSerializer(driverConfig, sqliteStorageMode);
35
41
  if (condition.type === "compare") {
36
42
  const left = condition.a;
37
43
  const op = condition.operator;
38
44
  let val = condition.b;
39
- if (!(val instanceof Column)) if (left.role === "reference" && table) if (typeof val === "string") {
40
- const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === left.ormName));
45
+ if (!(val instanceof Column)) if (isDbNow(val)) val = buildDbNowSql({
46
+ driverConfig,
47
+ columnType: left.type,
48
+ offsetMs: getDbNowOffsetMs(val),
49
+ sqliteStorageMode
50
+ });
51
+ else if (left.role === "reference" && table) if (typeof val === "string") {
52
+ const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === left.name));
41
53
  if (relation) {
42
54
  const refTable = relation.table;
43
55
  const internalIdCol = refTable.getInternalIdColumn();
44
56
  const idCol = refTable.getIdColumn();
45
- const physicalTableName = mapper ? mapper.toPhysical(refTable.ormName) : refTable.ormName;
46
- val = eb.selectFrom(physicalTableName).select(internalIdCol.name).where(idCol.name, "=", val).limit(1);
57
+ const physicalTableName = resolver ? resolver.getTableName(refTable.name) : refTable.name;
58
+ val = eb.selectFrom(physicalTableName).select(resolver ? resolver.getColumnName(refTable.name, internalIdCol.name) : internalIdCol.name).where(resolver ? resolver.getColumnName(refTable.name, idCol.name) : idCol.name, "=", val).limit(1);
47
59
  }
48
60
  } else if (val instanceof FragnoId && val.internalId !== void 0) val = val.internalId;
49
61
  else if (val instanceof FragnoId && val.internalId === void 0) {
50
- const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === left.ormName));
62
+ const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === left.name));
51
63
  if (relation) {
52
64
  const refTable = relation.table;
53
65
  const internalIdCol = refTable.getInternalIdColumn();
54
66
  const idCol = refTable.getIdColumn();
55
- const physicalTableName = mapper ? mapper.toPhysical(refTable.ormName) : refTable.ormName;
56
- val = eb.selectFrom(physicalTableName).select(internalIdCol.name).where(idCol.name, "=", val.externalId).limit(1);
67
+ const physicalTableName = resolver ? resolver.getTableName(refTable.name) : refTable.name;
68
+ val = eb.selectFrom(physicalTableName).select(resolver ? resolver.getColumnName(refTable.name, internalIdCol.name) : internalIdCol.name).where(resolver ? resolver.getColumnName(refTable.name, idCol.name) : idCol.name, "=", val.externalId).limit(1);
57
69
  }
58
70
  } else if (val instanceof FragnoReference) val = val.internalId;
59
71
  else {
@@ -69,57 +81,59 @@ function buildWhere(condition, eb, driverConfig, mapper, table) {
69
81
  switch (op) {
70
82
  case "contains":
71
83
  v = "like";
72
- rhs = val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))}, '%')` : `%${val}%`;
84
+ rhs = val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))}, '%')` : `%${val}%`;
73
85
  break;
74
86
  case "not contains":
75
87
  v = "not like";
76
- rhs = val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))}, '%')` : `%${val}%`;
88
+ rhs = val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))}, '%')` : `%${val}%`;
77
89
  break;
78
90
  case "starts with":
79
91
  v = "like";
80
- rhs = val instanceof Column ? sql`concat(${eb.ref(fullSQLName(val, mapper))}, '%')` : `${val}%`;
92
+ rhs = val instanceof Column ? sql`concat(${eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))}, '%')` : `${val}%`;
81
93
  break;
82
94
  case "not starts with":
83
95
  v = "not like";
84
- rhs = val instanceof Column ? sql`concat(${eb.ref(fullSQLName(val, mapper))}, '%')` : `${val}%`;
96
+ rhs = val instanceof Column ? sql`concat(${eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))}, '%')` : `${val}%`;
85
97
  break;
86
98
  case "ends with":
87
99
  v = "like";
88
- rhs = val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))})` : `%${val}`;
100
+ rhs = val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))})` : `%${val}`;
89
101
  break;
90
102
  case "not ends with":
91
103
  v = "not like";
92
- rhs = val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))})` : `%${val}`;
104
+ rhs = val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))})` : `%${val}`;
93
105
  break;
94
106
  default:
95
107
  v = op;
96
- rhs = val instanceof Column ? eb.ref(fullSQLName(val, mapper)) : val;
108
+ rhs = val instanceof Column ? eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias)) : val;
97
109
  }
98
- return eb(fullSQLName(left, mapper), v, rhs);
110
+ return eb(fullSQLNameWithAlias(left, resolver, table, tableAlias), v, rhs);
99
111
  }
100
- if (condition.type === "and") return eb.and(condition.items.map((v) => buildWhere(v, eb, driverConfig, mapper, table)));
101
- if (condition.type === "not") return eb.not(buildWhere(condition.item, eb, driverConfig, mapper, table));
102
- return eb.or(condition.items.map((v) => buildWhere(v, eb, driverConfig, mapper, table)));
112
+ if (condition.type === "and") return eb.and(condition.items.map((v) => buildWhere(v, eb, driverConfig, sqliteStorageMode, resolver, table, tableAlias)));
113
+ if (condition.type === "not") return eb.not(buildWhere(condition.item, eb, driverConfig, sqliteStorageMode, resolver, table, tableAlias));
114
+ return eb.or(condition.items.map((v) => buildWhere(v, eb, driverConfig, sqliteStorageMode, resolver, table, tableAlias)));
103
115
  }
104
116
  /**
105
117
  * Process reference subqueries in encoded values, converting them to Kysely SQL subqueries
106
118
  *
107
119
  * @param values - The encoded values that may contain ReferenceSubquery objects
108
120
  * @param kysely - The Kysely database instance for building subqueries
109
- * @param mapper - Optional table name mapper for namespace prefixing
121
+ * @param resolver - Optional naming resolver for namespace prefixing
110
122
  * @returns Processed values with subqueries in place of ReferenceSubquery markers
111
123
  * @internal
112
124
  */
113
- function processReferenceSubqueries(values, kysely, mapper) {
125
+ function processReferenceSubqueries(values, kysely, resolver) {
114
126
  const processed = {};
115
- const getTableName = (table) => mapper ? mapper.toPhysical(table.name) : table.name;
127
+ const getTableName = (table) => resolver ? resolver.getTableName(table.name) : table.name;
116
128
  for (const [key, value] of Object.entries(values)) if (value instanceof ReferenceSubquery) {
117
129
  const refTable = value.referencedTable;
118
130
  const externalId = value.externalIdValue;
119
131
  const tableName = getTableName(refTable);
120
132
  const internalIdCol = refTable.getInternalIdColumn().name;
121
133
  const idCol = refTable.getIdColumn().name;
122
- processed[key] = kysely.selectFrom(tableName).select(internalIdCol).where(idCol, "=", externalId).limit(1);
134
+ const internalIdColumnName = resolver ? resolver.getColumnName(refTable.name, internalIdCol) : internalIdCol;
135
+ const idColumnName = resolver ? resolver.getColumnName(refTable.name, idCol) : idCol;
136
+ processed[key] = kysely.selectFrom(tableName).select(internalIdColumnName).where(idColumnName, "=", externalId).limit(1);
123
137
  } else processed[key] = value;
124
138
  return processed;
125
139
  }
@@ -1 +1 @@
1
- {"version":3,"file":"where-builder.js","names":["v: BinaryOperator","rhs: unknown","processed: Record<string, unknown>"],"sources":["../../../../src/adapters/generic-sql/query/where-builder.ts"],"sourcesContent":["import { sql, type BinaryOperator } from \"kysely\";\nimport {\n type AnyColumn,\n type AnyTable,\n Column,\n FragnoId,\n FragnoReference,\n} from \"../../../schema/create\";\nimport type { Condition } from \"../../../query/condition-builder\";\nimport { createSQLSerializer } from \"../../../query/serialize/create-sql-serializer\";\nimport type { TableNameMapper } from \"../../shared/table-name-mapper\";\nimport type { DriverConfig } from \"../driver-config\";\nimport { ReferenceSubquery, resolveFragnoIdValue } from \"../../../query/value-encoding\";\nimport type { AnyKysely, AnyExpressionBuilder, AnyExpressionWrapper } from \"./sql-query-compiler\";\n\n/**\n * Returns the fully qualified SQL name for a column (table.column).\n *\n * @param column - The column to get the full name for\n * @param mapper - Optional table name mapper for namespace prefixing\n * @returns The fully qualified SQL name in the format \"tableName.columnName\"\n * @internal\n */\nexport function fullSQLName(column: AnyColumn, mapper?: TableNameMapper): string {\n const tableName = mapper ? mapper.toPhysical(column.tableName) : column.tableName;\n return `${tableName}.${column.name}`;\n}\n\n/**\n * Builds a WHERE clause expression from a Condition tree.\n *\n * Recursively processes condition objects to build Kysely WHERE expressions.\n * Handles comparison operators, logical AND/OR/NOT, and special string operators\n * like \"contains\", \"starts with\", and \"ends with\".\n *\n * @param condition - The condition tree to build the WHERE clause from\n * @param eb - Kysely expression builder for constructing SQL expressions\n * @param database - The database type (affects SQL generation)\n * @param mapper - Optional table name mapper for namespace prefixing\n * @param table - The table being queried (used for resolving reference columns)\n * @returns A Kysely expression wrapper representing the WHERE clause\n * @internal\n */\nexport function buildWhere(\n condition: Condition,\n eb: AnyExpressionBuilder,\n driverConfig: DriverConfig,\n mapper?: TableNameMapper,\n table?: AnyTable,\n): AnyExpressionWrapper {\n const serializer = createSQLSerializer(driverConfig);\n\n if (condition.type === \"compare\") {\n const left = condition.a;\n const op = condition.operator;\n let val = condition.b;\n\n if (!(val instanceof Column)) {\n // Handle reference columns specially\n if (left.role === \"reference\" && table) {\n if (typeof val === \"string\") {\n // String external ID - create subquery to lookup internal ID\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === left.ormName),\n );\n if (relation) {\n const refTable = relation.table;\n const internalIdCol = refTable.getInternalIdColumn();\n const idCol = refTable.getIdColumn();\n const physicalTableName = mapper\n ? mapper.toPhysical(refTable.ormName)\n : refTable.ormName;\n\n val = eb\n .selectFrom(physicalTableName)\n .select(internalIdCol.name)\n .where(idCol.name, \"=\", val)\n .limit(1);\n }\n } else if (val instanceof FragnoId && val.internalId !== undefined) {\n // FragnoId with internal ID - use it directly (no serialization needed)\n val = val.internalId;\n } else if (val instanceof FragnoId && val.internalId === undefined) {\n // FragnoId without internal ID - create subquery using external ID\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === left.ormName),\n );\n if (relation) {\n const refTable = relation.table;\n const internalIdCol = refTable.getInternalIdColumn();\n const idCol = refTable.getIdColumn();\n const physicalTableName = mapper\n ? mapper.toPhysical(refTable.ormName)\n : refTable.ormName;\n\n val = eb\n .selectFrom(physicalTableName)\n .select(internalIdCol.name)\n .where(idCol.name, \"=\", val.externalId)\n .limit(1);\n }\n } else if (val instanceof FragnoReference) {\n // FragnoReference - use internal ID directly (no serialization needed)\n val = val.internalId;\n } else {\n // Other values - resolve and serialize\n const resolvedVal = resolveFragnoIdValue(val, left);\n val = serializer.serialize(resolvedVal, left);\n }\n } else {\n // Non-reference columns - resolve FragnoId/FragnoReference and serialize\n const resolvedVal = resolveFragnoIdValue(val, left);\n val = serializer.serialize(resolvedVal, left);\n }\n }\n\n let v: BinaryOperator;\n let rhs: unknown;\n\n switch (op) {\n case \"contains\":\n v = \"like\";\n rhs =\n val instanceof Column\n ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))}, '%')`\n : `%${val}%`;\n break;\n case \"not contains\":\n v = \"not like\";\n rhs =\n val instanceof Column\n ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))}, '%')`\n : `%${val}%`;\n break;\n case \"starts with\":\n v = \"like\";\n rhs =\n val instanceof Column ? sql`concat(${eb.ref(fullSQLName(val, mapper))}, '%')` : `${val}%`;\n break;\n case \"not starts with\":\n v = \"not like\";\n rhs =\n val instanceof Column ? sql`concat(${eb.ref(fullSQLName(val, mapper))}, '%')` : `${val}%`;\n break;\n case \"ends with\":\n v = \"like\";\n rhs =\n val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))})` : `%${val}`;\n break;\n case \"not ends with\":\n v = \"not like\";\n rhs =\n val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))})` : `%${val}`;\n break;\n default:\n v = op;\n rhs = val instanceof Column ? eb.ref(fullSQLName(val, mapper)) : val;\n }\n\n return eb(fullSQLName(left, mapper), v, rhs);\n }\n\n // Nested conditions\n if (condition.type === \"and\") {\n return eb.and(condition.items.map((v) => buildWhere(v, eb, driverConfig, mapper, table)));\n }\n\n if (condition.type === \"not\") {\n return eb.not(buildWhere(condition.item, eb, driverConfig, mapper, table));\n }\n\n return eb.or(condition.items.map((v) => buildWhere(v, eb, driverConfig, mapper, table)));\n}\n\n/**\n * Process reference subqueries in encoded values, converting them to Kysely SQL subqueries\n *\n * @param values - The encoded values that may contain ReferenceSubquery objects\n * @param kysely - The Kysely database instance for building subqueries\n * @param mapper - Optional table name mapper for namespace prefixing\n * @returns Processed values with subqueries in place of ReferenceSubquery markers\n * @internal\n */\nexport function processReferenceSubqueries(\n values: Record<string, unknown>,\n kysely: AnyKysely,\n mapper?: TableNameMapper,\n): Record<string, unknown> {\n const processed: Record<string, unknown> = {};\n const getTableName = (table: AnyTable) => (mapper ? mapper.toPhysical(table.name) : table.name);\n\n for (const [key, value] of Object.entries(values)) {\n if (value instanceof ReferenceSubquery) {\n const refTable = value.referencedTable;\n const externalId = value.externalIdValue;\n const tableName = getTableName(refTable);\n const internalIdCol = refTable.getInternalIdColumn().name;\n const idCol = refTable.getIdColumn().name;\n\n processed[key] = kysely\n .selectFrom(tableName)\n .select(internalIdCol)\n .where(idCol, \"=\", externalId)\n .limit(1);\n } else {\n processed[key] = value;\n }\n }\n\n return processed;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"where-builder.js","names":["v: BinaryOperator","rhs: unknown","processed: Record<string, unknown>"],"sources":["../../../../src/adapters/generic-sql/query/where-builder.ts"],"sourcesContent":["import { sql, type BinaryOperator } from \"kysely\";\n\nimport type { NamingResolver } from \"../../../naming/sql-naming\";\nimport type { Condition } from \"../../../query/condition-builder\";\nimport { getDbNowOffsetMs, isDbNow } from \"../../../query/db-now\";\nimport { createSQLSerializer } from \"../../../query/serialize/create-sql-serializer\";\nimport { ReferenceSubquery, resolveFragnoIdValue } from \"../../../query/value-encoding\";\nimport {\n type AnyColumn,\n type AnyTable,\n Column,\n FragnoId,\n FragnoReference,\n} from \"../../../schema/create\";\nimport type { DriverConfig } from \"../driver-config\";\nimport type { SQLiteStorageMode } from \"../sqlite-storage\";\nimport { buildDbNowSql } from \"./db-now-sql\";\nimport type { AnyKysely, AnyExpressionBuilder, AnyExpressionWrapper } from \"./sql-query-compiler\";\n\n/**\n * Returns the fully qualified SQL name for a column (table.column).\n *\n * @param column - The column to get the full name for\n * @param resolver - Optional naming resolver for namespace prefixing\n * @returns The fully qualified SQL name in the format \"tableName.columnName\"\n * @internal\n */\nexport function fullSQLName(column: AnyColumn, resolver?: NamingResolver): string {\n const tableName = resolver ? resolver.getTableName(column.tableName) : column.tableName;\n const columnName = resolver ? resolver.getColumnName(column.tableName, column.name) : column.name;\n return `${tableName}.${columnName}`;\n}\n\nfunction fullSQLNameWithAlias(\n column: AnyColumn,\n resolver?: NamingResolver,\n table?: AnyTable,\n tableAlias?: string,\n): string {\n if (table && tableAlias && column.tableName === table.name) {\n const columnName = resolver\n ? resolver.getColumnName(column.tableName, column.name)\n : column.name;\n return `${tableAlias}.${columnName}`;\n }\n return fullSQLName(column, resolver);\n}\n\n/**\n * Builds a WHERE clause expression from a Condition tree.\n *\n * Recursively processes condition objects to build Kysely WHERE expressions.\n * Handles comparison operators, logical AND/OR/NOT, and special string operators\n * like \"contains\", \"starts with\", and \"ends with\".\n *\n * @param condition - The condition tree to build the WHERE clause from\n * @param eb - Kysely expression builder for constructing SQL expressions\n * @param database - The database type (affects SQL generation)\n * @param resolver - Optional naming resolver for namespace prefixing\n * @param table - The table being queried (used for resolving reference columns)\n * @returns A Kysely expression wrapper representing the WHERE clause\n * @internal\n */\nexport function buildWhere(\n condition: Condition,\n eb: AnyExpressionBuilder,\n driverConfig: DriverConfig,\n sqliteStorageMode?: SQLiteStorageMode,\n resolver?: NamingResolver,\n table?: AnyTable,\n tableAlias?: string,\n): AnyExpressionWrapper {\n const serializer = createSQLSerializer(driverConfig, sqliteStorageMode);\n\n if (condition.type === \"compare\") {\n const left = condition.a;\n const op = condition.operator;\n let val = condition.b;\n\n if (!(val instanceof Column)) {\n if (isDbNow(val)) {\n val = buildDbNowSql({\n driverConfig,\n columnType: left.type,\n offsetMs: getDbNowOffsetMs(val),\n sqliteStorageMode,\n });\n } else if (left.role === \"reference\" && table) {\n // Handle reference columns specially\n if (typeof val === \"string\") {\n // String external ID - create subquery to lookup internal ID\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === left.name),\n );\n if (relation) {\n const refTable = relation.table;\n const internalIdCol = refTable.getInternalIdColumn();\n const idCol = refTable.getIdColumn();\n const physicalTableName = resolver\n ? resolver.getTableName(refTable.name)\n : refTable.name;\n\n val = eb\n .selectFrom(physicalTableName)\n .select(\n resolver\n ? resolver.getColumnName(refTable.name, internalIdCol.name)\n : internalIdCol.name,\n )\n .where(\n resolver ? resolver.getColumnName(refTable.name, idCol.name) : idCol.name,\n \"=\",\n val,\n )\n .limit(1);\n }\n } else if (val instanceof FragnoId && val.internalId !== undefined) {\n // FragnoId with internal ID - use it directly (no serialization needed)\n val = val.internalId;\n } else if (val instanceof FragnoId && val.internalId === undefined) {\n // FragnoId without internal ID - create subquery using external ID\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === left.name),\n );\n if (relation) {\n const refTable = relation.table;\n const internalIdCol = refTable.getInternalIdColumn();\n const idCol = refTable.getIdColumn();\n const physicalTableName = resolver\n ? resolver.getTableName(refTable.name)\n : refTable.name;\n\n val = eb\n .selectFrom(physicalTableName)\n .select(\n resolver\n ? resolver.getColumnName(refTable.name, internalIdCol.name)\n : internalIdCol.name,\n )\n .where(\n resolver ? resolver.getColumnName(refTable.name, idCol.name) : idCol.name,\n \"=\",\n val.externalId,\n )\n .limit(1);\n }\n } else if (val instanceof FragnoReference) {\n // FragnoReference - use internal ID directly (no serialization needed)\n val = val.internalId;\n } else {\n // Other values - resolve and serialize\n const resolvedVal = resolveFragnoIdValue(val, left);\n val = serializer.serialize(resolvedVal, left);\n }\n } else {\n // Non-reference columns - resolve FragnoId/FragnoReference and serialize\n const resolvedVal = resolveFragnoIdValue(val, left);\n val = serializer.serialize(resolvedVal, left);\n }\n }\n\n let v: BinaryOperator;\n let rhs: unknown;\n\n switch (op) {\n case \"contains\":\n v = \"like\";\n rhs =\n val instanceof Column\n ? sql`concat('%', ${eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))}, '%')`\n : `%${val}%`;\n break;\n case \"not contains\":\n v = \"not like\";\n rhs =\n val instanceof Column\n ? sql`concat('%', ${eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))}, '%')`\n : `%${val}%`;\n break;\n case \"starts with\":\n v = \"like\";\n rhs =\n val instanceof Column\n ? sql`concat(${eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))}, '%')`\n : `${val}%`;\n break;\n case \"not starts with\":\n v = \"not like\";\n rhs =\n val instanceof Column\n ? sql`concat(${eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))}, '%')`\n : `${val}%`;\n break;\n case \"ends with\":\n v = \"like\";\n rhs =\n val instanceof Column\n ? sql`concat('%', ${eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))})`\n : `%${val}`;\n break;\n case \"not ends with\":\n v = \"not like\";\n rhs =\n val instanceof Column\n ? sql`concat('%', ${eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))})`\n : `%${val}`;\n break;\n default:\n v = op;\n rhs =\n val instanceof Column\n ? eb.ref(fullSQLNameWithAlias(val, resolver, table, tableAlias))\n : val;\n }\n\n return eb(fullSQLNameWithAlias(left, resolver, table, tableAlias), v, rhs);\n }\n\n // Nested conditions\n if (condition.type === \"and\") {\n return eb.and(\n condition.items.map((v) =>\n buildWhere(v, eb, driverConfig, sqliteStorageMode, resolver, table, tableAlias),\n ),\n );\n }\n\n if (condition.type === \"not\") {\n return eb.not(\n buildWhere(condition.item, eb, driverConfig, sqliteStorageMode, resolver, table, tableAlias),\n );\n }\n\n return eb.or(\n condition.items.map((v) =>\n buildWhere(v, eb, driverConfig, sqliteStorageMode, resolver, table, tableAlias),\n ),\n );\n}\n\n/**\n * Process reference subqueries in encoded values, converting them to Kysely SQL subqueries\n *\n * @param values - The encoded values that may contain ReferenceSubquery objects\n * @param kysely - The Kysely database instance for building subqueries\n * @param resolver - Optional naming resolver for namespace prefixing\n * @returns Processed values with subqueries in place of ReferenceSubquery markers\n * @internal\n */\nexport function processReferenceSubqueries(\n values: Record<string, unknown>,\n kysely: AnyKysely,\n resolver?: NamingResolver,\n): Record<string, unknown> {\n const processed: Record<string, unknown> = {};\n const getTableName = (table: AnyTable) =>\n resolver ? resolver.getTableName(table.name) : table.name;\n\n for (const [key, value] of Object.entries(values)) {\n if (value instanceof ReferenceSubquery) {\n const refTable = value.referencedTable;\n const externalId = value.externalIdValue;\n const tableName = getTableName(refTable);\n const internalIdCol = refTable.getInternalIdColumn().name;\n const idCol = refTable.getIdColumn().name;\n const internalIdColumnName = resolver\n ? resolver.getColumnName(refTable.name, internalIdCol)\n : internalIdCol;\n const idColumnName = resolver ? resolver.getColumnName(refTable.name, idCol) : idCol;\n\n processed[key] = kysely\n .selectFrom(tableName)\n .select(internalIdColumnName)\n .where(idColumnName, \"=\", externalId)\n .limit(1);\n } else {\n processed[key] = value;\n }\n }\n\n return processed;\n}\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ //#region src/adapters/generic-sql/sqlite-storage.d.ts
2
+ type SQLiteDateStorage = "epoch-ms" | "iso-text";
3
+ type SQLiteBigintStorage = "blob" | "integer";
4
+ interface SQLiteStorageMode {
5
+ timestampStorage: SQLiteDateStorage;
6
+ dateStorage: SQLiteDateStorage;
7
+ bigintStorage: SQLiteBigintStorage;
8
+ }
9
+ declare const sqliteStorageDefault: SQLiteStorageMode;
10
+ declare const sqliteStoragePrisma: SQLiteStorageMode;
11
+ //#endregion
12
+ export { SQLiteStorageMode, sqliteStorageDefault, sqliteStoragePrisma };
13
+ //# sourceMappingURL=sqlite-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-storage.d.ts","names":[],"sources":["../../../src/adapters/generic-sql/sqlite-storage.ts"],"sourcesContent":[],"mappings":";KAAY,iBAAA;AAAA,KACA,mBAAA,GADiB,MAAA,GAAA,SAAA;AACjB,UAEK,iBAAA,CAFc;EAEd,gBAAA,EACG,iBADc;EACd,WAAA,EACL,iBADK;EACL,aAAA,EACE,mBADF;;AACqB,cAGvB,oBAHuB,EAGD,iBAHC;AAGvB,cAMA,mBANsB,EAMD,iBAFjC"}
@@ -0,0 +1,15 @@
1
+ //#region src/adapters/generic-sql/sqlite-storage.ts
2
+ const sqliteStorageDefault = {
3
+ timestampStorage: "epoch-ms",
4
+ dateStorage: "epoch-ms",
5
+ bigintStorage: "blob"
6
+ };
7
+ const sqliteStoragePrisma = {
8
+ timestampStorage: "iso-text",
9
+ dateStorage: "iso-text",
10
+ bigintStorage: "integer"
11
+ };
12
+
13
+ //#endregion
14
+ export { sqliteStorageDefault, sqliteStoragePrisma };
15
+ //# sourceMappingURL=sqlite-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-storage.js","names":["sqliteStorageDefault: SQLiteStorageMode","sqliteStoragePrisma: SQLiteStorageMode"],"sources":["../../../src/adapters/generic-sql/sqlite-storage.ts"],"sourcesContent":["export type SQLiteDateStorage = \"epoch-ms\" | \"iso-text\";\nexport type SQLiteBigintStorage = \"blob\" | \"integer\";\n\nexport interface SQLiteStorageMode {\n timestampStorage: SQLiteDateStorage;\n dateStorage: SQLiteDateStorage;\n bigintStorage: SQLiteBigintStorage;\n}\n\nexport const sqliteStorageDefault: SQLiteStorageMode = {\n timestampStorage: \"epoch-ms\",\n dateStorage: \"epoch-ms\",\n bigintStorage: \"blob\",\n};\n\nexport const sqliteStoragePrisma: SQLiteStorageMode = {\n timestampStorage: \"iso-text\",\n dateStorage: \"iso-text\",\n bigintStorage: \"integer\",\n};\n"],"mappings":";AASA,MAAaA,uBAA0C;CACrD,kBAAkB;CAClB,aAAa;CACb,eAAe;CAChB;AAED,MAAaC,sBAAyC;CACpD,kBAAkB;CAClB,aAAa;CACb,eAAe;CAChB"}
@@ -10,8 +10,12 @@ import { decodeResult } from "../../query/value-decoding.js";
10
10
  */
11
11
  var UnitOfWorkDecoder = class {
12
12
  #driverConfig;
13
- constructor(driverConfig) {
13
+ #sqliteStorageMode;
14
+ #resolver;
15
+ constructor(driverConfig, sqliteStorageMode, resolver) {
14
16
  this.#driverConfig = driverConfig;
17
+ this.#sqliteStorageMode = sqliteStorageMode;
18
+ this.#resolver = resolver;
15
19
  }
16
20
  /**
17
21
  * Decode raw database results from the retrieval phase
@@ -41,7 +45,7 @@ var UnitOfWorkDecoder = class {
41
45
  */
42
46
  decodeResultSet(rows, operation) {
43
47
  if (operation.type === "count") return this.decodeCountResult(rows);
44
- const decodedRows = rows.map((row) => decodeResult(row, operation.table, this.#driverConfig));
48
+ const decodedRows = rows.map((row) => decodeResult(row, operation.table, this.#driverConfig, this.#sqliteStorageMode, this.#resolver));
45
49
  if (operation.withCursor) return this.decodeCursorResult(decodedRows, operation.table, operation);
46
50
  return decodedRows;
47
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"uow-decoder.js","names":["#driverConfig","cursor: Cursor | undefined"],"sources":["../../../src/adapters/generic-sql/uow-decoder.ts"],"sourcesContent":["import type { UOWDecoder } from \"../../query/unit-of-work/unit-of-work\";\nimport type { RetrievalOperation } from \"../../query/unit-of-work/unit-of-work\";\nimport type { AnySchema, AnyTable } from \"../../schema/create\";\nimport { decodeResult } from \"../../query/value-decoding\";\nimport { createCursorFromRecord, type Cursor, type CursorResult } from \"../../query/cursor\";\nimport type { DriverConfig } from \"./driver-config\";\n\n/**\n * Decoder class for Unit of Work retrieval results.\n *\n * Transforms raw database results into application format (e.g., converting raw columns\n * into FragnoId objects with external ID, internal ID, and version).\n */\nexport class UnitOfWorkDecoder implements UOWDecoder<unknown> {\n readonly #driverConfig: DriverConfig;\n\n constructor(driverConfig: DriverConfig) {\n this.#driverConfig = driverConfig;\n }\n\n /**\n * Decode raw database results from the retrieval phase\n *\n * @param rawResults - Array of raw result sets from database queries\n * @param operations - Array of retrieval operations that produced these results\n * @returns Decoded results in application format\n */\n decode(rawResults: unknown[], 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((rows, index) => {\n const op = operations[index];\n if (!op) {\n throw new Error(\"op must be defined\");\n }\n\n const rowArray = rows as Record<string, unknown>[];\n return this.decodeResultSet(rowArray, op);\n });\n }\n\n /**\n * Decodes a result set based on the operation type.\n *\n * This is the main entry point for decoding query results, routing to the\n * appropriate decoder based on whether it's a count, cursor, or regular query.\n *\n * @param rows - The raw database rows\n * @param operation - The retrieval operation defining how to decode the result\n * @returns The decoded result (number for count, CursorResult for cursor, array otherwise)\n */\n private decodeResultSet(\n rows: Record<string, unknown>[],\n operation: RetrievalOperation<AnySchema>,\n ): number | Record<string, unknown>[] | CursorResult<unknown> {\n // Handle count operations\n if (operation.type === \"count\") {\n return this.decodeCountResult(rows);\n }\n\n const decodedRows = rows.map((row) => decodeResult(row, operation.table, this.#driverConfig));\n\n if (operation.withCursor) {\n return this.decodeCursorResult(decodedRows, operation.table, operation);\n }\n\n return decodedRows;\n }\n\n /**\n * Decodes a count query result to a number.\n *\n * @param rows - The raw database rows (should contain a single row with a count column)\n * @returns The count as a number\n * @throws If the count value is invalid or missing\n */\n private decodeCountResult(rows: Record<string, unknown>[]): number {\n const firstRow = rows[0];\n if (!firstRow) {\n return 0;\n }\n const count = Number(firstRow[\"count\"]);\n if (Number.isNaN(count)) {\n throw new Error(`Unexpected result for count, received: ${count}`);\n }\n return count;\n }\n\n /**\n * Handles cursor generation and hasNextPage detection for cursor-paginated queries.\n *\n * Checks if we received more rows than the requested pageSize (we fetch pageSize + 1).\n *\n * @param decodedRows - The already-decoded database rows (pageSize + 1 rows)\n * @param table - The table schema definition (needed for cursor generation)\n * @param operation - The find operation containing pagination options\n * @returns A CursorResult with items, cursor, and hasNextPage\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 // Check if there are more results (we fetched pageSize + 1)\n if (\n operation.options.pageSize &&\n operation.options.pageSize > 0 &&\n decodedRows.length > operation.options.pageSize\n ) {\n hasNextPage = true;\n // Trim to requested pageSize\n items = decodedRows.slice(0, operation.options.pageSize);\n\n // Generate cursor from the last item we're returning\n if (operation.options.orderByIndex) {\n const lastItem = items[items.length - 1];\n const indexName = operation.options.orderByIndex.indexName;\n\n // Get index columns\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":";;;;;;;;;;AAaA,IAAa,oBAAb,MAA8D;CAC5D,CAASA;CAET,YAAY,cAA4B;AACtC,QAAKA,eAAgB;;;;;;;;;CAUvB,OAAO,YAAuB,YAAwD;AACpF,MAAI,WAAW,WAAW,WAAW,OACnC,OAAM,IAAI,MAAM,+CAA+C;AAGjE,SAAO,WAAW,KAAK,MAAM,UAAU;GACrC,MAAM,KAAK,WAAW;AACtB,OAAI,CAAC,GACH,OAAM,IAAI,MAAM,qBAAqB;GAGvC,MAAM,WAAW;AACjB,UAAO,KAAK,gBAAgB,UAAU,GAAG;IACzC;;;;;;;;;;;;CAaJ,AAAQ,gBACN,MACA,WAC4D;AAE5D,MAAI,UAAU,SAAS,QACrB,QAAO,KAAK,kBAAkB,KAAK;EAGrC,MAAM,cAAc,KAAK,KAAK,QAAQ,aAAa,KAAK,UAAU,OAAO,MAAKA,aAAc,CAAC;AAE7F,MAAI,UAAU,WACZ,QAAO,KAAK,mBAAmB,aAAa,UAAU,OAAO,UAAU;AAGzE,SAAO;;;;;;;;;CAUT,AAAQ,kBAAkB,MAAyC;EACjE,MAAM,WAAW,KAAK;AACtB,MAAI,CAAC,SACH,QAAO;EAET,MAAM,QAAQ,OAAO,SAAS,SAAS;AACvC,MAAI,OAAO,MAAM,MAAM,CACrB,OAAM,IAAI,MAAM,0CAA0C,QAAQ;AAEpE,SAAO;;;;;;;;;;;;CAaT,AAAQ,mBACN,aACA,OACA,WACuB;EACvB,IAAIC;EACJ,IAAI,cAAc;EAClB,IAAI,QAAQ;AAGZ,MACE,UAAU,QAAQ,YAClB,UAAU,QAAQ,WAAW,KAC7B,YAAY,SAAS,UAAU,QAAQ,UACvC;AACA,iBAAc;AAEd,WAAQ,YAAY,MAAM,GAAG,UAAU,QAAQ,SAAS;AAGxD,OAAI,UAAU,QAAQ,cAAc;IAClC,MAAM,WAAW,MAAM,MAAM,SAAS;IACtC,MAAM,YAAY,UAAU,QAAQ,aAAa;IAGjD,IAAI;AACJ,QAAI,cAAc,WAChB,gBAAe,CAAC,MAAM,aAAa,CAAC;SAC/B;KACL,MAAM,QAAQ,MAAM,QAAQ;AAC5B,SAAI,MACF,gBAAe,MAAM;;AAIzB,QAAI,gBAAgB,SAClB,UAAS,uBAAuB,UAAU,cAAc;KACtD,WAAW,UAAU,QAAQ,aAAa;KAC1C,gBAAgB,UAAU,QAAQ,aAAa;KAC/C,UAAU,UAAU,QAAQ;KAC7B,CAAC;;;AAKR,SAAO;GACL;GACA;GACA;GACD"}
1
+ {"version":3,"file":"uow-decoder.js","names":["#driverConfig","#sqliteStorageMode","#resolver","cursor: Cursor | undefined"],"sources":["../../../src/adapters/generic-sql/uow-decoder.ts"],"sourcesContent":["import type { NamingResolver } from \"../../naming/sql-naming\";\nimport { createCursorFromRecord, type Cursor, type CursorResult } from \"../../query/cursor\";\nimport type { UOWDecoder } from \"../../query/unit-of-work/unit-of-work\";\nimport type { RetrievalOperation } from \"../../query/unit-of-work/unit-of-work\";\nimport { decodeResult } from \"../../query/value-decoding\";\nimport type { AnySchema, AnyTable } from \"../../schema/create\";\nimport type { DriverConfig } from \"./driver-config\";\nimport type { SQLiteStorageMode } from \"./sqlite-storage\";\n\n/**\n * Decoder class for Unit of Work retrieval results.\n *\n * Transforms raw database results into application format (e.g., converting raw columns\n * into FragnoId objects with external ID, internal ID, and version).\n */\nexport class UnitOfWorkDecoder implements UOWDecoder<unknown> {\n readonly #driverConfig: DriverConfig;\n readonly #sqliteStorageMode?: SQLiteStorageMode;\n readonly #resolver?: NamingResolver;\n\n constructor(\n driverConfig: DriverConfig,\n sqliteStorageMode?: SQLiteStorageMode,\n resolver?: NamingResolver,\n ) {\n this.#driverConfig = driverConfig;\n this.#sqliteStorageMode = sqliteStorageMode;\n this.#resolver = resolver;\n }\n\n /**\n * Decode raw database results from the retrieval phase\n *\n * @param rawResults - Array of raw result sets from database queries\n * @param operations - Array of retrieval operations that produced these results\n * @returns Decoded results in application format\n */\n decode(rawResults: unknown[], 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((rows, index) => {\n const op = operations[index];\n if (!op) {\n throw new Error(\"op must be defined\");\n }\n\n const rowArray = rows as Record<string, unknown>[];\n return this.decodeResultSet(rowArray, op);\n });\n }\n\n /**\n * Decodes a result set based on the operation type.\n *\n * This is the main entry point for decoding query results, routing to the\n * appropriate decoder based on whether it's a count, cursor, or regular query.\n *\n * @param rows - The raw database rows\n * @param operation - The retrieval operation defining how to decode the result\n * @returns The decoded result (number for count, CursorResult for cursor, array otherwise)\n */\n private decodeResultSet(\n rows: Record<string, unknown>[],\n operation: RetrievalOperation<AnySchema>,\n ): number | Record<string, unknown>[] | CursorResult<unknown> {\n // Handle count operations\n if (operation.type === \"count\") {\n return this.decodeCountResult(rows);\n }\n\n const decodedRows = rows.map((row) =>\n decodeResult(\n row,\n operation.table,\n this.#driverConfig,\n this.#sqliteStorageMode,\n this.#resolver,\n ),\n );\n\n if (operation.withCursor) {\n return this.decodeCursorResult(decodedRows, operation.table, operation);\n }\n\n return decodedRows;\n }\n\n /**\n * Decodes a count query result to a number.\n *\n * @param rows - The raw database rows (should contain a single row with a count column)\n * @returns The count as a number\n * @throws If the count value is invalid or missing\n */\n private decodeCountResult(rows: Record<string, unknown>[]): number {\n const firstRow = rows[0];\n if (!firstRow) {\n return 0;\n }\n const count = Number(firstRow[\"count\"]);\n if (Number.isNaN(count)) {\n throw new Error(`Unexpected result for count, received: ${count}`);\n }\n return count;\n }\n\n /**\n * Handles cursor generation and hasNextPage detection for cursor-paginated queries.\n *\n * Checks if we received more rows than the requested pageSize (we fetch pageSize + 1).\n *\n * @param decodedRows - The already-decoded database rows (pageSize + 1 rows)\n * @param table - The table schema definition (needed for cursor generation)\n * @param operation - The find operation containing pagination options\n * @returns A CursorResult with items, cursor, and hasNextPage\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 // Check if there are more results (we fetched pageSize + 1)\n if (\n operation.options.pageSize &&\n operation.options.pageSize > 0 &&\n decodedRows.length > operation.options.pageSize\n ) {\n hasNextPage = true;\n // Trim to requested pageSize\n items = decodedRows.slice(0, operation.options.pageSize);\n\n // Generate cursor from the last item we're returning\n if (operation.options.orderByIndex) {\n const lastItem = items[items.length - 1];\n const indexName = operation.options.orderByIndex.indexName;\n\n // Get index columns\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":";;;;;;;;;;AAeA,IAAa,oBAAb,MAA8D;CAC5D,CAASA;CACT,CAASC;CACT,CAASC;CAET,YACE,cACA,mBACA,UACA;AACA,QAAKF,eAAgB;AACrB,QAAKC,oBAAqB;AAC1B,QAAKC,WAAY;;;;;;;;;CAUnB,OAAO,YAAuB,YAAwD;AACpF,MAAI,WAAW,WAAW,WAAW,OACnC,OAAM,IAAI,MAAM,+CAA+C;AAGjE,SAAO,WAAW,KAAK,MAAM,UAAU;GACrC,MAAM,KAAK,WAAW;AACtB,OAAI,CAAC,GACH,OAAM,IAAI,MAAM,qBAAqB;GAGvC,MAAM,WAAW;AACjB,UAAO,KAAK,gBAAgB,UAAU,GAAG;IACzC;;;;;;;;;;;;CAaJ,AAAQ,gBACN,MACA,WAC4D;AAE5D,MAAI,UAAU,SAAS,QACrB,QAAO,KAAK,kBAAkB,KAAK;EAGrC,MAAM,cAAc,KAAK,KAAK,QAC5B,aACE,KACA,UAAU,OACV,MAAKF,cACL,MAAKC,mBACL,MAAKC,SACN,CACF;AAED,MAAI,UAAU,WACZ,QAAO,KAAK,mBAAmB,aAAa,UAAU,OAAO,UAAU;AAGzE,SAAO;;;;;;;;;CAUT,AAAQ,kBAAkB,MAAyC;EACjE,MAAM,WAAW,KAAK;AACtB,MAAI,CAAC,SACH,QAAO;EAET,MAAM,QAAQ,OAAO,SAAS,SAAS;AACvC,MAAI,OAAO,MAAM,MAAM,CACrB,OAAM,IAAI,MAAM,0CAA0C,QAAQ;AAEpE,SAAO;;;;;;;;;;;;CAaT,AAAQ,mBACN,aACA,OACA,WACuB;EACvB,IAAIC;EACJ,IAAI,cAAc;EAClB,IAAI,QAAQ;AAGZ,MACE,UAAU,QAAQ,YAClB,UAAU,QAAQ,WAAW,KAC7B,YAAY,SAAS,UAAU,QAAQ,UACvC;AACA,iBAAc;AAEd,WAAQ,YAAY,MAAM,GAAG,UAAU,QAAQ,SAAS;AAGxD,OAAI,UAAU,QAAQ,cAAc;IAClC,MAAM,WAAW,MAAM,MAAM,SAAS;IACtC,MAAM,YAAY,UAAU,QAAQ,aAAa;IAGjD,IAAI;AACJ,QAAI,cAAc,WAChB,gBAAe,CAAC,MAAM,aAAa,CAAC;SAC/B;KACL,MAAM,QAAQ,MAAM,QAAQ;AAC5B,SAAI,MACF,gBAAe,MAAM;;AAIzB,QAAI,gBAAgB,SAClB,UAAS,uBAAuB,UAAU,cAAc;KACtD,WAAW,UAAU,QAAQ,aAAa;KAC1C,gBAAgB,UAAU,QAAQ,aAAa;KAC/C,UAAU,UAAU,QAAQ;KAC7B,CAAC;;;AAKR,SAAO;GACL;GACA;GACA;GACD"}
@@ -1,5 +1,7 @@
1
+ import { getDbNowOffsetMs, isDbNow } from "../../query/db-now.js";
1
2
  import { createSQLSerializer } from "../../query/serialize/create-sql-serializer.js";
2
3
  import { encodeValues } from "../../query/value-encoding.js";
4
+ import { buildDbNowSql } from "./query/db-now-sql.js";
3
5
  import { processReferenceSubqueries } from "./query/where-builder.js";
4
6
 
5
7
  //#region src/adapters/generic-sql/uow-encoder.ts
@@ -15,13 +17,17 @@ import { processReferenceSubqueries } from "./query/where-builder.js";
15
17
  * This class mirrors the UnitOfWorkDecoder pattern for symmetry.
16
18
  */
17
19
  var UnitOfWorkEncoder = class {
20
+ #driverConfig;
18
21
  #serializer;
19
22
  #db;
20
- #mapper;
21
- constructor(driverConfig, db, mapper) {
22
- this.#serializer = createSQLSerializer(driverConfig);
23
+ #sqliteStorageMode;
24
+ #resolver;
25
+ constructor(driverConfig, db, sqliteStorageMode, resolver) {
26
+ this.#driverConfig = driverConfig;
27
+ this.#serializer = createSQLSerializer(driverConfig, sqliteStorageMode);
23
28
  this.#db = db;
24
- this.#mapper = mapper;
29
+ this.#sqliteStorageMode = sqliteStorageMode;
30
+ this.#resolver = resolver;
25
31
  }
26
32
  /**
27
33
  * Encode application values to database-ready format.
@@ -49,7 +55,7 @@ var UnitOfWorkEncoder = class {
49
55
  * ```
50
56
  */
51
57
  encodeForDatabase(options) {
52
- const processed = processReferenceSubqueries(encodeValues(options.values, options.table, options.generateDefaults), this.#db, this.#mapper);
58
+ const processed = processReferenceSubqueries(encodeValues(options.values, options.table, options.generateDefaults, {}, this.#resolver), this.#db, this.#resolver);
53
59
  return this.serializeValues(processed, options.table);
54
60
  }
55
61
  /**
@@ -66,12 +72,22 @@ var UnitOfWorkEncoder = class {
66
72
  */
67
73
  serializeValues(values, table) {
68
74
  const result = {};
75
+ const columnMap = this.#resolver ? this.#resolver.getColumnNameMap(table) : void 0;
69
76
  for (const [dbColumnName, value] of Object.entries(values)) {
70
- const col = this.findColumnByDbName(table, dbColumnName);
77
+ const col = this.findColumnByDbName(table, dbColumnName, columnMap);
71
78
  if (!col) {
72
79
  result[dbColumnName] = value;
73
80
  continue;
74
81
  }
82
+ if (isDbNow(value)) {
83
+ result[dbColumnName] = buildDbNowSql({
84
+ driverConfig: this.#driverConfig,
85
+ columnType: col.type,
86
+ offsetMs: getDbNowOffsetMs(value),
87
+ sqliteStorageMode: this.#sqliteStorageMode
88
+ });
89
+ continue;
90
+ }
75
91
  result[dbColumnName] = this.#serializer.serialize(value, col);
76
92
  }
77
93
  return result;
@@ -83,8 +99,11 @@ var UnitOfWorkEncoder = class {
83
99
  * @param dbColumnName - The database column name (e.g., "user_id")
84
100
  * @returns The column definition or undefined if not found
85
101
  */
86
- findColumnByDbName(table, dbColumnName) {
87
- for (const col of Object.values(table.columns)) if (col.name === dbColumnName) return col;
102
+ findColumnByDbName(table, dbColumnName, columnMap) {
103
+ const logicalName = columnMap?.[dbColumnName] ?? dbColumnName;
104
+ const direct = table.columns[logicalName];
105
+ if (direct) return direct;
106
+ for (const col of Object.values(table.columns)) if (col.name === logicalName) return col;
88
107
  }
89
108
  };
90
109
 
@@ -1 +1 @@
1
- {"version":3,"file":"uow-encoder.js","names":["#serializer","#db","#mapper","result: Record<string, unknown>"],"sources":["../../../src/adapters/generic-sql/uow-encoder.ts"],"sourcesContent":["import type { AnyTable, AnyColumn } from \"../../schema/create\";\nimport type { DriverConfig } from \"./driver-config\";\nimport {\n createSQLSerializer,\n type SQLSerializer,\n} from \"../../query/serialize/create-sql-serializer\";\nimport { encodeValues } from \"../../query/value-encoding\";\nimport { processReferenceSubqueries } from \"./query/where-builder\";\nimport type { TableNameMapper } from \"../shared/table-name-mapper\";\nimport type { Kysely } from \"kysely\";\n\n/**\n * Encoder class for Unit of Work mutation operations.\n *\n * Handles the complete transformation from application values to database-ready values\n * in three clear steps:\n * 1. Resolution - Resolve FragnoId/FragnoReference objects and generate defaults\n * 2. Reference Processing - Create subqueries for external ID lookups\n * 3. Serialization - Apply database-specific type conversions\n *\n * This class mirrors the UnitOfWorkDecoder pattern for symmetry.\n */\nexport class UnitOfWorkEncoder {\n readonly #serializer: SQLSerializer;\n readonly #db: Kysely<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n readonly #mapper?: TableNameMapper;\n\n constructor(\n driverConfig: DriverConfig,\n db: Kysely<any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n mapper?: TableNameMapper,\n ) {\n this.#serializer = createSQLSerializer(driverConfig);\n this.#db = db;\n this.#mapper = mapper;\n }\n\n /**\n * Encode application values to database-ready format.\n *\n * This is the main entry point that handles all encoding steps:\n * 1. **Resolution**: Transform ORM names to DB columns, resolve FragnoId/FragnoReference,\n * generate defaults (CUIDs for IDs, etc.)\n * 2. **Reference Processing**: Convert external ID strings to subqueries for internal ID lookup\n * 3. **Serialization**: Apply database-specific conversions (Date → number for SQLite, etc.)\n *\n * @param options - Encoding options\n * @param options.values - Application values to encode\n * @param options.table - Table schema definition\n * @param options.generateDefaults - Whether to generate default values for undefined columns\n * @returns Database-ready values\n *\n * @example\n * ```ts\n * const encoded = encoder.encodeForDatabase({\n * values: { userId: FragnoId(...), createdAt: new Date(), isActive: true },\n * table: usersTable,\n * generateDefaults: true\n * });\n * // For SQLite: { user_id: 456, created_at: 1705316400000, is_active: 1 }\n * ```\n */\n encodeForDatabase(options: {\n values: Record<string, unknown>;\n table: AnyTable;\n generateDefaults: boolean;\n }): Record<string, unknown> {\n // Step 1: Resolution - Resolve FragnoId/FragnoReference and generate defaults\n const resolved = encodeValues(options.values, options.table, options.generateDefaults);\n\n // Step 2: Reference Processing - Convert external IDs to subqueries\n const processed = processReferenceSubqueries(resolved, this.#db, this.#mapper);\n\n // Step 3: Serialization - Apply database-specific type conversions\n const serialized = this.serializeValues(processed, options.table);\n\n return serialized;\n }\n\n /**\n * Serialize resolved values to database format.\n *\n * Applies database-specific type conversions:\n * - SQLite: Date → number, boolean → 0/1, bigint → Buffer (or Number for reference columns)\n * - PostgreSQL: Mostly pass-through (database handles types natively)\n * - MySQL: Mostly pass-through\n *\n * @param values - Resolved values (after resolution and reference processing)\n * @param table - The table schema definition\n * @returns Serialized values ready for database driver\n */\n private serializeValues(\n values: Record<string, unknown>,\n table: AnyTable,\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [dbColumnName, value] of Object.entries(values)) {\n // Find the column definition by database column name\n const col = this.findColumnByDbName(table, dbColumnName);\n\n if (!col) {\n // Not a regular column (might be a special value like sql.raw())\n // Pass through as-is\n result[dbColumnName] = value;\n continue;\n }\n\n // Serialize the value using the column definition and database type\n result[dbColumnName] = this.#serializer.serialize(value, col);\n }\n\n return result;\n }\n\n /**\n * Find a column definition by its database column name.\n *\n * @param table - The table to search\n * @param dbColumnName - The database column name (e.g., \"user_id\")\n * @returns The column definition or undefined if not found\n */\n private findColumnByDbName(table: AnyTable, dbColumnName: string): AnyColumn | undefined {\n for (const col of Object.values(table.columns)) {\n if (col.name === dbColumnName) {\n return col;\n }\n }\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAsBA,IAAa,oBAAb,MAA+B;CAC7B,CAASA;CACT,CAASC;CACT,CAASC;CAET,YACE,cACA,IACA,QACA;AACA,QAAKF,aAAc,oBAAoB,aAAa;AACpD,QAAKC,KAAM;AACX,QAAKC,SAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BjB,kBAAkB,SAIU;EAK1B,MAAM,YAAY,2BAHD,aAAa,QAAQ,QAAQ,QAAQ,OAAO,QAAQ,iBAAiB,EAG/B,MAAKD,IAAK,MAAKC,OAAQ;AAK9E,SAFmB,KAAK,gBAAgB,WAAW,QAAQ,MAAM;;;;;;;;;;;;;;CAiBnE,AAAQ,gBACN,QACA,OACyB;EACzB,MAAMC,SAAkC,EAAE;AAE1C,OAAK,MAAM,CAAC,cAAc,UAAU,OAAO,QAAQ,OAAO,EAAE;GAE1D,MAAM,MAAM,KAAK,mBAAmB,OAAO,aAAa;AAExD,OAAI,CAAC,KAAK;AAGR,WAAO,gBAAgB;AACvB;;AAIF,UAAO,gBAAgB,MAAKH,WAAY,UAAU,OAAO,IAAI;;AAG/D,SAAO;;;;;;;;;CAUT,AAAQ,mBAAmB,OAAiB,cAA6C;AACvF,OAAK,MAAM,OAAO,OAAO,OAAO,MAAM,QAAQ,CAC5C,KAAI,IAAI,SAAS,aACf,QAAO"}
1
+ {"version":3,"file":"uow-encoder.js","names":["#driverConfig","#serializer","#db","#sqliteStorageMode","#resolver","result: Record<string, unknown>"],"sources":["../../../src/adapters/generic-sql/uow-encoder.ts"],"sourcesContent":["import type { Kysely } from \"kysely\";\n\nimport type { NamingResolver } from \"../../naming/sql-naming\";\nimport { getDbNowOffsetMs, isDbNow } from \"../../query/db-now\";\nimport {\n createSQLSerializer,\n type SQLSerializer,\n} from \"../../query/serialize/create-sql-serializer\";\nimport { encodeValues } from \"../../query/value-encoding\";\nimport type { AnyTable, AnyColumn } from \"../../schema/create\";\nimport type { DriverConfig } from \"./driver-config\";\nimport { buildDbNowSql } from \"./query/db-now-sql\";\nimport { processReferenceSubqueries } from \"./query/where-builder\";\nimport type { SQLiteStorageMode } from \"./sqlite-storage\";\n\n/**\n * Encoder class for Unit of Work mutation operations.\n *\n * Handles the complete transformation from application values to database-ready values\n * in three clear steps:\n * 1. Resolution - Resolve FragnoId/FragnoReference objects and generate defaults\n * 2. Reference Processing - Create subqueries for external ID lookups\n * 3. Serialization - Apply database-specific type conversions\n *\n * This class mirrors the UnitOfWorkDecoder pattern for symmetry.\n */\nexport class UnitOfWorkEncoder {\n readonly #driverConfig: DriverConfig;\n readonly #serializer: SQLSerializer;\n readonly #db: Kysely<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n readonly #sqliteStorageMode?: SQLiteStorageMode;\n readonly #resolver?: NamingResolver;\n\n constructor(\n driverConfig: DriverConfig,\n db: Kysely<any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n sqliteStorageMode?: SQLiteStorageMode,\n resolver?: NamingResolver,\n ) {\n this.#driverConfig = driverConfig;\n this.#serializer = createSQLSerializer(driverConfig, sqliteStorageMode);\n this.#db = db;\n this.#sqliteStorageMode = sqliteStorageMode;\n this.#resolver = resolver;\n }\n\n /**\n * Encode application values to database-ready format.\n *\n * This is the main entry point that handles all encoding steps:\n * 1. **Resolution**: Transform ORM names to DB columns, resolve FragnoId/FragnoReference,\n * generate defaults (CUIDs for IDs, etc.)\n * 2. **Reference Processing**: Convert external ID strings to subqueries for internal ID lookup\n * 3. **Serialization**: Apply database-specific conversions (Date → number for SQLite, etc.)\n *\n * @param options - Encoding options\n * @param options.values - Application values to encode\n * @param options.table - Table schema definition\n * @param options.generateDefaults - Whether to generate default values for undefined columns\n * @returns Database-ready values\n *\n * @example\n * ```ts\n * const encoded = encoder.encodeForDatabase({\n * values: { userId: FragnoId(...), createdAt: new Date(), isActive: true },\n * table: usersTable,\n * generateDefaults: true\n * });\n * // For SQLite: { user_id: 456, created_at: 1705316400000, is_active: 1 }\n * ```\n */\n encodeForDatabase(options: {\n values: Record<string, unknown>;\n table: AnyTable;\n generateDefaults: boolean;\n }): Record<string, unknown> {\n // Step 1: Resolution - Resolve FragnoId/FragnoReference and generate defaults\n const resolved = encodeValues(\n options.values,\n options.table,\n options.generateDefaults,\n {},\n this.#resolver,\n );\n\n // Step 2: Reference Processing - Convert external IDs to subqueries\n const processed = processReferenceSubqueries(resolved, this.#db, this.#resolver);\n\n // Step 3: Serialization - Apply database-specific type conversions\n const serialized = this.serializeValues(processed, options.table);\n\n return serialized;\n }\n\n /**\n * Serialize resolved values to database format.\n *\n * Applies database-specific type conversions:\n * - SQLite: Date → number, boolean → 0/1, bigint → Buffer (or Number for reference columns)\n * - PostgreSQL: Mostly pass-through (database handles types natively)\n * - MySQL: Mostly pass-through\n *\n * @param values - Resolved values (after resolution and reference processing)\n * @param table - The table schema definition\n * @returns Serialized values ready for database driver\n */\n private serializeValues(\n values: Record<string, unknown>,\n table: AnyTable,\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const columnMap = this.#resolver ? this.#resolver.getColumnNameMap(table) : undefined;\n\n for (const [dbColumnName, value] of Object.entries(values)) {\n // Find the column definition by database column name\n const col = this.findColumnByDbName(table, dbColumnName, columnMap);\n\n if (!col) {\n // Not a regular column (might be a special value like sql.raw())\n // Pass through as-is\n result[dbColumnName] = value;\n continue;\n }\n\n if (isDbNow(value)) {\n result[dbColumnName] = buildDbNowSql({\n driverConfig: this.#driverConfig,\n columnType: col.type,\n offsetMs: getDbNowOffsetMs(value),\n sqliteStorageMode: this.#sqliteStorageMode,\n });\n continue;\n }\n\n // Serialize the value using the column definition and database type\n result[dbColumnName] = this.#serializer.serialize(value, col);\n }\n\n return result;\n }\n\n /**\n * Find a column definition by its database column name.\n *\n * @param table - The table to search\n * @param dbColumnName - The database column name (e.g., \"user_id\")\n * @returns The column definition or undefined if not found\n */\n private findColumnByDbName(\n table: AnyTable,\n dbColumnName: string,\n columnMap?: Record<string, string>,\n ): AnyColumn | undefined {\n const logicalName = columnMap?.[dbColumnName] ?? dbColumnName;\n const direct = table.columns[logicalName];\n if (direct) {\n return direct;\n }\n for (const col of Object.values(table.columns)) {\n if (col.name === logicalName) {\n return col;\n }\n }\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA0BA,IAAa,oBAAb,MAA+B;CAC7B,CAASA;CACT,CAASC;CACT,CAASC;CACT,CAASC;CACT,CAASC;CAET,YACE,cACA,IACA,mBACA,UACA;AACA,QAAKJ,eAAgB;AACrB,QAAKC,aAAc,oBAAoB,cAAc,kBAAkB;AACvE,QAAKC,KAAM;AACX,QAAKC,oBAAqB;AAC1B,QAAKC,WAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BnB,kBAAkB,SAIU;EAW1B,MAAM,YAAY,2BATD,aACf,QAAQ,QACR,QAAQ,OACR,QAAQ,kBACR,EAAE,EACF,MAAKA,SACN,EAGsD,MAAKF,IAAK,MAAKE,SAAU;AAKhF,SAFmB,KAAK,gBAAgB,WAAW,QAAQ,MAAM;;;;;;;;;;;;;;CAiBnE,AAAQ,gBACN,QACA,OACyB;EACzB,MAAMC,SAAkC,EAAE;EAC1C,MAAM,YAAY,MAAKD,WAAY,MAAKA,SAAU,iBAAiB,MAAM,GAAG;AAE5E,OAAK,MAAM,CAAC,cAAc,UAAU,OAAO,QAAQ,OAAO,EAAE;GAE1D,MAAM,MAAM,KAAK,mBAAmB,OAAO,cAAc,UAAU;AAEnE,OAAI,CAAC,KAAK;AAGR,WAAO,gBAAgB;AACvB;;AAGF,OAAI,QAAQ,MAAM,EAAE;AAClB,WAAO,gBAAgB,cAAc;KACnC,cAAc,MAAKJ;KACnB,YAAY,IAAI;KAChB,UAAU,iBAAiB,MAAM;KACjC,mBAAmB,MAAKG;KACzB,CAAC;AACF;;AAIF,UAAO,gBAAgB,MAAKF,WAAY,UAAU,OAAO,IAAI;;AAG/D,SAAO;;;;;;;;;CAUT,AAAQ,mBACN,OACA,cACA,WACuB;EACvB,MAAM,cAAc,YAAY,iBAAiB;EACjD,MAAM,SAAS,MAAM,QAAQ;AAC7B,MAAI,OACF,QAAO;AAET,OAAK,MAAM,OAAO,OAAO,OAAO,MAAM,QAAQ,CAC5C,KAAI,IAAI,SAAS,YACf,QAAO"}
@@ -0,0 +1,135 @@
1
+ import { getDbNowOffsetMs, isDbNow } from "../../query/db-now.js";
2
+ import { Column, FragnoId, FragnoReference } from "../../schema/create.js";
3
+ import { ReferenceSubquery, resolveFragnoIdValue } from "../../query/value-encoding.js";
4
+ import { resolveReferenceSubquery } from "./reference-resolution.js";
5
+ import { compareNormalizedValues } from "./value-comparison.js";
6
+ import { normalizeIndexValue } from "./store.js";
7
+
8
+ //#region src/adapters/in-memory/condition-evaluator.ts
9
+ const isNullish = (value) => value === null || value === void 0;
10
+ const resolveReferenceValue = (value, column, table, namespaceStore, resolver) => {
11
+ if (value instanceof FragnoReference) return value.internalId;
12
+ if (value instanceof FragnoId) {
13
+ if (value.internalId !== void 0) return value.internalId;
14
+ return resolveReferenceValue(value.externalId, column, table, namespaceStore, resolver);
15
+ }
16
+ if (value instanceof ReferenceSubquery) {
17
+ if (!namespaceStore) throw new Error("In-memory condition evaluation requires a namespace store.");
18
+ return resolveReferenceSubquery(namespaceStore, value, resolver);
19
+ }
20
+ if (typeof value === "string") {
21
+ if (!namespaceStore) throw new Error("In-memory condition evaluation requires a namespace store.");
22
+ const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === column.name));
23
+ if (!relation) throw new Error(`Missing relation for reference column "${column.name}".`);
24
+ return resolveReferenceSubquery(namespaceStore, new ReferenceSubquery(relation.table, value), resolver);
25
+ }
26
+ return resolveFragnoIdValue(value, column);
27
+ };
28
+ const resolveComparisonValue = (value, column, table, row, namespaceStore, resolver, now = () => /* @__PURE__ */ new Date()) => {
29
+ if (value instanceof Column) return {
30
+ value: row[resolver ? resolver.getColumnName(table.name, value.name) : value.name],
31
+ column: value
32
+ };
33
+ if (isDbNow(value)) {
34
+ const base = now();
35
+ const offsetMs = getDbNowOffsetMs(value);
36
+ return {
37
+ value: offsetMs === 0 ? base : new Date(base.getTime() + offsetMs),
38
+ column
39
+ };
40
+ }
41
+ if (column.role === "reference") return {
42
+ value: resolveReferenceValue(value, column, table, namespaceStore, resolver),
43
+ column
44
+ };
45
+ return {
46
+ value: resolveFragnoIdValue(value, column),
47
+ column
48
+ };
49
+ };
50
+ const normalizeLikeValue = (value, column) => {
51
+ const normalized = normalizeIndexValue(value, column);
52
+ if (normalized === null || normalized === void 0) return null;
53
+ if (normalized instanceof Buffer) return normalized.toString("hex");
54
+ return String(normalized);
55
+ };
56
+ const compareNormalized = (left, right) => compareNormalizedValues(left, right);
57
+ const evaluateCondition = (condition, table, row, namespaceStore, resolver, now = () => /* @__PURE__ */ new Date()) => {
58
+ if (typeof condition === "boolean") return condition;
59
+ switch (condition.type) {
60
+ case "and":
61
+ for (const item of condition.items) if (!evaluateCondition(item, table, row, namespaceStore, resolver, now)) return false;
62
+ return true;
63
+ case "or":
64
+ for (const item of condition.items) if (evaluateCondition(item, table, row, namespaceStore, resolver, now)) return true;
65
+ return false;
66
+ case "not": return !evaluateCondition(condition.item, table, row, namespaceStore, resolver, now);
67
+ case "compare": break;
68
+ default: {
69
+ const exhaustiveCheck = condition;
70
+ throw new Error(`Unsupported condition type: ${JSON.stringify(exhaustiveCheck)}`);
71
+ }
72
+ }
73
+ const leftColumn = condition.a;
74
+ const leftValue = row[resolver ? resolver.getColumnName(table.name, leftColumn.name) : leftColumn.name];
75
+ const right = resolveComparisonValue(condition.b, leftColumn, table, row, namespaceStore, resolver, now);
76
+ const op = condition.operator;
77
+ const rightValue = right.value;
78
+ if (op === "is" || op === "is not") {
79
+ if (isNullish(rightValue)) {
80
+ const matches$1 = isNullish(leftValue);
81
+ return op === "is" ? matches$1 : !matches$1;
82
+ }
83
+ if (isNullish(leftValue)) return op === "is not";
84
+ const matches = compareNormalized(normalizeIndexValue(leftValue, leftColumn), normalizeIndexValue(rightValue, right.column)) === 0;
85
+ return op === "is" ? matches : !matches;
86
+ }
87
+ if (isNullish(leftValue) || isNullish(rightValue)) return false;
88
+ if (op === "in" || op === "not in") {
89
+ if (!Array.isArray(rightValue)) throw new Error(`Operator "${op}" expects an array value.`);
90
+ const leftNormalized = normalizeIndexValue(leftValue, leftColumn);
91
+ let hasNull = false;
92
+ let hasMatch = false;
93
+ for (const item of rightValue) {
94
+ const resolved = resolveComparisonValue(item, leftColumn, table, row, namespaceStore, resolver, now);
95
+ if (isNullish(resolved.value)) {
96
+ hasNull = true;
97
+ continue;
98
+ }
99
+ if (compareNormalized(leftNormalized, normalizeIndexValue(resolved.value, leftColumn)) === 0) {
100
+ hasMatch = true;
101
+ break;
102
+ }
103
+ }
104
+ if (hasMatch) return op === "in";
105
+ if (hasNull) return false;
106
+ return op === "not in";
107
+ }
108
+ if (op === "contains" || op === "starts with" || op === "ends with" || op === "not contains" || op === "not starts with" || op === "not ends with") {
109
+ const leftLike = normalizeLikeValue(leftValue, leftColumn);
110
+ const rightLike = normalizeLikeValue(rightValue, right.column);
111
+ if (leftLike === null || rightLike === null) return false;
112
+ const leftText = leftLike.toLowerCase();
113
+ const rightText = rightLike.toLowerCase();
114
+ let matches = false;
115
+ if (op.includes("contains")) matches = leftText.includes(rightText);
116
+ else if (op.includes("starts with")) matches = leftText.startsWith(rightText);
117
+ else matches = leftText.endsWith(rightText);
118
+ if (op.startsWith("not ")) return !matches;
119
+ return matches;
120
+ }
121
+ const comparison = compareNormalized(normalizeIndexValue(leftValue, leftColumn), normalizeIndexValue(rightValue, right.column));
122
+ switch (op) {
123
+ case "=": return comparison === 0;
124
+ case "!=": return comparison !== 0;
125
+ case ">": return comparison > 0;
126
+ case ">=": return comparison >= 0;
127
+ case "<": return comparison < 0;
128
+ case "<=": return comparison <= 0;
129
+ default: throw new Error(`Unsupported operator "${op}".`);
130
+ }
131
+ };
132
+
133
+ //#endregion
134
+ export { evaluateCondition };
135
+ //# sourceMappingURL=condition-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-evaluator.js","names":["exhaustiveCheck: never","matches"],"sources":["../../../src/adapters/in-memory/condition-evaluator.ts"],"sourcesContent":["import type { NamingResolver } from \"../../naming/sql-naming\";\nimport type { Condition } from \"../../query/condition-builder\";\nimport { getDbNowOffsetMs, isDbNow } from \"../../query/db-now\";\nimport { ReferenceSubquery, resolveFragnoIdValue } from \"../../query/value-encoding\";\nimport type { AnyColumn, AnyTable } from \"../../schema/create\";\nimport { Column, FragnoId, FragnoReference } from \"../../schema/create\";\nimport { resolveReferenceSubquery } from \"./reference-resolution\";\nimport type { InMemoryNamespaceStore, InMemoryRow } from \"./store\";\nimport { normalizeIndexValue } from \"./store\";\nimport { compareNormalizedValues } from \"./value-comparison\";\n\nconst isNullish = (value: unknown): value is null | undefined =>\n value === null || value === undefined;\n\nconst resolveReferenceValue = (\n value: unknown,\n column: AnyColumn,\n table: AnyTable,\n namespaceStore?: InMemoryNamespaceStore,\n resolver?: NamingResolver,\n): unknown => {\n if (value instanceof FragnoReference) {\n return value.internalId;\n }\n\n if (value instanceof FragnoId) {\n if (value.internalId !== undefined) {\n return value.internalId;\n }\n return resolveReferenceValue(value.externalId, column, table, namespaceStore, resolver);\n }\n\n if (value instanceof ReferenceSubquery) {\n if (!namespaceStore) {\n throw new Error(\"In-memory condition evaluation requires a namespace store.\");\n }\n return resolveReferenceSubquery(namespaceStore, value, resolver);\n }\n\n if (typeof value === \"string\") {\n if (!namespaceStore) {\n throw new Error(\"In-memory condition evaluation requires a namespace store.\");\n }\n\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === column.name),\n );\n if (!relation) {\n throw new Error(`Missing relation for reference column \"${column.name}\".`);\n }\n\n return resolveReferenceSubquery(\n namespaceStore,\n new ReferenceSubquery(relation.table, value),\n resolver,\n );\n }\n\n return resolveFragnoIdValue(value, column);\n};\n\nconst resolveComparisonValue = (\n value: unknown,\n column: AnyColumn,\n table: AnyTable,\n row: InMemoryRow,\n namespaceStore?: InMemoryNamespaceStore,\n resolver?: NamingResolver,\n now: () => Date = () => new Date(),\n): { value: unknown; column: AnyColumn } => {\n if (value instanceof Column) {\n const columnName = resolver ? resolver.getColumnName(table.name, value.name) : value.name;\n return { value: row[columnName], column: value };\n }\n\n if (isDbNow(value)) {\n const base = now();\n const offsetMs = getDbNowOffsetMs(value);\n return {\n value: offsetMs === 0 ? base : new Date(base.getTime() + offsetMs),\n column,\n };\n }\n\n if (column.role === \"reference\") {\n return {\n value: resolveReferenceValue(value, column, table, namespaceStore, resolver),\n column,\n };\n }\n\n return { value: resolveFragnoIdValue(value, column), column };\n};\n\nconst normalizeLikeValue = (value: unknown, column: AnyColumn): string | null => {\n const normalized = normalizeIndexValue(value, column);\n if (normalized === null || normalized === undefined) {\n return null;\n }\n if (normalized instanceof Buffer) {\n return normalized.toString(\"hex\");\n }\n return String(normalized);\n};\n\nconst compareNormalized = (left: unknown, right: unknown): number =>\n compareNormalizedValues(left, right);\n\nexport const evaluateCondition = (\n condition: Condition | boolean,\n table: AnyTable,\n row: InMemoryRow,\n namespaceStore?: InMemoryNamespaceStore,\n resolver?: NamingResolver,\n now: () => Date = () => new Date(),\n): boolean => {\n if (typeof condition === \"boolean\") {\n return condition;\n }\n\n switch (condition.type) {\n case \"and\": {\n for (const item of condition.items) {\n if (!evaluateCondition(item, table, row, namespaceStore, resolver, now)) {\n return false;\n }\n }\n return true;\n }\n case \"or\": {\n for (const item of condition.items) {\n if (evaluateCondition(item, table, row, namespaceStore, resolver, now)) {\n return true;\n }\n }\n return false;\n }\n case \"not\":\n return !evaluateCondition(condition.item, table, row, namespaceStore, resolver, now);\n case \"compare\":\n break;\n default: {\n const exhaustiveCheck: never = condition;\n throw new Error(`Unsupported condition type: ${JSON.stringify(exhaustiveCheck)}`);\n }\n }\n\n const leftColumn = condition.a;\n const leftColumnName = resolver\n ? resolver.getColumnName(table.name, leftColumn.name)\n : leftColumn.name;\n const leftValue = row[leftColumnName];\n const right = resolveComparisonValue(\n condition.b,\n leftColumn,\n table,\n row,\n namespaceStore,\n resolver,\n now,\n );\n\n const op = condition.operator;\n const rightValue = right.value;\n\n if (op === \"is\" || op === \"is not\") {\n if (isNullish(rightValue)) {\n const matches = isNullish(leftValue);\n return op === \"is\" ? matches : !matches;\n }\n\n if (isNullish(leftValue)) {\n return op === \"is not\";\n }\n\n const leftNormalized = normalizeIndexValue(leftValue, leftColumn);\n const rightNormalized = normalizeIndexValue(rightValue, right.column);\n const matches = compareNormalized(leftNormalized, rightNormalized) === 0;\n return op === \"is\" ? matches : !matches;\n }\n\n if (isNullish(leftValue) || isNullish(rightValue)) {\n return false;\n }\n\n if (op === \"in\" || op === \"not in\") {\n if (!Array.isArray(rightValue)) {\n throw new Error(`Operator \"${op}\" expects an array value.`);\n }\n\n const leftNormalized = normalizeIndexValue(leftValue, leftColumn);\n let hasNull = false;\n let hasMatch = false;\n\n for (const item of rightValue) {\n const resolved = resolveComparisonValue(\n item,\n leftColumn,\n table,\n row,\n namespaceStore,\n resolver,\n now,\n );\n if (isNullish(resolved.value)) {\n hasNull = true;\n continue;\n }\n const normalized = normalizeIndexValue(resolved.value, leftColumn);\n if (compareNormalized(leftNormalized, normalized) === 0) {\n hasMatch = true;\n break;\n }\n }\n\n if (hasMatch) {\n return op === \"in\";\n }\n\n if (hasNull) {\n return false;\n }\n\n return op === \"not in\";\n }\n\n if (\n op === \"contains\" ||\n op === \"starts with\" ||\n op === \"ends with\" ||\n op === \"not contains\" ||\n op === \"not starts with\" ||\n op === \"not ends with\"\n ) {\n const leftLike = normalizeLikeValue(leftValue, leftColumn);\n const rightLike = normalizeLikeValue(rightValue, right.column);\n\n if (leftLike === null || rightLike === null) {\n return false;\n }\n\n const leftText = leftLike.toLowerCase();\n const rightText = rightLike.toLowerCase();\n let matches = false;\n\n if (op.includes(\"contains\")) {\n matches = leftText.includes(rightText);\n } else if (op.includes(\"starts with\")) {\n matches = leftText.startsWith(rightText);\n } else {\n matches = leftText.endsWith(rightText);\n }\n\n if (op.startsWith(\"not \")) {\n return !matches;\n }\n return matches;\n }\n\n const leftNormalized = normalizeIndexValue(leftValue, leftColumn);\n const rightNormalized = normalizeIndexValue(rightValue, right.column);\n const comparison = compareNormalized(leftNormalized, rightNormalized);\n\n switch (op) {\n case \"=\":\n return comparison === 0;\n case \"!=\":\n return comparison !== 0;\n case \">\":\n return comparison > 0;\n case \">=\":\n return comparison >= 0;\n case \"<\":\n return comparison < 0;\n case \"<=\":\n return comparison <= 0;\n default:\n throw new Error(`Unsupported operator \"${op}\".`);\n }\n};\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ //#region src/adapters/in-memory/errors.d.ts
2
+ declare class UniqueConstraintError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ declare class ForeignKeyConstraintError extends Error {
6
+ constructor(message: string);
7
+ }
8
+ declare class NotFoundError extends Error {
9
+ constructor(message: string);
10
+ }
11
+ //#endregion
12
+ export { ForeignKeyConstraintError, NotFoundError, UniqueConstraintError };
13
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","names":[],"sources":["../../../src/adapters/in-memory/errors.ts"],"sourcesContent":[],"mappings":";cAAa,qBAAA,SAA8B,KAAA;EAA9B,WAAA,CAAA,OAAA,EAAA,MAAsB;AAOnC;AAOa,cAPA,yBAAA,SAAkC,KAAA,CAOP;;;cAA3B,aAAA,SAAsB,KAAA"}