@hot-updater/cloudflare 1.0.0-rc.46 → 1.0.0-rc.47

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hot-updater/cloudflare",
3
3
  "type": "module",
4
- "version": "1.0.0-rc.46",
4
+ "version": "1.0.0-rc.47",
5
5
  "description": "React Native OTA solution for self-hosted",
6
6
  "main": "dist/index.cjs",
7
7
  "module": "dist/index.mjs",
@@ -55,10 +55,10 @@
55
55
  "cloudflare": "4.2.0",
56
56
  "hono": "4.12.34",
57
57
  "uuidv7": "^1.0.2",
58
- "@hot-updater/cli-tools": "1.0.0-rc.46",
59
- "@hot-updater/plugin-core": "1.0.0-rc.46",
60
- "@hot-updater/server": "1.0.0-rc.46",
61
- "@hot-updater/protocol": "1.0.0-rc.46"
58
+ "@hot-updater/protocol": "1.0.0-rc.47",
59
+ "@hot-updater/cli-tools": "1.0.0-rc.47",
60
+ "@hot-updater/plugin-core": "1.0.0-rc.47",
61
+ "@hot-updater/server": "1.0.0-rc.47"
62
62
  },
63
63
  "devDependencies": {
64
64
  "@cloudflare/vitest-pool-workers": "0.13.0",
@@ -74,7 +74,7 @@
74
74
  "vitest": "4.1.4",
75
75
  "wrangler": "^4.69.0",
76
76
  "xdg-app-paths": "^8.3.0",
77
- "@hot-updater/test-utils": "1.0.0-rc.46"
77
+ "@hot-updater/test-utils": "1.0.0-rc.47"
78
78
  },
79
79
  "scripts": {
80
80
  "build": "tsdown && pnpm build:worker",
@@ -1 +1 @@
1
- This folder contains the built output assets for the worker "hot-updater" generated at 2026-10-10T12:49:43.766Z.
1
+ This folder contains the built output assets for the worker "hot-updater" generated at 2026-10-10T23:06:42.511Z.
@@ -1208,30 +1208,24 @@ function validateReleases(releases, strategy) {
1208
1208
  if (seenIds.has(release.id)) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Duplicate Release ID: ${release.id}`);
1209
1209
  seenIds.add(release.id);
1210
1210
  if (release.strategy !== strategy) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has the wrong strategy`);
1211
- if (release.kind === "BUNDLE" && release.bundleId === null || release.kind === "EMBEDDED" && release.bundleId !== null) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has an invalid kind/Bundle combination`);
1211
+ if (release.bundleId === null) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has no Bundle`);
1212
1212
  if (release.targetCohorts.length > MAX_TARGET_COHORTS_PER_RELEASE) throw new ReleaseCatalogCompilationError("TARGET_COHORT_LIMIT", `Release ${release.id} exceeds ${MAX_TARGET_COHORTS_PER_RELEASE} target cohorts`);
1213
1213
  if (strategy === "APP_VERSION" && (release.targetAppVersion === null || release.fingerprintHash !== null)) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has an invalid app-version target`);
1214
1214
  if (strategy === "FINGERPRINT" && (release.fingerprintHash === null || release.targetAppVersion !== null)) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has an invalid fingerprint target`);
1215
1215
  }
1216
- return enabled.filter((release) => release.kind === "BUNDLE");
1216
+ return enabled;
1217
1217
  }
1218
1218
  __name(validateReleases, "validateReleases");
1219
1219
  function collectFrontierReleaseIds(releases) {
1220
1220
  if (releases.every((release) => normalizeRolloutCohortCount(release.rolloutCohortCount) >= NUMERIC_COHORT_SIZE)) {
1221
1221
  const retained3 = /* @__PURE__ */ new Set();
1222
1222
  const bundleIds = /* @__PURE__ */ new Set();
1223
- let embedded = false;
1224
1223
  for (const release of releases) {
1225
- if (release.kind === "EMBEDDED") {
1226
- if (!embedded) {
1227
- embedded = true;
1228
- retained3.add(release.id);
1229
- }
1230
- } else if (release.bundleId !== null && bundleIds.size < 11 && !bundleIds.has(release.bundleId)) {
1224
+ if (release.bundleId !== null && !bundleIds.has(release.bundleId)) {
1231
1225
  bundleIds.add(release.bundleId);
1232
1226
  retained3.add(release.id);
1233
1227
  }
1234
- if (embedded && bundleIds.size >= 11) break;
1228
+ if (bundleIds.size >= 11) break;
1235
1229
  }
1236
1230
  return retained3;
1237
1231
  }
@@ -1248,7 +1242,6 @@ function collectFrontierReleaseIds(releases) {
1248
1242
  normalized,
1249
1243
  numeric: normalized === void 0 ? null : getNumericCohortValue(normalized),
1250
1244
  bundleIds: /* @__PURE__ */ new Set(),
1251
- embedded: false,
1252
1245
  complete: false
1253
1246
  };
1254
1247
  });
@@ -1273,16 +1266,11 @@ function collectFrontierReleaseIds(releases) {
1273
1266
  for (const index of eligibleStateIndexes) {
1274
1267
  const state = cohortStates[index];
1275
1268
  if (state.complete) continue;
1276
- if (release.kind === "EMBEDDED") {
1277
- if (!state.embedded) {
1278
- state.embedded = true;
1279
- retained2.add(release.id);
1280
- }
1281
- } else if (release.bundleId !== null && state.bundleIds.size < 11 && !state.bundleIds.has(release.bundleId)) {
1269
+ if (release.bundleId !== null && !state.bundleIds.has(release.bundleId)) {
1282
1270
  state.bundleIds.add(release.bundleId);
1283
1271
  retained2.add(release.id);
1284
1272
  }
1285
- if (state.embedded && state.bundleIds.size >= 11) {
1273
+ if (state.bundleIds.size >= 11) {
1286
1274
  state.complete = true;
1287
1275
  incompleteStateCount -= 1;
1288
1276
  }
@@ -1479,12 +1467,11 @@ function projectCompiledCatalog(catalog, appVersion) {
1479
1467
  __name(projectCompiledCatalog, "projectCompiledCatalog");
1480
1468
  function projectCompiledRollbackCatalog(catalog, appVersion) {
1481
1469
  let indexes;
1482
- if (catalog.strategy === "FINGERPRINT") indexes = catalog.rollbackReleaseIndexes ?? catalog.releaseIndexes;
1470
+ if (catalog.strategy === "FINGERPRINT") indexes = catalog.rollbackReleaseIndexes;
1483
1471
  else {
1484
1472
  const canonicalVersion = appVersion && canonicalizeAppVersion(appVersion);
1485
1473
  if (!canonicalVersion) return [];
1486
- const segment = catalog.segments.find((candidate) => versionInSegment(canonicalVersion, candidate));
1487
- indexes = segment?.rollbackReleaseIndexes ?? segment?.releaseIndexes ?? [];
1474
+ indexes = catalog.segments.find((segment) => versionInSegment(canonicalVersion, segment))?.rollbackReleaseIndexes ?? [];
1488
1475
  }
1489
1476
  return indexes.map((index) => catalog.releaseDescriptors[index]);
1490
1477
  }
@@ -1995,7 +1982,7 @@ var SETTINGS_TABLE = {
1995
1982
  var ENGINE_SCHEMA_KEY = "schema.engine";
1996
1983
  var CORE_SCHEMA_KEY = "schema.core";
1997
1984
  var stored = /* @__PURE__ */ __name(({ key, expected, found }) => `"${key}" is ${found === null ? "missing" : `"${found}"`}; expected "${expected}"`, "stored");
1998
- var settingMessage = /* @__PURE__ */ __name((adapterName, { key, expected, found }) => `Hot Updater schema setting "${key}" for ${adapterName} is ${found === null ? "missing" : `"${found}"`}; expected "${expected}". ${key === "schema.engine" ? "Create a new empty database and run `hot-updater db migrate`; databases from before the storage engine are not converted." : "Run `hot-updater db migrate`."}`, "settingMessage");
1985
+ var settingMessage = /* @__PURE__ */ __name((adapterName, { key, expected, found }) => `Hot Updater schema setting "${key}" for ${adapterName} is ${found === null ? "missing" : `"${found}"`}; expected "${expected}". Run \`hot-updater db migrate\`.`, "settingMessage");
1999
1986
  var pluginOf = /* @__PURE__ */ __name(({ key }) => key.startsWith("schema.") && key !== "schema.engine" && key !== CORE_SCHEMA_KEY ? key.slice(7) : void 0, "pluginOf");
2000
1987
  var listed = /* @__PURE__ */ __name((items) => items.length < 2 ? items.join("") : `${items.slice(0, -1).join(", ")} and ${items.at(-1)}`, "listed");
2001
1988
  var PLUGIN_TABLES_FIX = "Run `hot-updater db migrate`. A managed server runs only its provider's plugins, and rerunning `hot-updater init --provider <provider>` applies the provider's migrations. Run `hot-updater db` commands in the server's project: they load the server file named on the command line, or src/hotUpdater.* or src/db.*, and don't read hot-updater.config.ts.";
@@ -2095,24 +2082,12 @@ var METER = /* @__PURE__ */ Symbol.for("@hot-updater/plugin-core/read-meter");
2095
2082
  var readMeterOf = /* @__PURE__ */ __name((database) => typeof database === "object" && database !== null ? database[METER] : void 0, "readMeterOf");
2096
2083
 
2097
2084
  // ../plugin-core/dist/engine/db/schemaSettings.mjs
2098
- var assertEngineDatabase = /* @__PURE__ */ __name((adapterName, stored2) => {
2099
- if (stored2.get("schema.core") && !stored2.get("schema.engine")) throw new HotUpdaterSchemaMigrationRequiredError(adapterName, String(stored2.get("schema.core").value), {
2100
- key: ENGINE_SCHEMA_KEY,
2101
- expected: "1",
2102
- found: null
2103
- });
2104
- }, "assertEngineDatabase");
2105
2085
  var storedSettings = /* @__PURE__ */ __name(async (adapter, keys) => {
2106
2086
  const rows = await readSettings(adapter, keys);
2107
2087
  return new Map(keys.map((key, position) => [key, rows[position] ?? null]));
2108
2088
  }, "storedSettings");
2109
2089
  var writeSchemaSettings = /* @__PURE__ */ __name(async (adapter, adapterName, settings) => {
2110
- const stored2 = await storedSettings(adapter, [.../* @__PURE__ */ new Set([
2111
- "schema.core",
2112
- ENGINE_SCHEMA_KEY,
2113
- ...Object.keys(settings)
2114
- ])]);
2115
- assertEngineDatabase(adapterName, stored2);
2090
+ const stored2 = await storedSettings(adapter, Object.keys(settings));
2116
2091
  const ops = Object.entries(settings).flatMap(([key, value]) => {
2117
2092
  const row = stored2.get(key);
2118
2093
  if (row === null || row === void 0) return [{
@@ -2135,15 +2110,10 @@ var writeSchemaSettings = /* @__PURE__ */ __name(async (adapter, adapterName, se
2135
2110
  }];
2136
2111
  });
2137
2112
  if (ops.length === 0) return;
2138
- if (!(await adapter.write(ops)).ok) throw new Error("The schema settings changed during the migration; run it again.");
2113
+ if (!(await adapter.write(ops)).ok) throw new Error(`${adapterName}: the schema settings changed during the migration; run it again.`);
2139
2114
  }, "writeSchemaSettings");
2140
2115
  var migrateSchema = /* @__PURE__ */ __name(async (adapter, adapterName, tables, settings) => {
2141
2116
  if (adapter.migrations === void 0) throw new Error(`${adapterName} creates its tables with its own tooling; write only the settings rows.`);
2142
- const stored2 = await storedSettings(adapter, ["schema.core", ENGINE_SCHEMA_KEY]).catch((error) => {
2143
- if (!isMissingSchemaError(error)) throw error;
2144
- return /* @__PURE__ */ new Map();
2145
- });
2146
- assertEngineDatabase(adapterName, stored2);
2147
2117
  await adapter.migrations.apply([...tables, SETTINGS_TABLE]);
2148
2118
  await writeSchemaSettings(adapter, adapterName, settings);
2149
2119
  }, "migrateSchema");
@@ -2568,15 +2538,11 @@ var storedSchemaVersion = /* @__PURE__ */ __name((stored2) => {
2568
2538
  const version2 = stored2?.get("schema.core") ?? stored2?.get("version");
2569
2539
  return typeof version2 === "string" ? version2 : void 0;
2570
2540
  }, "storedSchemaVersion");
2571
- var refusePreEngineDatabase = /* @__PURE__ */ __name((adapterName, stored2) => {
2572
- const version2 = storedSchemaVersion(stored2);
2573
- if (version2 === void 0 || stored2.has("schema.engine")) return;
2574
- throw new HotUpdaterSchemaMigrationRequiredError(adapterName, version2, stored2.has("schema.core") ? {
2575
- key: ENGINE_SCHEMA_KEY,
2576
- expected: "1",
2577
- found: null
2578
- } : void 0);
2579
- }, "refusePreEngineDatabase");
2541
+ var refuseV0Database = /* @__PURE__ */ __name((adapterName, stored2) => {
2542
+ const version2 = stored2.get("version");
2543
+ if (typeof version2 !== "string" || stored2.has("schema.engine")) return;
2544
+ throw new HotUpdaterSchemaMigrationRequiredError(adapterName, version2);
2545
+ }, "refuseV0Database");
2580
2546
 
2581
2547
  // ../plugin-core/dist/engine/database/cursor.mjs
2582
2548
  var encoder = new TextEncoder();
@@ -3509,7 +3475,7 @@ var createEngineMigrator = /* @__PURE__ */ __name((options) => {
3509
3475
  const getVersion = /* @__PURE__ */ __name(async () => storedSchemaVersion(await options.readSettings()), "getVersion");
3510
3476
  const makeResult = /* @__PURE__ */ __name(async (migrate = {}) => {
3511
3477
  const stored2 = await options.readSettings();
3512
- refusePreEngineDatabase(options.adapterName, stored2);
3478
+ refuseV0Database(options.adapterName, stored2);
3513
3479
  if (Object.entries(options.settings).every(([key, value]) => stored2.get(key) === value)) return getEmptyMigrationResult();
3514
3480
  return {
3515
3481
  operations: [...options.schema.tables.map((table) => ({
@@ -4544,7 +4510,7 @@ var createSqlAdapter = /* @__PURE__ */ __name(({ executor, tablePrefix = "", max
4544
4510
  }, "createSqlAdapter");
4545
4511
 
4546
4512
  // ../../packages/server/dist/package.mjs
4547
- var version = "1.0.0-rc.46";
4513
+ var version = "1.0.0-rc.47";
4548
4514
 
4549
4515
  // ../../packages/server/dist/version.mjs
4550
4516
  var HOT_UPDATER_SERVER_VERSION = version;
@@ -5238,7 +5204,7 @@ var baseBundleIdsOf = /* @__PURE__ */ __name((row, range, bundleId, limit) => {
5238
5204
  for (const { descriptor, index } of newestFirst) {
5239
5205
  if (ids.length >= limit) break;
5240
5206
  const id = descriptor.bundleId;
5241
- if (serving.has(index) && descriptor.kind === "BUNDLE" && id !== null && id < bundleId && !ids.includes(id)) ids.push(id);
5207
+ if (serving.has(index) && id !== null && id < bundleId && !ids.includes(id)) ids.push(id);
5242
5208
  }
5243
5209
  return ids;
5244
5210
  }, "baseBundleIdsOf");
@@ -5969,7 +5935,7 @@ var createCoreOperations = /* @__PURE__ */ __name((db, { now = Date.now } = {})
5969
5935
  }), "deleteRelease"),
5970
5936
  promoteRelease: /* @__PURE__ */ __name((input) => withChannels(async () => {
5971
5937
  const checkSource = /* @__PURE__ */ __name((source) => {
5972
- if (source.kind !== "BUNDLE" || source.bundle_id === null) throw new ReleaseManagementError("TARGET_RELEASE_INVALID", "Only a Bundle Release can be promoted.");
5938
+ if (source.bundle_id === null) throw new ReleaseManagementError("TARGET_RELEASE_INVALID", "Only a Bundle Release can be promoted.");
5973
5939
  }, "checkSource");
5974
5940
  checkSource((await db.transaction((tx) => loadTarget(tx, input))).release);
5975
5941
  const targetChannel = input.targetChannel.trim();
@@ -6161,7 +6127,6 @@ var fail3 = /* @__PURE__ */ __name((message) => {
6161
6127
  var isRecord2 = /* @__PURE__ */ __name((value) => typeof value === "object" && value !== null && !Array.isArray(value), "isRecord");
6162
6128
  var checkPlugin = /* @__PURE__ */ __name((value, at) => {
6163
6129
  if (!isRecord2(value)) return fail3(`${at} is not a plugin.`);
6164
- if ("kind" in value) fail3(`${at} has a kind; core is built in and is never passed as a plugin.`);
6165
6130
  const unknown = Object.keys(value).find((key) => !PLUGIN_KEYS.has(key));
6166
6131
  if (unknown !== void 0) fail3(`${at} has an unknown key "${unknown}".`);
6167
6132
  const plugin = value;