@wix/himalaya-cli 0.1141.0 → 0.1143.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 (48) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/delivery-contract.d.ts +104 -0
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/delivery.d.ts +33 -0
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/index.d.ts +5 -0
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/iap.mjs +509 -3
  5. package/dist/cli.mjs +31398 -30604
  6. package/dist/preview-assets.generated.bin +0 -0
  7. package/guides/designing-himi-screens.md +1 -1
  8. package/guides/getting-started.md +29 -11
  9. package/guides/himi-skill.md +29 -11
  10. package/guides/sdk-reference.json +132 -0
  11. package/guides/templates.md +33 -0
  12. package/guides/trim-a-template.md +13 -0
  13. package/package.json +2 -2
  14. package/templates/beauty-salon/dev/index.ts +2 -0
  15. package/templates/beauty-salon/tier5-src/himi-booking-time/index.ts +2 -2
  16. package/templates/beauty-salon/tier5-src/himi-store-account/index.ts +7 -1
  17. package/templates/branded-lite/dev/index.ts +3 -1
  18. package/templates/branded-lite/tier5-src/himi-booking-time/index.ts +2 -2
  19. package/templates/branded-lite/tier5-src/himi-events-rsvp/index.ts +2 -2
  20. package/templates/branded-lite/tier5-src/himi-store-account/index.ts +7 -1
  21. package/templates/community-club/dev/index.ts +2 -1
  22. package/templates/community-club/tier5-src/himi-events-rsvp/index.ts +2 -2
  23. package/templates/community-club/tier5-src/himi-store-account/index.ts +7 -1
  24. package/templates/events-meetups/dev/index.ts +2 -1
  25. package/templates/events-meetups/tier5-src/himi-events-rsvp/index.ts +2 -2
  26. package/templates/events-meetups/tier5-src/himi-store-account/index.ts +7 -1
  27. package/templates/gym-fitness/dev/index.ts +3 -1
  28. package/templates/gym-fitness/tier5-src/himi-booking-time/index.ts +2 -2
  29. package/templates/gym-fitness/tier5-src/himi-events-rsvp/index.ts +2 -2
  30. package/templates/gym-fitness/tier5-src/himi-store-account/index.ts +7 -1
  31. package/templates/nonprofit-cause/dev/index.ts +2 -1
  32. package/templates/nonprofit-cause/tier5-src/himi-events-rsvp/index.ts +2 -2
  33. package/templates/nonprofit-cause/tier5-src/himi-store-account/index.ts +7 -1
  34. package/templates/podcast-creator/dev/index.ts +2 -1
  35. package/templates/podcast-creator/tier5-src/himi-events-rsvp/index.ts +2 -2
  36. package/templates/podcast-creator/tier5-src/himi-store-account/index.ts +7 -1
  37. package/templates/portfolio-creative/dev/index.ts +2 -1
  38. package/templates/portfolio-creative/tier5-src/himi-events-rsvp/index.ts +2 -2
  39. package/templates/portfolio-creative/tier5-src/himi-store-account/index.ts +7 -1
  40. package/templates/restaurant/dev/index.ts +2 -1
  41. package/templates/restaurant/tier5-src/himi-events-rsvp/index.ts +2 -2
  42. package/templates/restaurant/tier5-src/himi-store-account/index.ts +7 -1
  43. package/templates/retail-store/dev/index.ts +1 -0
  44. package/templates/retail-store/tier5-src/himi-store-account/index.ts +7 -1
  45. package/templates/yoga-studio/dev/index.ts +3 -1
  46. package/templates/yoga-studio/tier5-src/himi-booking-time/index.ts +2 -2
  47. package/templates/yoga-studio/tier5-src/himi-events-rsvp/index.ts +2 -2
  48. package/templates/yoga-studio/tier5-src/himi-store-account/index.ts +7 -1
@@ -179,9 +179,9 @@ const svc = defineService<S, {
179
179
  try {
180
180
  await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
181
181
  const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
182
- return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
182
+ return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
183
183
  } catch {
184
- return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
184
+ return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
185
185
  }
186
186
  },
187
187
  rsvp: async (s) => {
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
77
77
  if (!next.isMember) return derive({ ...next, message: notMemberMessage });
78
78
  return resumeAfterAuth(derive({ ...next, message: "" }));
79
79
  } catch {
80
- return derive({ ...s, message: failedMessage });
80
+ // Clear the password: service state is snapshotted to disk (the worker-state
81
+ // store), so a failed attempt must not leave it there in cleartext. The Password
82
+ // field binds `valuePath` to it, so the field empties too and a retry re-types.
83
+ return derive({ ...s, password: "", message: failedMessage });
81
84
  } finally {
82
85
  authInFlight = false;
83
86
  }
@@ -168,6 +171,9 @@ interface S {
168
171
  noReturnPath: boolean;
169
172
  returnCta: string;
170
173
  email: string;
174
+ /** Held only from typing to the submit. Service state is persisted, so every
175
+ * submitted sign-in/register clears it (success, not-a-member, and failure), as
176
+ * do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
171
177
  password: string;
172
178
  firstName: string;
173
179
  lastName: string;
@@ -2581,6 +2581,7 @@ const SCREENS = runtimeSetting({
2581
2581
  "type": "TextField",
2582
2582
  "props": {
2583
2583
  "placeholder": "Password",
2584
+ "valuePath": "$service:himiStoreAccount.password",
2584
2585
  "secure": true,
2585
2586
  "autoCapitalization": "none",
2586
2587
  "onChange": {
@@ -31169,6 +31170,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
31169
31170
  "type": "TextField",
31170
31171
  "props": {
31171
31172
  "placeholder": "Password",
31173
+ "valuePath": "$service:himiBookingTime.password",
31172
31174
  "secure": true,
31173
31175
  "autoCapitalization": "none",
31174
31176
  "onChange": {
@@ -32923,7 +32925,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
32923
32925
  "type": "TextField",
32924
32926
  "props": {
32925
32927
  "placeholder": "Password",
32926
- "value": "",
32928
+ "valuePath": "$service:himiEventsRsvp.password",
32927
32929
  "secure": true,
32928
32930
  "autoCapitalization": "none",
32929
32931
  "onChange": {
@@ -603,7 +603,7 @@ const svc = defineService<S, {
603
603
  message: copyParam("time.signedInReady", "Signed in. You can book this time now."),
604
604
  });
605
605
  } catch {
606
- return derive({ ...s, message: copyParam("time.signInFailed", "Sign in failed. Try again.") });
606
+ return derive({ ...s, password: "", message: copyParam("time.signInFailed", "Sign in failed. Try again.") });
607
607
  }
608
608
  },
609
609
  register: async (s) => {
@@ -626,7 +626,7 @@ const svc = defineService<S, {
626
626
  message: copyParam("time.registerReady", "Account created. You can book this time now."),
627
627
  });
628
628
  } catch {
629
- return derive({ ...s, message: copyParam("time.registerFailed", "Account creation failed. Try another email.") });
629
+ return derive({ ...s, password: "", message: copyParam("time.registerFailed", "Account creation failed. Try another email.") });
630
630
  }
631
631
  },
632
632
  bookSelected: async (s) => {
@@ -179,9 +179,9 @@ const svc = defineService<S, {
179
179
  try {
180
180
  await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
181
181
  const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
182
- return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
182
+ return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
183
183
  } catch {
184
- return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
184
+ return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
185
185
  }
186
186
  },
187
187
  rsvp: async (s) => {
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
77
77
  if (!next.isMember) return derive({ ...next, message: notMemberMessage });
78
78
  return resumeAfterAuth(derive({ ...next, message: "" }));
79
79
  } catch {
80
- return derive({ ...s, message: failedMessage });
80
+ // Clear the password: service state is snapshotted to disk (the worker-state
81
+ // store), so a failed attempt must not leave it there in cleartext. The Password
82
+ // field binds `valuePath` to it, so the field empties too and a retry re-types.
83
+ return derive({ ...s, password: "", message: failedMessage });
81
84
  } finally {
82
85
  authInFlight = false;
83
86
  }
@@ -168,6 +171,9 @@ interface S {
168
171
  noReturnPath: boolean;
169
172
  returnCta: string;
170
173
  email: string;
174
+ /** Held only from typing to the submit. Service state is persisted, so every
175
+ * submitted sign-in/register clears it (success, not-a-member, and failure), as
176
+ * do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
171
177
  password: string;
172
178
  firstName: string;
173
179
  lastName: string;
@@ -2235,6 +2235,7 @@ const SCREENS = runtimeSetting({
2235
2235
  "type": "TextField",
2236
2236
  "props": {
2237
2237
  "placeholder": "Password",
2238
+ "valuePath": "$service:himiStoreAccount.password",
2238
2239
  "secure": true,
2239
2240
  "autoCapitalization": "none",
2240
2241
  "onChange": {
@@ -19612,7 +19613,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
19612
19613
  "type": "TextField",
19613
19614
  "props": {
19614
19615
  "placeholder": "Password",
19615
- "value": "",
19616
+ "valuePath": "$service:himiEventsRsvp.password",
19616
19617
  "secure": true,
19617
19618
  "autoCapitalization": "none",
19618
19619
  "onChange": {
@@ -179,9 +179,9 @@ const svc = defineService<S, {
179
179
  try {
180
180
  await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
181
181
  const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
182
- return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
182
+ return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
183
183
  } catch {
184
- return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
184
+ return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
185
185
  }
186
186
  },
187
187
  rsvp: async (s) => {
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
77
77
  if (!next.isMember) return derive({ ...next, message: notMemberMessage });
78
78
  return resumeAfterAuth(derive({ ...next, message: "" }));
79
79
  } catch {
80
- return derive({ ...s, message: failedMessage });
80
+ // Clear the password: service state is snapshotted to disk (the worker-state
81
+ // store), so a failed attempt must not leave it there in cleartext. The Password
82
+ // field binds `valuePath` to it, so the field empties too and a retry re-types.
83
+ return derive({ ...s, password: "", message: failedMessage });
81
84
  } finally {
82
85
  authInFlight = false;
83
86
  }
@@ -168,6 +171,9 @@ interface S {
168
171
  noReturnPath: boolean;
169
172
  returnCta: string;
170
173
  email: string;
174
+ /** Held only from typing to the submit. Service state is persisted, so every
175
+ * submitted sign-in/register clears it (success, not-a-member, and failure), as
176
+ * do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
171
177
  password: string;
172
178
  firstName: string;
173
179
  lastName: string;
@@ -2173,6 +2173,7 @@ const SCREENS = runtimeSetting({
2173
2173
  "type": "TextField",
2174
2174
  "props": {
2175
2175
  "placeholder": "Password",
2176
+ "valuePath": "$service:himiStoreAccount.password",
2176
2177
  "secure": true,
2177
2178
  "autoCapitalization": "none",
2178
2179
  "onChange": {
@@ -19965,7 +19966,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
19965
19966
  "type": "TextField",
19966
19967
  "props": {
19967
19968
  "placeholder": "Password",
19968
- "value": "",
19969
+ "valuePath": "$service:himiEventsRsvp.password",
19969
19970
  "secure": true,
19970
19971
  "autoCapitalization": "none",
19971
19972
  "onChange": {
@@ -179,9 +179,9 @@ const svc = defineService<S, {
179
179
  try {
180
180
  await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
181
181
  const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
182
- return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
182
+ return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
183
183
  } catch {
184
- return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
184
+ return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
185
185
  }
186
186
  },
187
187
  rsvp: async (s) => {
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
77
77
  if (!next.isMember) return derive({ ...next, message: notMemberMessage });
78
78
  return resumeAfterAuth(derive({ ...next, message: "" }));
79
79
  } catch {
80
- return derive({ ...s, message: failedMessage });
80
+ // Clear the password: service state is snapshotted to disk (the worker-state
81
+ // store), so a failed attempt must not leave it there in cleartext. The Password
82
+ // field binds `valuePath` to it, so the field empties too and a retry re-types.
83
+ return derive({ ...s, password: "", message: failedMessage });
81
84
  } finally {
82
85
  authInFlight = false;
83
86
  }
@@ -168,6 +171,9 @@ interface S {
168
171
  noReturnPath: boolean;
169
172
  returnCta: string;
170
173
  email: string;
174
+ /** Held only from typing to the submit. Service state is persisted, so every
175
+ * submitted sign-in/register clears it (success, not-a-member, and failure), as
176
+ * do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
171
177
  password: string;
172
178
  firstName: string;
173
179
  lastName: string;
@@ -2043,6 +2043,7 @@ const SCREENS = runtimeSetting({
2043
2043
  "type": "TextField",
2044
2044
  "props": {
2045
2045
  "placeholder": "Password",
2046
+ "valuePath": "$service:himiStoreAccount.password",
2046
2047
  "secure": true,
2047
2048
  "autoCapitalization": "none",
2048
2049
  "onChange": {
@@ -24332,7 +24333,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
24332
24333
  "type": "TextField",
24333
24334
  "props": {
24334
24335
  "placeholder": "Password",
24335
- "value": "",
24336
+ "valuePath": "$service:himiEventsRsvp.password",
24336
24337
  "secure": true,
24337
24338
  "autoCapitalization": "none",
24338
24339
  "onChange": {
@@ -179,9 +179,9 @@ const svc = defineService<S, {
179
179
  try {
180
180
  await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
181
181
  const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
182
- return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
182
+ return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
183
183
  } catch {
184
- return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
184
+ return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
185
185
  }
186
186
  },
187
187
  rsvp: async (s) => {
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
77
77
  if (!next.isMember) return derive({ ...next, message: notMemberMessage });
78
78
  return resumeAfterAuth(derive({ ...next, message: "" }));
79
79
  } catch {
80
- return derive({ ...s, message: failedMessage });
80
+ // Clear the password: service state is snapshotted to disk (the worker-state
81
+ // store), so a failed attempt must not leave it there in cleartext. The Password
82
+ // field binds `valuePath` to it, so the field empties too and a retry re-types.
83
+ return derive({ ...s, password: "", message: failedMessage });
81
84
  } finally {
82
85
  authInFlight = false;
83
86
  }
@@ -168,6 +171,9 @@ interface S {
168
171
  noReturnPath: boolean;
169
172
  returnCta: string;
170
173
  email: string;
174
+ /** Held only from typing to the submit. Service state is persisted, so every
175
+ * submitted sign-in/register clears it (success, not-a-member, and failure), as
176
+ * do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
171
177
  password: string;
172
178
  firstName: string;
173
179
  lastName: string;
@@ -2099,6 +2099,7 @@ const SCREENS = runtimeSetting({
2099
2099
  "type": "TextField",
2100
2100
  "props": {
2101
2101
  "placeholder": "Password",
2102
+ "valuePath": "$service:himiStoreAccount.password",
2102
2103
  "secure": true,
2103
2104
  "autoCapitalization": "none",
2104
2105
  "onChange": {
@@ -17408,7 +17409,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
17408
17409
  "type": "TextField",
17409
17410
  "props": {
17410
17411
  "placeholder": "Password",
17411
- "value": "",
17412
+ "valuePath": "$service:himiEventsRsvp.password",
17412
17413
  "secure": true,
17413
17414
  "autoCapitalization": "none",
17414
17415
  "onChange": {
@@ -179,9 +179,9 @@ const svc = defineService<S, {
179
179
  try {
180
180
  await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
181
181
  const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
182
- return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
182
+ return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
183
183
  } catch {
184
- return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
184
+ return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
185
185
  }
186
186
  },
187
187
  rsvp: async (s) => {
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
77
77
  if (!next.isMember) return derive({ ...next, message: notMemberMessage });
78
78
  return resumeAfterAuth(derive({ ...next, message: "" }));
79
79
  } catch {
80
- return derive({ ...s, message: failedMessage });
80
+ // Clear the password: service state is snapshotted to disk (the worker-state
81
+ // store), so a failed attempt must not leave it there in cleartext. The Password
82
+ // field binds `valuePath` to it, so the field empties too and a retry re-types.
83
+ return derive({ ...s, password: "", message: failedMessage });
81
84
  } finally {
82
85
  authInFlight = false;
83
86
  }
@@ -168,6 +171,9 @@ interface S {
168
171
  noReturnPath: boolean;
169
172
  returnCta: string;
170
173
  email: string;
174
+ /** Held only from typing to the submit. Service state is persisted, so every
175
+ * submitted sign-in/register clears it (success, not-a-member, and failure), as
176
+ * do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
171
177
  password: string;
172
178
  firstName: string;
173
179
  lastName: string;
@@ -1576,6 +1576,7 @@ const SCREENS = runtimeSetting({
1576
1576
  "type": "TextField",
1577
1577
  "props": {
1578
1578
  "placeholder": "Password",
1579
+ "valuePath": "$service:himiStoreAccount.password",
1579
1580
  "secure": true,
1580
1581
  "autoCapitalization": "none",
1581
1582
  "onChange": {
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
77
77
  if (!next.isMember) return derive({ ...next, message: notMemberMessage });
78
78
  return resumeAfterAuth(derive({ ...next, message: "" }));
79
79
  } catch {
80
- return derive({ ...s, message: failedMessage });
80
+ // Clear the password: service state is snapshotted to disk (the worker-state
81
+ // store), so a failed attempt must not leave it there in cleartext. The Password
82
+ // field binds `valuePath` to it, so the field empties too and a retry re-types.
83
+ return derive({ ...s, password: "", message: failedMessage });
81
84
  } finally {
82
85
  authInFlight = false;
83
86
  }
@@ -168,6 +171,9 @@ interface S {
168
171
  noReturnPath: boolean;
169
172
  returnCta: string;
170
173
  email: string;
174
+ /** Held only from typing to the submit. Service state is persisted, so every
175
+ * submitted sign-in/register clears it (success, not-a-member, and failure), as
176
+ * do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
171
177
  password: string;
172
178
  firstName: string;
173
179
  lastName: string;
@@ -2507,6 +2507,7 @@ const SCREENS = runtimeSetting({
2507
2507
  "type": "TextField",
2508
2508
  "props": {
2509
2509
  "placeholder": "Password",
2510
+ "valuePath": "$service:himiStoreAccount.password",
2510
2511
  "secure": true,
2511
2512
  "autoCapitalization": "none",
2512
2513
  "onChange": {
@@ -24951,6 +24952,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
24951
24952
  "type": "TextField",
24952
24953
  "props": {
24953
24954
  "placeholder": "Password",
24955
+ "valuePath": "$service:himiBookingTime.password",
24954
24956
  "secure": true,
24955
24957
  "autoCapitalization": "none",
24956
24958
  "onChange": {
@@ -27133,7 +27135,7 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
27133
27135
  "type": "TextField",
27134
27136
  "props": {
27135
27137
  "placeholder": "Password",
27136
- "value": "",
27138
+ "valuePath": "$service:himiEventsRsvp.password",
27137
27139
  "secure": true,
27138
27140
  "autoCapitalization": "none",
27139
27141
  "onChange": {
@@ -603,7 +603,7 @@ const svc = defineService<S, {
603
603
  message: copyParam("time.signedInReady", "Signed in. You can book this time now."),
604
604
  });
605
605
  } catch {
606
- return derive({ ...s, message: copyParam("time.signInFailed", "Sign in failed. Try again.") });
606
+ return derive({ ...s, password: "", message: copyParam("time.signInFailed", "Sign in failed. Try again.") });
607
607
  }
608
608
  },
609
609
  register: async (s) => {
@@ -626,7 +626,7 @@ const svc = defineService<S, {
626
626
  message: copyParam("time.registerReady", "Account created. You can book this time now."),
627
627
  });
628
628
  } catch {
629
- return derive({ ...s, message: copyParam("time.registerFailed", "Account creation failed. Try another email.") });
629
+ return derive({ ...s, password: "", message: copyParam("time.registerFailed", "Account creation failed. Try another email.") });
630
630
  }
631
631
  },
632
632
  bookSelected: async (s) => {
@@ -179,9 +179,9 @@ const svc = defineService<S, {
179
179
  try {
180
180
  await dispatch("himi.wix.signInDirect", { email: s.email, password: s.password });
181
181
  const p = await probeMember({ ...s, isMember: true, identityLine: s.email });
182
- return derive({ ...p, message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
182
+ return derive({ ...p, password: "", message: p.isMember ? copyParam("rsvp.signedInReady", "Signed in. You can RSVP now.") : copyParam("rsvp.signInCheckDetails", "Sign in failed. Check your details.") });
183
183
  } catch {
184
- return derive({ ...s, message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
184
+ return derive({ ...s, password: "", message: copyParam("rsvp.signInFailed", "Sign in failed. Try again.") });
185
185
  }
186
186
  },
187
187
  rsvp: async (s) => {
@@ -77,7 +77,10 @@ async function authenticate(s: S, submit: () => Promise<unknown>, notMemberMessa
77
77
  if (!next.isMember) return derive({ ...next, message: notMemberMessage });
78
78
  return resumeAfterAuth(derive({ ...next, message: "" }));
79
79
  } catch {
80
- return derive({ ...s, message: failedMessage });
80
+ // Clear the password: service state is snapshotted to disk (the worker-state
81
+ // store), so a failed attempt must not leave it there in cleartext. The Password
82
+ // field binds `valuePath` to it, so the field empties too and a retry re-types.
83
+ return derive({ ...s, password: "", message: failedMessage });
81
84
  } finally {
82
85
  authInFlight = false;
83
86
  }
@@ -168,6 +171,9 @@ interface S {
168
171
  noReturnPath: boolean;
169
172
  returnCta: string;
170
173
  email: string;
174
+ /** Held only from typing to the submit. Service state is persisted, so every
175
+ * submitted sign-in/register clears it (success, not-a-member, and failure), as
176
+ * do recovery and sign-out. Sign-in <-> register keeps it: the field stays up. */
171
177
  password: string;
172
178
  firstName: string;
173
179
  lastName: string;