@wix/himalaya-cli 0.1033.0 → 0.1034.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/cli.mjs +0 -2
- package/package.json +2 -2
- package/templates/beauty-salon/dev/index.ts +398 -1
- package/templates/beauty-salon/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/beauty-salon/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/beauty-salon/tier5-src/_shared/empty-flags.ts +33 -0
- package/templates/beauty-salon/tier5-src/himi-store-saved/index.ts +3 -2
- package/templates/beauty-salon/tier5-src/wix-spaces-collections/index.ts +3 -2
- package/templates/beauty-salon/tier5-src/wix-spaces-my-subscriptions/index.ts +11 -2
- package/templates/beauty-salon/tier5-src/wix-spaces-whats-new/index.ts +3 -2
- package/templates/beauty-salon-owner/dev/index.ts +1216 -0
- package/templates/beauty-salon-owner/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/beauty-salon-owner/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/branded-lite/dev/index.ts +2239 -343
- package/templates/branded-lite/tier5-src/_shared/branded-load-state.ts +106 -0
- package/templates/branded-lite/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/branded-lite/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/branded-lite/tier5-src/_shared/empty-flags.ts +33 -0
- package/templates/branded-lite/tier5-src/himi-branded-lite-badges/index.ts +20 -16
- package/templates/branded-lite/tier5-src/himi-branded-lite-coupons/index.ts +20 -20
- package/templates/branded-lite/tier5-src/himi-branded-lite-donations/index.ts +20 -16
- package/templates/branded-lite/tier5-src/himi-branded-lite-forms/index.ts +23 -31
- package/templates/branded-lite/tier5-src/himi-branded-lite-galleries/index.ts +19 -14
- package/templates/branded-lite/tier5-src/himi-branded-lite-giftcards/index.ts +20 -16
- package/templates/branded-lite/tier5-src/himi-branded-lite-inbox/index.ts +20 -15
- package/templates/branded-lite/tier5-src/himi-branded-lite-invoices/index.ts +20 -16
- package/templates/branded-lite/tier5-src/himi-branded-lite-loyalty/index.ts +20 -17
- package/templates/branded-lite/tier5-src/himi-branded-lite-notifications/index.ts +20 -18
- package/templates/branded-lite/tier5-src/himi-branded-lite-notifsettings/index.ts +23 -19
- package/templates/branded-lite/tier5-src/himi-branded-lite-podcasts/index.ts +1 -1
- package/templates/branded-lite/tier5-src/himi-branded-lite-reservations/index.ts +24 -20
- package/templates/branded-lite/tier5-src/himi-branded-lite-reviews/index.ts +20 -17
- package/templates/branded-lite/tier5-src/himi-branded-lite-videos/index.ts +19 -15
- package/templates/branded-lite/tier5-src/himi-store-saved/index.ts +3 -2
- package/templates/branded-lite/tier5-src/wix-spaces-collections/index.ts +3 -2
- package/templates/branded-lite/tier5-src/wix-spaces-forum/index.ts +3 -2
- package/templates/branded-lite/tier5-src/wix-spaces-members/index.ts +19 -6
- package/templates/branded-lite/tier5-src/wix-spaces-my-subscriptions/index.ts +11 -2
- package/templates/branded-lite/tier5-src/wix-spaces-new-message/index.ts +3 -2
- package/templates/branded-lite/tier5-src/wix-spaces-whats-new/index.ts +3 -2
- package/templates/community-club/dev/index.ts +283 -2
- package/templates/community-club/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/community-club/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/community-club/tier5-src/_shared/empty-flags.ts +33 -0
- package/templates/community-club/tier5-src/wix-spaces-whats-new/index.ts +3 -2
- package/templates/community-club-owner/dev/index.ts +1216 -0
- package/templates/community-club-owner/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/community-club-owner/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/events-meetups/dev/index.ts +197 -1
- package/templates/events-meetups/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/events-meetups/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/events-meetups/tier5-src/_shared/empty-flags.ts +33 -0
- package/templates/events-meetups/tier5-src/wix-spaces-whats-new/index.ts +3 -2
- package/templates/events-meetups-owner/dev/index.ts +1088 -0
- package/templates/events-meetups-owner/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/events-meetups-owner/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/gym-fitness/dev/index.ts +462 -1
- package/templates/gym-fitness/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/gym-fitness/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/gym-fitness/tier5-src/_shared/empty-flags.ts +33 -0
- package/templates/gym-fitness/tier5-src/himi-store-saved/index.ts +3 -2
- package/templates/gym-fitness/tier5-src/wix-spaces-collections/index.ts +3 -2
- package/templates/gym-fitness/tier5-src/wix-spaces-my-subscriptions/index.ts +11 -2
- package/templates/gym-fitness/tier5-src/wix-spaces-whats-new/index.ts +3 -2
- package/templates/gym-fitness-owner/dev/index.ts +1280 -0
- package/templates/gym-fitness-owner/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/gym-fitness-owner/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/nonprofit-cause/dev/index.ts +264 -1
- package/templates/nonprofit-cause/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/nonprofit-cause/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/nonprofit-cause/tier5-src/_shared/empty-flags.ts +33 -0
- package/templates/nonprofit-cause/tier5-src/wix-spaces-my-subscriptions/index.ts +11 -2
- package/templates/nonprofit-cause/tier5-src/wix-spaces-whats-new/index.ts +3 -2
- package/templates/nonprofit-cause-owner/dev/index.ts +1152 -0
- package/templates/nonprofit-cause-owner/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/nonprofit-cause-owner/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/owner-lite/dev/index.ts +1280 -0
- package/templates/owner-lite/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/owner-lite/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/podcast-creator/dev/index.ts +286 -23
- package/templates/podcast-creator/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/podcast-creator/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/podcast-creator/tier5-src/_shared/empty-flags.ts +33 -0
- package/templates/podcast-creator/tier5-src/himi-branded-lite-podcasts/index.ts +1 -1
- package/templates/podcast-creator/tier5-src/wix-spaces-my-subscriptions/index.ts +11 -2
- package/templates/podcast-creator/tier5-src/wix-spaces-whats-new/index.ts +3 -2
- package/templates/podcast-creator-owner/dev/index.ts +1216 -0
- package/templates/podcast-creator-owner/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/podcast-creator-owner/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/portfolio-creative/dev/index.ts +353 -23
- package/templates/portfolio-creative/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/portfolio-creative/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/portfolio-creative/tier5-src/_shared/empty-flags.ts +33 -0
- package/templates/portfolio-creative/tier5-src/himi-store-saved/index.ts +3 -2
- package/templates/portfolio-creative/tier5-src/wix-spaces-collections/index.ts +3 -2
- package/templates/portfolio-creative/tier5-src/wix-spaces-whats-new/index.ts +3 -2
- package/templates/portfolio-creative-owner/dev/index.ts +1216 -0
- package/templates/portfolio-creative-owner/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/portfolio-creative-owner/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/restaurant/dev/index.ts +197 -1
- package/templates/restaurant/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/restaurant/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/restaurant/tier5-src/_shared/empty-flags.ts +33 -0
- package/templates/restaurant/tier5-src/wix-spaces-whats-new/index.ts +3 -2
- package/templates/restaurant-owner/dev/index.ts +1280 -0
- package/templates/restaurant-owner/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/restaurant-owner/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/retail-store/dev/index.ts +203 -1
- package/templates/retail-store/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/retail-store/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/retail-store/tier5-src/_shared/empty-flags.ts +33 -0
- package/templates/retail-store/tier5-src/himi-store-saved/index.ts +3 -2
- package/templates/retail-store/tier5-src/wix-spaces-collections/index.ts +3 -2
- package/templates/retail-store/tier5-src/wix-spaces-whats-new/index.ts +3 -2
- package/templates/retail-store-owner/dev/index.ts +1152 -0
- package/templates/retail-store-owner/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/retail-store-owner/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/yoga-studio/dev/index.ts +392 -1
- package/templates/yoga-studio/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/yoga-studio/tier5-src/_shared/collection-service.ts +36 -5
- package/templates/yoga-studio/tier5-src/_shared/empty-flags.ts +33 -0
- package/templates/yoga-studio/tier5-src/wix-spaces-my-subscriptions/index.ts +11 -2
- package/templates/yoga-studio/tier5-src/wix-spaces-whats-new/index.ts +3 -2
- package/templates/yoga-studio-owner/dev/index.ts +1152 -0
- package/templates/yoga-studio-owner/tier5-src/_shared/collection-contract.ts +4 -1
- package/templates/yoga-studio-owner/tier5-src/_shared/collection-service.ts +36 -5
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Empty-collection flags for descriptors.
|
|
2
|
+
//
|
|
3
|
+
// A bound Grid/LazyList with zero rows still renders a zero-height box, and a stack
|
|
4
|
+
// allocates its `spacing` between CHILDREN, not between painted children — so every
|
|
5
|
+
// empty list left a full gap of blank on the screen (the measure pass's `dead-gap`, on
|
|
6
|
+
// iOS and Android as much as on web). `hiddenWhen` hides on a TRUE scalar only, and an
|
|
7
|
+
// empty array is not one, so a descriptor cannot gate a list on its own rows.
|
|
8
|
+
//
|
|
9
|
+
// `withEmptyFlags(def, { rows: "noRows" })` derives `noRows = rows is empty` into the
|
|
10
|
+
// initial state and after EVERY action (sync or async), so a builder can write
|
|
11
|
+
// `hiddenWhen(grid(...), "$service:svc.noRows")` without each reducer remembering to.
|
|
12
|
+
type State = Record<string, unknown>;
|
|
13
|
+
type Action = (s: State, ...args: unknown[]) => unknown;
|
|
14
|
+
|
|
15
|
+
export function withEmptyFlags<D extends { state: object; actions?: object }>(def: D, flags: Record<string, string>): D {
|
|
16
|
+
const derive = <T>(s: T): T => {
|
|
17
|
+
if (!s || typeof s !== "object") return s;
|
|
18
|
+
const out = { ...(s as State) };
|
|
19
|
+
for (const [rows, flag] of Object.entries(flags)) {
|
|
20
|
+
const v = out[rows];
|
|
21
|
+
out[flag] = !Array.isArray(v) || v.length === 0;
|
|
22
|
+
}
|
|
23
|
+
return out as T;
|
|
24
|
+
};
|
|
25
|
+
const actions: Record<string, Action> = {};
|
|
26
|
+
for (const [name, action] of Object.entries((def.actions ?? {}) as Record<string, Action>)) {
|
|
27
|
+
actions[name] = (s, ...args) => {
|
|
28
|
+
const r = action(s, ...args);
|
|
29
|
+
return r && typeof (r as Promise<unknown>).then === "function" ? (r as Promise<unknown>).then(derive) : derive(r);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return { ...def, state: derive(def.state), actions } as D;
|
|
33
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defineService } from "@himalaya/state";
|
|
2
|
+
import { withEmptyFlags } from "../_shared/empty-flags.js";
|
|
2
3
|
import { readSavedProducts, removeSavedProduct, type SavedProduct } from "../_shared/himi-store-saved.js";
|
|
3
4
|
import { stashCopy, copyParam } from "../_shared/himi-copy.js";
|
|
4
5
|
|
|
@@ -25,7 +26,7 @@ function failed(s: S): S {
|
|
|
25
26
|
const svc = defineService<S, {
|
|
26
27
|
load: (s: S, arg?: unknown) => S;
|
|
27
28
|
remove: (s: S, arg?: unknown) => S;
|
|
28
|
-
}>("himiStoreSaved", {
|
|
29
|
+
}>("himiStoreSaved", withEmptyFlags({
|
|
29
30
|
state: shape({ status: "loading", rows: [], error: "" }),
|
|
30
31
|
actions: {
|
|
31
32
|
load: (s, arg) => {
|
|
@@ -41,5 +42,5 @@ const svc = defineService<S, {
|
|
|
41
42
|
} catch { return failed(s); }
|
|
42
43
|
},
|
|
43
44
|
},
|
|
44
|
-
});
|
|
45
|
+
}, { rows: "noRows" }));
|
|
45
46
|
export { svc };
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Prefer Catalog V3 Categories API (`queryStoreCategories`); V1 `queryCollections`
|
|
3
3
|
// returns HTTP 428 on modern CATALOG_V3 sites (docs/wix-authentication.md).
|
|
4
4
|
import { defineService } from "@himalaya/state";
|
|
5
|
+
import { withEmptyFlags } from "../_shared/empty-flags.js";
|
|
5
6
|
import {
|
|
6
7
|
categoryCount,
|
|
7
8
|
queryCollections,
|
|
@@ -71,7 +72,7 @@ async function loadCollections(): Promise<Loaded> {
|
|
|
71
72
|
}
|
|
72
73
|
}
|
|
73
74
|
|
|
74
|
-
const svc = defineService<S, { load: (s: S) => Promise<S> }>("spacesCollections", {
|
|
75
|
+
const svc = defineService<S, { load: (s: S) => Promise<S> }>("spacesCollections", withEmptyFlags({
|
|
75
76
|
state: { status: "loading", collections: [], emptyText: "", error: "" },
|
|
76
77
|
actions: {
|
|
77
78
|
load: async () => {
|
|
@@ -93,6 +94,6 @@ const svc = defineService<S, { load: (s: S) => Promise<S> }>("spacesCollections"
|
|
|
93
94
|
};
|
|
94
95
|
},
|
|
95
96
|
},
|
|
96
|
-
});
|
|
97
|
+
}, { collections: "noCollections" }));
|
|
97
98
|
svc.load();
|
|
98
99
|
export { svc };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Tier-5 bundle: Wix Spaces clone — My Subscriptions / plan orders (site-scoped).
|
|
2
2
|
import { defineService } from "@himalaya/state";
|
|
3
|
+
import { withEmptyFlags } from "../_shared/empty-flags.js";
|
|
3
4
|
import { dispatch } from "@himalaya/dispatch";
|
|
4
5
|
import { listPlanOrders, type WixPlanOrder } from "@himalaya/wix-pricing-plans";
|
|
5
6
|
|
|
@@ -21,6 +22,10 @@ const EMPTY_MEMBER = "No subscriptions yet";
|
|
|
21
22
|
const EMPTY_GUEST = "Sign in from Account to see subscriptions you’ve joined — we don’t invent sample memberships.";
|
|
22
23
|
const EMPTY_FORBIDDEN = "No subscriptions for this member yet.";
|
|
23
24
|
|
|
25
|
+
/** The signed-in member's email, or "" for anyone else. A visitor's identity is
|
|
26
|
+
* `{ email: "" }` and a failed lookup proves nothing, so both read as "no member": the
|
|
27
|
+
* plan-orders endpoint is not member-filtered, and calling it for a visitor would list
|
|
28
|
+
* orders that are not theirs. Fail closed. */
|
|
24
29
|
async function sessionEmail(): Promise<string> {
|
|
25
30
|
try {
|
|
26
31
|
const identity = await dispatch("himi.wix.memberIdentity") as unknown;
|
|
@@ -38,12 +43,16 @@ function looksForbidden(err: unknown): boolean {
|
|
|
38
43
|
return /403|FORBIDDEN|permission|denied|UNAUTHORIZED|401/i.test(msg);
|
|
39
44
|
}
|
|
40
45
|
|
|
41
|
-
const svc = defineService<S, { load: (s: S) => Promise<S> }>("spacesMySubscriptions", {
|
|
46
|
+
const svc = defineService<S, { load: (s: S) => Promise<S> }>("spacesMySubscriptions", withEmptyFlags({
|
|
42
47
|
state: { status: "loading", orders: [], emptyText: "", hideAccountCta: false },
|
|
43
48
|
actions: {
|
|
44
49
|
load: async () => {
|
|
45
50
|
const email = await sessionEmail();
|
|
46
51
|
const hideAccountCta = Boolean(email);
|
|
52
|
+
// plan orders are a MEMBER's own. With no signed-in member there is no
|
|
53
|
+
// "my" to list, whatever the endpoint answers (a dev mock or a cached session can
|
|
54
|
+
// answer it): a visitor must never see a subscription as theirs.
|
|
55
|
+
if (!email) return { status: "ready", orders: [], emptyText: EMPTY_GUEST, hideAccountCta: false };
|
|
47
56
|
try {
|
|
48
57
|
const r = await listPlanOrders();
|
|
49
58
|
const orders = (((r as unknown as { orders?: WixPlanOrder[] }).orders) ?? []).map(norm);
|
|
@@ -68,6 +77,6 @@ const svc = defineService<S, { load: (s: S) => Promise<S> }>("spacesMySubscripti
|
|
|
68
77
|
}
|
|
69
78
|
},
|
|
70
79
|
},
|
|
71
|
-
});
|
|
80
|
+
}, { orders: "noOrders" }));
|
|
72
81
|
svc.load();
|
|
73
82
|
export { svc };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Tier-5 bundle: Wix Spaces clone — What's New (ON-DEVICE, account-level).
|
|
2
2
|
import { defineService } from "@himalaya/state";
|
|
3
|
+
import { withEmptyFlags } from "../_shared/empty-flags.js";
|
|
3
4
|
import { listAnnouncements, type WixAnnouncement } from "@himalaya/wix-new-releases";
|
|
4
5
|
|
|
5
6
|
interface Row { id: string; name: string; subtitle: string }
|
|
@@ -10,7 +11,7 @@ function norm(a: WixAnnouncement, i: number): Row {
|
|
|
10
11
|
return { id: aa.id || `a${i}`, name: aa.title || "Announcement", subtitle: aa.description || aa.bodyText || "" };
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
const svc = defineService<S, { load: (s: S) => Promise<S> }>("spacesWhatsNew", {
|
|
14
|
+
const svc = defineService<S, { load: (s: S) => Promise<S> }>("spacesWhatsNew", withEmptyFlags({
|
|
14
15
|
state: { status: "loading", items: [], emptyText: "" },
|
|
15
16
|
actions: {
|
|
16
17
|
load: async (s) => {
|
|
@@ -21,6 +22,6 @@ const svc = defineService<S, { load: (s: S) => Promise<S> }>("spacesWhatsNew", {
|
|
|
21
22
|
} catch { return { ...s, status: "ready", items: [], emptyText: "Nothing new right now" }; }
|
|
22
23
|
},
|
|
23
24
|
},
|
|
24
|
-
});
|
|
25
|
+
}, { items: "noItems" }));
|
|
25
26
|
svc.load();
|
|
26
27
|
export { svc };
|