@wix/himalaya-cli 0.1525.0 → 0.1527.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.
Files changed (177) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/builder.d.ts +14 -0
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/state/src/connectivity.d.ts +5 -0
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/state/src/index.d.ts +1 -0
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +22 -0
  5. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/worker-subtree-safe-types.generated.d.ts +4 -0
  6. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/core.mjs +7 -0
  7. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdui.mjs +13 -0
  8. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/state.mjs +14 -0
  9. package/dist/cli.mjs +157 -40
  10. package/dist/preview-assets.generated.bin +0 -0
  11. package/guides/designing-himi-screens.md +43 -18
  12. package/guides/himi-test.md +3 -3
  13. package/guides/recipe-dynamic-list.md +7 -7
  14. package/guides/recipe-four-state.md +47 -41
  15. package/guides/recipe-search.md +1 -1
  16. package/package.json +2 -2
  17. package/templates/beauty-salon/dev/index.ts +1943 -646
  18. package/templates/beauty-salon/tier5-src/_shared/collection-service.ts +5 -1
  19. package/templates/beauty-salon/tier5-src/_shared/online-actions.ts +76 -0
  20. package/templates/beauty-salon/tier5-src/himi-booking-bookings/index.ts +1 -0
  21. package/templates/beauty-salon/tier5-src/himi-booking-time/index.ts +803 -284
  22. package/templates/beauty-salon/tier5-src/himi-branded-lite-address/index.ts +3 -1
  23. package/templates/beauty-salon/tier5-src/himi-branded-lite-addresses/index.ts +3 -1
  24. package/templates/beauty-salon/tier5-src/himi-branded-lite-agenda/index.ts +9 -1
  25. package/templates/beauty-salon/tier5-src/himi-branded-lite-cart/index.ts +3 -0
  26. package/templates/beauty-salon/tier5-src/himi-branded-lite-order/index.ts +3 -1
  27. package/templates/beauty-salon/tier5-src/himi-branded-lite-place-summary/index.ts +12 -1
  28. package/templates/beauty-salon/tier5-src/himi-branded-lite-plans/index.ts +13 -1
  29. package/templates/beauty-salon/tier5-src/himi-branded-lite-wallet/index.ts +3 -1
  30. package/templates/beauty-salon/tier5-src/himi-store-account/index.ts +69 -10
  31. package/templates/beauty-salon/tier5-src/himi-store-product/index.ts +10 -4
  32. package/templates/beauty-salon-owner/tier5-src/_shared/collection-service.ts +5 -1
  33. package/templates/beauty-salon-owner/tier5-src/_shared/online-actions.ts +76 -0
  34. package/templates/branded-lite/dev/index.ts +2404 -1020
  35. package/templates/branded-lite/tier5-src/_shared/collection-service.ts +5 -1
  36. package/templates/branded-lite/tier5-src/_shared/online-actions.ts +76 -0
  37. package/templates/branded-lite/tier5-src/business-chat/index.ts +4 -0
  38. package/templates/branded-lite/tier5-src/himi-booking-bookings/index.ts +1 -0
  39. package/templates/branded-lite/tier5-src/himi-booking-time/index.ts +803 -284
  40. package/templates/branded-lite/tier5-src/himi-branded-lite-address/index.ts +3 -1
  41. package/templates/branded-lite/tier5-src/himi-branded-lite-addresses/index.ts +3 -1
  42. package/templates/branded-lite/tier5-src/himi-branded-lite-agenda/index.ts +9 -1
  43. package/templates/branded-lite/tier5-src/himi-branded-lite-cart/index.ts +3 -0
  44. package/templates/branded-lite/tier5-src/himi-branded-lite-feed/index.ts +3 -1
  45. package/templates/branded-lite/tier5-src/himi-branded-lite-group/index.ts +3 -1
  46. package/templates/branded-lite/tier5-src/himi-branded-lite-notifications/index.ts +6 -4
  47. package/templates/branded-lite/tier5-src/himi-branded-lite-notifsettings/index.ts +6 -4
  48. package/templates/branded-lite/tier5-src/himi-branded-lite-order/index.ts +3 -1
  49. package/templates/branded-lite/tier5-src/himi-branded-lite-place-summary/index.ts +12 -1
  50. package/templates/branded-lite/tier5-src/himi-branded-lite-plans/index.ts +13 -1
  51. package/templates/branded-lite/tier5-src/himi-branded-lite-program/index.ts +3 -1
  52. package/templates/branded-lite/tier5-src/himi-branded-lite-reservations/index.ts +6 -4
  53. package/templates/branded-lite/tier5-src/himi-branded-lite-reserve/index.ts +3 -1
  54. package/templates/branded-lite/tier5-src/himi-branded-lite-wallet/index.ts +3 -1
  55. package/templates/branded-lite/tier5-src/himi-events-detail/index.ts +8 -1
  56. package/templates/branded-lite/tier5-src/himi-events-rsvp/index.ts +7 -4
  57. package/templates/branded-lite/tier5-src/himi-store-account/index.ts +69 -10
  58. package/templates/branded-lite/tier5-src/himi-store-product/index.ts +10 -4
  59. package/templates/community-club/dev/index.ts +40 -21
  60. package/templates/community-club/tier5-src/_shared/collection-service.ts +5 -1
  61. package/templates/community-club/tier5-src/_shared/online-actions.ts +76 -0
  62. package/templates/community-club/tier5-src/himi-branded-lite-feed/index.ts +3 -1
  63. package/templates/community-club/tier5-src/himi-branded-lite-group/index.ts +3 -1
  64. package/templates/community-club/tier5-src/himi-events-detail/index.ts +8 -1
  65. package/templates/community-club/tier5-src/himi-events-rsvp/index.ts +7 -4
  66. package/templates/community-club/tier5-src/himi-store-account/index.ts +69 -10
  67. package/templates/community-club-owner/tier5-src/_shared/collection-service.ts +5 -1
  68. package/templates/community-club-owner/tier5-src/_shared/online-actions.ts +76 -0
  69. package/templates/events-meetups/dev/index.ts +36 -19
  70. package/templates/events-meetups/tier5-src/_shared/collection-service.ts +5 -1
  71. package/templates/events-meetups/tier5-src/_shared/online-actions.ts +76 -0
  72. package/templates/events-meetups/tier5-src/himi-branded-lite-feed/index.ts +3 -1
  73. package/templates/events-meetups/tier5-src/himi-branded-lite-group/index.ts +3 -1
  74. package/templates/events-meetups/tier5-src/himi-events-detail/index.ts +8 -1
  75. package/templates/events-meetups/tier5-src/himi-events-rsvp/index.ts +7 -4
  76. package/templates/events-meetups/tier5-src/himi-store-account/index.ts +69 -10
  77. package/templates/events-meetups-owner/tier5-src/_shared/collection-service.ts +5 -1
  78. package/templates/events-meetups-owner/tier5-src/_shared/online-actions.ts +76 -0
  79. package/templates/gym-fitness/dev/index.ts +1944 -645
  80. package/templates/gym-fitness/tier5-src/_shared/collection-service.ts +5 -1
  81. package/templates/gym-fitness/tier5-src/_shared/online-actions.ts +76 -0
  82. package/templates/gym-fitness/tier5-src/himi-booking-bookings/index.ts +1 -0
  83. package/templates/gym-fitness/tier5-src/himi-booking-time/index.ts +803 -284
  84. package/templates/gym-fitness/tier5-src/himi-branded-lite-address/index.ts +3 -1
  85. package/templates/gym-fitness/tier5-src/himi-branded-lite-addresses/index.ts +3 -1
  86. package/templates/gym-fitness/tier5-src/himi-branded-lite-agenda/index.ts +9 -1
  87. package/templates/gym-fitness/tier5-src/himi-branded-lite-cart/index.ts +3 -0
  88. package/templates/gym-fitness/tier5-src/himi-branded-lite-order/index.ts +3 -1
  89. package/templates/gym-fitness/tier5-src/himi-branded-lite-place-summary/index.ts +12 -1
  90. package/templates/gym-fitness/tier5-src/himi-branded-lite-plans/index.ts +13 -1
  91. package/templates/gym-fitness/tier5-src/himi-branded-lite-wallet/index.ts +3 -1
  92. package/templates/gym-fitness/tier5-src/himi-events-detail/index.ts +8 -1
  93. package/templates/gym-fitness/tier5-src/himi-events-rsvp/index.ts +7 -4
  94. package/templates/gym-fitness/tier5-src/himi-store-account/index.ts +69 -10
  95. package/templates/gym-fitness/tier5-src/himi-store-product/index.ts +10 -4
  96. package/templates/gym-fitness-owner/tier5-src/_shared/collection-service.ts +5 -1
  97. package/templates/gym-fitness-owner/tier5-src/_shared/online-actions.ts +76 -0
  98. package/templates/nonprofit-cause/dev/index.ts +47 -29
  99. package/templates/nonprofit-cause/tier5-src/_shared/collection-service.ts +5 -1
  100. package/templates/nonprofit-cause/tier5-src/_shared/online-actions.ts +76 -0
  101. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-feed/index.ts +3 -1
  102. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-group/index.ts +3 -1
  103. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-place-summary/index.ts +12 -1
  104. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-plans/index.ts +13 -1
  105. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-wallet/index.ts +3 -1
  106. package/templates/nonprofit-cause/tier5-src/himi-events-detail/index.ts +8 -1
  107. package/templates/nonprofit-cause/tier5-src/himi-events-rsvp/index.ts +7 -4
  108. package/templates/nonprofit-cause/tier5-src/himi-store-account/index.ts +69 -10
  109. package/templates/nonprofit-cause-owner/tier5-src/_shared/collection-service.ts +5 -1
  110. package/templates/nonprofit-cause-owner/tier5-src/_shared/online-actions.ts +76 -0
  111. package/templates/owner-lite/tier5-src/_shared/collection-service.ts +5 -1
  112. package/templates/owner-lite/tier5-src/_shared/online-actions.ts +76 -0
  113. package/templates/podcast-creator/dev/index.ts +47 -29
  114. package/templates/podcast-creator/tier5-src/_shared/collection-service.ts +5 -1
  115. package/templates/podcast-creator/tier5-src/_shared/online-actions.ts +76 -0
  116. package/templates/podcast-creator/tier5-src/himi-branded-lite-feed/index.ts +3 -1
  117. package/templates/podcast-creator/tier5-src/himi-branded-lite-place-summary/index.ts +12 -1
  118. package/templates/podcast-creator/tier5-src/himi-branded-lite-plans/index.ts +13 -1
  119. package/templates/podcast-creator/tier5-src/himi-branded-lite-wallet/index.ts +3 -1
  120. package/templates/podcast-creator/tier5-src/himi-events-detail/index.ts +8 -1
  121. package/templates/podcast-creator/tier5-src/himi-events-rsvp/index.ts +7 -4
  122. package/templates/podcast-creator/tier5-src/himi-store-account/index.ts +69 -10
  123. package/templates/podcast-creator-owner/tier5-src/_shared/collection-service.ts +5 -1
  124. package/templates/podcast-creator-owner/tier5-src/_shared/online-actions.ts +76 -0
  125. package/templates/portfolio-creative/dev/index.ts +52 -27
  126. package/templates/portfolio-creative/tier5-src/_shared/collection-service.ts +5 -1
  127. package/templates/portfolio-creative/tier5-src/_shared/online-actions.ts +76 -0
  128. package/templates/portfolio-creative/tier5-src/himi-branded-lite-address/index.ts +3 -1
  129. package/templates/portfolio-creative/tier5-src/himi-branded-lite-addresses/index.ts +3 -1
  130. package/templates/portfolio-creative/tier5-src/himi-branded-lite-cart/index.ts +3 -0
  131. package/templates/portfolio-creative/tier5-src/himi-branded-lite-order/index.ts +3 -1
  132. package/templates/portfolio-creative/tier5-src/himi-branded-lite-wallet/index.ts +3 -1
  133. package/templates/portfolio-creative/tier5-src/himi-events-detail/index.ts +8 -1
  134. package/templates/portfolio-creative/tier5-src/himi-events-rsvp/index.ts +7 -4
  135. package/templates/portfolio-creative/tier5-src/himi-store-account/index.ts +69 -10
  136. package/templates/portfolio-creative/tier5-src/himi-store-product/index.ts +10 -4
  137. package/templates/portfolio-creative-owner/tier5-src/_shared/collection-service.ts +5 -1
  138. package/templates/portfolio-creative-owner/tier5-src/_shared/online-actions.ts +76 -0
  139. package/templates/restaurant/dev/index.ts +48 -25
  140. package/templates/restaurant/tier5-src/_shared/collection-service.ts +5 -1
  141. package/templates/restaurant/tier5-src/_shared/online-actions.ts +76 -0
  142. package/templates/restaurant/tier5-src/himi-branded-lite-address/index.ts +3 -1
  143. package/templates/restaurant/tier5-src/himi-branded-lite-addresses/index.ts +3 -1
  144. package/templates/restaurant/tier5-src/himi-branded-lite-reserve/index.ts +3 -1
  145. package/templates/restaurant/tier5-src/himi-branded-lite-wallet/index.ts +3 -1
  146. package/templates/restaurant/tier5-src/himi-events-detail/index.ts +8 -1
  147. package/templates/restaurant/tier5-src/himi-events-rsvp/index.ts +7 -4
  148. package/templates/restaurant/tier5-src/himi-store-account/index.ts +69 -10
  149. package/templates/restaurant-owner/tier5-src/_shared/collection-service.ts +5 -1
  150. package/templates/restaurant-owner/tier5-src/_shared/online-actions.ts +76 -0
  151. package/templates/retail-store/dev/index.ts +44 -23
  152. package/templates/retail-store/tier5-src/_shared/collection-service.ts +5 -1
  153. package/templates/retail-store/tier5-src/_shared/online-actions.ts +76 -0
  154. package/templates/retail-store/tier5-src/himi-branded-lite-address/index.ts +3 -1
  155. package/templates/retail-store/tier5-src/himi-branded-lite-addresses/index.ts +3 -1
  156. package/templates/retail-store/tier5-src/himi-branded-lite-cart/index.ts +3 -0
  157. package/templates/retail-store/tier5-src/himi-branded-lite-order/index.ts +3 -1
  158. package/templates/retail-store/tier5-src/himi-branded-lite-wallet/index.ts +3 -1
  159. package/templates/retail-store/tier5-src/himi-store-account/index.ts +69 -10
  160. package/templates/retail-store/tier5-src/himi-store-product/index.ts +10 -4
  161. package/templates/retail-store-owner/tier5-src/_shared/collection-service.ts +5 -1
  162. package/templates/retail-store-owner/tier5-src/_shared/online-actions.ts +76 -0
  163. package/templates/yoga-studio/dev/index.ts +2102 -811
  164. package/templates/yoga-studio/tier5-src/_shared/collection-service.ts +5 -1
  165. package/templates/yoga-studio/tier5-src/_shared/online-actions.ts +76 -0
  166. package/templates/yoga-studio/tier5-src/himi-booking-bookings/index.ts +1 -0
  167. package/templates/yoga-studio/tier5-src/himi-booking-time/index.ts +803 -284
  168. package/templates/yoga-studio/tier5-src/himi-branded-lite-agenda/index.ts +9 -1
  169. package/templates/yoga-studio/tier5-src/himi-branded-lite-place-summary/index.ts +12 -1
  170. package/templates/yoga-studio/tier5-src/himi-branded-lite-plans/index.ts +13 -1
  171. package/templates/yoga-studio/tier5-src/himi-branded-lite-program/index.ts +3 -1
  172. package/templates/yoga-studio/tier5-src/himi-branded-lite-wallet/index.ts +3 -1
  173. package/templates/yoga-studio/tier5-src/himi-events-detail/index.ts +8 -1
  174. package/templates/yoga-studio/tier5-src/himi-events-rsvp/index.ts +7 -4
  175. package/templates/yoga-studio/tier5-src/himi-store-account/index.ts +69 -10
  176. package/templates/yoga-studio-owner/tier5-src/_shared/collection-service.ts +5 -1
  177. package/templates/yoga-studio-owner/tier5-src/_shared/online-actions.ts +76 -0
@@ -0,0 +1,76 @@
1
+ import { connectivity, defineService as register, type ServiceDefinition } from '@himalaya/state';
2
+
3
+ // Template generation enables this behavior only in the selected two starter families.
4
+ export const offlineWritesEnabled = false;
5
+
6
+ export const offlineWriteMessage = 'You’re offline. Connect to save this change, then submit it again.';
7
+
8
+ /** The guard runs before the reducer: entered values survive and no optimistic
9
+ * changes, success state, or queued writes can occur. It never submits on reconnect. */
10
+ export function offlineWriteState<S extends object>(state: S): S {
11
+ const next: Record<string, unknown> = { ...state, error: offlineWriteMessage, message: offlineWriteMessage };
12
+ for (const key of ['saving', 'isSaving', 'submitting', 'isSubmitting', 'adding', 'added', 'bookingInFlight']) {
13
+ if (key in next) next[key] = false;
14
+ }
15
+ for (const key of ['savedMessage', 'successMessage']) {
16
+ if (key in next) next[key] = '';
17
+ }
18
+ // A saved/favourited item is business state, not a submission-success flag.
19
+ return next as S;
20
+ }
21
+
22
+ interface OfflineWriteOptions<S> {
23
+ derive?: (state: S) => S;
24
+ /** Exempt only non-mutating branches of a registered action. */
25
+ requiresConnectivity?: (action: string, state: S, argument?: unknown) => boolean;
26
+ messageFields?: readonly string[] | ((action: string) => readonly string[]);
27
+ draftFields?: readonly string[] | Readonly<Record<string, string>>;
28
+ secretFields?: readonly string[];
29
+ }
30
+
31
+ export function withOnlineWrites<S extends object>(registerService: typeof register, names: readonly string[], options: OfflineWriteOptions<S> = {}): typeof register {
32
+ if (!offlineWritesEnabled) return registerService;
33
+ return ((name: string, definition: ServiceDefinition<Record<string, unknown>>) => {
34
+ let currentState: (() => Record<string, unknown>) | undefined;
35
+ const handle = registerService(name, {
36
+ ...definition,
37
+ notHydrated: [...new Set([...(definition.notHydrated ?? []), ...(options.secretFields ?? [])])],
38
+ actions: Object.fromEntries(Object.entries(definition.actions ?? {}).map(([action, reduce]) => [action,
39
+ (state: Record<string, unknown>, ...args: never[]) => {
40
+ if (!names.includes(action)) return reduce(state, ...args);
41
+ if (options.requiresConnectivity?.(action, state as S, args[0]) === false) return reduce(state, ...args);
42
+ const fields = typeof options.messageFields === 'function' ? options.messageFields(action) : options.messageFields ?? ['message'];
43
+ if (connectivity().online) {
44
+ let cleared = false;
45
+ for (const field of ['error', 'message', ...fields]) {
46
+ if (state[field] === offlineWriteMessage) { state[field] = ''; cleared = true; }
47
+ }
48
+ // Keep the runtime's state object: reducers may mutate it and return undefined.
49
+ const result = reduce(state, ...args);
50
+ if (!cleared) return result;
51
+ // Publish cleared feedback even for a void reducer. An async completion must
52
+ // keep any newer state published by another action while it was awaiting.
53
+ const finish = (next: Record<string, unknown> | undefined) => next === undefined ? currentState?.() ?? state : next;
54
+ return result && typeof (result as Promise<unknown>).then === 'function'
55
+ ? Promise.resolve(result).then(finish)
56
+ : finish(result as Record<string, unknown> | undefined);
57
+ }
58
+ const draft = { ...state };
59
+ const argument = args[0] as Record<string, unknown> | undefined;
60
+ const draftFields = options.draftFields ?? [];
61
+ const entries = Array.isArray(draftFields) ? draftFields.map(key => [key, key]) : Object.entries(draftFields);
62
+ for (const [key, source] of entries) {
63
+ if (argument && key in state && typeof argument[source] === typeof state[key]) draft[key] = argument[source];
64
+ }
65
+ for (const key of options.secretFields ?? []) draft[key] = '';
66
+ const feedback = Object.fromEntries(fields.map(key => [key, offlineWriteMessage]));
67
+ let next = { ...offlineWriteState(draft), ...feedback };
68
+ if (options.derive) next = options.derive(next as S) as Record<string, unknown>;
69
+ return { ...next, ...feedback };
70
+ },
71
+ ])),
72
+ });
73
+ if (typeof handle.getState === 'function') currentState = () => handle.getState();
74
+ return handle;
75
+ }) as typeof register;
76
+ }