@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 +6 -0
- package/changelog.json +17 -0
- package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
- package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
- package/dist/mobile/index.js +78 -5
- package/dist/mobile/index.js.map +5 -4
- package/dist/src/mobile/index.d.ts +1 -0
- package/dist/src/mobile/iosUpgradeConformance.d.ts +16 -0
- package/package.json +2 -1
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-
|
|
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-
|
|
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-
|
|
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";
|
package/dist/mobile/index.js
CHANGED
|
@@ -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
|
|
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 ??
|
|
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 ??
|
|
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 ??
|
|
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=
|
|
40515
|
+
//# debugId=8D376EB1B818995C64756E2164756E21
|
|
40443
40516
|
//# sourceMappingURL=index.js.map
|