@fragno-dev/db 0.2.1 → 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 (362) hide show
  1. package/.turbo/turbo-build.log +206 -140
  2. package/CHANGELOG.md +67 -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 +38 -28
  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 +45 -96
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  81. package/dist/db-fragment-definition-builder.js +121 -99
  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 +172 -9
  92. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  93. package/dist/fragments/internal-fragment.js +193 -74
  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 +47 -4
  106. package/dist/hooks/hooks.d.ts.map +1 -1
  107. package/dist/hooks/hooks.js +106 -39
  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 +17 -10
  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 +351 -100
  165. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  166. package/dist/query/unit-of-work/execute-unit-of-work.js +440 -267
  167. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  168. package/dist/query/unit-of-work/unit-of-work.d.ts +67 -22
  169. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  170. package/dist/query/unit-of-work/unit-of-work.js +110 -13
  171. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  172. package/dist/query/value-decoding.js +8 -5
  173. package/dist/query/value-decoding.js.map +1 -1
  174. package/dist/query/value-encoding.js +29 -9
  175. package/dist/query/value-encoding.js.map +1 -1
  176. package/dist/schema/create.d.ts +40 -14
  177. package/dist/schema/create.d.ts.map +1 -1
  178. package/dist/schema/create.js +82 -42
  179. package/dist/schema/create.js.map +1 -1
  180. package/dist/schema/generate-id.d.ts +20 -0
  181. package/dist/schema/generate-id.d.ts.map +1 -0
  182. package/dist/schema/generate-id.js +28 -0
  183. package/dist/schema/generate-id.js.map +1 -0
  184. package/dist/schema/type-conversion/create-sql-type-mapper.js +3 -2
  185. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  186. package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
  187. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  188. package/dist/schema/validator.d.ts +10 -0
  189. package/dist/schema/validator.d.ts.map +1 -0
  190. package/dist/schema/validator.js +123 -0
  191. package/dist/schema/validator.js.map +1 -0
  192. package/dist/schema-output/drizzle.d.ts +30 -0
  193. package/dist/schema-output/drizzle.d.ts.map +1 -0
  194. package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +82 -56
  195. package/dist/schema-output/drizzle.js.map +1 -0
  196. package/dist/schema-output/prisma.d.ts +17 -0
  197. package/dist/schema-output/prisma.d.ts.map +1 -0
  198. package/dist/schema-output/prisma.js +296 -0
  199. package/dist/schema-output/prisma.js.map +1 -0
  200. package/dist/util/default-database-adapter.js +61 -0
  201. package/dist/util/default-database-adapter.js.map +1 -0
  202. package/dist/with-database.d.ts +1 -1
  203. package/dist/with-database.d.ts.map +1 -1
  204. package/dist/with-database.js +12 -3
  205. package/dist/with-database.js.map +1 -1
  206. package/package.json +43 -28
  207. package/src/adapters/adapters.ts +30 -24
  208. package/src/adapters/drizzle/migrate-drizzle.test.ts +54 -33
  209. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +599 -0
  210. package/src/adapters/drizzle/test-utils.ts +12 -8
  211. package/src/adapters/generic-sql/driver-config.ts +38 -0
  212. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -5
  213. package/src/adapters/generic-sql/generic-sql-adapter.ts +110 -24
  214. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +54 -0
  215. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +231 -3
  216. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +118 -0
  217. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +26 -8
  218. package/src/adapters/generic-sql/migration/dialect/mysql.ts +46 -8
  219. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +25 -7
  220. package/src/adapters/generic-sql/migration/dialect/postgres.ts +8 -4
  221. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +47 -8
  222. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +27 -12
  223. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +128 -39
  224. package/src/adapters/generic-sql/migration/prepared-migrations.ts +15 -8
  225. package/src/adapters/generic-sql/migration/sql-generator.ts +142 -65
  226. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +9 -6
  227. package/src/adapters/generic-sql/query/cursor-utils.test.ts +271 -0
  228. package/src/adapters/generic-sql/query/cursor-utils.ts +41 -6
  229. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +27 -27
  230. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +38 -24
  231. package/src/adapters/generic-sql/query/select-builder.test.ts +15 -11
  232. package/src/adapters/generic-sql/query/select-builder.ts +6 -2
  233. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +52 -2
  234. package/src/adapters/generic-sql/query/sql-query-compiler.ts +50 -15
  235. package/src/adapters/generic-sql/query/where-builder.test.ts +91 -17
  236. package/src/adapters/generic-sql/query/where-builder.ts +90 -38
  237. package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +6 -6
  238. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +806 -0
  239. package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +11 -11
  240. package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +49 -35
  241. package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +48 -32
  242. package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +6 -6
  243. package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
  244. package/src/adapters/generic-sql/uow-decoder.test.ts +1 -1
  245. package/src/adapters/generic-sql/uow-decoder.ts +21 -3
  246. package/src/adapters/generic-sql/uow-encoder.test.ts +33 -2
  247. package/src/adapters/generic-sql/uow-encoder.ts +50 -11
  248. package/src/adapters/in-memory/condition-evaluator.test.ts +193 -0
  249. package/src/adapters/in-memory/condition-evaluator.ts +275 -0
  250. package/src/adapters/in-memory/errors.ts +20 -0
  251. package/src/adapters/in-memory/in-memory-adapter.ts +277 -0
  252. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +296 -0
  253. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +100 -0
  254. package/src/adapters/in-memory/in-memory-uow.ts +1348 -0
  255. package/src/adapters/in-memory/index.ts +3 -0
  256. package/src/adapters/in-memory/options.test.ts +41 -0
  257. package/src/adapters/in-memory/options.ts +87 -0
  258. package/src/adapters/in-memory/reference-resolution.test.ts +50 -0
  259. package/src/adapters/in-memory/reference-resolution.ts +67 -0
  260. package/src/adapters/in-memory/sorted-array-index.test.ts +123 -0
  261. package/src/adapters/in-memory/sorted-array-index.ts +228 -0
  262. package/src/adapters/in-memory/store.test.ts +68 -0
  263. package/src/adapters/in-memory/store.ts +145 -0
  264. package/src/adapters/in-memory/value-comparison.ts +53 -0
  265. package/src/adapters/in-memory/value-normalization.test.ts +57 -0
  266. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1163 -0
  267. package/src/adapters/shared/from-unit-of-work-compiler.ts +3 -1
  268. package/src/adapters/shared/uow-operation-compiler.ts +26 -16
  269. package/src/adapters/sql/index.ts +12 -0
  270. package/src/db-fragment-definition-builder.test.ts +88 -54
  271. package/src/db-fragment-definition-builder.ts +201 -322
  272. package/src/db-fragment-instantiator.test.ts +169 -101
  273. package/src/db-fragment-integration.test.ts +301 -149
  274. package/src/dispatchers/cloudflare-do/index.test.ts +73 -0
  275. package/src/dispatchers/cloudflare-do/index.ts +104 -0
  276. package/src/dispatchers/node/index.test.ts +91 -0
  277. package/src/dispatchers/node/index.ts +87 -0
  278. package/src/fragments/internal-fragment.routes.ts +42 -0
  279. package/src/fragments/internal-fragment.schema.ts +51 -0
  280. package/src/fragments/internal-fragment.test.ts +730 -274
  281. package/src/fragments/internal-fragment.ts +447 -154
  282. package/src/hooks/durable-hooks-processor.test.ts +117 -0
  283. package/src/hooks/durable-hooks-processor.ts +67 -0
  284. package/src/hooks/hooks.test.ts +411 -259
  285. package/src/hooks/hooks.ts +265 -66
  286. package/src/migration-engine/auto-from-schema.test.ts +14 -14
  287. package/src/migration-engine/auto-from-schema.ts +5 -2
  288. package/src/migration-engine/create.test.ts +2 -2
  289. package/src/migration-engine/generation-engine.test.ts +229 -104
  290. package/src/migration-engine/generation-engine.ts +94 -64
  291. package/src/migration-engine/shared.ts +1 -0
  292. package/src/mod.ts +78 -30
  293. package/src/naming/sql-naming.ts +180 -0
  294. package/src/outbox/outbox-builder.ts +241 -0
  295. package/src/outbox/outbox.test.ts +253 -0
  296. package/src/outbox/outbox.ts +137 -0
  297. package/src/query/column-defaults.ts +41 -3
  298. package/src/query/condition-builder.test.ts +3 -3
  299. package/src/query/cursor.test.ts +116 -18
  300. package/src/query/cursor.ts +75 -26
  301. package/src/query/db-now.ts +6 -0
  302. package/src/query/query-type.test.ts +2 -2
  303. package/src/query/serialize/create-sql-serializer.ts +7 -2
  304. package/src/query/serialize/dialect/mysql-serializer.ts +12 -4
  305. package/src/query/serialize/dialect/postgres-serializer.ts +34 -4
  306. package/src/query/serialize/dialect/sqlite-serializer.test.ts +51 -1
  307. package/src/query/serialize/dialect/sqlite-serializer.ts +92 -9
  308. package/src/query/serialize/sql-serializer.ts +4 -4
  309. package/src/query/simple-query-interface.ts +5 -0
  310. package/src/query/unit-of-work/execute-unit-of-work.test.ts +1512 -1458
  311. package/src/query/unit-of-work/execute-unit-of-work.ts +1708 -596
  312. package/src/query/unit-of-work/tx-builder.test.ts +1041 -0
  313. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +32 -32
  314. package/src/query/unit-of-work/unit-of-work-types.test.ts +1 -1
  315. package/src/query/unit-of-work/unit-of-work.test.ts +231 -36
  316. package/src/query/unit-of-work/unit-of-work.ts +229 -31
  317. package/src/query/value-decoding.test.ts +13 -2
  318. package/src/query/value-decoding.ts +17 -4
  319. package/src/query/value-encoding.test.ts +85 -2
  320. package/src/query/value-encoding.ts +56 -6
  321. package/src/schema/create.test.ts +129 -42
  322. package/src/schema/create.ts +187 -47
  323. package/src/schema/generate-id.test.ts +57 -0
  324. package/src/schema/generate-id.ts +38 -0
  325. package/src/schema/serialize.test.ts +14 -2
  326. package/src/schema/type-conversion/create-sql-type-mapper.ts +7 -2
  327. package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
  328. package/src/schema/type-conversion/type-mapping.test.ts +25 -1
  329. package/src/schema/validator.test.ts +197 -0
  330. package/src/schema/validator.ts +231 -0
  331. package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +179 -129
  332. package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +143 -93
  333. package/src/schema-output/prisma.test.ts +536 -0
  334. package/src/schema-output/prisma.ts +573 -0
  335. package/src/util/default-database-adapter.ts +106 -0
  336. package/src/with-database.ts +22 -3
  337. package/tsdown.config.ts +6 -4
  338. package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
  339. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
  340. package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
  341. package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
  342. package/dist/adapters/drizzle/generate.d.ts +0 -30
  343. package/dist/adapters/drizzle/generate.d.ts.map +0 -1
  344. package/dist/adapters/drizzle/generate.js.map +0 -1
  345. package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
  346. package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
  347. package/dist/adapters/kysely/kysely-adapter.js +0 -17
  348. package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
  349. package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
  350. package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
  351. package/dist/adapters/shared/table-name-mapper.js +0 -43
  352. package/dist/adapters/shared/table-name-mapper.js.map +0 -1
  353. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
  354. package/dist/schema-generator/schema-generator.d.ts +0 -15
  355. package/dist/schema-generator/schema-generator.d.ts.map +0 -1
  356. package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
  357. package/src/adapters/kysely/kysely-adapter.ts +0 -27
  358. package/src/adapters/shared/table-name-mapper.ts +0 -50
  359. package/src/schema-generator/schema-generator.ts +0 -12
  360. package/src/shared/config.ts +0 -10
  361. package/src/shared/connection-pool.ts +0 -24
  362. package/src/shared/prisma.ts +0 -45
@@ -11,7 +11,8 @@ import type { SqlBool } from "kysely";
11
11
  import type { AnyColumn, AnyTable } from "../../../schema/create";
12
12
  import type { Condition } from "../../../query/condition-builder";
13
13
  import type { DriverConfig, SupportedDatabase } from "../driver-config";
14
- import type { TableNameMapper } from "../../shared/table-name-mapper";
14
+ import type { SQLiteStorageMode } from "../sqlite-storage";
15
+ import type { NamingResolver } from "../../../naming/sql-naming";
15
16
  import { buildWhere, fullSQLName } from "./where-builder";
16
17
  import { mapSelect, extendSelect } from "./select-builder";
17
18
  import type { CompiledJoin } from "../../../query/orm/orm";
@@ -97,15 +98,22 @@ export abstract class SQLQueryCompiler {
97
98
  protected readonly db: AnyKysely;
98
99
  protected readonly driverConfig: DriverConfig;
99
100
  protected readonly database: SupportedDatabase;
100
- protected readonly mapper?: TableNameMapper;
101
+ protected readonly resolver?: NamingResolver;
101
102
  protected readonly encoder: UnitOfWorkEncoder;
102
-
103
- constructor(db: AnyKysely, driverConfig: DriverConfig, mapper?: TableNameMapper) {
103
+ protected readonly sqliteStorageMode?: SQLiteStorageMode;
104
+
105
+ constructor(
106
+ db: AnyKysely,
107
+ driverConfig: DriverConfig,
108
+ sqliteStorageMode?: SQLiteStorageMode,
109
+ resolver?: NamingResolver,
110
+ ) {
104
111
  this.db = db;
105
112
  this.driverConfig = driverConfig;
106
113
  this.database = driverConfig.databaseType;
107
- this.mapper = mapper;
108
- this.encoder = new UnitOfWorkEncoder(driverConfig, db, mapper);
114
+ this.resolver = resolver;
115
+ this.sqliteStorageMode = sqliteStorageMode;
116
+ this.encoder = new UnitOfWorkEncoder(driverConfig, db, sqliteStorageMode, resolver);
109
117
  }
110
118
 
111
119
  /**
@@ -133,14 +141,21 @@ export abstract class SQLQueryCompiler {
133
141
  * Get the physical table name, applying namespace mapping if provided.
134
142
  */
135
143
  protected getTableName(table: AnyTable): string {
136
- return this.mapper ? this.mapper.toPhysical(table.name) : table.name;
144
+ return this.resolver ? this.resolver.getTableName(table.name) : table.name;
137
145
  }
138
146
 
139
147
  /**
140
148
  * Build WHERE clause from a condition tree.
141
149
  */
142
150
  protected buildWhereClause(condition: Condition, eb: AnyExpressionBuilder, table: AnyTable) {
143
- return buildWhere(condition, eb, this.driverConfig, this.mapper, table);
151
+ return buildWhere(
152
+ condition,
153
+ eb,
154
+ this.driverConfig,
155
+ this.sqliteStorageMode,
156
+ this.resolver,
157
+ table,
158
+ );
144
159
  }
145
160
 
146
161
  /**
@@ -171,7 +186,7 @@ export abstract class SQLQueryCompiler {
171
186
 
172
187
  // Update select
173
188
  mappedSelect.push(
174
- ...mapSelect(joinOptions.select, targetTable, {
189
+ ...mapSelect(joinOptions.select, targetTable, this.resolver, {
175
190
  relation: fullPath, // Use full path with colons for column aliases
176
191
  tableName: joinName, // Use underscore version for table name
177
192
  }),
@@ -188,9 +203,22 @@ export abstract class SQLQueryCompiler {
188
203
 
189
204
  conditions.push(
190
205
  eb(
191
- `${parentTableName}.${parentTable.columns[left].name}`,
206
+ `${parentTableName}.${
207
+ this.resolver
208
+ ? this.resolver.getColumnName(parentTable.name, parentTable.columns[left].name)
209
+ : parentTable.columns[left].name
210
+ }`,
192
211
  "=",
193
- eb.ref(`${joinName}.${targetTable.columns[actualRight].name}`),
212
+ eb.ref(
213
+ `${joinName}.${
214
+ this.resolver
215
+ ? this.resolver.getColumnName(
216
+ targetTable.name,
217
+ targetTable.columns[actualRight].name,
218
+ )
219
+ : targetTable.columns[actualRight].name
220
+ }`,
221
+ ),
194
222
  ),
195
223
  );
196
224
  }
@@ -259,7 +287,7 @@ export abstract class SQLQueryCompiler {
259
287
  // Apply ORDER BY
260
288
  if (options.orderBy) {
261
289
  for (const [col, mode] of options.orderBy) {
262
- query = query.orderBy(fullSQLName(col, this.mapper), mode);
290
+ query = query.orderBy(fullSQLName(col, this.resolver), mode);
263
291
  }
264
292
  }
265
293
 
@@ -274,7 +302,9 @@ export abstract class SQLQueryCompiler {
274
302
 
275
303
  const compiledSelect = selectBuilder.compile();
276
304
  mappedSelect.push(
277
- ...mapSelect(compiledSelect.result, table, { tableName: this.getTableName(table) }),
305
+ ...mapSelect(compiledSelect.result, table, this.resolver, {
306
+ tableName: this.getTableName(table),
307
+ }),
278
308
  );
279
309
 
280
310
  return query.select(mappedSelect).compile();
@@ -297,7 +327,9 @@ export abstract class SQLQueryCompiler {
297
327
 
298
328
  // Apply RETURNING if supported
299
329
  if (this.driverConfig.supportsReturning) {
300
- const columns = mapSelect(true, table, { tableName: this.getTableName(table) });
330
+ const columns = mapSelect(true, table, this.resolver, {
331
+ tableName: this.getTableName(table),
332
+ });
301
333
  insert = this.applyReturning(insert, columns);
302
334
  }
303
335
 
@@ -316,7 +348,10 @@ export abstract class SQLQueryCompiler {
316
348
 
317
349
  // Add version increment (must be added after encoding, as a raw SQL expression)
318
350
  const versionCol = table.getVersionColumn();
319
- encoded[versionCol.name] = sql.raw(`COALESCE(${versionCol.name}, 0) + 1`);
351
+ const versionColumnName = this.resolver
352
+ ? this.resolver.getColumnName(table.name, versionCol.name)
353
+ : versionCol.name;
354
+ encoded[versionColumnName] = sql`coalesce(${sql.ref(versionColumnName)}, 0) + 1`;
320
355
 
321
356
  let query = this.db.updateTable(this.getTableName(table)).set(encoded);
322
357
 
@@ -4,9 +4,11 @@ import { column, idColumn, referenceColumn, schema } from "../../../schema/creat
4
4
  import { fullSQLName, buildWhere, processReferenceSubqueries } from "./where-builder";
5
5
  import { ReferenceSubquery } from "../../../query/value-encoding";
6
6
  import { BetterSQLite3DriverConfig, NodePostgresDriverConfig } from "../driver-config";
7
+ import { dbNow } from "../../../query/db-now";
8
+ import { createNamingResolver, type SqlNamingStrategy } from "../../../naming/sql-naming";
7
9
 
8
10
  describe("where-builder", () => {
9
- const testSchema = schema((s) => {
11
+ const testSchema = schema("test", (s) => {
10
12
  return s
11
13
  .addTable("users", (t) => {
12
14
  return t
@@ -15,7 +17,8 @@ describe("where-builder", () => {
15
17
  .addColumn("email", column("string"))
16
18
  .addColumn("age", column("integer").nullable())
17
19
  .addColumn("isActive", column("bool"))
18
- .addColumn("createdAt", column("timestamp"));
20
+ .addColumn("createdAt", column("timestamp"))
21
+ .addColumn("birthDate", column("date").nullable());
19
22
  })
20
23
  .addTable("posts", (t) => {
21
24
  return t
@@ -52,12 +55,18 @@ describe("where-builder", () => {
52
55
  expect(result).toBe("users.id");
53
56
  });
54
57
 
55
- it("should work with table name mapper", () => {
56
- const mapper = {
57
- toPhysical: (ormName: string) => `prefix_${ormName}`,
58
- toLogical: (physicalName: string) => physicalName.replace("prefix_", ""),
58
+ it("should work with naming resolver", () => {
59
+ const namingStrategy: SqlNamingStrategy = {
60
+ namespaceScope: "suffix",
61
+ namespaceToSchema: (namespace) => namespace,
62
+ tableName: (logicalTable) => `prefix_${logicalTable}`,
63
+ columnName: (logicalColumn) => logicalColumn,
64
+ indexName: (logicalIndex) => logicalIndex,
65
+ uniqueIndexName: (logicalIndex) => logicalIndex,
66
+ foreignKeyName: ({ referenceName }) => referenceName,
59
67
  };
60
- const result = fullSQLName(usersTable.columns.name, mapper);
68
+ const resolver = createNamingResolver(testSchema, "namespace", namingStrategy);
69
+ const result = fullSQLName(usersTable.columns.name, resolver);
61
70
  expect(result).toBe("prefix_users.name");
62
71
  });
63
72
  });
@@ -111,6 +120,56 @@ describe("where-builder", () => {
111
120
  };
112
121
 
113
122
  describe("comparison operators", () => {
123
+ it("should serialize dbNow to CURRENT_TIMESTAMP", () => {
124
+ const condition = {
125
+ type: "compare" as const,
126
+ a: usersTable.columns.createdAt,
127
+ operator: "<=" as const,
128
+ b: dbNow(),
129
+ };
130
+
131
+ type TestDB = { users: { id: string } };
132
+ const db = new Kysely<TestDB>({
133
+ dialect: new PostgresDialect({ pool: {} as any }), // eslint-disable-line @typescript-eslint/no-explicit-any
134
+ });
135
+
136
+ const query = db
137
+ .selectFrom("users")
138
+ .select("id")
139
+ .where((eb) => buildWhere(condition, eb, new NodePostgresDriverConfig()));
140
+
141
+ expect(query.compile().sql).toContain("CURRENT_TIMESTAMP");
142
+ });
143
+
144
+ it("should respect sqlite date storage for dbNow", () => {
145
+ const condition = {
146
+ type: "compare" as const,
147
+ a: usersTable.columns.birthDate,
148
+ operator: "<=" as const,
149
+ b: dbNow(),
150
+ };
151
+
152
+ type TestDB = { users: { id: string } };
153
+ const db = new Kysely<TestDB>({
154
+ dialect: new PostgresDialect({ pool: {} as any }), // eslint-disable-line @typescript-eslint/no-explicit-any
155
+ });
156
+
157
+ const query = db
158
+ .selectFrom("users")
159
+ .select("id")
160
+ .where((eb) =>
161
+ buildWhere(condition, eb, new BetterSQLite3DriverConfig(), {
162
+ timestampStorage: "epoch-ms",
163
+ dateStorage: "iso-text",
164
+ bigintStorage: "blob",
165
+ }),
166
+ );
167
+
168
+ const sqlText = query.compile().sql;
169
+ expect(sqlText).toContain("CURRENT_TIMESTAMP");
170
+ expect(sqlText).not.toContain("julianday");
171
+ });
172
+
114
173
  it("should build simple equality comparison", () => {
115
174
  const condition = {
116
175
  type: "compare" as const,
@@ -532,6 +591,7 @@ describe("where-builder", () => {
532
591
  eb,
533
592
  new NodePostgresDriverConfig(),
534
593
  undefined,
594
+ undefined,
535
595
  postsTable,
536
596
  );
537
597
 
@@ -561,6 +621,7 @@ describe("where-builder", () => {
561
621
  createMockEB(),
562
622
  new NodePostgresDriverConfig(),
563
623
  undefined,
624
+ undefined,
564
625
  postsTable,
565
626
  );
566
627
 
@@ -573,11 +634,17 @@ describe("where-builder", () => {
573
634
  });
574
635
  });
575
636
 
576
- it("should generate subquery with table name mapper", () => {
577
- const mapper = {
578
- toPhysical: (ormName: string) => `prefix_${ormName}`,
579
- toLogical: (physicalName: string) => physicalName.replace("prefix_", ""),
637
+ it("should generate subquery with naming resolver", () => {
638
+ const namingStrategy: SqlNamingStrategy = {
639
+ namespaceScope: "suffix",
640
+ namespaceToSchema: (namespace) => namespace,
641
+ tableName: (logicalTable) => `prefix_${logicalTable}`,
642
+ columnName: (logicalColumn) => logicalColumn,
643
+ indexName: (logicalIndex) => logicalIndex,
644
+ uniqueIndexName: (logicalIndex) => logicalIndex,
645
+ foreignKeyName: ({ referenceName }) => referenceName,
580
646
  };
647
+ const resolver = createNamingResolver(testSchema, "namespace", namingStrategy);
581
648
 
582
649
  const condition = {
583
650
  type: "compare" as const,
@@ -591,7 +658,8 @@ describe("where-builder", () => {
591
658
  condition,
592
659
  eb,
593
660
  new NodePostgresDriverConfig(),
594
- mapper,
661
+ undefined,
662
+ resolver,
595
663
  postsTable,
596
664
  );
597
665
 
@@ -682,17 +750,23 @@ describe("where-builder", () => {
682
750
  expect(processed).toEqual(values);
683
751
  });
684
752
 
685
- it("should use table name mapper when provided", () => {
686
- const mapper = {
687
- toPhysical: (ormName: string) => `prefix_${ormName}`,
688
- toLogical: (physicalName: string) => physicalName.replace("prefix_", ""),
753
+ it("should use naming resolver when provided", () => {
754
+ const namingStrategy: SqlNamingStrategy = {
755
+ namespaceScope: "suffix",
756
+ namespaceToSchema: (namespace) => namespace,
757
+ tableName: (logicalTable) => `prefix_${logicalTable}`,
758
+ columnName: (logicalColumn) => logicalColumn,
759
+ indexName: (logicalIndex) => logicalIndex,
760
+ uniqueIndexName: (logicalIndex) => logicalIndex,
761
+ foreignKeyName: ({ referenceName }) => referenceName,
689
762
  };
763
+ const resolver = createNamingResolver(testSchema, "namespace", namingStrategy);
690
764
 
691
765
  const values = {
692
766
  userId: new ReferenceSubquery(usersTable, "user-123"),
693
767
  };
694
768
 
695
- const processed = processReferenceSubqueries(values, kysely, mapper);
769
+ const processed = processReferenceSubqueries(values, kysely, resolver);
696
770
 
697
771
  // Compile the subquery to check it uses the mapped table name
698
772
  const subquery = processed["userId"] as unknown as { compile: () => { sql: string } };
@@ -8,22 +8,25 @@ import {
8
8
  } from "../../../schema/create";
9
9
  import type { Condition } from "../../../query/condition-builder";
10
10
  import { createSQLSerializer } from "../../../query/serialize/create-sql-serializer";
11
- import type { TableNameMapper } from "../../shared/table-name-mapper";
11
+ import type { NamingResolver } from "../../../naming/sql-naming";
12
12
  import type { DriverConfig } from "../driver-config";
13
+ import { sqliteStorageDefault, type SQLiteStorageMode } from "../sqlite-storage";
13
14
  import { ReferenceSubquery, resolveFragnoIdValue } from "../../../query/value-encoding";
15
+ import { isDbNow } from "../../../query/db-now";
14
16
  import type { AnyKysely, AnyExpressionBuilder, AnyExpressionWrapper } from "./sql-query-compiler";
15
17
 
16
18
  /**
17
19
  * Returns the fully qualified SQL name for a column (table.column).
18
20
  *
19
21
  * @param column - The column to get the full name for
20
- * @param mapper - Optional table name mapper for namespace prefixing
22
+ * @param resolver - Optional naming resolver for namespace prefixing
21
23
  * @returns The fully qualified SQL name in the format "tableName.columnName"
22
24
  * @internal
23
25
  */
24
- export function fullSQLName(column: AnyColumn, mapper?: TableNameMapper): string {
25
- const tableName = mapper ? mapper.toPhysical(column.tableName) : column.tableName;
26
- return `${tableName}.${column.name}`;
26
+ export function fullSQLName(column: AnyColumn, resolver?: NamingResolver): string {
27
+ const tableName = resolver ? resolver.getTableName(column.tableName) : column.tableName;
28
+ const columnName = resolver ? resolver.getColumnName(column.tableName, column.name) : column.name;
29
+ return `${tableName}.${columnName}`;
27
30
  }
28
31
 
29
32
  /**
@@ -36,7 +39,7 @@ export function fullSQLName(column: AnyColumn, mapper?: TableNameMapper): string
36
39
  * @param condition - The condition tree to build the WHERE clause from
37
40
  * @param eb - Kysely expression builder for constructing SQL expressions
38
41
  * @param database - The database type (affects SQL generation)
39
- * @param mapper - Optional table name mapper for namespace prefixing
42
+ * @param resolver - Optional naming resolver for namespace prefixing
40
43
  * @param table - The table being queried (used for resolving reference columns)
41
44
  * @returns A Kysely expression wrapper representing the WHERE clause
42
45
  * @internal
@@ -45,10 +48,11 @@ export function buildWhere(
45
48
  condition: Condition,
46
49
  eb: AnyExpressionBuilder,
47
50
  driverConfig: DriverConfig,
48
- mapper?: TableNameMapper,
51
+ sqliteStorageMode?: SQLiteStorageMode,
52
+ resolver?: NamingResolver,
49
53
  table?: AnyTable,
50
54
  ): AnyExpressionWrapper {
51
- const serializer = createSQLSerializer(driverConfig);
55
+ const serializer = createSQLSerializer(driverConfig, sqliteStorageMode);
52
56
 
53
57
  if (condition.type === "compare") {
54
58
  const left = condition.a;
@@ -56,25 +60,46 @@ export function buildWhere(
56
60
  let val = condition.b;
57
61
 
58
62
  if (!(val instanceof Column)) {
59
- // Handle reference columns specially
60
- if (left.role === "reference" && table) {
63
+ if (isDbNow(val)) {
64
+ if (driverConfig.databaseType === "sqlite") {
65
+ const storageMode = sqliteStorageMode ?? sqliteStorageDefault;
66
+ const storage =
67
+ left.type === "date" ? storageMode.dateStorage : storageMode.timestampStorage;
68
+ if ((left.type === "timestamp" || left.type === "date") && storage === "epoch-ms") {
69
+ val = sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`;
70
+ } else {
71
+ val = sql`CURRENT_TIMESTAMP`;
72
+ }
73
+ } else {
74
+ val = sql`CURRENT_TIMESTAMP`;
75
+ }
76
+ } else if (left.role === "reference" && table) {
77
+ // Handle reference columns specially
61
78
  if (typeof val === "string") {
62
79
  // String external ID - create subquery to lookup internal ID
63
80
  const relation = Object.values(table.relations).find((rel) =>
64
- rel.on.some(([localCol]) => localCol === left.ormName),
81
+ rel.on.some(([localCol]) => localCol === left.name),
65
82
  );
66
83
  if (relation) {
67
84
  const refTable = relation.table;
68
85
  const internalIdCol = refTable.getInternalIdColumn();
69
86
  const idCol = refTable.getIdColumn();
70
- const physicalTableName = mapper
71
- ? mapper.toPhysical(refTable.ormName)
72
- : refTable.ormName;
87
+ const physicalTableName = resolver
88
+ ? resolver.getTableName(refTable.name)
89
+ : refTable.name;
73
90
 
74
91
  val = eb
75
92
  .selectFrom(physicalTableName)
76
- .select(internalIdCol.name)
77
- .where(idCol.name, "=", val)
93
+ .select(
94
+ resolver
95
+ ? resolver.getColumnName(refTable.name, internalIdCol.name)
96
+ : internalIdCol.name,
97
+ )
98
+ .where(
99
+ resolver ? resolver.getColumnName(refTable.name, idCol.name) : idCol.name,
100
+ "=",
101
+ val,
102
+ )
78
103
  .limit(1);
79
104
  }
80
105
  } else if (val instanceof FragnoId && val.internalId !== undefined) {
@@ -83,20 +108,28 @@ export function buildWhere(
83
108
  } else if (val instanceof FragnoId && val.internalId === undefined) {
84
109
  // FragnoId without internal ID - create subquery using external ID
85
110
  const relation = Object.values(table.relations).find((rel) =>
86
- rel.on.some(([localCol]) => localCol === left.ormName),
111
+ rel.on.some(([localCol]) => localCol === left.name),
87
112
  );
88
113
  if (relation) {
89
114
  const refTable = relation.table;
90
115
  const internalIdCol = refTable.getInternalIdColumn();
91
116
  const idCol = refTable.getIdColumn();
92
- const physicalTableName = mapper
93
- ? mapper.toPhysical(refTable.ormName)
94
- : refTable.ormName;
117
+ const physicalTableName = resolver
118
+ ? resolver.getTableName(refTable.name)
119
+ : refTable.name;
95
120
 
96
121
  val = eb
97
122
  .selectFrom(physicalTableName)
98
- .select(internalIdCol.name)
99
- .where(idCol.name, "=", val.externalId)
123
+ .select(
124
+ resolver
125
+ ? resolver.getColumnName(refTable.name, internalIdCol.name)
126
+ : internalIdCol.name,
127
+ )
128
+ .where(
129
+ resolver ? resolver.getColumnName(refTable.name, idCol.name) : idCol.name,
130
+ "=",
131
+ val.externalId,
132
+ )
100
133
  .limit(1);
101
134
  }
102
135
  } else if (val instanceof FragnoReference) {
@@ -122,54 +155,68 @@ export function buildWhere(
122
155
  v = "like";
123
156
  rhs =
124
157
  val instanceof Column
125
- ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))}, '%')`
158
+ ? sql`concat('%', ${eb.ref(fullSQLName(val, resolver))}, '%')`
126
159
  : `%${val}%`;
127
160
  break;
128
161
  case "not contains":
129
162
  v = "not like";
130
163
  rhs =
131
164
  val instanceof Column
132
- ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))}, '%')`
165
+ ? sql`concat('%', ${eb.ref(fullSQLName(val, resolver))}, '%')`
133
166
  : `%${val}%`;
134
167
  break;
135
168
  case "starts with":
136
169
  v = "like";
137
170
  rhs =
138
- val instanceof Column ? sql`concat(${eb.ref(fullSQLName(val, mapper))}, '%')` : `${val}%`;
171
+ val instanceof Column
172
+ ? sql`concat(${eb.ref(fullSQLName(val, resolver))}, '%')`
173
+ : `${val}%`;
139
174
  break;
140
175
  case "not starts with":
141
176
  v = "not like";
142
177
  rhs =
143
- val instanceof Column ? sql`concat(${eb.ref(fullSQLName(val, mapper))}, '%')` : `${val}%`;
178
+ val instanceof Column
179
+ ? sql`concat(${eb.ref(fullSQLName(val, resolver))}, '%')`
180
+ : `${val}%`;
144
181
  break;
145
182
  case "ends with":
146
183
  v = "like";
147
184
  rhs =
148
- val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))})` : `%${val}`;
185
+ val instanceof Column
186
+ ? sql`concat('%', ${eb.ref(fullSQLName(val, resolver))})`
187
+ : `%${val}`;
149
188
  break;
150
189
  case "not ends with":
151
190
  v = "not like";
152
191
  rhs =
153
- val instanceof Column ? sql`concat('%', ${eb.ref(fullSQLName(val, mapper))})` : `%${val}`;
192
+ val instanceof Column
193
+ ? sql`concat('%', ${eb.ref(fullSQLName(val, resolver))})`
194
+ : `%${val}`;
154
195
  break;
155
196
  default:
156
197
  v = op;
157
- rhs = val instanceof Column ? eb.ref(fullSQLName(val, mapper)) : val;
198
+ rhs = val instanceof Column ? eb.ref(fullSQLName(val, resolver)) : val;
158
199
  }
159
200
 
160
- return eb(fullSQLName(left, mapper), v, rhs);
201
+ return eb(fullSQLName(left, resolver), v, rhs);
161
202
  }
162
203
 
163
204
  // Nested conditions
164
205
  if (condition.type === "and") {
165
- return eb.and(condition.items.map((v) => buildWhere(v, eb, driverConfig, mapper, table)));
206
+ return eb.and(
207
+ condition.items.map((v) =>
208
+ buildWhere(v, eb, driverConfig, sqliteStorageMode, resolver, table),
209
+ ),
210
+ );
166
211
  }
167
212
 
168
213
  if (condition.type === "not") {
169
- return eb.not(buildWhere(condition.item, eb, driverConfig, mapper, table));
214
+ return eb.not(buildWhere(condition.item, eb, driverConfig, sqliteStorageMode, resolver, table));
170
215
  }
171
216
 
172
- return eb.or(condition.items.map((v) => buildWhere(v, eb, driverConfig, mapper, table)));
217
+ return eb.or(
218
+ condition.items.map((v) => buildWhere(v, eb, driverConfig, sqliteStorageMode, resolver, table)),
219
+ );
173
220
  }
174
221
 
175
222
  /**
@@ -177,17 +224,18 @@ export function buildWhere(
177
224
  *
178
225
  * @param values - The encoded values that may contain ReferenceSubquery objects
179
226
  * @param kysely - The Kysely database instance for building subqueries
180
- * @param mapper - Optional table name mapper for namespace prefixing
227
+ * @param resolver - Optional naming resolver for namespace prefixing
181
228
  * @returns Processed values with subqueries in place of ReferenceSubquery markers
182
229
  * @internal
183
230
  */
184
231
  export function processReferenceSubqueries(
185
232
  values: Record<string, unknown>,
186
233
  kysely: AnyKysely,
187
- mapper?: TableNameMapper,
234
+ resolver?: NamingResolver,
188
235
  ): Record<string, unknown> {
189
236
  const processed: Record<string, unknown> = {};
190
- const getTableName = (table: AnyTable) => (mapper ? mapper.toPhysical(table.name) : table.name);
237
+ const getTableName = (table: AnyTable) =>
238
+ resolver ? resolver.getTableName(table.name) : table.name;
191
239
 
192
240
  for (const [key, value] of Object.entries(values)) {
193
241
  if (value instanceof ReferenceSubquery) {
@@ -196,11 +244,15 @@ export function processReferenceSubqueries(
196
244
  const tableName = getTableName(refTable);
197
245
  const internalIdCol = refTable.getInternalIdColumn().name;
198
246
  const idCol = refTable.getIdColumn().name;
247
+ const internalIdColumnName = resolver
248
+ ? resolver.getColumnName(refTable.name, internalIdCol)
249
+ : internalIdCol;
250
+ const idColumnName = resolver ? resolver.getColumnName(refTable.name, idCol) : idCol;
199
251
 
200
252
  processed[key] = kysely
201
253
  .selectFrom(tableName)
202
- .select(internalIdCol)
203
- .where(idCol, "=", externalId)
254
+ .select(internalIdColumnName)
255
+ .where(idColumnName, "=", externalId)
204
256
  .limit(1);
205
257
  } else {
206
258
  processed[key] = value;
@@ -1,6 +1,6 @@
1
1
  import { KyselyPGlite } from "kysely-pglite";
2
2
  import { beforeAll, describe, expect, expectTypeOf, it } from "vitest";
3
- import { KyselyAdapter } from "./kysely-adapter";
3
+ import { SqlAdapter } from "./generic-sql-adapter";
4
4
  import {
5
5
  column,
6
6
  idColumn,
@@ -10,11 +10,11 @@ import {
10
10
  type FragnoReference,
11
11
  } from "../../schema/create";
12
12
  import { Cursor } from "../../query/cursor";
13
- import { PGLiteDriverConfig } from "../generic-sql/driver-config";
13
+ import { PGLiteDriverConfig } from "./driver-config";
14
14
  import { internalSchema } from "../../fragments/internal-fragment";
15
15
 
16
- describe("KyselyAdapter PGLite", () => {
17
- const testSchema = schema((s) => {
16
+ describe("SqlAdapter PGLite", () => {
17
+ const testSchema = schema("test", (s) => {
18
18
  return s
19
19
  .addTable("users", (t) => {
20
20
  return t
@@ -96,12 +96,12 @@ describe("KyselyAdapter PGLite", () => {
96
96
  });
97
97
  });
98
98
 
99
- let adapter: KyselyAdapter;
99
+ let adapter: SqlAdapter;
100
100
 
101
101
  beforeAll(async () => {
102
102
  const { dialect } = await KyselyPGlite.create();
103
103
 
104
- adapter = new KyselyAdapter({
104
+ adapter = new SqlAdapter({
105
105
  dialect,
106
106
  driverConfig: new PGLiteDriverConfig(),
107
107
  });