@hot-updater/server 1.0.0-rc.14 → 1.0.0-rc.16

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 (514) hide show
  1. package/dist/adapters/drizzle.cjs +35 -74
  2. package/dist/adapters/drizzle.d.cts +13 -5
  3. package/dist/adapters/drizzle.d.mts +13 -5
  4. package/dist/adapters/drizzle.mjs +34 -75
  5. package/dist/adapters/drizzleExecutor.cjs +114 -0
  6. package/dist/adapters/drizzleExecutor.d.cts +9 -0
  7. package/dist/adapters/drizzleExecutor.d.mts +9 -0
  8. package/dist/adapters/drizzleExecutor.mjs +112 -0
  9. package/dist/adapters/kysely.cjs +25 -31
  10. package/dist/adapters/kysely.d.cts +10 -6
  11. package/dist/adapters/kysely.d.mts +10 -6
  12. package/dist/adapters/kysely.mjs +25 -32
  13. package/dist/adapters/kyselyExecutor.cjs +32 -0
  14. package/dist/adapters/kyselyExecutor.d.cts +12 -0
  15. package/dist/adapters/kyselyExecutor.d.mts +12 -0
  16. package/dist/adapters/kyselyExecutor.mjs +32 -0
  17. package/dist/adapters/mongodb.cjs +28 -62
  18. package/dist/adapters/mongodb.d.cts +10 -5
  19. package/dist/adapters/mongodb.d.mts +10 -5
  20. package/dist/adapters/mongodb.mjs +28 -63
  21. package/dist/adapters/mongodbAdapter.cjs +174 -0
  22. package/dist/adapters/mongodbAdapter.d.cts +9 -0
  23. package/dist/adapters/mongodbAdapter.d.mts +9 -0
  24. package/dist/adapters/mongodbAdapter.mjs +173 -0
  25. package/dist/adapters/prisma.cjs +38 -257
  26. package/dist/adapters/prisma.d.cts +12 -7
  27. package/dist/adapters/prisma.d.mts +12 -7
  28. package/dist/adapters/prisma.mjs +38 -257
  29. package/dist/adapters/prismaExecutor.cjs +64 -0
  30. package/dist/adapters/prismaExecutor.mjs +64 -0
  31. package/dist/adapters/sqlProviders.cjs +9 -0
  32. package/dist/adapters/sqlProviders.mjs +9 -0
  33. package/dist/apiKeys.cjs +2 -6
  34. package/dist/apiKeys.d.cts +1 -23
  35. package/dist/apiKeys.d.mts +1 -23
  36. package/dist/apiKeys.mjs +2 -6
  37. package/dist/assembly/assemblePlugins.cjs +147 -0
  38. package/dist/assembly/assemblePlugins.d.cts +12 -0
  39. package/dist/assembly/assemblePlugins.d.mts +12 -0
  40. package/dist/assembly/assemblePlugins.mjs +146 -0
  41. package/dist/assembly/databasePlugins.cjs +23 -0
  42. package/dist/assembly/databasePlugins.d.cts +43 -0
  43. package/dist/assembly/databasePlugins.d.mts +43 -0
  44. package/dist/assembly/databasePlugins.mjs +22 -0
  45. package/dist/core/api.cjs +91 -0
  46. package/dist/core/api.d.cts +65 -0
  47. package/dist/core/api.d.mts +65 -0
  48. package/dist/core/api.mjs +87 -0
  49. package/dist/core/baseCandidates.cjs +71 -0
  50. package/dist/core/baseCandidates.d.cts +17 -0
  51. package/dist/core/baseCandidates.d.mts +17 -0
  52. package/dist/core/baseCandidates.mjs +69 -0
  53. package/dist/core/operations.cjs +350 -0
  54. package/dist/core/operations.mjs +350 -0
  55. package/dist/core/reads.cjs +273 -0
  56. package/dist/core/reads.d.cts +48 -0
  57. package/dist/core/reads.d.mts +48 -0
  58. package/dist/core/reads.mjs +267 -0
  59. package/dist/core/releases.cjs +193 -0
  60. package/dist/core/releases.mjs +190 -0
  61. package/dist/core/schema.cjs +279 -0
  62. package/dist/core/schema.d.cts +307 -0
  63. package/dist/core/schema.d.mts +307 -0
  64. package/dist/core/schema.mjs +277 -0
  65. package/dist/core/writes.cjs +96 -0
  66. package/dist/core/writes.mjs +91 -0
  67. package/dist/createHotUpdaterCore.cjs +58 -75
  68. package/dist/createHotUpdaterCore.d.cts +52 -44
  69. package/dist/createHotUpdaterCore.d.mts +52 -44
  70. package/dist/createHotUpdaterCore.mjs +59 -75
  71. package/dist/database/cursor.cjs +44 -0
  72. package/dist/database/cursor.d.cts +7 -0
  73. package/dist/database/cursor.d.mts +7 -0
  74. package/dist/database/cursor.mjs +40 -0
  75. package/dist/database/database.cjs +44 -0
  76. package/dist/database/database.d.cts +123 -0
  77. package/dist/database/database.d.mts +123 -0
  78. package/dist/database/database.mjs +44 -0
  79. package/dist/database/definitions.d.cts +68 -0
  80. package/dist/database/definitions.d.mts +68 -0
  81. package/dist/database/engine.cjs +37 -0
  82. package/dist/database/engine.d.cts +40 -0
  83. package/dist/database/engine.d.mts +40 -0
  84. package/dist/database/engine.mjs +37 -0
  85. package/dist/database/engineAggregates.cjs +115 -0
  86. package/dist/database/engineAggregates.mjs +112 -0
  87. package/dist/database/engineReads.cjs +180 -0
  88. package/dist/database/engineReads.d.cts +35 -0
  89. package/dist/database/engineReads.d.mts +35 -0
  90. package/dist/database/engineReads.mjs +179 -0
  91. package/dist/database/engineTransaction.cjs +403 -0
  92. package/dist/database/engineTransaction.d.cts +26 -0
  93. package/dist/database/engineTransaction.d.mts +26 -0
  94. package/dist/database/engineTransaction.mjs +402 -0
  95. package/dist/database/errors.cjs +27 -0
  96. package/dist/database/errors.d.cts +21 -0
  97. package/dist/database/errors.d.mts +21 -0
  98. package/dist/database/errors.mjs +24 -0
  99. package/dist/database/fence.cjs +124 -0
  100. package/dist/database/fence.d.cts +42 -0
  101. package/dist/database/fence.d.mts +42 -0
  102. package/dist/database/fence.mjs +116 -0
  103. package/dist/database/index.cjs +127 -0
  104. package/dist/database/index.d.cts +17 -0
  105. package/dist/database/index.d.mts +17 -0
  106. package/dist/database/index.mjs +15 -0
  107. package/dist/database/kv/kvAdapter.cjs +273 -0
  108. package/dist/database/kv/kvAdapter.d.cts +101 -0
  109. package/dist/database/kv/kvAdapter.d.mts +101 -0
  110. package/dist/database/kv/kvAdapter.mjs +272 -0
  111. package/dist/database/resolveSchema.cjs +196 -0
  112. package/dist/database/resolveSchema.d.cts +42 -0
  113. package/dist/database/resolveSchema.d.mts +42 -0
  114. package/dist/database/resolveSchema.mjs +193 -0
  115. package/dist/database/schema.cjs +21 -0
  116. package/dist/database/schema.d.cts +61 -0
  117. package/dist/database/schema.d.mts +61 -0
  118. package/dist/database/schema.mjs +20 -0
  119. package/dist/database/sql/sqlAdapter.cjs +282 -0
  120. package/dist/database/sql/sqlAdapter.d.cts +46 -0
  121. package/dist/database/sql/sqlAdapter.d.mts +46 -0
  122. package/dist/database/sql/sqlAdapter.mjs +279 -0
  123. package/dist/database/sql/sqlSchema.cjs +115 -0
  124. package/dist/database/sql/sqlSchema.d.cts +8 -0
  125. package/dist/database/sql/sqlSchema.d.mts +8 -0
  126. package/dist/database/sql/sqlSchema.mjs +111 -0
  127. package/dist/db/builtInDatabase.cjs +104 -0
  128. package/dist/db/builtInDatabase.d.cts +38 -0
  129. package/dist/db/builtInDatabase.d.mts +38 -0
  130. package/dist/db/builtInDatabase.mjs +97 -0
  131. package/dist/db/createBundleDiff.cjs +4 -4
  132. package/dist/db/createBundleDiff.d.cts +3 -2
  133. package/dist/db/createBundleDiff.d.mts +3 -2
  134. package/dist/db/createBundleDiff.mjs +5 -5
  135. package/dist/db/engineDrizzleSchema.cjs +54 -0
  136. package/dist/db/engineDrizzleSchema.mjs +54 -0
  137. package/dist/db/engineMigrator.cjs +53 -0
  138. package/dist/db/engineMigrator.mjs +53 -0
  139. package/dist/db/enginePrismaSchema.cjs +85 -0
  140. package/dist/db/enginePrismaSchema.d.cts +5 -0
  141. package/dist/db/enginePrismaSchema.d.mts +5 -0
  142. package/dist/db/enginePrismaSchema.mjs +84 -0
  143. package/dist/db/engineSql.cjs +26 -0
  144. package/dist/db/engineSql.d.cts +17 -0
  145. package/dist/db/engineSql.d.mts +17 -0
  146. package/dist/db/engineSql.mjs +25 -0
  147. package/dist/db/engineSqlMigrator.cjs +66 -0
  148. package/dist/db/engineSqlMigrator.mjs +66 -0
  149. package/dist/db/fixedMigratorShared.cjs +0 -11
  150. package/dist/db/fixedMigratorShared.mjs +1 -8
  151. package/dist/db/index.cjs +23 -8
  152. package/dist/db/index.d.cts +10 -3
  153. package/dist/db/index.d.mts +10 -3
  154. package/dist/db/index.mjs +16 -8
  155. package/dist/db/releaseCatalog.cjs +20 -43
  156. package/dist/db/releaseCatalog.d.cts +2 -2
  157. package/dist/db/releaseCatalog.d.mts +2 -2
  158. package/dist/db/releaseCatalog.mjs +20 -44
  159. package/dist/db/schemaSettings.cjs +63 -0
  160. package/dist/db/schemaSettings.d.cts +12 -0
  161. package/dist/db/schemaSettings.d.mts +12 -0
  162. package/dist/db/schemaSettings.mjs +62 -0
  163. package/dist/db/settingsMigrator.cjs +92 -0
  164. package/dist/db/settingsMigrator.mjs +89 -0
  165. package/dist/db/types.cjs +1 -12
  166. package/dist/db/types.d.cts +26 -66
  167. package/dist/db/types.d.mts +26 -66
  168. package/dist/db/types.mjs +2 -11
  169. package/dist/db/updateArtifacts.cjs +38 -67
  170. package/dist/db/updateArtifacts.mjs +40 -69
  171. package/dist/handler.cjs +72 -43
  172. package/dist/handler.d.cts +3 -5
  173. package/dist/handler.d.mts +3 -5
  174. package/dist/handler.mjs +73 -43
  175. package/dist/handlerAdminRoutes.cjs +375 -0
  176. package/dist/handlerAdminRoutes.mjs +373 -0
  177. package/dist/handlerParameters.cjs +6 -11
  178. package/dist/handlerParameters.mjs +6 -10
  179. package/dist/handlerReleaseCatalogRoutes.cjs +11 -13
  180. package/dist/handlerReleaseCatalogRoutes.mjs +11 -13
  181. package/dist/handlerTypes.d.cts +2 -55
  182. package/dist/handlerTypes.d.mts +2 -55
  183. package/dist/handlerVersionRoutes.cjs +20 -4
  184. package/dist/handlerVersionRoutes.mjs +20 -4
  185. package/dist/index.cjs +4 -7
  186. package/dist/index.d.cts +8 -7
  187. package/dist/index.d.mts +8 -7
  188. package/dist/index.mjs +4 -4
  189. package/dist/insights/domain.d.cts +12 -0
  190. package/dist/insights/domain.d.mts +12 -0
  191. package/dist/insights/errors.cjs +34 -0
  192. package/dist/insights/errors.mjs +34 -1
  193. package/dist/insights/eventInput.cjs +14 -19
  194. package/dist/insights/eventInput.mjs +15 -20
  195. package/dist/insights/provider.cjs +47 -23
  196. package/dist/insights/provider.mjs +47 -24
  197. package/dist/insights/routes.cjs +79 -14
  198. package/dist/insights/routes.mjs +77 -14
  199. package/dist/node.d.cts +1 -1
  200. package/dist/node.d.mts +1 -1
  201. package/dist/package.cjs +1 -1
  202. package/dist/package.mjs +1 -1
  203. package/dist/plugins/api-keys/index.cjs +50 -0
  204. package/dist/plugins/api-keys/index.d.cts +85 -0
  205. package/dist/plugins/api-keys/index.d.mts +85 -0
  206. package/dist/plugins/api-keys/index.mjs +47 -0
  207. package/dist/plugins/api-keys/model.cjs +58 -0
  208. package/dist/plugins/api-keys/model.d.cts +8 -0
  209. package/dist/plugins/api-keys/model.d.mts +8 -0
  210. package/dist/plugins/api-keys/model.mjs +58 -0
  211. package/dist/plugins/api-keys/schema.cjs +38 -0
  212. package/dist/plugins/api-keys/schema.d.cts +44 -0
  213. package/dist/plugins/api-keys/schema.d.mts +44 -0
  214. package/dist/plugins/api-keys/schema.mjs +39 -0
  215. package/dist/plugins/builtIn.cjs +7 -0
  216. package/dist/plugins/builtIn.mjs +6 -0
  217. package/dist/plugins/definePlugin.cjs +5 -0
  218. package/dist/plugins/definePlugin.d.cts +73 -0
  219. package/dist/plugins/definePlugin.d.mts +73 -0
  220. package/dist/plugins/definePlugin.mjs +5 -0
  221. package/dist/plugins/index.cjs +17 -0
  222. package/dist/plugins/index.d.cts +9 -0
  223. package/dist/plugins/index.d.mts +9 -0
  224. package/dist/plugins/index.mjs +7 -0
  225. package/dist/plugins/insights/index.cjs +48 -0
  226. package/dist/plugins/insights/index.d.cts +295 -0
  227. package/dist/plugins/insights/index.d.mts +295 -0
  228. package/dist/plugins/insights/index.mjs +44 -0
  229. package/dist/plugins/insights/model.cjs +17 -0
  230. package/dist/plugins/insights/model.d.cts +10 -0
  231. package/dist/plugins/insights/model.d.mts +10 -0
  232. package/dist/plugins/insights/model.mjs +17 -0
  233. package/dist/plugins/insights/reads.cjs +471 -0
  234. package/dist/plugins/insights/reads.mjs +466 -0
  235. package/dist/plugins/insights/recordEvent.cjs +135 -0
  236. package/dist/plugins/insights/recordEvent.d.cts +13 -0
  237. package/dist/plugins/insights/recordEvent.d.mts +13 -0
  238. package/dist/plugins/insights/recordEvent.mjs +132 -0
  239. package/dist/plugins/insights/schema.cjs +347 -0
  240. package/dist/plugins/insights/schema.d.cts +258 -0
  241. package/dist/plugins/insights/schema.d.mts +258 -0
  242. package/dist/plugins/insights/schema.mjs +344 -0
  243. package/dist/types/index.d.cts +2 -28
  244. package/dist/types/index.d.mts +2 -28
  245. package/package.json +28 -5
  246. package/src/adapters/drizzle.conformance.integration.spec.ts +34 -0
  247. package/src/adapters/drizzle.readBudgets.integration.spec.ts +41 -0
  248. package/src/adapters/drizzle.spec.ts +270 -399
  249. package/src/adapters/drizzle.ts +48 -140
  250. package/src/adapters/drizzleExecutor.ts +166 -0
  251. package/src/adapters/kysely.conformance.integration.spec.ts +36 -0
  252. package/src/adapters/kysely.readBudgets.integration.spec.ts +42 -0
  253. package/src/adapters/kysely.spec.ts +204 -171
  254. package/src/adapters/kysely.ts +32 -93
  255. package/src/adapters/kyselyExecutor.ts +53 -0
  256. package/src/adapters/mongodb.integration.spec.ts +143 -446
  257. package/src/adapters/mongodb.readBudgets.integration.spec.ts +61 -0
  258. package/src/adapters/mongodb.ts +36 -123
  259. package/src/adapters/mongodbAdapter.ts +293 -0
  260. package/src/adapters/prisma.conformance.integration.spec.ts +36 -0
  261. package/src/adapters/prisma.integration.spec.ts +138 -0
  262. package/src/adapters/prisma.readBudgets.integration.spec.ts +40 -0
  263. package/src/adapters/prisma.spec.ts +216 -433
  264. package/src/adapters/prisma.ts +60 -524
  265. package/src/adapters/prismaExecutor.ts +107 -0
  266. package/src/adapters/prismaTestClients.ts +175 -0
  267. package/src/adapters/sqlProviders.ts +14 -0
  268. package/src/apiKeys.integration.spec.ts +19 -119
  269. package/src/apiKeys.spec.ts +39 -35
  270. package/src/apiKeys.ts +2 -8
  271. package/src/assembly/assemblePlugins.ts +269 -0
  272. package/src/assembly/assembly.spec.ts +325 -0
  273. package/src/assembly/assembly.types.spec.ts +155 -0
  274. package/src/assembly/builtInRoutes.spec.ts +213 -0
  275. package/src/assembly/databasePlugins.spec.ts +71 -0
  276. package/src/assembly/databasePlugins.ts +96 -0
  277. package/src/core/api.ts +139 -0
  278. package/src/core/baseCandidates.spec.ts +378 -0
  279. package/src/core/baseCandidates.ts +136 -0
  280. package/src/core/index.ts +44 -0
  281. package/src/core/operations.spec.ts +415 -0
  282. package/src/core/operations.ts +551 -0
  283. package/src/core/reads.spec.ts +300 -0
  284. package/src/core/reads.ts +417 -0
  285. package/src/core/releases.spec.ts +308 -0
  286. package/src/core/releases.ts +345 -0
  287. package/src/core/schema.ts +173 -0
  288. package/src/core/writes.ts +160 -0
  289. package/src/createHotUpdaterCore.ts +191 -181
  290. package/src/database/cursor.ts +65 -0
  291. package/src/database/database.ts +335 -0
  292. package/src/database/database.types.spec.ts +135 -0
  293. package/src/database/definitions.ts +72 -0
  294. package/src/database/engine.ts +62 -0
  295. package/src/database/engineAggregates.spec.ts +539 -0
  296. package/src/database/engineAggregates.ts +193 -0
  297. package/src/database/engineReads.spec.ts +219 -0
  298. package/src/database/engineReads.ts +302 -0
  299. package/src/database/engineTransaction.spec.ts +710 -0
  300. package/src/database/engineTransaction.ts +588 -0
  301. package/src/database/errors.ts +30 -0
  302. package/src/database/fence.spec.ts +223 -0
  303. package/src/database/fence.ts +171 -0
  304. package/src/database/index.ts +154 -0
  305. package/src/database/kv/kvAdapter.conformance.integration.spec.ts +17 -0
  306. package/src/database/kv/kvAdapter.readBudgets.integration.spec.ts +17 -0
  307. package/src/database/kv/kvAdapter.spec.ts +468 -0
  308. package/src/database/kv/kvAdapter.ts +450 -0
  309. package/src/database/kv/kvTestStore.ts +91 -0
  310. package/src/database/memory.readBudgets.integration.spec.ts +13 -0
  311. package/src/database/resolveSchema.spec.ts +230 -0
  312. package/src/database/resolveSchema.ts +372 -0
  313. package/src/database/schema.ts +169 -0
  314. package/src/database/schema.types.spec.ts +94 -0
  315. package/src/database/sql/docker-compose.yml +36 -0
  316. package/src/database/sql/sqlAdapter.integration.spec.ts +148 -0
  317. package/src/database/sql/sqlAdapter.readBudgets.integration.spec.ts +109 -0
  318. package/src/database/sql/sqlAdapter.spec.ts +255 -0
  319. package/src/database/sql/sqlAdapter.ts +532 -0
  320. package/src/database/sql/sqlSchema.ts +205 -0
  321. package/src/database/sql/sqlTestExecutors.ts +183 -0
  322. package/src/databaseTestSuite.spec.ts +39 -0
  323. package/src/db/builtInDatabase.ts +149 -0
  324. package/src/db/bundleRows.spec.ts +3 -3
  325. package/src/db/createBundleDiff.spec.ts +43 -29
  326. package/src/db/createBundleDiff.ts +13 -7
  327. package/src/db/engineDrizzleSchema.ts +72 -0
  328. package/src/db/engineMigrator.ts +105 -0
  329. package/src/db/enginePrismaSchema.ts +147 -0
  330. package/src/db/engineSql.spec.ts +129 -0
  331. package/src/db/engineSql.ts +48 -0
  332. package/src/db/engineSqlMigrator.ts +116 -0
  333. package/src/db/fixedMigratorShared.ts +1 -20
  334. package/src/db/index.spec.ts +116 -829
  335. package/src/db/index.ts +43 -14
  336. package/src/db/pluginTables.spec.ts +218 -0
  337. package/src/db/releaseCatalog.ts +48 -90
  338. package/src/db/schemaSettings.ts +104 -0
  339. package/src/db/settingsMigrator.spec.ts +65 -0
  340. package/src/db/settingsMigrator.ts +152 -0
  341. package/src/db/types.ts +25 -171
  342. package/src/db/updateArtifacts.spec.ts +170 -294
  343. package/src/db/updateArtifacts.ts +74 -142
  344. package/src/db/updateCheck.bench.ts +47 -0
  345. package/src/handler-standalone.integration.spec.ts +204 -410
  346. package/src/handler.spec.ts +134 -51
  347. package/src/handler.testFixtures.ts +14 -19
  348. package/src/handler.ts +163 -75
  349. package/src/handlerAdminRoutes.spec.ts +183 -0
  350. package/src/handlerAdminRoutes.ts +536 -0
  351. package/src/handlerAuth.integration.spec.ts +3 -3
  352. package/src/handlerManagement.spec.ts +136 -196
  353. package/src/handlerReleaseCatalogRoutes.ts +15 -17
  354. package/src/handlerTypes.ts +3 -80
  355. package/src/handlerVersionRoutes.ts +20 -7
  356. package/src/index.ts +5 -12
  357. package/src/insights/domain.ts +12 -0
  358. package/src/insights/errors.spec.ts +48 -0
  359. package/src/insights/errors.ts +51 -0
  360. package/src/insights/eventInput.ts +27 -24
  361. package/src/insights/insights.integration.spec.ts +228 -78
  362. package/src/insights/provider.spec.ts +203 -25
  363. package/src/insights/provider.ts +88 -32
  364. package/src/insights/routes.ts +95 -20
  365. package/src/lintRules.spec.ts +76 -0
  366. package/src/plugins/api-keys/apiKeysPlugin.spec.ts +172 -0
  367. package/src/plugins/api-keys/index.ts +66 -0
  368. package/src/plugins/api-keys/model.ts +69 -0
  369. package/src/plugins/api-keys/schema.ts +22 -0
  370. package/src/plugins/builtIn.ts +5 -0
  371. package/src/plugins/definePlugin.ts +100 -0
  372. package/src/plugins/index.ts +55 -0
  373. package/src/plugins/insights/index.ts +86 -0
  374. package/src/plugins/insights/insightsRollout.integration.spec.ts +187 -0
  375. package/src/plugins/insights/model.spec.ts +66 -0
  376. package/src/plugins/insights/model.ts +19 -0
  377. package/src/plugins/insights/reads.spec.ts +725 -0
  378. package/src/plugins/insights/reads.ts +707 -0
  379. package/src/plugins/insights/recordEvent.spec.ts +443 -0
  380. package/src/plugins/insights/recordEvent.ts +238 -0
  381. package/src/plugins/insights/schema.ts +229 -0
  382. package/src/plugins/pluginTestHarness.spec.ts +56 -0
  383. package/src/readBudgets.testFixtures.ts +15 -0
  384. package/src/releaseCatalogRoutes.integration.spec.ts +47 -92
  385. package/src/runtime.spec.ts +91 -77
  386. package/src/runtime.testFixtures.ts +28 -44
  387. package/src/runtimeBundles.integration.spec.ts +112 -0
  388. package/src/testUtilsMutation.integration.spec.ts +215 -0
  389. package/src/testUtilsPackage.integration.spec.ts +176 -0
  390. package/src/types/index.ts +0 -32
  391. package/dist/adapters/databaseConstraintErrors.cjs +0 -22
  392. package/dist/adapters/databaseConstraintErrors.mjs +0 -21
  393. package/dist/adapters/databasePluginUtils.cjs +0 -130
  394. package/dist/adapters/databasePluginUtils.mjs +0 -118
  395. package/dist/adapters/drizzleCrud.cjs +0 -340
  396. package/dist/adapters/drizzleCrud.mjs +0 -337
  397. package/dist/adapters/drizzleLazyDB.cjs +0 -103
  398. package/dist/adapters/drizzleLazyDB.mjs +0 -103
  399. package/dist/adapters/drizzleQuery.cjs +0 -69
  400. package/dist/adapters/drizzleQuery.mjs +0 -69
  401. package/dist/adapters/kyselyCrud.cjs +0 -293
  402. package/dist/adapters/kyselyCrud.mjs +0 -292
  403. package/dist/adapters/kyselyQuery.cjs +0 -56
  404. package/dist/adapters/kyselyQuery.mjs +0 -56
  405. package/dist/adapters/mongodbCollections.cjs +0 -38
  406. package/dist/adapters/mongodbCollections.mjs +0 -32
  407. package/dist/adapters/mongodbQuery.cjs +0 -90
  408. package/dist/adapters/mongodbQuery.mjs +0 -83
  409. package/dist/adapters/mongodbReads.cjs +0 -206
  410. package/dist/adapters/mongodbReads.mjs +0 -206
  411. package/dist/adapters/mongodbWrites.cjs +0 -133
  412. package/dist/adapters/mongodbWrites.mjs +0 -133
  413. package/dist/adapters/prismaInsights.cjs +0 -99
  414. package/dist/adapters/prismaInsights.mjs +0 -97
  415. package/dist/adapters/prismaQuery.cjs +0 -57
  416. package/dist/adapters/prismaQuery.mjs +0 -56
  417. package/dist/adapters/prismaRows.cjs +0 -197
  418. package/dist/adapters/prismaRows.mjs +0 -188
  419. package/dist/db/databasePluginCore.cjs +0 -137
  420. package/dist/db/databasePluginCore.mjs +0 -137
  421. package/dist/db/fixedMigrator.cjs +0 -79
  422. package/dist/db/fixedMigrator.mjs +0 -78
  423. package/dist/db/fixedMigratorMongo.cjs +0 -321
  424. package/dist/db/fixedMigratorMongo.mjs +0 -321
  425. package/dist/db/mongoMigrationExecution.cjs +0 -11
  426. package/dist/db/mongoMigrationExecution.mjs +0 -11
  427. package/dist/db/schema/insightsCollation.cjs +0 -14
  428. package/dist/db/schema/insightsCollation.mjs +0 -14
  429. package/dist/db/schema/mongodb.cjs +0 -25
  430. package/dist/db/schema/mongodb.mjs +0 -25
  431. package/dist/db/schema/registry.cjs +0 -21
  432. package/dist/db/schema/registry.mjs +0 -17
  433. package/dist/db/schema/sql.cjs +0 -105
  434. package/dist/db/schema/sql.mjs +0 -97
  435. package/dist/db/schema/sqlOperations.cjs +0 -27
  436. package/dist/db/schema/sqlOperations.mjs +0 -26
  437. package/dist/db/schemaGenerators.cjs +0 -276
  438. package/dist/db/schemaGenerators.mjs +0 -274
  439. package/dist/db/schemaReadiness.cjs +0 -26
  440. package/dist/db/schemaReadiness.d.cts +0 -9
  441. package/dist/db/schemaReadiness.d.mts +0 -9
  442. package/dist/db/schemaReadiness.mjs +0 -25
  443. package/dist/db/sqlMigrationExecution.cjs +0 -67
  444. package/dist/db/sqlMigrationExecution.mjs +0 -67
  445. package/dist/handlerBundleRoutes.cjs +0 -155
  446. package/dist/handlerBundleRoutes.mjs +0 -155
  447. package/dist/handlerReleaseManagementRoutes.cjs +0 -124
  448. package/dist/handlerReleaseManagementRoutes.mjs +0 -124
  449. package/dist/schema/dsl.cjs +0 -103
  450. package/dist/schema/dsl.mjs +0 -87
  451. package/dist/schema/index.cjs +0 -20
  452. package/dist/schema/index.mjs +0 -7
  453. package/dist/schema/settings.cjs +0 -9
  454. package/dist/schema/settings.mjs +0 -9
  455. package/dist/schema/types.cjs +0 -8
  456. package/dist/schema/types.mjs +0 -6
  457. package/dist/schema/v1_0_0.cjs +0 -393
  458. package/dist/schema/v1_0_0.mjs +0 -385
  459. package/src/adapters/databaseConstraintErrors.ts +0 -25
  460. package/src/adapters/databasePluginTestDatabase.ts +0 -116
  461. package/src/adapters/databasePluginUtils.spec.ts +0 -29
  462. package/src/adapters/databasePluginUtils.ts +0 -238
  463. package/src/adapters/drizzleCrud.ts +0 -610
  464. package/src/adapters/drizzleLazyDB.ts +0 -284
  465. package/src/adapters/drizzleQuery.ts +0 -164
  466. package/src/adapters/kyselyCrud.ts +0 -696
  467. package/src/adapters/kyselyInsights.spec.ts +0 -168
  468. package/src/adapters/kyselyQuery.ts +0 -128
  469. package/src/adapters/mongodb.spec.ts +0 -230
  470. package/src/adapters/mongodbCollections.ts +0 -78
  471. package/src/adapters/mongodbQuery.ts +0 -245
  472. package/src/adapters/mongodbReads.ts +0 -387
  473. package/src/adapters/mongodbRows.spec.ts +0 -64
  474. package/src/adapters/mongodbRows.ts +0 -118
  475. package/src/adapters/mongodbTestClient.ts +0 -443
  476. package/src/adapters/mongodbTestFilter.ts +0 -170
  477. package/src/adapters/mongodbWrites.ts +0 -261
  478. package/src/adapters/prismaInsights.ts +0 -190
  479. package/src/adapters/prismaQuery.ts +0 -129
  480. package/src/adapters/prismaRows.spec.ts +0 -98
  481. package/src/adapters/prismaRows.ts +0 -308
  482. package/src/adapters/prismaTestClient.ts +0 -478
  483. package/src/calculatePagination.ts +0 -34
  484. package/src/db/databasePluginCore.spec.ts +0 -62
  485. package/src/db/databasePluginCore.testFixtures.ts +0 -76
  486. package/src/db/databasePluginCore.ts +0 -185
  487. package/src/db/databasePluginUpdateCheck.bench.ts +0 -117
  488. package/src/db/fixedMigrator.spec.ts +0 -294
  489. package/src/db/fixedMigrator.ts +0 -147
  490. package/src/db/fixedMigratorMongo.spec.ts +0 -253
  491. package/src/db/fixedMigratorMongo.ts +0 -425
  492. package/src/db/hotUpdaterSchema.ts +0 -5
  493. package/src/db/mongoMigrationExecution.ts +0 -23
  494. package/src/db/schema/definitions.ts +0 -1
  495. package/src/db/schema/insightsCollation.ts +0 -21
  496. package/src/db/schema/mongodb.ts +0 -40
  497. package/src/db/schema/registry.ts +0 -55
  498. package/src/db/schema/sql.ts +0 -244
  499. package/src/db/schema/sqlOperations.ts +0 -63
  500. package/src/db/schema/types.ts +0 -1
  501. package/src/db/schemaGenerators.ts +0 -495
  502. package/src/db/schemaReadiness.ts +0 -34
  503. package/src/db/sqlMigrationExecution.spec.ts +0 -65
  504. package/src/db/sqlMigrationExecution.ts +0 -108
  505. package/src/db/types.spec.ts +0 -63
  506. package/src/handlerBundleRoutes.ts +0 -259
  507. package/src/handlerReleaseManagementRoutes.ts +0 -213
  508. package/src/schema/dsl-all-versions.spec.ts +0 -35
  509. package/src/schema/dsl.ts +0 -187
  510. package/src/schema/index.ts +0 -10
  511. package/src/schema/settings.ts +0 -15
  512. package/src/schema/types.ts +0 -79
  513. package/src/schema/v1_0_0.spec.ts +0 -220
  514. package/src/schema/v1_0_0.ts +0 -511
@@ -1,265 +1,46 @@
1
- import { getHotUpdaterSchemaVersion, hotUpdaterSchema } from "../db/schema/registry.mjs";
2
- import { generatePrismaSchema } from "../db/schemaGenerators.mjs";
3
- import { isChannelDeleteReferencedError, translateChannelDeleteError } from "./databaseConstraintErrors.mjs";
4
- import { hasNullOrderOverrides, sortRowsByOrder } from "./databasePluginUtils.mjs";
5
- import { PrismaAdapterError, getPrismaDelegate, parsePrismaApiKeyRow, parsePrismaBundleEventRow, parsePrismaBundleRow, parsePrismaChannelRow, parsePrismaPatchRow, parsePrismaReleaseCatalogRow, parsePrismaReleaseRow, parsePrismaRows } from "./prismaRows.mjs";
6
- import { queryPrismaLatestEvents, recordPrismaEventWithCte, updatePrismaEventHead } from "./prismaInsights.mjs";
7
- import { createPrismaOrderBy, createPrismaWhere } from "./prismaQuery.mjs";
8
- import { DatabasePluginInputError, createDatabasePlugin } from "@hot-updater/plugin-core";
9
- import { createDatabasePluginAdapter } from "@hot-updater/plugin-core/internal";
1
+ import { createSettingsMigrator } from "../db/settingsMigrator.mjs";
2
+ import { builtInSettings, builtInTarget, createEngineDatabase } from "../db/builtInDatabase.mjs";
3
+ import { createSqlAdapter } from "../database/sql/sqlAdapter.mjs";
4
+ import { checkSqlProvider } from "./sqlProviders.mjs";
5
+ import { generatePrismaEngineSchema, prismaCollationStatements } from "../db/enginePrismaSchema.mjs";
6
+ import { prismaExecutor } from "./prismaExecutor.mjs";
10
7
  //#region src/adapters/prisma.ts
11
- const hasCallbackTransaction = (client) => "$transaction" in client && typeof client.$transaction === "function";
12
- const runPrismaTransaction = (client, isolationLevel, callback, retryUniqueConflict = false) => {
13
- const execute = () => isolationLevel === "serializable" ? client.$transaction(callback, { isolationLevel: "Serializable" }) : client.$transaction(callback);
14
- if (isolationLevel === "default") return execute();
15
- return (async () => {
16
- for (let attempt = 0;; attempt += 1) try {
17
- return await execute();
18
- } catch (error) {
19
- if (attempt >= 2 || typeof error !== "object" || error === null || !("code" in error) || error.code !== "P2034" && !(error.code === "P2010" && "meta" in error && typeof error.meta === "object" && error.meta !== null && "code" in error.meta && error.meta.code === "40001") && !(retryUniqueConflict && error.code === "P2002")) throw error;
20
- }
21
- })();
22
- };
23
- const assertPrismaProvider = (provider) => {
24
- if (provider === "mongodb") throw new PrismaAdapterError("Prisma adapter does not support MongoDB; use mongodbAdapter instead");
25
- };
26
- const findMany = async (client, input, provider) => {
27
- if (input.distinctOn !== void 0) throw new DatabasePluginInputError("invalid-operation");
28
- const rawOrderBy = input.orderBy;
29
- const orderBy = createPrismaOrderBy(rawOrderBy);
30
- const rows = rawOrderBy !== void 0 && hasNullOrderOverrides(rawOrderBy) ? sortRowsByOrder(await getPrismaDelegate(client, input.model).findMany({ where: createPrismaWhere(input.where, provider) }), rawOrderBy).slice(input.offset, input.offset + input.limit) : await getPrismaDelegate(client, input.model).findMany({
31
- where: createPrismaWhere(input.where, provider),
32
- ...orderBy ? { orderBy } : {},
33
- skip: input.offset,
34
- take: input.limit
35
- });
36
- switch (input.model) {
37
- case "bundles": return parsePrismaRows(rows, parsePrismaBundleRow);
38
- case "bundle_patches": return parsePrismaRows(rows, parsePrismaPatchRow);
39
- case "bundle_events": return parsePrismaRows(rows, parsePrismaBundleEventRow);
40
- case "channels": return parsePrismaRows(rows, parsePrismaChannelRow);
41
- case "api_keys": return parsePrismaRows(rows, parsePrismaApiKeyRow);
42
- case "releases": return parsePrismaRows(rows, parsePrismaReleaseRow);
43
- case "release_catalogs": return parsePrismaRows(rows, parsePrismaReleaseCatalogRow);
44
- }
45
- };
46
- const assertPatchReferences = async (client, bundleId, baseBundleId) => {
47
- const ids = Array.from(/* @__PURE__ */ new Set([bundleId, baseBundleId]));
48
- if (await getPrismaDelegate(client, "bundles").count({ where: { id: { in: ids } } }) !== ids.length) throw new PrismaAdapterError("patch references a missing bundle");
49
- };
50
- const createCrudImplementation = (client, provider, relationMode) => ({
51
- deleteChannel: async ({ id }) => {
52
- const channels = getPrismaDelegate(client, "channels");
53
- if (await channels.findFirst({ where: { id } }) === null) return {
54
- deleted: false,
55
- reason: "not_found"
56
- };
57
- if (await getPrismaDelegate(client, "releases").count({ where: { channel_id: id } }) > 0) return {
58
- deleted: false,
59
- reason: "not_empty"
60
- };
61
- try {
62
- await channels.deleteMany({ where: { id } });
63
- } catch (error) {
64
- if (isChannelDeleteReferencedError(error)) return {
65
- deleted: false,
66
- reason: "not_empty"
8
+ /**
9
+ * Hot Updater's database on a Prisma client: the storage engine through the
10
+ * shared SQL core, fenced by the schema settings. `db generate` writes the
11
+ * models Prisma applies; `db migrate` then sets the collations Prisma cannot
12
+ * declare and writes the settings rows the fence checks.
13
+ */
14
+ const prismaAdapter = (config) => {
15
+ const provider = checkSqlProvider("prismaAdapter", config.provider);
16
+ const executor = prismaExecutor(config.prisma, provider);
17
+ return {
18
+ ...createEngineDatabase({
19
+ name: "prisma",
20
+ adapter: createSqlAdapter({ executor })
21
+ }),
22
+ provider,
23
+ generateSchema: ((version, _name, { schema } = builtInTarget) => {
24
+ if (version !== "latest" && version !== builtInSettings["schema.core"]) throw new Error(`Invalid version ${version}`);
25
+ return {
26
+ code: generatePrismaEngineSchema(provider, schema),
27
+ path: "prisma/schema.prisma"
67
28
  };
68
- throw error;
69
- }
70
- return { deleted: true };
71
- },
72
- insertChannel: async (input) => {
73
- const delegate = getPrismaDelegate(client, "channels");
74
- const existing = await delegate.findFirst({ where: { name: input.row.name } });
75
- if (existing !== null) return {
76
- row: parsePrismaChannelRow(existing),
77
- inserted: false
78
- };
79
- const row = parsePrismaChannelRow(await delegate.upsert({
80
- where: { name: input.row.name },
81
- create: input.row,
82
- update: {}
83
- }));
84
- return {
85
- row,
86
- inserted: row.id === input.row.id
87
- };
88
- },
89
- create: async (input) => {
90
- if (input.model === "bundle_patches") await assertPatchReferences(client, input.data.bundle_id, input.data.base_bundle_id);
91
- const delegate = getPrismaDelegate(client, input.model);
92
- let row;
93
- if (input.onConflict === "ignore") {
94
- const where = input.model === "channels" ? { name: input.data.name } : { hash: input.data.hash };
95
- row = await delegate.upsert({
96
- where,
97
- create: input.data,
98
- update: {}
99
- });
100
- } else row = await delegate.create({ data: input.data });
101
- switch (input.model) {
102
- case "bundles": return parsePrismaBundleRow(row);
103
- case "bundle_patches": return parsePrismaPatchRow(row);
104
- case "bundle_events": return parsePrismaBundleEventRow(row);
105
- case "channels": return parsePrismaChannelRow(row);
106
- case "api_keys": return parsePrismaApiKeyRow(row);
107
- case "releases": return parsePrismaReleaseRow(row);
108
- case "release_catalogs": return parsePrismaReleaseCatalogRow(row);
109
- }
110
- },
111
- update: async (input) => {
112
- const id = input.where[0]?.value;
113
- if (typeof id !== "string") throw new PrismaAdapterError(`${input.model} update requires a string id`);
114
- if (input.model === "api_keys") {
115
- const delegate = getPrismaDelegate(client, "api_keys");
116
- if (await delegate.findFirst({ where: { id } }) === null) return null;
117
- await delegate.update({
118
- where: { id },
119
- data: input.update
120
- });
121
- const stored = await delegate.findFirst({ where: { id } });
122
- return stored === null ? null : parsePrismaApiKeyRow(stored);
123
- }
124
- if (input.model === "releases") {
125
- const delegate = getPrismaDelegate(client, "releases");
126
- if (await delegate.findFirst({ where: { id } }) === null) return null;
127
- await delegate.update({
128
- where: { id },
129
- data: input.update
29
+ }),
30
+ createMigrator: ({ schema, settings } = builtInTarget) => {
31
+ const collations = prismaCollationStatements(provider, schema);
32
+ return createSettingsMigrator({
33
+ adapterName: "prisma",
34
+ executor,
35
+ settings,
36
+ applyTables: "`prisma db push` (or `prisma migrate`)",
37
+ ...collations.length === 0 ? {} : { fixups: {
38
+ description: "Set the collations Prisma cannot declare, so strings compare by their bytes",
39
+ statements: collations
40
+ } }
130
41
  });
131
- const stored = await delegate.findFirst({ where: { id } });
132
- return stored === null ? null : parsePrismaReleaseRow(stored);
133
42
  }
134
- if (input.model === "release_catalogs") {
135
- const delegate = getPrismaDelegate(client, "release_catalogs");
136
- if (await delegate.findFirst({ where: { scope_key: id } }) === null) return null;
137
- await delegate.update({
138
- where: { scope_key: id },
139
- data: input.update
140
- });
141
- const stored = await delegate.findFirst({ where: { scope_key: id } });
142
- return stored === null ? null : parsePrismaReleaseCatalogRow(stored);
143
- }
144
- const delegate = getPrismaDelegate(client, "bundles");
145
- if (delegate.updateMany === void 0) throw new PrismaAdapterError("model delegate \"bundles\" requires updateMany");
146
- if (await delegate.findFirst({ where: { id } }) === null) return null;
147
- await delegate.updateMany({
148
- where: { id },
149
- data: input.update
150
- });
151
- const stored = await delegate.findFirst({ where: { id } });
152
- if (stored === null) return null;
153
- return parsePrismaBundleRow(stored);
154
- },
155
- delete: async (input) => {
156
- if (input.model === "bundles" && relationMode === "prisma") {
157
- const rows = await getPrismaDelegate(client, "bundles").findMany({ where: createPrismaWhere(input.where, provider) });
158
- const ids = parsePrismaRows(rows, parsePrismaBundleRow).map(({ id }) => id);
159
- if (ids.length === 0) return;
160
- await getPrismaDelegate(client, "bundle_patches").deleteMany({ where: { OR: [{ bundle_id: { in: ids } }, { base_bundle_id: { in: ids } }] } });
161
- }
162
- try {
163
- await getPrismaDelegate(client, input.model).deleteMany({ where: createPrismaWhere(input.where, provider) });
164
- } catch (error) {
165
- if (input.model === "channels") translateChannelDeleteError(error);
166
- throw error;
167
- }
168
- },
169
- count: async (input) => {
170
- if (input.distinct !== void 0) throw new DatabasePluginInputError("invalid-operation");
171
- return getPrismaDelegate(client, input.model).count({ where: createPrismaWhere(input.where, provider) });
172
- },
173
- findOne: async (input) => {
174
- const row = await getPrismaDelegate(client, input.model).findFirst({ where: createPrismaWhere(input.where, provider) });
175
- if (row === null) return null;
176
- switch (input.model) {
177
- case "bundles": return parsePrismaBundleRow(row);
178
- case "bundle_patches": return parsePrismaPatchRow(row);
179
- case "channels": return parsePrismaChannelRow(row);
180
- case "api_keys": return parsePrismaApiKeyRow(row);
181
- case "releases": return parsePrismaReleaseRow(row);
182
- case "release_catalogs": return parsePrismaReleaseCatalogRow(row);
183
- }
184
- },
185
- findMany: (input) => findMany(client, input, provider)
186
- });
187
- const createPrismaImplementation = (client, relationMode, provider) => {
188
- const crud = createCrudImplementation(client, provider, relationMode);
189
- const implementation = {
190
- ...crud,
191
- async recordInsights({ event }) {
192
- if (!hasCallbackTransaction(client)) return recordPrismaEventWithCte(client, provider, event);
193
- const events = getPrismaDelegate(client, "bundle_events");
194
- try {
195
- await runPrismaTransaction(client, provider === "cockroachdb" ? "serializable" : "default", async (transaction) => {
196
- await getPrismaDelegate(transaction, "bundle_events").create({ data: event });
197
- await updatePrismaEventHead(transaction, provider, event);
198
- });
199
- } catch (error) {
200
- if (typeof error !== "object" || error === null || !("code" in error) || error.code !== "P2002") throw error;
201
- if (await events.findFirst({ where: { id: event.id } }) === null) throw error;
202
- }
203
- },
204
- async findLatestInsightsEvents(input) {
205
- const rows = await queryPrismaLatestEvents(client, provider, input);
206
- if (typeof rows === "number") throw new PrismaAdapterError("invalid latest-event rows");
207
- return rows;
208
- },
209
- async countLatestInsightsEvents(input) {
210
- const count = await queryPrismaLatestEvents(client, provider, input);
211
- if (typeof count !== "number") throw new PrismaAdapterError("invalid latest-event count");
212
- return count;
213
- },
214
- deleteChannel: (input) => {
215
- if (!hasCallbackTransaction(client)) throw new PrismaAdapterError("channel deletion requires callback transactions");
216
- return runPrismaTransaction(client, "serializable", (transactionClient) => createCrudImplementation(transactionClient, provider, relationMode).deleteChannel(input));
217
- },
218
- delete: (input) => {
219
- if (input.model !== "bundles" || relationMode === "foreign-keys") return crud.delete(input);
220
- if (!hasCallbackTransaction(client)) throw new PrismaAdapterError("relation mode \"prisma\" requires callback transactions");
221
- return runPrismaTransaction(client, "serializable", (transactionClient) => createCrudImplementation(transactionClient, provider, relationMode).delete(input));
222
- }
223
- };
224
- if (relationMode === "prisma" && !hasCallbackTransaction(client)) throw new PrismaAdapterError("relation mode \"prisma\" requires callback transactions");
225
- if (!hasCallbackTransaction(client)) return implementation;
226
- if (relationMode === "prisma") implementation.create = (input) => runPrismaTransaction(client, "serializable", (transactionClient) => createCrudImplementation(transactionClient, provider, relationMode).create(input));
227
- implementation.update = (input) => runPrismaTransaction(client, relationMode === "prisma" ? "serializable" : "default", (transactionClient) => createCrudImplementation(transactionClient, provider, relationMode).update(input));
228
- return {
229
- ...implementation,
230
- transaction: (callback) => runPrismaTransaction(client, "serializable", async (transactionClient) => {
231
- return callback(createCrudImplementation(transactionClient, provider, relationMode));
232
- })
233
- };
234
- };
235
- const prismaAdapter = (config) => {
236
- assertPrismaProvider(config.provider);
237
- const adapter = createDatabasePluginAdapter("prisma", createPrismaImplementation(config.prisma, config.relationMode ?? "foreign-keys", config.provider));
238
- const unsupportedMssqlInsights = async () => {
239
- throw new PrismaAdapterError("SQL Server Insights is unsupported: string keys pad trailing spaces and do not provide the required exact UTF-8 identity ordering");
240
43
  };
241
- const insights = config.provider === "mssql" ? {
242
- recordEvent: unsupportedMssqlInsights,
243
- listEvents: unsupportedMssqlInsights,
244
- findLatestEvents: unsupportedMssqlInsights,
245
- countLatestEvents: unsupportedMssqlInsights,
246
- countEvents: unsupportedMssqlInsights
247
- } : adapter.models.insights;
248
- return Object.assign(createDatabasePlugin({
249
- name: "prisma",
250
- models: {
251
- ...adapter.models,
252
- insights
253
- },
254
- commit: adapter.commit
255
- }), {
256
- adapterName: "prisma",
257
- provider: config.provider,
258
- generateSchema: ((version) => ({
259
- code: generatePrismaSchema(config.provider, version === "latest" ? hotUpdaterSchema : getHotUpdaterSchemaVersion(version)),
260
- path: "./prisma/schema/hot_updater.prisma"
261
- }))
262
- });
263
44
  };
264
45
  //#endregion
265
46
  export { prismaAdapter };
@@ -0,0 +1,64 @@
1
+ const require_fence = require("../database/fence.cjs");
2
+ const require_sqlSchema = require("../database/sql/sqlSchema.cjs");
3
+ //#region src/adapters/prismaExecutor.ts
4
+ /**
5
+ * Prisma reports a raw query's database error as P2010 with the database's
6
+ * code in `meta.code`, and a failed transaction as P2034. The error thrown on
7
+ * carries that code, as the SQL core classifies it, with Prisma's as `cause`.
8
+ */
9
+ const withDatabaseCode = (dialect, error) => {
10
+ const { code, meta } = error ?? {};
11
+ const database = code === "P2034" ? "40001" : meta?.code === void 0 ? void 0 : String(meta.code);
12
+ if (database === void 0) return error;
13
+ return Object.assign(new Error(String(meta?.message ?? error.message), { cause: error }), { code: dialect === "sqlite" ? `SQLITE:${database}` : database });
14
+ };
15
+ /** MySQL's ASCII keys are `VarBinary` in Prisma's schema, and read back as bytes. */
16
+ const decoder = new TextDecoder();
17
+ const decodeRow = (row) => {
18
+ for (const [column, value] of Object.entries(row)) if (value instanceof Uint8Array) row[column] = decoder.decode(value);
19
+ return row;
20
+ };
21
+ const over = (dialect, client) => ({ async execute({ sql, params }) {
22
+ try {
23
+ if (/^\s*SELECT\b/iu.test(sql)) return {
24
+ rows: (await client.$queryRawUnsafe(sql, ...params)).map(decodeRow),
25
+ changes: 0
26
+ };
27
+ return {
28
+ rows: [],
29
+ changes: Number(await client.$executeRawUnsafe(sql, ...params))
30
+ };
31
+ } catch (error) {
32
+ throw withDatabaseCode(dialect, error);
33
+ }
34
+ } });
35
+ /** Taking the write lock first makes a SQLite transaction behave as BEGIN IMMEDIATE. */
36
+ const writeLock = (dialect) => `UPDATE ${require_sqlSchema.quoteSql(dialect, require_fence.SETTINGS_TABLE.name)} SET ${require_sqlSchema.quoteSql(dialect, "_v")} = ${require_sqlSchema.quoteSql(dialect, "_v")} WHERE 0 = 1`;
37
+ /**
38
+ * The SQL core's executor over a Prisma client, through raw queries and
39
+ * interactive transactions. A SQLite transaction takes the write lock with
40
+ * its first statement, as BEGIN IMMEDIATE would.
41
+ */
42
+ const prismaExecutor = (client, dialect) => ({
43
+ dialect,
44
+ ...over(dialect, client),
45
+ async transaction(fn) {
46
+ try {
47
+ return await client.$transaction(async (tx) => {
48
+ const connection = over(dialect, tx);
49
+ if (dialect === "sqlite") await connection.execute({
50
+ sql: writeLock(dialect),
51
+ params: []
52
+ });
53
+ return fn(connection);
54
+ }, {
55
+ maxWait: 1e4,
56
+ timeout: 3e4
57
+ });
58
+ } catch (error) {
59
+ throw withDatabaseCode(dialect, error);
60
+ }
61
+ }
62
+ });
63
+ //#endregion
64
+ exports.prismaExecutor = prismaExecutor;
@@ -0,0 +1,64 @@
1
+ import { SETTINGS_TABLE } from "../database/fence.mjs";
2
+ import { quoteSql } from "../database/sql/sqlSchema.mjs";
3
+ //#region src/adapters/prismaExecutor.ts
4
+ /**
5
+ * Prisma reports a raw query's database error as P2010 with the database's
6
+ * code in `meta.code`, and a failed transaction as P2034. The error thrown on
7
+ * carries that code, as the SQL core classifies it, with Prisma's as `cause`.
8
+ */
9
+ const withDatabaseCode = (dialect, error) => {
10
+ const { code, meta } = error ?? {};
11
+ const database = code === "P2034" ? "40001" : meta?.code === void 0 ? void 0 : String(meta.code);
12
+ if (database === void 0) return error;
13
+ return Object.assign(new Error(String(meta?.message ?? error.message), { cause: error }), { code: dialect === "sqlite" ? `SQLITE:${database}` : database });
14
+ };
15
+ /** MySQL's ASCII keys are `VarBinary` in Prisma's schema, and read back as bytes. */
16
+ const decoder = new TextDecoder();
17
+ const decodeRow = (row) => {
18
+ for (const [column, value] of Object.entries(row)) if (value instanceof Uint8Array) row[column] = decoder.decode(value);
19
+ return row;
20
+ };
21
+ const over = (dialect, client) => ({ async execute({ sql, params }) {
22
+ try {
23
+ if (/^\s*SELECT\b/iu.test(sql)) return {
24
+ rows: (await client.$queryRawUnsafe(sql, ...params)).map(decodeRow),
25
+ changes: 0
26
+ };
27
+ return {
28
+ rows: [],
29
+ changes: Number(await client.$executeRawUnsafe(sql, ...params))
30
+ };
31
+ } catch (error) {
32
+ throw withDatabaseCode(dialect, error);
33
+ }
34
+ } });
35
+ /** Taking the write lock first makes a SQLite transaction behave as BEGIN IMMEDIATE. */
36
+ const writeLock = (dialect) => `UPDATE ${quoteSql(dialect, SETTINGS_TABLE.name)} SET ${quoteSql(dialect, "_v")} = ${quoteSql(dialect, "_v")} WHERE 0 = 1`;
37
+ /**
38
+ * The SQL core's executor over a Prisma client, through raw queries and
39
+ * interactive transactions. A SQLite transaction takes the write lock with
40
+ * its first statement, as BEGIN IMMEDIATE would.
41
+ */
42
+ const prismaExecutor = (client, dialect) => ({
43
+ dialect,
44
+ ...over(dialect, client),
45
+ async transaction(fn) {
46
+ try {
47
+ return await client.$transaction(async (tx) => {
48
+ const connection = over(dialect, tx);
49
+ if (dialect === "sqlite") await connection.execute({
50
+ sql: writeLock(dialect),
51
+ params: []
52
+ });
53
+ return fn(connection);
54
+ }, {
55
+ maxWait: 1e4,
56
+ timeout: 3e4
57
+ });
58
+ } catch (error) {
59
+ throw withDatabaseCode(dialect, error);
60
+ }
61
+ }
62
+ });
63
+ //#endregion
64
+ export { prismaExecutor };
@@ -0,0 +1,9 @@
1
+ const require_types = require("../db/types.cjs");
2
+ //#region src/adapters/sqlProviders.ts
3
+ /** The provider an adapter was given, when Hot Updater's SQL core runs on it. */
4
+ const checkSqlProvider = (adapter, provider) => {
5
+ if (!require_types.sqlProviders.includes(provider)) throw new Error(`${adapter}: provider "${String(provider)}" is not supported. Use ${require_types.sqlProviders.map((name) => `"${name}"`).join(", ")}; CockroachDB and SQL Server were dropped in 1.0.`);
6
+ return provider;
7
+ };
8
+ //#endregion
9
+ exports.checkSqlProvider = checkSqlProvider;
@@ -0,0 +1,9 @@
1
+ import { sqlProviders } from "../db/types.mjs";
2
+ //#region src/adapters/sqlProviders.ts
3
+ /** The provider an adapter was given, when Hot Updater's SQL core runs on it. */
4
+ const checkSqlProvider = (adapter, provider) => {
5
+ if (!sqlProviders.includes(provider)) throw new Error(`${adapter}: provider "${String(provider)}" is not supported. Use ${sqlProviders.map((name) => `"${name}"`).join(", ")}; CockroachDB and SQL Server were dropped in 1.0.`);
6
+ return provider;
7
+ };
8
+ //#endregion
9
+ export { checkSqlProvider };
package/dist/apiKeys.cjs CHANGED
@@ -18,13 +18,13 @@ const isApiKey = (value) => {
18
18
  }
19
19
  };
20
20
  const normalizeApiKeyHeaderName = (value = API_KEY_HEADER_NAME) => {
21
- if (typeof value !== "string" || value.length === 0) throw new TypeError("clientAccess.headerName must be a valid header name.");
21
+ if (typeof value !== "string" || value.length === 0) throw new TypeError("apiKeys({ headerName }) must name a valid header.");
22
22
  try {
23
23
  const headers = new Headers();
24
24
  headers.set(value, "");
25
25
  return headers.keys().next().value;
26
26
  } catch {
27
- throw new TypeError("clientAccess.headerName must be a valid header name.");
27
+ throw new TypeError("apiKeys({ headerName }) must name a valid header.");
28
28
  }
29
29
  };
30
30
  const hashApiKey = async (apiKey) => {
@@ -100,13 +100,11 @@ const authenticateApiKey = async (input) => {
100
100
  const apiKey = input.request.headers.get(normalizeApiKeyHeaderName(input.headerName));
101
101
  if (apiKey === null || !isApiKey(apiKey)) return false;
102
102
  const hash = await hashApiKey(apiKey);
103
- await input.beforeLookup?.();
104
103
  const record = await input.apiKeys.findByHash(hash);
105
104
  return record !== null && record.hash === hash && record.role === "client" && record.revoked_at_ms === null;
106
105
  };
107
106
  const createApiKeyManagement = (input) => Object.freeze({
108
107
  async create({ name }) {
109
- await input.beforeOperation();
110
108
  const created = await createApiKey({
111
109
  apiKeys: input.apiKeys,
112
110
  name
@@ -117,11 +115,9 @@ const createApiKeyManagement = (input) => Object.freeze({
117
115
  });
118
116
  },
119
117
  async list() {
120
- await input.beforeOperation();
121
118
  return Object.freeze((await input.apiKeys.list()).map(toApiKeyMetadata));
122
119
  },
123
120
  async revoke({ id }) {
124
- await input.beforeOperation();
125
121
  const record = await input.apiKeys.revoke({
126
122
  id,
127
123
  revokedAtMs: Date.now()
@@ -23,27 +23,5 @@ interface ApiKeyManagementAPI {
23
23
  readonly id: string;
24
24
  }): Promise<ApiKeyMetadata | null>;
25
25
  }
26
- declare const registerApiKey: (input: {
27
- readonly apiKey: string;
28
- readonly apiKeys: ApiKeyModel;
29
- readonly createdAtMs?: number;
30
- readonly name: string;
31
- }) => Promise<CreatedApiKey>;
32
- declare const createApiKey: (input: {
33
- readonly apiKeys: ApiKeyModel;
34
- readonly name: string;
35
- }) => Promise<CreatedApiKey>;
36
- /**
37
- * Provisions the client API key used by managed init.
38
- *
39
- * A saved plaintext key is registered idempotently; otherwise a new key is
40
- * created. Callers must persist or display the returned plaintext because the
41
- * database stores only its hash.
42
- */
43
- declare const provisionApiKey: (input: {
44
- readonly apiKeys: ApiKeyModel;
45
- readonly existingApiKey?: string;
46
- readonly name: string;
47
- }) => Promise<CreatedApiKey>;
48
26
  //#endregion
49
- export { API_KEY_HEADER_NAME, ApiKeyManagementAPI, ApiKeyMetadata, CreatedApiKey, createApiKey, provisionApiKey, registerApiKey };
27
+ export { API_KEY_HEADER_NAME, ApiKeyManagementAPI, ApiKeyMetadata, CreatedApiKey };
@@ -23,27 +23,5 @@ interface ApiKeyManagementAPI {
23
23
  readonly id: string;
24
24
  }): Promise<ApiKeyMetadata | null>;
25
25
  }
26
- declare const registerApiKey: (input: {
27
- readonly apiKey: string;
28
- readonly apiKeys: ApiKeyModel;
29
- readonly createdAtMs?: number;
30
- readonly name: string;
31
- }) => Promise<CreatedApiKey>;
32
- declare const createApiKey: (input: {
33
- readonly apiKeys: ApiKeyModel;
34
- readonly name: string;
35
- }) => Promise<CreatedApiKey>;
36
- /**
37
- * Provisions the client API key used by managed init.
38
- *
39
- * A saved plaintext key is registered idempotently; otherwise a new key is
40
- * created. Callers must persist or display the returned plaintext because the
41
- * database stores only its hash.
42
- */
43
- declare const provisionApiKey: (input: {
44
- readonly apiKeys: ApiKeyModel;
45
- readonly existingApiKey?: string;
46
- readonly name: string;
47
- }) => Promise<CreatedApiKey>;
48
26
  //#endregion
49
- export { API_KEY_HEADER_NAME, ApiKeyManagementAPI, ApiKeyMetadata, CreatedApiKey, createApiKey, provisionApiKey, registerApiKey };
27
+ export { API_KEY_HEADER_NAME, ApiKeyManagementAPI, ApiKeyMetadata, CreatedApiKey };
package/dist/apiKeys.mjs CHANGED
@@ -18,13 +18,13 @@ const isApiKey = (value) => {
18
18
  }
19
19
  };
20
20
  const normalizeApiKeyHeaderName = (value = API_KEY_HEADER_NAME) => {
21
- if (typeof value !== "string" || value.length === 0) throw new TypeError("clientAccess.headerName must be a valid header name.");
21
+ if (typeof value !== "string" || value.length === 0) throw new TypeError("apiKeys({ headerName }) must name a valid header.");
22
22
  try {
23
23
  const headers = new Headers();
24
24
  headers.set(value, "");
25
25
  return headers.keys().next().value;
26
26
  } catch {
27
- throw new TypeError("clientAccess.headerName must be a valid header name.");
27
+ throw new TypeError("apiKeys({ headerName }) must name a valid header.");
28
28
  }
29
29
  };
30
30
  const hashApiKey = async (apiKey) => {
@@ -100,13 +100,11 @@ const authenticateApiKey = async (input) => {
100
100
  const apiKey = input.request.headers.get(normalizeApiKeyHeaderName(input.headerName));
101
101
  if (apiKey === null || !isApiKey(apiKey)) return false;
102
102
  const hash = await hashApiKey(apiKey);
103
- await input.beforeLookup?.();
104
103
  const record = await input.apiKeys.findByHash(hash);
105
104
  return record !== null && record.hash === hash && record.role === "client" && record.revoked_at_ms === null;
106
105
  };
107
106
  const createApiKeyManagement = (input) => Object.freeze({
108
107
  async create({ name }) {
109
- await input.beforeOperation();
110
108
  const created = await createApiKey({
111
109
  apiKeys: input.apiKeys,
112
110
  name
@@ -117,11 +115,9 @@ const createApiKeyManagement = (input) => Object.freeze({
117
115
  });
118
116
  },
119
117
  async list() {
120
- await input.beforeOperation();
121
118
  return Object.freeze((await input.apiKeys.list()).map(toApiKeyMetadata));
122
119
  },
123
120
  async revoke({ id }) {
124
- await input.beforeOperation();
125
121
  const record = await input.apiKeys.revoke({
126
122
  id,
127
123
  revokedAtMs: Date.now()