@curless/hotel-storefront 0.30.5 → 0.30.7
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 +2 -0
- package/dist/huazhu/backend.d.ts.map +1 -1
- package/dist/huazhu/backend.js +44 -6
- package/dist/huazhu/backend.js.map +1 -1
- package/dist/huazhu/check.d.ts +5 -0
- package/dist/huazhu/check.d.ts.map +1 -1
- package/dist/huazhu/check.js +10 -5
- package/dist/huazhu/check.js.map +1 -1
- package/dist/huazhu/make.d.ts.map +1 -1
- package/dist/huazhu/make.js +14 -5
- package/dist/huazhu/make.js.map +1 -1
- package/dist/huazhu/origin.d.ts +10 -0
- package/dist/huazhu/origin.d.ts.map +1 -1
- package/dist/huazhu/origin.js +15 -0
- package/dist/huazhu/origin.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.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 -2
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +7 -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,s4siBAAs4siB,EACt4siB,QAAQ,CACT,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAEnB,6GAA6G;AAC7G,MAAM,CAAC,MAAM,qBAAqB,GAChC,kEAAkE,CAAC"}
|
package/dist/huazhu/backend.d.ts
CHANGED
|
@@ -28,6 +28,8 @@ export type HuazhuHotelsOptions = {
|
|
|
28
28
|
*/
|
|
29
29
|
sandbox?: boolean;
|
|
30
30
|
/** Offer rooms by the hour - see `ApiSource.hourly`. Off unless set. */
|
|
31
|
+
/** Huazhu's own test environment (test-*.huazhu.com) - where prepaid may run in test mode. */
|
|
32
|
+
testEnvironment?: boolean;
|
|
31
33
|
hourly?: boolean;
|
|
32
34
|
/**
|
|
33
35
|
* Sell rates paid in advance, taking the money through the gateway's card
|
|
@@ -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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"}
|
package/dist/huazhu/backend.js
CHANGED
|
@@ -352,9 +352,11 @@ export const createHuazhuHotels = (opts) => {
|
|
|
352
352
|
const { client, catalog, store, reconciler } = opts;
|
|
353
353
|
// ⚠️ NO MONEY TAKEN FOR A REAL HUAZHU YET: who takes it, the licence, a
|
|
354
354
|
// partial refund, mixed trips, invoices and VCC are robin's to decide
|
|
355
|
-
// (总线程, 2026-10-12). Prepaid runs against the simulated Huazhu
|
|
356
|
-
|
|
357
|
-
|
|
355
|
+
// (总线程, 2026-10-12). Prepaid runs against the simulated Huazhu, or
|
|
356
|
+
// Huazhu's test environment in test mode (robin, 2026-10-14) - never the
|
|
357
|
+
// production one.
|
|
358
|
+
if (opts.prepaid && !opts.sandbox && !opts.testEnvironment)
|
|
359
|
+
throw new Error("prepaid rates are sold against the simulated Huazhu or Huazhu's test environment only, until robin decides who takes the money (docs/huazhu-products-plan.md)");
|
|
358
360
|
const checkout = opts.prepaid?.checkout;
|
|
359
361
|
/** Unpaid this long, the page is closed and the booking lapses - inside the card page's own ~31 minutes. */
|
|
360
362
|
const payWithin = opts.prepaid?.payWithinMs ?? 30 * 60_000;
|
|
@@ -511,6 +513,36 @@ export const createHuazhuHotels = (opts) => {
|
|
|
511
513
|
return got;
|
|
512
514
|
};
|
|
513
515
|
const productsOf = async (hotelId) => (await productsWithDays(hotelId)).value;
|
|
516
|
+
/**
|
|
517
|
+
* Whether a hotel sells rooms by the hour at all (`Hotel.sellsHourly`): any
|
|
518
|
+
* product checked in by the hour - not whether one is left today, which the
|
|
519
|
+
* hotel's page says with a reason. Only where this deployment sells them.
|
|
520
|
+
*
|
|
521
|
+
* ⚠️ A HOTEL THAT SELLS NONE SHOWED THE "BY THE HOUR" SWITCH, and every
|
|
522
|
+
* press of it led to "none here" (robin, 2026-10-14). Unknown is left out,
|
|
523
|
+
* and the card keeps the switch: hiding it from a hotel that does sell them
|
|
524
|
+
* is the worse mistake.
|
|
525
|
+
*/
|
|
526
|
+
const sellsHourlyOf = async (hotelId) => {
|
|
527
|
+
if (!opts.hourly)
|
|
528
|
+
return undefined;
|
|
529
|
+
try {
|
|
530
|
+
return (await productsOf(hotelId)).some((p) => p.checkinType === 'HOUR');
|
|
531
|
+
}
|
|
532
|
+
catch {
|
|
533
|
+
return undefined;
|
|
534
|
+
}
|
|
535
|
+
};
|
|
536
|
+
/** The same, only from a product list already read - a list asks Huazhu nothing more for it. */
|
|
537
|
+
const sellsHourlyKnown = (hotelId) => {
|
|
538
|
+
if (!opts.hourly)
|
|
539
|
+
return undefined;
|
|
540
|
+
const hit = productsCache.get(hotelId);
|
|
541
|
+
if (!hit || now() - hit.at >= productsTtl)
|
|
542
|
+
return undefined;
|
|
543
|
+
return hit.value.some((p) => p.checkinType === 'HOUR');
|
|
544
|
+
};
|
|
545
|
+
const withSells = (hotel, sells) => sells === undefined ? hotel : { ...hotel, sellsHourly: sells };
|
|
514
546
|
/** Whether a hotel sells any room by the hour on its today - from its products, no prices. */
|
|
515
547
|
const sellsByTheHourToday = async (hotelId) => (await productsOf(hotelId)).some((p) => p.checkinType === 'HOUR' && inStayWindow(p.stayWindow, today()));
|
|
516
548
|
const ariCache = new Map();
|
|
@@ -2201,7 +2233,11 @@ export const createHuazhuHotels = (opts) => {
|
|
|
2201
2233
|
// The page is priced whatever else was: it is what the guest sees.
|
|
2202
2234
|
if (stay && !priceEverything)
|
|
2203
2235
|
await pool(shown.map((m) => m.raw), PRICE_CONCURRENCY, priceHotel);
|
|
2204
|
-
const priced = (
|
|
2236
|
+
const priced = (listed) => {
|
|
2237
|
+
const m = {
|
|
2238
|
+
...listed,
|
|
2239
|
+
hotel: withSells(listed.hotel, sellsHourlyKnown(listed.raw.hotelId)),
|
|
2240
|
+
};
|
|
2205
2241
|
if (!stay)
|
|
2206
2242
|
return m.hotel;
|
|
2207
2243
|
const b = bestFor(m.raw, f);
|
|
@@ -2302,7 +2338,9 @@ export const createHuazhuHotels = (opts) => {
|
|
|
2302
2338
|
const raw = findHotel(id);
|
|
2303
2339
|
if (!raw)
|
|
2304
2340
|
return null;
|
|
2305
|
-
const detail = {
|
|
2341
|
+
const detail = {
|
|
2342
|
+
hotel: withSells(toHotel(raw, view, now()), await sellsHourlyOf(raw.hotelId)),
|
|
2343
|
+
};
|
|
2306
2344
|
if (!stay)
|
|
2307
2345
|
return detail;
|
|
2308
2346
|
const problem = stayProblemOf(stay, today());
|
|
@@ -2337,7 +2375,7 @@ export const createHuazhuHotels = (opts) => {
|
|
|
2337
2375
|
const raw = findHotel(id);
|
|
2338
2376
|
if (!raw)
|
|
2339
2377
|
return null;
|
|
2340
|
-
const hotel = toHotel(raw, view, now());
|
|
2378
|
+
const hotel = withSells(toHotel(raw, view, now()), await sellsHourlyOf(raw.hotelId));
|
|
2341
2379
|
const date = today();
|
|
2342
2380
|
const stay = { checkIn: date, checkOut: date, guests };
|
|
2343
2381
|
let priced;
|