@hot-updater/server 0.33.2 → 0.34.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 (198) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +0 -2
  2. package/dist/adapters/drizzle.cjs +195 -2
  3. package/dist/adapters/drizzle.d.cts +7 -4
  4. package/dist/adapters/drizzle.d.mts +7 -4
  5. package/dist/adapters/drizzle.mjs +194 -2
  6. package/dist/adapters/drizzleLazyDB.cjs +53 -0
  7. package/dist/adapters/drizzleLazyDB.mjs +53 -0
  8. package/dist/adapters/kysely.cjs +154 -3
  9. package/dist/adapters/kysely.d.cts +18 -10
  10. package/dist/adapters/kysely.d.mts +18 -10
  11. package/dist/adapters/kysely.mjs +153 -3
  12. package/dist/adapters/mongodb.cjs +183 -2
  13. package/dist/adapters/mongodb.d.cts +5 -4
  14. package/dist/adapters/mongodb.d.mts +5 -4
  15. package/dist/adapters/mongodb.mjs +183 -2
  16. package/dist/adapters/prisma.cjs +200 -2
  17. package/dist/adapters/prisma.d.cts +9 -4
  18. package/dist/adapters/prisma.d.mts +9 -4
  19. package/dist/adapters/prisma.mjs +199 -2
  20. package/dist/db/bundleRows.cjs +82 -0
  21. package/dist/db/bundleRows.d.cts +33 -0
  22. package/dist/db/bundleRows.d.mts +33 -0
  23. package/dist/db/bundleRows.mjs +79 -0
  24. package/dist/db/fixedMigrator.cjs +136 -0
  25. package/dist/db/fixedMigrator.mjs +135 -0
  26. package/dist/db/index.cjs +17 -15
  27. package/dist/db/index.d.cts +3 -3
  28. package/dist/db/index.d.mts +3 -3
  29. package/dist/db/index.mjs +17 -15
  30. package/dist/db/pluginCore.cjs +13 -5
  31. package/dist/db/pluginCore.mjs +13 -5
  32. package/dist/db/schema/mongodb.cjs +17 -0
  33. package/dist/db/schema/mongodb.mjs +17 -0
  34. package/dist/db/schema/registry.cjs +23 -0
  35. package/dist/db/schema/registry.mjs +18 -0
  36. package/dist/db/schema/sql.cjs +84 -0
  37. package/dist/db/schema/sql.mjs +78 -0
  38. package/dist/db/schema/sqlMigrations.cjs +74 -0
  39. package/dist/db/schema/sqlMigrations.mjs +73 -0
  40. package/dist/db/schema/sqlOperations.cjs +27 -0
  41. package/dist/db/schema/sqlOperations.mjs +26 -0
  42. package/dist/db/schemaEnhancements.cjs +1 -152
  43. package/dist/db/schemaEnhancements.mjs +1 -149
  44. package/dist/db/schemaGenerators.cjs +222 -0
  45. package/dist/db/schemaGenerators.mjs +220 -0
  46. package/dist/db/schemaReadiness.cjs +23 -0
  47. package/dist/db/schemaReadiness.d.cts +8 -0
  48. package/dist/db/schemaReadiness.d.mts +8 -0
  49. package/dist/db/schemaReadiness.mjs +22 -0
  50. package/dist/db/types.cjs +10 -2
  51. package/dist/db/types.d.cts +58 -14
  52. package/dist/db/types.d.mts +58 -14
  53. package/dist/db/types.mjs +9 -1
  54. package/dist/index.cjs +2 -2
  55. package/dist/index.d.cts +3 -2
  56. package/dist/index.d.mts +3 -2
  57. package/dist/index.mjs +2 -2
  58. package/dist/{packages/server/package.cjs → package.cjs} +1 -1
  59. package/dist/{packages/server/package.mjs → package.mjs} +1 -1
  60. package/dist/runtime.cjs +9 -2
  61. package/dist/runtime.mjs +9 -2
  62. package/dist/schema/dsl.cjs +86 -0
  63. package/dist/schema/dsl.mjs +73 -0
  64. package/dist/schema/index.cjs +13 -0
  65. package/dist/schema/index.mjs +13 -0
  66. package/dist/schema/settings.cjs +9 -0
  67. package/dist/schema/settings.mjs +9 -0
  68. package/dist/schema/types.cjs +6 -0
  69. package/dist/schema/types.mjs +5 -0
  70. package/dist/schema/v0_21_0.cjs +33 -18
  71. package/dist/schema/v0_21_0.mjs +32 -18
  72. package/dist/schema/v0_29_0.cjs +40 -20
  73. package/dist/schema/v0_29_0.mjs +39 -20
  74. package/dist/schema/v0_31_0.cjs +77 -43
  75. package/dist/schema/v0_31_0.mjs +75 -43
  76. package/dist/version.cjs +1 -1
  77. package/dist/version.mjs +1 -1
  78. package/package.json +30 -16
  79. package/src/adapters/drizzle.spec.ts +75 -0
  80. package/src/adapters/drizzle.ts +328 -12
  81. package/src/adapters/drizzleLazyDB.ts +151 -0
  82. package/src/adapters/kysely.spec.ts +107 -0
  83. package/src/adapters/kysely.ts +349 -14
  84. package/src/adapters/mongodb.ts +298 -15
  85. package/src/adapters/prisma.ts +337 -12
  86. package/src/db/bundleRows.ts +140 -0
  87. package/src/db/fixedMigrator.spec.ts +89 -0
  88. package/src/db/fixedMigrator.ts +288 -0
  89. package/src/db/hotUpdaterSchema.ts +6 -0
  90. package/src/db/index.spec.ts +976 -13
  91. package/src/db/index.ts +37 -36
  92. package/src/db/pluginCore.spec.ts +17 -11
  93. package/src/db/pluginCore.ts +15 -6
  94. package/src/db/schema/definitions.ts +1 -0
  95. package/src/db/schema/mongodb.ts +26 -0
  96. package/src/db/schema/registry.ts +55 -0
  97. package/src/db/schema/sql.ts +200 -0
  98. package/src/db/schema/sqlMigrations.ts +219 -0
  99. package/src/db/schema/sqlOperations.ts +62 -0
  100. package/src/db/schema/types.ts +1 -0
  101. package/src/db/schemaEnhancements.ts +0 -405
  102. package/src/db/schemaGenerators.ts +382 -0
  103. package/src/db/schemaReadiness.ts +33 -0
  104. package/src/db/types.ts +69 -25
  105. package/src/runtime.spec.ts +70 -0
  106. package/src/runtime.ts +14 -2
  107. package/src/schema/dsl-all-versions.spec.ts +26 -0
  108. package/src/schema/dsl.ts +148 -0
  109. package/src/schema/index.ts +16 -0
  110. package/src/schema/settings.ts +15 -0
  111. package/src/schema/types.ts +73 -0
  112. package/src/schema/v0_21_0.ts +48 -18
  113. package/src/schema/v0_29_0.ts +58 -22
  114. package/src/schema/v0_31_0.spec.ts +73 -0
  115. package/src/schema/v0_31_0.ts +116 -54
  116. package/dist/_virtual/_rolldown/runtime.mjs +0 -6
  117. package/dist/calculatePagination.cjs +0 -25
  118. package/dist/calculatePagination.mjs +0 -25
  119. package/dist/db/ormCore.cjs +0 -577
  120. package/dist/db/ormCore.d.cts +0 -110
  121. package/dist/db/ormCore.d.mts +0 -110
  122. package/dist/db/ormCore.mjs +0 -575
  123. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/_u64.cjs +0 -112
  124. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/_u64.mjs +0 -108
  125. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/cryptoNode.cjs +0 -22
  126. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/cryptoNode.mjs +0 -18
  127. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/sha3.cjs +0 -219
  128. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/sha3.mjs +0 -214
  129. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/utils.cjs +0 -275
  130. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/utils.mjs +0 -270
  131. package/dist/node_modules/.pnpm/@paralleldrive_cuid2@2.3.1/node_modules/@paralleldrive/cuid2/index.cjs +0 -17
  132. package/dist/node_modules/.pnpm/@paralleldrive_cuid2@2.3.1/node_modules/@paralleldrive/cuid2/index.mjs +0 -13
  133. package/dist/node_modules/.pnpm/@paralleldrive_cuid2@2.3.1/node_modules/@paralleldrive/cuid2/src/index.cjs +0 -69
  134. package/dist/node_modules/.pnpm/@paralleldrive_cuid2@2.3.1/node_modules/@paralleldrive/cuid2/src/index.mjs +0 -65
  135. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/column.cjs +0 -52
  136. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/column.mjs +0 -52
  137. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/entity.cjs +0 -16
  138. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/entity.mjs +0 -15
  139. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/pg-core/columns/enum.cjs +0 -7
  140. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/pg-core/columns/enum.mjs +0 -7
  141. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/sql/expressions/conditions.cjs +0 -92
  142. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/sql/expressions/conditions.mjs +0 -78
  143. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/sql/expressions/select.cjs +0 -11
  144. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/sql/expressions/select.mjs +0 -10
  145. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/sql/sql.cjs +0 -383
  146. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/sql/sql.mjs +0 -366
  147. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/subquery.cjs +0 -17
  148. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/subquery.mjs +0 -17
  149. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/table.cjs +0 -60
  150. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/table.mjs +0 -59
  151. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/table.utils.cjs +0 -4
  152. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/table.utils.mjs +0 -4
  153. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/tracing.cjs +0 -6
  154. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/tracing.mjs +0 -6
  155. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/view-common.cjs +0 -4
  156. package/dist/node_modules/.pnpm/drizzle-orm@0.45.2_@cloudflare_workers-types@4.20260611.1_@electric-sql_pglite@0.4.1_@l_601a3995dfc55b0b7fac93cbe1e76579/node_modules/drizzle-orm/view-common.mjs +0 -4
  157. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/adapters/drizzle/index.cjs +0 -383
  158. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/adapters/drizzle/index.d.cts +0 -12
  159. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/adapters/drizzle/index.d.mts +0 -12
  160. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/adapters/drizzle/index.mjs +0 -383
  161. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/adapters/kysely/index.cjs +0 -4
  162. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/adapters/kysely/index.mjs +0 -5
  163. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/adapters/prisma/index.cjs +0 -339
  164. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/adapters/prisma/index.d.cts +0 -70
  165. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/adapters/prisma/index.d.mts +0 -70
  166. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/adapters/prisma/index.mjs +0 -339
  167. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-7PZK4ONR.cjs +0 -57
  168. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-7PZK4ONR.mjs +0 -56
  169. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-C6OTUURW.cjs +0 -330
  170. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-C6OTUURW.mjs +0 -326
  171. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-CHTIKPQU.cjs +0 -166
  172. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-CHTIKPQU.mjs +0 -163
  173. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-GUE4GMNC.cjs +0 -14
  174. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-GUE4GMNC.mjs +0 -13
  175. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-LHHP6UVP.cjs +0 -24
  176. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-LHHP6UVP.mjs +0 -24
  177. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-LVCPMTAT.cjs +0 -1190
  178. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-LVCPMTAT.mjs +0 -1189
  179. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-PK2W2SQ7.cjs +0 -197
  180. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-PK2W2SQ7.mjs +0 -197
  181. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-ZEQMAIFI.cjs +0 -410
  182. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-ZEQMAIFI.mjs +0 -400
  183. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-ZOCGSAWS.cjs +0 -213
  184. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/chunk-ZOCGSAWS.mjs +0 -212
  185. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/create-tg0451Y_.d.cts +0 -285
  186. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/create-tg0451Y_.d.mts +0 -285
  187. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/index-CMqePMTF.d.cts +0 -45
  188. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/index-CMqePMTF.d.mts +0 -45
  189. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/index.cjs +0 -69
  190. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/index.d.cts +0 -49
  191. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/index.d.mts +0 -49
  192. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/index.mjs +0 -67
  193. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/query/index.d.cts +0 -156
  194. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/query/index.d.mts +0 -156
  195. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/schema/index.cjs +0 -1
  196. package/dist/node_modules/.pnpm/fumadb@0.2.2_mongodb@6.20.0_@aws-sdk_credential-providers@3.1066.0_socks@2.8.9__prisma@_ee79457f0e32f18f0beb5c2db02e4f73/node_modules/fumadb/dist/schema/index.mjs +0 -2
  197. package/src/db/ormCore.ts +0 -1059
  198. package/src/db/ormUpdateCheck.bench.ts +0 -262
@@ -0,0 +1,382 @@
1
+ import {
2
+ HOT_UPDATER_SETTINGS_TABLE,
3
+ type HotUpdaterColumnSchema,
4
+ type HotUpdaterColumnType,
5
+ type HotUpdaterDefault,
6
+ type HotUpdaterRelationSchema,
7
+ type HotUpdaterTableSchema,
8
+ type HotUpdaterVersionedSchema,
9
+ } from "../schema/types";
10
+ import {
11
+ getHotUpdaterSchemaVersion,
12
+ hotUpdaterSchema,
13
+ schemaIndexAppliesToProvider,
14
+ } from "./schema/registry";
15
+ import type { ORMProvider, ORMSQLProvider, SchemaGenerator } from "./types";
16
+ import { getSQLProvider } from "./types";
17
+
18
+ const literal = (value: string): string => JSON.stringify(value);
19
+
20
+ const toPascalCase = (value: string): string =>
21
+ value
22
+ .split("_")
23
+ .filter(Boolean)
24
+ .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)
25
+ .join("");
26
+
27
+ const prismaDb = (type: HotUpdaterColumnType, provider: ORMProvider) => {
28
+ if (provider === "postgresql") {
29
+ if (type === "uuid") return " @db.Uuid";
30
+ if (type.startsWith("varchar")) return " @db.VarChar(255)";
31
+ }
32
+ if (provider === "mysql") {
33
+ if (type === "uuid") return " @db.Char(36)";
34
+ if (type.startsWith("varchar")) return " @db.VarChar(255)";
35
+ }
36
+ return "";
37
+ };
38
+
39
+ const prismaType = (
40
+ column: HotUpdaterColumnSchema,
41
+ provider: ORMProvider,
42
+ ): string => {
43
+ const base = (() => {
44
+ if (column.type === "bool") return "Boolean";
45
+ if (column.type === "integer") return "Int";
46
+ if (column.type === "json") return "Json";
47
+ return "String";
48
+ })();
49
+ return `${base}${column.nullable ? "?" : ""}${prismaDb(
50
+ column.type,
51
+ provider,
52
+ )}`;
53
+ };
54
+
55
+ const prismaDefault = (
56
+ column: HotUpdaterColumnSchema,
57
+ provider: ORMProvider,
58
+ ): string => {
59
+ if (!column.default) return "";
60
+ if (provider === "sqlite" && column.type === "json") return "";
61
+ if (column.default.type === "json") {
62
+ return ` @default(${literal(JSON.stringify(column.default.value))})`;
63
+ }
64
+ return ` @default(${JSON.stringify(column.default.value)})`;
65
+ };
66
+
67
+ const prismaField = (
68
+ column: HotUpdaterColumnSchema,
69
+ provider: ORMProvider,
70
+ ): string =>
71
+ [
72
+ column.ormName,
73
+ prismaType(column, provider),
74
+ column.primaryKey ? "@id" : undefined,
75
+ prismaDefault(column, provider).trim() || undefined,
76
+ ]
77
+ .filter(Boolean)
78
+ .join(" ");
79
+
80
+ const relationTargetFields = (
81
+ table: HotUpdaterTableSchema,
82
+ schema: HotUpdaterVersionedSchema,
83
+ ): readonly HotUpdaterRelationSchema[] =>
84
+ schema.tables.flatMap((sourceTable) =>
85
+ (sourceTable.relations ?? []).filter(
86
+ (relation) => relation.referencedTable === table.ormName,
87
+ ),
88
+ );
89
+
90
+ const prismaRelationFields = (
91
+ table: HotUpdaterTableSchema,
92
+ schema: HotUpdaterVersionedSchema,
93
+ ): string[] => {
94
+ const lines = relationTargetFields(table, schema).map(
95
+ (relation) =>
96
+ `${relation.fieldName} ${relation.referencedTable === table.ormName ? "bundle_patches" : relation.referencedTable}[] @relation(${literal(relation.relationName)})`,
97
+ );
98
+
99
+ for (const relation of table.relations ?? []) {
100
+ const targetType = toPascalCase(relation.referencedTable);
101
+ lines.push(
102
+ `${relation.targetFieldName} ${targetType === "Bundles" ? "bundles" : relation.referencedTable} @relation(${literal(relation.relationName)}, fields: [${relation.columns.join(", ")}], references: [${relation.referencedColumns.join(", ")}], onUpdate: Restrict, onDelete: Cascade)`,
103
+ );
104
+ }
105
+
106
+ return lines;
107
+ };
108
+
109
+ const prismaIndexes = (
110
+ table: HotUpdaterTableSchema,
111
+ provider: ORMProvider,
112
+ ): string[] =>
113
+ (table.indexes ?? [])
114
+ .filter((index) => schemaIndexAppliesToProvider(index, provider))
115
+ .map(
116
+ (index) =>
117
+ `@@index([${index.columns.join(", ")}], map: ${literal(index.name)})`,
118
+ );
119
+
120
+ export const generatePrismaSchema = (
121
+ provider: ORMProvider,
122
+ schema: HotUpdaterVersionedSchema = hotUpdaterSchema,
123
+ ) =>
124
+ schema.tables
125
+ .map((table) => {
126
+ const lines = [
127
+ ...table.columns.map((column) => prismaField(column, provider)),
128
+ ...prismaRelationFields(table, schema),
129
+ ...prismaIndexes(table, provider),
130
+ ];
131
+ return `model ${table.ormName} {\n${lines
132
+ .map((line) => ` ${line}`)
133
+ .join("\n")}\n}`;
134
+ })
135
+ .join("\n\n");
136
+
137
+ const drizzleImportSource = (provider: ORMSQLProvider) =>
138
+ provider === "sqlite"
139
+ ? "drizzle-orm/sqlite-core"
140
+ : provider === "mysql"
141
+ ? "drizzle-orm/mysql-core"
142
+ : "drizzle-orm/pg-core";
143
+
144
+ const drizzleTableFn = (provider: ORMSQLProvider) =>
145
+ provider === "sqlite"
146
+ ? "sqliteTable"
147
+ : provider === "mysql"
148
+ ? "mysqlTable"
149
+ : "pgTable";
150
+
151
+ const drizzleColumnFn = (
152
+ column: HotUpdaterColumnSchema,
153
+ provider: ORMSQLProvider,
154
+ ): { code: string; imports: readonly string[] } => {
155
+ if (provider === "sqlite") {
156
+ if (column.type === "bool") {
157
+ return {
158
+ code: `integer(${literal(column.ormName)}, { mode: "boolean" })`,
159
+ imports: ["integer"],
160
+ };
161
+ }
162
+ if (column.type === "integer") {
163
+ return {
164
+ code: `integer(${literal(column.ormName)})`,
165
+ imports: ["integer"],
166
+ };
167
+ }
168
+ if (column.type === "json") {
169
+ return {
170
+ code: `blob(${literal(column.ormName)}, { mode: "json" })`,
171
+ imports: ["blob"],
172
+ };
173
+ }
174
+ if (column.type.startsWith("varchar")) {
175
+ return {
176
+ code: `text(${literal(column.ormName)}, { length: 255 })`,
177
+ imports: ["text"],
178
+ };
179
+ }
180
+ return { code: `text(${literal(column.ormName)})`, imports: ["text"] };
181
+ }
182
+
183
+ if (provider === "mysql") {
184
+ if (column.type === "uuid") {
185
+ return {
186
+ code: `char(${literal(column.ormName)}, { length: 36 })`,
187
+ imports: ["char"],
188
+ };
189
+ }
190
+ if (column.type === "bool") {
191
+ return {
192
+ code: `boolean(${literal(column.ormName)})`,
193
+ imports: ["boolean"],
194
+ };
195
+ }
196
+ if (column.type === "integer") {
197
+ return { code: `int(${literal(column.ormName)})`, imports: ["int"] };
198
+ }
199
+ if (column.type === "json") {
200
+ return { code: `json(${literal(column.ormName)})`, imports: ["json"] };
201
+ }
202
+ if (column.type.startsWith("varchar")) {
203
+ return {
204
+ code: `varchar(${literal(column.ormName)}, { length: 255 })`,
205
+ imports: ["varchar"],
206
+ };
207
+ }
208
+ return { code: `text(${literal(column.ormName)})`, imports: ["text"] };
209
+ }
210
+
211
+ if (column.type === "uuid") {
212
+ return { code: `uuid(${literal(column.ormName)})`, imports: ["uuid"] };
213
+ }
214
+ if (column.type === "bool") {
215
+ return {
216
+ code: `boolean(${literal(column.ormName)})`,
217
+ imports: ["boolean"],
218
+ };
219
+ }
220
+ if (column.type === "integer") {
221
+ return {
222
+ code: `integer(${literal(column.ormName)})`,
223
+ imports: ["integer"],
224
+ };
225
+ }
226
+ if (column.type === "json") {
227
+ return { code: `json(${literal(column.ormName)})`, imports: ["json"] };
228
+ }
229
+ if (column.type.startsWith("varchar")) {
230
+ return {
231
+ code: `varchar(${literal(column.ormName)}, { length: 255 })`,
232
+ imports: ["varchar"],
233
+ };
234
+ }
235
+ return { code: `text(${literal(column.ormName)})`, imports: ["text"] };
236
+ };
237
+
238
+ const drizzleDefault = (value: HotUpdaterDefault | undefined): string => {
239
+ if (!value) return "";
240
+ if (value.type === "json") return ".default({})";
241
+ return `.default(${JSON.stringify(value.value)})`;
242
+ };
243
+
244
+ const drizzleColumn = (
245
+ table: HotUpdaterTableSchema,
246
+ column: HotUpdaterColumnSchema,
247
+ ): HotUpdaterColumnSchema => {
248
+ if (table.ormName !== HOT_UPDATER_SETTINGS_TABLE) return column;
249
+ if (column.ormName === "key") {
250
+ return { ...column, ormName: "id", type: "varchar(255)" };
251
+ }
252
+ if (column.ormName === "value") {
253
+ return { ...column, ormName: "version", type: "varchar(255)" };
254
+ }
255
+ return column;
256
+ };
257
+
258
+ const drizzleTable = (
259
+ table: HotUpdaterTableSchema,
260
+ provider: ORMSQLProvider,
261
+ imports: Set<string>,
262
+ ): string => {
263
+ const columns = table.columns.map((sourceColumn) => {
264
+ const column = drizzleColumn(table, sourceColumn);
265
+ const type = drizzleColumnFn(column, provider);
266
+ for (const item of type.imports) imports.add(item);
267
+ const chain = [
268
+ type.code,
269
+ column.primaryKey ? "primaryKey()" : undefined,
270
+ column.nullable ? undefined : "notNull()",
271
+ drizzleDefault(column.default).slice(1) || undefined,
272
+ ].filter(Boolean);
273
+ return ` ${column.ormName}: ${chain.join(".")}`;
274
+ });
275
+
276
+ const callbacks: string[] = [];
277
+ for (const foreignKey of table.foreignKeys ?? []) {
278
+ imports.add("foreignKey");
279
+ callbacks.push(`foreignKey({
280
+ columns: [table.${foreignKey.columns.join(", table.")}],
281
+ foreignColumns: [${foreignKey.referencedTable}.${foreignKey.referencedColumns.join(
282
+ `, ${foreignKey.referencedTable}.`,
283
+ )}],
284
+ name: ${literal(foreignKey.name)}
285
+ }).onUpdate(${literal(foreignKey.onUpdate)}).onDelete(${literal(
286
+ foreignKey.onDelete,
287
+ )})`);
288
+ }
289
+ for (const index of (table.indexes ?? []).filter((item) =>
290
+ schemaIndexAppliesToProvider(item, provider),
291
+ )) {
292
+ imports.add("index");
293
+ callbacks.push(
294
+ `index(${literal(index.name)}).on(${index.columns
295
+ .map((column) => `table.${column}`)
296
+ .join(", ")})`,
297
+ );
298
+ }
299
+
300
+ const args = [
301
+ literal(table.ormName),
302
+ `{\n${columns.join(",\n")}\n}`,
303
+ callbacks.length > 0
304
+ ? `(table) => [\n${callbacks.map((line) => ` ${line}`).join(",\n")}\n]`
305
+ : undefined,
306
+ ].filter(Boolean);
307
+
308
+ return `export const ${table.ormName} = ${drizzleTableFn(provider)}(${args.join(
309
+ ", ",
310
+ )})`;
311
+ };
312
+
313
+ const drizzleRelations = (table: HotUpdaterTableSchema): string | undefined => {
314
+ if (!table.relations || table.relations.length === 0) return undefined;
315
+ const lines = table.relations.map(
316
+ (
317
+ relation,
318
+ ) => ` ${relation.targetFieldName}: one(${relation.referencedTable}, {
319
+ relationName: ${literal(relation.relationName)},
320
+ fields: [${relation.columns.map((column) => `${table.ormName}.${column}`).join(", ")}],
321
+ references: [${relation.referencedColumns
322
+ .map((column) => `${relation.referencedTable}.${column}`)
323
+ .join(", ")}]
324
+ })`,
325
+ );
326
+ return `export const ${table.ormName}Relations = relations(${table.ormName}, ({ one }) => ({
327
+ ${lines.join(",\n")}
328
+ }))`;
329
+ };
330
+
331
+ export const generateDrizzleSchema = (
332
+ provider: ORMSQLProvider,
333
+ schema: HotUpdaterVersionedSchema = hotUpdaterSchema,
334
+ ) => {
335
+ const imports = new Set<string>([drizzleTableFn(provider)]);
336
+ const body: string[] = [];
337
+
338
+ for (const table of schema.tables) {
339
+ body.push(drizzleTable(table, provider, imports));
340
+ const relations = drizzleRelations(table);
341
+ if (relations) body.push(relations);
342
+ }
343
+
344
+ if (body.some((block) => block.includes("relations("))) {
345
+ body.unshift('import { relations } from "drizzle-orm"');
346
+ }
347
+
348
+ const importLine = `import { ${Array.from(imports)
349
+ .sort()
350
+ .join(", ")} } from "${drizzleImportSource(provider)}"`;
351
+
352
+ return [importLine, ...body].join("\n\n");
353
+ };
354
+
355
+ export const generateSchemaFromHotUpdaterSchema = (
356
+ adapterName: string,
357
+ provider: ORMProvider | undefined,
358
+ version: string | "latest",
359
+ fallback: ReturnType<SchemaGenerator>,
360
+ ): ReturnType<SchemaGenerator> => {
361
+ const schema =
362
+ version === "latest"
363
+ ? hotUpdaterSchema
364
+ : getHotUpdaterSchemaVersion(version);
365
+
366
+ if (adapterName === "prisma" && provider) {
367
+ return {
368
+ ...fallback,
369
+ code: generatePrismaSchema(provider, schema),
370
+ };
371
+ }
372
+
373
+ const sqlProvider = getSQLProvider(provider);
374
+ if (adapterName === "drizzle" && sqlProvider) {
375
+ return {
376
+ ...fallback,
377
+ code: generateDrizzleSchema(sqlProvider, schema),
378
+ };
379
+ }
380
+
381
+ return fallback;
382
+ };
@@ -0,0 +1,33 @@
1
+ import { HOT_UPDATER_SCHEMA_VERSION } from "../schema/types";
2
+ import type { Migrator } from "./types";
3
+
4
+ export class HotUpdaterSchemaMigrationRequiredError extends Error {
5
+ constructor(
6
+ readonly adapterName: string,
7
+ readonly currentVersion: string | undefined,
8
+ ) {
9
+ super(
10
+ currentVersion === undefined
11
+ ? `Hot Updater database schema is not initialized for ${adapterName}. Run \`hot-updater db migrate\` before using this adapter.`
12
+ : `Hot Updater database schema version ${currentVersion} is not supported by ${adapterName}. Run \`hot-updater db migrate\` to upgrade to ${HOT_UPDATER_SCHEMA_VERSION}.`,
13
+ );
14
+ this.name = "HotUpdaterSchemaMigrationRequiredError";
15
+ }
16
+ }
17
+
18
+ export const createSchemaReadinessChecker = (
19
+ adapterName: string,
20
+ createMigrator: (() => Migrator) | undefined,
21
+ ): (() => Promise<void>) => {
22
+ if (!createMigrator) return async () => {};
23
+
24
+ let ready = false;
25
+ return async () => {
26
+ if (ready) return;
27
+ const version = await createMigrator().getVersion();
28
+ if (version !== HOT_UPDATER_SCHEMA_VERSION) {
29
+ throw new HotUpdaterSchemaMigrationRequiredError(adapterName, version);
30
+ }
31
+ ready = true;
32
+ };
33
+ };
package/src/db/types.ts CHANGED
@@ -10,34 +10,84 @@ import type {
10
10
  HotUpdaterContext,
11
11
  RuntimeStoragePlugin,
12
12
  } from "@hot-updater/plugin-core";
13
- import { sqlProviders, type Provider, type SQLProvider } from "fumadb";
14
13
 
15
14
  import type { PaginatedResult } from "../types";
16
15
 
17
16
  export type DatabasePluginFactory<TContext = unknown> =
18
- () => DatabasePlugin<TContext>;
17
+ (() => DatabasePlugin<TContext>) & Partial<DatabaseAdapterCapabilities>;
19
18
 
20
- export type ORMProvider = Provider;
21
- export type ORMSQLProvider = SQLProvider;
19
+ export const sqlProviders = [
20
+ "sqlite",
21
+ "cockroachdb",
22
+ "mysql",
23
+ "postgresql",
24
+ "mssql",
25
+ ] as const;
22
26
 
23
- export interface ORMDatabaseAdapter {
24
- name: string;
27
+ export const noSqlProviders = ["mongodb"] as const;
28
+ export const providers = [...sqlProviders, ...noSqlProviders] as const;
29
+
30
+ export type ORMProvider = (typeof providers)[number];
31
+ export type ORMSQLProvider = (typeof sqlProviders)[number];
32
+ export type RelationMode = "foreign-keys" | "fumadb";
33
+
34
+ export interface MigrateOptions {
35
+ mode?: "from-schema" | "from-database";
36
+ updateSettings?: boolean;
37
+ unsafe?: boolean;
38
+ }
39
+
40
+ export type MigrationOperation =
41
+ | {
42
+ type: "create-table";
43
+ value: {
44
+ ormName: string;
45
+ columns: Record<string, { ormName: string; type: string }>;
46
+ };
47
+ }
48
+ | { type: "custom"; sql: string }
49
+ | { type: "custom"; key: string; value: unknown };
50
+
51
+ export interface MigrationResult {
52
+ operations: MigrationOperation[];
53
+ execute: () => Promise<void>;
54
+ getSQL?: () => string;
55
+ }
56
+
57
+ export interface Migrator {
58
+ getVersion: () => Promise<string | undefined>;
59
+ getNameVariants: () => Promise<unknown>;
60
+ next: () => Promise<{ version: string } | undefined>;
61
+ previous: () => Promise<{ version: string } | undefined>;
62
+ up: (options?: MigrateOptions) => Promise<MigrationResult>;
63
+ down: (options?: MigrateOptions) => Promise<MigrationResult>;
64
+ migrateTo: (
65
+ version: string,
66
+ options?: MigrateOptions,
67
+ ) => Promise<MigrationResult>;
68
+ migrateToLatest: (options?: MigrateOptions) => Promise<MigrationResult>;
69
+ }
70
+
71
+ export type SchemaGenerator = (
72
+ version: string | "latest",
73
+ name?: string,
74
+ ) => {
75
+ code: string;
76
+ path: string;
77
+ };
78
+
79
+ export interface DatabaseAdapterCapabilities {
80
+ adapterName?: string;
25
81
  provider?: ORMProvider;
26
- createORM(this: any, schema: any): unknown;
27
- getSchemaVersion(this: any): Promise<string | undefined>;
28
- generateSchema?: (
29
- this: any,
30
- schema: any,
31
- schemaName: string,
32
- ) => {
33
- code: string;
34
- path: string;
35
- };
36
- createMigrationEngine?: (this: any) => unknown;
82
+ createMigrator?: () => Migrator;
83
+ generateSchema?: SchemaGenerator;
37
84
  }
38
85
 
86
+ export type DatabaseAdapterWithCapabilities<TContext = unknown> =
87
+ DatabasePlugin<TContext> & DatabaseAdapterCapabilities;
88
+
39
89
  export type DatabaseAdapter<TContext = unknown> =
40
- | ORMDatabaseAdapter
90
+ | DatabaseAdapterWithCapabilities<TContext>
41
91
  | DatabasePlugin<TContext>
42
92
  | DatabasePluginFactory<TContext>;
43
93
 
@@ -59,12 +109,6 @@ export function isDatabasePlugin<TContext = unknown>(
59
109
  );
60
110
  }
61
111
 
62
- export function isFumaAdapter<TContext = unknown>(
63
- adapter: DatabaseAdapter<TContext>,
64
- ): adapter is ORMDatabaseAdapter {
65
- return !isDatabasePluginFactory(adapter) && !isDatabasePlugin(adapter);
66
- }
67
-
68
112
  export function getSQLProvider(
69
113
  provider: ORMProvider | undefined,
70
114
  ): ORMSQLProvider | undefined {
@@ -72,7 +116,7 @@ export function getSQLProvider(
72
116
  return undefined;
73
117
  }
74
118
 
75
- return sqlProviders.includes(provider as ORMSQLProvider)
119
+ return (sqlProviders as readonly string[]).includes(provider)
76
120
  ? (provider as ORMSQLProvider)
77
121
  : undefined;
78
122
  }
@@ -9,6 +9,7 @@ import type {
9
9
  import { createDatabasePlugin } from "@hot-updater/plugin-core";
10
10
  import { describe, expect, expectTypeOf, it, vi } from "vitest";
11
11
 
12
+ import type { DatabaseAdapterCapabilities, Migrator } from "./db/types";
12
13
  import { createHotUpdater } from "./runtime";
13
14
  import { HOT_UPDATER_SERVER_VERSION } from "./version";
14
15
 
@@ -46,6 +47,55 @@ const createRuntimeStorage = (
46
47
  },
47
48
  });
48
49
 
50
+ const createSchemaManagedDatabase = (
51
+ adapterName: string,
52
+ version: string | undefined,
53
+ ): DatabasePlugin<TestContext> & DatabaseAdapterCapabilities => ({
54
+ name: `${adapterName}Database`,
55
+ adapterName,
56
+ createMigrator: () =>
57
+ ({
58
+ async getVersion() {
59
+ return version;
60
+ },
61
+ async getNameVariants() {
62
+ return {};
63
+ },
64
+ async next() {
65
+ return undefined;
66
+ },
67
+ async previous() {
68
+ return undefined;
69
+ },
70
+ async up() {
71
+ throw new Error("not implemented");
72
+ },
73
+ async down() {
74
+ throw new Error("not implemented");
75
+ },
76
+ async migrateTo() {
77
+ throw new Error("not implemented");
78
+ },
79
+ async migrateToLatest() {
80
+ throw new Error("not implemented");
81
+ },
82
+ async migrate() {},
83
+ }) as Migrator,
84
+ async appendBundle() {},
85
+ async commitBundle() {},
86
+ async deleteBundle() {},
87
+ async getBundleById() {
88
+ throw new Error("runtime database should not be queried");
89
+ },
90
+ async getBundles() {
91
+ throw new Error("runtime database should not be queried");
92
+ },
93
+ async getChannels() {
94
+ throw new Error("runtime database should not be queried");
95
+ },
96
+ async updateBundle() {},
97
+ });
98
+
49
99
  describe("runtime createHotUpdater", () => {
50
100
  it("requires storages to implement the runtime profile", () => {
51
101
  const database: DatabasePlugin<TestContext> = {
@@ -98,6 +148,26 @@ describe("runtime createHotUpdater", () => {
98
148
  );
99
149
  });
100
150
 
151
+ it("rejects runtime access when a Kysely schema is not initialized", async () => {
152
+ const hotUpdater = createHotUpdater({
153
+ database: createSchemaManagedDatabase("kysely", undefined),
154
+ });
155
+
156
+ await expect(hotUpdater.getBundles({ limit: 10 })).rejects.toThrow(
157
+ "Hot Updater database schema is not initialized for kysely.",
158
+ );
159
+ });
160
+
161
+ it("rejects runtime access when a MongoDB schema is stale", async () => {
162
+ const hotUpdater = createHotUpdater({
163
+ database: createSchemaManagedDatabase("mongodb", "0.21.0"),
164
+ });
165
+
166
+ await expect(hotUpdater.getChannels()).rejects.toThrow(
167
+ "Hot Updater database schema version 0.21.0 is not supported by mongodb.",
168
+ );
169
+ });
170
+
101
171
  it("resolves storage URLs with handler context when database fast-path is used", async () => {
102
172
  const request = new Request(
103
173
  "https://updates.example.com/api/check-update/app-version/ios/1.0.0/production/" +
package/src/runtime.ts CHANGED
@@ -1,12 +1,15 @@
1
1
  import type {
2
+ DatabasePlugin,
2
3
  HotUpdaterContext,
3
4
  RuntimeStoragePlugin,
4
5
  } from "@hot-updater/plugin-core";
5
6
  import { assertRuntimeStoragePlugin } from "@hot-updater/plugin-core";
6
7
 
7
8
  import { createPluginDatabaseCore } from "./db/pluginCore";
9
+ import { createSchemaReadinessChecker } from "./db/schemaReadiness";
8
10
  import {
9
11
  type DatabaseAdapter,
12
+ type DatabaseAdapterCapabilities,
10
13
  type DatabaseAPI,
11
14
  isDatabasePlugin,
12
15
  isDatabasePluginFactory,
@@ -61,16 +64,25 @@ export function createHotUpdater<TContext = unknown>(
61
64
  );
62
65
  }
63
66
 
64
- const plugin = isDatabasePluginFactory(database) ? database() : database;
67
+ const capabilities = database as DatabaseAdapterCapabilities;
68
+ const plugin: DatabasePlugin<TContext> = isDatabasePluginFactory(database)
69
+ ? database()
70
+ : database;
71
+ const adapterName = capabilities.adapterName ?? plugin.name;
72
+ const assertSchemaReady = createSchemaReadinessChecker(
73
+ adapterName,
74
+ capabilities.createMigrator,
75
+ );
65
76
  const core = createPluginDatabaseCore<TContext>(
66
77
  () => plugin,
67
78
  resolveFileUrl,
68
79
  isDatabasePluginFactory(database)
69
80
  ? {
70
81
  createMutationPlugin: () => database(),
82
+ beforeOperation: assertSchemaReady,
71
83
  readStorageText,
72
84
  }
73
- : { readStorageText },
85
+ : { beforeOperation: assertSchemaReady, readStorageText },
74
86
  );
75
87
 
76
88
  const internalHandler = createHandler(core.api, {
@@ -0,0 +1,26 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { createSettingsTable } from "./settings";
4
+ import { bundlesV021, v0_21_0 } from "./v0_21_0";
5
+ import { bundlesV029, v0_29_0 } from "./v0_29_0";
6
+ import { bundlesV031, v0_31_0 } from "./v0_31_0";
7
+
8
+ describe("versioned schema DSL", () => {
9
+ it("uses the local functional DSL for every versioned schema table", () => {
10
+ expect(v0_21_0.dsl).toBe("schema");
11
+ expect(v0_29_0.dsl).toBe("schema");
12
+ expect(v0_31_0.dsl).toBe("schema");
13
+
14
+ expect(bundlesV021.dsl).toBe("table");
15
+ expect(bundlesV029.dsl).toBe("table");
16
+ expect(bundlesV031.dsl).toBe("table");
17
+ expect(createSettingsTable("0.31.0").dsl).toBe("table");
18
+
19
+ for (const schema of [v0_21_0, v0_29_0, v0_31_0]) {
20
+ expect(Object.keys(schema)).not.toContain("dsl");
21
+ for (const table of schema.tables) {
22
+ expect(Object.keys(table)).not.toContain("dsl");
23
+ }
24
+ }
25
+ });
26
+ });