@wix/himalaya-cli 0.1513.0 → 0.1514.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.
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/builder.d.ts +4 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +9 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/validator.d.ts +15 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/core.mjs +8 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdui.mjs +8 -2
- package/dist/cli.mjs +98 -6
- package/package.json +2 -2
|
@@ -56,6 +56,10 @@ export interface ScreenDescriptor {
|
|
|
56
56
|
/** The page's title for a host that shows it in its own navigation bar. Mirror of
|
|
57
57
|
* ScreenDescriptor.host_title in core.proto. */
|
|
58
58
|
hostTitle?: import("@wix/himalaya/core").HostTitle;
|
|
59
|
+
/** RFC 0066 — "" / "visible" (default) | "hidden": hide the bottom tab bar while this screen
|
|
60
|
+
* is the visible top of its tab's stack. Mirror of ScreenDescriptor.tab_bar_visibility in
|
|
61
|
+
* core.proto. */
|
|
62
|
+
tabBarVisibility?: string;
|
|
59
63
|
}
|
|
60
64
|
/** Tier 3/4 + embeddable WebView behavior. Mirror of WebViewConfig in core.proto
|
|
61
65
|
* (RFC 0038). All fields optional; zero values reproduce legacy behavior. */
|
package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts
CHANGED
|
@@ -3030,6 +3030,9 @@ export interface TopBarConfig {
|
|
|
3030
3030
|
scrollBehavior?: string;
|
|
3031
3031
|
/** RFC 0066 amendment — truthy ⇒ leaving the presentation asks to discard. Unset/unresolved ⇒ false. */
|
|
3032
3032
|
dirtyPath?: string;
|
|
3033
|
+
/** RFC 0066 amendment — live `visibility` (`$service:`). Resolves to "visible" | "hidden";
|
|
3034
|
+
* anything else, or unresolved, falls back to `visibility`. Not a truthy boolean. */
|
|
3035
|
+
visibilityPath?: string;
|
|
3033
3036
|
}
|
|
3034
3037
|
/** RFC 0066 §1 (+ its "top-bar gap items" amendment) — one top-bar item. Test id `toolbar.<id>`
|
|
3035
3038
|
* (`toolbar-<id>` on web and React Native). Every tap carries an existing `Action`
|
|
@@ -3057,6 +3060,9 @@ export interface ToolbarItem {
|
|
|
3057
3060
|
avatar?: ToolbarAvatar;
|
|
3058
3061
|
/** Live label; `label` is the fallback. */
|
|
3059
3062
|
labelPath?: string;
|
|
3063
|
+
/** Long press (touch), secondary click (pointer) or the "More options" accessibility action.
|
|
3064
|
+
* Never also fires `onTap`; ignored while disabled or loading, in More Actions, and with a `menu`. */
|
|
3065
|
+
onLongPress?: Action;
|
|
3060
3066
|
}
|
|
3061
3067
|
/** RFC 0066 amendment — an avatar item. Images are absolute https URLs (resolve a Wix
|
|
3062
3068
|
* media id with `wixMediaUrl` before publishing). */
|
|
@@ -3536,6 +3542,9 @@ export interface ScreenDescriptor {
|
|
|
3536
3542
|
/** RFC 0010 (top-bar amendment) — per-screen top bar (trailing actions +
|
|
3537
3543
|
* leading/style override). Fully replaces `NavigationConfig.topBarDefault`. */
|
|
3538
3544
|
topBar?: TopBarConfig;
|
|
3545
|
+
/** "" / "visible" (default) | "hidden": hide the bottom tab bar while this screen is the
|
|
3546
|
+
* visible top of its tab's stack (RFC 0066). Static; no effect in a presentation. */
|
|
3547
|
+
tabBarVisibility?: string;
|
|
3539
3548
|
etag?: string;
|
|
3540
3549
|
cacheControl?: CacheControl;
|
|
3541
3550
|
telemetryScreenName?: string;
|
package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/validator.d.ts
CHANGED
|
@@ -151,6 +151,9 @@ export declare const screenDescriptorSchema: {
|
|
|
151
151
|
readonly topBar: {
|
|
152
152
|
readonly $ref: "#/$defs/topBarConfig";
|
|
153
153
|
};
|
|
154
|
+
readonly tabBarVisibility: {
|
|
155
|
+
readonly type: "string";
|
|
156
|
+
};
|
|
154
157
|
readonly logicBundle: {
|
|
155
158
|
readonly type: "object";
|
|
156
159
|
readonly additionalProperties: false;
|
|
@@ -410,6 +413,9 @@ export declare const screenDescriptorSchema: {
|
|
|
410
413
|
readonly dirtyPath: {
|
|
411
414
|
readonly type: "string";
|
|
412
415
|
};
|
|
416
|
+
readonly visibilityPath: {
|
|
417
|
+
readonly type: "string";
|
|
418
|
+
};
|
|
413
419
|
};
|
|
414
420
|
};
|
|
415
421
|
readonly searchableConfig: {
|
|
@@ -493,6 +499,9 @@ export declare const screenDescriptorSchema: {
|
|
|
493
499
|
readonly labelPath: {
|
|
494
500
|
readonly type: "string";
|
|
495
501
|
};
|
|
502
|
+
readonly onLongPress: {
|
|
503
|
+
readonly $ref: "#/$defs/action";
|
|
504
|
+
};
|
|
496
505
|
};
|
|
497
506
|
};
|
|
498
507
|
readonly toolbarAvatar: {
|
|
@@ -1742,6 +1751,9 @@ export declare const widgetSnapshotSchema: {
|
|
|
1742
1751
|
readonly dirtyPath: {
|
|
1743
1752
|
readonly type: "string";
|
|
1744
1753
|
};
|
|
1754
|
+
readonly visibilityPath: {
|
|
1755
|
+
readonly type: "string";
|
|
1756
|
+
};
|
|
1745
1757
|
};
|
|
1746
1758
|
};
|
|
1747
1759
|
readonly searchableConfig: {
|
|
@@ -1825,6 +1837,9 @@ export declare const widgetSnapshotSchema: {
|
|
|
1825
1837
|
readonly labelPath: {
|
|
1826
1838
|
readonly type: "string";
|
|
1827
1839
|
};
|
|
1840
|
+
readonly onLongPress: {
|
|
1841
|
+
readonly $ref: "#/$defs/action";
|
|
1842
|
+
};
|
|
1828
1843
|
};
|
|
1829
1844
|
};
|
|
1830
1845
|
readonly toolbarAvatar: {
|
|
@@ -8482,6 +8482,9 @@ var screenDescriptorSchema = {
|
|
|
8482
8482
|
// in the schema, `additionalProperties:false` would reject EVERY descriptor
|
|
8483
8483
|
// carrying a top bar (the same trap as logicBundle below).
|
|
8484
8484
|
topBar: { $ref: "#/$defs/topBarConfig" },
|
|
8485
|
+
// RFC 0066 amendment — "" / "visible" (default) | "hidden". A free string like every
|
|
8486
|
+
// chrome discriminator: an unknown value coalesces to "visible" (invariant 6).
|
|
8487
|
+
tabBarVisibility: { type: "string" },
|
|
8485
8488
|
// RFC 0002 — Tier-5 worker bundle reference (LogicBundleRef). Without this in
|
|
8486
8489
|
// the schema, `additionalProperties:false` rejected EVERY T5 descriptor, so the
|
|
8487
8490
|
// admin's pre-push validation 400'd any edit of a T5 screen.
|
|
@@ -8651,7 +8654,9 @@ var screenDescriptorSchema = {
|
|
|
8651
8654
|
titleMenu: { $ref: "#/$defs/topBarTitleMenu" },
|
|
8652
8655
|
subtitlePath: { type: "string" },
|
|
8653
8656
|
scrollBehavior: { type: "string" },
|
|
8654
|
-
dirtyPath: { type: "string" }
|
|
8657
|
+
dirtyPath: { type: "string" },
|
|
8658
|
+
// RFC 0066 amendment "long press, bar visibility, tab-bar visibility" (field 15).
|
|
8659
|
+
visibilityPath: { type: "string" }
|
|
8655
8660
|
}
|
|
8656
8661
|
},
|
|
8657
8662
|
// RFC 0010 "Native top-bar search" (SearchableConfig fields 1–5, 12–15). `placement` stays a free string.
|
|
@@ -8687,7 +8692,8 @@ var screenDescriptorSchema = {
|
|
|
8687
8692
|
content: { $ref: "#/$defs/component" },
|
|
8688
8693
|
loadingPath: { type: "string" },
|
|
8689
8694
|
avatar: { $ref: "#/$defs/toolbarAvatar" },
|
|
8690
|
-
labelPath: { type: "string" }
|
|
8695
|
+
labelPath: { type: "string" },
|
|
8696
|
+
onLongPress: { $ref: "#/$defs/action" }
|
|
8691
8697
|
}
|
|
8692
8698
|
},
|
|
8693
8699
|
toolbarAvatar: {
|
|
@@ -7054,6 +7054,9 @@ var screenDescriptorSchema = {
|
|
|
7054
7054
|
// in the schema, `additionalProperties:false` would reject EVERY descriptor
|
|
7055
7055
|
// carrying a top bar (the same trap as logicBundle below).
|
|
7056
7056
|
topBar: { $ref: "#/$defs/topBarConfig" },
|
|
7057
|
+
// RFC 0066 amendment — "" / "visible" (default) | "hidden". A free string like every
|
|
7058
|
+
// chrome discriminator: an unknown value coalesces to "visible" (invariant 6).
|
|
7059
|
+
tabBarVisibility: { type: "string" },
|
|
7057
7060
|
// RFC 0002 — Tier-5 worker bundle reference (LogicBundleRef). Without this in
|
|
7058
7061
|
// the schema, `additionalProperties:false` rejected EVERY T5 descriptor, so the
|
|
7059
7062
|
// admin's pre-push validation 400'd any edit of a T5 screen.
|
|
@@ -7223,7 +7226,9 @@ var screenDescriptorSchema = {
|
|
|
7223
7226
|
titleMenu: { $ref: "#/$defs/topBarTitleMenu" },
|
|
7224
7227
|
subtitlePath: { type: "string" },
|
|
7225
7228
|
scrollBehavior: { type: "string" },
|
|
7226
|
-
dirtyPath: { type: "string" }
|
|
7229
|
+
dirtyPath: { type: "string" },
|
|
7230
|
+
// RFC 0066 amendment "long press, bar visibility, tab-bar visibility" (field 15).
|
|
7231
|
+
visibilityPath: { type: "string" }
|
|
7227
7232
|
}
|
|
7228
7233
|
},
|
|
7229
7234
|
// RFC 0010 "Native top-bar search" (SearchableConfig fields 1–5, 12–15). `placement` stays a free string.
|
|
@@ -7259,7 +7264,8 @@ var screenDescriptorSchema = {
|
|
|
7259
7264
|
content: { $ref: "#/$defs/component" },
|
|
7260
7265
|
loadingPath: { type: "string" },
|
|
7261
7266
|
avatar: { $ref: "#/$defs/toolbarAvatar" },
|
|
7262
|
-
labelPath: { type: "string" }
|
|
7267
|
+
labelPath: { type: "string" },
|
|
7268
|
+
onLongPress: { $ref: "#/$defs/action" }
|
|
7263
7269
|
}
|
|
7264
7270
|
},
|
|
7265
7271
|
toolbarAvatar: {
|
package/dist/cli.mjs
CHANGED
|
@@ -9823,6 +9823,9 @@ var init_validator = __esm({
|
|
|
9823
9823
|
// in the schema, `additionalProperties:false` would reject EVERY descriptor
|
|
9824
9824
|
// carrying a top bar (the same trap as logicBundle below).
|
|
9825
9825
|
topBar: { $ref: "#/$defs/topBarConfig" },
|
|
9826
|
+
// RFC 0066 amendment — "" / "visible" (default) | "hidden". A free string like every
|
|
9827
|
+
// chrome discriminator: an unknown value coalesces to "visible" (invariant 6).
|
|
9828
|
+
tabBarVisibility: { type: "string" },
|
|
9826
9829
|
// RFC 0002 — Tier-5 worker bundle reference (LogicBundleRef). Without this in
|
|
9827
9830
|
// the schema, `additionalProperties:false` rejected EVERY T5 descriptor, so the
|
|
9828
9831
|
// admin's pre-push validation 400'd any edit of a T5 screen.
|
|
@@ -9992,7 +9995,9 @@ var init_validator = __esm({
|
|
|
9992
9995
|
titleMenu: { $ref: "#/$defs/topBarTitleMenu" },
|
|
9993
9996
|
subtitlePath: { type: "string" },
|
|
9994
9997
|
scrollBehavior: { type: "string" },
|
|
9995
|
-
dirtyPath: { type: "string" }
|
|
9998
|
+
dirtyPath: { type: "string" },
|
|
9999
|
+
// RFC 0066 amendment "long press, bar visibility, tab-bar visibility" (field 15).
|
|
10000
|
+
visibilityPath: { type: "string" }
|
|
9996
10001
|
}
|
|
9997
10002
|
},
|
|
9998
10003
|
// RFC 0010 "Native top-bar search" (SearchableConfig fields 1–5, 12–15). `placement` stays a free string.
|
|
@@ -10028,7 +10033,8 @@ var init_validator = __esm({
|
|
|
10028
10033
|
content: { $ref: "#/$defs/component" },
|
|
10029
10034
|
loadingPath: { type: "string" },
|
|
10030
10035
|
avatar: { $ref: "#/$defs/toolbarAvatar" },
|
|
10031
|
-
labelPath: { type: "string" }
|
|
10036
|
+
labelPath: { type: "string" },
|
|
10037
|
+
onLongPress: { $ref: "#/$defs/action" }
|
|
10032
10038
|
}
|
|
10033
10039
|
},
|
|
10034
10040
|
toolbarAvatar: {
|
|
@@ -13052,6 +13058,7 @@ __export(validate_descriptor_core_exports, {
|
|
|
13052
13058
|
validateAppServicesConfig: () => validateAppServicesConfig,
|
|
13053
13059
|
validateAppWebViewInstances: () => validateAppWebViewInstances,
|
|
13054
13060
|
validateScreenDescriptor: () => validateScreenDescriptor,
|
|
13061
|
+
validateTabBarVisibility: () => validateTabBarVisibility,
|
|
13055
13062
|
webViewEmbeddedIssues: () => webViewEmbeddedIssues,
|
|
13056
13063
|
workerSubtreeAllowed: () => workerSubtreeAllowed
|
|
13057
13064
|
});
|
|
@@ -14659,6 +14666,16 @@ function topBarFindings(descriptor) {
|
|
|
14659
14666
|
}
|
|
14660
14667
|
});
|
|
14661
14668
|
}
|
|
14669
|
+
const overSlots = legacy + trailingItems.length + (hasOverflow ? 1 : 0) > TOP_BAR_TRAILING_LIMIT;
|
|
14670
|
+
const movedByR2 = new Set(overSlots ? trailingItems.slice(Math.max(0, TOP_BAR_TRAILING_LIMIT - legacy - 1)) : []);
|
|
14671
|
+
items.forEach((i2, idx) => {
|
|
14672
|
+
if (!i2 || typeof i2 !== "object" || i2.onLongPress == null) return;
|
|
14673
|
+
if (i2.placement === "overflow" || movedByR2.has(i2)) {
|
|
14674
|
+
out2.push({ path: `topBar.items[${idx}].onLongPress`, message: `An item in More Actions (${i2.placement === "overflow" ? '`placement: "overflow"`' : "moved there because the bar has more than two trailing slots (R2)"}) has no long press: the menu row only taps, so \`onLongPress\` never fires. Move the action to its own menu row, or keep the item in a visible slot` });
|
|
14675
|
+
} else if (Array.isArray(i2.menu) && i2.menu.length > 0) {
|
|
14676
|
+
out2.push({ path: `topBar.items[${idx}].onLongPress`, message: "An item with a `menu` ignores `onLongPress`: the menu owns the press. Add the action to the menu, or remove the menu" });
|
|
14677
|
+
}
|
|
14678
|
+
});
|
|
14662
14679
|
const notHttps = (v2) => {
|
|
14663
14680
|
if (typeof v2 !== "string" || v2 === "") return false;
|
|
14664
14681
|
if (!/^https:\/\/[^/?#\s]/i.test(v2)) return true;
|
|
@@ -14679,6 +14696,59 @@ function topBarFindings(descriptor) {
|
|
|
14679
14696
|
}
|
|
14680
14697
|
return out2;
|
|
14681
14698
|
}
|
|
14699
|
+
function validateTabBarVisibility(screens, navigation) {
|
|
14700
|
+
const out2 = [];
|
|
14701
|
+
const items = navigation?.tabBar?.items;
|
|
14702
|
+
if (!Array.isArray(items)) return out2;
|
|
14703
|
+
const tabs = items.flatMap((item) => {
|
|
14704
|
+
const t2 = item;
|
|
14705
|
+
return t2 && typeof t2.screenId === "string" ? [{ id: typeof t2.id === "string" ? t2.id : t2.screenId, screenId: t2.screenId }] : [];
|
|
14706
|
+
});
|
|
14707
|
+
const hasBody = (block) => {
|
|
14708
|
+
const b2 = block;
|
|
14709
|
+
return !!b2 && (Array.isArray(b2.items) && b2.items.length > 0 || typeof b2.contentScreenId === "string" && b2.contentScreenId !== "");
|
|
14710
|
+
};
|
|
14711
|
+
const nav = navigation;
|
|
14712
|
+
const draws = (kind) => {
|
|
14713
|
+
if (kind === "drawer") return !hasBody(nav?.drawer);
|
|
14714
|
+
if (kind === "sidebar") return !hasBody(nav?.sidebar);
|
|
14715
|
+
return !(typeof kind === "string" && TAB_BAR_KINDS_WITHOUT_BOTTOM_TABS.has(kind));
|
|
14716
|
+
};
|
|
14717
|
+
const roots2 = /* @__PURE__ */ new Map();
|
|
14718
|
+
const addRoots = (surface, kind, destinations, screenIds) => {
|
|
14719
|
+
if (!draws(kind)) return;
|
|
14720
|
+
const wanted = Array.isArray(destinations) && destinations.length ? new Set(destinations.filter((d2) => typeof d2 === "string")) : null;
|
|
14721
|
+
const shown2 = wanted && tabs.some((t2) => wanted.has(t2.id)) ? tabs.filter((t2) => wanted.has(t2.id)) : tabs;
|
|
14722
|
+
const repoint = screenIds && typeof screenIds === "object" ? screenIds : {};
|
|
14723
|
+
for (const tab of shown2) {
|
|
14724
|
+
const root = typeof repoint[tab.id] === "string" && repoint[tab.id] ? repoint[tab.id] : tab.screenId;
|
|
14725
|
+
if (!roots2.has(root)) roots2.set(root, { tab: tab.id, surface });
|
|
14726
|
+
}
|
|
14727
|
+
};
|
|
14728
|
+
addRoots(null, navigation?.navKind);
|
|
14729
|
+
const surfaces = navigation?.surfaces;
|
|
14730
|
+
if (surfaces && typeof surfaces === "object" && !Array.isArray(surfaces)) {
|
|
14731
|
+
for (const [surface, entry] of Object.entries(surfaces)) {
|
|
14732
|
+
if (!entry || typeof entry !== "object") continue;
|
|
14733
|
+
const e2 = entry;
|
|
14734
|
+
addRoots(surface, typeof e2.navKind === "string" && e2.navKind ? e2.navKind : navigation?.navKind, e2.destinations, e2.screenIds);
|
|
14735
|
+
}
|
|
14736
|
+
}
|
|
14737
|
+
for (const { screenId, descriptor } of screens) {
|
|
14738
|
+
if (descriptor?.tabBarVisibility !== "hidden") continue;
|
|
14739
|
+
const root = roots2.get(screenId);
|
|
14740
|
+
if (!root) continue;
|
|
14741
|
+
const where = root.surface === null ? "" : ` on the "${root.surface}" surface`;
|
|
14742
|
+
out2.push({
|
|
14743
|
+
screenId,
|
|
14744
|
+
severity: "warning",
|
|
14745
|
+
pass: "top-bar",
|
|
14746
|
+
path: "tabBarVisibility",
|
|
14747
|
+
message: `"${screenId}" is the root of the "${root.tab}" tab${where} and sets \`tabBarVisibility: "hidden"\`, so the member has no way to switch tabs from it. Hide the tab bar only on screens pushed above a tab root`
|
|
14748
|
+
});
|
|
14749
|
+
}
|
|
14750
|
+
return out2;
|
|
14751
|
+
}
|
|
14682
14752
|
function buttonVariantFindings(descriptor) {
|
|
14683
14753
|
const out2 = [];
|
|
14684
14754
|
const visit = (v2, path2, atRoot) => {
|
|
@@ -15453,7 +15523,7 @@ function validateAppWebViewInstances(screens) {
|
|
|
15453
15523
|
const findings = webViewEmbeddedAppFindings(screens);
|
|
15454
15524
|
return webViewEmbeddedIssues(findings).map((issue2, i2) => ({ ...issue2, screenId: findings[i2].screenId }));
|
|
15455
15525
|
}
|
|
15456
|
-
var CRAWL_BLOCKING_PASSES, BOOT_EVAL_TIMEOUT_MS, BUNDLE_FILENAME, DRIFT_PROBES, DEVICE_NETWORK_WITHHELD, DEVICE_STRIPPED_HOST_GLOBALS, DEVICE_WITHHELD, DEVICE_PARITY_CANDIDATES, DEVICE_PARITY_WITHHELD, defaultEvaluator, bootEvaluator, actionEvaluator, NATIVE_PROP_ENUMS, KNOWN_PROPS, IN_ARRAY_BINDING_PROPS, SERVICE_SIGIL, INTEGER_PROPS, NATIVE_REQUIRED_PROPS, bareNestedClass, NATIVE_NESTED_CLASSES, NATIVE_MODIFIERS_CLASS, NATIVE_NESTED_SCALARS, NATIVE_DESCRIPTOR_CLASS, NATIVE_DESCRIPTOR_NESTED, NATIVE_NESTED_PROPS, LENIENT_TOP_BAR_BLOCKS, MODIFIER_KEYS, INTEGER_MODIFIERS, MODIFIER_KINDS, SCHEMA_SCORED_NODES, CORE_PACKAGES, LEGACY_UNSCORED_KEYS, DYNAMIC_PLACEHOLDER, LITERAL_ONLY_PROPS, SERVICE_ONLY_BINDING_PROPS, WHOLE_VALUE_BINDING, EMBEDDED_BINDING, OPTIONS_BINDING_PROPS, EDITOR_SERVICE_NAME, SHEET_PLACEMENTS, UNSAFE_TO_RECURSE_DEPTH, TOP_BAR_TRAILING_LIMIT, TOP_BAR_NON_TRAILING, BUTTON_STYLES, EMPTY_STATE_ACTION_STYLES, EMPTY_STATE_ACTION_SIZES;
|
|
15526
|
+
var CRAWL_BLOCKING_PASSES, BOOT_EVAL_TIMEOUT_MS, BUNDLE_FILENAME, DRIFT_PROBES, DEVICE_NETWORK_WITHHELD, DEVICE_STRIPPED_HOST_GLOBALS, DEVICE_WITHHELD, DEVICE_PARITY_CANDIDATES, DEVICE_PARITY_WITHHELD, defaultEvaluator, bootEvaluator, actionEvaluator, NATIVE_PROP_ENUMS, KNOWN_PROPS, IN_ARRAY_BINDING_PROPS, SERVICE_SIGIL, INTEGER_PROPS, NATIVE_REQUIRED_PROPS, bareNestedClass, NATIVE_NESTED_CLASSES, NATIVE_MODIFIERS_CLASS, NATIVE_NESTED_SCALARS, NATIVE_DESCRIPTOR_CLASS, NATIVE_DESCRIPTOR_NESTED, NATIVE_NESTED_PROPS, LENIENT_TOP_BAR_BLOCKS, MODIFIER_KEYS, INTEGER_MODIFIERS, MODIFIER_KINDS, SCHEMA_SCORED_NODES, CORE_PACKAGES, LEGACY_UNSCORED_KEYS, DYNAMIC_PLACEHOLDER, LITERAL_ONLY_PROPS, SERVICE_ONLY_BINDING_PROPS, WHOLE_VALUE_BINDING, EMBEDDED_BINDING, OPTIONS_BINDING_PROPS, EDITOR_SERVICE_NAME, SHEET_PLACEMENTS, UNSAFE_TO_RECURSE_DEPTH, TOP_BAR_TRAILING_LIMIT, TOP_BAR_NON_TRAILING, TAB_BAR_KINDS_WITHOUT_BOTTOM_TABS, BUTTON_STYLES, EMPTY_STATE_ACTION_STYLES, EMPTY_STATE_ACTION_SIZES;
|
|
15457
15527
|
var init_validate_descriptor_core = __esm({
|
|
15458
15528
|
"../../core/dev-server/src/validate-descriptor.core.ts"() {
|
|
15459
15529
|
init_validator();
|
|
@@ -16541,6 +16611,7 @@ var init_validate_descriptor_core = __esm({
|
|
|
16541
16611
|
UNSAFE_TO_RECURSE_DEPTH = 128;
|
|
16542
16612
|
TOP_BAR_TRAILING_LIMIT = 2;
|
|
16543
16613
|
TOP_BAR_NON_TRAILING = /* @__PURE__ */ new Set(["leading", "principal", "bottom", "keyboard", "overflow"]);
|
|
16614
|
+
TAB_BAR_KINDS_WITHOUT_BOTTOM_TABS = /* @__PURE__ */ new Set(["single", "drawer", "sidebar"]);
|
|
16544
16615
|
BUTTON_STYLES = /* @__PURE__ */ new Set(["filled", "tonal", "outlined", "text", "elevated", "bordered", "prominent", "plain", "glass", "primary", "secondary", "tertiary", "link", "destructive"]);
|
|
16545
16616
|
EMPTY_STATE_ACTION_STYLES = /* @__PURE__ */ new Set(["primary", "secondary", "plain"]);
|
|
16546
16617
|
EMPTY_STATE_ACTION_SIZES = /* @__PURE__ */ new Set(["sm", "md"]);
|
|
@@ -17692,6 +17763,7 @@ __export(validate_descriptor_exports, {
|
|
|
17692
17763
|
validateAppServicesConfig: () => validateAppServicesConfig,
|
|
17693
17764
|
validateAppWebViewInstances: () => validateAppWebViewInstances,
|
|
17694
17765
|
validateScreenDescriptor: () => validateScreenDescriptor,
|
|
17766
|
+
validateTabBarVisibility: () => validateTabBarVisibility,
|
|
17695
17767
|
webViewEmbeddedIssues: () => webViewEmbeddedIssues,
|
|
17696
17768
|
workerSubtreeAllowed: () => workerSubtreeAllowed
|
|
17697
17769
|
});
|
|
@@ -22176,7 +22248,6 @@ function resolveIdiom(tokens2, ctx = {}) {
|
|
|
22176
22248
|
var IDIOM_CONTEXTS, UNSAFE_KEYS;
|
|
22177
22249
|
var init_idiom = __esm({
|
|
22178
22250
|
"../../core/ts/src/idiom.ts"() {
|
|
22179
|
-
"use strict";
|
|
22180
22251
|
IDIOM_CONTEXTS = {
|
|
22181
22252
|
ios: { native: ["ios"] },
|
|
22182
22253
|
android: { native: ["material"] },
|
|
@@ -135132,6 +135203,7 @@ __export(build_exports2, {
|
|
|
135132
135203
|
isMonorepoCheckout: () => isMonorepoCheckout,
|
|
135133
135204
|
l10nLintOptions: () => l10nLintOptions,
|
|
135134
135205
|
linkableScreenIdsFrom: () => linkableScreenIdsFrom,
|
|
135206
|
+
lintAppTabBarVisibility: () => lintAppTabBarVisibility,
|
|
135135
135207
|
lintAppWebViewInstances: () => lintAppWebViewInstances,
|
|
135136
135208
|
listBuildableApps: () => listBuildableApps,
|
|
135137
135209
|
liveRenderServices: () => liveRenderServices,
|
|
@@ -135171,7 +135243,13 @@ function publishableFontFaces(fontFaces) {
|
|
|
135171
135243
|
return kept.length > 0 ? Object.fromEntries(kept) : null;
|
|
135172
135244
|
}
|
|
135173
135245
|
function lintAppWebViewInstances(lint, screens) {
|
|
135174
|
-
|
|
135246
|
+
attachAppIssues(lint, validateAppWebViewInstances(screens));
|
|
135247
|
+
}
|
|
135248
|
+
function lintAppTabBarVisibility(lint, screens, navigation) {
|
|
135249
|
+
attachAppIssues(lint, validateTabBarVisibility(screens, navigation));
|
|
135250
|
+
}
|
|
135251
|
+
function attachAppIssues(lint, issues) {
|
|
135252
|
+
for (const { screenId, ...issue2 } of issues) {
|
|
135175
135253
|
const report3 = lint.find((l2) => l2.screenId === screenId);
|
|
135176
135254
|
if (!report3) continue;
|
|
135177
135255
|
report3.issues.push(issue2);
|
|
@@ -136125,6 +136203,7 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
|
|
|
136125
136203
|
}
|
|
136126
136204
|
}
|
|
136127
136205
|
if (collect2?.lint) lintAppWebViewInstances(lint, lintScreens);
|
|
136206
|
+
if (collect2?.lint) lintAppTabBarVisibility(lint, lintScreens, preloaded.meta);
|
|
136128
136207
|
if (collect2?.lint) {
|
|
136129
136208
|
const issues = validateAppServicesConfig({
|
|
136130
136209
|
config: preloaded.module.config,
|
|
@@ -154691,6 +154770,7 @@ __export(nav_lint_exports, {
|
|
|
154691
154770
|
MISPLACED_TOP_LEVEL_KEYS: () => MISPLACED_TOP_LEVEL_KEYS,
|
|
154692
154771
|
NAVIGATION_KEYS: () => NAVIGATION_KEYS,
|
|
154693
154772
|
NAV_KINDS: () => NAV_KINDS,
|
|
154773
|
+
SCREEN_ONLY_TOP_BAR_KEYS: () => SCREEN_ONLY_TOP_BAR_KEYS,
|
|
154694
154774
|
SERVED_ONLY_NAV_KEYS: () => SERVED_ONLY_NAV_KEYS,
|
|
154695
154775
|
navIssues: () => navIssues,
|
|
154696
154776
|
navSharedIdErrors: () => navSharedIdErrors,
|
|
@@ -154771,6 +154851,17 @@ async function navIssues(dir, strict) {
|
|
|
154771
154851
|
error("nav-path-malformed", `navigation.${message}`);
|
|
154772
154852
|
}
|
|
154773
154853
|
for (const message of navSharedIdErrors(nav)) error("nav-row-id-shadows-tab", `navigation.${message}`);
|
|
154854
|
+
const topBarDefault = nav.topBarDefault;
|
|
154855
|
+
if (isPlainObject2(topBarDefault)) {
|
|
154856
|
+
for (const key3 of SCREEN_ONLY_TOP_BAR_KEYS) {
|
|
154857
|
+
const value = topBarDefault[key3];
|
|
154858
|
+
if (value === void 0 || value === null || value === "" || key3 === "scrollBehavior" && value === "pinned") continue;
|
|
154859
|
+
warn3(
|
|
154860
|
+
"nav-topbar-default-screen-field",
|
|
154861
|
+
key3 === "scrollBehavior" ? `navigation.topBarDefault.scrollBehavior ${JSON.stringify(value)} makes the bar of EVERY screen that sets no \`topBar\` hide on scroll, forms and presented screens included. Set \`topBar.scrollBehavior\` on the screens that scroll long content.` : `navigation.topBarDefault.${key3} is a binding to one screen's state: the default is copied onto every screen that sets no \`topBar\`, and each would resolve it against its own worker. Set \`topBar.${key3}\` on the screen that owns the value.`
|
|
154862
|
+
);
|
|
154863
|
+
}
|
|
154864
|
+
}
|
|
154774
154865
|
const navKind = nav.navKind;
|
|
154775
154866
|
const effectiveBottomTabs = navKind === void 0 || navKind === "bottomTabs" || typeof navKind !== "string" || !NAV_KINDS.has(navKind);
|
|
154776
154867
|
const declaresOtherChrome = itemCount(nav.drawer) > 0 || itemCount(nav.sidebar) > 0;
|
|
@@ -154902,7 +154993,7 @@ function navSharedIdErrors(nav) {
|
|
|
154902
154993
|
}
|
|
154903
154994
|
return out2;
|
|
154904
154995
|
}
|
|
154905
|
-
var NAVIGATION_KEYS, NAV_KINDS, ITEMS_BLOCKS, SERVED_ONLY_NAV_KEYS, MISPLACED_TOP_LEVEL_KEYS, isPlainObject2, itemCount;
|
|
154996
|
+
var NAVIGATION_KEYS, NAV_KINDS, ITEMS_BLOCKS, SERVED_ONLY_NAV_KEYS, MISPLACED_TOP_LEVEL_KEYS, SCREEN_ONLY_TOP_BAR_KEYS, isPlainObject2, itemCount;
|
|
154906
154997
|
var init_nav_lint = __esm({
|
|
154907
154998
|
"src/nav-lint.ts"() {
|
|
154908
154999
|
init_app_config_loader();
|
|
@@ -154955,6 +155046,7 @@ var init_nav_lint = __esm({
|
|
|
154955
155046
|
"deepLinkPatterns",
|
|
154956
155047
|
"linkableScreens"
|
|
154957
155048
|
];
|
|
155049
|
+
SCREEN_ONLY_TOP_BAR_KEYS = ["scrollBehavior", "dirtyPath", "visibilityPath"];
|
|
154958
155050
|
isPlainObject2 = (v2) => typeof v2 === "object" && v2 !== null && !Array.isArray(v2);
|
|
154959
155051
|
itemCount = (v2) => isPlainObject2(v2) && Array.isArray(v2.items) ? v2.items.length : 0;
|
|
154960
155052
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/himalaya-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1514.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": [
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"artifactId": "himalaya-cli"
|
|
72
72
|
}
|
|
73
73
|
},
|
|
74
|
-
"falconPackageHash": "
|
|
74
|
+
"falconPackageHash": "b2ddd1eadb8b57663205c338a12cb5a71ac3af7098c1401e8a54ebb2"
|
|
75
75
|
}
|