@absolutejs/absolute 0.20.0-beta.108 → 0.20.0-beta.109
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/README.md +5 -1
- package/changelog.json +18 -0
- package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
- package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
- package/dist/build.js +52 -2
- package/dist/build.js.map +4 -4
- package/dist/cli/{compile-hsbs1xf6.js → compile-1d5arbqj.js} +2 -2
- package/dist/cli/{config-vy04mqce.js → config-vq2qcc4p.js} +1 -1
- package/dist/cli/{dev-f6b6hkke.js → dev-f0safhsr.js} +1 -1
- package/dist/cli/{index-rd2hbttb.js → index-df2mjbdy.js} +53 -0
- package/dist/cli/{index-hrzd7e5x.js → index-dfqzrznk.js} +1 -1
- package/dist/cli/{index-mazxtfh4.js → index-gps0zk0m.js} +2 -2
- package/dist/cli/index.js +5 -5
- package/dist/cli/{mobile-7v8hfmdq.js → mobile-e4ygngfk.js} +230 -24
- package/dist/cli/{start-5grq7nfr.js → start-8v6g2y31.js} +3 -3
- package/dist/index.js +52 -2
- package/dist/index.js.map +4 -4
- package/dist/mobile/index.js +198 -17
- package/dist/mobile/index.js.map +6 -6
- package/dist/mobile/remoteMacAgentEntry.js +182 -182
- package/dist/src/build/injectVueComposableTracking.d.ts +2 -1
- package/dist/src/mobile/config.d.ts +7 -0
- package/dist/src/mobile/releaseCertification.d.ts +12 -3
- package/dist/src/mobile/releasePublisher.d.ts +13 -0
- package/dist/types/build.d.ts +13 -0
- package/package.json +2 -2
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.109 — 2026-09-17
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **Mobile publication promotes the exact certified AAB or IPA with secure production policies and generated acceptance CI** (`AbsoluteMobileCertifiableRelease`, `AbsoluteNativeReleasePublication`, `AbsoluteNativeReleasePublisher`, `NormalizedAbsoluteMobileConfig`, `PublishAbsoluteAndroidReleaseOptions`, `publishAbsoluteIosRelease`)
|
|
14
|
+
|
|
9
15
|
## 0.20.0-beta.108 — 2026-09-16
|
|
10
16
|
|
|
11
17
|
### Fixed
|
package/README.md
CHANGED
|
@@ -284,7 +284,11 @@ The generated workflow keeps signing and provider credentials behind the
|
|
|
284
284
|
After testing the immutable Android or iOS release, bind its exact artifact and
|
|
285
285
|
runtime identity to the installed, Simulator, device, or store evidence with
|
|
286
286
|
`absolute mobile certify`. The content-addressed result can be checked again in
|
|
287
|
-
CI without credentials or native tooling
|
|
287
|
+
CI without credentials or native tooling, then supplied to `mobile publish
|
|
288
|
+
--release ... --certification ...` so publication cannot silently rebuild or
|
|
289
|
+
promote different bytes. Production channels require installed Android and
|
|
290
|
+
store-delivered iOS evidence by default; production Google Play requires
|
|
291
|
+
installed evidence. See
|
|
288
292
|
[mobile release certification](docs/MOBILE_RELEASE_CERTIFICATION.md).
|
|
289
293
|
|
|
290
294
|
An experimental Expo Router hybrid is also available behind
|
package/changelog.json
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
"contract": 1,
|
|
3
3
|
"name": "@absolutejs/absolute",
|
|
4
4
|
"releases": [
|
|
5
|
+
{
|
|
6
|
+
"changes": [
|
|
7
|
+
{
|
|
8
|
+
"kind": "added",
|
|
9
|
+
"summary": "Mobile publication promotes the exact certified AAB or IPA with secure production policies and generated acceptance CI",
|
|
10
|
+
"symbols": [
|
|
11
|
+
"AbsoluteMobileCertifiableRelease",
|
|
12
|
+
"AbsoluteNativeReleasePublication",
|
|
13
|
+
"AbsoluteNativeReleasePublisher",
|
|
14
|
+
"NormalizedAbsoluteMobileConfig",
|
|
15
|
+
"PublishAbsoluteAndroidReleaseOptions",
|
|
16
|
+
"publishAbsoluteIosRelease"
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"date": "2026-09-17",
|
|
21
|
+
"version": "0.20.0-beta.109"
|
|
22
|
+
},
|
|
5
23
|
{
|
|
6
24
|
"changes": [
|
|
7
25
|
{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
var __require = import.meta.require;
|
|
3
3
|
|
|
4
|
-
// .angular-partial-tmp-
|
|
4
|
+
// .angular-partial-tmp-nbi5HT/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-nbi5HT/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-nbi5HT/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/build.js
CHANGED
|
@@ -27656,7 +27656,7 @@ __export(exports_config, {
|
|
|
27656
27656
|
import { readFileSync as readFileSync35 } from "fs";
|
|
27657
27657
|
import { resolve as resolve45 } from "path";
|
|
27658
27658
|
import { createHash as createHash5, createPublicKey, X509Certificate } from "crypto";
|
|
27659
|
-
var APP_ID_PATTERN, SCHEME_PATTERN, APPLE_APP_ID_PREFIX_PATTERN, CERTIFICATE_FINGERPRINT_PATTERN, UPDATE_NAME_PATTERN, UPDATE_PUBLIC_KEY_PATTERN, ENVIRONMENT_NAME_PATTERN, DEFAULT_UPDATE_BOOT_TIMEOUT_MS = 20000, DEFAULT_UPDATE_HEALTH_FAILURE_RATE = 0.2, DEFAULT_UPDATE_HEALTH_MINIMUM_REPORTS = 20, DEFAULT_UPDATE_ROLLOUT_FAILURE_RATE = 0.05, DEFAULT_UPDATE_ROLLOUT_OBSERVATION_MINUTES = 60, MINUTE_MS, DEFAULT_UPDATE_ROLLOUT_STAGES, MINIMUM_UPDATE_BOOT_TIMEOUT_MS = 5000, MAXIMUM_UPDATE_BOOT_TIMEOUT_MS = 120000, HOSTNAME_PATTERN, EXPO_RESERVED_ROUTE_PREFIXES, resolveProjectPath = (projectRoot, value, field) => {
|
|
27659
|
+
var APP_ID_PATTERN, SCHEME_PATTERN, APPLE_APP_ID_PREFIX_PATTERN, CERTIFICATE_FINGERPRINT_PATTERN, UPDATE_NAME_PATTERN, RELEASE_TARGET_PATTERN, UPDATE_PUBLIC_KEY_PATTERN, ENVIRONMENT_NAME_PATTERN, DEFAULT_UPDATE_BOOT_TIMEOUT_MS = 20000, DEFAULT_UPDATE_HEALTH_FAILURE_RATE = 0.2, DEFAULT_UPDATE_HEALTH_MINIMUM_REPORTS = 20, DEFAULT_UPDATE_ROLLOUT_FAILURE_RATE = 0.05, DEFAULT_UPDATE_ROLLOUT_OBSERVATION_MINUTES = 60, MINUTE_MS, DEFAULT_UPDATE_ROLLOUT_STAGES, MINIMUM_UPDATE_BOOT_TIMEOUT_MS = 5000, MAXIMUM_UPDATE_BOOT_TIMEOUT_MS = 120000, HOSTNAME_PATTERN, EXPO_RESERVED_ROUTE_PREFIXES, resolveProjectPath = (projectRoot, value, field) => {
|
|
27660
27660
|
const root = resolve45(projectRoot);
|
|
27661
27661
|
const path = resolve45(root, value);
|
|
27662
27662
|
if (path !== root && !path.startsWith(`${root}/`)) {
|
|
@@ -27692,6 +27692,54 @@ var APP_ID_PATTERN, SCHEME_PATTERN, APPLE_APP_ID_PREFIX_PATTERN, CERTIFICATE_FIN
|
|
|
27692
27692
|
throw new TypeError("mobile.platforms must contain at least one platform.");
|
|
27693
27693
|
}
|
|
27694
27694
|
return normalized;
|
|
27695
|
+
}, normalizeAndroidCertificationPolicy = (value) => {
|
|
27696
|
+
if (value === false || value === undefined)
|
|
27697
|
+
return;
|
|
27698
|
+
if (value !== "installed")
|
|
27699
|
+
throw new TypeError("mobile.release.certification channel Android policy must be installed or false.");
|
|
27700
|
+
return value;
|
|
27701
|
+
}, normalizeIosCertificationPolicy = (value) => {
|
|
27702
|
+
if (value === false || value === undefined)
|
|
27703
|
+
return;
|
|
27704
|
+
if (!["simulator", "device", "store"].includes(value))
|
|
27705
|
+
throw new TypeError("mobile.release.certification channel iOS policy must be simulator, device, store, or false.");
|
|
27706
|
+
return value;
|
|
27707
|
+
}, normalizeReleaseCertification = (config) => {
|
|
27708
|
+
const configured = config.release?.certification;
|
|
27709
|
+
if (configured === false)
|
|
27710
|
+
return { channels: {}, googlePlayTracks: {} };
|
|
27711
|
+
const channels = {
|
|
27712
|
+
production: { android: "installed", ios: "store" }
|
|
27713
|
+
};
|
|
27714
|
+
const googlePlayTracks = {
|
|
27715
|
+
production: "installed"
|
|
27716
|
+
};
|
|
27717
|
+
for (const [name, policy] of Object.entries(configured?.channels ?? {})) {
|
|
27718
|
+
if (!RELEASE_TARGET_PATTERN.test(name))
|
|
27719
|
+
throw new TypeError("mobile.release.certification.channels contains an invalid channel.");
|
|
27720
|
+
const normalized = {};
|
|
27721
|
+
const android = normalizeAndroidCertificationPolicy(policy.android);
|
|
27722
|
+
const ios = normalizeIosCertificationPolicy(policy.ios);
|
|
27723
|
+
if (android)
|
|
27724
|
+
normalized.android = android;
|
|
27725
|
+
if (ios)
|
|
27726
|
+
normalized.ios = ios;
|
|
27727
|
+
channels[name] = normalized;
|
|
27728
|
+
}
|
|
27729
|
+
for (const [name, requirement] of Object.entries(configured?.googlePlayTracks ?? {})) {
|
|
27730
|
+
if (!RELEASE_TARGET_PATTERN.test(name))
|
|
27731
|
+
throw new TypeError("mobile.release.certification.googlePlayTracks contains an invalid track.");
|
|
27732
|
+
if (requirement === false)
|
|
27733
|
+
delete googlePlayTracks[name];
|
|
27734
|
+
else if (requirement === "installed")
|
|
27735
|
+
googlePlayTracks[name] = requirement;
|
|
27736
|
+
else
|
|
27737
|
+
throw new TypeError("mobile.release.certification Google Play policy must be installed or false.");
|
|
27738
|
+
}
|
|
27739
|
+
return {
|
|
27740
|
+
channels: Object.fromEntries(Object.entries(channels).sort(([left], [right]) => left.localeCompare(right))),
|
|
27741
|
+
googlePlayTracks: Object.fromEntries(Object.entries(googlePlayTracks).sort(([left], [right]) => left.localeCompare(right)))
|
|
27742
|
+
};
|
|
27695
27743
|
}, normalizeHosts = (hosts, productionOrigin) => {
|
|
27696
27744
|
const normalizeHostname = (host2) => {
|
|
27697
27745
|
const value = requireText(host2, "mobile.deepLinks.hosts").toLowerCase();
|
|
@@ -28018,6 +28066,7 @@ var APP_ID_PATTERN, SCHEME_PATTERN, APPLE_APP_ID_PREFIX_PATTERN, CERTIFICATE_FIN
|
|
|
28018
28066
|
platforms: normalizePlatforms(config.platforms),
|
|
28019
28067
|
productionOrigin,
|
|
28020
28068
|
pushAndroidGoogleServicesFile: resolveProjectPath(projectRoot, config.pushNotifications?.android?.googleServicesFile ?? "google-services.json", "mobile.pushNotifications.android.googleServicesFile"),
|
|
28069
|
+
releaseCertification: normalizeReleaseCertification(config),
|
|
28021
28070
|
...updates ? { updates } : {},
|
|
28022
28071
|
...updateServer ? { updateServer } : {}
|
|
28023
28072
|
};
|
|
@@ -28028,6 +28077,7 @@ var init_config = __esm(() => {
|
|
|
28028
28077
|
APPLE_APP_ID_PREFIX_PATTERN = /^[A-Z0-9]{10}$/;
|
|
28029
28078
|
CERTIFICATE_FINGERPRINT_PATTERN = /^[0-9A-F]{64}$/;
|
|
28030
28079
|
UPDATE_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
|
|
28080
|
+
RELEASE_TARGET_PATTERN = /^[a-z0-9][a-z0-9._-]{0,63}$/u;
|
|
28031
28081
|
UPDATE_PUBLIC_KEY_PATTERN = /^[A-Za-z0-9+/]+={0,2}$/u;
|
|
28032
28082
|
ENVIRONMENT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/u;
|
|
28033
28083
|
MINUTE_MS = 60 * 1000;
|
|
@@ -37981,5 +38031,5 @@ export {
|
|
|
37981
38031
|
devBuild
|
|
37982
38032
|
};
|
|
37983
38033
|
|
|
37984
|
-
//# debugId=
|
|
38034
|
+
//# debugId=0E877E48913E5F9364756E2164756E21
|
|
37985
38035
|
//# sourceMappingURL=build.js.map
|