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

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.90 — 2026-09-13
10
+
11
+ ### Added
12
+
13
+ - **Installed Expo iOS apps now have a production Simulator conformance gate for signed OTA safety, native Auth and Sync continuity, staged rollout controls, fleet recovery, and restart-safe reporting.**
14
+
9
15
  ## 0.20.0-beta.89 — 2026-09-13
10
16
 
11
17
  ### Added
package/changelog.json CHANGED
@@ -2,6 +2,16 @@
2
2
  "contract": 1,
3
3
  "name": "@absolutejs/absolute",
4
4
  "releases": [
5
+ {
6
+ "changes": [
7
+ {
8
+ "kind": "added",
9
+ "summary": "Installed Expo iOS apps now have a production Simulator conformance gate for signed OTA safety, native Auth and Sync continuity, staged rollout controls, fleet recovery, and restart-safe reporting."
10
+ }
11
+ ],
12
+ "date": "2026-09-13",
13
+ "version": "0.20.0-beta.90"
14
+ },
5
15
  {
6
16
  "changes": [
7
17
  {
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  var __require = import.meta.require;
3
3
 
4
- // .angular-partial-tmp-Zx4zp1/src/core/streamingSlotRegistrar.ts
4
+ // .angular-partial-tmp-qD4cCn/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-Zx4zp1/src/core/streamingSlotRegistrar.ts
4
+ // .angular-partial-tmp-qD4cCn/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-Zx4zp1/src/core/streamingSlotRegistry.ts
51
+ // .angular-partial-tmp-qD4cCn/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";
@@ -1283,7 +1283,7 @@ var loadAbsoluteMobileDevModules = async () => {
1283
1283
  ] = await Promise.all([
1284
1284
  import("./config-vy04mqce.js"),
1285
1285
  import("./expoProject-dac8fqhq.js"),
1286
- import("./expoDevController-n19kb5fr.js"),
1286
+ import("./expoDevController-tr63cg78.js"),
1287
1287
  import("./nativeAuth-zx4tsb1f.js"),
1288
1288
  import("./androidEmulatorController-nybhzc6c.js"),
1289
1289
  import("./emulatorDoctor-y2nqmaha.js"),
@@ -415,6 +415,97 @@ var installAbsoluteExpoAndroidRelease = async (options) => {
415
415
  throw new Error("Expo Android release build completed but its device could not be identified.");
416
416
  return { durationMs: performance.now() - started, serial };
417
417
  };
418
+ var installAbsoluteExpoIosRelease = async (options) => {
419
+ if (options.config.engine !== "expo")
420
+ throw new TypeError("The Expo iOS release installer requires Expo.");
421
+ if (!options.config.platforms.includes("ios"))
422
+ throw new TypeError("The Expo iOS release installer requires the ios platform.");
423
+ const project = options.config.nativeProjectDirectory;
424
+ const executable = options.executable ?? await absoluteExpoExecutable(project);
425
+ const capture = options.capture ?? captureCommand;
426
+ const run = options.spawnProcess ?? spawn;
427
+ const log = options.log ?? (() => {
428
+ return;
429
+ });
430
+ const xcrun = options.xcrun ?? "xcrun";
431
+ const env = { ...process.env, NODE_ENV: "production" };
432
+ const utilityOptions = {
433
+ cwd: project,
434
+ env,
435
+ log,
436
+ signal: options.signal
437
+ };
438
+ const bootedSimulators = () => {
439
+ const inventory = capture([
440
+ xcrun,
441
+ "simctl",
442
+ "list",
443
+ "devices",
444
+ "booted",
445
+ "-j"
446
+ ]);
447
+ if (inventory.exitCode !== 0)
448
+ throw new Error("Could not inspect booted iOS Simulators. Run `absolute mobile doctor ios --fix`.");
449
+ return parseBootedAbsoluteExpoIosSimulators(inventory.stdout);
450
+ };
451
+ const started = performance.now();
452
+ const prebuildExit = await runUtilityCommand(run, executable, ["prebuild", "--clean", "--no-install", "--platform", "ios"], utilityOptions);
453
+ if (prebuildExit !== 0)
454
+ throw new Error(`Expo iOS production preparation exited with status ${prebuildExit}.`);
455
+ const beforeBuild = bootedSimulators();
456
+ const selectedBeforeBuild = options.iosDevice ? beforeBuild.find((udid2) => udid2 === options.iosDevice) : beforeBuild[0];
457
+ if (options.iosDevice && !selectedBeforeBuild)
458
+ throw new Error("The selected Expo iOS Simulator is not booted.");
459
+ const releaseExit = await runUtilityCommand(run, executable, [
460
+ "run:ios",
461
+ "--configuration",
462
+ "Release",
463
+ "--no-bundler",
464
+ ...selectedBeforeBuild ? ["--device", selectedBeforeBuild] : []
465
+ ], utilityOptions);
466
+ if (releaseExit !== 0)
467
+ throw new Error(`Expo iOS release build exited with status ${releaseExit}.`);
468
+ const udid = selectedBeforeBuild ?? bootedSimulators()[0];
469
+ if (!udid)
470
+ throw new Error("Expo iOS release build completed but its Simulator could not be identified.");
471
+ const launched = capture([
472
+ xcrun,
473
+ "simctl",
474
+ "launch",
475
+ "--terminate-running-process",
476
+ udid,
477
+ options.config.appId
478
+ ]);
479
+ if (launched.exitCode !== 0)
480
+ throw new Error("Expo iOS release app launch failed.");
481
+ log(`Installed and launched the Expo iOS release app on ${udid}.`);
482
+ return { durationMs: performance.now() - started, udid };
483
+ };
484
+ var parseBootedAbsoluteExpoIosSimulators = (source) => {
485
+ let parsed;
486
+ try {
487
+ parsed = JSON.parse(source);
488
+ } catch {
489
+ throw new TypeError("Invalid iOS Simulator inventory JSON.");
490
+ }
491
+ if (!parsed || typeof parsed !== "object")
492
+ throw new TypeError("Invalid iOS Simulator inventory JSON.");
493
+ const devices = Reflect.get(parsed, "devices");
494
+ if (!devices || typeof devices !== "object")
495
+ return [];
496
+ return Object.values(devices).flatMap((values) => {
497
+ if (!Array.isArray(values))
498
+ return [];
499
+ return values.flatMap((value) => {
500
+ if (!value || typeof value !== "object")
501
+ return [];
502
+ const udid = Reflect.get(value, "udid");
503
+ const state = Reflect.get(value, "state");
504
+ const isAvailable = Reflect.get(value, "isAvailable");
505
+ return typeof udid === "string" && state === "Booted" && isAvailable !== false ? [udid] : [];
506
+ });
507
+ });
508
+ };
418
509
  var startAbsoluteExpoDevSession = async (options) => {
419
510
  const plan = planAbsoluteExpoDevSession(options.config, options);
420
511
  const executable = options.executable ?? await absoluteExpoExecutable(plan.project);
@@ -650,6 +741,8 @@ var startAbsoluteExpoDevSession = async (options) => {
650
741
  export {
651
742
  absoluteExpoExecutable,
652
743
  installAbsoluteExpoAndroidRelease,
744
+ installAbsoluteExpoIosRelease,
745
+ parseBootedAbsoluteExpoIosSimulators,
653
746
  planAbsoluteExpoDevSession,
654
747
  startAbsoluteExpoDevSession
655
748
  };
package/dist/cli/index.js CHANGED
@@ -58,7 +58,7 @@ if (command === "dev") {
58
58
  }
59
59
  const positionalArgs = stripNamedArgs("--config", "--android-device", "--ios-device").filter((arg) => arg !== "--no-mobile" && arg !== "--eager");
60
60
  const serverEntry = positionalArgs[0] ?? DEFAULT_SERVER_ENTRY;
61
- const { dev } = await import("./dev-6shm8qsn.js");
61
+ const { dev } = await import("./dev-aykeaa7b.js");
62
62
  await dev(serverEntry, configPath, {
63
63
  androidDevice,
64
64
  eager: args.includes("--eager"),
@@ -30592,6 +30592,97 @@ var installAbsoluteExpoAndroidRelease = async (options) => {
30592
30592
  throw new Error("Expo Android release build completed but its device could not be identified.");
30593
30593
  return { durationMs: performance.now() - started, serial };
30594
30594
  };
30595
+ var installAbsoluteExpoIosRelease = async (options) => {
30596
+ if (options.config.engine !== "expo")
30597
+ throw new TypeError("The Expo iOS release installer requires Expo.");
30598
+ if (!options.config.platforms.includes("ios"))
30599
+ throw new TypeError("The Expo iOS release installer requires the ios platform.");
30600
+ const project = options.config.nativeProjectDirectory;
30601
+ const executable = options.executable ?? await absoluteExpoExecutable(project);
30602
+ const capture = options.capture ?? captureCommand4;
30603
+ const run = options.spawnProcess ?? spawn;
30604
+ const log = options.log ?? (() => {
30605
+ return;
30606
+ });
30607
+ const xcrun = options.xcrun ?? "xcrun";
30608
+ const env = { ...process.env, NODE_ENV: "production" };
30609
+ const utilityOptions = {
30610
+ cwd: project,
30611
+ env,
30612
+ log,
30613
+ signal: options.signal
30614
+ };
30615
+ const bootedSimulators = () => {
30616
+ const inventory = capture([
30617
+ xcrun,
30618
+ "simctl",
30619
+ "list",
30620
+ "devices",
30621
+ "booted",
30622
+ "-j"
30623
+ ]);
30624
+ if (inventory.exitCode !== 0)
30625
+ throw new Error("Could not inspect booted iOS Simulators. Run `absolute mobile doctor ios --fix`.");
30626
+ return parseBootedAbsoluteExpoIosSimulators(inventory.stdout);
30627
+ };
30628
+ const started = performance.now();
30629
+ const prebuildExit = await runUtilityCommand(run, executable, ["prebuild", "--clean", "--no-install", "--platform", "ios"], utilityOptions);
30630
+ if (prebuildExit !== 0)
30631
+ throw new Error(`Expo iOS production preparation exited with status ${prebuildExit}.`);
30632
+ const beforeBuild = bootedSimulators();
30633
+ const selectedBeforeBuild = options.iosDevice ? beforeBuild.find((udid2) => udid2 === options.iosDevice) : beforeBuild[0];
30634
+ if (options.iosDevice && !selectedBeforeBuild)
30635
+ throw new Error("The selected Expo iOS Simulator is not booted.");
30636
+ const releaseExit = await runUtilityCommand(run, executable, [
30637
+ "run:ios",
30638
+ "--configuration",
30639
+ "Release",
30640
+ "--no-bundler",
30641
+ ...selectedBeforeBuild ? ["--device", selectedBeforeBuild] : []
30642
+ ], utilityOptions);
30643
+ if (releaseExit !== 0)
30644
+ throw new Error(`Expo iOS release build exited with status ${releaseExit}.`);
30645
+ const udid = selectedBeforeBuild ?? bootedSimulators()[0];
30646
+ if (!udid)
30647
+ throw new Error("Expo iOS release build completed but its Simulator could not be identified.");
30648
+ const launched = capture([
30649
+ xcrun,
30650
+ "simctl",
30651
+ "launch",
30652
+ "--terminate-running-process",
30653
+ udid,
30654
+ options.config.appId
30655
+ ]);
30656
+ if (launched.exitCode !== 0)
30657
+ throw new Error("Expo iOS release app launch failed.");
30658
+ log(`Installed and launched the Expo iOS release app on ${udid}.`);
30659
+ return { durationMs: performance.now() - started, udid };
30660
+ };
30661
+ var parseBootedAbsoluteExpoIosSimulators = (source) => {
30662
+ let parsed;
30663
+ try {
30664
+ parsed = JSON.parse(source);
30665
+ } catch {
30666
+ throw new TypeError("Invalid iOS Simulator inventory JSON.");
30667
+ }
30668
+ if (!parsed || typeof parsed !== "object")
30669
+ throw new TypeError("Invalid iOS Simulator inventory JSON.");
30670
+ const devices = Reflect.get(parsed, "devices");
30671
+ if (!devices || typeof devices !== "object")
30672
+ return [];
30673
+ return Object.values(devices).flatMap((values) => {
30674
+ if (!Array.isArray(values))
30675
+ return [];
30676
+ return values.flatMap((value) => {
30677
+ if (!value || typeof value !== "object")
30678
+ return [];
30679
+ const udid = Reflect.get(value, "udid");
30680
+ const state = Reflect.get(value, "state");
30681
+ const isAvailable = Reflect.get(value, "isAvailable");
30682
+ return typeof udid === "string" && state === "Booted" && isAvailable !== false ? [udid] : [];
30683
+ });
30684
+ });
30685
+ };
30595
30686
  var startAbsoluteExpoDevSession = async (options) => {
30596
30687
  const plan = planAbsoluteExpoDevSession(options.config, options);
30597
30688
  const executable = options.executable ?? await absoluteExpoExecutable(plan.project);
@@ -40240,6 +40331,7 @@ export {
40240
40331
  inspectAbsoluteRemoteMacLanHost,
40241
40332
  inspectAbsoluteRemoteMacWorkspace,
40242
40333
  installAbsoluteExpoAndroidRelease,
40334
+ installAbsoluteExpoIosRelease,
40243
40335
  installAbsoluteIosRelease,
40244
40336
  installAbsoluteMobileAdaptiveShell,
40245
40337
  installAbsoluteMobileAuthEnvironment,
@@ -40282,6 +40374,7 @@ export {
40282
40374
  parseAbsoluteMobileUnsignedUpdateManifest,
40283
40375
  parseAbsoluteMobileUpdateManifest,
40284
40376
  parseAbsoluteMobileUpdateRequest,
40377
+ parseBootedAbsoluteExpoIosSimulators,
40285
40378
  parseIosDeviceTypes,
40286
40379
  parseIosRuntimes,
40287
40380
  parseIosSimulators,
@@ -40346,5 +40439,5 @@ export {
40346
40439
  writeAbsoluteMobileUpdateRegistry
40347
40440
  };
40348
40441
 
40349
- //# debugId=D0534BA5887457BD64756E2164756E21
40442
+ //# debugId=2F7DAB8457CEAC9B64756E2164756E21
40350
40443
  //# sourceMappingURL=index.js.map