@fragno-dev/db 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/.turbo/turbo-build.log +202 -140
  2. package/CHANGELOG.md +35 -0
  3. package/README.md +30 -9
  4. package/dist/adapters/adapters.d.ts +23 -21
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/adapters.js.map +1 -1
  7. package/dist/adapters/generic-sql/driver-config.d.ts +16 -1
  8. package/dist/adapters/generic-sql/driver-config.d.ts.map +1 -1
  9. package/dist/adapters/generic-sql/driver-config.js +23 -1
  10. package/dist/adapters/generic-sql/driver-config.js.map +1 -1
  11. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts +27 -9
  12. package/dist/adapters/generic-sql/generic-sql-adapter.d.ts.map +1 -1
  13. package/dist/adapters/generic-sql/generic-sql-adapter.js +55 -16
  14. package/dist/adapters/generic-sql/generic-sql-adapter.js.map +1 -1
  15. package/dist/adapters/generic-sql/generic-sql-uow-executor.js +129 -3
  16. package/dist/adapters/generic-sql/generic-sql-uow-executor.js.map +1 -1
  17. package/dist/adapters/generic-sql/migration/dialect/mysql.js +24 -5
  18. package/dist/adapters/generic-sql/migration/dialect/mysql.js.map +1 -1
  19. package/dist/adapters/generic-sql/migration/dialect/postgres.js +6 -5
  20. package/dist/adapters/generic-sql/migration/dialect/postgres.js.map +1 -1
  21. package/dist/adapters/generic-sql/migration/dialect/sqlite.js +21 -10
  22. package/dist/adapters/generic-sql/migration/dialect/sqlite.js.map +1 -1
  23. package/dist/adapters/generic-sql/migration/prepared-migrations.d.ts.map +1 -1
  24. package/dist/adapters/generic-sql/migration/prepared-migrations.js +8 -8
  25. package/dist/adapters/generic-sql/migration/prepared-migrations.js.map +1 -1
  26. package/dist/adapters/generic-sql/migration/sql-generator.js +74 -51
  27. package/dist/adapters/generic-sql/migration/sql-generator.js.map +1 -1
  28. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js +6 -5
  29. package/dist/adapters/generic-sql/query/create-sql-query-compiler.js.map +1 -1
  30. package/dist/adapters/generic-sql/query/cursor-utils.js +42 -4
  31. package/dist/adapters/generic-sql/query/cursor-utils.js.map +1 -1
  32. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js +25 -17
  33. package/dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map +1 -1
  34. package/dist/adapters/generic-sql/query/select-builder.js +5 -3
  35. package/dist/adapters/generic-sql/query/select-builder.js.map +1 -1
  36. package/dist/adapters/generic-sql/query/sql-query-compiler.js +15 -12
  37. package/dist/adapters/generic-sql/query/sql-query-compiler.js.map +1 -1
  38. package/dist/adapters/generic-sql/query/where-builder.js +39 -29
  39. package/dist/adapters/generic-sql/query/where-builder.js.map +1 -1
  40. package/dist/adapters/generic-sql/sqlite-storage.d.ts +13 -0
  41. package/dist/adapters/generic-sql/sqlite-storage.d.ts.map +1 -0
  42. package/dist/adapters/generic-sql/sqlite-storage.js +15 -0
  43. package/dist/adapters/generic-sql/sqlite-storage.js.map +1 -0
  44. package/dist/adapters/generic-sql/uow-decoder.js +7 -3
  45. package/dist/adapters/generic-sql/uow-decoder.js.map +1 -1
  46. package/dist/adapters/generic-sql/uow-encoder.js +28 -8
  47. package/dist/adapters/generic-sql/uow-encoder.js.map +1 -1
  48. package/dist/adapters/in-memory/condition-evaluator.js +131 -0
  49. package/dist/adapters/in-memory/condition-evaluator.js.map +1 -0
  50. package/dist/adapters/in-memory/errors.d.ts +13 -0
  51. package/dist/adapters/in-memory/errors.d.ts.map +1 -0
  52. package/dist/adapters/in-memory/errors.js +23 -0
  53. package/dist/adapters/in-memory/errors.js.map +1 -0
  54. package/dist/adapters/in-memory/in-memory-adapter.d.ts +27 -0
  55. package/dist/adapters/in-memory/in-memory-adapter.d.ts.map +1 -0
  56. package/dist/adapters/in-memory/in-memory-adapter.js +176 -0
  57. package/dist/adapters/in-memory/in-memory-adapter.js.map +1 -0
  58. package/dist/adapters/in-memory/in-memory-uow.js +648 -0
  59. package/dist/adapters/in-memory/in-memory-uow.js.map +1 -0
  60. package/dist/adapters/in-memory/index.d.ts +4 -0
  61. package/dist/adapters/in-memory/index.js +4 -0
  62. package/dist/adapters/in-memory/options.d.ts +28 -0
  63. package/dist/adapters/in-memory/options.d.ts.map +1 -0
  64. package/dist/adapters/in-memory/options.js +61 -0
  65. package/dist/adapters/in-memory/options.js.map +1 -0
  66. package/dist/adapters/in-memory/reference-resolution.js +26 -0
  67. package/dist/adapters/in-memory/reference-resolution.js.map +1 -0
  68. package/dist/adapters/in-memory/sorted-array-index.js +129 -0
  69. package/dist/adapters/in-memory/sorted-array-index.js.map +1 -0
  70. package/dist/adapters/in-memory/store.js +71 -0
  71. package/dist/adapters/in-memory/store.js.map +1 -0
  72. package/dist/adapters/in-memory/value-comparison.js +28 -0
  73. package/dist/adapters/in-memory/value-comparison.js.map +1 -0
  74. package/dist/adapters/shared/from-unit-of-work-compiler.js.map +1 -1
  75. package/dist/adapters/shared/uow-operation-compiler.js +11 -11
  76. package/dist/adapters/shared/uow-operation-compiler.js.map +1 -1
  77. package/dist/adapters/sql/index.d.ts +5 -0
  78. package/dist/adapters/sql/index.js +4 -0
  79. package/dist/db-fragment-definition-builder.d.ts +18 -7
  80. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  81. package/dist/db-fragment-definition-builder.js +116 -54
  82. package/dist/db-fragment-definition-builder.js.map +1 -1
  83. package/dist/dispatchers/cloudflare-do/index.d.ts +26 -0
  84. package/dist/dispatchers/cloudflare-do/index.d.ts.map +1 -0
  85. package/dist/dispatchers/cloudflare-do/index.js +63 -0
  86. package/dist/dispatchers/cloudflare-do/index.js.map +1 -0
  87. package/dist/dispatchers/node/index.d.ts +17 -0
  88. package/dist/dispatchers/node/index.d.ts.map +1 -0
  89. package/dist/dispatchers/node/index.js +59 -0
  90. package/dist/dispatchers/node/index.js.map +1 -0
  91. package/dist/fragments/internal-fragment.d.ts +79 -2
  92. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  93. package/dist/fragments/internal-fragment.js +150 -32
  94. package/dist/fragments/internal-fragment.js.map +1 -1
  95. package/dist/fragments/internal-fragment.routes.js +29 -0
  96. package/dist/fragments/internal-fragment.routes.js.map +1 -0
  97. package/dist/fragments/internal-fragment.schema.d.ts +9 -0
  98. package/dist/fragments/internal-fragment.schema.d.ts.map +1 -0
  99. package/dist/fragments/internal-fragment.schema.js +22 -0
  100. package/dist/fragments/internal-fragment.schema.js.map +1 -0
  101. package/dist/hooks/durable-hooks-processor.d.ts +14 -0
  102. package/dist/hooks/durable-hooks-processor.d.ts.map +1 -0
  103. package/dist/hooks/durable-hooks-processor.js +32 -0
  104. package/dist/hooks/durable-hooks-processor.js.map +1 -0
  105. package/dist/hooks/hooks.d.ts +42 -1
  106. package/dist/hooks/hooks.d.ts.map +1 -1
  107. package/dist/hooks/hooks.js +72 -6
  108. package/dist/hooks/hooks.js.map +1 -1
  109. package/dist/migration-engine/auto-from-schema.js +14 -11
  110. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  111. package/dist/migration-engine/generation-engine.d.ts +16 -10
  112. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  113. package/dist/migration-engine/generation-engine.js +72 -33
  114. package/dist/migration-engine/generation-engine.js.map +1 -1
  115. package/dist/migration-engine/shared.js.map +1 -1
  116. package/dist/mod.d.ts +15 -8
  117. package/dist/mod.d.ts.map +1 -1
  118. package/dist/mod.js +14 -8
  119. package/dist/mod.js.map +1 -1
  120. package/dist/naming/sql-naming.d.ts +19 -0
  121. package/dist/naming/sql-naming.d.ts.map +1 -0
  122. package/dist/naming/sql-naming.js +116 -0
  123. package/dist/naming/sql-naming.js.map +1 -0
  124. package/dist/node_modules/.pnpm/{rou3@0.7.10 → rou3@0.7.12}/node_modules/rou3/dist/index.js +8 -5
  125. package/dist/node_modules/.pnpm/rou3@0.7.12/node_modules/rou3/dist/index.js.map +1 -0
  126. package/dist/outbox/outbox-builder.js +156 -0
  127. package/dist/outbox/outbox-builder.js.map +1 -0
  128. package/dist/outbox/outbox.d.ts +52 -0
  129. package/dist/outbox/outbox.d.ts.map +1 -0
  130. package/dist/outbox/outbox.js +37 -0
  131. package/dist/outbox/outbox.js.map +1 -0
  132. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +3 -2
  133. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -1
  134. package/dist/packages/fragno/dist/api/fragment-instantiator.js +164 -20
  135. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -1
  136. package/dist/packages/fragno/dist/api/request-input-context.js +67 -0
  137. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -1
  138. package/dist/packages/fragno/dist/api/route.js +14 -1
  139. package/dist/packages/fragno/dist/api/route.js.map +1 -1
  140. package/dist/packages/fragno/dist/internal/trace-context.js +12 -0
  141. package/dist/packages/fragno/dist/internal/trace-context.js.map +1 -0
  142. package/dist/query/column-defaults.js +20 -4
  143. package/dist/query/column-defaults.js.map +1 -1
  144. package/dist/query/cursor.d.ts +3 -1
  145. package/dist/query/cursor.d.ts.map +1 -1
  146. package/dist/query/cursor.js +45 -14
  147. package/dist/query/cursor.js.map +1 -1
  148. package/dist/query/db-now.d.ts +8 -0
  149. package/dist/query/db-now.d.ts.map +1 -0
  150. package/dist/query/db-now.js +7 -0
  151. package/dist/query/db-now.js.map +1 -0
  152. package/dist/query/serialize/create-sql-serializer.js +3 -2
  153. package/dist/query/serialize/create-sql-serializer.js.map +1 -1
  154. package/dist/query/serialize/dialect/mysql-serializer.js +12 -6
  155. package/dist/query/serialize/dialect/mysql-serializer.js.map +1 -1
  156. package/dist/query/serialize/dialect/postgres-serializer.js +25 -7
  157. package/dist/query/serialize/dialect/postgres-serializer.js.map +1 -1
  158. package/dist/query/serialize/dialect/sqlite-serializer.js +55 -11
  159. package/dist/query/serialize/dialect/sqlite-serializer.js.map +1 -1
  160. package/dist/query/serialize/sql-serializer.js +2 -2
  161. package/dist/query/serialize/sql-serializer.js.map +1 -1
  162. package/dist/query/simple-query-interface.d.ts +6 -1
  163. package/dist/query/simple-query-interface.d.ts.map +1 -1
  164. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  165. package/dist/query/unit-of-work/execute-unit-of-work.js +11 -6
  166. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  167. package/dist/query/unit-of-work/unit-of-work.d.ts +50 -14
  168. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  169. package/dist/query/unit-of-work/unit-of-work.js +86 -5
  170. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  171. package/dist/query/value-decoding.js +9 -6
  172. package/dist/query/value-decoding.js.map +1 -1
  173. package/dist/query/value-encoding.js +29 -9
  174. package/dist/query/value-encoding.js.map +1 -1
  175. package/dist/schema/create.d.ts +38 -14
  176. package/dist/schema/create.d.ts.map +1 -1
  177. package/dist/schema/create.js +81 -42
  178. package/dist/schema/create.js.map +1 -1
  179. package/dist/schema/generate-id.js +2 -2
  180. package/dist/schema/generate-id.js.map +1 -1
  181. package/dist/schema/type-conversion/create-sql-type-mapper.js +3 -2
  182. package/dist/schema/type-conversion/create-sql-type-mapper.js.map +1 -1
  183. package/dist/schema/type-conversion/dialect/sqlite.js +9 -0
  184. package/dist/schema/type-conversion/dialect/sqlite.js.map +1 -1
  185. package/dist/schema/validator.d.ts +10 -0
  186. package/dist/schema/validator.d.ts.map +1 -0
  187. package/dist/schema/validator.js +123 -0
  188. package/dist/schema/validator.js.map +1 -0
  189. package/dist/schema-output/drizzle.d.ts +30 -0
  190. package/dist/schema-output/drizzle.d.ts.map +1 -0
  191. package/dist/{adapters/drizzle/generate.js → schema-output/drizzle.js} +82 -56
  192. package/dist/schema-output/drizzle.js.map +1 -0
  193. package/dist/schema-output/prisma.d.ts +17 -0
  194. package/dist/schema-output/prisma.d.ts.map +1 -0
  195. package/dist/schema-output/prisma.js +296 -0
  196. package/dist/schema-output/prisma.js.map +1 -0
  197. package/dist/util/default-database-adapter.js +61 -0
  198. package/dist/util/default-database-adapter.js.map +1 -0
  199. package/dist/with-database.d.ts +1 -1
  200. package/dist/with-database.d.ts.map +1 -1
  201. package/dist/with-database.js +12 -3
  202. package/dist/with-database.js.map +1 -1
  203. package/package.json +43 -28
  204. package/src/adapters/adapters.ts +30 -24
  205. package/src/adapters/drizzle/migrate-drizzle.test.ts +54 -33
  206. package/src/adapters/drizzle/migration-parity-drizzle-kit.test.ts +599 -0
  207. package/src/adapters/drizzle/test-utils.ts +12 -8
  208. package/src/adapters/generic-sql/driver-config.ts +38 -0
  209. package/src/adapters/generic-sql/generic-sql-adapter.test.ts +5 -5
  210. package/src/adapters/generic-sql/generic-sql-adapter.ts +110 -24
  211. package/src/adapters/generic-sql/generic-sql-uow-executor.test.ts +54 -0
  212. package/src/adapters/generic-sql/generic-sql-uow-executor.ts +231 -3
  213. package/src/adapters/generic-sql/migration/adapter-migration-parity.test.ts +118 -0
  214. package/src/adapters/generic-sql/migration/dialect/mysql.test.ts +26 -8
  215. package/src/adapters/generic-sql/migration/dialect/mysql.ts +46 -8
  216. package/src/adapters/generic-sql/migration/dialect/postgres.test.ts +25 -7
  217. package/src/adapters/generic-sql/migration/dialect/postgres.ts +8 -4
  218. package/src/adapters/generic-sql/migration/dialect/sqlite.test.ts +47 -8
  219. package/src/adapters/generic-sql/migration/dialect/sqlite.ts +27 -12
  220. package/src/adapters/generic-sql/migration/prepared-migrations.test.ts +128 -39
  221. package/src/adapters/generic-sql/migration/prepared-migrations.ts +15 -8
  222. package/src/adapters/generic-sql/migration/sql-generator.ts +142 -65
  223. package/src/adapters/generic-sql/query/create-sql-query-compiler.ts +9 -6
  224. package/src/adapters/generic-sql/query/cursor-utils.test.ts +271 -0
  225. package/src/adapters/generic-sql/query/cursor-utils.ts +41 -6
  226. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.test.ts +27 -27
  227. package/src/adapters/generic-sql/query/generic-sql-uow-operation-compiler.ts +38 -24
  228. package/src/adapters/generic-sql/query/select-builder.test.ts +15 -11
  229. package/src/adapters/generic-sql/query/select-builder.ts +6 -2
  230. package/src/adapters/generic-sql/query/sql-query-compiler.test.ts +52 -2
  231. package/src/adapters/generic-sql/query/sql-query-compiler.ts +50 -15
  232. package/src/adapters/generic-sql/query/where-builder.test.ts +91 -17
  233. package/src/adapters/generic-sql/query/where-builder.ts +90 -38
  234. package/src/adapters/{kysely/kysely-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-migrations.test.ts} +6 -6
  235. package/src/adapters/generic-sql/sql-adapter-pglite-pagination.test.ts +806 -0
  236. package/src/adapters/{drizzle/drizzle-adapter-pglite.test.ts → generic-sql/sql-adapter-pglite-queries.test.ts} +11 -11
  237. package/src/adapters/generic-sql/{test/generic-drizzle-adapter-sqlite3.test.ts → sql-adapter-sqlite3-driver.test.ts} +10 -10
  238. package/src/adapters/{drizzle/drizzle-adapter-sqlite3.test.ts → generic-sql/sql-adapter-sqlite3-uow.test.ts} +7 -7
  239. package/src/adapters/{kysely/kysely-adapter-sqlocal.test.ts → generic-sql/sql-adapter-sqlocal.test.ts} +6 -6
  240. package/src/adapters/generic-sql/sqlite-storage.ts +20 -0
  241. package/src/adapters/generic-sql/uow-decoder.test.ts +1 -1
  242. package/src/adapters/generic-sql/uow-decoder.ts +21 -3
  243. package/src/adapters/generic-sql/uow-encoder.test.ts +33 -2
  244. package/src/adapters/generic-sql/uow-encoder.ts +50 -11
  245. package/src/adapters/in-memory/condition-evaluator.test.ts +193 -0
  246. package/src/adapters/in-memory/condition-evaluator.ts +275 -0
  247. package/src/adapters/in-memory/errors.ts +20 -0
  248. package/src/adapters/in-memory/in-memory-adapter.ts +277 -0
  249. package/src/adapters/in-memory/in-memory-uow.mutations.test.ts +296 -0
  250. package/src/adapters/in-memory/in-memory-uow.retrieval.test.ts +100 -0
  251. package/src/adapters/in-memory/in-memory-uow.ts +1348 -0
  252. package/src/adapters/in-memory/index.ts +3 -0
  253. package/src/adapters/in-memory/options.test.ts +41 -0
  254. package/src/adapters/in-memory/options.ts +87 -0
  255. package/src/adapters/in-memory/reference-resolution.test.ts +50 -0
  256. package/src/adapters/in-memory/reference-resolution.ts +67 -0
  257. package/src/adapters/in-memory/sorted-array-index.test.ts +123 -0
  258. package/src/adapters/in-memory/sorted-array-index.ts +228 -0
  259. package/src/adapters/in-memory/store.test.ts +68 -0
  260. package/src/adapters/in-memory/store.ts +145 -0
  261. package/src/adapters/in-memory/value-comparison.ts +53 -0
  262. package/src/adapters/in-memory/value-normalization.test.ts +57 -0
  263. package/src/adapters/prisma/prisma-adapter-sqlite3.test.ts +1163 -0
  264. package/src/adapters/shared/from-unit-of-work-compiler.ts +3 -1
  265. package/src/adapters/shared/uow-operation-compiler.ts +26 -16
  266. package/src/adapters/sql/index.ts +12 -0
  267. package/src/db-fragment-definition-builder.test.ts +30 -12
  268. package/src/db-fragment-definition-builder.ts +142 -73
  269. package/src/db-fragment-instantiator.test.ts +105 -13
  270. package/src/db-fragment-integration.test.ts +9 -7
  271. package/src/dispatchers/cloudflare-do/index.test.ts +73 -0
  272. package/src/dispatchers/cloudflare-do/index.ts +104 -0
  273. package/src/dispatchers/node/index.test.ts +91 -0
  274. package/src/dispatchers/node/index.ts +87 -0
  275. package/src/fragments/internal-fragment.routes.ts +42 -0
  276. package/src/fragments/internal-fragment.schema.ts +51 -0
  277. package/src/fragments/internal-fragment.test.ts +458 -8
  278. package/src/fragments/internal-fragment.ts +322 -63
  279. package/src/hooks/durable-hooks-processor.test.ts +117 -0
  280. package/src/hooks/durable-hooks-processor.ts +67 -0
  281. package/src/hooks/hooks.test.ts +165 -5
  282. package/src/hooks/hooks.ts +197 -9
  283. package/src/migration-engine/auto-from-schema.test.ts +14 -14
  284. package/src/migration-engine/auto-from-schema.ts +5 -2
  285. package/src/migration-engine/create.test.ts +2 -2
  286. package/src/migration-engine/generation-engine.test.ts +229 -104
  287. package/src/migration-engine/generation-engine.ts +94 -64
  288. package/src/migration-engine/shared.ts +1 -0
  289. package/src/mod.ts +64 -26
  290. package/src/naming/sql-naming.ts +180 -0
  291. package/src/outbox/outbox-builder.ts +241 -0
  292. package/src/outbox/outbox.test.ts +253 -0
  293. package/src/outbox/outbox.ts +137 -0
  294. package/src/query/column-defaults.ts +41 -3
  295. package/src/query/condition-builder.test.ts +3 -3
  296. package/src/query/cursor.test.ts +116 -18
  297. package/src/query/cursor.ts +75 -26
  298. package/src/query/db-now.ts +6 -0
  299. package/src/query/query-type.test.ts +2 -2
  300. package/src/query/serialize/create-sql-serializer.ts +7 -2
  301. package/src/query/serialize/dialect/mysql-serializer.ts +12 -4
  302. package/src/query/serialize/dialect/postgres-serializer.ts +34 -4
  303. package/src/query/serialize/dialect/sqlite-serializer.test.ts +51 -1
  304. package/src/query/serialize/dialect/sqlite-serializer.ts +92 -9
  305. package/src/query/serialize/sql-serializer.ts +4 -4
  306. package/src/query/simple-query-interface.ts +5 -0
  307. package/src/query/unit-of-work/execute-unit-of-work.test.ts +25 -1
  308. package/src/query/unit-of-work/execute-unit-of-work.ts +25 -8
  309. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +12 -12
  310. package/src/query/unit-of-work/unit-of-work-types.test.ts +1 -1
  311. package/src/query/unit-of-work/unit-of-work.test.ts +168 -37
  312. package/src/query/unit-of-work/unit-of-work.ts +203 -18
  313. package/src/query/value-decoding.test.ts +13 -2
  314. package/src/query/value-decoding.ts +17 -4
  315. package/src/query/value-encoding.test.ts +85 -2
  316. package/src/query/value-encoding.ts +56 -6
  317. package/src/schema/create.test.ts +129 -42
  318. package/src/schema/create.ts +185 -47
  319. package/src/schema/generate-id.test.ts +2 -2
  320. package/src/schema/generate-id.ts +2 -2
  321. package/src/schema/serialize.test.ts +14 -2
  322. package/src/schema/type-conversion/create-sql-type-mapper.ts +7 -2
  323. package/src/schema/type-conversion/dialect/sqlite.ts +18 -0
  324. package/src/schema/type-conversion/type-mapping.test.ts +25 -1
  325. package/src/schema/validator.test.ts +197 -0
  326. package/src/schema/validator.ts +231 -0
  327. package/src/{adapters/drizzle/generate.test.ts → schema-output/drizzle.test.ts} +179 -129
  328. package/src/{adapters/drizzle/generate.ts → schema-output/drizzle.ts} +143 -93
  329. package/src/schema-output/prisma.test.ts +536 -0
  330. package/src/schema-output/prisma.ts +573 -0
  331. package/src/util/default-database-adapter.ts +106 -0
  332. package/src/with-database.ts +22 -3
  333. package/tsdown.config.ts +6 -4
  334. package/dist/adapters/drizzle/drizzle-adapter.d.ts +0 -20
  335. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +0 -1
  336. package/dist/adapters/drizzle/drizzle-adapter.js +0 -27
  337. package/dist/adapters/drizzle/drizzle-adapter.js.map +0 -1
  338. package/dist/adapters/drizzle/generate.d.ts +0 -30
  339. package/dist/adapters/drizzle/generate.d.ts.map +0 -1
  340. package/dist/adapters/drizzle/generate.js.map +0 -1
  341. package/dist/adapters/kysely/kysely-adapter.d.ts +0 -19
  342. package/dist/adapters/kysely/kysely-adapter.d.ts.map +0 -1
  343. package/dist/adapters/kysely/kysely-adapter.js +0 -17
  344. package/dist/adapters/kysely/kysely-adapter.js.map +0 -1
  345. package/dist/adapters/shared/table-name-mapper.d.ts +0 -12
  346. package/dist/adapters/shared/table-name-mapper.d.ts.map +0 -1
  347. package/dist/adapters/shared/table-name-mapper.js +0 -43
  348. package/dist/adapters/shared/table-name-mapper.js.map +0 -1
  349. package/dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map +0 -1
  350. package/dist/schema-generator/schema-generator.d.ts +0 -15
  351. package/dist/schema-generator/schema-generator.d.ts.map +0 -1
  352. package/src/adapters/drizzle/drizzle-adapter.ts +0 -39
  353. package/src/adapters/kysely/kysely-adapter.ts +0 -27
  354. package/src/adapters/shared/table-name-mapper.ts +0 -50
  355. package/src/schema-generator/schema-generator.ts +0 -12
@@ -1 +1 @@
1
- {"version":3,"file":"create-sql-type-mapper.js","names":["exhaustiveCheck: never"],"sources":["../../../src/schema/type-conversion/create-sql-type-mapper.ts"],"sourcesContent":["import type { SupportedDatabase } from \"../../adapters/generic-sql/driver-config\";\nimport { PostgreSQLTypeMapper } from \"./dialect/postgres\";\nimport { MySQLTypeMapper } from \"./dialect/mysql\";\nimport { SQLiteTypeMapper } from \"./dialect/sqlite\";\n\n/**\n * Factory function to create a dialect-specific SQL type mapper.\n *\n * Based on the database type, returns the appropriate mapper implementation\n * (PostgreSQL, MySQL, or SQLite).\n *\n * @param database - The database type (sqlite, postgresql, or mysql)\n * @returns Dialect-specific SQLTypeMapper instance\n */\nexport function createSQLTypeMapper(database: SupportedDatabase) {\n switch (database) {\n case \"postgresql\":\n return new PostgreSQLTypeMapper(database);\n case \"mysql\":\n return new MySQLTypeMapper(database);\n case \"sqlite\":\n return new SQLiteTypeMapper(database);\n default: {\n const exhaustiveCheck: never = database;\n throw new Error(`Unsupported database type: ${exhaustiveCheck}`);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAcA,SAAgB,oBAAoB,UAA6B;AAC/D,SAAQ,UAAR;EACE,KAAK,aACH,QAAO,IAAI,qBAAqB,SAAS;EAC3C,KAAK,QACH,QAAO,IAAI,gBAAgB,SAAS;EACtC,KAAK,SACH,QAAO,IAAI,iBAAiB,SAAS;EACvC,SAAS;GACP,MAAMA,kBAAyB;AAC/B,SAAM,IAAI,MAAM,8BAA8B,kBAAkB"}
1
+ {"version":3,"file":"create-sql-type-mapper.js","names":["exhaustiveCheck: never"],"sources":["../../../src/schema/type-conversion/create-sql-type-mapper.ts"],"sourcesContent":["import type { SupportedDatabase } from \"../../adapters/generic-sql/driver-config\";\nimport type { SQLiteStorageMode } from \"../../adapters/generic-sql/sqlite-storage\";\nimport { PostgreSQLTypeMapper } from \"./dialect/postgres\";\nimport { MySQLTypeMapper } from \"./dialect/mysql\";\nimport { SQLiteTypeMapper } from \"./dialect/sqlite\";\n\n/**\n * Factory function to create a dialect-specific SQL type mapper.\n *\n * Based on the database type, returns the appropriate mapper implementation\n * (PostgreSQL, MySQL, or SQLite).\n *\n * @param database - The database type (sqlite, postgresql, or mysql)\n * @param sqliteStorageMode - Optional SQLite storage mode override\n * @returns Dialect-specific SQLTypeMapper instance\n */\nexport function createSQLTypeMapper(\n database: SupportedDatabase,\n sqliteStorageMode?: SQLiteStorageMode,\n) {\n switch (database) {\n case \"postgresql\":\n return new PostgreSQLTypeMapper(database);\n case \"mysql\":\n return new MySQLTypeMapper(database);\n case \"sqlite\":\n return new SQLiteTypeMapper(database, sqliteStorageMode);\n default: {\n const exhaustiveCheck: never = database;\n throw new Error(`Unsupported database type: ${exhaustiveCheck}`);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,SAAgB,oBACd,UACA,mBACA;AACA,SAAQ,UAAR;EACE,KAAK,aACH,QAAO,IAAI,qBAAqB,SAAS;EAC3C,KAAK,QACH,QAAO,IAAI,gBAAgB,SAAS;EACtC,KAAK,SACH,QAAO,IAAI,iBAAiB,UAAU,kBAAkB;EAC1D,SAAS;GACP,MAAMA,kBAAyB;AAC/B,SAAM,IAAI,MAAM,8BAA8B,kBAAkB"}
@@ -1,3 +1,4 @@
1
+ import { sqliteStorageDefault } from "../../../adapters/generic-sql/sqlite-storage.js";
1
2
  import { SQLTypeMapper } from "../type-mapping.js";
2
3
 
3
4
  //#region src/schema/type-conversion/dialect/sqlite.ts
@@ -11,6 +12,11 @@ import { SQLTypeMapper } from "../type-mapping.js";
11
12
  * - REAL for decimals
12
13
  */
13
14
  var SQLiteTypeMapper = class extends SQLTypeMapper {
15
+ sqliteStorageMode;
16
+ constructor(database, sqliteStorageMode) {
17
+ super(database);
18
+ this.sqliteStorageMode = sqliteStorageMode ?? sqliteStorageDefault;
19
+ }
14
20
  getInternalIdType() {
15
21
  return "integer";
16
22
  }
@@ -19,6 +25,7 @@ var SQLiteTypeMapper = class extends SQLTypeMapper {
19
25
  }
20
26
  mapBigint(column) {
21
27
  if ("role" in column && column.role === "reference") return "integer";
28
+ if (this.sqliteStorageMode.bigintStorage === "integer") return "integer";
22
29
  return "blob";
23
30
  }
24
31
  mapString() {
@@ -37,9 +44,11 @@ var SQLiteTypeMapper = class extends SQLTypeMapper {
37
44
  return "real";
38
45
  }
39
46
  mapTimestamp() {
47
+ if (this.sqliteStorageMode.timestampStorage === "iso-text") return "text";
40
48
  return "integer";
41
49
  }
42
50
  mapDate() {
51
+ if (this.sqliteStorageMode.dateStorage === "iso-text") return "text";
43
52
  return "integer";
44
53
  }
45
54
  mapJson() {
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.js","names":[],"sources":["../../../../src/schema/type-conversion/dialect/sqlite.ts"],"sourcesContent":["import type { AnyColumn } from \"../../create\";\nimport { SQLTypeMapper, type SQLiteDatabaseType } from \"../type-mapping\";\n\n/**\n * SQLite-specific type mapper.\n *\n * SQLite has a limited type system with only 4 storage classes:\n * - INTEGER for integers, booleans, timestamps, dates (and reference columns)\n * - BLOB for binary data and bigints (except for reference columns)\n * - TEXT for strings, JSON, and varchar\n * - REAL for decimals\n */\nexport class SQLiteTypeMapper extends SQLTypeMapper<SQLiteDatabaseType> {\n protected getInternalIdType(): SQLiteDatabaseType {\n // SQLite uses INTEGER for auto-increment (INTEGER PRIMARY KEY)\n return \"integer\";\n }\n\n protected mapInteger(_column: AnyColumn | Pick<AnyColumn, \"type\">): SQLiteDatabaseType {\n return \"integer\";\n }\n\n protected mapBigint(column: AnyColumn | Pick<AnyColumn, \"type\">): SQLiteDatabaseType {\n // SQLite special case: reference columns should use integer even if type is bigint\n if (\"role\" in column && column.role === \"reference\") {\n return \"integer\";\n }\n return \"blob\";\n }\n\n protected mapString(): SQLiteDatabaseType {\n return \"text\";\n }\n\n protected mapVarchar(_length: number): SQLiteDatabaseType {\n // SQLite doesn't support varchar - convert to text\n return \"text\";\n }\n\n protected mapBinary(): SQLiteDatabaseType {\n return \"blob\";\n }\n\n protected mapBool(): SQLiteDatabaseType {\n return \"integer\";\n }\n\n protected mapDecimal(): SQLiteDatabaseType {\n return \"real\";\n }\n\n protected mapTimestamp(): SQLiteDatabaseType {\n return \"integer\";\n }\n\n protected mapDate(): SQLiteDatabaseType {\n return \"integer\";\n }\n\n protected mapJson(): SQLiteDatabaseType {\n return \"text\";\n }\n}\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,mBAAb,cAAsC,cAAkC;CACtE,AAAU,oBAAwC;AAEhD,SAAO;;CAGT,AAAU,WAAW,SAAkE;AACrF,SAAO;;CAGT,AAAU,UAAU,QAAiE;AAEnF,MAAI,UAAU,UAAU,OAAO,SAAS,YACtC,QAAO;AAET,SAAO;;CAGT,AAAU,YAAgC;AACxC,SAAO;;CAGT,AAAU,WAAW,SAAqC;AAExD,SAAO;;CAGT,AAAU,YAAgC;AACxC,SAAO;;CAGT,AAAU,UAA8B;AACtC,SAAO;;CAGT,AAAU,aAAiC;AACzC,SAAO;;CAGT,AAAU,eAAmC;AAC3C,SAAO;;CAGT,AAAU,UAA8B;AACtC,SAAO;;CAGT,AAAU,UAA8B;AACtC,SAAO"}
1
+ {"version":3,"file":"sqlite.js","names":[],"sources":["../../../../src/schema/type-conversion/dialect/sqlite.ts"],"sourcesContent":["import type { AnyColumn } from \"../../create\";\nimport { SQLTypeMapper, type SQLiteDatabaseType } from \"../type-mapping\";\nimport type { SQLiteStorageMode } from \"../../../adapters/generic-sql/sqlite-storage\";\nimport { sqliteStorageDefault } from \"../../../adapters/generic-sql/sqlite-storage\";\n\n/**\n * SQLite-specific type mapper.\n *\n * SQLite has a limited type system with only 4 storage classes:\n * - INTEGER for integers, booleans, timestamps, dates (and reference columns)\n * - BLOB for binary data and bigints (except for reference columns)\n * - TEXT for strings, JSON, and varchar\n * - REAL for decimals\n */\nexport class SQLiteTypeMapper extends SQLTypeMapper<SQLiteDatabaseType> {\n private readonly sqliteStorageMode: SQLiteStorageMode;\n\n constructor(database: \"sqlite\", sqliteStorageMode?: SQLiteStorageMode) {\n super(database);\n this.sqliteStorageMode = sqliteStorageMode ?? sqliteStorageDefault;\n }\n\n protected getInternalIdType(): SQLiteDatabaseType {\n // SQLite uses INTEGER for auto-increment (INTEGER PRIMARY KEY)\n return \"integer\";\n }\n\n protected mapInteger(_column: AnyColumn | Pick<AnyColumn, \"type\">): SQLiteDatabaseType {\n return \"integer\";\n }\n\n protected mapBigint(column: AnyColumn | Pick<AnyColumn, \"type\">): SQLiteDatabaseType {\n // SQLite special case: reference columns should use integer even if type is bigint\n if (\"role\" in column && column.role === \"reference\") {\n return \"integer\";\n }\n if (this.sqliteStorageMode.bigintStorage === \"integer\") {\n return \"integer\";\n }\n return \"blob\";\n }\n\n protected mapString(): SQLiteDatabaseType {\n return \"text\";\n }\n\n protected mapVarchar(_length: number): SQLiteDatabaseType {\n // SQLite doesn't support varchar - convert to text\n return \"text\";\n }\n\n protected mapBinary(): SQLiteDatabaseType {\n return \"blob\";\n }\n\n protected mapBool(): SQLiteDatabaseType {\n return \"integer\";\n }\n\n protected mapDecimal(): SQLiteDatabaseType {\n return \"real\";\n }\n\n protected mapTimestamp(): SQLiteDatabaseType {\n if (this.sqliteStorageMode.timestampStorage === \"iso-text\") {\n return \"text\";\n }\n return \"integer\";\n }\n\n protected mapDate(): SQLiteDatabaseType {\n if (this.sqliteStorageMode.dateStorage === \"iso-text\") {\n return \"text\";\n }\n return \"integer\";\n }\n\n protected mapJson(): SQLiteDatabaseType {\n return \"text\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,IAAa,mBAAb,cAAsC,cAAkC;CACtE,AAAiB;CAEjB,YAAY,UAAoB,mBAAuC;AACrE,QAAM,SAAS;AACf,OAAK,oBAAoB,qBAAqB;;CAGhD,AAAU,oBAAwC;AAEhD,SAAO;;CAGT,AAAU,WAAW,SAAkE;AACrF,SAAO;;CAGT,AAAU,UAAU,QAAiE;AAEnF,MAAI,UAAU,UAAU,OAAO,SAAS,YACtC,QAAO;AAET,MAAI,KAAK,kBAAkB,kBAAkB,UAC3C,QAAO;AAET,SAAO;;CAGT,AAAU,YAAgC;AACxC,SAAO;;CAGT,AAAU,WAAW,SAAqC;AAExD,SAAO;;CAGT,AAAU,YAAgC;AACxC,SAAO;;CAGT,AAAU,UAA8B;AACtC,SAAO;;CAGT,AAAU,aAAiC;AACzC,SAAO;;CAGT,AAAU,eAAmC;AAC3C,MAAI,KAAK,kBAAkB,qBAAqB,WAC9C,QAAO;AAET,SAAO;;CAGT,AAAU,UAA8B;AACtC,MAAI,KAAK,kBAAkB,gBAAgB,WACzC,QAAO;AAET,SAAO;;CAGT,AAAU,UAA8B;AACtC,SAAO"}
@@ -0,0 +1,10 @@
1
+ import { StandardSchemaV1 } from "@standard-schema/spec";
2
+
3
+ //#region src/schema/validator.d.ts
4
+ declare class FragnoDbValidationError extends Error {
5
+ readonly issues: readonly StandardSchemaV1.Issue[];
6
+ constructor(message: string, issues: readonly StandardSchemaV1.Issue[]);
7
+ }
8
+ //#endregion
9
+ export { FragnoDbValidationError };
10
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","names":[],"sources":["../../src/schema/validator.ts"],"sourcesContent":[],"mappings":";;;cASa,uBAAA,SAAgC,KAAA;EAAhC,SAAA,MAAA,EAAA,SACe,gBAAA,CAAiB,KADR,EAAA;EACT,WAAA,CAAA,OAAiB,EAAA,MAAA,EAAA,MAAA,EAAA,SAEG,gBAAA,CAAiB,KAFpB,EAAA"}
@@ -0,0 +1,123 @@
1
+ //#region src/schema/validator.ts
2
+ var FragnoDbValidationError = class extends Error {
3
+ issues;
4
+ constructor(message, issues) {
5
+ super(message);
6
+ this.name = "FragnoDbValidationError";
7
+ this.issues = issues;
8
+ }
9
+ };
10
+ const defaultUnknownKeysMode = "strip";
11
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
12
+ const parseVarcharLength = (type) => {
13
+ if (!type.startsWith("varchar(") || !type.endsWith(")")) return;
14
+ const rawLength = type.slice(8, -1);
15
+ const length = Number(rawLength);
16
+ if (!Number.isFinite(length)) return;
17
+ return length;
18
+ };
19
+ const getUnknownKeysMode = (options) => {
20
+ return (options?.libraryOptions)?.unknownKeys ?? defaultUnknownKeysMode;
21
+ };
22
+ const validateColumnValue = (col, value, classes) => {
23
+ if (col.role === "external-id") {
24
+ if (value instanceof classes.FragnoId) {
25
+ const maxLength = parseVarcharLength(col.type);
26
+ if (maxLength !== void 0 && value.externalId.length > maxLength) return `String must have at most ${maxLength} characters`;
27
+ return;
28
+ }
29
+ if (typeof value === "string") {
30
+ const maxLength = parseVarcharLength(col.type);
31
+ if (maxLength !== void 0 && value.length > maxLength) return `String must have at most ${maxLength} characters`;
32
+ return;
33
+ }
34
+ return "Expected string or FragnoId";
35
+ }
36
+ if (col.role === "reference") {
37
+ if (value instanceof classes.FragnoReference || value instanceof classes.FragnoId || typeof value === "string" || typeof value === "bigint") return;
38
+ return "Expected reference (string, bigint, FragnoId, or FragnoReference)";
39
+ }
40
+ if (col.type === "string" || col.type.startsWith("varchar(")) {
41
+ if (typeof value !== "string") return "Expected string";
42
+ const maxLength = parseVarcharLength(col.type);
43
+ if (maxLength !== void 0 && value.length > maxLength) return `String must have at most ${maxLength} characters`;
44
+ return;
45
+ }
46
+ if (col.type === "bigint") return typeof value === "bigint" ? void 0 : "Expected bigint";
47
+ if (col.type === "integer") {
48
+ if (typeof value !== "number" || !Number.isInteger(value)) return "Expected integer";
49
+ return;
50
+ }
51
+ if (col.type === "decimal") {
52
+ if (typeof value !== "number" || !Number.isFinite(value)) return "Expected number";
53
+ return;
54
+ }
55
+ if (col.type === "bool") return typeof value === "boolean" ? void 0 : "Expected boolean";
56
+ if (col.type === "binary") return value instanceof Uint8Array ? void 0 : "Expected Uint8Array";
57
+ if (col.type === "date" || col.type === "timestamp") {
58
+ if (!(value instanceof Date) || Number.isNaN(value.getTime())) return "Expected valid Date";
59
+ return;
60
+ }
61
+ if (col.type === "json") return;
62
+ };
63
+ const validateTableInsertValues = (table, value, options, classes) => {
64
+ const issues = [];
65
+ if (!isRecord(value)) return { issues: [{ message: "Expected object" }] };
66
+ const input = value;
67
+ const entries = Object.entries(table.columns).filter(([, col]) => !col.isHidden);
68
+ const allowedKeys = new Set(entries.map(([key]) => key));
69
+ if (getUnknownKeysMode(options) === "strict") {
70
+ for (const key of Object.keys(input)) if (!allowedKeys.has(key)) issues.push({
71
+ message: `Unknown key "${key}"`,
72
+ path: [key]
73
+ });
74
+ }
75
+ const output = {};
76
+ for (const [key, col] of entries) {
77
+ const colValue = Object.prototype.hasOwnProperty.call(input, key) ? input[key] : void 0;
78
+ const allowsUndefined = col.isNullable || col.default !== void 0;
79
+ const allowsNull = col.isNullable;
80
+ if (colValue === void 0) {
81
+ if (!allowsUndefined) issues.push({
82
+ message: "Required",
83
+ path: [key]
84
+ });
85
+ continue;
86
+ }
87
+ if (colValue === null) {
88
+ if (!allowsNull) issues.push({
89
+ message: "Required",
90
+ path: [key]
91
+ });
92
+ else output[key] = null;
93
+ continue;
94
+ }
95
+ const issue = validateColumnValue(col, colValue, classes);
96
+ if (issue) {
97
+ issues.push({
98
+ message: issue,
99
+ path: [key]
100
+ });
101
+ continue;
102
+ }
103
+ output[key] = colValue;
104
+ }
105
+ if (issues.length > 0) return { issues };
106
+ return { value: output };
107
+ };
108
+ const createTableStandardSchemaProps = (table, classes) => ({
109
+ version: 1,
110
+ vendor: "fragno-db",
111
+ validate: (value, options) => validateTableInsertValues(table, value, options, classes)
112
+ });
113
+ const createTableValidator = (table, classes) => {
114
+ return (value, options) => {
115
+ const result = validateTableInsertValues(table, value, { libraryOptions: options }, classes);
116
+ if (result.issues) throw new FragnoDbValidationError("Validation failed", result.issues);
117
+ return result.value;
118
+ };
119
+ };
120
+
121
+ //#endregion
122
+ export { FragnoDbValidationError, createTableStandardSchemaProps, createTableValidator };
123
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","names":["defaultUnknownKeysMode: TableUnknownKeysMode","issues: StandardSchemaV1.Issue[]","output: Record<string, unknown>"],"sources":["../../src/schema/validator.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type {\n AnyColumn,\n Table,\n TableInsertValues,\n TableUnknownKeysMode,\n TableValidationOptions,\n} from \"./create\";\n\nexport class FragnoDbValidationError extends Error {\n readonly issues: readonly StandardSchemaV1.Issue[];\n\n constructor(message: string, issues: readonly StandardSchemaV1.Issue[]) {\n super(message);\n this.name = \"FragnoDbValidationError\";\n this.issues = issues;\n }\n}\n\ntype FragnoIdCtor = typeof import(\"./create\").FragnoId;\ntype FragnoReferenceCtor = typeof import(\"./create\").FragnoReference;\n\ntype ValidationClasses = {\n FragnoId: FragnoIdCtor;\n FragnoReference: FragnoReferenceCtor;\n};\n\nconst defaultUnknownKeysMode: TableUnknownKeysMode = \"strip\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parseVarcharLength = (type: string): number | undefined => {\n if (!type.startsWith(\"varchar(\") || !type.endsWith(\")\")) {\n return;\n }\n\n const rawLength = type.slice(\"varchar(\".length, -1);\n const length = Number(rawLength);\n if (!Number.isFinite(length)) {\n return;\n }\n\n return length;\n};\n\nconst getUnknownKeysMode = (options?: StandardSchemaV1.Options): TableUnknownKeysMode => {\n const libraryOptions = options?.libraryOptions as TableValidationOptions | undefined;\n return libraryOptions?.unknownKeys ?? defaultUnknownKeysMode;\n};\n\nconst validateColumnValue = (\n col: AnyColumn,\n value: unknown,\n classes: ValidationClasses,\n): string | undefined => {\n if (col.role === \"external-id\") {\n if (value instanceof classes.FragnoId) {\n const maxLength = parseVarcharLength(col.type);\n if (maxLength !== undefined && value.externalId.length > maxLength) {\n return `String must have at most ${maxLength} characters`;\n }\n return;\n }\n\n if (typeof value === \"string\") {\n const maxLength = parseVarcharLength(col.type);\n if (maxLength !== undefined && value.length > maxLength) {\n return `String must have at most ${maxLength} characters`;\n }\n return;\n }\n\n return \"Expected string or FragnoId\";\n }\n\n if (col.role === \"reference\") {\n if (\n value instanceof classes.FragnoReference ||\n value instanceof classes.FragnoId ||\n typeof value === \"string\" ||\n typeof value === \"bigint\"\n ) {\n return;\n }\n\n return \"Expected reference (string, bigint, FragnoId, or FragnoReference)\";\n }\n\n if (col.type === \"string\" || col.type.startsWith(\"varchar(\")) {\n if (typeof value !== \"string\") {\n return \"Expected string\";\n }\n\n const maxLength = parseVarcharLength(col.type);\n if (maxLength !== undefined && value.length > maxLength) {\n return `String must have at most ${maxLength} characters`;\n }\n\n return;\n }\n\n if (col.type === \"bigint\") {\n return typeof value === \"bigint\" ? undefined : \"Expected bigint\";\n }\n\n if (col.type === \"integer\") {\n if (typeof value !== \"number\" || !Number.isInteger(value)) {\n return \"Expected integer\";\n }\n return;\n }\n\n if (col.type === \"decimal\") {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return \"Expected number\";\n }\n return;\n }\n\n if (col.type === \"bool\") {\n return typeof value === \"boolean\" ? undefined : \"Expected boolean\";\n }\n\n if (col.type === \"binary\") {\n return value instanceof Uint8Array ? undefined : \"Expected Uint8Array\";\n }\n\n if (col.type === \"date\" || col.type === \"timestamp\") {\n if (!(value instanceof Date) || Number.isNaN(value.getTime())) {\n return \"Expected valid Date\";\n }\n return;\n }\n\n if (col.type === \"json\") {\n return;\n }\n\n return;\n};\n\nconst validateTableInsertValues = <TTable extends Table>(\n table: TTable,\n value: unknown,\n options: StandardSchemaV1.Options | undefined,\n classes: ValidationClasses,\n): StandardSchemaV1.Result<TableInsertValues<TTable>> => {\n const issues: StandardSchemaV1.Issue[] = [];\n\n if (!isRecord(value)) {\n return { issues: [{ message: \"Expected object\" }] };\n }\n\n const input = value as Record<string, unknown>;\n const entries = Object.entries(table.columns).filter(([, col]) => !col.isHidden);\n const allowedKeys = new Set(entries.map(([key]) => key));\n const unknownKeysMode = getUnknownKeysMode(options);\n\n if (unknownKeysMode === \"strict\") {\n for (const key of Object.keys(input)) {\n if (!allowedKeys.has(key)) {\n issues.push({ message: `Unknown key \"${key}\"`, path: [key] });\n }\n }\n }\n\n const output: Record<string, unknown> = {};\n\n for (const [key, col] of entries) {\n const hasKey = Object.prototype.hasOwnProperty.call(input, key);\n const colValue = hasKey ? input[key] : undefined;\n const allowsUndefined = col.isNullable || col.default !== undefined;\n const allowsNull = col.isNullable;\n\n if (colValue === undefined) {\n if (!allowsUndefined) {\n issues.push({ message: \"Required\", path: [key] });\n }\n continue;\n }\n\n if (colValue === null) {\n if (!allowsNull) {\n issues.push({ message: \"Required\", path: [key] });\n } else {\n output[key] = null;\n }\n continue;\n }\n\n const issue = validateColumnValue(col, colValue, classes);\n if (issue) {\n issues.push({ message: issue, path: [key] });\n continue;\n }\n\n output[key] = colValue;\n }\n\n if (issues.length > 0) {\n return { issues };\n }\n\n return { value: output as TableInsertValues<TTable> };\n};\n\nexport const createTableStandardSchemaProps = <TTable extends Table>(\n table: TTable,\n classes: ValidationClasses,\n): StandardSchemaV1.Props<TableInsertValues<TTable>, TableInsertValues<TTable>> => ({\n version: 1,\n vendor: \"fragno-db\",\n validate: (value: unknown, options?: StandardSchemaV1.Options) =>\n validateTableInsertValues(table, value, options, classes),\n});\n\nexport const createTableValidator = <TTable extends Table>(\n table: TTable,\n classes: ValidationClasses,\n) => {\n return (value: unknown, options?: TableValidationOptions) => {\n const result = validateTableInsertValues(table, value, { libraryOptions: options }, classes);\n\n if (result.issues) {\n throw new FragnoDbValidationError(\"Validation failed\", result.issues);\n }\n\n return result.value as TableInsertValues<TTable>;\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { AnySchema } from "../schema/create.js";
2
+ import { SqlNamingStrategy } from "../naming/sql-naming.js";
3
+ import { SupportedDatabase } from "../adapters/generic-sql/driver-config.js";
4
+
5
+ //#region src/schema-output/drizzle.d.ts
6
+ type SupportedProvider = SupportedDatabase;
7
+ interface GenerateSchemaOptions {
8
+ /** Custom ID generator import configuration */
9
+ idGeneratorImport?: {
10
+ /** Function name to import */
11
+ name: string;
12
+ /** Module to import from */
13
+ from: string;
14
+ };
15
+ /** Optional naming strategy override for physical names */
16
+ namingStrategy?: SqlNamingStrategy;
17
+ }
18
+ /**
19
+ * Generate a settings table for storing fragment versions
20
+ */
21
+ /**
22
+ * Generate a schema file from one or more fragments with automatic de-duplication
23
+ */
24
+ declare function generateDrizzleSchema(fragments: {
25
+ namespace: string | null;
26
+ schema: AnySchema;
27
+ }[], provider: SupportedDatabase, options?: GenerateSchemaOptions): string;
28
+ //#endregion
29
+ export { GenerateSchemaOptions, SupportedProvider, generateDrizzleSchema };
30
+ //# sourceMappingURL=drizzle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drizzle.d.ts","names":[],"sources":["../../src/schema-output/drizzle.ts"],"sourcesContent":[],"mappings":";;;;;KAuCY,iBAAA,GAAoB;UA4nBf,qBAAA;EA5nBL;EA4nBK,iBAAA,CAAA,EAAA;IAkBD;IACiC,IAAA,EAAA,MAAA;IACrC;IACA,IAAA,EAAA,MAAA;EAAqB,CAAA;;mBAZd;;;;;;;;iBASH,qBAAA;;UACiC;eACrC,6BACA"}
@@ -1,10 +1,12 @@
1
- import { InternalIdColumn } from "../../schema/create.js";
2
- import { importGenerator } from "../../util/import-generator.js";
3
- import { ident, parseVarchar } from "../../util/parse.js";
4
- import { createTableNameMapper, sanitizeNamespace } from "../shared/table-name-mapper.js";
5
- import { createSQLTypeMapper } from "../../schema/type-conversion/create-sql-type-mapper.js";
1
+ import { InternalIdColumn } from "../schema/create.js";
2
+ import { internalSchema } from "../fragments/internal-fragment.schema.js";
3
+ import { createNamingResolver, sanitizeNamespace } from "../naming/sql-naming.js";
4
+ import { createSQLTypeMapper } from "../schema/type-conversion/create-sql-type-mapper.js";
5
+ import { defaultNamingStrategyForDatabase } from "../adapters/generic-sql/driver-config.js";
6
+ import { importGenerator } from "../util/import-generator.js";
7
+ import { ident, parseVarchar } from "../util/parse.js";
6
8
 
7
- //#region src/adapters/drizzle/generate.ts
9
+ //#region src/schema-output/drizzle.ts
8
10
  const PROVIDER_IMPORTS = {
9
11
  mysql: "drizzle-orm/mysql-core",
10
12
  postgresql: "drizzle-orm/pg-core",
@@ -133,7 +135,7 @@ function mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes) {
133
135
  };
134
136
  case "text":
135
137
  if (column.type === "json") return {
136
- name: "blob",
138
+ name: "text",
137
139
  params: [`{ mode: "json" }`]
138
140
  };
139
141
  return { name: "text" };
@@ -143,16 +145,15 @@ function mapDBTypeToDrizzleFunction(ctx, dbType, column, customTypes) {
143
145
  return { name: dbType };
144
146
  }
145
147
  /**
146
- * Get the physical table name (with namespace suffix) using the mapper if available
148
+ * Get the physical table name using the naming resolver if available
147
149
  */
148
- function getPhysicalTableName(logicalName, namespace, mapper) {
149
- if (!namespace) return logicalName;
150
- return mapper ? mapper.toPhysical(logicalName) : `${logicalName}_${sanitizeNamespace(namespace)}`;
150
+ function getPhysicalTableName(logicalName, resolver) {
151
+ return resolver ? resolver.getTableName(logicalName) : logicalName;
151
152
  }
152
- function generateColumnDefinition(ctx, column, customTypes) {
153
+ function generateColumnDefinition(ctx, column, customTypes, physicalColumnName) {
153
154
  const parts = [];
154
155
  const typeFn = getColumnTypeFunction(ctx, column, customTypes);
155
- const params = [`"${column.name}"`, ...typeFn.params ?? []];
156
+ const params = [`"${physicalColumnName}"`, ...typeFn.params ?? []];
156
157
  if (!typeFn.isCustomType) ctx.imports.addImport(typeFn.name, ctx.importSource);
157
158
  parts.push(`${typeFn.name}(${params.join(", ")})`);
158
159
  if (column instanceof InternalIdColumn || column.role === "internal-id") if (ctx.provider === "sqlite") parts.push("primaryKey({ autoIncrement: true })");
@@ -161,6 +162,7 @@ function generateColumnDefinition(ctx, column, customTypes) {
161
162
  parts.push("autoincrement()");
162
163
  } else parts.push("primaryKey()");
163
164
  if (!column.isNullable) parts.push("notNull()");
165
+ if (column.role === "external-id") parts.push("unique()");
164
166
  if (column.default) {
165
167
  if ("value" in column.default) {
166
168
  let value;
@@ -170,7 +172,10 @@ function generateColumnDefinition(ctx, column, customTypes) {
170
172
  } else value = JSON.stringify(column.default.value);
171
173
  parts.push(`default(${value})`);
172
174
  } else if ("dbSpecial" in column.default) {
173
- if (column.default.dbSpecial === "now") parts.push("defaultNow()");
175
+ if (column.default.dbSpecial === "now") if (ctx.provider === "mysql") {
176
+ ctx.imports.addImport("sql", "drizzle-orm");
177
+ parts.push("default(sql`(now())`)");
178
+ } else parts.push("defaultNow()");
174
179
  } else if ("runtime" in column.default) {
175
180
  if (column.default.runtime === "cuid") {
176
181
  const idGen = ctx.idGeneratorImport ?? {
@@ -182,29 +187,33 @@ function generateColumnDefinition(ctx, column, customTypes) {
182
187
  } else if (column.default.runtime === "now") parts.push("$defaultFn(() => new Date())");
183
188
  }
184
189
  }
185
- return ` ${column.ormName}: ${parts.join(".")}`;
190
+ return ` ${column.name}: ${parts.join(".")}`;
186
191
  }
187
- function generateAllColumns(ctx, table, customTypes) {
188
- return Object.values(table.columns).map((column) => generateColumnDefinition(ctx, column, customTypes));
192
+ function generateAllColumns(ctx, table, customTypes, resolver) {
193
+ return Object.values(table.columns).map((column) => generateColumnDefinition(ctx, column, customTypes, resolver ? resolver.getColumnName(table.name, column.name) : column.name));
189
194
  }
190
- function generateForeignKeys(ctx, table, namespace, mapper) {
195
+ function generateForeignKeys(ctx, table, namespace, resolver) {
191
196
  const keys = [];
192
197
  for (const relation of Object.values(table.relations)) {
193
198
  if (relation.type === "many") continue;
194
199
  const columns = [];
195
200
  const foreignColumns = [];
196
- const isSelfReference = relation.table.ormName === table.ormName;
201
+ const isSelfReference = relation.table.name === table.name;
197
202
  for (const [localCol, refCol] of relation.on) {
198
203
  columns.push(`table.${localCol}`);
199
204
  const actualRefCol = refCol === "id" ? "_internalId" : refCol;
200
205
  if (isSelfReference) foreignColumns.push(`table.${actualRefCol}`);
201
206
  else {
202
- const foreignTableRef = namespace ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}` : relation.table.ormName;
207
+ const foreignTableRef = namespace ? `${relation.table.name}_${sanitizeNamespace(namespace)}` : relation.table.name;
203
208
  foreignColumns.push(`${foreignTableRef}.${actualRefCol}`);
204
209
  }
205
210
  }
206
211
  ctx.imports.addImport("foreignKey", ctx.importSource);
207
- const fkName = namespace && mapper ? "fk_" + mapper.toPhysical(`${table.ormName}_${relation.table.ormName}_${relation.name}`) : `${table.ormName}_${relation.table.ormName}_${relation.name}_fk`;
212
+ const fkName = resolver ? resolver.getForeignKeyName({
213
+ logicalTable: table.name,
214
+ logicalReferencedTable: relation.table.name,
215
+ referenceName: relation.name
216
+ }) : `${table.name}_${relation.table.name}_${relation.name}_fk`;
208
217
  keys.push(`foreignKey({
209
218
  columns: [${columns.join(", ")}],
210
219
  foreignColumns: [${foreignColumns.join(", ")}],
@@ -213,11 +222,11 @@ function generateForeignKeys(ctx, table, namespace, mapper) {
213
222
  }
214
223
  return keys;
215
224
  }
216
- function generateIndexes(ctx, table, namespace) {
225
+ function generateIndexes(ctx, table, namespace, resolver) {
217
226
  const indexes = [];
218
227
  for (const idx of Object.values(table.indexes)) {
219
- const columns = idx.columns.map((col) => `table.${col.ormName}`).join(", ");
220
- const indexName = namespace ? `${idx.name}_${namespace}` : idx.name;
228
+ const columns = idx.columns.map((col) => `table.${col.name}`).join(", ");
229
+ const indexName = resolver ? idx.unique ? resolver.getUniqueIndexName(idx.name, table.name) : resolver.getIndexName(idx.name, table.name) : namespace ? `${idx.name}_${namespace}` : idx.name;
221
230
  if (idx.unique) {
222
231
  ctx.imports.addImport("uniqueIndex", ctx.importSource);
223
232
  indexes.push(`uniqueIndex("${indexName}").on(${columns})`);
@@ -228,21 +237,30 @@ function generateIndexes(ctx, table, namespace) {
228
237
  }
229
238
  return indexes;
230
239
  }
231
- function generateTableConstraints(ctx, table, namespace, mapper) {
232
- return [...generateForeignKeys(ctx, table, namespace, mapper), ...generateIndexes(ctx, table, namespace)];
240
+ function generateTableConstraints(ctx, table, namespace, resolver) {
241
+ const constraints = [...generateForeignKeys(ctx, table, namespace, resolver), ...generateIndexes(ctx, table, namespace, resolver)];
242
+ if (ctx.provider === "sqlite") {
243
+ const externalIdColumn = Object.values(table.columns).find((column) => column.role === "external-id");
244
+ if (externalIdColumn) {
245
+ const indexName = resolver ? resolver.getUniqueIndexName(`idx_${table.name}_external_id`, table.name) : namespace ? `idx_${table.name}_external_id_${namespace}` : `idx_${table.name}_external_id`;
246
+ ctx.imports.addImport("uniqueIndex", ctx.importSource);
247
+ constraints.push(`uniqueIndex("${indexName}").on(table.${externalIdColumn.name})`);
248
+ }
249
+ }
250
+ return constraints;
233
251
  }
234
- function generateTable(ctx, table, customTypes, namespace, mapper) {
235
- const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];
236
- ctx.imports.addImport(tableFn, ctx.importSource);
237
- const columns = generateAllColumns(ctx, table, customTypes);
238
- const constraints = generateTableConstraints(ctx, table, namespace, mapper);
239
- const physicalTableName = getPhysicalTableName(table.ormName, namespace, mapper);
240
- const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
252
+ function generateTable(ctx, table, customTypes, namespace, resolver, schemaRef) {
253
+ const tableFn = schemaRef ? `${schemaRef}.table` : PROVIDER_TABLE_FUNCTIONS[ctx.provider];
254
+ if (!schemaRef) ctx.imports.addImport(tableFn, ctx.importSource);
255
+ const columns = generateAllColumns(ctx, table, customTypes, resolver);
256
+ const constraints = generateTableConstraints(ctx, table, namespace, resolver);
257
+ const physicalTableName = getPhysicalTableName(table.name, resolver);
258
+ const exportName = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;
241
259
  const args = [`"${physicalTableName}"`, `{\n${columns.join(",\n")}\n}`];
242
260
  if (constraints.length > 0) args.push(`(table) => [\n${ident(constraints.join(",\n"))}\n]`);
243
261
  return `export const ${exportName} = ${tableFn}(${args.join(", ")})`;
244
262
  }
245
- function generateRelation(ctx, table, namespace, inverseRelations, _mapper) {
263
+ function generateRelation(ctx, table, namespace, inverseRelations, _resolver) {
246
264
  const relations = [];
247
265
  let hasOne = false;
248
266
  let hasMany = false;
@@ -253,8 +271,8 @@ function generateRelation(ctx, table, namespace, inverseRelations, _mapper) {
253
271
  if (relation.type === "one") {
254
272
  const fields = [];
255
273
  const references = [];
256
- const tableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
257
- const relatedTableRef = namespace ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}` : relation.table.ormName;
274
+ const tableRef = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;
275
+ const relatedTableRef = namespace ? `${relation.table.name}_${sanitizeNamespace(namespace)}` : relation.table.name;
258
276
  for (const [left, right] of relation.on) {
259
277
  fields.push(`${tableRef}.${left}`);
260
278
  const actualRight = right === "id" ? "_internalId" : right;
@@ -262,15 +280,15 @@ function generateRelation(ctx, table, namespace, inverseRelations, _mapper) {
262
280
  }
263
281
  options.push(`fields: [${fields.join(", ")}]`, `references: [${references.join(", ")}]`);
264
282
  }
265
- const args = [namespace ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}` : relation.table.ormName];
283
+ const args = [namespace ? `${relation.table.name}_${sanitizeNamespace(namespace)}` : relation.table.name];
266
284
  if (options.length > 0) args.push(`{\n${ident(options.join(",\n"))}\n}`);
267
285
  relations.push(ident(`${relation.name}: ${relation.type}(${args.join(", ")})`));
268
286
  }
269
287
  if (inverseRelations && inverseRelations.length > 0) {
270
288
  for (const { fromTable, relation } of inverseRelations) if (relation.type === "one") {
271
289
  hasMany = true;
272
- const fromTableRef = namespace ? `${fromTable.ormName}_${sanitizeNamespace(namespace)}` : fromTable.ormName;
273
- const inverseRelationName = `${fromTable.ormName}List`;
290
+ const fromTableRef = namespace ? `${fromTable.name}_${sanitizeNamespace(namespace)}` : fromTable.name;
291
+ const inverseRelationName = `${fromTable.name}List`;
274
292
  const args = [fromTableRef, `{\n${ident([`relationName: "${relation.id}"`].join(",\n"))}\n}`];
275
293
  relations.push(ident(`${inverseRelationName}: many(${args.join(", ")})`));
276
294
  }
@@ -280,8 +298,8 @@ function generateRelation(ctx, table, namespace, inverseRelations, _mapper) {
280
298
  if (hasOne) params.push("one");
281
299
  if (hasMany) params.push("many");
282
300
  const relationParams = params.length > 0 ? `{ ${params.join(", ")} }` : "{}";
283
- const exportTableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
284
- const relationsName = namespace ? `${exportTableRef}Relations` : `${table.ormName}Relations`;
301
+ const exportTableRef = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;
302
+ const relationsName = namespace ? `${exportTableRef}Relations` : `${table.name}Relations`;
285
303
  ctx.imports.addImport("relations", "drizzle-orm");
286
304
  return `export const ${relationsName} = relations(${exportTableRef}, (${relationParams}) => ({
287
305
  ${relations.join(",\n")}
@@ -291,20 +309,20 @@ ${relations.join(",\n")}
291
309
  * Generate a schema export object for a fragment
292
310
  * This groups all tables by their logical names for easier access
293
311
  */
294
- function generateFragmentSchemaExport(schema, namespace, tablesWithRelations, _mapper) {
312
+ function generateFragmentSchemaExport(schema, namespace, tablesWithRelations, _resolver) {
295
313
  const drizzleEntries = [];
296
314
  for (const table of Object.values(schema.tables)) {
297
- const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
315
+ const exportName = namespace ? `${table.name}_${sanitizeNamespace(namespace)}` : table.name;
298
316
  drizzleEntries.push(` ${exportName}: ${exportName}`);
299
317
  if (tablesWithRelations?.has(table.name)) {
300
- const relationsName = namespace ? `${exportName}Relations` : `${table.ormName}Relations`;
318
+ const relationsName = namespace ? `${exportName}Relations` : `${table.name}Relations`;
301
319
  drizzleEntries.push(` ${relationsName}: ${relationsName}`);
302
320
  }
303
321
  if (namespace) {
304
- drizzleEntries.push(` ${table.ormName}: ${exportName}`);
322
+ drizzleEntries.push(` ${table.name}: ${exportName}`);
305
323
  if (tablesWithRelations?.has(table.name)) {
306
324
  const physicalRelationsName = `${exportName}Relations`;
307
- const aliasRelationsName = `${table.ormName}Relations`;
325
+ const aliasRelationsName = `${table.name}Relations`;
308
326
  drizzleEntries.push(` ${aliasRelationsName}: ${physicalRelationsName}`);
309
327
  }
310
328
  }
@@ -318,20 +336,28 @@ function generateFragmentSchemaExport(schema, namespace, tablesWithRelations, _m
318
336
  /**
319
337
  * Generate a schema file from one or more fragments with automatic de-duplication
320
338
  */
321
- function generateSchema(fragments, provider, options) {
339
+ function generateDrizzleSchema(fragments, provider, options) {
322
340
  const ctx = createContext(provider, options?.idGeneratorImport);
323
341
  const customTypes = [];
324
342
  const sections = [];
325
- const getMapper = options?.mapperFactory || ((ns) => ns ? createTableNameMapper(ns, true) : void 0);
343
+ const namingStrategy = options?.namingStrategy ?? defaultNamingStrategyForDatabase(provider);
326
344
  for (const { schema, namespace } of fragments) {
327
345
  const fragmentTables = [];
328
- const mapper = getMapper(namespace);
346
+ const resolver = createNamingResolver(schema, namespace, namingStrategy);
347
+ const schemaName = resolver.getSchemaName();
348
+ const schemaRef = ctx.provider === "postgresql" && schemaName ? `schema_${sanitizeNamespace(schemaName)}` : void 0;
329
349
  fragmentTables.push("");
330
350
  fragmentTables.push("// ============================================================================");
331
- fragmentTables.push(`// Fragment: ${namespace}`);
351
+ const namespaceLabel = namespace ?? "(none)";
352
+ fragmentTables.push(`// Fragment: ${namespaceLabel}`);
332
353
  fragmentTables.push("// ============================================================================");
354
+ if (schemaRef && schemaName) {
355
+ ctx.imports.addImport("pgSchema", ctx.importSource);
356
+ fragmentTables.push("");
357
+ fragmentTables.push(`const ${schemaRef} = pgSchema("${schemaName}");`);
358
+ }
333
359
  for (const table of Object.values(schema.tables)) {
334
- const tableCode = generateTable(ctx, table, customTypes, namespace, mapper);
360
+ const tableCode = generateTable(ctx, table, customTypes, namespace, resolver, schemaRef);
335
361
  fragmentTables.push("");
336
362
  fragmentTables.push(tableCode);
337
363
  }
@@ -346,16 +372,16 @@ function generateSchema(fragments, provider, options) {
346
372
  }
347
373
  const tablesWithRelations = /* @__PURE__ */ new Set();
348
374
  for (const table of Object.values(schema.tables)) {
349
- const relationCode = generateRelation(ctx, table, namespace, inverseRelations.get(table.name), mapper);
375
+ const relationCode = generateRelation(ctx, table, namespace, inverseRelations.get(table.name), resolver);
350
376
  if (relationCode) {
351
377
  fragmentTables.push("");
352
378
  fragmentTables.push(relationCode);
353
379
  tablesWithRelations.add(table.name);
354
380
  }
355
381
  }
356
- if (namespace !== "") {
382
+ if (!(namespace === null && schema.name === internalSchema.name)) {
357
383
  fragmentTables.push("");
358
- fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations, mapper));
384
+ fragmentTables.push(generateFragmentSchemaExport(schema, namespace, tablesWithRelations));
359
385
  }
360
386
  sections.push(...fragmentTables);
361
387
  }
@@ -367,5 +393,5 @@ function generateSchema(fragments, provider, options) {
367
393
  }
368
394
 
369
395
  //#endregion
370
- export { generateSchema };
371
- //# sourceMappingURL=generate.js.map
396
+ export { generateDrizzleSchema };
397
+ //# sourceMappingURL=drizzle.js.map