@curless/hotel-storefront 0.33.1 → 0.33.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"card.generated.js","sourceRoot":"","sources":["../src/card.generated.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,wEAAwE;AACxE,gFAAgF;AAChF,4DAA4D;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAW,MAAM,CAAC,IAAI,CAChD,028xBAA028xB,EAC128xB,QAAQ,CACT,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAEnB,6GAA6G;AAC7G,MAAM,CAAC,MAAM,qBAAqB,GAChC,kEAAkE,CAAC"}
1
+ {"version":3,"file":"card.generated.js","sourceRoot":"","sources":["../src/card.generated.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,wEAAwE;AACxE,gFAAgF;AAChF,4DAA4D;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAW,MAAM,CAAC,IAAI,CAChD,8noyBAA8noyB,EAC9noyB,QAAQ,CACT,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAEnB,6GAA6G;AAC7G,MAAM,CAAC,MAAM,qBAAqB,GAChC,kEAAkE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/huazhu/backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/huazhu/backend.ts"],"names":[],"mappings":"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"}
@@ -103,6 +103,63 @@ const MEAL_ZH = {
103
103
  FB: '含全餐',
104
104
  AI: '全包',
105
105
  };
106
+ /**
107
+ * Huazhu's `isHasWindow` as a code a card says in any language (香格里拉,
108
+ * 2026-10-14) - beside the Chinese words, never instead of them.
109
+ */
110
+ const WINDOW_KIND = {
111
+ '1': 'yes',
112
+ '2': 'partial',
113
+ '3': 'no',
114
+ '4': 'inner',
115
+ };
116
+ /** Huazhu's meal plans as codes a card says in any language (香格里拉, 2026-10-14). */
117
+ const MEAL_PLAN = {
118
+ RO: 'none',
119
+ BB: 'breakfast',
120
+ BF: 'buffet-breakfast',
121
+ HB: 'half-board',
122
+ FB: 'full-board',
123
+ AI: 'all-inclusive',
124
+ };
125
+ /** A rate's meals as a code - a plan Huazhu names that has no code is left out, and its words stand. */
126
+ const mealPlanOf = (s) => {
127
+ if (!s.meal)
128
+ return { plan: 'none' };
129
+ const plan = MEAL_PLAN[s.mealType];
130
+ return plan ? { plan, ...(s.mealCount > 0 ? { count: s.mealCount } : {}) } : undefined;
131
+ };
132
+ /** Huazhu's bed names as codes; another is `other`, with its own word. */
133
+ const BED_KIND = { 大床: 'king', 双床: 'twin', 单人床: 'single' };
134
+ const bedTypesOf = (rt) => (rt?.bedTypeList ?? [])
135
+ .filter((b) => b.bedTypeName || b.bedSpec)
136
+ .map((b) => {
137
+ const name = String(b.bedTypeName ?? '').trim();
138
+ const kind = BED_KIND[name] ?? 'other';
139
+ return {
140
+ kind,
141
+ ...(b.bedSpec ? { size: String(b.bedSpec) } : {}),
142
+ ...(kind === 'other' && name ? { name } : {}),
143
+ };
144
+ });
145
+ /**
146
+ * A moment as the hotel's clock shows it, "2026-11-04T12:00" - the same moment
147
+ * as a `…Local` deadline, for a card to say in the guest's language.
148
+ */
149
+ const localIsoAt = (instant, tz) => {
150
+ const p = Object.fromEntries(new Intl.DateTimeFormat('en-CA', {
151
+ timeZone: tz,
152
+ year: 'numeric',
153
+ month: '2-digit',
154
+ day: '2-digit',
155
+ hour: '2-digit',
156
+ minute: '2-digit',
157
+ hourCycle: 'h23',
158
+ })
159
+ .formatToParts(instant)
160
+ .map((x) => [x.type, x.value]));
161
+ return `${p.year}-${p.month}-${p.day}T${p.hour}:${p.minute}`;
162
+ };
106
163
  const pool = async (items, n, fn) => {
107
164
  const out = new Array(items.length);
108
165
  let next = 0;
@@ -797,10 +854,14 @@ export const createHuazhuHotels = (opts) => {
797
854
  ...(room.freeCancellationLocal
798
855
  ? { freeCancellationLocal: room.freeCancellationLocal }
799
856
  : {}),
857
+ ...(room.freeCancellationLocalIso
858
+ ? { freeCancellationLocalIso: room.freeCancellationLocalIso }
859
+ : {}),
800
860
  };
801
861
  return {
802
862
  freeCancellationUntil: new Date(held).toISOString(),
803
863
  freeCancellationLocal: deadlineAt(held, opts.tz, opts.language === 'en' ? 'en' : 'zh'),
864
+ freeCancellationLocalIso: localIsoAt(held, opts.tz),
804
865
  };
805
866
  };
806
867
  const toRoom = (h, p, stay) => {
@@ -852,8 +913,14 @@ export const createHuazhuHotels = (opts) => {
852
913
  // for what a Shanghai desk calls 18:00 - found by the Huazhu evals
853
914
  // (2026-10-05).
854
915
  freeCancellationLocal: deadlineAt(freeUntil, opts.tz, en ? 'en' : 'zh'),
916
+ freeCancellationLocalIso: localIsoAt(freeUntil, opts.tz),
855
917
  }
856
918
  : {}),
919
+ ...(rt?.isHasWindow && WINDOW_KIND[rt.isHasWindow]
920
+ ? { window: WINDOW_KIND[rt.isHasWindow] }
921
+ : {}),
922
+ ...(mealPlanOf(s) ? { meal: mealPlanOf(s) } : {}),
923
+ ...(bedTypesOf(rt).length ? { bedTypes: bedTypesOf(rt) } : {}),
857
924
  roomsLeft: s.roomsLeft,
858
925
  roomType: { id: p.product.roomTypeCode, name: roomTypeOf(p.product) },
859
926
  rate: { id: p.product.rateCode, name: rateNameOf(p.product) },
@@ -1078,6 +1145,12 @@ export const createHuazhuHotels = (opts) => {
1078
1145
  ]
1079
1146
  .filter(Boolean)
1080
1147
  .join(' · '),
1148
+ // The same as codes, for a card in another language: each of the
1149
+ // detail's parts - beds · window · meals · hours (`hourly`) - so the
1150
+ // card can say all of it, not some (香格里拉, 2026-10-14).
1151
+ ...(room.bedTypes?.length ? { bedTypes: room.bedTypes } : {}),
1152
+ ...(room.window ? { window: room.window } : {}),
1153
+ ...(room.meal ? { meal: room.meal } : {}),
1081
1154
  stay: line.stay,
1082
1155
  nights: room.nights,
1083
1156
  ...(hourly ? { hourly } : {}),
@@ -1144,6 +1217,7 @@ export const createHuazhuHotels = (opts) => {
1144
1217
  ? {
1145
1218
  payBy: new Date(p.payBy).toISOString(),
1146
1219
  payByLocal: deadlineAt(p.payBy, b.tz, en ? 'en' : 'zh'),
1220
+ payByLocalIso: localIsoAt(p.payBy, b.tz),
1147
1221
  }
1148
1222
  : {}),
1149
1223
  ...(refund ? { refundReason: refund.reason } : {}),
@@ -2306,6 +2380,7 @@ export const createHuazhuHotels = (opts) => {
2306
2380
  freeCancellation: !!b.room.freeCancellationUntil,
2307
2381
  ...(b.room.hourly ? { hours: b.room.hourly.hours } : {}),
2308
2382
  ...(b.room.labels?.length ? { labels: b.room.labels } : {}),
2383
+ ...(b.room.meal ? { meal: b.room.meal } : {}),
2309
2384
  },
2310
2385
  };
2311
2386
  };