@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
@@ -0,0 +1,176 @@
1
+ import { RequestContextStorage } from "../../packages/fragno/dist/api/request-context-storage.js";
2
+ import { fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
3
+ import { createNamingResolver, suffixNamingStrategy } from "../../naming/sql-naming.js";
4
+ import { UnitOfWork } from "../../query/unit-of-work/unit-of-work.js";
5
+ import { resolveInMemoryAdapterOptions } from "./options.js";
6
+ import { createInMemoryStore, ensureNamespaceStore } from "./store.js";
7
+ import { InMemoryUowDecoder, createInMemoryUowCompiler, createInMemoryUowExecutor } from "./in-memory-uow.js";
8
+
9
+ //#region src/adapters/in-memory/in-memory-adapter.ts
10
+ var UpdateManySpecialBuilder = class {
11
+ #indexName;
12
+ #condition;
13
+ #setValues;
14
+ whereIndex(indexName, condition) {
15
+ this.#indexName = indexName;
16
+ this.#condition = condition;
17
+ return this;
18
+ }
19
+ set(values) {
20
+ this.#setValues = values;
21
+ return this;
22
+ }
23
+ getConfig() {
24
+ return {
25
+ indexName: this.#indexName,
26
+ condition: this.#condition,
27
+ setValues: this.#setValues
28
+ };
29
+ }
30
+ };
31
+ const hasIdField = (record) => record !== null && typeof record === "object" && "id" in record;
32
+ var InMemoryAdapter = class {
33
+ options;
34
+ namingStrategy;
35
+ #contextStorage;
36
+ #store = createInMemoryStore();
37
+ #schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
38
+ #schemaByNamespace = /* @__PURE__ */ new Map();
39
+ constructor(options = {}) {
40
+ this.options = resolveInMemoryAdapterOptions(options);
41
+ this.namingStrategy = options.namingStrategy ?? suffixNamingStrategy;
42
+ this.#contextStorage = new RequestContextStorage();
43
+ }
44
+ get [fragnoDatabaseAdapterNameFakeSymbol]() {
45
+ return "in-memory";
46
+ }
47
+ get [fragnoDatabaseAdapterVersionFakeSymbol]() {
48
+ return 0;
49
+ }
50
+ get contextStorage() {
51
+ return this.#contextStorage;
52
+ }
53
+ async getSchemaVersion(_namespace) {}
54
+ async isConnectionHealthy() {
55
+ return true;
56
+ }
57
+ async close() {}
58
+ async reset() {
59
+ this.#store.namespaces.clear();
60
+ for (const [namespaceKey, { schema, namespace }] of this.#schemaByNamespace) {
61
+ const resolver = createNamingResolver(schema, namespace, this.namingStrategy);
62
+ ensureNamespaceStore(this.#store, namespaceKey, schema, resolver);
63
+ }
64
+ }
65
+ createQueryEngine(schema, namespace) {
66
+ this.#schemaNamespaceMap.set(schema, namespace);
67
+ const namespaceKey = namespace ?? schema.name;
68
+ this.#schemaByNamespace.set(namespaceKey, {
69
+ schema,
70
+ namespace
71
+ });
72
+ const resolverFactory = (schemaForResolver, namespaceForResolver) => createNamingResolver(schemaForResolver, namespaceForResolver, this.namingStrategy);
73
+ const resolver = resolverFactory(schema, namespace);
74
+ ensureNamespaceStore(this.#store, namespaceKey, schema, resolver);
75
+ const compiler = createInMemoryUowCompiler();
76
+ const executor = createInMemoryUowExecutor(this.#store, this.options, resolverFactory);
77
+ const decoder = new InMemoryUowDecoder(resolverFactory);
78
+ const createUow = (opts) => new UnitOfWork(compiler, executor, decoder, opts?.name, opts?.config, this.#schemaNamespaceMap).forSchema(schema);
79
+ return {
80
+ now: async () => this.options.clock.now(),
81
+ async find(tableName, builderFn) {
82
+ const uow = createUow();
83
+ uow.find(tableName, builderFn);
84
+ const [result] = await uow.executeRetrieve();
85
+ return result ?? [];
86
+ },
87
+ async findWithCursor(tableName, builderFn) {
88
+ const [result] = await createUow().findWithCursor(tableName, builderFn).executeRetrieve();
89
+ return result;
90
+ },
91
+ async findFirst(tableName, builderFn) {
92
+ const uow = createUow();
93
+ if (builderFn) uow.find(tableName, (b) => {
94
+ builderFn(b);
95
+ return b.pageSize(1);
96
+ });
97
+ else uow.find(tableName, (b) => b.whereIndex("primary").pageSize(1));
98
+ const [result] = await uow.executeRetrieve();
99
+ return result?.[0] ?? null;
100
+ },
101
+ async create(tableName, values) {
102
+ const uow = createUow();
103
+ uow.create(tableName, values);
104
+ const { success } = await uow.executeMutations();
105
+ if (!success) throw new Error("Failed to create record");
106
+ const createdId = uow.getCreatedIds()[0];
107
+ if (!createdId) throw new Error("Failed to get created ID");
108
+ return createdId;
109
+ },
110
+ async createMany(tableName, valuesArray) {
111
+ const uow = createUow();
112
+ for (const values of valuesArray) uow.create(tableName, values);
113
+ const { success } = await uow.executeMutations();
114
+ if (!success) throw new Error("Failed to create records");
115
+ return uow.getCreatedIds();
116
+ },
117
+ async update(tableName, id, builderFn) {
118
+ const uow = createUow();
119
+ uow.update(tableName, id, builderFn);
120
+ const { success } = await uow.executeMutations();
121
+ if (!success) throw new Error("Failed to update record (version conflict or record not found)");
122
+ },
123
+ async updateMany(tableName, builderFn) {
124
+ if (!schema.tables[tableName]) throw new Error(`Table ${tableName} not found in schema`);
125
+ const specialBuilder = new UpdateManySpecialBuilder();
126
+ builderFn(specialBuilder);
127
+ const { indexName, condition, setValues } = specialBuilder.getConfig();
128
+ if (!indexName) throw new Error("whereIndex() must be called in updateMany");
129
+ if (!setValues) throw new Error("set() must be called in updateMany");
130
+ const findUow = createUow();
131
+ findUow.find(tableName, (b) => {
132
+ if (condition !== void 0 && condition !== null) return b.whereIndex(indexName, condition);
133
+ return b.whereIndex(indexName);
134
+ });
135
+ const [records] = await findUow.executeRetrieve();
136
+ if (!records || records.length === 0) return;
137
+ const updateUow = createUow();
138
+ for (const record of records) {
139
+ if (!hasIdField(record)) throw new Error("Record missing id field");
140
+ updateUow.update(tableName, record.id, (b) => b.set(setValues).check());
141
+ }
142
+ const { success } = await updateUow.executeMutations();
143
+ if (!success) throw new Error("Failed to update records (version conflict)");
144
+ },
145
+ async delete(tableName, id, builderFn) {
146
+ const uow = createUow();
147
+ uow.delete(tableName, id, builderFn);
148
+ const { success } = await uow.executeMutations();
149
+ if (!success) throw new Error("Failed to delete record (version conflict or record not found)");
150
+ },
151
+ async deleteMany(tableName, builderFn) {
152
+ const findUow = createUow();
153
+ findUow.find(tableName, builderFn);
154
+ const [records] = await findUow.executeRetrieve();
155
+ if (!records || records.length === 0) return;
156
+ const deleteUow = createUow();
157
+ for (const record of records) {
158
+ if (!hasIdField(record)) throw new Error("Record missing id field");
159
+ deleteUow.delete(tableName, record.id);
160
+ }
161
+ const { success } = await deleteUow.executeMutations();
162
+ if (!success) throw new Error("Failed to delete records (version conflict)");
163
+ },
164
+ createUnitOfWork(name, config) {
165
+ return createUow({
166
+ name,
167
+ config
168
+ });
169
+ }
170
+ };
171
+ }
172
+ };
173
+
174
+ //#endregion
175
+ export { InMemoryAdapter };
176
+ //# sourceMappingURL=in-memory-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-adapter.js","names":["#indexName","#condition","#setValues","#contextStorage","#store","#schemaByNamespace","#schemaNamespaceMap"],"sources":["../../../src/adapters/in-memory/in-memory-adapter.ts"],"sourcesContent":["import { RequestContextStorage } from \"@fragno-dev/core/internal/request-context-storage\";\nimport {\n fragnoDatabaseAdapterNameFakeSymbol,\n fragnoDatabaseAdapterVersionFakeSymbol,\n type DatabaseAdapter,\n type DatabaseContextStorage,\n} from \"../adapters\";\nimport type { AnySchema, AnyTable, FragnoId } from \"../../schema/create\";\nimport type { SimpleQueryInterface, TableToUpdateValues } from \"../../query/simple-query-interface\";\nimport {\n resolveInMemoryAdapterOptions,\n type InMemoryAdapterOptions,\n type ResolvedInMemoryAdapterOptions,\n} from \"./options\";\nimport { createInMemoryStore, ensureNamespaceStore } from \"./store\";\nimport {\n createInMemoryUowCompiler,\n createInMemoryUowExecutor,\n InMemoryUowDecoder,\n} from \"./in-memory-uow\";\nimport { UnitOfWork, type UnitOfWorkConfig } from \"../../query/unit-of-work/unit-of-work\";\nimport type { CursorResult } from \"../../query/cursor\";\nimport {\n createNamingResolver,\n suffixNamingStrategy,\n type SqlNamingStrategy,\n} from \"../../naming/sql-naming\";\n\nclass UpdateManySpecialBuilder<TTable extends AnyTable> {\n #indexName?: string;\n #condition?: unknown;\n #setValues?: TableToUpdateValues<TTable>;\n\n whereIndex(indexName: string, condition?: unknown): this {\n this.#indexName = indexName;\n this.#condition = condition;\n return this;\n }\n\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n getConfig() {\n return {\n indexName: this.#indexName,\n condition: this.#condition,\n setValues: this.#setValues,\n };\n }\n}\n\nconst hasIdField = (record: unknown): record is { id: string | FragnoId } =>\n record !== null && typeof record === \"object\" && \"id\" in record;\n\nexport type InMemoryUowConfig = UnitOfWorkConfig;\n\nexport class InMemoryAdapter implements DatabaseAdapter<InMemoryUowConfig> {\n readonly options: ResolvedInMemoryAdapterOptions;\n readonly namingStrategy: SqlNamingStrategy;\n\n #contextStorage: RequestContextStorage<DatabaseContextStorage>;\n #store = createInMemoryStore();\n #schemaNamespaceMap = new WeakMap<AnySchema, string | null>();\n #schemaByNamespace = new Map<string, { schema: AnySchema; namespace: string | null }>();\n\n constructor(options: InMemoryAdapterOptions = {}) {\n this.options = resolveInMemoryAdapterOptions(options);\n this.namingStrategy = options.namingStrategy ?? suffixNamingStrategy;\n this.#contextStorage = new RequestContextStorage();\n }\n\n get [fragnoDatabaseAdapterNameFakeSymbol](): string {\n return \"in-memory\";\n }\n\n get [fragnoDatabaseAdapterVersionFakeSymbol](): number {\n return 0;\n }\n\n get contextStorage(): RequestContextStorage<DatabaseContextStorage> {\n return this.#contextStorage;\n }\n\n async getSchemaVersion(_namespace: string): Promise<string | undefined> {\n return undefined;\n }\n\n async isConnectionHealthy(): Promise<boolean> {\n return true;\n }\n\n async close(): Promise<void> {\n return;\n }\n\n async reset(): Promise<void> {\n this.#store.namespaces.clear();\n for (const [namespaceKey, { schema, namespace }] of this.#schemaByNamespace) {\n const resolver = createNamingResolver(schema, namespace, this.namingStrategy);\n ensureNamespaceStore(this.#store, namespaceKey, schema, resolver);\n }\n }\n\n createQueryEngine<T extends AnySchema>(\n schema: T,\n namespace: string | null,\n ): SimpleQueryInterface<T, InMemoryUowConfig> {\n this.#schemaNamespaceMap.set(schema, namespace);\n const namespaceKey = namespace ?? schema.name;\n this.#schemaByNamespace.set(namespaceKey, { schema, namespace });\n const resolverFactory = (schemaForResolver: AnySchema, namespaceForResolver: string | null) =>\n createNamingResolver(schemaForResolver, namespaceForResolver, this.namingStrategy);\n const resolver = resolverFactory(schema, namespace);\n ensureNamespaceStore(this.#store, namespaceKey, schema, resolver);\n\n const compiler = createInMemoryUowCompiler();\n const executor = createInMemoryUowExecutor(this.#store, this.options, resolverFactory);\n const decoder = new InMemoryUowDecoder(resolverFactory);\n\n const createUow = (opts?: { name?: string; config?: UnitOfWorkConfig }) =>\n new UnitOfWork(\n compiler,\n executor,\n decoder,\n opts?.name,\n opts?.config,\n this.#schemaNamespaceMap,\n ).forSchema(schema);\n\n const queryEngine = {\n now: async () => this.options.clock.now(),\n async find(tableName, builderFn) {\n const uow = createUow();\n uow.find(tableName, builderFn);\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result ?? [];\n },\n\n async findWithCursor(tableName, builderFn) {\n const uow = createUow().findWithCursor(tableName, builderFn);\n const [result] = await uow.executeRetrieve();\n return result as CursorResult<unknown>;\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUow();\n if (builderFn) {\n uow.find(tableName, (b) => {\n builderFn(b);\n return b.pageSize(1);\n });\n } else {\n uow.find(tableName, (b) => b.whereIndex(\"primary\").pageSize(1));\n }\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result?.[0] ?? null;\n },\n\n async create(tableName, values) {\n const uow = createUow();\n uow.create(tableName, values);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create record\");\n }\n\n const createdId = uow.getCreatedIds()[0];\n if (!createdId) {\n throw new Error(\"Failed to get created ID\");\n }\n return createdId;\n },\n\n async createMany(tableName, valuesArray) {\n const uow = createUow();\n for (const values of valuesArray) {\n uow.create(tableName, values);\n }\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create records\");\n }\n return uow.getCreatedIds();\n },\n\n async update(tableName, id, builderFn) {\n const uow = createUow();\n uow.update(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update record (version conflict or record not found)\");\n }\n },\n\n async updateMany(tableName, builderFn) {\n const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const specialBuilder = new UpdateManySpecialBuilder<typeof table>();\n builderFn(specialBuilder);\n const { indexName, condition, setValues } = specialBuilder.getConfig();\n\n if (!indexName) {\n throw new Error(\"whereIndex() must be called in updateMany\");\n }\n if (!setValues) {\n throw new Error(\"set() must be called in updateMany\");\n }\n\n const findUow = createUow();\n findUow.find(tableName, (b) => {\n if (condition !== undefined && condition !== null) {\n return b.whereIndex(indexName as never, condition as never);\n }\n return b.whereIndex(indexName as never);\n });\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUow();\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n updateUow.update(tableName, record.id, (b) => b.set(setValues).check());\n }\n const { success } = await updateUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update records (version conflict)\");\n }\n },\n\n async delete(tableName, id, builderFn) {\n const uow = createUow();\n uow.delete(tableName, id, builderFn);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete record (version conflict or record not found)\");\n }\n },\n\n async deleteMany(tableName, builderFn) {\n const findUow = createUow();\n findUow.find(tableName, builderFn);\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUow();\n for (const record of records) {\n if (!hasIdField(record)) {\n throw new Error(\"Record missing id field\");\n }\n deleteUow.delete(tableName, record.id);\n }\n const { success } = await deleteUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete records (version conflict)\");\n }\n },\n\n createUnitOfWork(name, config) {\n return createUow({ name, config });\n },\n } as SimpleQueryInterface<T, InMemoryUowConfig>;\n return queryEngine;\n }\n}\n"],"mappings":"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"}