@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 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. See
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-BqBann/src/core/streamingSlotRegistrar.ts
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-BqBann/src/core/streamingSlotRegistrar.ts
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-BqBann/src/core/streamingSlotRegistry.ts
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=AA7EE9F841862FED64756E2164756E21
38034
+ //# debugId=0E877E48913E5F9364756E2164756E21
37985
38035
  //# sourceMappingURL=build.js.map