@absolutejs/absolute 0.20.0-beta.113 → 0.20.0-beta.115

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.
Files changed (33) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +6 -0
  3. package/changelog.json +44 -0
  4. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  5. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  6. package/dist/build.js +54 -2
  7. package/dist/build.js.map +3 -3
  8. package/dist/cli/{compile-1d5arbqj.js → compile-ya4kd2sg.js} +3 -3
  9. package/dist/cli/{config-vq2qcc4p.js → config-rjeexvza.js} +1 -1
  10. package/dist/cli/{dev-f0safhsr.js → dev-5cqmf7za.js} +2 -2
  11. package/dist/cli/{expoProject-zkprmjjz.js → expoProject-f5j20xms.js} +1 -1
  12. package/dist/cli/{index-gps0zk0m.js → index-5fmgn0nx.js} +2 -2
  13. package/dist/cli/{index-dfqzrznk.js → index-6mbm4n3g.js} +2 -2
  14. package/dist/cli/{index-0zcebhm4.js → index-dr21p6ae.js} +566 -83
  15. package/dist/cli/{index-df2mjbdy.js → index-exdd5k1g.js} +55 -0
  16. package/dist/cli/index.js +6 -6
  17. package/dist/cli/{mobile-v11nwcj9.js → mobile-fg2226vv.js} +153 -8
  18. package/dist/cli/{start-8v6g2y31.js → start-jt61f40d.js} +4 -4
  19. package/dist/index.js +54 -2
  20. package/dist/index.js.map +3 -3
  21. package/dist/mobile/index.js +1478 -895
  22. package/dist/mobile/index.js.map +9 -7
  23. package/dist/mobile/remoteMacAgentEntry.js +243 -242
  24. package/dist/react/hooks/index.js +6 -2
  25. package/dist/react/hooks/index.js.map +3 -3
  26. package/dist/src/mobile/androidServiceReadiness.d.ts +14 -0
  27. package/dist/src/mobile/branding.d.ts +92 -0
  28. package/dist/src/mobile/config.d.ts +20 -0
  29. package/dist/src/mobile/index.d.ts +1 -0
  30. package/dist/src/react/hooks/useMediaQuery.d.ts +3 -1
  31. package/dist/src/utils/userAgentFunctions.d.ts +1 -1
  32. package/dist/types/build.d.ts +36 -0
  33. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,20 @@ 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.115 — 2026-09-17
10
+
11
+ ### Fixed
12
+
13
+ - **Stabilize the existing UserAgentProvider declaration with an explicit provider type so inferred union ordering cannot cause spurious API changes.** (`UserAgentProvider`)
14
+ - **Wait for Android network services before installed offline acceptance; add two-revision Capacitor and Expo branding conformance with packaged-pixel verification and light/dark screenshot evidence.**
15
+
16
+ ## 0.20.0-beta.114 — 2026-09-17
17
+
18
+ ### Added
19
+
20
+ - **Capacitor and Expo share a first-class native branding pipeline** (`ABSOLUTE_CAPACITOR_ASSETS_SPEC`, `ABSOLUTE_CAPACITOR_ASSETS_VERSION`, `ABSOLUTE_MOBILE_BRANDING_FORMAT`, `AbsoluteMobileBrandingGenerationOptions`, `AbsoluteMobileBrandingInspection`, `AbsoluteMobileBrandingManifest`, `AbsoluteMobileBrandingRunner`, `AbsoluteMobileBrandingSource`, `NormalizedAbsoluteMobileConfig`, `absoluteExpoBrandingConfig`, `absoluteMobileBrandingManifestPath`, `createAbsoluteMobileBrandingManifest`, `generateAbsoluteCapacitorBranding`, `inspectAbsoluteMobileBranding`, `renderAbsoluteMobileBrandingPreview`, `writeAbsoluteExpoBrandingInputs`)
21
+ A typed mobile.branding contract now projects validated source PNGs into Capacitor and Expo icons, Android adaptive and themed layers, iOS appearance variants, and light/dark launch screens without application-authored native code. The mobile assets command wraps the pinned official Capacitor generator, installs it only as a direct development dependency when needed, previews artwork, records a content-addressed non-secret manifest, resumes platform-specific generation, reports bounded telemetry, and makes configured stale or missing output fail release doctor.
22
+
9
23
  ## 0.20.0-beta.113 — 2026-09-17
10
24
 
11
25
  ### Added
package/README.md CHANGED
@@ -261,6 +261,12 @@ validation, and release projection. Add `--json` for a redacted CI or support
261
261
  artifact; it omits credentials, device/account identifiers, absolute paths, and
262
262
  detailed doctor messages. See [mobile project inspection](docs/MOBILE_INSPECT.md).
263
263
 
264
+ Configure one typed source for native icons, Android adaptive/themed layers,
265
+ iOS appearance variants, and launch artwork, then run `absolute mobile assets
266
+ --preview`. AbsoluteJS projects it into either Capacitor or Expo, detects stale
267
+ inputs, and includes the result in release doctor. See
268
+ [mobile branding and native assets](docs/MOBILE_BRANDING.md).
269
+
264
270
  Before signing, run `absolute mobile doctor release`. It validates pinned and
265
271
  aligned Capacitor packages, dependency locking, HTTPS and signed-link identity,
266
272
  packaged app identity, SHA-256 page/style integrity, runtime compatibility, CSP,
package/changelog.json CHANGED
@@ -2,6 +2,50 @@
2
2
  "contract": 1,
3
3
  "name": "@absolutejs/absolute",
4
4
  "releases": [
5
+ {
6
+ "changes": [
7
+ {
8
+ "kind": "fixed",
9
+ "summary": "Stabilize the existing UserAgentProvider declaration with an explicit provider type so inferred union ordering cannot cause spurious API changes.",
10
+ "symbols": ["UserAgentProvider"]
11
+ },
12
+ {
13
+ "kind": "fixed",
14
+ "summary": "Wait for Android network services before installed offline acceptance; add two-revision Capacitor and Expo branding conformance with packaged-pixel verification and light/dark screenshot evidence."
15
+ }
16
+ ],
17
+ "date": "2026-09-17",
18
+ "version": "0.20.0-beta.115"
19
+ },
20
+ {
21
+ "changes": [
22
+ {
23
+ "detail": "A typed mobile.branding contract now projects validated source PNGs into Capacitor and Expo icons, Android adaptive and themed layers, iOS appearance variants, and light/dark launch screens without application-authored native code. The mobile assets command wraps the pinned official Capacitor generator, installs it only as a direct development dependency when needed, previews artwork, records a content-addressed non-secret manifest, resumes platform-specific generation, reports bounded telemetry, and makes configured stale or missing output fail release doctor.",
24
+ "kind": "added",
25
+ "summary": "Capacitor and Expo share a first-class native branding pipeline",
26
+ "symbols": [
27
+ "ABSOLUTE_CAPACITOR_ASSETS_SPEC",
28
+ "ABSOLUTE_CAPACITOR_ASSETS_VERSION",
29
+ "ABSOLUTE_MOBILE_BRANDING_FORMAT",
30
+ "AbsoluteMobileBrandingGenerationOptions",
31
+ "AbsoluteMobileBrandingInspection",
32
+ "AbsoluteMobileBrandingManifest",
33
+ "AbsoluteMobileBrandingRunner",
34
+ "AbsoluteMobileBrandingSource",
35
+ "NormalizedAbsoluteMobileConfig",
36
+ "absoluteExpoBrandingConfig",
37
+ "absoluteMobileBrandingManifestPath",
38
+ "createAbsoluteMobileBrandingManifest",
39
+ "generateAbsoluteCapacitorBranding",
40
+ "inspectAbsoluteMobileBranding",
41
+ "renderAbsoluteMobileBrandingPreview",
42
+ "writeAbsoluteExpoBrandingInputs"
43
+ ]
44
+ }
45
+ ],
46
+ "date": "2026-09-17",
47
+ "version": "0.20.0-beta.114"
48
+ },
5
49
  {
6
50
  "changes": [
7
51
  {
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  var __require = import.meta.require;
3
3
 
4
- // .angular-partial-tmp-skhGcA/src/core/streamingSlotRegistrar.ts
4
+ // .angular-partial-tmp-h18t3k/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-skhGcA/src/core/streamingSlotRegistrar.ts
4
+ // .angular-partial-tmp-h18t3k/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-skhGcA/src/core/streamingSlotRegistry.ts
51
+ // .angular-partial-tmp-h18t3k/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,13 +27656,62 @@ __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, 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) => {
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, COLOR_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}/`)) {
27663
27663
  throw new TypeError(`${field} must remain inside the project root.`);
27664
27664
  }
27665
27665
  return path;
27666
+ }, normalizeBrandingColor = (value, fallback, field) => {
27667
+ const normalized = (value ?? fallback).trim().toUpperCase();
27668
+ if (!COLOR_PATTERN.test(normalized))
27669
+ throw new TypeError(`${field} must use #RRGGBB hexadecimal notation.`);
27670
+ return normalized;
27671
+ }, normalizeBrandingPath = (projectRoot, value, field) => {
27672
+ const path = resolveProjectPath(projectRoot, requireText(value, field), field);
27673
+ if (!path.toLowerCase().endsWith(".png"))
27674
+ throw new TypeError(`${field} must reference a PNG file.`);
27675
+ return path;
27676
+ }, normalizeBranding = (config, projectRoot) => {
27677
+ const { branding } = config;
27678
+ if (!branding)
27679
+ return;
27680
+ const darkIcon = branding.ios?.darkIcon ? normalizeBrandingPath(projectRoot, branding.ios.darkIcon, "mobile.branding.ios.darkIcon") : undefined;
27681
+ const tintedIcon = branding.ios?.tintedIcon ? normalizeBrandingPath(projectRoot, branding.ios.tintedIcon, "mobile.branding.ios.tintedIcon") : undefined;
27682
+ const logoScale = branding.splash?.logoScale ?? 0.2;
27683
+ if (!Number.isFinite(logoScale) || logoScale < 0.1 || logoScale > 0.4)
27684
+ throw new TypeError("mobile.branding.splash.logoScale must be between 0.1 and 0.4.");
27685
+ return {
27686
+ android: {
27687
+ backgroundColor: normalizeBrandingColor(branding.android?.backgroundColor, "#FFFFFF", "mobile.branding.android.backgroundColor"),
27688
+ ...branding.android?.backgroundImage ? {
27689
+ backgroundImage: normalizeBrandingPath(projectRoot, branding.android.backgroundImage, "mobile.branding.android.backgroundImage")
27690
+ } : {},
27691
+ ...branding.android?.foreground ? {
27692
+ foreground: normalizeBrandingPath(projectRoot, branding.android.foreground, "mobile.branding.android.foreground")
27693
+ } : {},
27694
+ ...branding.android?.monochrome ? {
27695
+ monochrome: normalizeBrandingPath(projectRoot, branding.android.monochrome, "mobile.branding.android.monochrome")
27696
+ } : {}
27697
+ },
27698
+ icon: normalizeBrandingPath(projectRoot, branding.icon, "mobile.branding.icon"),
27699
+ ios: {
27700
+ ...darkIcon ? { darkIcon } : {},
27701
+ ...tintedIcon ? { tintedIcon } : {}
27702
+ },
27703
+ splash: {
27704
+ backgroundColor: normalizeBrandingColor(branding.splash?.backgroundColor, "#FFFFFF", "mobile.branding.splash.backgroundColor"),
27705
+ darkBackgroundColor: normalizeBrandingColor(branding.splash?.darkBackgroundColor, "#111111", "mobile.branding.splash.darkBackgroundColor"),
27706
+ ...branding.splash?.darkImage ? {
27707
+ darkImage: normalizeBrandingPath(projectRoot, branding.splash.darkImage, "mobile.branding.splash.darkImage")
27708
+ } : {},
27709
+ ...branding.splash?.image ? {
27710
+ image: normalizeBrandingPath(projectRoot, branding.splash.image, "mobile.branding.splash.image")
27711
+ } : {},
27712
+ logoScale
27713
+ }
27714
+ };
27666
27715
  }, requireText = (value, field) => {
27667
27716
  const normalized = value.trim();
27668
27717
  if (!normalized)
@@ -28048,11 +28097,13 @@ var APP_ID_PATTERN, SCHEME_PATTERN, APPLE_APP_ID_PREFIX_PATTERN, CERTIFICATE_FIN
28048
28097
  const updates = normalizeUpdates(config, productionOrigin, projectRoot);
28049
28098
  const updateServer = normalizeUpdateServer(config, productionOrigin, projectRoot, updates);
28050
28099
  const observability = normalizeObservability(config, productionOrigin);
28100
+ const branding = normalizeBranding(config, projectRoot);
28051
28101
  return {
28052
28102
  androidCertificateFingerprints: normalizeCertificateFingerprints(config.deepLinks?.android?.sha256CertificateFingerprints),
28053
28103
  appId,
28054
28104
  appleAppIdPrefix: normalizeAppleAppIdPrefix(config.deepLinks?.apple?.appIdPrefix),
28055
28105
  appName: requireText(config.appName, "mobile.appName"),
28106
+ ...branding ? { branding } : {},
28056
28107
  bundleDirectory: resolveProjectPath(projectRoot, config.bundleDirectory ?? ".absolutejs/mobile/web", "mobile.bundleDirectory"),
28057
28108
  deepLinkHosts: normalizeHosts(config.deepLinks?.hosts, productionOrigin),
28058
28109
  deepLinkScheme,
@@ -28080,6 +28131,7 @@ var init_config = __esm(() => {
28080
28131
  RELEASE_TARGET_PATTERN = /^[a-z0-9][a-z0-9._-]{0,63}$/u;
28081
28132
  UPDATE_PUBLIC_KEY_PATTERN = /^[A-Za-z0-9+/]+={0,2}$/u;
28082
28133
  ENVIRONMENT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/u;
28134
+ COLOR_PATTERN = /^#[0-9A-F]{6}$/u;
28083
28135
  MINUTE_MS = 60 * 1000;
28084
28136
  DEFAULT_UPDATE_ROLLOUT_STAGES = [
28085
28137
  { minimumReports: 20, observationMinutes: 60, rollout: 0.05 },
@@ -38031,5 +38083,5 @@ export {
38031
38083
  devBuild
38032
38084
  };
38033
38085
 
38034
- //# debugId=0E877E48913E5F9364756E2164756E21
38086
+ //# debugId=EF374DB4847C1F1864756E2164756E21
38035
38087
  //# sourceMappingURL=build.js.map