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

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 (519) 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 -10
  152. package/dist/db/index.d.cts +10 -4
  153. package/dist/db/index.d.mts +10 -4
  154. package/dist/db/index.mjs +16 -9
  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/diff.cjs +3 -0
  172. package/dist/diff.d.cts +2 -0
  173. package/dist/diff.d.mts +2 -0
  174. package/dist/diff.mjs +2 -0
  175. package/dist/handler.cjs +72 -43
  176. package/dist/handler.d.cts +3 -5
  177. package/dist/handler.d.mts +3 -5
  178. package/dist/handler.mjs +73 -43
  179. package/dist/handlerAdminRoutes.cjs +375 -0
  180. package/dist/handlerAdminRoutes.mjs +373 -0
  181. package/dist/handlerParameters.cjs +6 -11
  182. package/dist/handlerParameters.mjs +6 -10
  183. package/dist/handlerReleaseCatalogRoutes.cjs +11 -13
  184. package/dist/handlerReleaseCatalogRoutes.mjs +11 -13
  185. package/dist/handlerTypes.d.cts +2 -55
  186. package/dist/handlerTypes.d.mts +2 -55
  187. package/dist/handlerVersionRoutes.cjs +20 -4
  188. package/dist/handlerVersionRoutes.mjs +20 -4
  189. package/dist/index.cjs +4 -7
  190. package/dist/index.d.cts +8 -7
  191. package/dist/index.d.mts +8 -7
  192. package/dist/index.mjs +4 -4
  193. package/dist/insights/domain.d.cts +12 -0
  194. package/dist/insights/domain.d.mts +12 -0
  195. package/dist/insights/errors.cjs +34 -0
  196. package/dist/insights/errors.mjs +34 -1
  197. package/dist/insights/eventInput.cjs +14 -19
  198. package/dist/insights/eventInput.mjs +15 -20
  199. package/dist/insights/provider.cjs +47 -23
  200. package/dist/insights/provider.mjs +47 -24
  201. package/dist/insights/routes.cjs +79 -14
  202. package/dist/insights/routes.mjs +77 -14
  203. package/dist/node.d.cts +1 -1
  204. package/dist/node.d.mts +1 -1
  205. package/dist/package.cjs +1 -1
  206. package/dist/package.mjs +1 -1
  207. package/dist/plugins/api-keys/index.cjs +50 -0
  208. package/dist/plugins/api-keys/index.d.cts +85 -0
  209. package/dist/plugins/api-keys/index.d.mts +85 -0
  210. package/dist/plugins/api-keys/index.mjs +47 -0
  211. package/dist/plugins/api-keys/model.cjs +58 -0
  212. package/dist/plugins/api-keys/model.d.cts +8 -0
  213. package/dist/plugins/api-keys/model.d.mts +8 -0
  214. package/dist/plugins/api-keys/model.mjs +58 -0
  215. package/dist/plugins/api-keys/schema.cjs +38 -0
  216. package/dist/plugins/api-keys/schema.d.cts +44 -0
  217. package/dist/plugins/api-keys/schema.d.mts +44 -0
  218. package/dist/plugins/api-keys/schema.mjs +39 -0
  219. package/dist/plugins/builtIn.cjs +7 -0
  220. package/dist/plugins/builtIn.mjs +6 -0
  221. package/dist/plugins/definePlugin.cjs +5 -0
  222. package/dist/plugins/definePlugin.d.cts +73 -0
  223. package/dist/plugins/definePlugin.d.mts +73 -0
  224. package/dist/plugins/definePlugin.mjs +5 -0
  225. package/dist/plugins/index.cjs +17 -0
  226. package/dist/plugins/index.d.cts +9 -0
  227. package/dist/plugins/index.d.mts +9 -0
  228. package/dist/plugins/index.mjs +7 -0
  229. package/dist/plugins/insights/index.cjs +48 -0
  230. package/dist/plugins/insights/index.d.cts +295 -0
  231. package/dist/plugins/insights/index.d.mts +295 -0
  232. package/dist/plugins/insights/index.mjs +44 -0
  233. package/dist/plugins/insights/model.cjs +17 -0
  234. package/dist/plugins/insights/model.d.cts +10 -0
  235. package/dist/plugins/insights/model.d.mts +10 -0
  236. package/dist/plugins/insights/model.mjs +17 -0
  237. package/dist/plugins/insights/reads.cjs +471 -0
  238. package/dist/plugins/insights/reads.mjs +466 -0
  239. package/dist/plugins/insights/recordEvent.cjs +135 -0
  240. package/dist/plugins/insights/recordEvent.d.cts +13 -0
  241. package/dist/plugins/insights/recordEvent.d.mts +13 -0
  242. package/dist/plugins/insights/recordEvent.mjs +132 -0
  243. package/dist/plugins/insights/schema.cjs +347 -0
  244. package/dist/plugins/insights/schema.d.cts +258 -0
  245. package/dist/plugins/insights/schema.d.mts +258 -0
  246. package/dist/plugins/insights/schema.mjs +344 -0
  247. package/dist/types/index.d.cts +2 -28
  248. package/dist/types/index.d.mts +2 -28
  249. package/package.json +32 -5
  250. package/src/adapters/drizzle.conformance.integration.spec.ts +34 -0
  251. package/src/adapters/drizzle.readBudgets.integration.spec.ts +41 -0
  252. package/src/adapters/drizzle.spec.ts +270 -399
  253. package/src/adapters/drizzle.ts +48 -140
  254. package/src/adapters/drizzleExecutor.ts +166 -0
  255. package/src/adapters/kysely.conformance.integration.spec.ts +36 -0
  256. package/src/adapters/kysely.readBudgets.integration.spec.ts +42 -0
  257. package/src/adapters/kysely.spec.ts +204 -171
  258. package/src/adapters/kysely.ts +32 -93
  259. package/src/adapters/kyselyExecutor.ts +53 -0
  260. package/src/adapters/mongodb.integration.spec.ts +143 -446
  261. package/src/adapters/mongodb.readBudgets.integration.spec.ts +61 -0
  262. package/src/adapters/mongodb.ts +36 -123
  263. package/src/adapters/mongodbAdapter.ts +293 -0
  264. package/src/adapters/prisma.conformance.integration.spec.ts +36 -0
  265. package/src/adapters/prisma.integration.spec.ts +138 -0
  266. package/src/adapters/prisma.readBudgets.integration.spec.ts +40 -0
  267. package/src/adapters/prisma.spec.ts +216 -433
  268. package/src/adapters/prisma.ts +60 -524
  269. package/src/adapters/prismaExecutor.ts +107 -0
  270. package/src/adapters/prismaTestClients.ts +175 -0
  271. package/src/adapters/sqlProviders.ts +14 -0
  272. package/src/apiKeys.integration.spec.ts +19 -119
  273. package/src/apiKeys.spec.ts +39 -35
  274. package/src/apiKeys.ts +2 -8
  275. package/src/assembly/assemblePlugins.ts +269 -0
  276. package/src/assembly/assembly.spec.ts +325 -0
  277. package/src/assembly/assembly.types.spec.ts +155 -0
  278. package/src/assembly/builtInRoutes.spec.ts +213 -0
  279. package/src/assembly/databasePlugins.spec.ts +71 -0
  280. package/src/assembly/databasePlugins.ts +96 -0
  281. package/src/core/api.ts +139 -0
  282. package/src/core/baseCandidates.spec.ts +378 -0
  283. package/src/core/baseCandidates.ts +136 -0
  284. package/src/core/index.ts +44 -0
  285. package/src/core/operations.spec.ts +415 -0
  286. package/src/core/operations.ts +551 -0
  287. package/src/core/reads.spec.ts +300 -0
  288. package/src/core/reads.ts +417 -0
  289. package/src/core/releases.spec.ts +308 -0
  290. package/src/core/releases.ts +345 -0
  291. package/src/core/schema.ts +173 -0
  292. package/src/core/writes.ts +160 -0
  293. package/src/createHotUpdaterCore.ts +191 -181
  294. package/src/database/cursor.ts +65 -0
  295. package/src/database/database.ts +335 -0
  296. package/src/database/database.types.spec.ts +135 -0
  297. package/src/database/definitions.ts +72 -0
  298. package/src/database/engine.ts +62 -0
  299. package/src/database/engineAggregates.spec.ts +539 -0
  300. package/src/database/engineAggregates.ts +193 -0
  301. package/src/database/engineReads.spec.ts +219 -0
  302. package/src/database/engineReads.ts +302 -0
  303. package/src/database/engineTransaction.spec.ts +710 -0
  304. package/src/database/engineTransaction.ts +588 -0
  305. package/src/database/errors.ts +30 -0
  306. package/src/database/fence.spec.ts +223 -0
  307. package/src/database/fence.ts +171 -0
  308. package/src/database/index.ts +154 -0
  309. package/src/database/kv/kvAdapter.conformance.integration.spec.ts +17 -0
  310. package/src/database/kv/kvAdapter.readBudgets.integration.spec.ts +17 -0
  311. package/src/database/kv/kvAdapter.spec.ts +468 -0
  312. package/src/database/kv/kvAdapter.ts +450 -0
  313. package/src/database/kv/kvTestStore.ts +91 -0
  314. package/src/database/memory.readBudgets.integration.spec.ts +13 -0
  315. package/src/database/resolveSchema.spec.ts +230 -0
  316. package/src/database/resolveSchema.ts +372 -0
  317. package/src/database/schema.ts +169 -0
  318. package/src/database/schema.types.spec.ts +94 -0
  319. package/src/database/sql/docker-compose.yml +36 -0
  320. package/src/database/sql/sqlAdapter.integration.spec.ts +148 -0
  321. package/src/database/sql/sqlAdapter.readBudgets.integration.spec.ts +109 -0
  322. package/src/database/sql/sqlAdapter.spec.ts +255 -0
  323. package/src/database/sql/sqlAdapter.ts +532 -0
  324. package/src/database/sql/sqlSchema.ts +205 -0
  325. package/src/database/sql/sqlTestExecutors.ts +183 -0
  326. package/src/databaseTestSuite.spec.ts +39 -0
  327. package/src/db/builtInDatabase.ts +149 -0
  328. package/src/db/bundleRows.spec.ts +3 -3
  329. package/src/db/createBundleDiff.spec.ts +43 -29
  330. package/src/db/createBundleDiff.ts +13 -7
  331. package/src/db/engineDrizzleSchema.ts +72 -0
  332. package/src/db/engineMigrator.ts +105 -0
  333. package/src/db/enginePrismaSchema.ts +147 -0
  334. package/src/db/engineSql.spec.ts +129 -0
  335. package/src/db/engineSql.ts +48 -0
  336. package/src/db/engineSqlMigrator.ts +116 -0
  337. package/src/db/fixedMigratorShared.ts +1 -20
  338. package/src/db/index.spec.ts +116 -829
  339. package/src/db/index.ts +43 -15
  340. package/src/db/pluginTables.spec.ts +218 -0
  341. package/src/db/releaseCatalog.ts +48 -90
  342. package/src/db/schemaSettings.ts +104 -0
  343. package/src/db/settingsMigrator.spec.ts +65 -0
  344. package/src/db/settingsMigrator.ts +152 -0
  345. package/src/db/types.ts +25 -171
  346. package/src/db/updateArtifacts.spec.ts +170 -294
  347. package/src/db/updateArtifacts.ts +74 -142
  348. package/src/db/updateCheck.bench.ts +47 -0
  349. package/src/diff.ts +6 -0
  350. package/src/handler-standalone.integration.spec.ts +204 -410
  351. package/src/handler.spec.ts +134 -51
  352. package/src/handler.testFixtures.ts +14 -19
  353. package/src/handler.ts +163 -75
  354. package/src/handlerAdminRoutes.spec.ts +183 -0
  355. package/src/handlerAdminRoutes.ts +536 -0
  356. package/src/handlerAuth.integration.spec.ts +3 -3
  357. package/src/handlerManagement.spec.ts +136 -196
  358. package/src/handlerReleaseCatalogRoutes.ts +15 -17
  359. package/src/handlerTypes.ts +3 -80
  360. package/src/handlerVersionRoutes.ts +20 -7
  361. package/src/index.ts +5 -12
  362. package/src/insights/domain.ts +12 -0
  363. package/src/insights/errors.spec.ts +48 -0
  364. package/src/insights/errors.ts +51 -0
  365. package/src/insights/eventInput.ts +27 -24
  366. package/src/insights/insights.integration.spec.ts +228 -78
  367. package/src/insights/provider.spec.ts +203 -25
  368. package/src/insights/provider.ts +88 -32
  369. package/src/insights/routes.ts +95 -20
  370. package/src/lintRules.spec.ts +76 -0
  371. package/src/plugins/api-keys/apiKeysPlugin.spec.ts +172 -0
  372. package/src/plugins/api-keys/index.ts +66 -0
  373. package/src/plugins/api-keys/model.ts +69 -0
  374. package/src/plugins/api-keys/schema.ts +22 -0
  375. package/src/plugins/builtIn.ts +5 -0
  376. package/src/plugins/definePlugin.ts +100 -0
  377. package/src/plugins/index.ts +55 -0
  378. package/src/plugins/insights/index.ts +86 -0
  379. package/src/plugins/insights/insightsRollout.integration.spec.ts +187 -0
  380. package/src/plugins/insights/model.spec.ts +66 -0
  381. package/src/plugins/insights/model.ts +19 -0
  382. package/src/plugins/insights/reads.spec.ts +725 -0
  383. package/src/plugins/insights/reads.ts +707 -0
  384. package/src/plugins/insights/recordEvent.spec.ts +443 -0
  385. package/src/plugins/insights/recordEvent.ts +238 -0
  386. package/src/plugins/insights/schema.ts +229 -0
  387. package/src/plugins/pluginTestHarness.spec.ts +56 -0
  388. package/src/readBudgets.testFixtures.ts +15 -0
  389. package/src/releaseCatalogRoutes.integration.spec.ts +47 -92
  390. package/src/runtime.spec.ts +91 -77
  391. package/src/runtime.testFixtures.ts +28 -44
  392. package/src/runtimeBundles.integration.spec.ts +112 -0
  393. package/src/testUtilsMutation.integration.spec.ts +215 -0
  394. package/src/testUtilsPackage.integration.spec.ts +176 -0
  395. package/src/types/index.ts +0 -32
  396. package/dist/adapters/databaseConstraintErrors.cjs +0 -22
  397. package/dist/adapters/databaseConstraintErrors.mjs +0 -21
  398. package/dist/adapters/databasePluginUtils.cjs +0 -130
  399. package/dist/adapters/databasePluginUtils.mjs +0 -118
  400. package/dist/adapters/drizzleCrud.cjs +0 -340
  401. package/dist/adapters/drizzleCrud.mjs +0 -337
  402. package/dist/adapters/drizzleLazyDB.cjs +0 -103
  403. package/dist/adapters/drizzleLazyDB.mjs +0 -103
  404. package/dist/adapters/drizzleQuery.cjs +0 -69
  405. package/dist/adapters/drizzleQuery.mjs +0 -69
  406. package/dist/adapters/kyselyCrud.cjs +0 -293
  407. package/dist/adapters/kyselyCrud.mjs +0 -292
  408. package/dist/adapters/kyselyQuery.cjs +0 -56
  409. package/dist/adapters/kyselyQuery.mjs +0 -56
  410. package/dist/adapters/mongodbCollections.cjs +0 -38
  411. package/dist/adapters/mongodbCollections.mjs +0 -32
  412. package/dist/adapters/mongodbQuery.cjs +0 -90
  413. package/dist/adapters/mongodbQuery.mjs +0 -83
  414. package/dist/adapters/mongodbReads.cjs +0 -206
  415. package/dist/adapters/mongodbReads.mjs +0 -206
  416. package/dist/adapters/mongodbWrites.cjs +0 -133
  417. package/dist/adapters/mongodbWrites.mjs +0 -133
  418. package/dist/adapters/prismaInsights.cjs +0 -99
  419. package/dist/adapters/prismaInsights.mjs +0 -97
  420. package/dist/adapters/prismaQuery.cjs +0 -57
  421. package/dist/adapters/prismaQuery.mjs +0 -56
  422. package/dist/adapters/prismaRows.cjs +0 -197
  423. package/dist/adapters/prismaRows.mjs +0 -188
  424. package/dist/db/databasePluginCore.cjs +0 -137
  425. package/dist/db/databasePluginCore.mjs +0 -137
  426. package/dist/db/fixedMigrator.cjs +0 -79
  427. package/dist/db/fixedMigrator.mjs +0 -78
  428. package/dist/db/fixedMigratorMongo.cjs +0 -321
  429. package/dist/db/fixedMigratorMongo.mjs +0 -321
  430. package/dist/db/mongoMigrationExecution.cjs +0 -11
  431. package/dist/db/mongoMigrationExecution.mjs +0 -11
  432. package/dist/db/schema/insightsCollation.cjs +0 -14
  433. package/dist/db/schema/insightsCollation.mjs +0 -14
  434. package/dist/db/schema/mongodb.cjs +0 -25
  435. package/dist/db/schema/mongodb.mjs +0 -25
  436. package/dist/db/schema/registry.cjs +0 -21
  437. package/dist/db/schema/registry.mjs +0 -17
  438. package/dist/db/schema/sql.cjs +0 -105
  439. package/dist/db/schema/sql.mjs +0 -97
  440. package/dist/db/schema/sqlOperations.cjs +0 -27
  441. package/dist/db/schema/sqlOperations.mjs +0 -26
  442. package/dist/db/schemaGenerators.cjs +0 -276
  443. package/dist/db/schemaGenerators.mjs +0 -274
  444. package/dist/db/schemaReadiness.cjs +0 -26
  445. package/dist/db/schemaReadiness.d.cts +0 -9
  446. package/dist/db/schemaReadiness.d.mts +0 -9
  447. package/dist/db/schemaReadiness.mjs +0 -25
  448. package/dist/db/sqlMigrationExecution.cjs +0 -67
  449. package/dist/db/sqlMigrationExecution.mjs +0 -67
  450. package/dist/handlerBundleRoutes.cjs +0 -155
  451. package/dist/handlerBundleRoutes.mjs +0 -155
  452. package/dist/handlerReleaseManagementRoutes.cjs +0 -124
  453. package/dist/handlerReleaseManagementRoutes.mjs +0 -124
  454. package/dist/schema/dsl.cjs +0 -103
  455. package/dist/schema/dsl.mjs +0 -87
  456. package/dist/schema/index.cjs +0 -20
  457. package/dist/schema/index.mjs +0 -7
  458. package/dist/schema/settings.cjs +0 -9
  459. package/dist/schema/settings.mjs +0 -9
  460. package/dist/schema/types.cjs +0 -8
  461. package/dist/schema/types.mjs +0 -6
  462. package/dist/schema/v1_0_0.cjs +0 -393
  463. package/dist/schema/v1_0_0.mjs +0 -385
  464. package/src/adapters/databaseConstraintErrors.ts +0 -25
  465. package/src/adapters/databasePluginTestDatabase.ts +0 -116
  466. package/src/adapters/databasePluginUtils.spec.ts +0 -29
  467. package/src/adapters/databasePluginUtils.ts +0 -238
  468. package/src/adapters/drizzleCrud.ts +0 -610
  469. package/src/adapters/drizzleLazyDB.ts +0 -284
  470. package/src/adapters/drizzleQuery.ts +0 -164
  471. package/src/adapters/kyselyCrud.ts +0 -696
  472. package/src/adapters/kyselyInsights.spec.ts +0 -168
  473. package/src/adapters/kyselyQuery.ts +0 -128
  474. package/src/adapters/mongodb.spec.ts +0 -230
  475. package/src/adapters/mongodbCollections.ts +0 -78
  476. package/src/adapters/mongodbQuery.ts +0 -245
  477. package/src/adapters/mongodbReads.ts +0 -387
  478. package/src/adapters/mongodbRows.spec.ts +0 -64
  479. package/src/adapters/mongodbRows.ts +0 -118
  480. package/src/adapters/mongodbTestClient.ts +0 -443
  481. package/src/adapters/mongodbTestFilter.ts +0 -170
  482. package/src/adapters/mongodbWrites.ts +0 -261
  483. package/src/adapters/prismaInsights.ts +0 -190
  484. package/src/adapters/prismaQuery.ts +0 -129
  485. package/src/adapters/prismaRows.spec.ts +0 -98
  486. package/src/adapters/prismaRows.ts +0 -308
  487. package/src/adapters/prismaTestClient.ts +0 -478
  488. package/src/calculatePagination.ts +0 -34
  489. package/src/db/databasePluginCore.spec.ts +0 -62
  490. package/src/db/databasePluginCore.testFixtures.ts +0 -76
  491. package/src/db/databasePluginCore.ts +0 -185
  492. package/src/db/databasePluginUpdateCheck.bench.ts +0 -117
  493. package/src/db/fixedMigrator.spec.ts +0 -294
  494. package/src/db/fixedMigrator.ts +0 -147
  495. package/src/db/fixedMigratorMongo.spec.ts +0 -253
  496. package/src/db/fixedMigratorMongo.ts +0 -425
  497. package/src/db/hotUpdaterSchema.ts +0 -5
  498. package/src/db/mongoMigrationExecution.ts +0 -23
  499. package/src/db/schema/definitions.ts +0 -1
  500. package/src/db/schema/insightsCollation.ts +0 -21
  501. package/src/db/schema/mongodb.ts +0 -40
  502. package/src/db/schema/registry.ts +0 -55
  503. package/src/db/schema/sql.ts +0 -244
  504. package/src/db/schema/sqlOperations.ts +0 -63
  505. package/src/db/schema/types.ts +0 -1
  506. package/src/db/schemaGenerators.ts +0 -495
  507. package/src/db/schemaReadiness.ts +0 -34
  508. package/src/db/sqlMigrationExecution.spec.ts +0 -65
  509. package/src/db/sqlMigrationExecution.ts +0 -108
  510. package/src/db/types.spec.ts +0 -63
  511. package/src/handlerBundleRoutes.ts +0 -259
  512. package/src/handlerReleaseManagementRoutes.ts +0 -213
  513. package/src/schema/dsl-all-versions.spec.ts +0 -35
  514. package/src/schema/dsl.ts +0 -187
  515. package/src/schema/index.ts +0 -10
  516. package/src/schema/settings.ts +0 -15
  517. package/src/schema/types.ts +0 -79
  518. package/src/schema/v1_0_0.spec.ts +0 -220
  519. 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()