@hot-updater/cloudflare 1.0.0-rc.4 → 1.0.0-rc.5

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.
@@ -143,7 +143,7 @@ const eventRow = (row) => {
143
143
  const platform = stringValue(row, "platform", "bundle_events");
144
144
  const fromBundleId = nullableString(row, "from_bundle_id", "bundle_events");
145
145
  const updateStrategy = nullableString(row, "update_strategy", "bundle_events");
146
- if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED" || type === "RELEASE_ADOPTED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) throw new InvalidD1RowError("bundle_events");
146
+ if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) throw new InvalidD1RowError("bundle_events");
147
147
  return {
148
148
  id: stringValue(row, "id", "bundle_events"),
149
149
  type,
@@ -170,7 +170,6 @@ const installationRow = (row) => {
170
170
  if (![
171
171
  "UPDATE_APPLIED",
172
172
  "RECOVERED",
173
- "RELEASE_ADOPTED",
174
173
  "UNCHANGED"
175
174
  ].includes(type) || platform !== "ios" && platform !== "android") throw new InvalidD1RowError("bundle_installations");
176
175
  return {
@@ -135,7 +135,7 @@ const eventRow = (row) => {
135
135
  const platform = stringValue(row, "platform", "bundle_events");
136
136
  const fromBundleId = nullableString(row, "from_bundle_id", "bundle_events");
137
137
  const updateStrategy = nullableString(row, "update_strategy", "bundle_events");
138
- if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED" || type === "RELEASE_ADOPTED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) throw new InvalidD1RowError("bundle_events");
138
+ if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) throw new InvalidD1RowError("bundle_events");
139
139
  return {
140
140
  id: stringValue(row, "id", "bundle_events"),
141
141
  type,
@@ -162,7 +162,6 @@ const installationRow = (row) => {
162
162
  if (![
163
163
  "UPDATE_APPLIED",
164
164
  "RECOVERED",
165
- "RELEASE_ADOPTED",
166
165
  "UNCHANGED"
167
166
  ].includes(type) || platform !== "ios" && platform !== "android") throw new InvalidD1RowError("bundle_installations");
168
167
  return {
package/dist/index.cjs CHANGED
@@ -113,7 +113,7 @@ const eventRow = (row) => {
113
113
  const platform = stringValue(row, "platform", "bundle_events");
114
114
  const fromBundleId = nullableString(row, "from_bundle_id", "bundle_events");
115
115
  const updateStrategy = nullableString(row, "update_strategy", "bundle_events");
116
- if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED" || type === "RELEASE_ADOPTED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) throw new InvalidD1RowError("bundle_events");
116
+ if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) throw new InvalidD1RowError("bundle_events");
117
117
  return {
118
118
  id: stringValue(row, "id", "bundle_events"),
119
119
  type,
@@ -140,7 +140,6 @@ const installationRow = (row) => {
140
140
  if (![
141
141
  "UPDATE_APPLIED",
142
142
  "RECOVERED",
143
- "RELEASE_ADOPTED",
144
143
  "UNCHANGED"
145
144
  ].includes(type) || platform !== "ios" && platform !== "android") throw new InvalidD1RowError("bundle_installations");
146
145
  return {
package/dist/index.mjs CHANGED
@@ -89,7 +89,7 @@ const eventRow = (row) => {
89
89
  const platform = stringValue(row, "platform", "bundle_events");
90
90
  const fromBundleId = nullableString(row, "from_bundle_id", "bundle_events");
91
91
  const updateStrategy = nullableString(row, "update_strategy", "bundle_events");
92
- if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED" || type === "RELEASE_ADOPTED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) throw new InvalidD1RowError("bundle_events");
92
+ if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) throw new InvalidD1RowError("bundle_events");
93
93
  return {
94
94
  id: stringValue(row, "id", "bundle_events"),
95
95
  type,
@@ -116,7 +116,6 @@ const installationRow = (row) => {
116
116
  if (![
117
117
  "UPDATE_APPLIED",
118
118
  "RECOVERED",
119
- "RELEASE_ADOPTED",
120
119
  "UNCHANGED"
121
120
  ].includes(type) || platform !== "ios" && platform !== "android") throw new InvalidD1RowError("bundle_installations");
122
121
  return {
@@ -87,7 +87,7 @@ const eventRow = (row) => {
87
87
  const platform = stringValue(row, "platform", "bundle_events");
88
88
  const fromBundleId = nullableString(row, "from_bundle_id", "bundle_events");
89
89
  const updateStrategy = nullableString(row, "update_strategy", "bundle_events");
90
- if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED" || type === "RELEASE_ADOPTED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) throw new InvalidD1RowError("bundle_events");
90
+ if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) throw new InvalidD1RowError("bundle_events");
91
91
  return {
92
92
  id: stringValue(row, "id", "bundle_events"),
93
93
  type,
@@ -114,7 +114,6 @@ const installationRow = (row) => {
114
114
  if (![
115
115
  "UPDATE_APPLIED",
116
116
  "RECOVERED",
117
- "RELEASE_ADOPTED",
118
117
  "UNCHANGED"
119
118
  ].includes(type) || platform !== "ios" && platform !== "android") throw new InvalidD1RowError("bundle_installations");
120
119
  return {
@@ -86,7 +86,7 @@ const eventRow = (row) => {
86
86
  const platform = stringValue(row, "platform", "bundle_events");
87
87
  const fromBundleId = nullableString(row, "from_bundle_id", "bundle_events");
88
88
  const updateStrategy = nullableString(row, "update_strategy", "bundle_events");
89
- if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED" || type === "RELEASE_ADOPTED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) throw new InvalidD1RowError("bundle_events");
89
+ if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) throw new InvalidD1RowError("bundle_events");
90
90
  return {
91
91
  id: stringValue(row, "id", "bundle_events"),
92
92
  type,
@@ -113,7 +113,6 @@ const installationRow = (row) => {
113
113
  if (![
114
114
  "UPDATE_APPLIED",
115
115
  "RECOVERED",
116
- "RELEASE_ADOPTED",
117
116
  "UNCHANGED"
118
117
  ].includes(type) || platform !== "ios" && platform !== "android") throw new InvalidD1RowError("bundle_installations");
119
118
  return {
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.4",
4
+ "version": "1.0.0-rc.5",
5
5
  "description": "React Native OTA solution for self-hosted",
6
6
  "main": "dist/index.cjs",
7
7
  "module": "dist/index.mjs",
@@ -60,9 +60,9 @@
60
60
  "cloudflare": "4.2.0",
61
61
  "hono": "4.12.34",
62
62
  "uuidv7": "^1.0.2",
63
- "@hot-updater/cli-tools": "1.0.0-rc.2",
64
- "@hot-updater/plugin-core": "1.0.0-rc.2",
65
- "@hot-updater/server": "1.0.0-rc.2",
63
+ "@hot-updater/cli-tools": "1.0.0-rc.3",
64
+ "@hot-updater/server": "1.0.0-rc.3",
65
+ "@hot-updater/plugin-core": "1.0.0-rc.3",
66
66
  "@hot-updater/core": "1.0.0-rc.0"
67
67
  },
68
68
  "devDependencies": {
@@ -79,7 +79,7 @@
79
79
  "vitest": "4.1.4",
80
80
  "wrangler": "^4.69.0",
81
81
  "xdg-app-paths": "^8.3.0",
82
- "@hot-updater/test-utils": "1.0.0-rc.2"
82
+ "@hot-updater/test-utils": "1.0.0-rc.3"
83
83
  },
84
84
  "scripts": {
85
85
  "build": "tsdown && pnpm build:worker",
package/sql/bundles.sql CHANGED
@@ -129,14 +129,14 @@ CREATE TABLE bundle_events (
129
129
  sdk_version TEXT,
130
130
  received_at_ms REAL NOT NULL,
131
131
  CONSTRAINT bundle_events_type_check CHECK (
132
- type IN ('UPDATE_APPLIED', 'RECOVERED', 'RELEASE_ADOPTED', 'UNCHANGED')
132
+ type IN ('UPDATE_APPLIED', 'RECOVERED', 'UNCHANGED')
133
133
  ),
134
134
  CONSTRAINT bundle_events_platform_check CHECK (
135
135
  platform IN ('ios', 'android')
136
136
  ),
137
137
  CONSTRAINT bundle_events_shape_check CHECK (
138
138
  (
139
- type IN ('UPDATE_APPLIED', 'RECOVERED', 'RELEASE_ADOPTED')
139
+ type IN ('UPDATE_APPLIED', 'RECOVERED')
140
140
  AND from_bundle_id IS NOT NULL
141
141
  AND update_strategy IS NOT NULL
142
142
  AND update_strategy IN ('fingerprint', 'appVersion')
@@ -162,7 +162,7 @@ CREATE TABLE bundle_installations (
162
162
  cohort TEXT NOT NULL,
163
163
  received_at_ms REAL NOT NULL,
164
164
  CONSTRAINT bundle_installations_type_check CHECK (
165
- type IN ('UPDATE_APPLIED', 'RECOVERED', 'RELEASE_ADOPTED', 'UNCHANGED')
165
+ type IN ('UPDATE_APPLIED', 'RECOVERED', 'UNCHANGED')
166
166
  ),
167
167
  CONSTRAINT bundle_installations_platform_check CHECK (
168
168
  platform IN ('ios', 'android')
package/src/d1Rows.ts CHANGED
@@ -157,9 +157,7 @@ const eventRow = (row: Record<string, unknown>): BundleEventRow => {
157
157
  if (
158
158
  (platform !== "ios" && platform !== "android") ||
159
159
  !(
160
- ((type === "UPDATE_APPLIED" ||
161
- type === "RECOVERED" ||
162
- type === "RELEASE_ADOPTED") &&
160
+ ((type === "UPDATE_APPLIED" || type === "RECOVERED") &&
163
161
  typeof fromBundleId === "string" &&
164
162
  (updateStrategy === "fingerprint" ||
165
163
  updateStrategy === "appVersion")) ||
@@ -195,9 +193,7 @@ const installationRow = (
195
193
  const type = stringValue(row, "type", "bundle_installations");
196
194
  const platform = stringValue(row, "platform", "bundle_installations");
197
195
  if (
198
- !["UPDATE_APPLIED", "RECOVERED", "RELEASE_ADOPTED", "UNCHANGED"].includes(
199
- type,
200
- ) ||
196
+ !["UPDATE_APPLIED", "RECOVERED", "UNCHANGED"].includes(type) ||
201
197
  (platform !== "ios" && platform !== "android")
202
198
  ) {
203
199
  throw new InvalidD1RowError("bundle_installations");
@@ -1 +1 @@
1
- This folder contains the built output assets for the worker "hot-updater" generated at 2026-09-07T16:48:58.553Z.
1
+ This folder contains the built output assets for the worker "hot-updater" generated at 2026-09-08T01:48:53.178Z.
@@ -2,7 +2,7 @@ var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
 
4
4
  // ../../packages/server/dist/package.mjs
5
- var version = "1.0.0-rc.2";
5
+ var version = "1.0.0-rc.3";
6
6
 
7
7
  // ../../packages/server/dist/version.mjs
8
8
  var HOT_UPDATER_SERVER_VERSION = version;
@@ -831,7 +831,7 @@ var modelValidators = {
831
831
  },
832
832
  bundle_events: {
833
833
  id: /* @__PURE__ */ __name((value) => typeof value === "string", "id"),
834
- type: /* @__PURE__ */ __name((value) => value === "UPDATE_APPLIED" || value === "RECOVERED" || value === "RELEASE_ADOPTED" || value === "UNCHANGED", "type"),
834
+ type: /* @__PURE__ */ __name((value) => value === "UPDATE_APPLIED" || value === "RECOVERED" || value === "UNCHANGED", "type"),
835
835
  install_id: isInsightsIdentityText,
836
836
  user_id: isNullableInsightsIdentityText,
837
837
  username: /* @__PURE__ */ __name((value) => value === null || typeof value === "string", "username"),
@@ -854,7 +854,7 @@ var modelValidators = {
854
854
  user_id: isNullableInsightsIdentityText,
855
855
  username: /* @__PURE__ */ __name((value) => value === null || typeof value === "string", "username"),
856
856
  to_bundle_id: /* @__PURE__ */ __name((value) => typeof value === "string", "to_bundle_id"),
857
- type: /* @__PURE__ */ __name((value) => value === "UPDATE_APPLIED" || value === "RECOVERED" || value === "RELEASE_ADOPTED" || value === "UNCHANGED", "type"),
857
+ type: /* @__PURE__ */ __name((value) => value === "UPDATE_APPLIED" || value === "RECOVERED" || value === "UNCHANGED", "type"),
858
858
  platform: /* @__PURE__ */ __name((value) => value === "ios" || value === "android", "platform"),
859
859
  app_version: /* @__PURE__ */ __name((value) => typeof value === "string", "app_version"),
860
860
  channel: /* @__PURE__ */ __name((value) => typeof value === "string", "channel"),
@@ -1057,7 +1057,7 @@ var hasValidReleaseInvariants = /* @__PURE__ */ __name((data) => {
1057
1057
  const fingerprintHash = data.fingerprint_hash;
1058
1058
  return (kind === "BUNDLE" && typeof bundleId === "string" || kind === "EMBEDDED" && bundleId === null) && (strategy === "APP_VERSION" && typeof targetAppVersion === "string" && fingerprintHash === null || strategy === "FINGERPRINT" && targetAppVersion === null && typeof fingerprintHash === "string");
1059
1059
  }, "hasValidReleaseInvariants");
1060
- var hasValidBundleEventInvariants = /* @__PURE__ */ __name((data) => (data.type === "UPDATE_APPLIED" || data.type === "RECOVERED" || data.type === "RELEASE_ADOPTED") && typeof data.from_bundle_id === "string" && (data.update_strategy === "fingerprint" || data.update_strategy === "appVersion") || data.type === "UNCHANGED" && data.from_bundle_id === null && data.update_strategy === null, "hasValidBundleEventInvariants");
1060
+ var hasValidBundleEventInvariants = /* @__PURE__ */ __name((data) => (data.type === "UPDATE_APPLIED" || data.type === "RECOVERED") && typeof data.from_bundle_id === "string" && (data.update_strategy === "fingerprint" || data.update_strategy === "appVersion") || data.type === "UNCHANGED" && data.from_bundle_id === null && data.update_strategy === null, "hasValidBundleEventInvariants");
1061
1061
  var validateCreateData = /* @__PURE__ */ __name((model, data) => {
1062
1062
  if (!isRecord(data)) throw new DatabasePluginInputError("invalid-data");
1063
1063
  validateFields(model, Object.keys(data));
@@ -1126,7 +1126,7 @@ var isBundleFilter = /* @__PURE__ */ __name((value, withKind = false) => {
1126
1126
  "type",
1127
1127
  ...withKind ? ["kind"] : []
1128
1128
  ];
1129
- return value.type === "RECOVERED" ? isText(value.fromBundleId) && hasOnlyKeys(value, [...keys, "fromBundleId"]) : (value.type === "UPDATE_APPLIED" || value.type === "RELEASE_ADOPTED") && isText(value.toBundleId) && hasOnlyKeys(value, [...keys, "toBundleId"]);
1129
+ return value.type === "RECOVERED" ? isText(value.fromBundleId) && hasOnlyKeys(value, [...keys, "fromBundleId"]) : (value.type === "UPDATE_APPLIED" || value.type === "UNCHANGED") && isText(value.toBundleId) && hasOnlyKeys(value, [...keys, "toBundleId"]);
1130
1130
  }, "isBundleFilter");
1131
1131
  var isEventFilter = /* @__PURE__ */ __name((value) => {
1132
1132
  if (!isRecord(value)) return false;
@@ -4333,8 +4333,7 @@ function requireEvent(payload) {
4333
4333
  const type = requireStringField(payload, "type");
4334
4334
  switch (type) {
4335
4335
  case "UPDATE_APPLIED":
4336
- case "RECOVERED":
4337
- case "RELEASE_ADOPTED": {
4336
+ case "RECOVERED": {
4338
4337
  const updateStrategy = requireStringField(payload, "updateStrategy");
4339
4338
  if (updateStrategy !== "fingerprint" && updateStrategy !== "appVersion") throw new InsightsBadRequestError("Invalid event field: updateStrategy");
4340
4339
  return {
@@ -4382,7 +4381,6 @@ function createBundleEventRow(input) {
4382
4381
  switch (input.type) {
4383
4382
  case "UPDATE_APPLIED":
4384
4383
  case "RECOVERED":
4385
- case "RELEASE_ADOPTED":
4386
4384
  return {
4387
4385
  ...base,
4388
4386
  from_bundle_id: input.fromBundleId,
@@ -4452,7 +4450,7 @@ var parseEventPageInput = /* @__PURE__ */ __name((request) => {
4452
4450
  let bundle;
4453
4451
  if (bundleFields.some((key) => url.searchParams.has(key))) {
4454
4452
  const outcome = readSingle(url, "outcome");
4455
- if (outcome !== "applied" && outcome !== "recovered" && outcome !== "adopted") throw new InsightsBadRequestError("Invalid 'outcome' query parameter.");
4453
+ if (outcome !== "applied" && outcome !== "recovered" && outcome !== "unchanged") throw new InsightsBadRequestError("Invalid 'outcome' query parameter.");
4456
4454
  bundle = {
4457
4455
  ...readScope(url),
4458
4456
  bundleId: readId(url, "bundleId", 1024),
@@ -4779,10 +4777,10 @@ var bundleFilter = /* @__PURE__ */ __name((input) => {
4779
4777
  type: "RECOVERED",
4780
4778
  fromBundleId: bundleId
4781
4779
  };
4782
- case "adopted":
4780
+ case "unchanged":
4783
4781
  return {
4784
4782
  ...scope,
4785
- type: "RELEASE_ADOPTED",
4783
+ type: "UNCHANGED",
4786
4784
  toBundleId: bundleId
4787
4785
  };
4788
4786
  default:
@@ -4993,7 +4991,7 @@ var createInsightsProvider = /* @__PURE__ */ __name((model) => Object.freeze({
4993
4991
  sinceMs,
4994
4992
  beforeReceivedAtMs
4995
4993
  })), "countOutcome");
4996
- const [reportingInstallations, bundleInstallations, appliedReports, recoveredReports, adoptedReports] = await Promise.all([
4994
+ const [reportingInstallations, bundleInstallations, appliedReports, recoveredReports, unchangedReports] = await Promise.all([
4997
4995
  reporting,
4998
4996
  measure(model.countInstallations({
4999
4997
  ...scope,
@@ -5002,7 +5000,7 @@ var createInsightsProvider = /* @__PURE__ */ __name((model) => Object.freeze({
5002
5000
  })),
5003
5001
  countOutcome("applied"),
5004
5002
  countOutcome("recovered"),
5005
- countOutcome("adopted")
5003
+ countOutcome("unchanged")
5006
5004
  ]);
5007
5005
  return {
5008
5006
  ...scope,
@@ -5015,7 +5013,7 @@ var createInsightsProvider = /* @__PURE__ */ __name((model) => Object.freeze({
5015
5013
  reportingInstallations: bundleInstallations,
5016
5014
  appliedReports,
5017
5015
  recoveredReports,
5018
- adoptedReports
5016
+ unchangedReports
5019
5017
  }
5020
5018
  };
5021
5019
  }
@@ -7992,7 +7990,7 @@ var eventRow = /* @__PURE__ */ __name((row) => {
7992
7990
  "update_strategy",
7993
7991
  "bundle_events"
7994
7992
  );
7995
- if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED" || type === "RELEASE_ADOPTED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) {
7993
+ if (platform !== "ios" && platform !== "android" || !((type === "UPDATE_APPLIED" || type === "RECOVERED") && typeof fromBundleId === "string" && (updateStrategy === "fingerprint" || updateStrategy === "appVersion") || type === "UNCHANGED" && fromBundleId === null && updateStrategy === null)) {
7996
7994
  throw new InvalidD1RowError("bundle_events");
7997
7995
  }
7998
7996
  return {
@@ -8018,9 +8016,7 @@ var eventRow = /* @__PURE__ */ __name((row) => {
8018
8016
  var installationRow = /* @__PURE__ */ __name((row) => {
8019
8017
  const type = stringValue(row, "type", "bundle_installations");
8020
8018
  const platform = stringValue(row, "platform", "bundle_installations");
8021
- if (!["UPDATE_APPLIED", "RECOVERED", "RELEASE_ADOPTED", "UNCHANGED"].includes(
8022
- type
8023
- ) || platform !== "ios" && platform !== "android") {
8019
+ if (!["UPDATE_APPLIED", "RECOVERED", "UNCHANGED"].includes(type) || platform !== "ios" && platform !== "android") {
8024
8020
  throw new InvalidD1RowError("bundle_installations");
8025
8021
  }
8026
8022
  return {