@absolutejs/absolute 0.20.0-beta.25 → 0.20.0-beta.27

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/dist/cli/index.js CHANGED
@@ -6817,15 +6817,23 @@ var DEVICES_PACKAGE = "@absolutejs/devices", CAPACITOR_ADAPTER = "@absolutejs/de
6817
6817
  return;
6818
6818
  if (!object2(value))
6819
6819
  throw new TypeError(`${field} must be an object.`);
6820
- const { privacyAccessedApis, pushNotifications, usageDescriptions } = value;
6820
+ const {
6821
+ privacyAccessedApis,
6822
+ pushNotifications,
6823
+ systemBars,
6824
+ usageDescriptions
6825
+ } = value;
6821
6826
  if (pushNotifications !== undefined && pushNotifications !== true)
6822
6827
  throw new TypeError(`${field}.pushNotifications must be true.`);
6828
+ if (systemBars !== undefined && systemBars !== true)
6829
+ throw new TypeError(`${field}.systemBars must be true.`);
6823
6830
  if (usageDescriptions !== undefined && (!Array.isArray(usageDescriptions) || !usageDescriptions.every((purpose) => typeof purpose === "string" && IOS_USAGE_DESCRIPTIONS.has(purpose))))
6824
6831
  throw new TypeError(`${field}.usageDescriptions contains an unsupported purpose.`);
6825
6832
  const privacy = iosPrivacyAccessedApis(privacyAccessedApis, `${field}.privacyAccessedApis`);
6826
6833
  return {
6827
6834
  ...privacy === undefined ? {} : { privacyAccessedApis: privacy },
6828
6835
  ...pushNotifications === true ? { pushNotifications: true } : {},
6836
+ ...systemBars === true ? { systemBars: true } : {},
6829
6837
  ...usageDescriptions === undefined ? {} : { usageDescriptions: [...usageDescriptions] }
6830
6838
  };
6831
6839
  }, parseProvider = (name, value) => {
@@ -6882,6 +6890,7 @@ var DEVICES_PACKAGE = "@absolutejs/devices", CAPACITOR_ADAPTER = "@absolutejs/de
6882
6890
  return reasons ? [{ api, reasons: [...reasons].sort() }] : [];
6883
6891
  }),
6884
6892
  iosPushNotifications: plan.capabilities.some((name) => plan.providers[name]?.native?.ios?.pushNotifications === true),
6893
+ iosSystemBars: plan.capabilities.some((name) => plan.providers[name]?.native?.ios?.systemBars === true),
6885
6894
  iosUsageDescriptions: [
6886
6895
  ...new Set(plan.capabilities.flatMap((name) => plan.providers[name]?.native?.ios?.usageDescriptions ?? []))
6887
6896
  ].sort()
@@ -7093,8 +7102,8 @@ var isElysiaApp = (value) => typeof value === "object" && value !== null && type
7093
7102
  const usesPush = deviceCapabilities.capabilities.includes("pushNotifications");
7094
7103
  if (usesPush && !auth)
7095
7104
  throw new TypeError("Portable push notifications require @absolutejs/auth so provider tokens can be registered without exposing identity controls to page code.");
7096
- if (usesPush && !loaded.app.routes.some((route) => route.path === "/auth/mobile/push"))
7097
- throw new TypeError("@absolutejs/devices pushNotifications is used, but Auth nativePush is not configured. Pass a server-side registrar to auth({ nativePush: ... }).");
7105
+ if (usesPush && !loaded.app.routes.some((route) => route.path === "/auth/push" || route.path === "/auth/mobile/push"))
7106
+ throw new TypeError("@absolutejs/devices pushNotifications is used, but Auth push is not configured. Pass a trusted server-side registrar to auth({ push: ... }).");
7098
7107
  assertAbsoluteDeviceCapabilityPackages(options.projectRoot, deviceCapabilities);
7099
7108
  if (auth && !loaded.app.routes.some((route) => route.path === "/.well-known/openid-configuration")) {
7100
7109
  throw new TypeError("@absolutejs/auth is installed, but its OIDC provider is not mounted. Native authentication requires the auth oidc configuration so AbsoluteJS can provision a public PKCE client.");
@@ -16717,8 +16726,18 @@ ${next.slice(index)}`;
16717
16726
  const path = join47(config.nativeProjectDirectory, "ios/App/App/Info.plist");
16718
16727
  const source = await readFile12(path, "utf8");
16719
16728
  const requirements = absoluteDeviceNativeRequirements(plan);
16720
- const content = requirements.iosUsageDescriptions.map((purpose) => ` <key>${IOS_KEYS[purpose]}</key>
16729
+ const existingSystemBars = source.match(/<key>UIViewControllerBasedStatusBarAppearance<\/key>\s*<(true|false)\s*\/>/u);
16730
+ const ownedStart = source.indexOf(START_MARKER2);
16731
+ const ownedEnd = source.indexOf(END_MARKER2);
16732
+ const ownsSystemBars = ownedStart >= 0 && ownedEnd > ownedStart && source.slice(ownedStart, ownedEnd).includes("UIViewControllerBasedStatusBarAppearance");
16733
+ if (requirements.iosSystemBars && existingSystemBars?.[1] === "false" && !ownsSystemBars)
16734
+ throw new TypeError("iOS system bars require UIViewControllerBasedStatusBarAppearance to be true.");
16735
+ const usageContent = requirements.iosUsageDescriptions.map((purpose) => ` <key>${IOS_KEYS[purpose]}</key>
16721
16736
  <string>${escapeXml2(iosDescription(config.appName, purpose))}</string>`).join(`
16737
+ `);
16738
+ const systemBarsContent = requirements.iosSystemBars && (existingSystemBars === null || ownsSystemBars) ? ` <key>UIViewControllerBasedStatusBarAppearance</key>
16739
+ <true/>` : "";
16740
+ const content = [usageContent, systemBarsContent].filter(Boolean).join(`
16722
16741
  `);
16723
16742
  const region = content ? ` ${START_MARKER2}
16724
16743
  ${content}
@@ -18144,6 +18163,10 @@ var init_iosTestReport = __esm(() => {
18144
18163
  ["DEV-01", "Record cold and warm bun dev startup timings."],
18145
18164
  ["DEV-02", "Complete route traversal, HMR, relaunch, and recovery checks."],
18146
18165
  ["CAP-01", "Complete automatic device-capability provisioning checks."],
18166
+ ...Array.from({ length: 8 }, (_, index) => [
18167
+ `SYSUI-${String(index + 1).padStart(2, "0")}`,
18168
+ `Complete provider-neutral Keyboard and System Bars runbook check SYSUI-${String(index + 1).padStart(2, "0")}.`
18169
+ ]),
18147
18170
  ...Array.from({ length: 8 }, (_, index) => [
18148
18171
  `FILES-${String(index + 1).padStart(2, "0")}`,
18149
18172
  `Complete provider-neutral Documents runbook check FILES-${String(index + 1).padStart(2, "0")}.`
@@ -18152,6 +18175,10 @@ var init_iosTestReport = __esm(() => {
18152
18175
  `NOTIF-${String(index + 1).padStart(2, "0")}`,
18153
18176
  `Complete provider-neutral Local Notifications runbook check NOTIF-${String(index + 1).padStart(2, "0")}.`
18154
18177
  ]),
18178
+ ...Array.from({ length: 8 }, (_, index) => [
18179
+ `PUSH-${String(index + 1).padStart(2, "0")}`,
18180
+ `Complete provider-neutral Push Notifications runbook check PUSH-${String(index + 1).padStart(2, "0")}.`
18181
+ ]),
18155
18182
  ...Array.from({ length: 14 }, (_, index) => [
18156
18183
  `LOC-${String(index + 1).padStart(2, "0")}`,
18157
18184
  `Complete foreground-location runbook check LOC-${String(index + 1).padStart(2, "0")} without recording exact coordinates.`
@@ -18213,6 +18240,10 @@ var init_androidTestReport = __esm(() => {
18213
18240
  ["DEV-01", "Record cold and warm native startup timings."],
18214
18241
  ["DEV-02", "Complete route traversal, HMR, relaunch, and recovery checks."],
18215
18242
  ["CAP-01", "Complete automatic device-capability provisioning checks."],
18243
+ [
18244
+ "SYSUI-01",
18245
+ "Complete keyboard and modern edge-to-edge system-bars checks."
18246
+ ],
18216
18247
  [
18217
18248
  "FILES-01",
18218
18249
  "Complete provider-neutral file pick, export, open, and cleanup checks."