@hot-updater/server 0.36.7 → 1.0.0-rc.1

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 (291) hide show
  1. package/dist/adapters/databaseConstraintErrors.cjs +23 -0
  2. package/dist/adapters/databaseConstraintErrors.mjs +21 -0
  3. package/dist/adapters/databasePluginUtils.cjs +117 -0
  4. package/dist/adapters/databasePluginUtils.mjs +106 -0
  5. package/dist/adapters/drizzle.cjs +53 -176
  6. package/dist/adapters/drizzle.d.cts +6 -4
  7. package/dist/adapters/drizzle.d.mts +6 -4
  8. package/dist/adapters/drizzle.mjs +54 -177
  9. package/dist/adapters/drizzleCrud.cjs +250 -0
  10. package/dist/adapters/drizzleCrud.mjs +249 -0
  11. package/dist/adapters/drizzleLazyDB.cjs +84 -36
  12. package/dist/adapters/drizzleLazyDB.mjs +84 -36
  13. package/dist/adapters/drizzleQuery.cjs +68 -0
  14. package/dist/adapters/drizzleQuery.mjs +67 -0
  15. package/dist/adapters/kysely.cjs +18 -138
  16. package/dist/adapters/kysely.d.cts +3 -12
  17. package/dist/adapters/kysely.d.mts +3 -12
  18. package/dist/adapters/kysely.mjs +19 -139
  19. package/dist/adapters/kyselyCrud.cjs +254 -0
  20. package/dist/adapters/kyselyCrud.mjs +253 -0
  21. package/dist/adapters/kyselyQuery.cjs +56 -0
  22. package/dist/adapters/kyselyQuery.mjs +55 -0
  23. package/dist/adapters/mongodb.cjs +21 -174
  24. package/dist/adapters/mongodb.d.cts +3 -2
  25. package/dist/adapters/mongodb.d.mts +3 -2
  26. package/dist/adapters/mongodb.mjs +21 -174
  27. package/dist/adapters/mongodbCollections.cjs +36 -0
  28. package/dist/adapters/mongodbCollections.mjs +30 -0
  29. package/dist/adapters/mongodbQuery.cjs +77 -0
  30. package/dist/adapters/mongodbQuery.mjs +70 -0
  31. package/dist/adapters/mongodbReads.cjs +148 -0
  32. package/dist/adapters/mongodbReads.mjs +147 -0
  33. package/dist/adapters/mongodbWrites.cjs +134 -0
  34. package/dist/adapters/mongodbWrites.mjs +133 -0
  35. package/dist/adapters/prisma.cjs +205 -180
  36. package/dist/adapters/prisma.d.cts +3 -3
  37. package/dist/adapters/prisma.d.mts +3 -3
  38. package/dist/adapters/prisma.mjs +206 -181
  39. package/dist/adapters/prismaQuery.cjs +58 -0
  40. package/dist/adapters/prismaQuery.mjs +56 -0
  41. package/dist/adapters/prismaRows.cjs +198 -0
  42. package/dist/adapters/prismaRows.mjs +188 -0
  43. package/dist/apiKeys.cjs +139 -0
  44. package/dist/apiKeys.d.cts +50 -0
  45. package/dist/apiKeys.d.mts +50 -0
  46. package/dist/apiKeys.mjs +133 -0
  47. package/dist/createHotUpdaterCore.cjs +48 -26
  48. package/dist/createHotUpdaterCore.d.cts +49 -17
  49. package/dist/createHotUpdaterCore.d.mts +49 -17
  50. package/dist/createHotUpdaterCore.mjs +51 -29
  51. package/dist/db/createBundleDiff.cjs +45 -68
  52. package/dist/db/createBundleDiff.d.cts +3 -3
  53. package/dist/db/createBundleDiff.d.mts +3 -3
  54. package/dist/db/createBundleDiff.mjs +47 -68
  55. package/dist/db/databasePluginCore.cjs +138 -0
  56. package/dist/db/databasePluginCore.mjs +137 -0
  57. package/dist/db/fixedMigrator.cjs +36 -93
  58. package/dist/db/fixedMigrator.mjs +36 -93
  59. package/dist/db/fixedMigratorMongo.cjs +319 -0
  60. package/dist/db/fixedMigratorMongo.mjs +319 -0
  61. package/dist/db/fixedMigratorShared.cjs +23 -0
  62. package/dist/db/fixedMigratorShared.mjs +18 -0
  63. package/dist/db/mongoMigrationExecution.cjs +11 -0
  64. package/dist/db/mongoMigrationExecution.mjs +11 -0
  65. package/dist/db/releaseCatalog.cjs +66 -0
  66. package/dist/db/releaseCatalog.d.cts +17 -0
  67. package/dist/db/releaseCatalog.d.mts +17 -0
  68. package/dist/db/releaseCatalog.mjs +64 -0
  69. package/dist/db/schema/mongodb.cjs +14 -6
  70. package/dist/db/schema/mongodb.mjs +14 -6
  71. package/dist/db/schema/registry.cjs +0 -2
  72. package/dist/db/schema/registry.mjs +1 -2
  73. package/dist/db/schema/sql.cjs +31 -14
  74. package/dist/db/schema/sql.mjs +32 -13
  75. package/dist/db/schema/sqlOperations.cjs +4 -4
  76. package/dist/db/schema/sqlOperations.mjs +5 -5
  77. package/dist/db/schemaGenerators.cjs +52 -18
  78. package/dist/db/schemaGenerators.mjs +52 -18
  79. package/dist/db/schemaReadiness.cjs +4 -3
  80. package/dist/db/schemaReadiness.mjs +4 -3
  81. package/dist/db/sqlMigrationExecution.cjs +67 -0
  82. package/dist/db/sqlMigrationExecution.mjs +66 -0
  83. package/dist/db/types.cjs +2 -6
  84. package/dist/db/types.d.cts +60 -16
  85. package/dist/db/types.d.mts +60 -16
  86. package/dist/db/types.mjs +3 -6
  87. package/dist/db/updateArtifacts.cjs +114 -60
  88. package/dist/db/updateArtifacts.mjs +117 -62
  89. package/dist/handler.cjs +108 -282
  90. package/dist/handler.d.cts +3 -46
  91. package/dist/handler.d.mts +3 -46
  92. package/dist/handler.mjs +107 -281
  93. package/dist/handlerBundleRoutes.cjs +155 -0
  94. package/dist/handlerBundleRoutes.mjs +155 -0
  95. package/dist/handlerErrors.cjs +9 -0
  96. package/dist/handlerErrors.mjs +9 -0
  97. package/dist/handlerParameters.cjs +39 -0
  98. package/dist/handlerParameters.mjs +34 -0
  99. package/dist/handlerReleaseCatalogRoutes.cjs +111 -0
  100. package/dist/handlerReleaseCatalogRoutes.mjs +110 -0
  101. package/dist/handlerReleaseManagementRoutes.cjs +125 -0
  102. package/dist/handlerReleaseManagementRoutes.mjs +124 -0
  103. package/dist/handlerTypes.d.cts +63 -0
  104. package/dist/handlerTypes.d.mts +63 -0
  105. package/dist/handlerVersionRoutes.cjs +10 -0
  106. package/dist/handlerVersionRoutes.d.cts +4 -0
  107. package/dist/handlerVersionRoutes.d.mts +4 -0
  108. package/dist/handlerVersionRoutes.mjs +9 -0
  109. package/dist/index.cjs +10 -1
  110. package/dist/index.d.cts +9 -3
  111. package/dist/index.d.mts +9 -3
  112. package/dist/index.mjs +5 -2
  113. package/dist/insights/bounded/activeOverview.cjs +87 -0
  114. package/dist/insights/bounded/activeOverview.mjs +85 -0
  115. package/dist/insights/bounded/installationSearch.cjs +42 -0
  116. package/dist/insights/bounded/installationSearch.mjs +42 -0
  117. package/dist/insights/bounded/persistence.cjs +39 -0
  118. package/dist/insights/bounded/persistence.mjs +38 -0
  119. package/dist/insights/bounded/provider.cjs +170 -0
  120. package/dist/insights/bounded/provider.d.cts +7 -0
  121. package/dist/insights/bounded/provider.d.mts +7 -0
  122. package/dist/insights/bounded/provider.mjs +170 -0
  123. package/dist/insights/bounded/scan.cjs +144 -0
  124. package/dist/insights/bounded/scan.mjs +138 -0
  125. package/dist/insights/domain.d.cts +121 -0
  126. package/dist/insights/domain.d.mts +121 -0
  127. package/dist/insights/errors.cjs +22 -0
  128. package/dist/insights/errors.mjs +20 -0
  129. package/dist/insights/eventInput.cjs +111 -0
  130. package/dist/insights/eventInput.mjs +111 -0
  131. package/dist/insights/persistence.d.cts +6 -0
  132. package/dist/insights/persistence.d.mts +6 -0
  133. package/dist/insights/queryInput.cjs +58 -0
  134. package/dist/insights/queryInput.mjs +55 -0
  135. package/dist/insights/routes.cjs +63 -0
  136. package/dist/insights/routes.mjs +61 -0
  137. package/dist/insights/types.d.cts +17 -0
  138. package/dist/insights/types.d.mts +17 -0
  139. package/dist/node.cjs +19 -12
  140. package/dist/node.d.cts +15 -10
  141. package/dist/node.d.mts +15 -10
  142. package/dist/node.mjs +19 -13
  143. package/dist/package.cjs +1 -1
  144. package/dist/package.mjs +1 -1
  145. package/dist/schema/dsl.cjs +19 -2
  146. package/dist/schema/dsl.mjs +17 -3
  147. package/dist/schema/index.cjs +1 -8
  148. package/dist/schema/index.mjs +2 -8
  149. package/dist/schema/types.cjs +3 -1
  150. package/dist/schema/types.mjs +3 -2
  151. package/dist/schema/v1_0_0.cjs +364 -0
  152. package/dist/schema/v1_0_0.mjs +357 -0
  153. package/dist/storageAccess.cjs +69 -25
  154. package/dist/storageAccess.mjs +68 -25
  155. package/dist/types/index.d.cts +4 -3
  156. package/dist/types/index.d.mts +5 -4
  157. package/package.json +8 -7
  158. package/src/adapters/databaseConstraintErrors.ts +25 -0
  159. package/src/adapters/databasePluginTestDatabase.ts +106 -0
  160. package/src/adapters/databasePluginUtils.spec.ts +29 -0
  161. package/src/adapters/databasePluginUtils.ts +214 -0
  162. package/src/adapters/drizzle.spec.ts +208 -47
  163. package/src/adapters/drizzle.ts +106 -293
  164. package/src/adapters/drizzleCrud.ts +419 -0
  165. package/src/adapters/drizzleLazyDB.ts +206 -100
  166. package/src/adapters/drizzleQuery.ts +164 -0
  167. package/src/adapters/kysely.spec.ts +126 -88
  168. package/src/adapters/kysely.ts +76 -334
  169. package/src/adapters/kyselyCrud.ts +588 -0
  170. package/src/adapters/kyselyQuery.ts +128 -0
  171. package/src/adapters/mongodb.spec.ts +141 -0
  172. package/src/adapters/mongodb.ts +60 -288
  173. package/src/adapters/mongodbCollections.ts +62 -0
  174. package/src/adapters/mongodbQuery.ts +226 -0
  175. package/src/adapters/mongodbReads.ts +311 -0
  176. package/src/adapters/mongodbRows.spec.ts +64 -0
  177. package/src/adapters/mongodbRows.ts +118 -0
  178. package/src/adapters/mongodbTestClient.ts +342 -0
  179. package/src/adapters/mongodbTestFilter.ts +166 -0
  180. package/src/adapters/mongodbWrites.ts +260 -0
  181. package/src/adapters/prisma.spec.ts +196 -0
  182. package/src/adapters/prisma.ts +417 -292
  183. package/src/adapters/prismaQuery.ts +129 -0
  184. package/src/adapters/prismaRows.spec.ts +98 -0
  185. package/src/adapters/prismaRows.ts +301 -0
  186. package/src/adapters/prismaTestClient.ts +396 -0
  187. package/src/apiKeys.integration.spec.ts +192 -0
  188. package/src/apiKeys.spec.ts +162 -0
  189. package/src/apiKeys.ts +220 -0
  190. package/src/createHotUpdaterCore.ts +164 -100
  191. package/src/db/bundleRows.spec.ts +164 -0
  192. package/src/db/bundleRows.ts +10 -140
  193. package/src/db/createBundleDiff.spec.ts +172 -127
  194. package/src/db/createBundleDiff.ts +91 -110
  195. package/src/db/databasePluginCore.spec.ts +62 -0
  196. package/src/db/databasePluginCore.testFixtures.ts +76 -0
  197. package/src/db/databasePluginCore.ts +185 -0
  198. package/src/db/databasePluginUpdateCheck.bench.ts +107 -0
  199. package/src/db/fixedMigrator.spec.ts +184 -42
  200. package/src/db/fixedMigrator.ts +64 -205
  201. package/src/db/fixedMigratorMongo.spec.ts +192 -0
  202. package/src/db/fixedMigratorMongo.ts +425 -0
  203. package/src/db/fixedMigratorShared.ts +36 -0
  204. package/src/db/hotUpdaterSchema.ts +0 -1
  205. package/src/db/index.spec.ts +333 -1025
  206. package/src/db/mongoMigrationExecution.ts +23 -0
  207. package/src/db/node-sqlite.d.ts +25 -0
  208. package/src/db/releaseCatalog.ts +148 -0
  209. package/src/db/schema/mongodb.ts +20 -6
  210. package/src/db/schema/sql.ts +52 -11
  211. package/src/db/schema/sqlOperations.ts +5 -4
  212. package/src/db/schemaGenerators.ts +107 -23
  213. package/src/db/schemaReadiness.ts +2 -1
  214. package/src/db/sqlMigrationExecution.spec.ts +65 -0
  215. package/src/db/sqlMigrationExecution.ts +108 -0
  216. package/src/db/types.spec.ts +55 -0
  217. package/src/db/types.ts +129 -65
  218. package/src/db/updateArtifacts.spec.ts +359 -0
  219. package/src/db/updateArtifacts.ts +290 -126
  220. package/src/handler-standalone.integration.spec.ts +401 -364
  221. package/src/handler.spec.ts +137 -582
  222. package/src/handler.testFixtures.ts +30 -0
  223. package/src/handler.ts +218 -616
  224. package/src/handlerAuth.integration.spec.ts +33 -0
  225. package/src/handlerBundleRoutes.ts +259 -0
  226. package/src/handlerErrors.ts +7 -0
  227. package/src/handlerManagement.spec.ts +262 -0
  228. package/src/handlerParameters.ts +105 -0
  229. package/src/handlerReleaseCatalogRoutes.ts +154 -0
  230. package/src/handlerReleaseManagementRoutes.ts +213 -0
  231. package/src/handlerTypes.ts +96 -0
  232. package/src/handlerVersionRoutes.ts +12 -0
  233. package/src/index.ts +22 -2
  234. package/src/insights/bounded/activeOverview.spec.ts +189 -0
  235. package/src/insights/bounded/activeOverview.ts +148 -0
  236. package/src/insights/bounded/installationSearch.spec.ts +130 -0
  237. package/src/insights/bounded/installationSearch.ts +69 -0
  238. package/src/insights/bounded/persistence.ts +43 -0
  239. package/src/insights/bounded/provider.spec.ts +219 -0
  240. package/src/insights/bounded/provider.ts +229 -0
  241. package/src/insights/bounded/scan.ts +235 -0
  242. package/src/insights/domain.ts +139 -0
  243. package/src/insights/errors.ts +18 -0
  244. package/src/insights/eventInput.ts +168 -0
  245. package/src/insights/insights.integration.spec.ts +144 -0
  246. package/src/insights/persistence.ts +10 -0
  247. package/src/insights/queryInput.ts +102 -0
  248. package/src/insights/routes.ts +123 -0
  249. package/src/insights/types.ts +44 -0
  250. package/src/node.spec.ts +79 -10
  251. package/src/node.ts +20 -17
  252. package/src/releaseCatalogRoutes.integration.spec.ts +238 -0
  253. package/src/runtime.spec.ts +126 -959
  254. package/src/runtime.testFixtures.ts +71 -0
  255. package/src/schema/dsl-all-versions.spec.ts +26 -17
  256. package/src/schema/dsl.ts +41 -2
  257. package/src/schema/index.ts +3 -9
  258. package/src/schema/types.ts +9 -3
  259. package/src/schema/v1_0_0.spec.ts +146 -0
  260. package/src/schema/v1_0_0.ts +465 -0
  261. package/src/storageAccess.spec.ts +127 -32
  262. package/src/storageAccess.ts +106 -55
  263. package/src/types/index.ts +2 -1
  264. package/dist/db/bundleRows.cjs +0 -82
  265. package/dist/db/bundleRows.d.cts +0 -33
  266. package/dist/db/bundleRows.d.mts +0 -33
  267. package/dist/db/bundleRows.mjs +0 -79
  268. package/dist/db/pluginCore.cjs +0 -242
  269. package/dist/db/pluginCore.mjs +0 -241
  270. package/dist/db/schema/sqlMigrations.cjs +0 -74
  271. package/dist/db/schema/sqlMigrations.mjs +0 -73
  272. package/dist/db/schemaEnhancements.cjs +0 -20
  273. package/dist/db/schemaEnhancements.mjs +0 -19
  274. package/dist/route.cjs +0 -7
  275. package/dist/route.mjs +0 -7
  276. package/dist/schema/v0_21_0.cjs +0 -38
  277. package/dist/schema/v0_21_0.mjs +0 -37
  278. package/dist/schema/v0_29_0.cjs +0 -45
  279. package/dist/schema/v0_29_0.mjs +0 -44
  280. package/dist/schema/v0_31_0.cjs +0 -82
  281. package/dist/schema/v0_31_0.mjs +0 -80
  282. package/src/db/pluginCore.spec.ts +0 -1095
  283. package/src/db/pluginCore.ts +0 -475
  284. package/src/db/pluginUpdateCheck.bench.ts +0 -254
  285. package/src/db/schema/sqlMigrations.ts +0 -219
  286. package/src/db/schemaEnhancements.ts +0 -55
  287. package/src/route.ts +0 -7
  288. package/src/schema/v0_21_0.ts +0 -52
  289. package/src/schema/v0_29_0.ts +0 -62
  290. package/src/schema/v0_31_0.spec.ts +0 -73
  291. package/src/schema/v0_31_0.ts +0 -120
@@ -0,0 +1,147 @@
1
+ import { hasNullOrderOverrides, sortRowsByOrder } from "./databasePluginUtils.mjs";
2
+ import { WITHOUT_INTERNAL_FIELDS, WITHOUT_MONGO_ID, activeBundleFilter, mongoSessionOptions } from "./mongodbCollections.mjs";
3
+ import { createMongoApiKeyWhere, createMongoBundleWhere, createMongoChannelWhere, createMongoEventWhere, createMongoPatchWhere, createMongoReleaseCatalogWhere, createMongoReleaseWhere, createMongoSort } from "./mongodbQuery.mjs";
4
+ import { DatabasePluginInputError } from "@hot-updater/plugin-core";
5
+ //#region src/adapters/mongodbReads.ts
6
+ const findMongoRows = async (collections, input, session) => {
7
+ if (input.limit === 0) return [];
8
+ const rawOrderBy = input.orderBy;
9
+ const needsInMemoryOrder = hasNullOrderOverrides(rawOrderBy);
10
+ switch (input.model) {
11
+ case "bundles": {
12
+ const cursor = collections.bundles.find(activeBundleFilter(createMongoBundleWhere(input.where)), {
13
+ projection: WITHOUT_INTERNAL_FIELDS,
14
+ ...mongoSessionOptions(session)
15
+ }).skip(input.offset).limit(input.limit);
16
+ if (rawOrderBy === void 0) return cursor.toArray();
17
+ if (needsInMemoryOrder) return sortRowsByOrder(await collections.bundles.find(activeBundleFilter(createMongoBundleWhere(input.where)), {
18
+ projection: WITHOUT_INTERNAL_FIELDS,
19
+ ...mongoSessionOptions(session)
20
+ }).toArray(), rawOrderBy).slice(input.offset, input.offset + input.limit);
21
+ const sort = createMongoSort(input);
22
+ return sort === void 0 ? cursor.toArray() : cursor.sort(sort).toArray();
23
+ }
24
+ case "bundle_patches": {
25
+ const cursor = collections.bundlePatches.find(createMongoPatchWhere(input.where), {
26
+ projection: WITHOUT_MONGO_ID,
27
+ ...mongoSessionOptions(session)
28
+ }).skip(input.offset).limit(input.limit);
29
+ if (rawOrderBy === void 0) return cursor.toArray();
30
+ if (needsInMemoryOrder) return sortRowsByOrder(await collections.bundlePatches.find(createMongoPatchWhere(input.where), {
31
+ projection: WITHOUT_MONGO_ID,
32
+ ...mongoSessionOptions(session)
33
+ }).toArray(), rawOrderBy).slice(input.offset, input.offset + input.limit);
34
+ const sort = createMongoSort(input);
35
+ return sort === void 0 ? cursor.toArray() : cursor.sort(sort).toArray();
36
+ }
37
+ case "bundle_events": {
38
+ const cursor = collections.bundleEvents.find(createMongoEventWhere(input.where), {
39
+ projection: WITHOUT_MONGO_ID,
40
+ ...mongoSessionOptions(session)
41
+ }).skip(input.offset).limit(input.limit);
42
+ if (rawOrderBy === void 0) return cursor.toArray();
43
+ if (needsInMemoryOrder) return sortRowsByOrder(await collections.bundleEvents.find(createMongoEventWhere(input.where), {
44
+ projection: WITHOUT_MONGO_ID,
45
+ ...mongoSessionOptions(session)
46
+ }).toArray(), rawOrderBy).slice(input.offset, input.offset + input.limit);
47
+ const sort = createMongoSort(input);
48
+ return sort === void 0 ? cursor.toArray() : cursor.sort(sort).toArray();
49
+ }
50
+ case "api_keys": {
51
+ const cursor = collections.apiKeys.find(createMongoApiKeyWhere(input.where), {
52
+ projection: WITHOUT_MONGO_ID,
53
+ ...mongoSessionOptions(session)
54
+ }).skip(input.offset).limit(input.limit);
55
+ if (rawOrderBy === void 0) return cursor.toArray();
56
+ if (needsInMemoryOrder) return sortRowsByOrder(await collections.apiKeys.find(createMongoApiKeyWhere(input.where), {
57
+ projection: WITHOUT_MONGO_ID,
58
+ ...mongoSessionOptions(session)
59
+ }).toArray(), rawOrderBy).slice(input.offset, input.offset + input.limit);
60
+ const sort = createMongoSort(input);
61
+ return sort === void 0 ? cursor.toArray() : cursor.sort(sort).toArray();
62
+ }
63
+ case "channels": {
64
+ const cursor = collections.channels.find(createMongoChannelWhere(input.where), {
65
+ projection: WITHOUT_MONGO_ID,
66
+ ...mongoSessionOptions(session)
67
+ }).skip(input.offset).limit(input.limit);
68
+ if (rawOrderBy === void 0) return cursor.toArray();
69
+ if (needsInMemoryOrder) return sortRowsByOrder(await collections.channels.find(createMongoChannelWhere(input.where), {
70
+ projection: WITHOUT_MONGO_ID,
71
+ ...mongoSessionOptions(session)
72
+ }).toArray(), rawOrderBy).slice(input.offset, input.offset + input.limit);
73
+ const sort = createMongoSort(input);
74
+ return sort === void 0 ? cursor.toArray() : cursor.sort(sort).toArray();
75
+ }
76
+ case "releases": {
77
+ const cursor = collections.releases.find(createMongoReleaseWhere(input.where), {
78
+ projection: WITHOUT_MONGO_ID,
79
+ ...mongoSessionOptions(session)
80
+ }).skip(input.offset).limit(input.limit);
81
+ if (rawOrderBy === void 0) return cursor.toArray();
82
+ if (needsInMemoryOrder) return sortRowsByOrder(await collections.releases.find(createMongoReleaseWhere(input.where), {
83
+ projection: WITHOUT_MONGO_ID,
84
+ ...mongoSessionOptions(session)
85
+ }).toArray(), rawOrderBy).slice(input.offset, input.offset + input.limit);
86
+ const sort = createMongoSort(input);
87
+ return sort === void 0 ? cursor.toArray() : cursor.sort(sort).toArray();
88
+ }
89
+ case "release_catalogs": {
90
+ const cursor = collections.releaseCatalogs.find(createMongoReleaseCatalogWhere(input.where), {
91
+ projection: WITHOUT_MONGO_ID,
92
+ ...mongoSessionOptions(session)
93
+ }).skip(input.offset).limit(input.limit);
94
+ if (rawOrderBy === void 0) return cursor.toArray();
95
+ if (needsInMemoryOrder) return sortRowsByOrder(await collections.releaseCatalogs.find(createMongoReleaseCatalogWhere(input.where), {
96
+ projection: WITHOUT_MONGO_ID,
97
+ ...mongoSessionOptions(session)
98
+ }).toArray(), rawOrderBy).slice(input.offset, input.offset + input.limit);
99
+ const sort = createMongoSort(input);
100
+ return sort === void 0 ? cursor.toArray() : cursor.sort(sort).toArray();
101
+ }
102
+ }
103
+ };
104
+ const createMongoReads = (collections, session) => ({
105
+ count: async (input) => {
106
+ if (input.distinct !== void 0) throw new DatabasePluginInputError("invalid-operation");
107
+ switch (input.model) {
108
+ case "bundles": return collections.bundles.countDocuments(activeBundleFilter(createMongoBundleWhere(input.where)), mongoSessionOptions(session));
109
+ case "bundle_patches": return collections.bundlePatches.countDocuments(createMongoPatchWhere(input.where), mongoSessionOptions(session));
110
+ case "releases": return collections.releases.countDocuments(createMongoReleaseWhere(input.where), mongoSessionOptions(session));
111
+ }
112
+ },
113
+ findOne: async (input) => {
114
+ switch (input.model) {
115
+ case "bundles": return collections.bundles.findOne(activeBundleFilter(createMongoBundleWhere(input.where)), {
116
+ projection: WITHOUT_INTERNAL_FIELDS,
117
+ ...mongoSessionOptions(session)
118
+ });
119
+ case "channels": return collections.channels.findOne(createMongoChannelWhere(input.where), {
120
+ projection: WITHOUT_MONGO_ID,
121
+ ...mongoSessionOptions(session)
122
+ });
123
+ case "api_keys": return collections.apiKeys.findOne(createMongoApiKeyWhere(input.where), {
124
+ projection: WITHOUT_MONGO_ID,
125
+ ...mongoSessionOptions(session)
126
+ });
127
+ case "bundle_patches": return collections.bundlePatches.findOne(createMongoPatchWhere(input.where), {
128
+ projection: WITHOUT_MONGO_ID,
129
+ ...mongoSessionOptions(session)
130
+ });
131
+ case "releases": return collections.releases.findOne(createMongoReleaseWhere(input.where), {
132
+ projection: WITHOUT_MONGO_ID,
133
+ ...mongoSessionOptions(session)
134
+ });
135
+ case "release_catalogs": return collections.releaseCatalogs.findOne(createMongoReleaseCatalogWhere(input.where), {
136
+ projection: WITHOUT_MONGO_ID,
137
+ ...mongoSessionOptions(session)
138
+ });
139
+ }
140
+ },
141
+ findMany: (input) => {
142
+ if (input.distinctOn !== void 0) throw new DatabasePluginInputError("invalid-operation");
143
+ return findMongoRows(collections, input, session);
144
+ }
145
+ });
146
+ //#endregion
147
+ export { createMongoReads };
@@ -0,0 +1,134 @@
1
+ require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_mongodbCollections = require("./mongodbCollections.cjs");
3
+ const require_mongodbQuery = require("./mongodbQuery.cjs");
4
+ let _hot_updater_plugin_core = require("@hot-updater/plugin-core");
5
+ //#region src/adapters/mongodbWrites.ts
6
+ const assertPatchReferences = async (bundles, patch, session) => {
7
+ const ids = Array.from(new Set([patch.bundle_id, patch.base_bundle_id]));
8
+ if (await bundles.countDocuments(require_mongodbCollections.activeBundleFilter({ id: { $in: ids } }), require_mongodbCollections.mongoSessionOptions(session)) !== ids.length) throw new require_mongodbCollections.MongoAdapterConstraintError(`patch "${patch.id}" references a missing bundle`);
9
+ };
10
+ const createMongoWrites = (collections, session) => ({
11
+ deleteChannel: async ({ id }) => {
12
+ if (session === void 0) throw new require_mongodbCollections.MongoAdapterConstraintError("channel deletion requires transaction support");
13
+ if ((await collections.channels.updateOne({ id }, { $set: { id } }, require_mongodbCollections.mongoSessionOptions(session))).matchedCount !== 1) return {
14
+ deleted: false,
15
+ reason: "not_found"
16
+ };
17
+ if (await collections.releases.countDocuments({ channel_id: id }, require_mongodbCollections.mongoSessionOptions(session)) > 0) return {
18
+ deleted: false,
19
+ reason: "not_empty"
20
+ };
21
+ await collections.channels.deleteMany({ id }, require_mongodbCollections.mongoSessionOptions(session));
22
+ return { deleted: true };
23
+ },
24
+ insertChannel: async (input) => {
25
+ const result = await collections.channels.updateOne({ name: input.row.name }, { $setOnInsert: input.row }, {
26
+ upsert: true,
27
+ ...require_mongodbCollections.mongoSessionOptions(session)
28
+ });
29
+ const row = await collections.channels.findOne({ name: input.row.name }, require_mongodbCollections.mongoSessionOptions(session));
30
+ if (row === null) throw new require_mongodbCollections.MongoAdapterConstraintError("channels.insert.return-existing");
31
+ return {
32
+ row,
33
+ inserted: result.upsertedCount === 1
34
+ };
35
+ },
36
+ create: async (input) => {
37
+ switch (input.model) {
38
+ case "bundles":
39
+ await collections.bundles.insertOne(input.data, require_mongodbCollections.mongoSessionOptions(session));
40
+ return input.data;
41
+ case "bundle_patches":
42
+ await assertPatchReferences(collections.bundles, input.data, session);
43
+ await collections.bundlePatches.insertOne(input.data, require_mongodbCollections.mongoSessionOptions(session));
44
+ try {
45
+ await assertPatchReferences(collections.bundles, input.data, session);
46
+ } catch (error) {
47
+ await collections.bundlePatches.deleteMany({ id: input.data.id }, require_mongodbCollections.mongoSessionOptions(session));
48
+ throw error;
49
+ }
50
+ return input.data;
51
+ case "bundle_events":
52
+ await collections.bundleEvents.insertOne(input.data, require_mongodbCollections.mongoSessionOptions(session));
53
+ return input.data;
54
+ case "releases":
55
+ await collections.releases.insertOne(input.data, require_mongodbCollections.mongoSessionOptions(session));
56
+ return input.data;
57
+ case "release_catalogs":
58
+ await collections.releaseCatalogs.insertOne(input.data, require_mongodbCollections.mongoSessionOptions(session));
59
+ return input.data;
60
+ case "api_keys":
61
+ if (input.onConflict === "ignore") {
62
+ await collections.apiKeys.updateOne({ hash: input.data.hash }, { $setOnInsert: input.data }, {
63
+ upsert: true,
64
+ ...require_mongodbCollections.mongoSessionOptions(session)
65
+ });
66
+ return input.data;
67
+ }
68
+ await collections.apiKeys.insertOne(input.data, require_mongodbCollections.mongoSessionOptions(session));
69
+ return input.data;
70
+ case "channels":
71
+ if (input.onConflict === "ignore") {
72
+ await collections.channels.updateOne({ name: input.data.name }, { $setOnInsert: input.data }, {
73
+ upsert: true,
74
+ ...require_mongodbCollections.mongoSessionOptions(session)
75
+ });
76
+ return input.data;
77
+ }
78
+ await collections.channels.insertOne(input.data, require_mongodbCollections.mongoSessionOptions(session));
79
+ return input.data;
80
+ }
81
+ },
82
+ update: async (input) => {
83
+ if (input.model === "api_keys") return collections.apiKeys.findOneAndUpdate(require_mongodbQuery.createMongoApiKeyWhere(input.where), { $set: input.update }, {
84
+ projection: require_mongodbCollections.WITHOUT_INTERNAL_FIELDS,
85
+ returnDocument: "after",
86
+ ...require_mongodbCollections.mongoSessionOptions(session)
87
+ });
88
+ if (input.model === "releases") return collections.releases.findOneAndUpdate(require_mongodbQuery.createMongoReleaseWhere(input.where), { $set: input.update }, {
89
+ projection: require_mongodbCollections.WITHOUT_INTERNAL_FIELDS,
90
+ returnDocument: "after",
91
+ ...require_mongodbCollections.mongoSessionOptions(session)
92
+ });
93
+ if (input.model === "release_catalogs") return collections.releaseCatalogs.findOneAndUpdate(require_mongodbQuery.createMongoReleaseCatalogWhere(input.where), { $set: input.update }, {
94
+ projection: require_mongodbCollections.WITHOUT_INTERNAL_FIELDS,
95
+ returnDocument: "after",
96
+ ...require_mongodbCollections.mongoSessionOptions(session)
97
+ });
98
+ return collections.bundles.findOneAndUpdate(require_mongodbCollections.activeBundleFilter(require_mongodbQuery.createMongoBundleWhere(input.where)), { $set: input.update }, {
99
+ projection: require_mongodbCollections.WITHOUT_INTERNAL_FIELDS,
100
+ returnDocument: "after",
101
+ ...require_mongodbCollections.mongoSessionOptions(session)
102
+ });
103
+ },
104
+ delete: async (input) => {
105
+ switch (input.model) {
106
+ case "bundle_patches":
107
+ await collections.bundlePatches.deleteMany(require_mongodbQuery.createMongoPatchWhere(input.where), require_mongodbCollections.mongoSessionOptions(session));
108
+ return;
109
+ case "bundles": {
110
+ const deletionToken = (0, _hot_updater_plugin_core.createUUIDv7)();
111
+ await collections.bundles.updateMany(require_mongodbQuery.createMongoBundleWhere(input.where), { $set: { [require_mongodbCollections.DELETION_TOKEN_FIELD]: deletionToken } }, require_mongodbCollections.mongoSessionOptions(session));
112
+ const ids = (await collections.bundles.find({ [require_mongodbCollections.DELETION_TOKEN_FIELD]: deletionToken }, {
113
+ projection: {
114
+ _id: 0,
115
+ id: 1
116
+ },
117
+ ...require_mongodbCollections.mongoSessionOptions(session)
118
+ }).toArray()).map(({ id }) => id);
119
+ if (ids.length === 0) return;
120
+ await collections.bundlePatches.deleteMany({ $or: [{ bundle_id: { $in: ids } }, { base_bundle_id: { $in: ids } }] }, require_mongodbCollections.mongoSessionOptions(session));
121
+ await collections.bundles.deleteMany({ [require_mongodbCollections.DELETION_TOKEN_FIELD]: deletionToken }, require_mongodbCollections.mongoSessionOptions(session));
122
+ return;
123
+ }
124
+ case "releases":
125
+ await collections.releases.deleteMany(require_mongodbQuery.createMongoReleaseWhere(input.where), require_mongodbCollections.mongoSessionOptions(session));
126
+ return;
127
+ case "channels":
128
+ await collections.channels.deleteMany(require_mongodbQuery.createMongoChannelWhere(input.where), require_mongodbCollections.mongoSessionOptions(session));
129
+ return;
130
+ }
131
+ }
132
+ });
133
+ //#endregion
134
+ exports.createMongoWrites = createMongoWrites;
@@ -0,0 +1,133 @@
1
+ import { DELETION_TOKEN_FIELD, MongoAdapterConstraintError, WITHOUT_INTERNAL_FIELDS, activeBundleFilter, mongoSessionOptions } from "./mongodbCollections.mjs";
2
+ import { createMongoApiKeyWhere, createMongoBundleWhere, createMongoChannelWhere, createMongoPatchWhere, createMongoReleaseCatalogWhere, createMongoReleaseWhere } from "./mongodbQuery.mjs";
3
+ import { createUUIDv7 } from "@hot-updater/plugin-core";
4
+ //#region src/adapters/mongodbWrites.ts
5
+ const assertPatchReferences = async (bundles, patch, session) => {
6
+ const ids = Array.from(new Set([patch.bundle_id, patch.base_bundle_id]));
7
+ if (await bundles.countDocuments(activeBundleFilter({ id: { $in: ids } }), mongoSessionOptions(session)) !== ids.length) throw new MongoAdapterConstraintError(`patch "${patch.id}" references a missing bundle`);
8
+ };
9
+ const createMongoWrites = (collections, session) => ({
10
+ deleteChannel: async ({ id }) => {
11
+ if (session === void 0) throw new MongoAdapterConstraintError("channel deletion requires transaction support");
12
+ if ((await collections.channels.updateOne({ id }, { $set: { id } }, mongoSessionOptions(session))).matchedCount !== 1) return {
13
+ deleted: false,
14
+ reason: "not_found"
15
+ };
16
+ if (await collections.releases.countDocuments({ channel_id: id }, mongoSessionOptions(session)) > 0) return {
17
+ deleted: false,
18
+ reason: "not_empty"
19
+ };
20
+ await collections.channels.deleteMany({ id }, mongoSessionOptions(session));
21
+ return { deleted: true };
22
+ },
23
+ insertChannel: async (input) => {
24
+ const result = await collections.channels.updateOne({ name: input.row.name }, { $setOnInsert: input.row }, {
25
+ upsert: true,
26
+ ...mongoSessionOptions(session)
27
+ });
28
+ const row = await collections.channels.findOne({ name: input.row.name }, mongoSessionOptions(session));
29
+ if (row === null) throw new MongoAdapterConstraintError("channels.insert.return-existing");
30
+ return {
31
+ row,
32
+ inserted: result.upsertedCount === 1
33
+ };
34
+ },
35
+ create: async (input) => {
36
+ switch (input.model) {
37
+ case "bundles":
38
+ await collections.bundles.insertOne(input.data, mongoSessionOptions(session));
39
+ return input.data;
40
+ case "bundle_patches":
41
+ await assertPatchReferences(collections.bundles, input.data, session);
42
+ await collections.bundlePatches.insertOne(input.data, mongoSessionOptions(session));
43
+ try {
44
+ await assertPatchReferences(collections.bundles, input.data, session);
45
+ } catch (error) {
46
+ await collections.bundlePatches.deleteMany({ id: input.data.id }, mongoSessionOptions(session));
47
+ throw error;
48
+ }
49
+ return input.data;
50
+ case "bundle_events":
51
+ await collections.bundleEvents.insertOne(input.data, mongoSessionOptions(session));
52
+ return input.data;
53
+ case "releases":
54
+ await collections.releases.insertOne(input.data, mongoSessionOptions(session));
55
+ return input.data;
56
+ case "release_catalogs":
57
+ await collections.releaseCatalogs.insertOne(input.data, mongoSessionOptions(session));
58
+ return input.data;
59
+ case "api_keys":
60
+ if (input.onConflict === "ignore") {
61
+ await collections.apiKeys.updateOne({ hash: input.data.hash }, { $setOnInsert: input.data }, {
62
+ upsert: true,
63
+ ...mongoSessionOptions(session)
64
+ });
65
+ return input.data;
66
+ }
67
+ await collections.apiKeys.insertOne(input.data, mongoSessionOptions(session));
68
+ return input.data;
69
+ case "channels":
70
+ if (input.onConflict === "ignore") {
71
+ await collections.channels.updateOne({ name: input.data.name }, { $setOnInsert: input.data }, {
72
+ upsert: true,
73
+ ...mongoSessionOptions(session)
74
+ });
75
+ return input.data;
76
+ }
77
+ await collections.channels.insertOne(input.data, mongoSessionOptions(session));
78
+ return input.data;
79
+ }
80
+ },
81
+ update: async (input) => {
82
+ if (input.model === "api_keys") return collections.apiKeys.findOneAndUpdate(createMongoApiKeyWhere(input.where), { $set: input.update }, {
83
+ projection: WITHOUT_INTERNAL_FIELDS,
84
+ returnDocument: "after",
85
+ ...mongoSessionOptions(session)
86
+ });
87
+ if (input.model === "releases") return collections.releases.findOneAndUpdate(createMongoReleaseWhere(input.where), { $set: input.update }, {
88
+ projection: WITHOUT_INTERNAL_FIELDS,
89
+ returnDocument: "after",
90
+ ...mongoSessionOptions(session)
91
+ });
92
+ if (input.model === "release_catalogs") return collections.releaseCatalogs.findOneAndUpdate(createMongoReleaseCatalogWhere(input.where), { $set: input.update }, {
93
+ projection: WITHOUT_INTERNAL_FIELDS,
94
+ returnDocument: "after",
95
+ ...mongoSessionOptions(session)
96
+ });
97
+ return collections.bundles.findOneAndUpdate(activeBundleFilter(createMongoBundleWhere(input.where)), { $set: input.update }, {
98
+ projection: WITHOUT_INTERNAL_FIELDS,
99
+ returnDocument: "after",
100
+ ...mongoSessionOptions(session)
101
+ });
102
+ },
103
+ delete: async (input) => {
104
+ switch (input.model) {
105
+ case "bundle_patches":
106
+ await collections.bundlePatches.deleteMany(createMongoPatchWhere(input.where), mongoSessionOptions(session));
107
+ return;
108
+ case "bundles": {
109
+ const deletionToken = createUUIDv7();
110
+ await collections.bundles.updateMany(createMongoBundleWhere(input.where), { $set: { [DELETION_TOKEN_FIELD]: deletionToken } }, mongoSessionOptions(session));
111
+ const ids = (await collections.bundles.find({ [DELETION_TOKEN_FIELD]: deletionToken }, {
112
+ projection: {
113
+ _id: 0,
114
+ id: 1
115
+ },
116
+ ...mongoSessionOptions(session)
117
+ }).toArray()).map(({ id }) => id);
118
+ if (ids.length === 0) return;
119
+ await collections.bundlePatches.deleteMany({ $or: [{ bundle_id: { $in: ids } }, { base_bundle_id: { $in: ids } }] }, mongoSessionOptions(session));
120
+ await collections.bundles.deleteMany({ [DELETION_TOKEN_FIELD]: deletionToken }, mongoSessionOptions(session));
121
+ return;
122
+ }
123
+ case "releases":
124
+ await collections.releases.deleteMany(createMongoReleaseWhere(input.where), mongoSessionOptions(session));
125
+ return;
126
+ case "channels":
127
+ await collections.channels.deleteMany(createMongoChannelWhere(input.where), mongoSessionOptions(session));
128
+ return;
129
+ }
130
+ }
131
+ });
132
+ //#endregion
133
+ export { createMongoWrites };