@hot-updater/server 0.36.7 → 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
@@ -0,0 +1,124 @@
1
+ import { HandlerBadRequestError } from "./handlerErrors.mjs";
2
+ import { decodeMaybe, requireRouteParam } from "./handlerParameters.mjs";
3
+ import { ReleaseCatalogMutationError, ReleaseManagementError } from "@hot-updater/plugin-core";
4
+ //#region src/handlerReleaseManagementRoutes.ts
5
+ const unavailable = () => Response.json({ error: "Not found" }, { status: 404 });
6
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
7
+ const parseRevision = (value) => {
8
+ if (value === void 0 || value === null || value === "") return void 0;
9
+ const revision = typeof value === "number" ? value : Number(value);
10
+ if (!Number.isSafeInteger(revision) || revision < 1) throw new HandlerBadRequestError("Invalid expected Release revision");
11
+ return revision;
12
+ };
13
+ const parsePolicyInput = async (request) => {
14
+ const body = await request.json();
15
+ if (!isRecord(body) || !isRecord(body.patch)) throw new HandlerBadRequestError("Invalid Release policy mutation");
16
+ return {
17
+ expectedRevision: parseRevision(body.expectedRevision),
18
+ patch: body.patch
19
+ };
20
+ };
21
+ const mutationResponse = async (operation) => {
22
+ try {
23
+ return Response.json({ data: await operation() });
24
+ } catch (error) {
25
+ if (error instanceof ReleaseManagementError || error instanceof ReleaseCatalogMutationError) {
26
+ const status = error.code === "RELEASE_NOT_FOUND" ? 404 : error.code === "VERSION_CONFLICT" ? 409 : 400;
27
+ return Response.json({
28
+ code: error.code,
29
+ error: error.message
30
+ }, { status });
31
+ }
32
+ throw error;
33
+ }
34
+ };
35
+ const createReleaseManagementRouteHandlers = () => ({
36
+ getRelease: async (params, _request, api) => {
37
+ if (api.getReleaseById === void 0) return unavailable();
38
+ const row = await api.getReleaseById(requireRouteParam(params, "id"));
39
+ return row === null ? unavailable() : Response.json({ data: row }, { status: 200 });
40
+ },
41
+ getReleases: async (_params, request, api) => {
42
+ const url = new URL(request.url);
43
+ const scopeKey = url.searchParams.get("scopeKey");
44
+ const limit = Number(url.searchParams.get("limit") ?? "100");
45
+ if (!Number.isSafeInteger(limit) || limit <= 0 || limit > 1e3) throw new HandlerBadRequestError("Invalid Release scope query");
46
+ if (scopeKey !== null) {
47
+ if (scopeKey.length === 0 || api.getReleasesByScope === void 0) throw new HandlerBadRequestError("Invalid Release scope query");
48
+ const afterReleaseId = url.searchParams.get("afterReleaseId") ?? void 0;
49
+ return Response.json({ data: await api.getReleasesByScope({
50
+ ...afterReleaseId === void 0 ? {} : { afterReleaseId },
51
+ limit,
52
+ scopeKey
53
+ }) });
54
+ }
55
+ if (api.getReleases === void 0) return unavailable();
56
+ const enabledValue = url.searchParams.get("enabled");
57
+ const enabled = enabledValue === null ? void 0 : enabledValue === "true" ? true : enabledValue === "false" ? false : null;
58
+ const platformValue = url.searchParams.get("platform");
59
+ const platform = platformValue === null ? void 0 : platformValue === "ios" || platformValue === "android" ? platformValue : null;
60
+ if (enabled === null || platform === null) throw new HandlerBadRequestError("Invalid Release list filter");
61
+ return Response.json({ data: await api.getReleases({
62
+ afterReleaseId: url.searchParams.get("afterReleaseId") ?? void 0,
63
+ beforeReleaseId: url.searchParams.get("beforeReleaseId") ?? void 0,
64
+ bundleId: url.searchParams.get("bundleId") ?? void 0,
65
+ channelId: url.searchParams.get("channelId") ?? void 0,
66
+ enabled,
67
+ limit,
68
+ platform,
69
+ targetAppVersion: url.searchParams.get("targetAppVersion") ?? void 0
70
+ }) });
71
+ },
72
+ getReleaseCatalogRow: async (params, _request, api) => {
73
+ if (api.getReleaseCatalogByScopeKey === void 0) return unavailable();
74
+ const row = await api.getReleaseCatalogByScopeKey(decodeMaybe(requireRouteParam(params, "scopeKey")) ?? "");
75
+ return row === null ? unavailable() : Response.json({ data: row }, { status: 200 });
76
+ },
77
+ getReleaseCatalogs: async (_params, request, api) => {
78
+ if (api.getReleaseCatalogs === void 0) return unavailable();
79
+ const url = new URL(request.url);
80
+ const limit = Number(url.searchParams.get("limit") ?? "100");
81
+ if (!Number.isSafeInteger(limit) || limit <= 0 || limit > 1e3) throw new HandlerBadRequestError("Invalid Release catalog list query");
82
+ return Response.json({ data: await api.getReleaseCatalogs({
83
+ afterScopeKey: url.searchParams.get("afterScopeKey") ?? void 0,
84
+ limit
85
+ }) });
86
+ },
87
+ updateRelease: async (params, request, api) => {
88
+ if (api.updateReleasePolicy === void 0) return unavailable();
89
+ const input = await parsePolicyInput(request);
90
+ return mutationResponse(() => api.updateReleasePolicy({
91
+ ...input,
92
+ releaseId: requireRouteParam(params, "id")
93
+ }));
94
+ },
95
+ preflightRelease: async (params, request, api) => {
96
+ if (api.preflightReleasePolicy === void 0) return unavailable();
97
+ const input = await parsePolicyInput(request);
98
+ return mutationResponse(() => api.preflightReleasePolicy({
99
+ ...input,
100
+ releaseId: requireRouteParam(params, "id")
101
+ }));
102
+ },
103
+ deleteRelease: async (params, request, api) => {
104
+ if (api.deleteRelease === void 0) return unavailable();
105
+ const releaseId = requireRouteParam(params, "id");
106
+ const url = new URL(request.url);
107
+ if (url.searchParams.get("confirm") !== releaseId) throw new HandlerBadRequestError("Release hard deletion requires confirm=<release-id>");
108
+ return mutationResponse(() => api.deleteRelease({
109
+ expectedRevision: parseRevision(url.searchParams.get("expectedRevision")),
110
+ releaseId
111
+ }));
112
+ },
113
+ rebuildReleaseCatalog: async (params, _request, api) => {
114
+ if (api.rebuildReleaseCatalog === void 0) return unavailable();
115
+ return mutationResponse(() => api.rebuildReleaseCatalog(decodeMaybe(requireRouteParam(params, "scopeKey")) ?? ""));
116
+ },
117
+ commitDatabase: async (_params, request, api) => {
118
+ if (api.commitDatabase === void 0) return unavailable();
119
+ const input = await request.json();
120
+ return Response.json({ data: await api.commitDatabase(input) });
121
+ }
122
+ });
123
+ //#endregion
124
+ export { createReleaseManagementRouteHandlers };
@@ -0,0 +1,63 @@
1
+ import { ReleaseCatalogRequest } from "./db/releaseCatalog.cjs";
2
+ import { PaginatedResult } from "./types/index.cjs";
3
+ import { ArtifactInfo, Bundle, ReleaseCatalog } from "@hot-updater/core";
4
+ import { ChannelDeleteInput, ChannelDeleteResult, ChannelInsertInput, ChannelInsertResult, ChannelRow, DatabaseBundleQueryOptions, DatabaseCommit, DatabaseCommitResult, ReleaseCatalogMutationPreflight, ReleaseCatalogMutationResult, ReleaseCatalogRebuildResult, ReleaseCatalogRow, ReleasePolicyPatch, ReleaseRow } from "@hot-updater/plugin-core";
5
+
6
+ //#region src/handlerTypes.d.ts
7
+ interface HandlerAPI {
8
+ getReleaseCatalog?: (input: ReleaseCatalogRequest) => Promise<ReleaseCatalog | null>;
9
+ getArtifactInfo?: (targetBundleId: string, currentBundleId: string) => Promise<ArtifactInfo | null>;
10
+ getReleaseById?: (id: string) => Promise<ReleaseRow | null>;
11
+ getReleasesByScope?: (input: {
12
+ readonly scopeKey: string;
13
+ readonly afterReleaseId?: string;
14
+ readonly limit: number;
15
+ }) => Promise<readonly ReleaseRow[]>;
16
+ getReleases?: (input: {
17
+ readonly afterReleaseId?: string;
18
+ readonly beforeReleaseId?: string;
19
+ readonly bundleId?: string;
20
+ readonly channelId?: string;
21
+ readonly enabled?: boolean;
22
+ readonly platform?: "ios" | "android";
23
+ readonly targetAppVersion?: string;
24
+ readonly limit: number;
25
+ }) => Promise<readonly ReleaseRow[]>;
26
+ getReleaseCatalogByScopeKey?: (scopeKey: string) => Promise<ReleaseCatalogRow | null>;
27
+ getReleaseCatalogs?: (input: {
28
+ readonly afterScopeKey?: string;
29
+ readonly limit: number;
30
+ }) => Promise<readonly ReleaseCatalogRow[]>;
31
+ updateReleasePolicy?: (input: {
32
+ readonly expectedRevision?: number;
33
+ readonly patch: ReleasePolicyPatch;
34
+ readonly releaseId: string;
35
+ }) => Promise<ReleaseCatalogMutationResult>;
36
+ preflightReleasePolicy?: (input: {
37
+ readonly expectedRevision?: number;
38
+ readonly patch: ReleasePolicyPatch;
39
+ readonly releaseId: string;
40
+ }) => Promise<ReleaseCatalogMutationPreflight>;
41
+ deleteRelease?: (input: {
42
+ readonly expectedRevision?: number;
43
+ readonly releaseId: string;
44
+ }) => Promise<ReleaseCatalogMutationResult>;
45
+ rebuildReleaseCatalog?: (scopeKey: string) => Promise<ReleaseCatalogRebuildResult>;
46
+ commitDatabase?: (input: DatabaseCommit) => Promise<DatabaseCommitResult>;
47
+ getBundleById: (id: string) => Promise<Bundle | null>;
48
+ getBundles: (options: DatabaseBundleQueryOptions) => Promise<PaginatedResult>;
49
+ insertBundle: (bundle: Bundle) => Promise<void>;
50
+ insertBundles?: (bundles: readonly Bundle[]) => Promise<void>;
51
+ updateBundleById: (bundleId: string, bundle: Partial<Bundle>) => Promise<void>;
52
+ deleteBundleById: (bundleId: string) => Promise<void>;
53
+ getChannels: () => Promise<readonly ChannelRow[]>;
54
+ insertChannel: (input: ChannelInsertInput) => Promise<ChannelInsertResult>;
55
+ deleteChannel: (input: ChannelDeleteInput) => Promise<ChannelDeleteResult>;
56
+ }
57
+ type HotUpdaterHandler = (request: Request) => Promise<Response>;
58
+ interface HotUpdaterHandlers {
59
+ readonly client: HotUpdaterHandler;
60
+ readonly admin: HotUpdaterHandler;
61
+ }
62
+ //#endregion
63
+ export { HandlerAPI, HotUpdaterHandler, HotUpdaterHandlers };
@@ -0,0 +1,63 @@
1
+ import { ReleaseCatalogRequest } from "./db/releaseCatalog.mjs";
2
+ import { PaginatedResult } from "./types/index.mjs";
3
+ import { ChannelDeleteInput, ChannelDeleteResult, ChannelInsertInput, ChannelInsertResult, ChannelRow, DatabaseBundleQueryOptions, DatabaseCommit, DatabaseCommitResult, ReleaseCatalogMutationPreflight, ReleaseCatalogMutationResult, ReleaseCatalogRebuildResult, ReleaseCatalogRow, ReleasePolicyPatch, ReleaseRow } from "@hot-updater/plugin-core";
4
+ import { ArtifactInfo, Bundle as Bundle$1, ReleaseCatalog } from "@hot-updater/core";
5
+
6
+ //#region src/handlerTypes.d.ts
7
+ interface HandlerAPI {
8
+ getReleaseCatalog?: (input: ReleaseCatalogRequest) => Promise<ReleaseCatalog | null>;
9
+ getArtifactInfo?: (targetBundleId: string, currentBundleId: string) => Promise<ArtifactInfo | null>;
10
+ getReleaseById?: (id: string) => Promise<ReleaseRow | null>;
11
+ getReleasesByScope?: (input: {
12
+ readonly scopeKey: string;
13
+ readonly afterReleaseId?: string;
14
+ readonly limit: number;
15
+ }) => Promise<readonly ReleaseRow[]>;
16
+ getReleases?: (input: {
17
+ readonly afterReleaseId?: string;
18
+ readonly beforeReleaseId?: string;
19
+ readonly bundleId?: string;
20
+ readonly channelId?: string;
21
+ readonly enabled?: boolean;
22
+ readonly platform?: "ios" | "android";
23
+ readonly targetAppVersion?: string;
24
+ readonly limit: number;
25
+ }) => Promise<readonly ReleaseRow[]>;
26
+ getReleaseCatalogByScopeKey?: (scopeKey: string) => Promise<ReleaseCatalogRow | null>;
27
+ getReleaseCatalogs?: (input: {
28
+ readonly afterScopeKey?: string;
29
+ readonly limit: number;
30
+ }) => Promise<readonly ReleaseCatalogRow[]>;
31
+ updateReleasePolicy?: (input: {
32
+ readonly expectedRevision?: number;
33
+ readonly patch: ReleasePolicyPatch;
34
+ readonly releaseId: string;
35
+ }) => Promise<ReleaseCatalogMutationResult>;
36
+ preflightReleasePolicy?: (input: {
37
+ readonly expectedRevision?: number;
38
+ readonly patch: ReleasePolicyPatch;
39
+ readonly releaseId: string;
40
+ }) => Promise<ReleaseCatalogMutationPreflight>;
41
+ deleteRelease?: (input: {
42
+ readonly expectedRevision?: number;
43
+ readonly releaseId: string;
44
+ }) => Promise<ReleaseCatalogMutationResult>;
45
+ rebuildReleaseCatalog?: (scopeKey: string) => Promise<ReleaseCatalogRebuildResult>;
46
+ commitDatabase?: (input: DatabaseCommit) => Promise<DatabaseCommitResult>;
47
+ getBundleById: (id: string) => Promise<Bundle$1 | null>;
48
+ getBundles: (options: DatabaseBundleQueryOptions) => Promise<PaginatedResult>;
49
+ insertBundle: (bundle: Bundle$1) => Promise<void>;
50
+ insertBundles?: (bundles: readonly Bundle$1[]) => Promise<void>;
51
+ updateBundleById: (bundleId: string, bundle: Partial<Bundle$1>) => Promise<void>;
52
+ deleteBundleById: (bundleId: string) => Promise<void>;
53
+ getChannels: () => Promise<readonly ChannelRow[]>;
54
+ insertChannel: (input: ChannelInsertInput) => Promise<ChannelInsertResult>;
55
+ deleteChannel: (input: ChannelDeleteInput) => Promise<ChannelDeleteResult>;
56
+ }
57
+ type HotUpdaterHandler = (request: Request) => Promise<Response>;
58
+ interface HotUpdaterHandlers {
59
+ readonly client: HotUpdaterHandler;
60
+ readonly admin: HotUpdaterHandler;
61
+ }
62
+ //#endregion
63
+ export { HandlerAPI, HotUpdaterHandler, HotUpdaterHandlers };
@@ -0,0 +1,10 @@
1
+ const require_version = require("./version.cjs");
2
+ //#region src/handlerVersionRoutes.ts
3
+ const HOT_UPDATER_INFRASTRUCTURE_GENERATION = 1;
4
+ const createVersionRouteHandlers = () => ({ version: async () => Response.json({
5
+ infrastructureGeneration: 1,
6
+ version: require_version.HOT_UPDATER_SERVER_VERSION
7
+ }) });
8
+ //#endregion
9
+ exports.HOT_UPDATER_INFRASTRUCTURE_GENERATION = HOT_UPDATER_INFRASTRUCTURE_GENERATION;
10
+ exports.createVersionRouteHandlers = createVersionRouteHandlers;
@@ -0,0 +1,4 @@
1
+ //#region src/handlerVersionRoutes.d.ts
2
+ declare const HOT_UPDATER_INFRASTRUCTURE_GENERATION = 1;
3
+ //#endregion
4
+ export { HOT_UPDATER_INFRASTRUCTURE_GENERATION };
@@ -0,0 +1,4 @@
1
+ //#region src/handlerVersionRoutes.d.ts
2
+ declare const HOT_UPDATER_INFRASTRUCTURE_GENERATION = 1;
3
+ //#endregion
4
+ export { HOT_UPDATER_INFRASTRUCTURE_GENERATION };
@@ -0,0 +1,9 @@
1
+ import { HOT_UPDATER_SERVER_VERSION } from "./version.mjs";
2
+ //#region src/handlerVersionRoutes.ts
3
+ const HOT_UPDATER_INFRASTRUCTURE_GENERATION = 1;
4
+ const createVersionRouteHandlers = () => ({ version: async () => Response.json({
5
+ infrastructureGeneration: 1,
6
+ version: HOT_UPDATER_SERVER_VERSION
7
+ }) });
8
+ //#endregion
9
+ export { HOT_UPDATER_INFRASTRUCTURE_GENERATION, createVersionRouteHandlers };
package/dist/index.cjs CHANGED
@@ -1,7 +1,16 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_version = require("./version.cjs");
3
+ const require_handlerVersionRoutes = require("./handlerVersionRoutes.cjs");
3
4
  const require_handler = require("./handler.cjs");
5
+ const require_provider = require("./analytics/bounded/provider.cjs");
6
+ const require_apiKeys = require("./apiKeys.cjs");
4
7
  const require_createHotUpdaterCore = require("./createHotUpdaterCore.cjs");
8
+ exports.API_KEY_HEADER_NAME = require_apiKeys.API_KEY_HEADER_NAME;
9
+ exports.HOT_UPDATER_INFRASTRUCTURE_GENERATION = require_handlerVersionRoutes.HOT_UPDATER_INFRASTRUCTURE_GENERATION;
5
10
  exports.HOT_UPDATER_SERVER_VERSION = require_version.HOT_UPDATER_SERVER_VERSION;
6
- exports.createHandler = require_handler.createHandler;
11
+ exports.createAnalyticsProvider = require_provider.createAnalyticsProvider;
12
+ exports.createApiKey = require_apiKeys.createApiKey;
13
+ exports.createHandlers = require_handler.createHandlers;
7
14
  exports.createHotUpdater = require_createHotUpdaterCore.createHotUpdater;
15
+ exports.provisionApiKey = require_apiKeys.provisionApiKey;
16
+ exports.registerApiKey = require_apiKeys.registerApiKey;
package/dist/index.d.cts CHANGED
@@ -1,5 +1,11 @@
1
- import { HandlerAPI, HandlerOptions, HandlerRoutes, createHandler } from "./handler.cjs";
2
- import { CreateHotUpdaterOptions, HotUpdaterAPI, RuntimeHotUpdaterAPI, createHotUpdater } from "./createHotUpdaterCore.cjs";
1
+ import { ActiveInstallationInput, ActiveInstallationOverview, ActiveInstallationWindow, AnalyticsCohortPoint, AnalyticsSeriesPoint, BundleEventAnalyticsResult, BundleEventAnalyticsWindow, BundleEventOverview, BundleEventSummary, BundleEventSummaryByBundle, CreateBundleEventRequest, CreateBundleEventRequestBase, InstallationHistoryRow, InstallationSearchRow, OffsetPaginationResult } from "./analytics/domain.cjs";
2
+ import { AnalyticsProvider } from "./analytics/types.cjs";
3
+ import { API_KEY_HEADER_NAME, ApiKeyManagementAPI, ApiKeyMetadata, CreatedApiKey, createApiKey, provisionApiKey, registerApiKey } from "./apiKeys.cjs";
4
+ import { HandlerAPI, HotUpdaterHandler, HotUpdaterHandlers } from "./handlerTypes.cjs";
5
+ import { createHandlers } from "./handler.cjs";
6
+ import { ClientAccessPolicy, CreateHotUpdaterOptions, HotUpdaterAPI, RuntimeHotUpdaterAPI, createHotUpdater } from "./createHotUpdaterCore.cjs";
3
7
  import { Bundle, ChannelsResponse, DataResponse, Paginated, PaginatedResult, PaginationInfo, PaginationOptions } from "./types/index.cjs";
4
8
  import { HOT_UPDATER_SERVER_VERSION } from "./version.cjs";
5
- export { Bundle, ChannelsResponse, type CreateHotUpdaterOptions, DataResponse, HOT_UPDATER_SERVER_VERSION, type HandlerAPI, type HandlerOptions, type HandlerRoutes, type HotUpdaterAPI, Paginated, PaginatedResult, PaginationInfo, PaginationOptions, type RuntimeHotUpdaterAPI, createHandler, createHotUpdater };
9
+ import { createAnalyticsProvider } from "./analytics/bounded/provider.cjs";
10
+ import { HOT_UPDATER_INFRASTRUCTURE_GENERATION } from "./handlerVersionRoutes.cjs";
11
+ export { API_KEY_HEADER_NAME, ActiveInstallationInput, ActiveInstallationOverview, ActiveInstallationWindow, AnalyticsCohortPoint, type AnalyticsProvider, AnalyticsSeriesPoint, type ApiKeyManagementAPI, type ApiKeyMetadata, Bundle, BundleEventAnalyticsResult, BundleEventAnalyticsWindow, BundleEventOverview, BundleEventSummary, BundleEventSummaryByBundle, ChannelsResponse, type ClientAccessPolicy, CreateBundleEventRequest, CreateBundleEventRequestBase, type CreateHotUpdaterOptions, type CreatedApiKey, DataResponse, HOT_UPDATER_INFRASTRUCTURE_GENERATION, HOT_UPDATER_SERVER_VERSION, type HandlerAPI, type HotUpdaterAPI, type HotUpdaterHandler, type HotUpdaterHandlers, InstallationHistoryRow, InstallationSearchRow, OffsetPaginationResult, Paginated, PaginatedResult, PaginationInfo, PaginationOptions, type RuntimeHotUpdaterAPI, createAnalyticsProvider, createApiKey, createHandlers, createHotUpdater, provisionApiKey, registerApiKey };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,11 @@
1
- import { HandlerAPI, HandlerOptions, HandlerRoutes, createHandler } from "./handler.mjs";
2
- import { CreateHotUpdaterOptions, HotUpdaterAPI, RuntimeHotUpdaterAPI, createHotUpdater } from "./createHotUpdaterCore.mjs";
1
+ import { ActiveInstallationInput, ActiveInstallationOverview, ActiveInstallationWindow, AnalyticsCohortPoint, AnalyticsSeriesPoint, BundleEventAnalyticsResult, BundleEventAnalyticsWindow, BundleEventOverview, BundleEventSummary, BundleEventSummaryByBundle, CreateBundleEventRequest, CreateBundleEventRequestBase, InstallationHistoryRow, InstallationSearchRow, OffsetPaginationResult } from "./analytics/domain.mjs";
2
+ import { AnalyticsProvider } from "./analytics/types.mjs";
3
+ import { API_KEY_HEADER_NAME, ApiKeyManagementAPI, ApiKeyMetadata, CreatedApiKey, createApiKey, provisionApiKey, registerApiKey } from "./apiKeys.mjs";
4
+ import { HandlerAPI, HotUpdaterHandler, HotUpdaterHandlers } from "./handlerTypes.mjs";
5
+ import { createHandlers } from "./handler.mjs";
6
+ import { ClientAccessPolicy, CreateHotUpdaterOptions, HotUpdaterAPI, RuntimeHotUpdaterAPI, createHotUpdater } from "./createHotUpdaterCore.mjs";
3
7
  import { Bundle, ChannelsResponse, DataResponse, Paginated, PaginatedResult, PaginationInfo, PaginationOptions } from "./types/index.mjs";
4
8
  import { HOT_UPDATER_SERVER_VERSION } from "./version.mjs";
5
- export { Bundle, ChannelsResponse, type CreateHotUpdaterOptions, DataResponse, HOT_UPDATER_SERVER_VERSION, type HandlerAPI, type HandlerOptions, type HandlerRoutes, type HotUpdaterAPI, Paginated, PaginatedResult, PaginationInfo, PaginationOptions, type RuntimeHotUpdaterAPI, createHandler, createHotUpdater };
9
+ import { createAnalyticsProvider } from "./analytics/bounded/provider.mjs";
10
+ import { HOT_UPDATER_INFRASTRUCTURE_GENERATION } from "./handlerVersionRoutes.mjs";
11
+ export { API_KEY_HEADER_NAME, ActiveInstallationInput, ActiveInstallationOverview, ActiveInstallationWindow, AnalyticsCohortPoint, type AnalyticsProvider, AnalyticsSeriesPoint, type ApiKeyManagementAPI, type ApiKeyMetadata, Bundle, BundleEventAnalyticsResult, BundleEventAnalyticsWindow, BundleEventOverview, BundleEventSummary, BundleEventSummaryByBundle, ChannelsResponse, type ClientAccessPolicy, CreateBundleEventRequest, CreateBundleEventRequestBase, type CreateHotUpdaterOptions, type CreatedApiKey, DataResponse, HOT_UPDATER_INFRASTRUCTURE_GENERATION, HOT_UPDATER_SERVER_VERSION, type HandlerAPI, type HotUpdaterAPI, type HotUpdaterHandler, type HotUpdaterHandlers, InstallationHistoryRow, InstallationSearchRow, OffsetPaginationResult, Paginated, PaginatedResult, PaginationInfo, PaginationOptions, type RuntimeHotUpdaterAPI, createAnalyticsProvider, createApiKey, createHandlers, createHotUpdater, provisionApiKey, registerApiKey };
package/dist/index.mjs CHANGED
@@ -1,4 +1,7 @@
1
1
  import { HOT_UPDATER_SERVER_VERSION } from "./version.mjs";
2
- import { createHandler } from "./handler.mjs";
2
+ import { HOT_UPDATER_INFRASTRUCTURE_GENERATION } from "./handlerVersionRoutes.mjs";
3
+ import { createHandlers } from "./handler.mjs";
4
+ import { createAnalyticsProvider } from "./analytics/bounded/provider.mjs";
5
+ import { API_KEY_HEADER_NAME, createApiKey, provisionApiKey, registerApiKey } from "./apiKeys.mjs";
3
6
  import { createHotUpdater } from "./createHotUpdaterCore.mjs";
4
- export { HOT_UPDATER_SERVER_VERSION, createHandler, createHotUpdater };
7
+ export { API_KEY_HEADER_NAME, HOT_UPDATER_INFRASTRUCTURE_GENERATION, HOT_UPDATER_SERVER_VERSION, createAnalyticsProvider, createApiKey, createHandlers, createHotUpdater, provisionApiKey, registerApiKey };
package/dist/node.cjs CHANGED
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_version = require("./version.cjs");
3
+ const require_handlerVersionRoutes = require("./handlerVersionRoutes.cjs");
3
4
  //#region src/node.ts
4
5
  /**
5
6
  * Converts a Hot Updater handler to a Node.js-compatible middleware
@@ -12,33 +13,38 @@ const require_version = require("./version.cjs");
12
13
  *
13
14
  * const app = express();
14
15
  *
15
- * // Mount middleware
16
- * app.use(express.json());
17
- *
18
- * // Mount hot-updater handler
19
- * app.all("/hot-updater/*", toNodeHandler(hotUpdater));
16
+ * app.use(
17
+ * "/hot-updater/admin",
18
+ * bearerMiddleware,
19
+ * express.json({ limit: "1mb" }),
20
+ * toNodeHandler(hotUpdater.handlers.admin),
21
+ * );
22
+ * app.use(
23
+ * "/hot-updater",
24
+ * express.json({ limit: "1mb" }),
25
+ * toNodeHandler(hotUpdater.handlers.client),
26
+ * );
20
27
  * ```
21
28
  */
22
- function toNodeHandler(hotUpdater) {
29
+ function toNodeHandler(handler) {
23
30
  return async (req, res) => {
24
31
  try {
25
- const url = `${req.protocol || "http"}://${req.get?.("host") || "localhost"}${req.url || "/"}`;
32
+ const url = `${req.protocol || "http"}://${req.get?.("host") || "localhost"}${req.url ?? "/"}`;
26
33
  const headers = new Headers();
27
34
  for (const [key, value] of Object.entries(req.headers)) if (value) headers.set(key, Array.isArray(value) ? value.join(", ") : value);
28
35
  let body;
29
36
  if (req.method && req.method !== "GET" && req.method !== "HEAD" && req.body) body = JSON.stringify(req.body);
30
- const webRequest = new globalThis.Request(url, {
37
+ const response = await handler(new globalThis.Request(url, {
31
38
  method: req.method || "GET",
32
39
  headers,
33
40
  body
34
- });
35
- const response = await hotUpdater.handler(webRequest);
41
+ }));
36
42
  res.status(response.status);
37
43
  response.headers.forEach((value, key) => {
38
44
  res.setHeader(key, value);
39
45
  });
40
- const text = await response.text();
41
- if (text) res.send(text);
46
+ const responseBody = Buffer.from(await response.arrayBuffer());
47
+ if (responseBody.length > 0) res.send(responseBody);
42
48
  else res.end();
43
49
  } catch (error) {
44
50
  console.error("Hot Updater handler error:", error);
@@ -48,5 +54,6 @@ function toNodeHandler(hotUpdater) {
48
54
  };
49
55
  }
50
56
  //#endregion
57
+ exports.HOT_UPDATER_INFRASTRUCTURE_GENERATION = require_handlerVersionRoutes.HOT_UPDATER_INFRASTRUCTURE_GENERATION;
51
58
  exports.HOT_UPDATER_SERVER_VERSION = require_version.HOT_UPDATER_SERVER_VERSION;
52
59
  exports.toNodeHandler = toNodeHandler;
package/dist/node.d.cts CHANGED
@@ -1,9 +1,8 @@
1
+ import { HotUpdaterHandler } from "./handlerTypes.cjs";
1
2
  import { HOT_UPDATER_SERVER_VERSION } from "./version.cjs";
3
+ import { HOT_UPDATER_INFRASTRUCTURE_GENERATION } from "./handlerVersionRoutes.cjs";
2
4
 
3
5
  //#region src/node.d.ts
4
- type HandlerHotUpdaterAPI = {
5
- readonly handler: (request: Request) => Promise<Response>;
6
- };
7
6
  /**
8
7
  * Converts a Hot Updater handler to a Node.js-compatible middleware
9
8
  * Works with Express, Connect, and other frameworks using Node.js req/res
@@ -15,13 +14,19 @@ type HandlerHotUpdaterAPI = {
15
14
  *
16
15
  * const app = express();
17
16
  *
18
- * // Mount middleware
19
- * app.use(express.json());
20
- *
21
- * // Mount hot-updater handler
22
- * app.all("/hot-updater/*", toNodeHandler(hotUpdater));
17
+ * app.use(
18
+ * "/hot-updater/admin",
19
+ * bearerMiddleware,
20
+ * express.json({ limit: "1mb" }),
21
+ * toNodeHandler(hotUpdater.handlers.admin),
22
+ * );
23
+ * app.use(
24
+ * "/hot-updater",
25
+ * express.json({ limit: "1mb" }),
26
+ * toNodeHandler(hotUpdater.handlers.client),
27
+ * );
23
28
  * ```
24
29
  */
25
- declare function toNodeHandler(hotUpdater: HandlerHotUpdaterAPI): (req: any, res: any, next?: any) => Promise<void>;
30
+ declare function toNodeHandler(handler: HotUpdaterHandler): (req: any, res: any, next?: any) => Promise<void>;
26
31
  //#endregion
27
- export { HOT_UPDATER_SERVER_VERSION, toNodeHandler };
32
+ export { HOT_UPDATER_INFRASTRUCTURE_GENERATION, HOT_UPDATER_SERVER_VERSION, toNodeHandler };
package/dist/node.d.mts CHANGED
@@ -1,9 +1,8 @@
1
+ import { HotUpdaterHandler } from "./handlerTypes.mjs";
1
2
  import { HOT_UPDATER_SERVER_VERSION } from "./version.mjs";
3
+ import { HOT_UPDATER_INFRASTRUCTURE_GENERATION } from "./handlerVersionRoutes.mjs";
2
4
 
3
5
  //#region src/node.d.ts
4
- type HandlerHotUpdaterAPI = {
5
- readonly handler: (request: Request) => Promise<Response>;
6
- };
7
6
  /**
8
7
  * Converts a Hot Updater handler to a Node.js-compatible middleware
9
8
  * Works with Express, Connect, and other frameworks using Node.js req/res
@@ -15,13 +14,19 @@ type HandlerHotUpdaterAPI = {
15
14
  *
16
15
  * const app = express();
17
16
  *
18
- * // Mount middleware
19
- * app.use(express.json());
20
- *
21
- * // Mount hot-updater handler
22
- * app.all("/hot-updater/*", toNodeHandler(hotUpdater));
17
+ * app.use(
18
+ * "/hot-updater/admin",
19
+ * bearerMiddleware,
20
+ * express.json({ limit: "1mb" }),
21
+ * toNodeHandler(hotUpdater.handlers.admin),
22
+ * );
23
+ * app.use(
24
+ * "/hot-updater",
25
+ * express.json({ limit: "1mb" }),
26
+ * toNodeHandler(hotUpdater.handlers.client),
27
+ * );
23
28
  * ```
24
29
  */
25
- declare function toNodeHandler(hotUpdater: HandlerHotUpdaterAPI): (req: any, res: any, next?: any) => Promise<void>;
30
+ declare function toNodeHandler(handler: HotUpdaterHandler): (req: any, res: any, next?: any) => Promise<void>;
26
31
  //#endregion
27
- export { HOT_UPDATER_SERVER_VERSION, toNodeHandler };
32
+ export { HOT_UPDATER_INFRASTRUCTURE_GENERATION, HOT_UPDATER_SERVER_VERSION, toNodeHandler };
package/dist/node.mjs CHANGED
@@ -1,4 +1,5 @@
1
1
  import { HOT_UPDATER_SERVER_VERSION } from "./version.mjs";
2
+ import { HOT_UPDATER_INFRASTRUCTURE_GENERATION } from "./handlerVersionRoutes.mjs";
2
3
  //#region src/node.ts
3
4
  /**
4
5
  * Converts a Hot Updater handler to a Node.js-compatible middleware
@@ -11,33 +12,38 @@ import { HOT_UPDATER_SERVER_VERSION } from "./version.mjs";
11
12
  *
12
13
  * const app = express();
13
14
  *
14
- * // Mount middleware
15
- * app.use(express.json());
16
- *
17
- * // Mount hot-updater handler
18
- * app.all("/hot-updater/*", toNodeHandler(hotUpdater));
15
+ * app.use(
16
+ * "/hot-updater/admin",
17
+ * bearerMiddleware,
18
+ * express.json({ limit: "1mb" }),
19
+ * toNodeHandler(hotUpdater.handlers.admin),
20
+ * );
21
+ * app.use(
22
+ * "/hot-updater",
23
+ * express.json({ limit: "1mb" }),
24
+ * toNodeHandler(hotUpdater.handlers.client),
25
+ * );
19
26
  * ```
20
27
  */
21
- function toNodeHandler(hotUpdater) {
28
+ function toNodeHandler(handler) {
22
29
  return async (req, res) => {
23
30
  try {
24
- const url = `${req.protocol || "http"}://${req.get?.("host") || "localhost"}${req.url || "/"}`;
31
+ const url = `${req.protocol || "http"}://${req.get?.("host") || "localhost"}${req.url ?? "/"}`;
25
32
  const headers = new Headers();
26
33
  for (const [key, value] of Object.entries(req.headers)) if (value) headers.set(key, Array.isArray(value) ? value.join(", ") : value);
27
34
  let body;
28
35
  if (req.method && req.method !== "GET" && req.method !== "HEAD" && req.body) body = JSON.stringify(req.body);
29
- const webRequest = new globalThis.Request(url, {
36
+ const response = await handler(new globalThis.Request(url, {
30
37
  method: req.method || "GET",
31
38
  headers,
32
39
  body
33
- });
34
- const response = await hotUpdater.handler(webRequest);
40
+ }));
35
41
  res.status(response.status);
36
42
  response.headers.forEach((value, key) => {
37
43
  res.setHeader(key, value);
38
44
  });
39
- const text = await response.text();
40
- if (text) res.send(text);
45
+ const responseBody = Buffer.from(await response.arrayBuffer());
46
+ if (responseBody.length > 0) res.send(responseBody);
41
47
  else res.end();
42
48
  } catch (error) {
43
49
  console.error("Hot Updater handler error:", error);
@@ -47,4 +53,4 @@ function toNodeHandler(hotUpdater) {
47
53
  };
48
54
  }
49
55
  //#endregion
50
- export { HOT_UPDATER_SERVER_VERSION, toNodeHandler };
56
+ export { HOT_UPDATER_INFRASTRUCTURE_GENERATION, HOT_UPDATER_SERVER_VERSION, toNodeHandler };
package/dist/package.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "0.36.7";
2
+ var version = "1.0.0-rc.0";
3
3
  //#endregion
4
4
  Object.defineProperty(exports, "version", {
5
5
  enumerable: true,
package/dist/package.mjs CHANGED
@@ -1,4 +1,4 @@
1
1
  //#region package.json
2
- var version = "0.36.7";
2
+ var version = "1.0.0-rc.0";
3
3
  //#endregion
4
4
  export { version };
@@ -13,6 +13,7 @@ const defaultValue = (value) => typeof value === "object" ? {
13
13
  const columnSchema = (column) => ({
14
14
  ormName: column.ormName,
15
15
  type: column.type,
16
+ ...column.providerCollations ? { providerCollations: column.providerCollations } : {},
16
17
  ...column.nullableValue ? { nullable: true } : {},
17
18
  ...column.primaryKeyValue ? { primaryKey: true } : {},
18
19
  ...column.default ? { default: column.default } : {}
@@ -21,6 +22,7 @@ const createColumn = (state) => ({
21
22
  dsl: "column",
22
23
  ormName: state.ormName,
23
24
  type: state.type,
25
+ ...state.providerCollations ? { providerCollations: state.providerCollations } : {},
24
26
  ...state.nullableValue ? { nullableValue: true } : {},
25
27
  ...state.primaryKeyValue ? { primaryKeyValue: true } : {},
26
28
  ...state.default ? { default: state.default } : {},
@@ -32,6 +34,10 @@ const createColumn = (state) => ({
32
34
  ...state,
33
35
  primaryKeyValue: true
34
36
  }),
37
+ collate: (providerCollations) => createColumn({
38
+ ...state,
39
+ providerCollations
40
+ }),
35
41
  defaultTo: (value) => createColumn({
36
42
  ...state,
37
43
  default: defaultValue(value)
@@ -45,21 +51,29 @@ const column = (ormName, type) => createColumn({
45
51
  const idColumn = (ormName, type) => column(ormName, type).primaryKey();
46
52
  const uuid = (ormName) => column(ormName, "uuid");
47
53
  const integer = (ormName) => column(ormName, "integer");
54
+ const float = (ormName) => column(ormName, "float");
48
55
  const bool = (ormName) => column(ormName, "bool");
49
56
  const json = (ormName) => column(ormName, "json");
50
57
  const stringColumn = (ormName) => column(ormName, "string");
58
+ const largeString = (ormName) => column(ormName, "large-string");
51
59
  const index = (name, columns, providers) => ({
52
60
  name,
53
61
  columns,
54
62
  ...providers ? { providers } : {}
55
63
  });
56
- const foreignKey = (name, columns, referencedTable, referencedColumns) => ({
64
+ const uniqueIndex = (name, columns, providers) => ({
65
+ name,
66
+ columns,
67
+ ...providers ? { providers } : {},
68
+ unique: true
69
+ });
70
+ const foreignKey = (name, columns, referencedTable, referencedColumns, options = {}) => ({
57
71
  name,
58
72
  columns,
59
73
  referencedTable,
60
74
  referencedColumns,
61
75
  onUpdate: "restrict",
62
- onDelete: "cascade"
76
+ onDelete: options.onDelete ?? "cascade"
63
77
  });
64
78
  const check = (config) => config;
65
79
  const relation = (config) => config;
@@ -73,14 +87,17 @@ const schema = (value) => withDsl({ ...value }, "schema");
73
87
  exports.bool = bool;
74
88
  exports.check = check;
75
89
  exports.column = column;
90
+ exports.float = float;
76
91
  exports.foreignKey = foreignKey;
77
92
  exports.idColumn = idColumn;
78
93
  exports.index = index;
79
94
  exports.integer = integer;
80
95
  exports.json = json;
96
+ exports.largeString = largeString;
81
97
  exports.relation = relation;
82
98
  exports.schema = schema;
83
99
  exports.stringColumn = stringColumn;
84
100
  exports.table = table;
101
+ exports.uniqueIndex = uniqueIndex;
85
102
  exports.uuid = uuid;
86
103
  exports.varchar = varchar;