@hot-updater/server 0.36.6 → 1.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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/analytics/bounded/activeOverview.cjs +87 -0
  44. package/dist/analytics/bounded/activeOverview.mjs +85 -0
  45. package/dist/analytics/bounded/installationSearch.cjs +42 -0
  46. package/dist/analytics/bounded/installationSearch.mjs +42 -0
  47. package/dist/analytics/bounded/persistence.cjs +39 -0
  48. package/dist/analytics/bounded/persistence.mjs +38 -0
  49. package/dist/analytics/bounded/provider.cjs +170 -0
  50. package/dist/analytics/bounded/provider.d.cts +7 -0
  51. package/dist/analytics/bounded/provider.d.mts +7 -0
  52. package/dist/analytics/bounded/provider.mjs +170 -0
  53. package/dist/analytics/bounded/scan.cjs +144 -0
  54. package/dist/analytics/bounded/scan.mjs +138 -0
  55. package/dist/analytics/domain.d.cts +121 -0
  56. package/dist/analytics/domain.d.mts +121 -0
  57. package/dist/analytics/errors.cjs +22 -0
  58. package/dist/analytics/errors.mjs +20 -0
  59. package/dist/analytics/eventInput.cjs +111 -0
  60. package/dist/analytics/eventInput.mjs +111 -0
  61. package/dist/analytics/persistence.d.cts +6 -0
  62. package/dist/analytics/persistence.d.mts +6 -0
  63. package/dist/analytics/queryInput.cjs +58 -0
  64. package/dist/analytics/queryInput.mjs +55 -0
  65. package/dist/analytics/routes.cjs +63 -0
  66. package/dist/analytics/routes.mjs +61 -0
  67. package/dist/analytics/types.d.cts +17 -0
  68. package/dist/analytics/types.d.mts +17 -0
  69. package/dist/apiKeys.cjs +139 -0
  70. package/dist/apiKeys.d.cts +50 -0
  71. package/dist/apiKeys.d.mts +50 -0
  72. package/dist/apiKeys.mjs +133 -0
  73. package/dist/createHotUpdaterCore.cjs +48 -26
  74. package/dist/createHotUpdaterCore.d.cts +49 -17
  75. package/dist/createHotUpdaterCore.d.mts +49 -17
  76. package/dist/createHotUpdaterCore.mjs +51 -29
  77. package/dist/db/createBundleDiff.cjs +45 -68
  78. package/dist/db/createBundleDiff.d.cts +3 -3
  79. package/dist/db/createBundleDiff.d.mts +3 -3
  80. package/dist/db/createBundleDiff.mjs +47 -68
  81. package/dist/db/databasePluginCore.cjs +138 -0
  82. package/dist/db/databasePluginCore.mjs +137 -0
  83. package/dist/db/fixedMigrator.cjs +36 -93
  84. package/dist/db/fixedMigrator.mjs +36 -93
  85. package/dist/db/fixedMigratorMongo.cjs +319 -0
  86. package/dist/db/fixedMigratorMongo.mjs +319 -0
  87. package/dist/db/fixedMigratorShared.cjs +23 -0
  88. package/dist/db/fixedMigratorShared.mjs +18 -0
  89. package/dist/db/mongoMigrationExecution.cjs +11 -0
  90. package/dist/db/mongoMigrationExecution.mjs +11 -0
  91. package/dist/db/releaseCatalog.cjs +66 -0
  92. package/dist/db/releaseCatalog.d.cts +17 -0
  93. package/dist/db/releaseCatalog.d.mts +17 -0
  94. package/dist/db/releaseCatalog.mjs +64 -0
  95. package/dist/db/schema/mongodb.cjs +14 -6
  96. package/dist/db/schema/mongodb.mjs +14 -6
  97. package/dist/db/schema/registry.cjs +0 -2
  98. package/dist/db/schema/registry.mjs +1 -2
  99. package/dist/db/schema/sql.cjs +31 -14
  100. package/dist/db/schema/sql.mjs +32 -13
  101. package/dist/db/schema/sqlOperations.cjs +4 -4
  102. package/dist/db/schema/sqlOperations.mjs +5 -5
  103. package/dist/db/schemaGenerators.cjs +52 -18
  104. package/dist/db/schemaGenerators.mjs +52 -18
  105. package/dist/db/schemaReadiness.cjs +4 -3
  106. package/dist/db/schemaReadiness.mjs +4 -3
  107. package/dist/db/sqlMigrationExecution.cjs +67 -0
  108. package/dist/db/sqlMigrationExecution.mjs +66 -0
  109. package/dist/db/types.cjs +2 -6
  110. package/dist/db/types.d.cts +60 -16
  111. package/dist/db/types.d.mts +60 -16
  112. package/dist/db/types.mjs +3 -6
  113. package/dist/db/updateArtifacts.cjs +114 -60
  114. package/dist/db/updateArtifacts.mjs +117 -62
  115. package/dist/handler.cjs +108 -282
  116. package/dist/handler.d.cts +3 -46
  117. package/dist/handler.d.mts +3 -46
  118. package/dist/handler.mjs +107 -281
  119. package/dist/handlerBundleRoutes.cjs +155 -0
  120. package/dist/handlerBundleRoutes.mjs +155 -0
  121. package/dist/handlerErrors.cjs +9 -0
  122. package/dist/handlerErrors.mjs +9 -0
  123. package/dist/handlerParameters.cjs +39 -0
  124. package/dist/handlerParameters.mjs +34 -0
  125. package/dist/handlerReleaseCatalogRoutes.cjs +111 -0
  126. package/dist/handlerReleaseCatalogRoutes.mjs +110 -0
  127. package/dist/handlerReleaseManagementRoutes.cjs +125 -0
  128. package/dist/handlerReleaseManagementRoutes.mjs +124 -0
  129. package/dist/handlerTypes.d.cts +63 -0
  130. package/dist/handlerTypes.d.mts +63 -0
  131. package/dist/handlerVersionRoutes.cjs +10 -0
  132. package/dist/handlerVersionRoutes.d.cts +4 -0
  133. package/dist/handlerVersionRoutes.d.mts +4 -0
  134. package/dist/handlerVersionRoutes.mjs +9 -0
  135. package/dist/index.cjs +10 -1
  136. package/dist/index.d.cts +9 -3
  137. package/dist/index.d.mts +9 -3
  138. package/dist/index.mjs +5 -2
  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/analytics/analytics.integration.spec.ts +144 -0
  188. package/src/analytics/bounded/activeOverview.spec.ts +189 -0
  189. package/src/analytics/bounded/activeOverview.ts +148 -0
  190. package/src/analytics/bounded/installationSearch.spec.ts +130 -0
  191. package/src/analytics/bounded/installationSearch.ts +69 -0
  192. package/src/analytics/bounded/persistence.ts +43 -0
  193. package/src/analytics/bounded/provider.spec.ts +219 -0
  194. package/src/analytics/bounded/provider.ts +229 -0
  195. package/src/analytics/bounded/scan.ts +235 -0
  196. package/src/analytics/domain.ts +139 -0
  197. package/src/analytics/errors.ts +18 -0
  198. package/src/analytics/eventInput.ts +168 -0
  199. package/src/analytics/persistence.ts +10 -0
  200. package/src/analytics/queryInput.ts +102 -0
  201. package/src/analytics/routes.ts +123 -0
  202. package/src/analytics/types.ts +44 -0
  203. package/src/apiKeys.integration.spec.ts +192 -0
  204. package/src/apiKeys.spec.ts +162 -0
  205. package/src/apiKeys.ts +220 -0
  206. package/src/createHotUpdaterCore.ts +164 -100
  207. package/src/db/bundleRows.spec.ts +164 -0
  208. package/src/db/bundleRows.ts +10 -140
  209. package/src/db/createBundleDiff.spec.ts +172 -127
  210. package/src/db/createBundleDiff.ts +91 -110
  211. package/src/db/databasePluginCore.spec.ts +62 -0
  212. package/src/db/databasePluginCore.testFixtures.ts +76 -0
  213. package/src/db/databasePluginCore.ts +185 -0
  214. package/src/db/databasePluginUpdateCheck.bench.ts +107 -0
  215. package/src/db/fixedMigrator.spec.ts +184 -42
  216. package/src/db/fixedMigrator.ts +64 -205
  217. package/src/db/fixedMigratorMongo.spec.ts +192 -0
  218. package/src/db/fixedMigratorMongo.ts +425 -0
  219. package/src/db/fixedMigratorShared.ts +36 -0
  220. package/src/db/hotUpdaterSchema.ts +0 -1
  221. package/src/db/index.spec.ts +333 -1025
  222. package/src/db/mongoMigrationExecution.ts +23 -0
  223. package/src/db/node-sqlite.d.ts +25 -0
  224. package/src/db/releaseCatalog.ts +148 -0
  225. package/src/db/schema/mongodb.ts +20 -6
  226. package/src/db/schema/sql.ts +52 -11
  227. package/src/db/schema/sqlOperations.ts +5 -4
  228. package/src/db/schemaGenerators.ts +107 -23
  229. package/src/db/schemaReadiness.ts +2 -1
  230. package/src/db/sqlMigrationExecution.spec.ts +65 -0
  231. package/src/db/sqlMigrationExecution.ts +108 -0
  232. package/src/db/types.spec.ts +55 -0
  233. package/src/db/types.ts +129 -65
  234. package/src/db/updateArtifacts.spec.ts +359 -0
  235. package/src/db/updateArtifacts.ts +290 -126
  236. package/src/handler-standalone.integration.spec.ts +401 -364
  237. package/src/handler.spec.ts +137 -582
  238. package/src/handler.testFixtures.ts +30 -0
  239. package/src/handler.ts +218 -616
  240. package/src/handlerAuth.integration.spec.ts +33 -0
  241. package/src/handlerBundleRoutes.ts +259 -0
  242. package/src/handlerErrors.ts +7 -0
  243. package/src/handlerManagement.spec.ts +262 -0
  244. package/src/handlerParameters.ts +105 -0
  245. package/src/handlerReleaseCatalogRoutes.ts +154 -0
  246. package/src/handlerReleaseManagementRoutes.ts +213 -0
  247. package/src/handlerTypes.ts +96 -0
  248. package/src/handlerVersionRoutes.ts +12 -0
  249. package/src/index.ts +22 -2
  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
@@ -1,190 +1,67 @@
1
1
  import { getHotUpdaterSchemaVersion, hotUpdaterSchema } from "../db/schema/registry.mjs";
2
2
  import { generateDrizzleSchema } from "../db/schemaGenerators.mjs";
3
- import { bundleToPatchRows, bundleToRow, rowToBundle } from "../db/bundleRows.mjs";
3
+ import { createDrizzleCrud } from "./drizzleCrud.mjs";
4
4
  import { createLazyDB } from "./drizzleLazyDB.mjs";
5
- import { calculatePagination, createDatabasePlugin, filterCompatibleAppVersions, resolveUpdateInfoFromBundles } from "@hot-updater/plugin-core";
6
- import { NIL_UUID } from "@hot-updater/core";
7
- import { and, asc, desc, eq, gt, gte, inArray, isNotNull, isNull, lt, lte } from "drizzle-orm";
5
+ import { createDatabasePlugin } from "@hot-updater/plugin-core";
6
+ import { createDatabasePluginAdapter } from "@hot-updater/plugin-core/internal";
8
7
  //#region src/adapters/drizzle.ts
9
- const getTable = (db, name) => {
10
- const table = db._.fullSchema[name];
11
- if (!table) throw new Error(`Drizzle schema is missing table "${name}".`);
12
- return table;
8
+ const createImplementation = (config) => {
9
+ const db = createLazyDB(config);
10
+ const crud = createDrizzleCrud(db, config.provider);
11
+ const transaction = db.transaction?.bind(db);
12
+ return {
13
+ ...crud,
14
+ deleteChannel: (input) => {
15
+ if (transaction === void 0) throw new Error("Drizzle channel deletion requires transaction support.");
16
+ return transaction((transactionDatabase) => createDrizzleCrud(transactionDatabase, config.provider).deleteChannel(input));
17
+ },
18
+ ...transaction ? { delete: (input) => transaction((transactionDatabase) => createDrizzleCrud(transactionDatabase, config.provider).delete(input)) } : {},
19
+ ...transaction ? { transaction: async (callback) => transaction((transaction) => callback(createDrizzleCrud(transaction, config.provider))) } : {}
20
+ };
13
21
  };
14
- const column = (table, name) => table[name];
15
- const buildWhere = (table, where) => {
16
- const conditions = [];
17
- if (where?.channel !== void 0) conditions.push(eq(column(table, "channel"), where.channel));
18
- if (where?.platform !== void 0) conditions.push(eq(column(table, "platform"), where.platform));
19
- if (where?.enabled !== void 0) conditions.push(eq(column(table, "enabled"), where.enabled));
20
- if (where?.fingerprintHash !== void 0) conditions.push(where.fingerprintHash === null ? isNull(column(table, "fingerprint_hash")) : eq(column(table, "fingerprint_hash"), where.fingerprintHash));
21
- if (where?.targetAppVersion !== void 0) conditions.push(where.targetAppVersion === null ? isNull(column(table, "target_app_version")) : eq(column(table, "target_app_version"), where.targetAppVersion));
22
- if (where?.targetAppVersionIn) conditions.push(inArray(column(table, "target_app_version"), where.targetAppVersionIn));
23
- if (where?.targetAppVersionNotNull) conditions.push(isNotNull(column(table, "target_app_version")));
24
- if (where?.id?.eq) conditions.push(eq(column(table, "id"), where.id.eq));
25
- if (where?.id?.gt) conditions.push(gt(column(table, "id"), where.id.gt));
26
- if (where?.id?.gte) conditions.push(gte(column(table, "id"), where.id.gte));
27
- if (where?.id?.lt) conditions.push(lt(column(table, "id"), where.id.lt));
28
- if (where?.id?.lte) conditions.push(lte(column(table, "id"), where.id.lte));
29
- if (where?.id?.in) conditions.push(inArray(column(table, "id"), where.id.in));
30
- return conditions.length > 0 ? and(...conditions) : void 0;
31
- };
32
- const createDrizzlePlugin = createDatabasePlugin({
33
- name: "drizzle",
34
- factory: (config) => {
35
- const db = createLazyDB(config);
36
- const bundles = getTable(db, "bundles");
37
- const patches = getTable(db, "bundle_patches");
38
- const runInTransaction = async (operation) => {
39
- if (typeof db.transaction !== "function") return operation(db);
40
- return db.transaction(operation);
41
- };
42
- const fetchPatchMap = async (bundleIds) => {
43
- const patchMap = /* @__PURE__ */ new Map();
44
- if (bundleIds.length === 0) return patchMap;
45
- const rows = await db.query["bundle_patches"]?.findMany({
46
- where: inArray(column(patches, "bundle_id"), [...bundleIds]),
47
- orderBy: [asc(column(patches, "order_index"))]
48
- });
49
- for (const row of rows ?? []) {
50
- const patch = row;
51
- const current = patchMap.get(patch.bundle_id) ?? [];
52
- current.push(patch);
53
- patchMap.set(patch.bundle_id, current);
54
- }
55
- return patchMap;
56
- };
57
- const mapRowsToBundles = async (rows) => {
58
- const patchMap = await fetchPatchMap(rows.map((row) => String(row["id"])));
59
- return rows.map((row) => rowToBundle(row, patchMap.get(String(row["id"])) ?? []));
60
- };
61
- const upsertBundle = async (activeDB, bundle) => {
62
- const row = bundleToRow(bundle);
63
- if (await activeDB.query["bundles"]?.findFirst({ where: eq(column(bundles, "id"), bundle.id) })) await activeDB.update(bundles).set(row).where(eq(column(bundles, "id"), bundle.id));
64
- else {
65
- const inserted = activeDB.insert(bundles).values(row);
66
- if (inserted.execute) await inserted.execute();
67
- else await inserted;
68
- }
69
- await activeDB.delete(patches).where(eq(column(patches, "bundle_id"), bundle.id));
70
- const patchRows = bundleToPatchRows(bundle);
71
- if (patchRows.length > 0) {
72
- const inserted = activeDB.insert(patches).values(patchRows);
73
- if (inserted.execute) await inserted.execute();
74
- else await inserted;
75
- }
76
- };
77
- return {
78
- async getBundleById(bundleId) {
79
- const row = await db.query["bundles"]?.findFirst({ where: eq(column(bundles, "id"), bundleId) });
80
- if (!row) return null;
81
- return rowToBundle(row, (await fetchPatchMap([bundleId])).get(bundleId) ?? []);
22
+ const drizzleAdapter = (config) => {
23
+ let adapter;
24
+ const getAdapter = () => {
25
+ adapter ??= createDatabasePluginAdapter("drizzle", createImplementation(config));
26
+ return adapter;
27
+ };
28
+ const plugin = createDatabasePlugin({
29
+ name: "drizzle",
30
+ models: {
31
+ bundles: {
32
+ findById: (id) => getAdapter().models.bundles.findById(id),
33
+ findMany: (query) => getAdapter().models.bundles.findMany(query),
34
+ count: (where) => getAdapter().models.bundles.count(where)
35
+ },
36
+ bundlePatches: { findByBundleIds: (bundleIds) => getAdapter().models.bundlePatches.findByBundleIds(bundleIds) },
37
+ releases: {
38
+ findById: (id) => getAdapter().models.releases.findById(id),
39
+ findMany: (input) => getAdapter().models.releases.findMany(input),
40
+ findManyByScope: (input) => getAdapter().models.releases.findManyByScope(input)
82
41
  },
83
- async getBundles(options) {
84
- const offset = options.offset ?? 0;
85
- const orderBy = options.orderBy ?? {
86
- field: "id",
87
- direction: "desc"
88
- };
89
- const where = buildWhere(bundles, options.where);
90
- const total = await db.$count(bundles, where);
91
- const dataRows = await db.query["bundles"]?.findMany({
92
- where,
93
- orderBy: [orderBy.direction === "asc" ? asc(column(bundles, "id")) : desc(column(bundles, "id"))],
94
- limit: options.limit,
95
- offset
96
- }) ?? [];
97
- const patchMap = await fetchPatchMap(dataRows.map((row) => String(row["id"])));
98
- return {
99
- data: dataRows.map((row) => rowToBundle(row, patchMap.get(String(row["id"])) ?? [])),
100
- pagination: calculatePagination(total, {
101
- limit: options.limit,
102
- offset
103
- })
104
- };
42
+ releaseCatalogs: {
43
+ findByScopeKey: (scopeKey) => getAdapter().models.releaseCatalogs.findByScopeKey(scopeKey),
44
+ findMany: (input) => getAdapter().models.releaseCatalogs.findMany(input)
105
45
  },
106
- async getUpdateInfo(args, context) {
107
- if (args._updateStrategy === "appVersion") {
108
- const channel = args.channel ?? "production";
109
- const minBundleId = args.minBundleId ?? NIL_UUID;
110
- const rows = await db.query["bundles"]?.findMany({
111
- columns: { target_app_version: true },
112
- where: buildWhere(bundles, {
113
- enabled: true,
114
- platform: args.platform,
115
- channel,
116
- id: { gte: minBundleId },
117
- targetAppVersionNotNull: true
118
- })
119
- });
120
- const compatibleAppVersions = filterCompatibleAppVersions(Array.from(new Set((rows ?? []).map((row) => row["target_app_version"]).filter((value) => typeof value === "string" && value.length > 0))), args.appVersion);
121
- const updateRows = compatibleAppVersions.length > 0 ? await db.query["bundles"]?.findMany({
122
- where: buildWhere(bundles, {
123
- enabled: true,
124
- platform: args.platform,
125
- channel,
126
- id: { gte: minBundleId },
127
- targetAppVersionIn: compatibleAppVersions
128
- }),
129
- orderBy: [desc(column(bundles, "id"))]
130
- }) : [];
131
- return resolveUpdateInfoFromBundles({
132
- args: {
133
- ...args,
134
- channel,
135
- minBundleId
136
- },
137
- bundles: await mapRowsToBundles(updateRows ?? []),
138
- context
139
- });
140
- }
141
- const channel = args.channel ?? "production";
142
- const minBundleId = args.minBundleId ?? NIL_UUID;
143
- const rows = await db.query["bundles"]?.findMany({
144
- where: buildWhere(bundles, {
145
- enabled: true,
146
- platform: args.platform,
147
- channel,
148
- id: { gte: minBundleId },
149
- fingerprintHash: args.fingerprintHash
150
- }),
151
- orderBy: [desc(column(bundles, "id"))]
152
- });
153
- return resolveUpdateInfoFromBundles({
154
- args: {
155
- ...args,
156
- channel,
157
- minBundleId
158
- },
159
- bundles: await mapRowsToBundles(rows ?? []),
160
- context
161
- });
46
+ channels: {
47
+ insert: (input) => getAdapter().models.channels.insert(input),
48
+ list: (input) => getAdapter().models.channels.list(input),
49
+ delete: (input) => getAdapter().models.channels.delete(input)
162
50
  },
163
- async getChannels() {
164
- const rows = await db.query["bundles"]?.findMany({
165
- columns: { channel: true },
166
- orderBy: [asc(column(bundles, "channel"))]
167
- });
168
- return Array.from(new Set((rows ?? []).map((row) => String(row["channel"]))));
51
+ analytics: {
52
+ append: (row) => getAdapter().models.analytics.append(row),
53
+ scan: (input) => getAdapter().models.analytics.scan(input)
169
54
  },
170
- async commitBundle({ changedSets }) {
171
- await runInTransaction(async (activeDB) => {
172
- for (const change of changedSets) {
173
- if (change.operation === "delete") {
174
- await activeDB.delete(patches).where(eq(column(patches, "bundle_id"), change.data.id));
175
- await activeDB.delete(patches).where(eq(column(patches, "base_bundle_id"), change.data.id));
176
- await activeDB.delete(bundles).where(eq(column(bundles, "id"), change.data.id));
177
- continue;
178
- }
179
- await upsertBundle(activeDB, change.data);
180
- }
181
- });
55
+ apiKeys: {
56
+ create: (row) => getAdapter().models.apiKeys.create(row),
57
+ findByHash: (hash) => getAdapter().models.apiKeys.findByHash(hash),
58
+ list: () => getAdapter().models.apiKeys.list(),
59
+ revoke: (input) => getAdapter().models.apiKeys.revoke(input)
182
60
  }
183
- };
184
- }
185
- });
186
- const drizzleAdapter = (config) => {
187
- return Object.assign(createDrizzlePlugin(config), {
61
+ },
62
+ commit: (input) => getAdapter().commit(input)
63
+ });
64
+ return Object.assign(plugin, {
188
65
  adapterName: "drizzle",
189
66
  provider: config.provider,
190
67
  generateSchema: (version) => ({
@@ -0,0 +1,250 @@
1
+ require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_databaseConstraintErrors = require("./databaseConstraintErrors.cjs");
3
+ const require_databasePluginUtils = require("./databasePluginUtils.cjs");
4
+ const require_drizzleQuery = require("./drizzleQuery.cjs");
5
+ let _hot_updater_plugin_core = require("@hot-updater/plugin-core");
6
+ let drizzle_orm = require("drizzle-orm");
7
+ //#region src/adapters/drizzleCrud.ts
8
+ var MissingDrizzleTableError = class extends Error {
9
+ name = "MissingDrizzleTableError";
10
+ constructor(table) {
11
+ super(`Drizzle schema is missing table "${table}".`);
12
+ this.table = table;
13
+ }
14
+ };
15
+ var DrizzleAdapterInvariantError = class extends Error {
16
+ name = "DrizzleAdapterInvariantError";
17
+ };
18
+ const getDrizzleTable = (db, name) => {
19
+ const table = db._.fullSchema[name];
20
+ if (table === void 0) throw new MissingDrizzleTableError(name);
21
+ return table;
22
+ };
23
+ const isSQLWrapper = (value) => typeof value === "object" && value !== null && "getSQL" in value && typeof value.getSQL === "function";
24
+ const getDrizzleColumn = (table, name) => {
25
+ const value = table[name];
26
+ if (!isSQLWrapper(value)) throw new MissingDrizzleTableError(`${name} column`);
27
+ return value;
28
+ };
29
+ const executeInsert = async (db, provider, table, data, onConflict) => {
30
+ const builder = db.insert(table);
31
+ const insert = builder.values(data);
32
+ if (onConflict === void 0) {
33
+ await insert.execute();
34
+ return;
35
+ }
36
+ const ignored = provider === "mysql" ? builder.ignore?.().values(data) : insert.onConflictDoNothing?.();
37
+ if (ignored === void 0) throw new DrizzleAdapterInvariantError();
38
+ await ignored.execute();
39
+ };
40
+ const toOrderBy = (table, input) => {
41
+ return input.orderBy?.flatMap((clause) => {
42
+ const column = getDrizzleColumn(table, clause.field);
43
+ return [(clause.nulls ?? (clause.direction === "asc" ? "last" : "first")) === "first" ? drizzle_orm.sql`${column} is null desc` : drizzle_orm.sql`${column} is null asc`, clause.direction === "asc" ? (0, drizzle_orm.asc)(column) : (0, drizzle_orm.desc)(column)];
44
+ });
45
+ };
46
+ const createDrizzleCrud = (db, provider) => {
47
+ const bundles = getDrizzleTable(db, "bundles");
48
+ const patches = getDrizzleTable(db, "bundle_patches");
49
+ const events = getDrizzleTable(db, "bundle_events");
50
+ const releases = getDrizzleTable(db, "releases");
51
+ const releaseCatalogs = getDrizzleTable(db, "release_catalogs");
52
+ const channels = getDrizzleTable(db, "channels");
53
+ const apiKeys = getDrizzleTable(db, "api_keys");
54
+ return {
55
+ async deleteChannel({ id }) {
56
+ const idPredicate = (0, drizzle_orm.eq)(getDrizzleColumn(channels, "id"), id);
57
+ if (await db.query.channels.findFirst({ where: idPredicate }) === void 0) return {
58
+ deleted: false,
59
+ reason: "not_found"
60
+ };
61
+ if (await db.$count(releases, (0, drizzle_orm.eq)(getDrizzleColumn(releases, "channel_id"), id)) > 0) return {
62
+ deleted: false,
63
+ reason: "not_empty"
64
+ };
65
+ try {
66
+ await db.delete(channels).where(idPredicate).execute();
67
+ } catch (error) {
68
+ if (require_databaseConstraintErrors.isChannelDeleteReferencedError(error)) return {
69
+ deleted: false,
70
+ reason: "not_empty"
71
+ };
72
+ throw error;
73
+ }
74
+ return { deleted: true };
75
+ },
76
+ async insertChannel(input) {
77
+ const before = await db.query.channels.findFirst({ where: (0, drizzle_orm.eq)(getDrizzleColumn(channels, "name"), input.row.name) });
78
+ if (before !== void 0) return {
79
+ row: before,
80
+ inserted: false
81
+ };
82
+ await executeInsert(db, provider, channels, input.row, "ignore");
83
+ const row = await db.query.channels.findFirst({ where: (0, drizzle_orm.eq)(getDrizzleColumn(channels, "name"), input.row.name) });
84
+ if (row === void 0) throw new DrizzleAdapterInvariantError();
85
+ return {
86
+ row,
87
+ inserted: row.id === input.row.id
88
+ };
89
+ },
90
+ async create(input) {
91
+ switch (input.model) {
92
+ case "bundles":
93
+ await executeInsert(db, provider, bundles, require_databasePluginUtils.toStoredBundleRow(input.data, provider), void 0);
94
+ return input.data;
95
+ case "bundle_patches":
96
+ await executeInsert(db, provider, patches, input.data, void 0);
97
+ return input.data;
98
+ case "bundle_events":
99
+ await executeInsert(db, provider, events, input.data, void 0);
100
+ return input.data;
101
+ case "releases":
102
+ await executeInsert(db, provider, releases, require_databasePluginUtils.toStoredReleaseRow(input.data, provider), void 0);
103
+ return input.data;
104
+ case "release_catalogs":
105
+ await executeInsert(db, provider, releaseCatalogs, input.data, void 0);
106
+ return input.data;
107
+ case "api_keys":
108
+ await executeInsert(db, provider, apiKeys, input.data, input.onConflict);
109
+ return input.data;
110
+ case "channels":
111
+ await executeInsert(db, provider, channels, input.data, input.onConflict);
112
+ return input.data;
113
+ }
114
+ },
115
+ async update(input) {
116
+ const selector = input.where[0];
117
+ if (selector === void 0 || typeof selector.value !== "string") throw new DrizzleAdapterInvariantError();
118
+ if (input.model === "api_keys") {
119
+ const idPredicate = (0, drizzle_orm.eq)(getDrizzleColumn(apiKeys, "id"), selector.value);
120
+ await db.update(apiKeys).set(input.update).where(idPredicate).execute();
121
+ return await db.query.api_keys.findFirst({ where: idPredicate }) ?? null;
122
+ }
123
+ if (input.model === "releases") {
124
+ const idPredicate = (0, drizzle_orm.eq)(getDrizzleColumn(releases, "id"), selector.value);
125
+ await db.update(releases).set(require_databasePluginUtils.toStoredReleaseUpdate(input.update, provider)).where(idPredicate).execute();
126
+ const row = await db.query.releases.findFirst({ where: idPredicate });
127
+ return row === void 0 ? null : require_databasePluginUtils.fromStoredReleaseRow(row);
128
+ }
129
+ if (input.model === "release_catalogs") {
130
+ const scopePredicate = (0, drizzle_orm.eq)(getDrizzleColumn(releaseCatalogs, "scope_key"), selector.value);
131
+ await db.update(releaseCatalogs).set(input.update).where(scopePredicate).execute();
132
+ const row = await db.query.release_catalogs.findFirst({ where: scopePredicate });
133
+ return row === void 0 ? null : require_databasePluginUtils.fromStoredReleaseCatalogRow(row);
134
+ }
135
+ const idPredicate = (0, drizzle_orm.eq)(getDrizzleColumn(bundles, "id"), selector.value);
136
+ await db.update(bundles).set(require_databasePluginUtils.toStoredBundleUpdate(input.update, provider)).where(idPredicate).execute();
137
+ const stored = await db.query.bundles.findFirst({ where: idPredicate });
138
+ if (stored === void 0) return null;
139
+ return require_databasePluginUtils.fromStoredBundleRow(stored);
140
+ },
141
+ async delete(input) {
142
+ switch (input.model) {
143
+ case "bundles": {
144
+ const where = require_drizzleQuery.buildDrizzleWhere(provider, bundles, input.where);
145
+ if (where === void 0) throw new DrizzleAdapterInvariantError();
146
+ await db.delete(bundles).where(where).execute();
147
+ return;
148
+ }
149
+ case "bundle_patches": {
150
+ const where = require_drizzleQuery.buildDrizzleWhere(provider, patches, input.where);
151
+ if (where === void 0) throw new DrizzleAdapterInvariantError();
152
+ await db.delete(patches).where(where).execute();
153
+ return;
154
+ }
155
+ case "releases": {
156
+ const where = require_drizzleQuery.buildDrizzleWhere(provider, releases, input.where);
157
+ if (where === void 0) throw new DrizzleAdapterInvariantError();
158
+ await db.delete(releases).where(where).execute();
159
+ return;
160
+ }
161
+ case "channels": {
162
+ const where = require_drizzleQuery.buildDrizzleWhere(provider, channels, input.where);
163
+ if (where === void 0) throw new DrizzleAdapterInvariantError();
164
+ try {
165
+ await db.delete(channels).where(where).execute();
166
+ } catch (error) {
167
+ require_databaseConstraintErrors.translateChannelDeleteError(error);
168
+ }
169
+ return;
170
+ }
171
+ }
172
+ },
173
+ async count(input) {
174
+ if (input.distinct !== void 0) throw new _hot_updater_plugin_core.DatabasePluginInputError("invalid-operation");
175
+ switch (input.model) {
176
+ case "bundles": return db.$count(bundles, require_drizzleQuery.buildDrizzleWhere(provider, bundles, input.where));
177
+ case "bundle_patches": return db.$count(patches, require_drizzleQuery.buildDrizzleWhere(provider, patches, input.where));
178
+ case "releases": return db.$count(releases, require_drizzleQuery.buildDrizzleWhere(provider, releases, input.where));
179
+ }
180
+ },
181
+ async findOne(input) {
182
+ switch (input.model) {
183
+ case "bundles": {
184
+ const row = await db.query.bundles.findFirst({ where: require_drizzleQuery.buildDrizzleWhere(provider, bundles, input.where) });
185
+ return row === void 0 ? null : require_databasePluginUtils.fromStoredBundleRow(row);
186
+ }
187
+ case "bundle_patches": return await db.query.bundle_patches.findFirst({ where: require_drizzleQuery.buildDrizzleWhere(provider, patches, input.where) }) ?? null;
188
+ case "api_keys": return await db.query.api_keys.findFirst({ where: require_drizzleQuery.buildDrizzleWhere(provider, apiKeys, input.where) }) ?? null;
189
+ case "channels": return await db.query.channels.findFirst({ where: require_drizzleQuery.buildDrizzleWhere(provider, channels, input.where) }) ?? null;
190
+ case "releases": {
191
+ const row = await db.query.releases.findFirst({ where: require_drizzleQuery.buildDrizzleWhere(provider, releases, input.where) });
192
+ return row === void 0 ? null : require_databasePluginUtils.fromStoredReleaseRow(row);
193
+ }
194
+ case "release_catalogs": {
195
+ const row = await db.query.release_catalogs.findFirst({ where: require_drizzleQuery.buildDrizzleWhere(provider, releaseCatalogs, input.where) });
196
+ return row === void 0 ? null : require_databasePluginUtils.fromStoredReleaseCatalogRow(row);
197
+ }
198
+ }
199
+ },
200
+ async findMany(input) {
201
+ if (input.distinctOn !== void 0) throw new _hot_updater_plugin_core.DatabasePluginInputError("invalid-operation");
202
+ switch (input.model) {
203
+ case "bundles": return (await db.query.bundles.findMany({
204
+ where: require_drizzleQuery.buildDrizzleWhere(provider, bundles, input.where),
205
+ orderBy: toOrderBy(bundles, input),
206
+ limit: input.limit,
207
+ offset: input.offset
208
+ })).map(require_databasePluginUtils.fromStoredBundleRow);
209
+ case "bundle_events": return db.query.bundle_events.findMany({
210
+ where: require_drizzleQuery.buildDrizzleWhere(provider, events, input.where),
211
+ orderBy: toOrderBy(events, input),
212
+ limit: input.limit,
213
+ offset: input.offset
214
+ });
215
+ case "api_keys": return db.query.api_keys.findMany({
216
+ where: require_drizzleQuery.buildDrizzleWhere(provider, apiKeys, input.where),
217
+ orderBy: toOrderBy(apiKeys, input),
218
+ limit: input.limit,
219
+ offset: input.offset
220
+ });
221
+ case "bundle_patches": return db.query.bundle_patches.findMany({
222
+ where: require_drizzleQuery.buildDrizzleWhere(provider, patches, input.where),
223
+ orderBy: toOrderBy(patches, input),
224
+ limit: input.limit,
225
+ offset: input.offset
226
+ });
227
+ case "channels": return db.query.channels.findMany({
228
+ where: require_drizzleQuery.buildDrizzleWhere(provider, channels, input.where),
229
+ orderBy: toOrderBy(channels, input),
230
+ limit: input.limit,
231
+ offset: input.offset
232
+ });
233
+ case "releases": return (await db.query.releases.findMany({
234
+ where: require_drizzleQuery.buildDrizzleWhere(provider, releases, input.where),
235
+ orderBy: toOrderBy(releases, input),
236
+ limit: input.limit,
237
+ offset: input.offset
238
+ })).map(require_databasePluginUtils.fromStoredReleaseRow);
239
+ case "release_catalogs": return (await db.query.release_catalogs.findMany({
240
+ where: require_drizzleQuery.buildDrizzleWhere(provider, releaseCatalogs, input.where),
241
+ orderBy: toOrderBy(releaseCatalogs, input),
242
+ limit: input.limit,
243
+ offset: input.offset
244
+ })).map(require_databasePluginUtils.fromStoredReleaseCatalogRow);
245
+ }
246
+ }
247
+ };
248
+ };
249
+ //#endregion
250
+ exports.createDrizzleCrud = createDrizzleCrud;