@fragno-dev/db 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/.turbo/turbo-build.log +202 -140
  2. package/CHANGELOG.md +35 -0
  3. package/README.md +30 -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 +27 -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 +55 -16
  14. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
  15. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +129 -3
  16. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
  17. package/dist/adapters/generic-sql/migration/dialect/mysql.js +24 -5
  18. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
  19. package/dist/adapters/generic-sql/migration/dialect/postgres.js +6 -5
  20. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
  21. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +21 -10
  22. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
  23. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
  24. package/dist/adapters/generic-sql/migration/prepared-migrations.js +8 -8
  25. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
  26. package/dist/adapters/generic-sql/migration/sql-generator.js +74 -51
  27. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
  28. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +6 -5
  29. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
  30. package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
  31. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
  32. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +25 -17
  33. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
  34. package/dist/adapters/generic-sql/query/select-builder.js +5 -3
  35. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
  36. package/dist/adapters/generic-sql/query/sql-query-compiler.js +15 -12
  37. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
  38. package/dist/adapters/generic-sql/query/where-builder.js +39 -29
  39. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
  40. package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
  41. package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  42. package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
  43. package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
  44. package/dist/adapters/generic-sql/uow-decoder.js +7 -3
  45. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
  46. package/dist/adapters/generic-sql/uow-encoder.js +28 -8
  47. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
  48. package/dist/adapters/in-memory/condition-evaluator.js +131 -0
  49. package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
  50. package/dist/adapters/in-memory/errors.d.ts +13 -0
  51. package/dist/adapters/in-memory/errors.d.ts.map +1 -0
  52. package/dist/adapters/in-memory/errors.js +23 -0
  53. package/dist/adapters/in-memory/errors.js.map +1 -0
  54. package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
  55. package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
  56. package/dist/adapters/in-memory/in-memory-adapter.js +176 -0
  57. package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
  58. package/dist/adapters/in-memory/in-memory-uow.js +648 -0
  59. package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
  60. package/dist/adapters/in-memory/index.d.ts +4 -0
  61. package/dist/adapters/in-memory/index.js +4 -0
  62. package/dist/adapters/in-memory/options.d.ts +28 -0
  63. package/dist/adapters/in-memory/options.d.ts.map +1 -0
  64. package/dist/adapters/in-memory/options.js +61 -0
  65. package/dist/adapters/in-memory/options.js.map +1 -0
  66. package/dist/adapters/in-memory/reference-resolution.js +26 -0
  67. package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
  68. package/dist/adapters/in-memory/sorted-array-index.js +129 -0
  69. package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
  70. package/dist/adapters/in-memory/store.js +71 -0
  71. package/dist/adapters/in-memory/store.js.map +1 -0
  72. package/dist/adapters/in-memory/value-comparison.js +28 -0
  73. package/dist/adapters/in-memory/value-comparison.js.map +1 -0
  74. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
  75. package/dist/adapters/shared/uow-operation-compiler.js +11 -11
  76. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
  77. package/dist/adapters/sql/index.d.ts +5 -0
  78. package/dist/adapters/sql/index.js +4 -0
  79. package/dist/db-fragment-definition-builder.d.ts +18 -7
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  81. package/dist/db-fragment-definition-builder.js +116 -54
  82. package/dist/db-fragment-definition-builder.js.map +1 -1
  83. package/dist/dispatchers/cloudflare-do/index.d.ts +26 -0
  84. package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
  85. package/dist/dispatchers/cloudflare-do/index.js +63 -0
  86. package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
  87. package/dist/dispatchers/node/index.d.ts +17 -0
  88. package/dist/dispatchers/node/index.d.ts.map +1 -0
  89. package/dist/dispatchers/node/index.js +59 -0
  90. package/dist/dispatchers/node/index.js.map +1 -0
  91. package/dist/fragments/internal-fragment.d.ts +79 -2
  92. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  93. package/dist/fragments/internal-fragment.js +150 -32
  94. package/dist/fragments/internal-fragment.js.map +1 -1
  95. package/dist/fragments/internal-fragment.routes.js +29 -0
  96. package/dist/fragments/internal-fragment.routes.js.map +1 -0
  97. package/dist/fragments/internal-fragment.schema.d.ts +9 -0
  98. package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
  99. package/dist/fragments/internal-fragment.schema.js +22 -0
  100. package/dist/fragments/internal-fragment.schema.js.map +1 -0
  101. package/dist/hooks/durable-hooks-processor.d.ts +14 -0
  102. package/dist/hooks/durable-hooks-processor.d.ts.map +1 -0
  103. package/dist/hooks/durable-hooks-processor.js +32 -0
  104. package/dist/hooks/durable-hooks-processor.js.map +1 -0
  105. package/dist/hooks/hooks.d.ts +42 -1
  106. package/dist/hooks/hooks.d.ts.map +1 -1
  107. package/dist/hooks/hooks.js +72 -6
  108. package/dist/hooks/hooks.js.map +1 -1
  109. package/dist/migration-engine/auto-from-schema.js +14 -11
  110. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  111. package/dist/migration-engine/generation-engine.d.ts +16 -10
  112. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  113. package/dist/migration-engine/generation-engine.js +72 -33
  114. package/dist/migration-engine/generation-engine.js.map +1 -1
  115. package/dist/migration-engine/shared.js.map +1 -1
  116. package/dist/mod.d.ts +15 -8
  117. package/dist/mod.d.ts.map +1 -1
  118. package/dist/mod.js +14 -8
  119. package/dist/mod.js.map +1 -1
  120. package/dist/naming/sql-naming.d.ts +19 -0
  121. package/dist/naming/sql-naming.d.ts.map +1 -0
  122. package/dist/naming/sql-naming.js +116 -0
  123. package/dist/naming/sql-naming.js.map +1 -0
  124. package/dist/node_modules/.pnpm/{rou3@0.7.10 → rou3@0.7.12}/node_modules/rou3/dist/index.js +8 -5
  125. package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +1 -0
  126. package/dist/outbox/outbox-builder.js +156 -0
  127. package/dist/outbox/outbox-builder.js.map +1 -0
  128. package/dist/outbox/outbox.d.ts +52 -0
  129. package/dist/outbox/outbox.d.ts.map +1 -0
  130. package/dist/outbox/outbox.js +37 -0
  131. package/dist/outbox/outbox.js.map +1 -0
  132. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +3 -2
  133. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -1
  134. package/dist/packages/fragno/dist/api/fragment-instantiator.js +164 -20
  135. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
  136. package/dist/packages/fragno/dist/api/request-input-context.js +67 -0
  137. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -1
  138. package/dist/packages/fragno/dist/api/route.js +14 -1
  139. package/dist/packages/fragno/dist/api/route.js.map +1 -1
  140. package/dist/packages/fragno/dist/internal/trace-context.js +12 -0
  141. package/dist/packages/fragno/dist/internal/trace-context.js.map +1 -0
  142. package/dist/query/column-defaults.js +20 -4
  143. package/dist/query/column-defaults.js.map +1 -1
  144. package/dist/query/cursor.d.ts +3 -1
  145. package/dist/query/cursor.d.ts.map +1 -1
  146. package/dist/query/cursor.js +45 -14
  147. package/dist/query/cursor.js.map +1 -1
  148. package/dist/query/db-now.d.ts +8 -0
  149. package/dist/query/db-now.d.ts.map +1 -0
  150. package/dist/query/db-now.js +7 -0
  151. package/dist/query/db-now.js.map +1 -0
  152. package/dist/query/serialize/create-sql-serializer.js +3 -2
  153. package/dist/query/serialize/create-sql-serializer.js.map +1 -1
  154. package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
  155. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
  156. package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
  157. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
  158. package/dist/query/serialize/dialect/sqlite-serializer.js +55 -11
  159. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
  160. package/dist/query/serialize/sql-serializer.js +2 -2
  161. package/dist/query/serialize/sql-serializer.js.map +1 -1
  162. package/dist/query/simple-query-interface.d.ts +6 -1
  163. package/dist/query/simple-query-interface.d.ts.map +1 -1
  164. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  165. package/dist/query/unit-of-work/execute-unit-of-work.js +11 -6
  166. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  167. package/dist/query/unit-of-work/unit-of-work.d.ts +50 -14
  168. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  169. package/dist/query/unit-of-work/unit-of-work.js +86 -5
  170. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  171. package/dist/query/value-decoding.js +9 -6
  172. package/dist/query/value-decoding.js.map +1 -1
  173. package/dist/query/value-encoding.js +29 -9
  174. package/dist/query/value-encoding.js.map +1 -1
  175. package/dist/schema/create.d.ts +38 -14
  176. package/dist/schema/create.d.ts.map +1 -1
  177. package/dist/schema/create.js +81 -42
  178. package/dist/schema/create.js.map +1 -1
  179. package/dist/schema/generate-id.js +2 -2
  180. package/dist/schema/generate-id.js.map +1 -1
  181. package/dist/schema/type-conversion/create-sql-type-mapper.js +3 -2
  182. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  183. package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
  184. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  185. package/dist/schema/validator.d.ts +10 -0
  186. package/dist/schema/validator.d.ts.map +1 -0
  187. package/dist/schema/validator.js +123 -0
  188. package/dist/schema/validator.js.map +1 -0
  189. package/dist/schema-output/drizzle.d.ts +30 -0
  190. package/dist/schema-output/drizzle.d.ts.map +1 -0
  191. package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +82 -56
  192. package/dist/schema-output/drizzle.js.map +1 -0
  193. package/dist/schema-output/prisma.d.ts +17 -0
  194. package/dist/schema-output/prisma.d.ts.map +1 -0
  195. package/dist/schema-output/prisma.js +296 -0
  196. package/dist/schema-output/prisma.js.map +1 -0
  197. package/dist/util/default-database-adapter.js +61 -0
  198. package/dist/util/default-database-adapter.js.map +1 -0
  199. package/dist/with-database.d.ts +1 -1
  200. package/dist/with-database.d.ts.map +1 -1
  201. package/dist/with-database.js +12 -3
  202. package/dist/with-database.js.map +1 -1
  203. package/package.json +43 -28
  204. package/src/adapters/adapters.ts +30 -24
  205. package/src/adapters/drizzle/migrate-drizzle.test.ts +54 -33
  206. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +599 -0
  207. package/src/adapters/drizzle/test-utils.ts +12 -8
  208. package/src/adapters/generic-sql/driver-config.ts +38 -0
  209. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -5
  210. package/src/adapters/generic-sql/generic-sql-adapter.ts +110 -24
  211. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +54 -0
  212. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +231 -3
  213. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +118 -0
  214. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +26 -8
  215. package/src/adapters/generic-sql/migration/dialect/mysql.ts +46 -8
  216. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +25 -7
  217. package/src/adapters/generic-sql/migration/dialect/postgres.ts +8 -4
  218. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +47 -8
  219. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +27 -12
  220. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +128 -39
  221. package/src/adapters/generic-sql/migration/prepared-migrations.ts +15 -8
  222. package/src/adapters/generic-sql/migration/sql-generator.ts +142 -65
  223. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +9 -6
  224. package/src/adapters/generic-sql/query/cursor-utils.test.ts +271 -0
  225. package/src/adapters/generic-sql/query/cursor-utils.ts +41 -6
  226. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +27 -27
  227. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +38 -24
  228. package/src/adapters/generic-sql/query/select-builder.test.ts +15 -11
  229. package/src/adapters/generic-sql/query/select-builder.ts +6 -2
  230. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +52 -2
  231. package/src/adapters/generic-sql/query/sql-query-compiler.ts +50 -15
  232. package/src/adapters/generic-sql/query/where-builder.test.ts +91 -17
  233. package/src/adapters/generic-sql/query/where-builder.ts +90 -38
  234. package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +6 -6
  235. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +806 -0
  236. package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +11 -11
  237. package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +10 -10
  238. package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +7 -7
  239. package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +6 -6
  240. package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
  241. package/src/adapters/generic-sql/uow-decoder.test.ts +1 -1
  242. package/src/adapters/generic-sql/uow-decoder.ts +21 -3
  243. package/src/adapters/generic-sql/uow-encoder.test.ts +33 -2
  244. package/src/adapters/generic-sql/uow-encoder.ts +50 -11
  245. package/src/adapters/in-memory/condition-evaluator.test.ts +193 -0
  246. package/src/adapters/in-memory/condition-evaluator.ts +275 -0
  247. package/src/adapters/in-memory/errors.ts +20 -0
  248. package/src/adapters/in-memory/in-memory-adapter.ts +277 -0
  249. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +296 -0
  250. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +100 -0
  251. package/src/adapters/in-memory/in-memory-uow.ts +1348 -0
  252. package/src/adapters/in-memory/index.ts +3 -0
  253. package/src/adapters/in-memory/options.test.ts +41 -0
  254. package/src/adapters/in-memory/options.ts +87 -0
  255. package/src/adapters/in-memory/reference-resolution.test.ts +50 -0
  256. package/src/adapters/in-memory/reference-resolution.ts +67 -0
  257. package/src/adapters/in-memory/sorted-array-index.test.ts +123 -0
  258. package/src/adapters/in-memory/sorted-array-index.ts +228 -0
  259. package/src/adapters/in-memory/store.test.ts +68 -0
  260. package/src/adapters/in-memory/store.ts +145 -0
  261. package/src/adapters/in-memory/value-comparison.ts +53 -0
  262. package/src/adapters/in-memory/value-normalization.test.ts +57 -0
  263. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1163 -0
  264. package/src/adapters/shared/from-unit-of-work-compiler.ts +3 -1
  265. package/src/adapters/shared/uow-operation-compiler.ts +26 -16
  266. package/src/adapters/sql/index.ts +12 -0
  267. package/src/db-fragment-definition-builder.test.ts +30 -12
  268. package/src/db-fragment-definition-builder.ts +142 -73
  269. package/src/db-fragment-instantiator.test.ts +105 -13
  270. package/src/db-fragment-integration.test.ts +9 -7
  271. package/src/dispatchers/cloudflare-do/index.test.ts +73 -0
  272. package/src/dispatchers/cloudflare-do/index.ts +104 -0
  273. package/src/dispatchers/node/index.test.ts +91 -0
  274. package/src/dispatchers/node/index.ts +87 -0
  275. package/src/fragments/internal-fragment.routes.ts +42 -0
  276. package/src/fragments/internal-fragment.schema.ts +51 -0
  277. package/src/fragments/internal-fragment.test.ts +458 -8
  278. package/src/fragments/internal-fragment.ts +322 -63
  279. package/src/hooks/durable-hooks-processor.test.ts +117 -0
  280. package/src/hooks/durable-hooks-processor.ts +67 -0
  281. package/src/hooks/hooks.test.ts +165 -5
  282. package/src/hooks/hooks.ts +197 -9
  283. package/src/migration-engine/auto-from-schema.test.ts +14 -14
  284. package/src/migration-engine/auto-from-schema.ts +5 -2
  285. package/src/migration-engine/create.test.ts +2 -2
  286. package/src/migration-engine/generation-engine.test.ts +229 -104
  287. package/src/migration-engine/generation-engine.ts +94 -64
  288. package/src/migration-engine/shared.ts +1 -0
  289. package/src/mod.ts +64 -26
  290. package/src/naming/sql-naming.ts +180 -0
  291. package/src/outbox/outbox-builder.ts +241 -0
  292. package/src/outbox/outbox.test.ts +253 -0
  293. package/src/outbox/outbox.ts +137 -0
  294. package/src/query/column-defaults.ts +41 -3
  295. package/src/query/condition-builder.test.ts +3 -3
  296. package/src/query/cursor.test.ts +116 -18
  297. package/src/query/cursor.ts +75 -26
  298. package/src/query/db-now.ts +6 -0
  299. package/src/query/query-type.test.ts +2 -2
  300. package/src/query/serialize/create-sql-serializer.ts +7 -2
  301. package/src/query/serialize/dialect/mysql-serializer.ts +12 -4
  302. package/src/query/serialize/dialect/postgres-serializer.ts +34 -4
  303. package/src/query/serialize/dialect/sqlite-serializer.test.ts +51 -1
  304. package/src/query/serialize/dialect/sqlite-serializer.ts +92 -9
  305. package/src/query/serialize/sql-serializer.ts +4 -4
  306. package/src/query/simple-query-interface.ts +5 -0
  307. package/src/query/unit-of-work/execute-unit-of-work.test.ts +25 -1
  308. package/src/query/unit-of-work/execute-unit-of-work.ts +25 -8
  309. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +12 -12
  310. package/src/query/unit-of-work/unit-of-work-types.test.ts +1 -1
  311. package/src/query/unit-of-work/unit-of-work.test.ts +168 -37
  312. package/src/query/unit-of-work/unit-of-work.ts +203 -18
  313. package/src/query/value-decoding.test.ts +13 -2
  314. package/src/query/value-decoding.ts +17 -4
  315. package/src/query/value-encoding.test.ts +85 -2
  316. package/src/query/value-encoding.ts +56 -6
  317. package/src/schema/create.test.ts +129 -42
  318. package/src/schema/create.ts +185 -47
  319. package/src/schema/generate-id.test.ts +2 -2
  320. package/src/schema/generate-id.ts +2 -2
  321. package/src/schema/serialize.test.ts +14 -2
  322. package/src/schema/type-conversion/create-sql-type-mapper.ts +7 -2
  323. package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
  324. package/src/schema/type-conversion/type-mapping.test.ts +25 -1
  325. package/src/schema/validator.test.ts +197 -0
  326. package/src/schema/validator.ts +231 -0
  327. package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +179 -129
  328. package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +143 -93
  329. package/src/schema-output/prisma.test.ts +536 -0
  330. package/src/schema-output/prisma.ts +573 -0
  331. package/src/util/default-database-adapter.ts +106 -0
  332. package/src/with-database.ts +22 -3
  333. package/tsdown.config.ts +6 -4
  334. package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
  335. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
  336. package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
  337. package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
  338. package/dist/adapters/drizzle/generate.d.ts +0 -30
  339. package/dist/adapters/drizzle/generate.d.ts.map +0 -1
  340. package/dist/adapters/drizzle/generate.js.map +0 -1
  341. package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
  342. package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
  343. package/dist/adapters/kysely/kysely-adapter.js +0 -17
  344. package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
  345. package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
  346. package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
  347. package/dist/adapters/shared/table-name-mapper.js +0 -43
  348. package/dist/adapters/shared/table-name-mapper.js.map +0 -1
  349. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
  350. package/dist/schema-generator/schema-generator.d.ts +0 -15
  351. package/dist/schema-generator/schema-generator.d.ts.map +0 -1
  352. package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
  353. package/src/adapters/kysely/kysely-adapter.ts +0 -27
  354. package/src/adapters/shared/table-name-mapper.ts +0 -50
  355. package/src/schema-generator/schema-generator.ts +0 -12
@@ -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":";;;;;;;;;;;;;;AAuBA,SAAgB,YAAY,QAAmB,QAAkC;AAE/E,QAAO,GADW,SAAS,OAAO,WAAW,OAAO,UAAU,GAAG,OAAO,UACpD,GAAG,OAAO;;;;;;;;;;;;;;;;;AAkBhC,SAAgB,WACd,WACA,IACA,cACA,QACA,OACsB;CACtB,MAAM,aAAa,oBAAoB,aAAa;AAEpD,KAAI,UAAU,SAAS,WAAW;EAChC,MAAM,OAAO,UAAU;EACvB,MAAM,KAAK,UAAU;EACrB,IAAI,MAAM,UAAU;AAEpB,MAAI,EAAE,eAAe,QAEnB,KAAI,KAAK,SAAS,eAAe,MAC/B,KAAI,OAAO,QAAQ,UAAU;GAE3B,MAAM,WAAW,OAAO,OAAO,MAAM,UAAU,CAAC,MAAM,QACpD,IAAI,GAAG,MAAM,CAAC,cAAc,aAAa,KAAK,QAAQ,CACvD;AACD,OAAI,UAAU;IACZ,MAAM,WAAW,SAAS;IAC1B,MAAM,gBAAgB,SAAS,qBAAqB;IACpD,MAAM,QAAQ,SAAS,aAAa;IACpC,MAAM,oBAAoB,SACtB,OAAO,WAAW,SAAS,QAAQ,GACnC,SAAS;AAEb,UAAM,GACH,WAAW,kBAAkB,CAC7B,OAAO,cAAc,KAAK,CAC1B,MAAM,MAAM,MAAM,KAAK,IAAI,CAC3B,MAAM,EAAE;;aAEJ,eAAe,YAAY,IAAI,eAAe,OAEvD,OAAM,IAAI;WACD,eAAe,YAAY,IAAI,eAAe,QAAW;GAElE,MAAM,WAAW,OAAO,OAAO,MAAM,UAAU,CAAC,MAAM,QACpD,IAAI,GAAG,MAAM,CAAC,cAAc,aAAa,KAAK,QAAQ,CACvD;AACD,OAAI,UAAU;IACZ,MAAM,WAAW,SAAS;IAC1B,MAAM,gBAAgB,SAAS,qBAAqB;IACpD,MAAM,QAAQ,SAAS,aAAa;IACpC,MAAM,oBAAoB,SACtB,OAAO,WAAW,SAAS,QAAQ,GACnC,SAAS;AAEb,UAAM,GACH,WAAW,kBAAkB,CAC7B,OAAO,cAAc,KAAK,CAC1B,MAAM,MAAM,MAAM,KAAK,IAAI,WAAW,CACtC,MAAM,EAAE;;aAEJ,eAAe,gBAExB,OAAM,IAAI;OACL;GAEL,MAAM,cAAc,qBAAqB,KAAK,KAAK;AACnD,SAAM,WAAW,UAAU,aAAa,KAAK;;OAE1C;GAEL,MAAM,cAAc,qBAAqB,KAAK,KAAK;AACnD,SAAM,WAAW,UAAU,aAAa,KAAK;;EAIjD,IAAIA;EACJ,IAAIC;AAEJ,UAAQ,IAAR;GACE,KAAK;AACH,QAAI;AACJ,UACE,eAAe,SACX,GAAG,eAAe,GAAG,IAAI,YAAY,KAAK,OAAO,CAAC,CAAC,UACnD,IAAI,IAAI;AACd;GACF,KAAK;AACH,QAAI;AACJ,UACE,eAAe,SACX,GAAG,eAAe,GAAG,IAAI,YAAY,KAAK,OAAO,CAAC,CAAC,UACnD,IAAI,IAAI;AACd;GACF,KAAK;AACH,QAAI;AACJ,UACE,eAAe,SAAS,GAAG,UAAU,GAAG,IAAI,YAAY,KAAK,OAAO,CAAC,CAAC,UAAU,GAAG,IAAI;AACzF;GACF,KAAK;AACH,QAAI;AACJ,UACE,eAAe,SAAS,GAAG,UAAU,GAAG,IAAI,YAAY,KAAK,OAAO,CAAC,CAAC,UAAU,GAAG,IAAI;AACzF;GACF,KAAK;AACH,QAAI;AACJ,UACE,eAAe,SAAS,GAAG,eAAe,GAAG,IAAI,YAAY,KAAK,OAAO,CAAC,CAAC,KAAK,IAAI;AACtF;GACF,KAAK;AACH,QAAI;AACJ,UACE,eAAe,SAAS,GAAG,eAAe,GAAG,IAAI,YAAY,KAAK,OAAO,CAAC,CAAC,KAAK,IAAI;AACtF;GACF;AACE,QAAI;AACJ,UAAM,eAAe,SAAS,GAAG,IAAI,YAAY,KAAK,OAAO,CAAC,GAAG;;AAGrE,SAAO,GAAG,YAAY,MAAM,OAAO,EAAE,GAAG,IAAI;;AAI9C,KAAI,UAAU,SAAS,MACrB,QAAO,GAAG,IAAI,UAAU,MAAM,KAAK,MAAM,WAAW,GAAG,IAAI,cAAc,QAAQ,MAAM,CAAC,CAAC;AAG3F,KAAI,UAAU,SAAS,MACrB,QAAO,GAAG,IAAI,WAAW,UAAU,MAAM,IAAI,cAAc,QAAQ,MAAM,CAAC;AAG5E,QAAO,GAAG,GAAG,UAAU,MAAM,KAAK,MAAM,WAAW,GAAG,IAAI,cAAc,QAAQ,MAAM,CAAC,CAAC;;;;;;;;;;;AAY1F,SAAgB,2BACd,QACA,QACA,QACyB;CACzB,MAAMC,YAAqC,EAAE;CAC7C,MAAM,gBAAgB,UAAqB,SAAS,OAAO,WAAW,MAAM,KAAK,GAAG,MAAM;AAE1F,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,CAC/C,KAAI,iBAAiB,mBAAmB;EACtC,MAAM,WAAW,MAAM;EACvB,MAAM,aAAa,MAAM;EACzB,MAAM,YAAY,aAAa,SAAS;EACxC,MAAM,gBAAgB,SAAS,qBAAqB,CAAC;EACrD,MAAM,QAAQ,SAAS,aAAa,CAAC;AAErC,YAAU,OAAO,OACd,WAAW,UAAU,CACrB,OAAO,cAAc,CACrB,MAAM,OAAO,KAAK,WAAW,CAC7B,MAAM,EAAE;OAEX,WAAU,OAAO;AAIrB,QAAO"}
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 { NamingResolver } from \"../../../naming/sql-naming\";\nimport type { DriverConfig } from \"../driver-config\";\nimport { sqliteStorageDefault, type SQLiteStorageMode } from \"../sqlite-storage\";\nimport { ReferenceSubquery, resolveFragnoIdValue } from \"../../../query/value-encoding\";\nimport { isDbNow } from \"../../../query/db-now\";\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\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): 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 if (driverConfig.databaseType === \"sqlite\") {\n const storageMode = sqliteStorageMode ?? sqliteStorageDefault;\n const storage =\n left.type === \"date\" ? storageMode.dateStorage : storageMode.timestampStorage;\n if ((left.type === \"timestamp\" || left.type === \"date\") && storage === \"epoch-ms\") {\n val = sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`;\n } else {\n val = sql`CURRENT_TIMESTAMP`;\n }\n } else {\n val = sql`CURRENT_TIMESTAMP`;\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(fullSQLName(val, resolver))}, '%')`\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, resolver))}, '%')`\n : `%${val}%`;\n break;\n case \"starts with\":\n v = \"like\";\n rhs =\n val instanceof Column\n ? sql`concat(${eb.ref(fullSQLName(val, resolver))}, '%')`\n : `${val}%`;\n break;\n case \"not starts with\":\n v = \"not like\";\n rhs =\n val instanceof Column\n ? sql`concat(${eb.ref(fullSQLName(val, resolver))}, '%')`\n : `${val}%`;\n break;\n case \"ends with\":\n v = \"like\";\n rhs =\n val instanceof Column\n ? sql`concat('%', ${eb.ref(fullSQLName(val, resolver))})`\n : `%${val}`;\n break;\n case \"not ends with\":\n v = \"not like\";\n rhs =\n val instanceof Column\n ? sql`concat('%', ${eb.ref(fullSQLName(val, resolver))})`\n : `%${val}`;\n break;\n default:\n v = op;\n rhs = val instanceof Column ? eb.ref(fullSQLName(val, resolver)) : val;\n }\n\n return eb(fullSQLName(left, resolver), 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),\n ),\n );\n }\n\n if (condition.type === \"not\") {\n return eb.not(buildWhere(condition.item, eb, driverConfig, sqliteStorageMode, resolver, table));\n }\n\n return eb.or(\n condition.items.map((v) => buildWhere(v, eb, driverConfig, sqliteStorageMode, resolver, table)),\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"}
@@ -1,5 +1,5 @@
1
- import { createCursorFromRecord } from "../../query/cursor.js";
2
1
  import { decodeResult } from "../../query/value-decoding.js";
2
+ import { createCursorFromRecord } from "../../query/cursor.js";
3
3
 
4
4
  //#region src/adapters/generic-sql/uow-decoder.ts
5
5
  /**
@@ -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 { 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\";\nimport type { SQLiteStorageMode } from \"./sqlite-storage\";\nimport type { NamingResolver } from \"../../naming/sql-naming\";\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,6 +1,9 @@
1
+ import { sqliteStorageDefault } from "./sqlite-storage.js";
1
2
  import { createSQLSerializer } from "../../query/serialize/create-sql-serializer.js";
2
3
  import { encodeValues } from "../../query/value-encoding.js";
4
+ import { isDbNow } from "../../query/db-now.js";
3
5
  import { processReferenceSubqueries } from "./query/where-builder.js";
6
+ import { sql } from "kysely";
4
7
 
5
8
  //#region src/adapters/generic-sql/uow-encoder.ts
6
9
  /**
@@ -15,13 +18,17 @@ import { processReferenceSubqueries } from "./query/where-builder.js";
15
18
  * This class mirrors the UnitOfWorkDecoder pattern for symmetry.
16
19
  */
17
20
  var UnitOfWorkEncoder = class {
21
+ #driverConfig;
18
22
  #serializer;
19
23
  #db;
20
- #mapper;
21
- constructor(driverConfig, db, mapper) {
22
- this.#serializer = createSQLSerializer(driverConfig);
24
+ #sqliteStorageMode;
25
+ #resolver;
26
+ constructor(driverConfig, db, sqliteStorageMode, resolver) {
27
+ this.#driverConfig = driverConfig;
28
+ this.#serializer = createSQLSerializer(driverConfig, sqliteStorageMode);
23
29
  this.#db = db;
24
- this.#mapper = mapper;
30
+ this.#sqliteStorageMode = sqliteStorageMode;
31
+ this.#resolver = resolver;
25
32
  }
26
33
  /**
27
34
  * Encode application values to database-ready format.
@@ -49,7 +56,7 @@ var UnitOfWorkEncoder = class {
49
56
  * ```
50
57
  */
51
58
  encodeForDatabase(options) {
52
- const processed = processReferenceSubqueries(encodeValues(options.values, options.table, options.generateDefaults), this.#db, this.#mapper);
59
+ const processed = processReferenceSubqueries(encodeValues(options.values, options.table, options.generateDefaults, {}, this.#resolver), this.#db, this.#resolver);
53
60
  return this.serializeValues(processed, options.table);
54
61
  }
55
62
  /**
@@ -66,12 +73,22 @@ var UnitOfWorkEncoder = class {
66
73
  */
67
74
  serializeValues(values, table) {
68
75
  const result = {};
76
+ const columnMap = this.#resolver ? this.#resolver.getColumnNameMap(table) : void 0;
69
77
  for (const [dbColumnName, value] of Object.entries(values)) {
70
- const col = this.findColumnByDbName(table, dbColumnName);
78
+ const col = this.findColumnByDbName(table, dbColumnName, columnMap);
71
79
  if (!col) {
72
80
  result[dbColumnName] = value;
73
81
  continue;
74
82
  }
83
+ if (isDbNow(value)) {
84
+ if (this.#driverConfig.databaseType === "sqlite") {
85
+ const storageMode = this.#sqliteStorageMode ?? sqliteStorageDefault;
86
+ const storage = col.type === "date" ? storageMode.dateStorage : storageMode.timestampStorage;
87
+ if ((col.type === "timestamp" || col.type === "date") && storage === "epoch-ms") result[dbColumnName] = sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`;
88
+ else result[dbColumnName] = sql`CURRENT_TIMESTAMP`;
89
+ } else result[dbColumnName] = sql`CURRENT_TIMESTAMP`;
90
+ continue;
91
+ }
75
92
  result[dbColumnName] = this.#serializer.serialize(value, col);
76
93
  }
77
94
  return result;
@@ -83,8 +100,11 @@ var UnitOfWorkEncoder = class {
83
100
  * @param dbColumnName - The database column name (e.g., "user_id")
84
101
  * @returns The column definition or undefined if not found
85
102
  */
86
- findColumnByDbName(table, dbColumnName) {
87
- for (const col of Object.values(table.columns)) if (col.name === dbColumnName) return col;
103
+ findColumnByDbName(table, dbColumnName, columnMap) {
104
+ const logicalName = columnMap?.[dbColumnName] ?? dbColumnName;
105
+ const direct = table.columns[logicalName];
106
+ if (direct) return direct;
107
+ for (const col of Object.values(table.columns)) if (col.name === logicalName) return col;
88
108
  }
89
109
  };
90
110
 
@@ -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 { 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 { NamingResolver } from \"../../naming/sql-naming\";\nimport { sql, type Kysely } from \"kysely\";\nimport { isDbNow } from \"../../query/db-now\";\nimport { sqliteStorageDefault, 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 if (this.#driverConfig.databaseType === \"sqlite\") {\n const storageMode = this.#sqliteStorageMode ?? sqliteStorageDefault;\n const storage =\n col.type === \"date\" ? storageMode.dateStorage : storageMode.timestampStorage;\n if ((col.type === \"timestamp\" || col.type === \"date\") && storage === \"epoch-ms\") {\n result[dbColumnName] = sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`;\n } else {\n result[dbColumnName] = sql`CURRENT_TIMESTAMP`;\n }\n } else {\n result[dbColumnName] = sql`CURRENT_TIMESTAMP`;\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":";;;;;;;;;;;;;;;;;;;AAwBA,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,QAAI,MAAKJ,aAAc,iBAAiB,UAAU;KAChD,MAAM,cAAc,MAAKG,qBAAsB;KAC/C,MAAM,UACJ,IAAI,SAAS,SAAS,YAAY,cAAc,YAAY;AAC9D,UAAK,IAAI,SAAS,eAAe,IAAI,SAAS,WAAW,YAAY,WACnE,QAAO,gBAAgB,GAAG;SAE1B,QAAO,gBAAgB,GAAG;UAG5B,QAAO,gBAAgB,GAAG;AAE5B;;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,131 @@
1
+ import { Column, FragnoId, FragnoReference } from "../../schema/create.js";
2
+ import { ReferenceSubquery, resolveFragnoIdValue } from "../../query/value-encoding.js";
3
+ import { isDbNow } from "../../query/db-now.js";
4
+ import { compareNormalizedValues } from "./value-comparison.js";
5
+ import { normalizeIndexValue } from "./store.js";
6
+ import { resolveReferenceSubquery } from "./reference-resolution.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)) return {
34
+ value: now(),
35
+ column
36
+ };
37
+ if (column.role === "reference") return {
38
+ value: resolveReferenceValue(value, column, table, namespaceStore, resolver),
39
+ column
40
+ };
41
+ return {
42
+ value: resolveFragnoIdValue(value, column),
43
+ column
44
+ };
45
+ };
46
+ const normalizeLikeValue = (value, column) => {
47
+ const normalized = normalizeIndexValue(value, column);
48
+ if (normalized === null || normalized === void 0) return null;
49
+ if (normalized instanceof Buffer) return normalized.toString("hex");
50
+ return String(normalized);
51
+ };
52
+ const compareNormalized = (left, right) => compareNormalizedValues(left, right);
53
+ const evaluateCondition = (condition, table, row, namespaceStore, resolver, now = () => /* @__PURE__ */ new Date()) => {
54
+ if (typeof condition === "boolean") return condition;
55
+ switch (condition.type) {
56
+ case "and":
57
+ for (const item of condition.items) if (!evaluateCondition(item, table, row, namespaceStore, resolver, now)) return false;
58
+ return true;
59
+ case "or":
60
+ for (const item of condition.items) if (evaluateCondition(item, table, row, namespaceStore, resolver, now)) return true;
61
+ return false;
62
+ case "not": return !evaluateCondition(condition.item, table, row, namespaceStore, resolver, now);
63
+ case "compare": break;
64
+ default: {
65
+ const exhaustiveCheck = condition;
66
+ throw new Error(`Unsupported condition type: ${JSON.stringify(exhaustiveCheck)}`);
67
+ }
68
+ }
69
+ const leftColumn = condition.a;
70
+ const leftValue = row[resolver ? resolver.getColumnName(table.name, leftColumn.name) : leftColumn.name];
71
+ const right = resolveComparisonValue(condition.b, leftColumn, table, row, namespaceStore, resolver, now);
72
+ const op = condition.operator;
73
+ const rightValue = right.value;
74
+ if (op === "is" || op === "is not") {
75
+ if (isNullish(rightValue)) {
76
+ const matches$1 = isNullish(leftValue);
77
+ return op === "is" ? matches$1 : !matches$1;
78
+ }
79
+ if (isNullish(leftValue)) return op === "is not";
80
+ const matches = compareNormalized(normalizeIndexValue(leftValue, leftColumn), normalizeIndexValue(rightValue, right.column)) === 0;
81
+ return op === "is" ? matches : !matches;
82
+ }
83
+ if (isNullish(leftValue) || isNullish(rightValue)) return false;
84
+ if (op === "in" || op === "not in") {
85
+ if (!Array.isArray(rightValue)) throw new Error(`Operator "${op}" expects an array value.`);
86
+ const leftNormalized = normalizeIndexValue(leftValue, leftColumn);
87
+ let hasNull = false;
88
+ let hasMatch = false;
89
+ for (const item of rightValue) {
90
+ const resolved = resolveComparisonValue(item, leftColumn, table, row, namespaceStore, resolver, now);
91
+ if (isNullish(resolved.value)) {
92
+ hasNull = true;
93
+ continue;
94
+ }
95
+ if (compareNormalized(leftNormalized, normalizeIndexValue(resolved.value, leftColumn)) === 0) {
96
+ hasMatch = true;
97
+ break;
98
+ }
99
+ }
100
+ if (hasMatch) return op === "in";
101
+ if (hasNull) return false;
102
+ return op === "not in";
103
+ }
104
+ if (op === "contains" || op === "starts with" || op === "ends with" || op === "not contains" || op === "not starts with" || op === "not ends with") {
105
+ const leftLike = normalizeLikeValue(leftValue, leftColumn);
106
+ const rightLike = normalizeLikeValue(rightValue, right.column);
107
+ if (leftLike === null || rightLike === null) return false;
108
+ const leftText = leftLike.toLowerCase();
109
+ const rightText = rightLike.toLowerCase();
110
+ let matches = false;
111
+ if (op.includes("contains")) matches = leftText.includes(rightText);
112
+ else if (op.includes("starts with")) matches = leftText.startsWith(rightText);
113
+ else matches = leftText.endsWith(rightText);
114
+ if (op.startsWith("not ")) return !matches;
115
+ return matches;
116
+ }
117
+ const comparison = compareNormalized(normalizeIndexValue(leftValue, leftColumn), normalizeIndexValue(rightValue, right.column));
118
+ switch (op) {
119
+ case "=": return comparison === 0;
120
+ case "!=": return comparison !== 0;
121
+ case ">": return comparison > 0;
122
+ case ">=": return comparison >= 0;
123
+ case "<": return comparison < 0;
124
+ case "<=": return comparison <= 0;
125
+ default: throw new Error(`Unsupported operator "${op}".`);
126
+ }
127
+ };
128
+
129
+ //#endregion
130
+ export { evaluateCondition };
131
+ //# 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 { Condition } from \"../../query/condition-builder\";\nimport { ReferenceSubquery, resolveFragnoIdValue } from \"../../query/value-encoding\";\nimport { isDbNow } from \"../../query/db-now\";\nimport type { AnyColumn, AnyTable } from \"../../schema/create\";\nimport { Column, FragnoId, FragnoReference } from \"../../schema/create\";\nimport type { InMemoryNamespaceStore, InMemoryRow } from \"./store\";\nimport { normalizeIndexValue } from \"./store\";\nimport { resolveReferenceSubquery } from \"./reference-resolution\";\nimport { compareNormalizedValues } from \"./value-comparison\";\nimport type { NamingResolver } from \"../../naming/sql-naming\";\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 return { value: now(), column };\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":";;;;;;;;AAWA,MAAM,aAAa,UACjB,UAAU,QAAQ,UAAU;AAE9B,MAAM,yBACJ,OACA,QACA,OACA,gBACA,aACY;AACZ,KAAI,iBAAiB,gBACnB,QAAO,MAAM;AAGf,KAAI,iBAAiB,UAAU;AAC7B,MAAI,MAAM,eAAe,OACvB,QAAO,MAAM;AAEf,SAAO,sBAAsB,MAAM,YAAY,QAAQ,OAAO,gBAAgB,SAAS;;AAGzF,KAAI,iBAAiB,mBAAmB;AACtC,MAAI,CAAC,eACH,OAAM,IAAI,MAAM,6DAA6D;AAE/E,SAAO,yBAAyB,gBAAgB,OAAO,SAAS;;AAGlE,KAAI,OAAO,UAAU,UAAU;AAC7B,MAAI,CAAC,eACH,OAAM,IAAI,MAAM,6DAA6D;EAG/E,MAAM,WAAW,OAAO,OAAO,MAAM,UAAU,CAAC,MAAM,QACpD,IAAI,GAAG,MAAM,CAAC,cAAc,aAAa,OAAO,KAAK,CACtD;AACD,MAAI,CAAC,SACH,OAAM,IAAI,MAAM,0CAA0C,OAAO,KAAK,IAAI;AAG5E,SAAO,yBACL,gBACA,IAAI,kBAAkB,SAAS,OAAO,MAAM,EAC5C,SACD;;AAGH,QAAO,qBAAqB,OAAO,OAAO;;AAG5C,MAAM,0BACJ,OACA,QACA,OACA,KACA,gBACA,UACA,4BAAwB,IAAI,MAAM,KACQ;AAC1C,KAAI,iBAAiB,OAEnB,QAAO;EAAE,OAAO,IADG,WAAW,SAAS,cAAc,MAAM,MAAM,MAAM,KAAK,GAAG,MAAM;EACpD,QAAQ;EAAO;AAGlD,KAAI,QAAQ,MAAM,CAChB,QAAO;EAAE,OAAO,KAAK;EAAE;EAAQ;AAGjC,KAAI,OAAO,SAAS,YAClB,QAAO;EACL,OAAO,sBAAsB,OAAO,QAAQ,OAAO,gBAAgB,SAAS;EAC5E;EACD;AAGH,QAAO;EAAE,OAAO,qBAAqB,OAAO,OAAO;EAAE;EAAQ;;AAG/D,MAAM,sBAAsB,OAAgB,WAAqC;CAC/E,MAAM,aAAa,oBAAoB,OAAO,OAAO;AACrD,KAAI,eAAe,QAAQ,eAAe,OACxC,QAAO;AAET,KAAI,sBAAsB,OACxB,QAAO,WAAW,SAAS,MAAM;AAEnC,QAAO,OAAO,WAAW;;AAG3B,MAAM,qBAAqB,MAAe,UACxC,wBAAwB,MAAM,MAAM;AAEtC,MAAa,qBACX,WACA,OACA,KACA,gBACA,UACA,4BAAwB,IAAI,MAAM,KACtB;AACZ,KAAI,OAAO,cAAc,UACvB,QAAO;AAGT,SAAQ,UAAU,MAAlB;EACE,KAAK;AACH,QAAK,MAAM,QAAQ,UAAU,MAC3B,KAAI,CAAC,kBAAkB,MAAM,OAAO,KAAK,gBAAgB,UAAU,IAAI,CACrE,QAAO;AAGX,UAAO;EAET,KAAK;AACH,QAAK,MAAM,QAAQ,UAAU,MAC3B,KAAI,kBAAkB,MAAM,OAAO,KAAK,gBAAgB,UAAU,IAAI,CACpE,QAAO;AAGX,UAAO;EAET,KAAK,MACH,QAAO,CAAC,kBAAkB,UAAU,MAAM,OAAO,KAAK,gBAAgB,UAAU,IAAI;EACtF,KAAK,UACH;EACF,SAAS;GACP,MAAMA,kBAAyB;AAC/B,SAAM,IAAI,MAAM,+BAA+B,KAAK,UAAU,gBAAgB,GAAG;;;CAIrF,MAAM,aAAa,UAAU;CAI7B,MAAM,YAAY,IAHK,WACnB,SAAS,cAAc,MAAM,MAAM,WAAW,KAAK,GACnD,WAAW;CAEf,MAAM,QAAQ,uBACZ,UAAU,GACV,YACA,OACA,KACA,gBACA,UACA,IACD;CAED,MAAM,KAAK,UAAU;CACrB,MAAM,aAAa,MAAM;AAEzB,KAAI,OAAO,QAAQ,OAAO,UAAU;AAClC,MAAI,UAAU,WAAW,EAAE;GACzB,MAAMC,YAAU,UAAU,UAAU;AACpC,UAAO,OAAO,OAAOA,YAAU,CAACA;;AAGlC,MAAI,UAAU,UAAU,CACtB,QAAO,OAAO;EAKhB,MAAM,UAAU,kBAFO,oBAAoB,WAAW,WAAW,EACzC,oBAAoB,YAAY,MAAM,OAAO,CACH,KAAK;AACvE,SAAO,OAAO,OAAO,UAAU,CAAC;;AAGlC,KAAI,UAAU,UAAU,IAAI,UAAU,WAAW,CAC/C,QAAO;AAGT,KAAI,OAAO,QAAQ,OAAO,UAAU;AAClC,MAAI,CAAC,MAAM,QAAQ,WAAW,CAC5B,OAAM,IAAI,MAAM,aAAa,GAAG,2BAA2B;EAG7D,MAAM,iBAAiB,oBAAoB,WAAW,WAAW;EACjE,IAAI,UAAU;EACd,IAAI,WAAW;AAEf,OAAK,MAAM,QAAQ,YAAY;GAC7B,MAAM,WAAW,uBACf,MACA,YACA,OACA,KACA,gBACA,UACA,IACD;AACD,OAAI,UAAU,SAAS,MAAM,EAAE;AAC7B,cAAU;AACV;;AAGF,OAAI,kBAAkB,gBADH,oBAAoB,SAAS,OAAO,WAAW,CACjB,KAAK,GAAG;AACvD,eAAW;AACX;;;AAIJ,MAAI,SACF,QAAO,OAAO;AAGhB,MAAI,QACF,QAAO;AAGT,SAAO,OAAO;;AAGhB,KACE,OAAO,cACP,OAAO,iBACP,OAAO,eACP,OAAO,kBACP,OAAO,qBACP,OAAO,iBACP;EACA,MAAM,WAAW,mBAAmB,WAAW,WAAW;EAC1D,MAAM,YAAY,mBAAmB,YAAY,MAAM,OAAO;AAE9D,MAAI,aAAa,QAAQ,cAAc,KACrC,QAAO;EAGT,MAAM,WAAW,SAAS,aAAa;EACvC,MAAM,YAAY,UAAU,aAAa;EACzC,IAAI,UAAU;AAEd,MAAI,GAAG,SAAS,WAAW,CACzB,WAAU,SAAS,SAAS,UAAU;WAC7B,GAAG,SAAS,cAAc,CACnC,WAAU,SAAS,WAAW,UAAU;MAExC,WAAU,SAAS,SAAS,UAAU;AAGxC,MAAI,GAAG,WAAW,OAAO,CACvB,QAAO,CAAC;AAEV,SAAO;;CAKT,MAAM,aAAa,kBAFI,oBAAoB,WAAW,WAAW,EACzC,oBAAoB,YAAY,MAAM,OAAO,CACA;AAErE,SAAQ,IAAR;EACE,KAAK,IACH,QAAO,eAAe;EACxB,KAAK,KACH,QAAO,eAAe;EACxB,KAAK,IACH,QAAO,aAAa;EACtB,KAAK,KACH,QAAO,cAAc;EACvB,KAAK,IACH,QAAO,aAAa;EACtB,KAAK,KACH,QAAO,cAAc;EACvB,QACE,OAAM,IAAI,MAAM,yBAAyB,GAAG,IAAI"}
@@ -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"}
@@ -0,0 +1,23 @@
1
+ //#region src/adapters/in-memory/errors.ts
2
+ var UniqueConstraintError = class extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = "UniqueConstraintError";
6
+ }
7
+ };
8
+ var ForeignKeyConstraintError = class extends Error {
9
+ constructor(message) {
10
+ super(message);
11
+ this.name = "ForeignKeyConstraintError";
12
+ }
13
+ };
14
+ var NotFoundError = class extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = "NotFoundError";
18
+ }
19
+ };
20
+
21
+ //#endregion
22
+ export { ForeignKeyConstraintError, NotFoundError, UniqueConstraintError };
23
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../../../src/adapters/in-memory/errors.ts"],"sourcesContent":["export class UniqueConstraintError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UniqueConstraintError\";\n }\n}\n\nexport class ForeignKeyConstraintError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ForeignKeyConstraintError\";\n }\n}\n\nexport class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\n"],"mappings":";AAAA,IAAa,wBAAb,cAA2C,MAAM;CAC/C,YAAY,SAAiB;AAC3B,QAAM,QAAQ;AACd,OAAK,OAAO;;;AAIhB,IAAa,4BAAb,cAA+C,MAAM;CACnD,YAAY,SAAiB;AAC3B,QAAM,QAAQ;AACd,OAAK,OAAO;;;AAIhB,IAAa,gBAAb,cAAmC,MAAM;CACvC,YAAY,SAAiB;AAC3B,QAAM,QAAQ;AACd,OAAK,OAAO"}
@@ -0,0 +1,27 @@
1
+ import { AnySchema } from "../../schema/create.js";
2
+ import { SqlNamingStrategy } from "../../naming/sql-naming.js";
3
+ import { InMemoryAdapterOptions, ResolvedInMemoryAdapterOptions } from "./options.js";
4
+ import { UnitOfWorkConfig } from "../../query/unit-of-work/unit-of-work.js";
5
+ import { SimpleQueryInterface } from "../../query/simple-query-interface.js";
6
+ import { DatabaseAdapter, DatabaseContextStorage, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
7
+ import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
8
+
9
+ //#region src/adapters/in-memory/in-memory-adapter.d.ts
10
+ type InMemoryUowConfig = UnitOfWorkConfig;
11
+ declare class InMemoryAdapter implements DatabaseAdapter<InMemoryUowConfig> {
12
+ #private;
13
+ readonly options: ResolvedInMemoryAdapterOptions;
14
+ readonly namingStrategy: SqlNamingStrategy;
15
+ constructor(options?: InMemoryAdapterOptions);
16
+ get [fragnoDatabaseAdapterNameFakeSymbol](): string;
17
+ get [fragnoDatabaseAdapterVersionFakeSymbol](): number;
18
+ get contextStorage(): RequestContextStorage<DatabaseContextStorage>;
19
+ getSchemaVersion(_namespace: string): Promise<string | undefined>;
20
+ isConnectionHealthy(): Promise<boolean>;
21
+ close(): Promise<void>;
22
+ reset(): Promise<void>;
23
+ createQueryEngine<T extends AnySchema>(schema: T, namespace: string | null): SimpleQueryInterface<T, InMemoryUowConfig>;
24
+ }
25
+ //#endregion
26
+ export { InMemoryAdapter, InMemoryUowConfig };
27
+ //# sourceMappingURL=in-memory-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-adapter.d.ts","names":[],"sources":["../../../src/adapters/in-memory/in-memory-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;KAwDY,iBAAA,GAAoB;cAEnB,eAAA,YAA2B,gBAAgB;EAF5C,CAAA,OAAA;EAEC,SAAA,OAAA,EACO,8BADS;EAA2B,SAAA,cAAA,EAE7B,iBAF6B;EACpC,WAAA,CAAA,OAAA,CAAA,EAQG,sBARH;EACO,KAapB,mCAAA,GAboB,EAAA,MAAA;EAOJ,KAUhB,sCAAA,GAVgB,EAAA,MAAA;EAMhB,IAAA,cAAA,CAAA,CAAA,EAQiB,qBARjB,CAQuC,sBARvC,CAAA;EAIA,gBAAA,CAAA,UAAA,EAAA,MAAA,CAAA,EAQuC,OARvC,CAAA,MAAA,GAAA,SAAA,CAAA;EAIuC,mBAAA,CAAA,CAAA,EAQf,OARe,CAAA,OAAA,CAAA;EAAtB,KAAA,CAAA,CAAA,EAYP,OAZO,CAAA,IAAA,CAAA;EAIsB,KAAA,CAAA,CAAA,EAY7B,OAZ6B,CAAA,IAAA,CAAA;EAIf,iBAAA,CAAA,UAgBD,SAhBC,CAAA,CAAA,MAAA,EAiBnB,CAjBmB,EAAA,SAAA,EAAA,MAAA,GAAA,IAAA,CAAA,EAmB1B,oBAnB0B,CAmBL,CAnBK,EAmBF,iBAnBE,CAAA"}