@wix/himalaya-cli 0.950.0 → 0.952.0

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.
@@ -57,6 +57,7 @@ export interface NavigationConfig {
57
57
  name?: string;
58
58
  sidebar?: SidebarConfig;
59
59
  navLogicBundle?: import("@wix/himalaya/core").LogicBundleRef;
60
+ appIconBadgeSources?: string[];
60
61
  /** Signed release allowlist for contained browser Tier-5 `_stream` requests. */
61
62
  streamPolicy?: StreamPolicy;
62
63
  splash?: SplashConfig;
@@ -199,6 +199,9 @@ export interface DerivedAppMeta {
199
199
  * absolutizes the URL and computes the digest at serve time, exactly as a
200
200
  * screen's `logicBundle` is filled from its ScreenBuildContext. */
201
201
  navLogicBundle?: import("@wix/himalaya/core").LogicBundleRef;
202
+ /** Forwarded from AppConfig.navigation.appIconBadgeSources — RFC 0010 (app-icon
203
+ * amendment). Which nav badges also drive the OS app-icon badge. */
204
+ appIconBadgeSources?: string[];
202
205
  /** Forwarded from AppConfig.navigation.streamPolicy — the signed browser stream allowlist. */
203
206
  streamPolicy?: import("@wix/himalaya/core").StreamPolicy;
204
207
  /** Forwarded from AppConfig.`splash` — the in-app splash surface. NOTE the
@@ -2365,6 +2365,13 @@ export interface NavigationConfig {
2365
2365
  * tab must stay hidden three pushes deep in another stack. Absent ⇒ paths stay
2366
2366
  * unresolved and the literals render — the worker enriches, it never gates. */
2367
2367
  navLogicBundle?: LogicBundleRef;
2368
+ /** RFC 0010 (app-icon amendment) — which nav badges ALSO drive the OS app-icon
2369
+ * badge. Each entry is `"<kind>:<id>"` (`tab` | `drawer` | `topBarAction`, the
2370
+ * spelling `navKey` uses); the icon shows the SUM of those slots' resolved counts.
2371
+ * Empty/absent ⇒ no mirroring. An entry naming a slot this build does not have is
2372
+ * ignored, never a blanked badge. Requires the `push` capability — `defineApp`
2373
+ * rejects the combination, because the badge would be set and never shown. */
2374
+ appIconBadgeSources?: string[];
2368
2375
  /** Signed release allowlist for contained browser Tier-5 `_stream` requests. */
2369
2376
  streamPolicy?: StreamPolicy;
2370
2377
  scheme: string;
@@ -7424,6 +7424,35 @@ function validateLadderConfig(config) {
7424
7424
  );
7425
7425
  }
7426
7426
  }
7427
+ const iconSources = config.navigation?.appIconBadgeSources ?? [];
7428
+ if (iconSources.length > 0) {
7429
+ if (!caps.has("push")) {
7430
+ throw new Error(
7431
+ `defineApp: navigation.appIconBadgeSources is set (${iconSources.join(", ")}) but "push" is not in capabilities. The app-icon badge is a push-capability verb, and without it the badge is set and never appears \u2014 no error, on any platform. Add "push" to capabilities, or drop appIconBadgeSources.`
7432
+ );
7433
+ }
7434
+ const slots = /* @__PURE__ */ new Map();
7435
+ const nav = config.navigation;
7436
+ for (const it of nav?.tabBar?.items ?? []) slots.set(`tab:${it.id}`, { kind: "tab", badge: it.badge });
7437
+ for (const it of nav?.sidebar?.items ?? []) slots.set(`tab:${it.id}`, { kind: "tab", badge: it.badge });
7438
+ for (const it of nav?.drawer?.items ?? []) slots.set(`drawer:${it.id}`, { kind: "drawer", badge: it.badge });
7439
+ for (const a of nav?.topBarDefault?.actions ?? []) slots.set(`topBarAction:${a.id}`, { kind: "topBarAction", badge: a.badge });
7440
+ for (const src of iconSources) {
7441
+ const slot = slots.get(src);
7442
+ if (!slot) continue;
7443
+ const badge = slot.badge;
7444
+ if (!badge) {
7445
+ throw new Error(
7446
+ `defineApp: navigation.appIconBadgeSources names "${src}", but that slot has no badge at all, so it can never contribute a count. Give it a badge, or drop it from appIconBadgeSources.`
7447
+ );
7448
+ }
7449
+ if (badge.kind === "dot" && !badge.valuePath) {
7450
+ throw new Error(
7451
+ `defineApp: navigation.appIconBadgeSources names "${src}", whose badge is a STATIC dot \u2014 it carries no number, so it would contribute 0 forever. Give it a valuePath (a bound dot resolves to a count), use kind: "count", or drop it from appIconBadgeSources.`
7452
+ );
7453
+ }
7454
+ }
7455
+ }
7427
7456
  if (config.commerce?.fields?.some(looksLikeCardData)) {
7428
7457
  throw new Error(
7429
7458
  `defineApp: commerce.fields may not collect card data. Money moves only through the in-app Wix cashier, which takes an order id \u2014 no capability anywhere accepts a card number.`
@@ -8434,6 +8434,7 @@ function deriveAppMeta(name, m, platforms = {}) {
8434
8434
  orientation: config.navigation?.orientation,
8435
8435
  sidebar: config.navigation?.sidebar,
8436
8436
  navLogicBundle: config.navigation?.navLogicBundle,
8437
+ appIconBadgeSources: config.navigation?.appIconBadgeSources,
8437
8438
  streamPolicy: config.navigation?.streamPolicy,
8438
8439
  splash: config.splash,
8439
8440
  locale: config.locale,
package/dist/cli.mjs CHANGED
@@ -13823,6 +13823,7 @@ function deriveAppMeta(name, m, platforms = {}) {
13823
13823
  orientation: config.navigation?.orientation,
13824
13824
  sidebar: config.navigation?.sidebar,
13825
13825
  navLogicBundle: config.navigation?.navLogicBundle,
13826
+ appIconBadgeSources: config.navigation?.appIconBadgeSources,
13826
13827
  streamPolicy: config.navigation?.streamPolicy,
13827
13828
  splash: config.splash,
13828
13829
  locale: config.locale,
@@ -28028,6 +28029,7 @@ function deriveNavigationConfig(app, bundleCtx) {
28028
28029
  if (app.navLogicBundle !== void 0) {
28029
28030
  config.navLogicBundle = bundleCtx ? expandNavBundle(app.navLogicBundle, bundleCtx) : app.navLogicBundle;
28030
28031
  }
28032
+ if (app.appIconBadgeSources !== void 0) config.appIconBadgeSources = app.appIconBadgeSources;
28031
28033
  if (app.streamPolicy !== void 0) config.streamPolicy = app.streamPolicy;
28032
28034
  if (app.splash !== void 0) config.splash = app.splash;
28033
28035
  if (app.locale !== void 0) config.locale = app.locale;
@@ -29790,6 +29792,7 @@ __export(config_exports2, {
29790
29792
  OPERATIONAL_OVERLAY_KEYS: () => OPERATIONAL_OVERLAY_KEYS,
29791
29793
  OPERATOR_ONLY_OVERLAY_KEYS: () => OPERATOR_ONLY_OVERLAY_KEYS,
29792
29794
  appConfigPath: () => appConfigPath,
29795
+ appIconBadgeSourcesErrors: () => appIconBadgeSourcesErrors,
29793
29796
  loadAppConfigOverlay: () => loadAppConfigOverlay,
29794
29797
  loadLocalFlags: () => loadLocalFlags,
29795
29798
  loadRevocations: () => loadRevocations,
@@ -29901,12 +29904,25 @@ function originKeysIn(patch) {
29901
29904
  if (!patch || typeof patch !== "object" || Array.isArray(patch)) return [];
29902
29905
  return Object.keys(patch).filter((k) => OPERATOR_ONLY_OVERLAY_KEYS.has(k));
29903
29906
  }
29907
+ function appIconBadgeSourcesErrors(value) {
29908
+ if (!Array.isArray(value)) {
29909
+ return ['"appIconBadgeSources" must be an array (use [] to stop mirroring)'];
29910
+ }
29911
+ if (value.length > 0) {
29912
+ return [
29913
+ '"appIconBadgeSources" may only be EMPTIED through the overlay, not added to \u2014 mirroring requires the app to declare the `push` capability, which only defineApp can verify at bake time. Use [] to stop mirroring; add a source in config.ts.'
29914
+ ];
29915
+ }
29916
+ return [];
29917
+ }
29904
29918
  function validateOverlayPatch(patch) {
29905
29919
  const errs = [];
29906
29920
  if (!patch || typeof patch !== "object" || Array.isArray(patch)) return ["overlay must be a JSON object"];
29907
- for (const k of Object.keys(patch)) {
29921
+ const obj = patch;
29922
+ for (const k of Object.keys(obj)) {
29908
29923
  if (STRUCTURAL_KEYS.has(k)) errs.push(`"${k}" is structural \u2014 edit it in source (deriveNavigationConfig), not the overlay`);
29909
29924
  else if (!OPERATIONAL_OVERLAY_KEYS.has(k)) errs.push(`"${k}" is not an allowed operational overlay key`);
29925
+ else if (k === "appIconBadgeSources") errs.push(...appIconBadgeSourcesErrors(obj[k]));
29910
29926
  }
29911
29927
  return errs;
29912
29928
  }
@@ -29923,8 +29939,16 @@ function writeJsonAt(app, file, root, value) {
29923
29939
  writeFileSync12(path, JSON.stringify(value, null, 2) + "\n");
29924
29940
  return path;
29925
29941
  }
29942
+ function sanitizeOverlay(raw) {
29943
+ if (!("appIconBadgeSources" in raw)) return raw;
29944
+ if (appIconBadgeSourcesErrors(raw.appIconBadgeSources).length === 0) return raw;
29945
+ const { appIconBadgeSources: _dropped, ...rest } = raw;
29946
+ return rest;
29947
+ }
29926
29948
  function loadAppConfigOverlay(app, root = REPO_ROOT6) {
29927
- return readJsonAt(app, "app-config.overlay.json", root);
29949
+ const raw = readJsonAt(app, "app-config.overlay.json", root);
29950
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) return raw;
29951
+ return sanitizeOverlay(raw);
29928
29952
  }
29929
29953
  function saveAppConfigOverlay(app, patch, root = REPO_ROOT6) {
29930
29954
  const errs = validateOverlayPatch(patch);
@@ -29986,6 +30010,13 @@ var init_config2 = __esm({
29986
30010
  "tabBar",
29987
30011
  "drawer",
29988
30012
  "sidebar",
30013
+ // RFC 0010 app-icon amendment — which nav badges drive the OS app-icon badge.
30014
+ // OPERATIONAL, but NARROWED to the empty list: see `appIconBadgeSourcesErrors` below.
30015
+ // The incident lever is the point — `{appIconBadgeSources: []}` silences a badge that
30016
+ // is showing the wrong number, live, instead of waiting for a binary. INTRODUCING
30017
+ // sources is a source change, because only `defineApp` can check the `push` capability
30018
+ // they need.
30019
+ "appIconBadgeSources",
29989
30020
  // The in-app splash surface — OPERATIONAL for the same reason the nav chrome
29990
30021
  // above is: pure look-and-feel that cannot escalate. Every field is a token
29991
30022
  // name, a BAKED asset name, or a clamped duration; the artwork itself stays in
@@ -37297,6 +37328,7 @@ var init_nav_lint = __esm({
37297
37328
  "orientation",
37298
37329
  "surfaces",
37299
37330
  "navLogicBundle",
37331
+ "appIconBadgeSources",
37300
37332
  "streamPolicy",
37301
37333
  "scheme",
37302
37334
  "deepLinkPatterns",
@@ -37320,6 +37352,7 @@ var init_nav_lint = __esm({
37320
37352
  "orientation",
37321
37353
  "surfaces",
37322
37354
  "navLogicBundle",
37355
+ "appIconBadgeSources",
37323
37356
  "streamPolicy",
37324
37357
  "scheme",
37325
37358
  "deepLinkPatterns",
@@ -43299,19 +43332,19 @@ var init_preview_assets_generated = __esm({
43299
43332
  "../../packages/serve/src/preview-assets.generated.ts"() {
43300
43333
  init_preview_assets_format();
43301
43334
  PREVIEW_ASSET_MANIFEST = [
43302
- { key: "assets/index-DlRHv5p2.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 983492, sha256: "89f6530bb02d868a8d28e7a93103bef7e7b83904a5e0fcf4f813c06872191b48" },
43303
- { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 983500, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
43304
- { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 1074424, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
43305
- { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 1165408, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
43306
- { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 1256388, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
43307
- { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 1347260, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
43308
- { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 1438240, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
43309
- { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 1546876, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
43310
- { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 1655960, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
43311
- { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 1765008, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
43312
- { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 1872708, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
43313
- { key: "index.html", contentType: "text/html; charset=utf-8", offset: 1960816, length: 4448, sha256: "2a2e413e18bb4b278f1f4daee79dce764a17f65f6567a734a69e9a895bc85f70" },
43314
- { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 1965264, length: 13784, sha256: "cfb9465254fab84f0e084bb4542c282758ea29774b5f172840cc0b9e4194ef89" }
43335
+ { key: "assets/index-BjeU573D.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 984799, sha256: "c9d1cae4cb78ee9be62f41d1f84c87599fa347404cc256580bca700f71f0c045" },
43336
+ { key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 984807, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
43337
+ { key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 1075731, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
43338
+ { key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 1166715, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
43339
+ { key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 1257695, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
43340
+ { key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 1348567, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
43341
+ { key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 1439547, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
43342
+ { key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 1548183, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
43343
+ { key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 1657267, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
43344
+ { key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 1766315, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
43345
+ { key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 1874015, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
43346
+ { key: "index.html", contentType: "text/html; charset=utf-8", offset: 1962123, length: 4448, sha256: "5f8763e9a491dc85c1c0dd52572d5f61bf4c3f978e4fd39262bae1f46e101a54" },
43347
+ { key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 1966571, length: 13784, sha256: "cfb9465254fab84f0e084bb4542c282758ea29774b5f172840cc0b9e4194ef89" }
43315
43348
  ];
43316
43349
  }
43317
43350
  });
Binary file
@@ -841,7 +841,7 @@
841
841
  "name": "NavigationConfig",
842
842
  "kind": "interface",
843
843
  "jsdoc": "/** Per-app navigation/deep-link config, served OTA at GET /v1/app-config/:appName. */",
844
- "decl": "export interface NavigationConfig {\n /** Tab-bar structure (which tabs; their icons/labels/badges). */\n tabBar?: TabBarConfig;\n /** Slide-in drawer / hamburger-menu destinations. */\n drawer?: DrawerConfig;\n /** Navigation chrome the shell draws.\n * Omitted ⇒ \"bottomTabs\". The shell (not the descriptor) reads this. */\n navKind?: NavKind;\n /** Destinations for \"sidebar\" mode.\n * Absent ⇒ the shell derives the rail from `tabBar.items`. */\n sidebar?: SidebarConfig;\n /** App-level default top bar; a per-screen\n * `ScreenDescriptor.topBar` fully replaces it (override, not merge). */\n topBarDefault?: TopBarConfig;\n /** The post-OS-splash brand surface (see `SplashConfig`). Absent / not enabled\n * ⇒ today's behavior. Operational per (live-flippable). */\n splash?: SplashConfig;\n /** App-level default locale. Operational per so a Hebrew (or Spanish)\n * branded app can pin RTL/l10n OTA without a launch flag. `default` is a\n * BCP-47 primary subtag; clients coerce unknown tags rather than failing the\n * envelope. `pin: true` skips the device/browser language; in-app `locale.set`\n * still wins. Absent ⇒ today's device-then-en behavior. */\n locale?: LocaleConfig;\n /** Effective orientations, resolved INSIDE\n * the binary's build-time envelope (config.ts `orientationEnvelope`). The\n * envelope is the ceiling and can never be OTA (iOS reads the plist before\n * any app code runs); this narrows within it. Always intersected with the\n * envelope — it can never widen it. Absent/empty ⇒ the envelope itself. */\n orientation?: OrientationConfig;\n /** Per-surface nav projection, keyed by catalog\n * surface id (`phone` | `tablet` | `desktop` | `mac` | `watch` | `wear` | `rn`).\n * Keyed the way `orientation` is keyed by device family and narrowed the same\n * way: a key outside the app's `platforms.json` envelope is DROPPED, never\n * honored (see `resolveSurfaceNav`). Absent key ⇒ that surface uses the default\n * projection, so an app that never thinks about surfaces is unaffected. */\n surfaces?: Record<string, SurfaceNavConfig>;\n /** The APP-LEVEL nav worker\n * that feeds every `*Path` binding on `NavTabItem` / `DrawerItem` /\n * `TopBarAction`. App-level, not a screen's worker, because chrome outlives\n * every screen: a cart badge must survive leaving the cart, and a flag-hidden\n * tab must stay hidden three pushes deep in another stack. Absent ⇒ paths stay\n * unresolved and the literals render — the worker enriches, it never gates. */\n navLogicBundle?: LogicBundleRef;\n /** Signed release allowlist for contained browser Tier-5 `_stream` requests. */\n streamPolicy?: StreamPolicy;\n scheme: string;\n deepLinkPatterns: DeepLinkPattern[];\n linkableScreens: LinkableScreen[];\n}"
844
+ "decl": "export interface NavigationConfig {\n /** Tab-bar structure (which tabs; their icons/labels/badges). */\n tabBar?: TabBarConfig;\n /** Slide-in drawer / hamburger-menu destinations. */\n drawer?: DrawerConfig;\n /** Navigation chrome the shell draws.\n * Omitted ⇒ \"bottomTabs\". The shell (not the descriptor) reads this. */\n navKind?: NavKind;\n /** Destinations for \"sidebar\" mode.\n * Absent ⇒ the shell derives the rail from `tabBar.items`. */\n sidebar?: SidebarConfig;\n /** App-level default top bar; a per-screen\n * `ScreenDescriptor.topBar` fully replaces it (override, not merge). */\n topBarDefault?: TopBarConfig;\n /** The post-OS-splash brand surface (see `SplashConfig`). Absent / not enabled\n * ⇒ today's behavior. Operational per (live-flippable). */\n splash?: SplashConfig;\n /** App-level default locale. Operational per so a Hebrew (or Spanish)\n * branded app can pin RTL/l10n OTA without a launch flag. `default` is a\n * BCP-47 primary subtag; clients coerce unknown tags rather than failing the\n * envelope. `pin: true` skips the device/browser language; in-app `locale.set`\n * still wins. Absent ⇒ today's device-then-en behavior. */\n locale?: LocaleConfig;\n /** Effective orientations, resolved INSIDE\n * the binary's build-time envelope (config.ts `orientationEnvelope`). The\n * envelope is the ceiling and can never be OTA (iOS reads the plist before\n * any app code runs); this narrows within it. Always intersected with the\n * envelope — it can never widen it. Absent/empty ⇒ the envelope itself. */\n orientation?: OrientationConfig;\n /** Per-surface nav projection, keyed by catalog\n * surface id (`phone` | `tablet` | `desktop` | `mac` | `watch` | `wear` | `rn`).\n * Keyed the way `orientation` is keyed by device family and narrowed the same\n * way: a key outside the app's `platforms.json` envelope is DROPPED, never\n * honored (see `resolveSurfaceNav`). Absent key ⇒ that surface uses the default\n * projection, so an app that never thinks about surfaces is unaffected. */\n surfaces?: Record<string, SurfaceNavConfig>;\n /** The APP-LEVEL nav worker\n * that feeds every `*Path` binding on `NavTabItem` / `DrawerItem` /\n * `TopBarAction`. App-level, not a screen's worker, because chrome outlives\n * every screen: a cart badge must survive leaving the cart, and a flag-hidden\n * tab must stay hidden three pushes deep in another stack. Absent ⇒ paths stay\n * unresolved and the literals render — the worker enriches, it never gates. */\n navLogicBundle?: LogicBundleRef;\n /** Which nav badges ALSO drive the OS app-icon\n * badge. Each entry is `\"<kind>:<id>\"` (`tab` | `drawer` | `topBarAction`, the\n * spelling `navKey` uses); the icon shows the SUM of those slots' resolved counts.\n * Empty/absent ⇒ no mirroring. An entry naming a slot this build does not have is\n * ignored, never a blanked badge. Requires the `push` capability — `defineApp`\n * rejects the combination, because the badge would be set and never shown. */\n appIconBadgeSources?: string[];\n /** Signed release allowlist for contained browser Tier-5 `_stream` requests. */\n streamPolicy?: StreamPolicy;\n scheme: string;\n deepLinkPatterns: DeepLinkPattern[];\n linkableScreens: LinkableScreen[];\n}"
845
845
  },
846
846
  {
847
847
  "name": "NavKind",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.950.0",
3
+ "version": "0.952.0",
4
4
  "type": "module",
5
5
  "description": "himi — the Himalaya authoring CLI. Build a Tier-5 content package on your own machine, push it to the production serve as a draft, preview it on web + Himi Player, and read worker logs back — the remote dev loop. Wraps @himalaya/serve-cli for transport.",
6
6
  "keywords": [
@@ -64,5 +64,5 @@
64
64
  "artifactId": "himalaya-cli"
65
65
  }
66
66
  },
67
- "falconPackageHash": "1d06ded80ed742ad6384610cdd21ee917c146e46e2e9f54ac82341f0"
67
+ "falconPackageHash": "6c39363742507289fbff3afa06d0b9ade4dd4b51d1c72402298f9b06"
68
68
  }