@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,219 +0,0 @@
1
- import { hotUpdaterSchemaVersions } from "../../schema";
2
- import type {
3
- HotUpdaterCheckSchema,
4
- HotUpdaterForeignKeySchema,
5
- HotUpdaterTableSchema,
6
- } from "../../schema/types";
7
- import type { ORMSQLProvider, RelationMode } from "../types";
8
- import {
9
- getSchemaVersionIndex,
10
- schemaIndexAppliesToProvider,
11
- } from "./registry";
12
- import {
13
- createIndexSql,
14
- createTableStatement,
15
- sqlColumnDefinition,
16
- } from "./sql";
17
-
18
- const nameMap = <T extends { readonly name: string }>(
19
- items: readonly T[] | undefined,
20
- ): Map<string, T> => new Map((items ?? []).map((item) => [item.name, item]));
21
-
22
- const columnMap = (
23
- table: HotUpdaterTableSchema,
24
- ): Map<string, { readonly ormName: string }> =>
25
- new Map(table.columns.map((column) => [column.ormName, column]));
26
-
27
- const stableStringify = (value: unknown): string => JSON.stringify(value);
28
-
29
- const assertSameSchemaValue = (
30
- location: string,
31
- left: unknown,
32
- right: unknown,
33
- ) => {
34
- if (stableStringify(left) !== stableStringify(right)) {
35
- throw new Error(
36
- `Unsupported Hot Updater schema change at ${location}. Add an explicit migration step before changing existing schema metadata.`,
37
- );
38
- }
39
- };
40
-
41
- const compareNamedItems = <T extends { readonly name: string }>(
42
- location: string,
43
- previousItems: readonly T[] | undefined,
44
- nextItems: readonly T[] | undefined,
45
- ) => {
46
- const nextItemsByName = nameMap(nextItems);
47
- for (const previousItem of previousItems ?? []) {
48
- const nextItem = nextItemsByName.get(previousItem.name);
49
- if (!nextItem) {
50
- throw new Error(
51
- `Unsupported Hot Updater schema change at ${location}.${previousItem.name}. Removing schema metadata requires an explicit migration step.`,
52
- );
53
- }
54
- assertSameSchemaValue(
55
- `${location}.${previousItem.name}`,
56
- previousItem,
57
- nextItem,
58
- );
59
- }
60
- };
61
-
62
- const assertNoUnsupportedTableChanges = (
63
- previous: HotUpdaterTableSchema,
64
- next: HotUpdaterTableSchema,
65
- provider: ORMSQLProvider,
66
- ) => {
67
- const nextColumns = columnMap(next);
68
- for (const previousColumn of previous.columns) {
69
- const nextColumn = nextColumns.get(previousColumn.ormName);
70
- if (!nextColumn) {
71
- throw new Error(
72
- `Unsupported Hot Updater schema change at ${previous.ormName}.${previousColumn.ormName}. Dropping columns requires an explicit migration step.`,
73
- );
74
- }
75
- assertSameSchemaValue(
76
- `${previous.ormName}.${previousColumn.ormName}`,
77
- previousColumn,
78
- nextColumn,
79
- );
80
- }
81
- compareNamedItems(
82
- `${previous.ormName}.indexes`,
83
- previous.indexes?.filter((index) =>
84
- schemaIndexAppliesToProvider(index, provider),
85
- ),
86
- next.indexes?.filter((index) =>
87
- schemaIndexAppliesToProvider(index, provider),
88
- ),
89
- );
90
- compareNamedItems(`${previous.ormName}.checks`, previous.checks, next.checks);
91
- compareNamedItems(
92
- `${previous.ormName}.foreignKeys`,
93
- previous.foreignKeys,
94
- next.foreignKeys,
95
- );
96
- };
97
-
98
- const createForeignKeySql = (
99
- table: HotUpdaterTableSchema,
100
- foreignKey: HotUpdaterForeignKeySchema,
101
- ): string =>
102
- `alter table ${table.ormName} add constraint ${foreignKey.name} foreign key (${foreignKey.columns.join(", ")}) references ${foreignKey.referencedTable}(${foreignKey.referencedColumns.join(", ")}) on update ${foreignKey.onUpdate} on delete ${foreignKey.onDelete}`;
103
-
104
- const createCheckSql = (
105
- table: HotUpdaterTableSchema,
106
- check: HotUpdaterCheckSchema,
107
- ): string =>
108
- `alter table ${table.ormName} add constraint ${check.name} check (${check.expression})`;
109
-
110
- const createAddedTableSql = (
111
- table: HotUpdaterTableSchema,
112
- provider: ORMSQLProvider,
113
- relationMode: RelationMode,
114
- ): readonly string[] => [
115
- createTableStatement(table, provider),
116
- ...(table.indexes ?? [])
117
- .filter((index) => schemaIndexAppliesToProvider(index, provider))
118
- .map((index) => createIndexSql(table, index, provider)),
119
- ...(provider === "sqlite"
120
- ? []
121
- : (table.checks ?? []).map((check) => createCheckSql(table, check))),
122
- ...(relationMode === "foreign-keys" && provider !== "sqlite"
123
- ? (table.foreignKeys ?? []).map((foreignKey) =>
124
- createForeignKeySql(table, foreignKey),
125
- )
126
- : []),
127
- ];
128
-
129
- const createChangedTableSql = (
130
- previous: HotUpdaterTableSchema,
131
- next: HotUpdaterTableSchema,
132
- provider: ORMSQLProvider,
133
- relationMode: RelationMode,
134
- ): readonly string[] => {
135
- assertNoUnsupportedTableChanges(previous, next, provider);
136
- const previousColumns = columnMap(previous);
137
- const previousIndexes = nameMap(
138
- previous.indexes?.filter((index) =>
139
- schemaIndexAppliesToProvider(index, provider),
140
- ),
141
- );
142
- const previousChecks = nameMap(previous.checks);
143
- const previousForeignKeys = nameMap(previous.foreignKeys);
144
-
145
- return [
146
- ...next.columns
147
- .filter((column) => !previousColumns.has(column.ormName))
148
- .map(
149
- (column) =>
150
- `alter table ${next.ormName} add column ${sqlColumnDefinition(
151
- next,
152
- column,
153
- provider,
154
- )}`,
155
- ),
156
- ...(next.indexes ?? [])
157
- .filter((index) => schemaIndexAppliesToProvider(index, provider))
158
- .filter((index) => !previousIndexes.has(index.name))
159
- .map((index) => createIndexSql(next, index, provider)),
160
- ...(provider === "sqlite"
161
- ? []
162
- : (next.checks ?? [])
163
- .filter((check) => !previousChecks.has(check.name))
164
- .map((check) => createCheckSql(next, check))),
165
- ...(relationMode === "foreign-keys" && provider !== "sqlite"
166
- ? (next.foreignKeys ?? [])
167
- .filter((foreignKey) => !previousForeignKeys.has(foreignKey.name))
168
- .map((foreignKey) => createForeignKeySql(next, foreignKey))
169
- : []),
170
- ];
171
- };
172
-
173
- export const createSchemaMigrationSql = (
174
- fromVersion: string,
175
- toVersion: string,
176
- provider: ORMSQLProvider,
177
- relationMode: RelationMode = "foreign-keys",
178
- ): readonly string[] => {
179
- const fromIndex = getSchemaVersionIndex(fromVersion);
180
- const toIndex = getSchemaVersionIndex(toVersion);
181
- if (fromIndex === -1) {
182
- throw new Error(`Unsupported Hot Updater schema version: ${fromVersion}`);
183
- }
184
- if (toIndex === -1) {
185
- throw new Error(`Unsupported Hot Updater schema version: ${toVersion}`);
186
- }
187
- if (fromIndex > toIndex) {
188
- throw new Error(`Cannot migrate Hot Updater schema down to ${toVersion}.`);
189
- }
190
-
191
- const statements: string[] = [];
192
- for (let index = fromIndex + 1; index <= toIndex; index += 1) {
193
- const previous = hotUpdaterSchemaVersions[index - 1]!;
194
- const next = hotUpdaterSchemaVersions[index]!;
195
- const previousTables = new Map(
196
- previous.tables.map((table) => [table.ormName, table]),
197
- );
198
- for (const table of next.tables) {
199
- if (table.internal) continue;
200
- const previousTable = previousTables.get(table.ormName);
201
- statements.push(
202
- ...(previousTable
203
- ? createChangedTableSql(previousTable, table, provider, relationMode)
204
- : createAddedTableSql(table, provider, relationMode)),
205
- );
206
- }
207
- }
208
- return statements;
209
- };
210
-
211
- export const createV029AlterSql = (
212
- provider: ORMSQLProvider,
213
- ): readonly string[] => createSchemaMigrationSql("0.21.0", "0.29.0", provider);
214
-
215
- export const createV031AlterSql = (
216
- provider: ORMSQLProvider,
217
- relationMode: RelationMode = "foreign-keys",
218
- ): readonly string[] =>
219
- createSchemaMigrationSql("0.29.0", "0.31.0", provider, relationMode);
@@ -1,55 +0,0 @@
1
- import {
2
- DEFAULT_ROLLOUT_COHORT_COUNT,
3
- INVALID_COHORT_ERROR_MESSAGE,
4
- isValidCohort,
5
- type Bundle,
6
- } from "@hot-updater/core";
7
-
8
- const normalizeNullableString = (value: string | null | undefined) => {
9
- if (value === null || value === undefined) {
10
- return null;
11
- }
12
-
13
- const normalized = value.trim();
14
- return normalized.length > 0 ? normalized : null;
15
- };
16
-
17
- export const assertBundlePersistenceConstraints = (
18
- bundle: Pick<
19
- Bundle,
20
- | "fingerprintHash"
21
- | "rolloutCohortCount"
22
- | "targetAppVersion"
23
- | "targetCohorts"
24
- >,
25
- ) => {
26
- const targetAppVersion = normalizeNullableString(bundle.targetAppVersion);
27
- const fingerprintHash = normalizeNullableString(bundle.fingerprintHash);
28
-
29
- if (!targetAppVersion && !fingerprintHash) {
30
- throw new Error(
31
- "Bundle must define either targetAppVersion or fingerprintHash.",
32
- );
33
- }
34
-
35
- const rolloutCohortCount = bundle.rolloutCohortCount;
36
- if (rolloutCohortCount !== null && rolloutCohortCount !== undefined) {
37
- if (
38
- !Number.isInteger(rolloutCohortCount) ||
39
- rolloutCohortCount < 0 ||
40
- rolloutCohortCount > DEFAULT_ROLLOUT_COHORT_COUNT
41
- ) {
42
- throw new Error(
43
- `rolloutCohortCount must be an integer between 0 and ${DEFAULT_ROLLOUT_COHORT_COUNT}.`,
44
- );
45
- }
46
- }
47
-
48
- for (const cohort of bundle.targetCohorts ?? []) {
49
- if (!isValidCohort(cohort)) {
50
- throw new Error(
51
- `Invalid target cohort "${cohort}". ${INVALID_COHORT_ERROR_MESSAGE}`,
52
- );
53
- }
54
- }
55
- };
package/src/route.ts DELETED
@@ -1,7 +0,0 @@
1
- export const normalizeBasePath = (basePath?: string) => {
2
- if (!basePath || basePath === "/") {
3
- return "/";
4
- }
5
-
6
- return basePath.endsWith("/") ? basePath.slice(0, -1) : basePath;
7
- };
@@ -1,52 +0,0 @@
1
- import {
2
- bool,
3
- check,
4
- idColumn,
5
- index,
6
- json,
7
- schema,
8
- stringColumn,
9
- table,
10
- } from "./dsl";
11
- import { createSettingsTable } from "./settings";
12
- import { HOT_UPDATER_SETTINGS_TABLE } from "./types";
13
-
14
- export const bundlesV021 = table(
15
- "bundles",
16
- {
17
- id: idColumn("id", "uuid"),
18
- platform: stringColumn("platform"),
19
- should_force_update: bool("should_force_update"),
20
- enabled: bool("enabled"),
21
- file_hash: stringColumn("file_hash"),
22
- git_commit_hash: stringColumn("git_commit_hash").nullable(),
23
- message: stringColumn("message").nullable(),
24
- channel: stringColumn("channel").defaultTo("production"),
25
- storage_uri: stringColumn("storage_uri"),
26
- target_app_version: stringColumn("target_app_version").nullable(),
27
- fingerprint_hash: stringColumn("fingerprint_hash").nullable(),
28
- metadata: json("metadata").defaultTo({}),
29
- },
30
- {
31
- indexes: [
32
- index("bundles_target_app_version_idx", ["target_app_version"]),
33
- index("bundles_fingerprint_hash_idx", ["fingerprint_hash"]),
34
- index("bundles_channel_idx", ["channel"]),
35
- index("bundles_platform_idx", ["platform"], ["mongodb"]),
36
- ],
37
- checks: [
38
- check({
39
- name: "check_version_or_fingerprint",
40
- expression:
41
- "(target_app_version is not null) or (fingerprint_hash is not null)",
42
- sqliteInline: true,
43
- }),
44
- ],
45
- },
46
- );
47
-
48
- export const v0_21_0 = schema({
49
- version: "0.21.0",
50
- settingsTable: HOT_UPDATER_SETTINGS_TABLE,
51
- tables: [bundlesV021, createSettingsTable("0.21.0")],
52
- });
@@ -1,62 +0,0 @@
1
- import {
2
- bool,
3
- check,
4
- idColumn,
5
- index,
6
- integer,
7
- json,
8
- schema,
9
- stringColumn,
10
- table,
11
- } from "./dsl";
12
- import { createSettingsTable } from "./settings";
13
- import { HOT_UPDATER_SETTINGS_TABLE } from "./types";
14
-
15
- export const bundlesV029 = table(
16
- "bundles",
17
- {
18
- id: idColumn("id", "uuid"),
19
- platform: stringColumn("platform"),
20
- should_force_update: bool("should_force_update"),
21
- enabled: bool("enabled"),
22
- file_hash: stringColumn("file_hash"),
23
- git_commit_hash: stringColumn("git_commit_hash").nullable(),
24
- message: stringColumn("message").nullable(),
25
- channel: stringColumn("channel").defaultTo("production"),
26
- storage_uri: stringColumn("storage_uri"),
27
- target_app_version: stringColumn("target_app_version").nullable(),
28
- fingerprint_hash: stringColumn("fingerprint_hash").nullable(),
29
- metadata: json("metadata").defaultTo({}),
30
- rollout_cohort_count: integer("rollout_cohort_count").defaultTo(1000),
31
- target_cohorts: json("target_cohorts").nullable(),
32
- },
33
- {
34
- indexes: [
35
- index("bundles_target_app_version_idx", ["target_app_version"]),
36
- index("bundles_fingerprint_hash_idx", ["fingerprint_hash"]),
37
- index("bundles_channel_idx", ["channel"]),
38
- index("bundles_platform_idx", ["platform"], ["mongodb"]),
39
- index("bundles_rollout_idx", ["rollout_cohort_count"]),
40
- ],
41
- checks: [
42
- check({
43
- name: "check_version_or_fingerprint",
44
- expression:
45
- "(target_app_version is not null) or (fingerprint_hash is not null)",
46
- sqliteInline: true,
47
- }),
48
- check({
49
- name: "bundles_rollout_cohort_count_check",
50
- expression:
51
- "rollout_cohort_count >= 0 and rollout_cohort_count <= 1000",
52
- sqliteInline: true,
53
- }),
54
- ],
55
- },
56
- );
57
-
58
- export const v0_29_0 = schema({
59
- version: "0.29.0",
60
- settingsTable: HOT_UPDATER_SETTINGS_TABLE,
61
- tables: [bundlesV029, createSettingsTable("0.29.0")],
62
- });
@@ -1,73 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
-
3
- import { createTableStatement } from "../db/schema/sql";
4
- import { bundlePatchesV031, v0_31_0 } from "./v0_31_0";
5
-
6
- describe("bundlePatchesV031", () => {
7
- it("uses the functional schema DSL for the v0.31.0 bundle patches table", () => {
8
- expect(v0_31_0.dsl).toBe("schema");
9
- expect(bundlePatchesV031.dsl).toBe("table");
10
- expect(bundlePatchesV031.columns).toEqual([
11
- { ormName: "id", type: "varchar(255)", primaryKey: true },
12
- { ormName: "bundle_id", type: "uuid" },
13
- { ormName: "base_bundle_id", type: "uuid" },
14
- { ormName: "base_file_hash", type: "string" },
15
- { ormName: "patch_file_hash", type: "string" },
16
- { ormName: "patch_storage_uri", type: "string" },
17
- {
18
- ormName: "order_index",
19
- type: "integer",
20
- default: { type: "literal", value: 0 },
21
- },
22
- ]);
23
- expect(bundlePatchesV031.indexes).toEqual([
24
- { name: "bundle_patches_bundle_id_idx", columns: ["bundle_id"] },
25
- {
26
- name: "bundle_patches_base_bundle_id_idx",
27
- columns: ["base_bundle_id"],
28
- },
29
- ]);
30
- expect(bundlePatchesV031.foreignKeys).toEqual([
31
- {
32
- name: "bundle_patches_bundle_id_fk",
33
- columns: ["bundle_id"],
34
- referencedTable: "bundles",
35
- referencedColumns: ["id"],
36
- onUpdate: "restrict",
37
- onDelete: "cascade",
38
- },
39
- {
40
- name: "bundle_patches_base_bundle_id_fk",
41
- columns: ["base_bundle_id"],
42
- referencedTable: "bundles",
43
- referencedColumns: ["id"],
44
- onUpdate: "restrict",
45
- onDelete: "cascade",
46
- },
47
- ]);
48
- expect(bundlePatchesV031.relations).toEqual([
49
- {
50
- name: "bundle",
51
- fieldName: "patches",
52
- targetFieldName: "bundle",
53
- relationName: "bundle_patches_bundles_patches",
54
- columns: ["bundle_id"],
55
- referencedTable: "bundles",
56
- referencedColumns: ["id"],
57
- },
58
- {
59
- name: "baseBundle",
60
- fieldName: "baseForPatches",
61
- targetFieldName: "baseBundle",
62
- relationName: "bundle_patches_bundles_baseForPatches",
63
- columns: ["base_bundle_id"],
64
- referencedTable: "bundles",
65
- referencedColumns: ["id"],
66
- },
67
- ]);
68
- expect(Object.keys(bundlePatchesV031)).not.toContain("dsl");
69
- expect(createTableStatement(bundlePatchesV031, "postgresql")).toContain(
70
- "id varchar(255) primary key not null",
71
- );
72
- });
73
- });
@@ -1,120 +0,0 @@
1
- import {
2
- bool,
3
- check,
4
- column,
5
- foreignKey,
6
- idColumn,
7
- index,
8
- integer,
9
- json,
10
- relation,
11
- schema,
12
- stringColumn,
13
- table,
14
- uuid,
15
- varchar,
16
- } from "./dsl";
17
- import { createSettingsTable } from "./settings";
18
- import { HOT_UPDATER_SETTINGS_TABLE } from "./types";
19
-
20
- export const bundlesV031 = table(
21
- "bundles",
22
- {
23
- id: idColumn("id", "uuid"),
24
- platform: stringColumn("platform"),
25
- should_force_update: bool("should_force_update"),
26
- enabled: bool("enabled"),
27
- file_hash: stringColumn("file_hash"),
28
- git_commit_hash: stringColumn("git_commit_hash").nullable(),
29
- message: stringColumn("message").nullable(),
30
- channel: stringColumn("channel").defaultTo("production"),
31
- storage_uri: stringColumn("storage_uri"),
32
- target_app_version: stringColumn("target_app_version").nullable(),
33
- fingerprint_hash: stringColumn("fingerprint_hash").nullable(),
34
- metadata: json("metadata").defaultTo({}),
35
- rollout_cohort_count: integer("rollout_cohort_count").defaultTo(1000),
36
- target_cohorts: json("target_cohorts").nullable(),
37
- manifest_storage_uri: stringColumn("manifest_storage_uri").nullable(),
38
- manifest_file_hash: stringColumn("manifest_file_hash").nullable(),
39
- asset_base_storage_uri: stringColumn("asset_base_storage_uri").nullable(),
40
- },
41
- {
42
- indexes: [
43
- index("bundles_target_app_version_idx", ["target_app_version"]),
44
- index("bundles_fingerprint_hash_idx", ["fingerprint_hash"]),
45
- index("bundles_channel_idx", ["channel"]),
46
- index("bundles_platform_idx", ["platform"], ["mongodb"]),
47
- index("bundles_rollout_idx", ["rollout_cohort_count"]),
48
- ],
49
- checks: [
50
- check({
51
- name: "check_version_or_fingerprint",
52
- expression:
53
- "(target_app_version is not null) or (fingerprint_hash is not null)",
54
- sqliteInline: true,
55
- }),
56
- check({
57
- name: "bundles_rollout_cohort_count_check",
58
- expression:
59
- "rollout_cohort_count >= 0 and rollout_cohort_count <= 1000",
60
- sqliteInline: true,
61
- }),
62
- ],
63
- },
64
- );
65
-
66
- export const bundlePatchesV031 = table(
67
- "bundle_patches",
68
- {
69
- id: idColumn("id", varchar(255)),
70
- bundle_id: uuid("bundle_id"),
71
- base_bundle_id: uuid("base_bundle_id"),
72
- base_file_hash: column("base_file_hash", "string"),
73
- patch_file_hash: column("patch_file_hash", "string"),
74
- patch_storage_uri: column("patch_storage_uri", "string"),
75
- order_index: integer("order_index").defaultTo(0),
76
- },
77
- {
78
- indexes: [
79
- index("bundle_patches_bundle_id_idx", ["bundle_id"]),
80
- index("bundle_patches_base_bundle_id_idx", ["base_bundle_id"]),
81
- ],
82
- foreignKeys: [
83
- foreignKey("bundle_patches_bundle_id_fk", ["bundle_id"], "bundles", [
84
- "id",
85
- ]),
86
- foreignKey(
87
- "bundle_patches_base_bundle_id_fk",
88
- ["base_bundle_id"],
89
- "bundles",
90
- ["id"],
91
- ),
92
- ],
93
- relations: [
94
- relation({
95
- name: "bundle",
96
- fieldName: "patches",
97
- targetFieldName: "bundle",
98
- relationName: "bundle_patches_bundles_patches",
99
- columns: ["bundle_id"],
100
- referencedTable: "bundles",
101
- referencedColumns: ["id"],
102
- }),
103
- relation({
104
- name: "baseBundle",
105
- fieldName: "baseForPatches",
106
- targetFieldName: "baseBundle",
107
- relationName: "bundle_patches_bundles_baseForPatches",
108
- columns: ["base_bundle_id"],
109
- referencedTable: "bundles",
110
- referencedColumns: ["id"],
111
- }),
112
- ],
113
- },
114
- );
115
-
116
- export const v0_31_0 = schema({
117
- version: "0.31.0",
118
- settingsTable: HOT_UPDATER_SETTINGS_TABLE,
119
- tables: [bundlesV031, bundlePatchesV031, createSettingsTable("0.31.0")],
120
- });