@curless/hotel-storefront 0.33.0 → 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.
- package/dist/card.generated.d.ts +1 -1
- package/dist/card.generated.js +2 -2
- package/dist/card.generated.js.map +1 -1
- package/dist/huazhu/backend.d.ts.map +1 -1
- package/dist/huazhu/backend.js +75 -0
- package/dist/huazhu/backend.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +2 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +5 -0
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -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,
|
|
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":"AACA,OAAO,EACL,KAAK,mBAAmB,EAExB,KAAK,YAAY,EAMlB,MAAM,eAAe,CAAC;AAavB,OAAO,EAAkB,KAAK,aAAa,EAAkC,MAAM,cAAc,CAAC;AAElG,OAAO,KAAK,EAAiB,eAAe,EAAkB,MAAM,yBAAyB,CAAC;AAE9F,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/huazhu/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/huazhu/backend.js
CHANGED
|
@@ -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
|
};
|