@absolutejs/absolute 0.20.0-beta.113 → 0.20.0-beta.114
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 +7 -0
- package/README.md +6 -0
- package/changelog.json +29 -0
- package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
- package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
- package/dist/build.js +54 -2
- package/dist/build.js.map +3 -3
- package/dist/cli/{compile-1d5arbqj.js → compile-ya4kd2sg.js} +3 -3
- package/dist/cli/{config-vq2qcc4p.js → config-rjeexvza.js} +1 -1
- package/dist/cli/{dev-f0safhsr.js → dev-5cqmf7za.js} +2 -2
- package/dist/cli/{expoProject-zkprmjjz.js → expoProject-f5j20xms.js} +1 -1
- package/dist/cli/{index-gps0zk0m.js → index-5fmgn0nx.js} +2 -2
- package/dist/cli/{index-dfqzrznk.js → index-6mbm4n3g.js} +2 -2
- package/dist/cli/{index-0zcebhm4.js → index-dr21p6ae.js} +566 -83
- package/dist/cli/{index-df2mjbdy.js → index-exdd5k1g.js} +55 -0
- package/dist/cli/index.js +6 -6
- package/dist/cli/{mobile-v11nwcj9.js → mobile-55wjg3nd.js} +114 -8
- package/dist/cli/{start-8v6g2y31.js → start-jt61f40d.js} +4 -4
- package/dist/index.js +54 -2
- package/dist/index.js.map +3 -3
- package/dist/mobile/index.js +1439 -895
- package/dist/mobile/index.js.map +7 -6
- package/dist/mobile/remoteMacAgentEntry.js +243 -242
- package/dist/src/mobile/branding.d.ts +92 -0
- package/dist/src/mobile/config.d.ts +20 -0
- package/dist/src/mobile/index.d.ts +1 -0
- package/dist/types/build.d.ts +36 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,13 @@ 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.114 — 2026-09-17
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **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`)
|
|
14
|
+
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.
|
|
15
|
+
|
|
9
16
|
## 0.20.0-beta.113 — 2026-09-17
|
|
10
17
|
|
|
11
18
|
### 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,35 @@
|
|
|
2
2
|
"contract": 1,
|
|
3
3
|
"name": "@absolutejs/absolute",
|
|
4
4
|
"releases": [
|
|
5
|
+
{
|
|
6
|
+
"changes": [
|
|
7
|
+
{
|
|
8
|
+
"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.",
|
|
9
|
+
"kind": "added",
|
|
10
|
+
"summary": "Capacitor and Expo share a first-class native branding pipeline",
|
|
11
|
+
"symbols": [
|
|
12
|
+
"ABSOLUTE_CAPACITOR_ASSETS_SPEC",
|
|
13
|
+
"ABSOLUTE_CAPACITOR_ASSETS_VERSION",
|
|
14
|
+
"ABSOLUTE_MOBILE_BRANDING_FORMAT",
|
|
15
|
+
"AbsoluteMobileBrandingGenerationOptions",
|
|
16
|
+
"AbsoluteMobileBrandingInspection",
|
|
17
|
+
"AbsoluteMobileBrandingManifest",
|
|
18
|
+
"AbsoluteMobileBrandingRunner",
|
|
19
|
+
"AbsoluteMobileBrandingSource",
|
|
20
|
+
"NormalizedAbsoluteMobileConfig",
|
|
21
|
+
"absoluteExpoBrandingConfig",
|
|
22
|
+
"absoluteMobileBrandingManifestPath",
|
|
23
|
+
"createAbsoluteMobileBrandingManifest",
|
|
24
|
+
"generateAbsoluteCapacitorBranding",
|
|
25
|
+
"inspectAbsoluteMobileBranding",
|
|
26
|
+
"renderAbsoluteMobileBrandingPreview",
|
|
27
|
+
"writeAbsoluteExpoBrandingInputs"
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"date": "2026-09-17",
|
|
32
|
+
"version": "0.20.0-beta.114"
|
|
33
|
+
},
|
|
5
34
|
{
|
|
6
35
|
"changes": [
|
|
7
36
|
{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
var __require = import.meta.require;
|
|
3
3
|
|
|
4
|
-
// .angular-partial-tmp-
|
|
4
|
+
// .angular-partial-tmp-GY0KSL/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-GY0KSL/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-GY0KSL/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=
|
|
38086
|
+
//# debugId=EF374DB4847C1F1864756E2164756E21
|
|
38035
38087
|
//# sourceMappingURL=build.js.map
|