@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
@@ -23,7 +23,7 @@ type InferJoinOut<T> =
23
23
  type InferJoinOutPrettify<T> = RecursivePrettify<InferJoinOut<T>>;
24
24
 
25
25
  describe("UnitOfWork type tests", () => {
26
- const testSchema = schema((s) => {
26
+ const testSchema = schema("test", (s) => {
27
27
  return s
28
28
  .addTable("users", (t) => {
29
29
  return t
@@ -4,6 +4,7 @@ import {
4
4
  type UOWCompiler,
5
5
  type UOWDecoder,
6
6
  createUnitOfWork,
7
+ UnitOfWork,
7
8
  type InferIdColumnName,
8
9
  type IndexColumns,
9
10
  } from "./unit-of-work";
@@ -38,7 +39,7 @@ function createMockDecoder(): UOWDecoder {
38
39
 
39
40
  describe("FindBuilder", () => {
40
41
  it("should support primary index", () => {
41
- const testSchema = schema((s) =>
42
+ const testSchema = schema("test", (s) =>
42
43
  s.addTable("users", (t) =>
43
44
  t
44
45
  .addColumn("id", idColumn())
@@ -59,7 +60,7 @@ describe("FindBuilder", () => {
59
60
  });
60
61
 
61
62
  it("should support custom indexes", () => {
62
- const testSchema = schema((s) =>
63
+ const testSchema = schema("test", (s) =>
63
64
  s.addTable("users", (t) =>
64
65
  t
65
66
  .addColumn("id", idColumn())
@@ -82,7 +83,7 @@ describe("FindBuilder", () => {
82
83
  });
83
84
 
84
85
  it("should support cursor-based pagination", () => {
85
- const testSchema = schema((s) =>
86
+ const testSchema = schema("test", (s) =>
86
87
  s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
87
88
  );
88
89
 
@@ -102,7 +103,7 @@ describe("FindBuilder", () => {
102
103
  });
103
104
 
104
105
  it("should support backward cursor pagination", () => {
105
- const testSchema = schema((s) =>
106
+ const testSchema = schema("test", (s) =>
106
107
  s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
107
108
  );
108
109
 
@@ -122,7 +123,7 @@ describe("FindBuilder", () => {
122
123
  });
123
124
 
124
125
  it("should throw RangeError for pageSize <= 0", () => {
125
- const testSchema = schema((s) =>
126
+ const testSchema = schema("test", (s) =>
126
127
  s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
127
128
  );
128
129
 
@@ -142,7 +143,7 @@ describe("FindBuilder", () => {
142
143
  });
143
144
 
144
145
  it("should throw RangeError for non-integer pageSize", () => {
145
- const testSchema = schema((s) =>
146
+ const testSchema = schema("test", (s) =>
146
147
  s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
147
148
  );
148
149
 
@@ -166,7 +167,7 @@ describe("FindBuilder", () => {
166
167
  });
167
168
 
168
169
  it("should throw if index doesn't exist", () => {
169
- const testSchema = schema((s) =>
170
+ const testSchema = schema("test", (s) =>
170
171
  s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
171
172
  );
172
173
 
@@ -177,7 +178,7 @@ describe("FindBuilder", () => {
177
178
  });
178
179
 
179
180
  it("should throw if finalized without index", () => {
180
- const testSchema = schema((s) =>
181
+ const testSchema = schema("test", (s) =>
181
182
  s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
182
183
  );
183
184
 
@@ -190,7 +191,7 @@ describe("FindBuilder", () => {
190
191
  });
191
192
 
192
193
  it("should support count operations", () => {
193
- const testSchema = schema((s) =>
194
+ const testSchema = schema("test", (s) =>
194
195
  s.addTable("users", (t) =>
195
196
  t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("age", "integer"),
196
197
  ),
@@ -205,7 +206,7 @@ describe("FindBuilder", () => {
205
206
  });
206
207
 
207
208
  it("should throw when using both select and selectCount", () => {
208
- const testSchema = schema((s) =>
209
+ const testSchema = schema("test", (s) =>
209
210
  s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
210
211
  );
211
212
 
@@ -228,7 +229,7 @@ describe("FindBuilder", () => {
228
229
  });
229
230
 
230
231
  it("should support orderByIndex", () => {
231
- const testSchema = schema((s) =>
232
+ const testSchema = schema("test", (s) =>
232
233
  s.addTable("users", (t) =>
233
234
  t
234
235
  .addColumn("id", idColumn())
@@ -257,7 +258,7 @@ describe("FindBuilder", () => {
257
258
  });
258
259
 
259
260
  it("should support join operations", () => {
260
- const testSchema = schema((s) =>
261
+ const testSchema = schema("test", (s) =>
261
262
  s
262
263
  .addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string"))
263
264
  .addTable("posts", (t) =>
@@ -291,7 +292,7 @@ describe("FindBuilder", () => {
291
292
  });
292
293
 
293
294
  it("should support join operations without builder function", () => {
294
- const testSchema = schema((s) =>
295
+ const testSchema = schema("test", (s) =>
295
296
  s
296
297
  .addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string"))
297
298
  .addTable("posts", (t) =>
@@ -325,7 +326,7 @@ describe("FindBuilder", () => {
325
326
  });
326
327
 
327
328
  it("should support join with whereIndex", () => {
328
- const testSchema = schema((s) =>
329
+ const testSchema = schema("test", (s) =>
329
330
  s
330
331
  .addTable("users", (t) =>
331
332
  t
@@ -373,7 +374,7 @@ describe("FindBuilder", () => {
373
374
  });
374
375
 
375
376
  it("should support join with orderByIndex", () => {
376
- const testSchema = schema((s) =>
377
+ const testSchema = schema("test", (s) =>
377
378
  s
378
379
  .addTable("users", (t) =>
379
380
  t
@@ -418,7 +419,7 @@ describe("FindBuilder", () => {
418
419
  });
419
420
 
420
421
  it("should support join with pageSize", () => {
421
- const testSchema = schema((s) =>
422
+ const testSchema = schema("test", (s) =>
422
423
  s
423
424
  .addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string"))
424
425
  .addTable("posts", (t) =>
@@ -453,7 +454,7 @@ describe("FindBuilder", () => {
453
454
  });
454
455
 
455
456
  it("should throw RangeError for invalid pageSize in join", () => {
456
- const testSchema = schema((s) =>
457
+ const testSchema = schema("test", (s) =>
457
458
  s
458
459
  .addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string"))
459
460
  .addTable("posts", (t) =>
@@ -498,7 +499,7 @@ describe("FindBuilder", () => {
498
499
  });
499
500
 
500
501
  it("should support nested joins", () => {
501
- const testSchema = schema((s) =>
502
+ const testSchema = schema("test", (s) =>
502
503
  s
503
504
  .addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string"))
504
505
  .addTable("posts", (t) =>
@@ -564,7 +565,7 @@ describe("FindBuilder", () => {
564
565
  });
565
566
 
566
567
  describe("IndexedConditionBuilder", () => {
567
- const testSchema = schema((s) =>
568
+ const testSchema = schema("test", (s) =>
568
569
  s.addTable("users", (t) =>
569
570
  t
570
571
  .addColumn("id", idColumn())
@@ -585,7 +586,7 @@ describe("IndexedConditionBuilder", () => {
585
586
  const indexedColumns = new Set<string>();
586
587
  for (const index of Object.values(usersTable.indexes)) {
587
588
  for (const col of index.columns) {
588
- indexedColumns.add(col.ormName);
589
+ indexedColumns.add(col.name);
589
590
  }
590
591
  }
591
592
 
@@ -712,7 +713,7 @@ describe("IndexedConditionBuilder", () => {
712
713
  describe("type safety", () => {
713
714
  it("should restrict to only indexed columns at type level", () => {
714
715
  // This schema has "bio" column that is NOT indexed
715
- const typeTestSchema = schema((s) =>
716
+ const typeTestSchema = schema("typetest", (s) =>
716
717
  s.addTable("users", (t) =>
717
718
  t
718
719
  .addColumn("id", idColumn())
@@ -770,7 +771,7 @@ describe("IndexedConditionBuilder", () => {
770
771
  });
771
772
 
772
773
  describe("UpdateBuilder with string ID", () => {
773
- const testSchema = schema((s) =>
774
+ const testSchema = schema("test", (s) =>
774
775
  s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
775
776
  );
776
777
 
@@ -806,7 +807,7 @@ describe("UpdateBuilder with string ID", () => {
806
807
  });
807
808
 
808
809
  describe("DeleteBuilder with string ID", () => {
809
- const testSchema = schema((s) =>
810
+ const testSchema = schema("test", (s) =>
810
811
  s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", "string")),
811
812
  );
812
813
 
@@ -839,7 +840,7 @@ describe("DeleteBuilder with string ID", () => {
839
840
  });
840
841
 
841
842
  describe("generateId", () => {
842
- const testSchema = schema((s) =>
843
+ const testSchema = schema("test", (s) =>
843
844
  s.addTable("users", (t) =>
844
845
  t.addColumn("id", idColumn()).addColumn("email", "string").addColumn("name", "string"),
845
846
  ),
@@ -903,7 +904,7 @@ describe("generateId", () => {
903
904
  });
904
905
 
905
906
  describe("getCreatedIds", () => {
906
- const testSchema = schema((s) =>
907
+ const testSchema = schema("test", (s) =>
907
908
  s.addTable("users", (t) =>
908
909
  t.addColumn("id", idColumn()).addColumn("email", "string").addColumn("name", "string"),
909
910
  ),
@@ -1019,20 +1020,20 @@ describe("getCreatedIds", () => {
1019
1020
  describe("Phase promises with multiple views", () => {
1020
1021
  it("should return only operations added to the current view when using retrievalPhase promise", async () => {
1021
1022
  // Create two separate schemas
1022
- const schema1 = schema((s) =>
1023
+ const schema1 = schema("schema1", (s) =>
1023
1024
  s.addTable("users", (t) =>
1024
1025
  t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("email", "string"),
1025
1026
  ),
1026
1027
  );
1027
1028
 
1028
- const schema2 = schema((s) =>
1029
+ const schema2 = schema("schema2", (s) =>
1029
1030
  s.addTable("posts", (t) =>
1030
1031
  t.addColumn("id", idColumn()).addColumn("title", "string").addColumn("content", "string"),
1031
1032
  ),
1032
1033
  );
1033
1034
 
1034
1035
  // Create a schema namespace map
1035
- const schemaNamespaceMap = new WeakMap<typeof schema1 | typeof schema2, string>();
1036
+ const schemaNamespaceMap = new WeakMap<typeof schema1 | typeof schema2, string | null>();
1036
1037
  schemaNamespaceMap.set(schema1, "namespace1");
1037
1038
  schemaNamespaceMap.set(schema2, "namespace2");
1038
1039
 
@@ -1089,7 +1090,7 @@ describe("Phase promises with multiple views", () => {
1089
1090
  });
1090
1091
 
1091
1092
  it("should isolate operations when getUnitOfWork is called multiple times with same schema", async () => {
1092
- const testSchema = schema((s) =>
1093
+ const testSchema = schema("test", (s) =>
1093
1094
  s.addTable("users", (t) =>
1094
1095
  t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("email", "string"),
1095
1096
  ),
@@ -1135,19 +1136,19 @@ describe("Phase promises with multiple views", () => {
1135
1136
  });
1136
1137
 
1137
1138
  it("should show that getCreatedIds returns ALL created IDs regardless of which view created them", async () => {
1138
- const schema1 = schema((s) =>
1139
+ const schema1 = schema("schema1", (s) =>
1139
1140
  s.addTable("users", (t) =>
1140
1141
  t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("email", "string"),
1141
1142
  ),
1142
1143
  );
1143
1144
 
1144
- const schema2 = schema((s) =>
1145
+ const schema2 = schema("schema2", (s) =>
1145
1146
  s.addTable("posts", (t) =>
1146
1147
  t.addColumn("id", idColumn()).addColumn("title", "string").addColumn("content", "string"),
1147
1148
  ),
1148
1149
  );
1149
1150
 
1150
- const schemaNamespaceMap = new WeakMap<typeof schema1 | typeof schema2, string>();
1151
+ const schemaNamespaceMap = new WeakMap<typeof schema1 | typeof schema2, string | null>();
1151
1152
  schemaNamespaceMap.set(schema1, "namespace1");
1152
1153
  schemaNamespaceMap.set(schema2, "namespace2");
1153
1154
 
@@ -1190,19 +1191,19 @@ describe("Phase promises with multiple views", () => {
1190
1191
  });
1191
1192
 
1192
1193
  it("should generate unique IDs when multiple views create items", async () => {
1193
- const schema1 = schema((s) =>
1194
+ const schema1 = schema("schema1", (s) =>
1194
1195
  s.addTable("users", (t) =>
1195
1196
  t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("email", "string"),
1196
1197
  ),
1197
1198
  );
1198
1199
 
1199
- const schema2 = schema((s) =>
1200
+ const schema2 = schema("schema2", (s) =>
1200
1201
  s.addTable("posts", (t) =>
1201
1202
  t.addColumn("id", idColumn()).addColumn("title", "string").addColumn("content", "string"),
1202
1203
  ),
1203
1204
  );
1204
1205
 
1205
- const schemaNamespaceMap = new WeakMap<typeof schema1 | typeof schema2, string>();
1206
+ const schemaNamespaceMap = new WeakMap<typeof schema1 | typeof schema2, string | null>();
1206
1207
  schemaNamespaceMap.set(schema1, "namespace1");
1207
1208
  schemaNamespaceMap.set(schema2, "namespace2");
1208
1209
 
@@ -1257,8 +1258,138 @@ describe("Phase promises with multiple views", () => {
1257
1258
  });
1258
1259
  });
1259
1260
 
1261
+ describe("Instrumentation", () => {
1262
+ const testSchema = schema("test", (s) =>
1263
+ s.addTable("users", (t) =>
1264
+ t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("email", "string"),
1265
+ ),
1266
+ );
1267
+
1268
+ it("should run instrumentation hooks around retrieve and mutate phases", async () => {
1269
+ const calls: string[] = [];
1270
+ const contexts: Array<{
1271
+ phase: string;
1272
+ idempotencyKey: string;
1273
+ retrievalOpsCount: number;
1274
+ mutationOpsCount: number;
1275
+ }> = [];
1276
+
1277
+ const executor = {
1278
+ executeRetrievalPhase: async () => [[]],
1279
+ executeMutationPhase: async () => ({ success: true, createdInternalIds: [] }),
1280
+ };
1281
+
1282
+ const uow = new UnitOfWork(createMockCompiler(), executor, createMockDecoder(), undefined, {
1283
+ instrumentation: {
1284
+ beforeRetrieve: (ctx) => {
1285
+ calls.push("beforeRetrieve");
1286
+ contexts.push({
1287
+ phase: ctx.phase,
1288
+ idempotencyKey: ctx.idempotencyKey,
1289
+ retrievalOpsCount: ctx.retrievalOpsCount,
1290
+ mutationOpsCount: ctx.mutationOpsCount,
1291
+ });
1292
+ },
1293
+ afterRetrieve: (ctx) => {
1294
+ calls.push("afterRetrieve");
1295
+ contexts.push({
1296
+ phase: ctx.phase,
1297
+ idempotencyKey: ctx.idempotencyKey,
1298
+ retrievalOpsCount: ctx.retrievalOpsCount,
1299
+ mutationOpsCount: ctx.mutationOpsCount,
1300
+ });
1301
+ },
1302
+ beforeMutate: (ctx) => {
1303
+ calls.push("beforeMutate");
1304
+ contexts.push({
1305
+ phase: ctx.phase,
1306
+ idempotencyKey: ctx.idempotencyKey,
1307
+ retrievalOpsCount: ctx.retrievalOpsCount,
1308
+ mutationOpsCount: ctx.mutationOpsCount,
1309
+ });
1310
+ },
1311
+ afterMutate: (ctx) => {
1312
+ calls.push("afterMutate");
1313
+ contexts.push({
1314
+ phase: ctx.phase,
1315
+ idempotencyKey: ctx.idempotencyKey,
1316
+ retrievalOpsCount: ctx.retrievalOpsCount,
1317
+ mutationOpsCount: ctx.mutationOpsCount,
1318
+ });
1319
+ },
1320
+ },
1321
+ });
1322
+
1323
+ const typed = uow.forSchema(testSchema);
1324
+ typed.find("users", (b) => b.whereIndex("primary"));
1325
+ typed.create("users", { name: "Alice", email: "alice@example.com" });
1326
+
1327
+ await uow.executeRetrieve();
1328
+ await uow.executeMutations();
1329
+
1330
+ expect(calls).toEqual(["beforeRetrieve", "afterRetrieve", "beforeMutate", "afterMutate"]);
1331
+
1332
+ for (const ctx of contexts) {
1333
+ expect(ctx.idempotencyKey).toBeTypeOf("string");
1334
+ expect(ctx.idempotencyKey.length).toBeGreaterThan(0);
1335
+ expect(ctx.retrievalOpsCount).toBe(1);
1336
+ expect(ctx.mutationOpsCount).toBe(1);
1337
+ }
1338
+ });
1339
+
1340
+ it("should short-circuit mutations on conflict injection", async () => {
1341
+ let mutationExecuted = false;
1342
+
1343
+ const executor = {
1344
+ executeRetrievalPhase: async () => [],
1345
+ executeMutationPhase: async () => {
1346
+ mutationExecuted = true;
1347
+ return { success: true, createdInternalIds: [] };
1348
+ },
1349
+ };
1350
+
1351
+ const uow = new UnitOfWork(createMockCompiler(), executor, createMockDecoder(), undefined, {
1352
+ instrumentation: {
1353
+ beforeMutate: () => ({ type: "conflict", reason: "Injected conflict" }),
1354
+ afterMutate: () => {
1355
+ throw new Error("afterMutate should not run");
1356
+ },
1357
+ },
1358
+ });
1359
+
1360
+ uow.forSchema(testSchema).create("users", { name: "Alice", email: "alice@example.com" });
1361
+
1362
+ const result = await uow.executeMutations();
1363
+ expect(result.success).toBe(false);
1364
+ expect(mutationExecuted).toBe(false);
1365
+ });
1366
+
1367
+ it("should throw on error injection before retrieval", async () => {
1368
+ let retrievalExecuted = false;
1369
+
1370
+ const executor = {
1371
+ executeRetrievalPhase: async () => {
1372
+ retrievalExecuted = true;
1373
+ return [];
1374
+ },
1375
+ executeMutationPhase: async () => ({ success: true, createdInternalIds: [] }),
1376
+ };
1377
+
1378
+ const uow = new UnitOfWork(createMockCompiler(), executor, createMockDecoder(), undefined, {
1379
+ instrumentation: {
1380
+ beforeRetrieve: () => ({ type: "error", error: new Error("Injected failure") }),
1381
+ },
1382
+ });
1383
+
1384
+ uow.forSchema(testSchema).find("users", (b) => b.whereIndex("primary"));
1385
+
1386
+ await expect(uow.executeRetrieve()).rejects.toThrow("Injected failure");
1387
+ expect(retrievalExecuted).toBe(false);
1388
+ });
1389
+ });
1390
+
1260
1391
  describe("Error Handling", () => {
1261
- const testSchema = schema((s) =>
1392
+ const testSchema = schema("test", (s) =>
1262
1393
  s.addTable("users", (t) =>
1263
1394
  t.addColumn("id", idColumn()).addColumn("name", "string").addColumn("email", "string"),
1264
1395
  ),
@@ -1543,7 +1674,7 @@ describe("Error Handling", () => {
1543
1674
  });
1544
1675
 
1545
1676
  describe("findFirst convenience method", () => {
1546
- const testSchema = schema((s) =>
1677
+ const testSchema = schema("test", (s) =>
1547
1678
  s
1548
1679
  .addTable("users", (t) =>
1549
1680
  t