@absolutejs/absolute 0.20.0-beta.90 → 0.20.0-beta.91

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/CHANGELOG.md CHANGED
@@ -6,6 +6,12 @@ This file is generated by `absolute-changelog` from the entries in
6
6
  `changelog/`. Edit an entry, not this file — and add new ones under
7
7
  `changelog/unreleased/`.
8
8
 
9
+ ## 0.20.0-beta.91 — 2026-09-13
10
+
11
+ ### Added
12
+
13
+ - **Expo iOS now has an automated installed-app replacement gate for native Auth, encrypted Sync migration, and exactly-once recovery.** (`AbsoluteIosInstalledApp`, `AbsoluteIosUpgradeCommandResult`, `assertAbsoluteIosInstalledAppUpgrade`, `inspectAbsoluteIosInstalledApp`, `parseAbsoluteIosInstalledAppInfo`)
14
+
9
15
  ## 0.20.0-beta.90 — 2026-09-13
10
16
 
11
17
  ### Added
package/changelog.json CHANGED
@@ -2,6 +2,23 @@
2
2
  "contract": 1,
3
3
  "name": "@absolutejs/absolute",
4
4
  "releases": [
5
+ {
6
+ "changes": [
7
+ {
8
+ "kind": "added",
9
+ "summary": "Expo iOS now has an automated installed-app replacement gate for native Auth, encrypted Sync migration, and exactly-once recovery.",
10
+ "symbols": [
11
+ "AbsoluteIosInstalledApp",
12
+ "AbsoluteIosUpgradeCommandResult",
13
+ "assertAbsoluteIosInstalledAppUpgrade",
14
+ "inspectAbsoluteIosInstalledApp",
15
+ "parseAbsoluteIosInstalledAppInfo"
16
+ ]
17
+ }
18
+ ],
19
+ "date": "2026-09-13",
20
+ "version": "0.20.0-beta.91"
21
+ },
5
22
  {
6
23
  "changes": [
7
24
  {
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  var __require = import.meta.require;
3
3
 
4
- // .angular-partial-tmp-qD4cCn/src/core/streamingSlotRegistrar.ts
4
+ // .angular-partial-tmp-rATpjE/src/core/streamingSlotRegistrar.ts
5
5
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
6
6
  var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
7
7
  var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  var __require = import.meta.require;
3
3
 
4
- // .angular-partial-tmp-qD4cCn/src/core/streamingSlotRegistrar.ts
4
+ // .angular-partial-tmp-rATpjE/src/core/streamingSlotRegistrar.ts
5
5
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
6
6
  var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
7
7
  var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
@@ -48,7 +48,7 @@ var warnMissingStreamingSlotCollector = (primitiveName) => {
48
48
  getWarningController()?.maybeWarn(primitiveName);
49
49
  };
50
50
 
51
- // .angular-partial-tmp-qD4cCn/src/core/streamingSlotRegistry.ts
51
+ // .angular-partial-tmp-rATpjE/src/core/streamingSlotRegistry.ts
52
52
  var STREAMING_SLOT_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotAsyncLocalStorage");
53
53
  var isObjectRecord2 = (value) => Boolean(value) && typeof value === "object";
54
54
  var isAsyncLocalStorage = (value) => isObjectRecord2(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
@@ -24345,6 +24345,76 @@ var installAbsoluteIosRelease = async (options) => {
24345
24345
  const { artifact: _artifact, ...releaseMetadata } = metadata;
24346
24346
  return installRelease2(options.artifactPath, releaseMetadata, safeOutputDirectory2(options.projectRoot, options.outputDirectory));
24347
24347
  };
24348
+ // src/mobile/iosUpgradeConformance.ts
24349
+ var captureCommand4 = async (command) => {
24350
+ const process2 = Bun.spawn(command, { stderr: "pipe", stdout: "pipe" });
24351
+ const [exitCode, stderr, stdout] = await Promise.all([
24352
+ process2.exited,
24353
+ new Response(process2.stderr).text(),
24354
+ new Response(process2.stdout).text()
24355
+ ]);
24356
+ return { exitCode, stderr, stdout };
24357
+ };
24358
+ var requiredOutput = (result, message) => {
24359
+ const value = result.stdout.trim();
24360
+ if (result.exitCode !== 0 || !value)
24361
+ throw new Error(`${message}: ${result.stderr.trim() || value || "no output"}`);
24362
+ return value;
24363
+ };
24364
+ var inspectAbsoluteIosInstalledApp = async (xcrun, udid, appId, run = captureCommand4, plutil = "/usr/bin/plutil") => {
24365
+ const dataContainer = requiredOutput(await run([xcrun, "simctl", "get_app_container", udid, appId, "data"]), `Could not inspect the installed iOS data container for ${appId}`);
24366
+ const appContainer = requiredOutput(await run([xcrun, "simctl", "get_app_container", udid, appId, "app"]), `Could not inspect the installed iOS application container for ${appId}`);
24367
+ const info = requiredOutput(await run([
24368
+ plutil,
24369
+ "-convert",
24370
+ "json",
24371
+ "-o",
24372
+ "-",
24373
+ `${appContainer}/Info.plist`
24374
+ ]), `Could not inspect the installed iOS Info.plist for ${appId}`);
24375
+ return parseAbsoluteIosInstalledAppInfo(appId, appContainer, dataContainer, info);
24376
+ };
24377
+ var parseAbsoluteIosInstalledAppInfo = (appId, appContainer, dataContainer, output) => {
24378
+ let value;
24379
+ try {
24380
+ value = JSON.parse(output);
24381
+ } catch {
24382
+ throw new TypeError("Invalid installed iOS application Info.plist JSON.");
24383
+ }
24384
+ if (!value || typeof value !== "object")
24385
+ throw new TypeError("Invalid installed iOS application Info.plist JSON.");
24386
+ const bundleId = Reflect.get(value, "CFBundleIdentifier");
24387
+ if (bundleId !== appId)
24388
+ throw new Error(`Installed iOS application identifier mismatch (${String(bundleId)} != ${appId}).`);
24389
+ const buildNumber = Reflect.get(value, "CFBundleVersion");
24390
+ const version = Reflect.get(value, "CFBundleShortVersionString");
24391
+ return {
24392
+ appContainer,
24393
+ appId,
24394
+ ...typeof buildNumber === "string" || typeof buildNumber === "number" ? { buildNumber: String(buildNumber) } : {},
24395
+ dataContainer,
24396
+ ...typeof version === "string" ? { version } : {}
24397
+ };
24398
+ };
24399
+ var numericBuild = (value) => {
24400
+ if (!value || !/^\d+$/u.test(value))
24401
+ return;
24402
+ return BigInt(value);
24403
+ };
24404
+ var assertAbsoluteIosInstalledAppUpgrade = (before, after) => {
24405
+ if (before.appId !== after.appId)
24406
+ throw new Error(`iOS bundle identifier changed during the replacement upgrade (${before.appId} -> ${after.appId}).`);
24407
+ if (!before.dataContainer || !after.dataContainer)
24408
+ throw new Error("iOS did not report a data container for the upgrade proof.");
24409
+ if (before.dataContainer !== after.dataContainer)
24410
+ throw new Error("iOS data container changed during the replacement upgrade.");
24411
+ const beforeBuild = numericBuild(before.buildNumber);
24412
+ const afterBuild = numericBuild(after.buildNumber);
24413
+ if (beforeBuild === undefined || afterBuild === undefined)
24414
+ throw new Error("iOS did not report numeric CFBundleVersion values for the upgrade proof.");
24415
+ if (afterBuild <= beforeBuild)
24416
+ throw new Error(`iOS CFBundleVersion did not increase (${before.buildNumber} -> ${after.buildNumber}).`);
24417
+ };
24348
24418
  // src/mobile/iosConformance.ts
24349
24419
  import { readFile as readFile6, stat as stat3 } from "fs/promises";
24350
24420
  var HMR_LINE = new RegExp(String.raw`\[hmr:ios\]\s+([^\n]*?)\s+(applied in|falling back to reload after|failed after)\s+(\d+)ms(?:; server\s+(\d+)ms, client\s+(\d+)ms)?`, "u");
@@ -30225,7 +30295,7 @@ fs.promises.realpath = async (value, options) => remap(await promiseRealpath(val
30225
30295
  `;
30226
30296
  var expoDevelopmentClientScheme = (appId) => `exp+${appId.toLowerCase().replaceAll(/[^a-z0-9]+/gu, "-")}`;
30227
30297
  var expoDevelopmentClientUrl = (appId, host3, port) => `${expoDevelopmentClientScheme(appId)}://expo-development-client/?url=${encodeURIComponent(`http://${host3}:${port}`)}`;
30228
- var captureCommand4 = (command) => {
30298
+ var captureCommand5 = (command) => {
30229
30299
  const result = Bun.spawnSync(command, {
30230
30300
  killSignal: "SIGKILL",
30231
30301
  stderr: "ignore",
@@ -30550,7 +30620,7 @@ var installAbsoluteExpoAndroidRelease = async (options) => {
30550
30620
  const host3 = options.host ?? detectAbsoluteMobileHost();
30551
30621
  const project = options.config.nativeProjectDirectory;
30552
30622
  const executable = options.executable ?? await absoluteExpoExecutable(project);
30553
- const capture = options.capture ?? captureCommand4;
30623
+ const capture = options.capture ?? captureCommand5;
30554
30624
  const run = options.spawnProcess ?? spawn;
30555
30625
  const log = options.log ?? (() => {
30556
30626
  return;
@@ -30599,7 +30669,7 @@ var installAbsoluteExpoIosRelease = async (options) => {
30599
30669
  throw new TypeError("The Expo iOS release installer requires the ios platform.");
30600
30670
  const project = options.config.nativeProjectDirectory;
30601
30671
  const executable = options.executable ?? await absoluteExpoExecutable(project);
30602
- const capture = options.capture ?? captureCommand4;
30672
+ const capture = options.capture ?? captureCommand5;
30603
30673
  const run = options.spawnProcess ?? spawn;
30604
30674
  const log = options.log ?? (() => {
30605
30675
  return;
@@ -30688,7 +30758,7 @@ var startAbsoluteExpoDevSession = async (options) => {
30688
30758
  const executable = options.executable ?? await absoluteExpoExecutable(plan.project);
30689
30759
  const run = options.spawnProcess ?? spawn;
30690
30760
  const host3 = options.host ?? detectAbsoluteMobileHost();
30691
- const capture = options.capture ?? captureCommand4;
30761
+ const capture = options.capture ?? captureCommand5;
30692
30762
  const log = options.log ?? (() => {
30693
30763
  return;
30694
30764
  });
@@ -40267,6 +40337,7 @@ export {
40267
40337
  applyAbsoluteNativeUpdates,
40268
40338
  assertAbsoluteAndroidInstalledAppUpgrade,
40269
40339
  assertAbsoluteDeviceCapabilityPackages,
40340
+ assertAbsoluteIosInstalledAppUpgrade,
40270
40341
  buildAbsoluteAndroidRelease,
40271
40342
  buildAbsoluteIosRelease,
40272
40343
  buildAbsoluteMobileCompatibilityRelease,
@@ -40322,6 +40393,7 @@ export {
40322
40393
  getCurrentAbsoluteMobileProducerContext,
40323
40394
  hashAbsoluteMobilePropsSchema,
40324
40395
  inspectAbsoluteAndroidInstalledApp,
40396
+ inspectAbsoluteIosInstalledApp,
40325
40397
  inspectAbsoluteMobileRouteMetadata,
40326
40398
  inspectAbsoluteMobileUpdateHealth,
40327
40399
  inspectAbsoluteMobileUpdateRollout,
@@ -40366,6 +40438,7 @@ export {
40366
40438
  parseAbsoluteExpoBridgeMessage,
40367
40439
  parseAbsoluteExpoUpdateDescriptor,
40368
40440
  parseAbsoluteIosHmrLog,
40441
+ parseAbsoluteIosInstalledAppInfo,
40369
40442
  parseAbsoluteIosLogLine,
40370
40443
  parseAbsoluteMobileBuildPageMetadata,
40371
40444
  parseAbsoluteMobileCompatibilityArtifact,
@@ -40439,5 +40512,5 @@ export {
40439
40512
  writeAbsoluteMobileUpdateRegistry
40440
40513
  };
40441
40514
 
40442
- //# debugId=2F7DAB8457CEAC9B64756E2164756E21
40515
+ //# debugId=8D376EB1B818995C64756E2164756E21
40443
40516
  //# sourceMappingURL=index.js.map