@curless/hotel-storefront 0.23.2 → 0.24.1

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 (107) hide show
  1. package/README.md +35 -11
  2. package/dist/__tests__/__fixtures__/huazhu-fake.d.ts +2 -0
  3. package/dist/__tests__/__fixtures__/huazhu-fake.d.ts.map +1 -0
  4. package/dist/__tests__/__fixtures__/huazhu-fake.js +3 -0
  5. package/dist/__tests__/__fixtures__/huazhu-fake.js.map +1 -0
  6. package/dist/__tests__/huazhu-backend.test.d.ts +2 -0
  7. package/dist/__tests__/huazhu-backend.test.d.ts.map +1 -0
  8. package/dist/__tests__/huazhu-backend.test.js +434 -0
  9. package/dist/__tests__/huazhu-backend.test.js.map +1 -0
  10. package/dist/__tests__/huazhu-cancel-policy.test.d.ts +2 -0
  11. package/dist/__tests__/huazhu-cancel-policy.test.d.ts.map +1 -0
  12. package/dist/__tests__/huazhu-cancel-policy.test.js +82 -0
  13. package/dist/__tests__/huazhu-cancel-policy.test.js.map +1 -0
  14. package/dist/__tests__/huazhu-sandbox.test.d.ts +2 -0
  15. package/dist/__tests__/huazhu-sandbox.test.d.ts.map +1 -0
  16. package/dist/__tests__/huazhu-sandbox.test.js +172 -0
  17. package/dist/__tests__/huazhu-sandbox.test.js.map +1 -0
  18. package/dist/__tests__/huazhu-sellable.test.d.ts +2 -0
  19. package/dist/__tests__/huazhu-sellable.test.d.ts.map +1 -0
  20. package/dist/__tests__/huazhu-sellable.test.js +192 -0
  21. package/dist/__tests__/huazhu-sellable.test.js.map +1 -0
  22. package/dist/__tests__/server.test.js +129 -4
  23. package/dist/__tests__/server.test.js.map +1 -1
  24. package/dist/__tests__/tool-descriptions.test.js +85 -7
  25. package/dist/__tests__/tool-descriptions.test.js.map +1 -1
  26. package/dist/backend.d.ts +27 -0
  27. package/dist/backend.d.ts.map +1 -1
  28. package/dist/backend.js +7 -0
  29. package/dist/backend.js.map +1 -1
  30. package/dist/card.generated.d.ts +1 -1
  31. package/dist/card.generated.js +2 -2
  32. package/dist/card.generated.js.map +1 -1
  33. package/dist/config.d.ts +64 -4
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js.map +1 -1
  36. package/dist/facilities.d.ts.map +1 -1
  37. package/dist/facilities.js +7 -5
  38. package/dist/facilities.js.map +1 -1
  39. package/dist/huazhu/backend.d.ts +40 -0
  40. package/dist/huazhu/backend.d.ts.map +1 -0
  41. package/dist/huazhu/backend.js +1318 -0
  42. package/dist/huazhu/backend.js.map +1 -0
  43. package/dist/huazhu/bookings.d.ts +81 -0
  44. package/dist/huazhu/bookings.d.ts.map +1 -0
  45. package/dist/huazhu/bookings.js +189 -0
  46. package/dist/huazhu/bookings.js.map +1 -0
  47. package/dist/huazhu/cancel-policy.d.ts +69 -0
  48. package/dist/huazhu/cancel-policy.d.ts.map +1 -0
  49. package/dist/huazhu/cancel-policy.js +201 -0
  50. package/dist/huazhu/cancel-policy.js.map +1 -0
  51. package/dist/huazhu/catalog.d.ts +75 -0
  52. package/dist/huazhu/catalog.d.ts.map +1 -0
  53. package/dist/huazhu/catalog.js +251 -0
  54. package/dist/huazhu/catalog.js.map +1 -0
  55. package/dist/huazhu/check.d.ts +5 -0
  56. package/dist/huazhu/check.d.ts.map +1 -0
  57. package/dist/huazhu/check.js +170 -0
  58. package/dist/huazhu/check.js.map +1 -0
  59. package/dist/huazhu/client.d.ts +100 -0
  60. package/dist/huazhu/client.d.ts.map +1 -0
  61. package/dist/huazhu/client.js +232 -0
  62. package/dist/huazhu/client.js.map +1 -0
  63. package/dist/huazhu/fake.d.ts +64 -0
  64. package/dist/huazhu/fake.d.ts.map +1 -0
  65. package/dist/huazhu/fake.js +365 -0
  66. package/dist/huazhu/fake.js.map +1 -0
  67. package/dist/huazhu/sandbox.d.ts +26 -0
  68. package/dist/huazhu/sandbox.d.ts.map +1 -0
  69. package/dist/huazhu/sandbox.js +289 -0
  70. package/dist/huazhu/sandbox.js.map +1 -0
  71. package/dist/huazhu/sellable.d.ts +81 -0
  72. package/dist/huazhu/sellable.d.ts.map +1 -0
  73. package/dist/huazhu/sellable.js +219 -0
  74. package/dist/huazhu/sellable.js.map +1 -0
  75. package/dist/huazhu/wire.d.ts +389 -0
  76. package/dist/huazhu/wire.d.ts.map +1 -0
  77. package/dist/huazhu/wire.js +72 -0
  78. package/dist/huazhu/wire.js.map +1 -0
  79. package/dist/index.js +18 -4
  80. package/dist/index.js.map +1 -1
  81. package/dist/legal.d.ts +4 -3
  82. package/dist/legal.d.ts.map +1 -1
  83. package/dist/legal.js +71 -30
  84. package/dist/legal.js.map +1 -1
  85. package/dist/lib.d.ts +8 -3
  86. package/dist/lib.d.ts.map +1 -1
  87. package/dist/lib.js +8 -1
  88. package/dist/lib.js.map +1 -1
  89. package/dist/server.d.ts +20 -8
  90. package/dist/server.d.ts.map +1 -1
  91. package/dist/server.js +132 -28
  92. package/dist/server.js.map +1 -1
  93. package/dist/surface.d.ts +2 -1
  94. package/dist/surface.d.ts.map +1 -1
  95. package/dist/surface.js +42 -10
  96. package/dist/surface.js.map +1 -1
  97. package/dist/tools.d.ts +33 -20
  98. package/dist/tools.d.ts.map +1 -1
  99. package/dist/tools.js +122 -11
  100. package/dist/tools.js.map +1 -1
  101. package/dist/types.d.ts +21 -2
  102. package/dist/types.d.ts.map +1 -1
  103. package/dist/vocab.d.ts +5 -0
  104. package/dist/vocab.d.ts.map +1 -1
  105. package/dist/vocab.js +2 -1
  106. package/dist/vocab.js.map +1 -1
  107. package/package.json +1 -1
@@ -0,0 +1,389 @@
1
+ /** Every answer: `code` 1000 is success, anything else is a refusal with a reason. */
2
+ export type Envelope<T> = {
3
+ code: number;
4
+ content?: T;
5
+ message?: string;
6
+ /** "错误信息描述,日常排障使用" - the detail a refusal carries. */
7
+ responseDes?: string;
8
+ echoToken?: string;
9
+ };
10
+ export declare const SUCCESS = 1000;
11
+ /**
12
+ * `yyyy-MM-dd` in the tables; the hotel-detail example sends
13
+ * `openingDate: 1356883200000`. Both are read.
14
+ */
15
+ export type HuazhuDate = string | number;
16
+ export type HotelListItem = {
17
+ hotelId: string;
18
+ hotelName: string;
19
+ };
20
+ export type BedType = {
21
+ bedTypeCode: string;
22
+ bedSpecNo: string;
23
+ bedTypeName?: string;
24
+ bedSpec?: string;
25
+ };
26
+ export type HotelRoomType = {
27
+ roomTypeCode: string;
28
+ roomTypeName: string;
29
+ roomNum?: number;
30
+ summary?: string;
31
+ /** Square metres. The field is named `hotelArea` in the documentation. */
32
+ hotelArea?: number;
33
+ floorPlace?: string;
34
+ bedWidth?: string;
35
+ isADSL?: string;
36
+ isADSLWifi?: string;
37
+ /** 1 有窗 · 2 部分有窗 · 3 无窗 · 4 内景 */
38
+ isHasWindow?: string;
39
+ isCanAddBed?: string;
40
+ hasSmokeFree?: string;
41
+ /** The example sends 999 - read as "not published", never as 999 people. */
42
+ maxOccupancy?: number;
43
+ maxAdult?: number;
44
+ maxChild?: number;
45
+ /** 1 启用 · 0 禁用 */
46
+ status?: number;
47
+ bedTypeList?: BedType[];
48
+ };
49
+ export type HotelService = {
50
+ childClassName?: string;
51
+ /** A `typeMappingCode` from the dictionary: 71 健身房, 72 SPA, 73 游泳池 … */
52
+ childClassCode?: number;
53
+ childClassNameDesc?: string;
54
+ };
55
+ export type HotelPhoto = {
56
+ fileName?: string;
57
+ fileTitle?: string;
58
+ fileFormat?: string;
59
+ /** '1' 综合设施 … 'ImagePhoto' 外观 · 'RoomType' 房型 (then `typeMappingCode` is the room type code) */
60
+ typeCode?: string;
61
+ typeMappingCode?: string;
62
+ descript?: string;
63
+ /** Smaller is earlier. */
64
+ sortId?: number;
65
+ fileUrl?: string;
66
+ /** 1 启用 · 0 禁用 */
67
+ status?: number;
68
+ };
69
+ export type HotelTraffic = {
70
+ destinationType?: string;
71
+ destinationTypeName?: string;
72
+ destinationName?: string;
73
+ destinationDistance?: string;
74
+ trafficTips?: string;
75
+ };
76
+ /** POST /hotel */
77
+ export type HotelStatic = {
78
+ hotelId: string;
79
+ hotelName: string;
80
+ hotelNameEn?: string;
81
+ brandCode?: number;
82
+ brandName?: string;
83
+ provinceNo?: string;
84
+ provinceName?: string;
85
+ cityNo?: string;
86
+ cityName?: string;
87
+ countyNo?: string;
88
+ countyName?: string;
89
+ hotelAddress?: string;
90
+ hotelAddressEn?: string;
91
+ hotelAddressTip?: string;
92
+ telephone?: string;
93
+ phoneCode?: string;
94
+ roomNum?: number;
95
+ hotelWordIntroduce?: string;
96
+ longitude?: string;
97
+ latitude?: string;
98
+ openingDate?: HuazhuDate;
99
+ overhaulTime?: HuazhuDate;
100
+ email?: string;
101
+ /** false 国内酒店 · true 国际酒店 */
102
+ international?: boolean;
103
+ /** ISO-4217. Absent on the domestic example's siblings - CNY then. */
104
+ tradeCurrency?: string;
105
+ hotelRoomTypeList?: HotelRoomType[];
106
+ hotelServiceList?: HotelService[];
107
+ hotelPhotoList?: HotelPhoto[];
108
+ hotelTrafficList?: HotelTraffic[];
109
+ };
110
+ export type CheckinType = 'DAY' | 'HOUR';
111
+ export type StayWindow = {
112
+ startDate?: string;
113
+ endDate?: string;
114
+ excludedDate?: string[];
115
+ /** Seven characters from SUNDAY, '1' on. Empty means every day. */
116
+ weekControl?: string;
117
+ eachDayCheckinStartTime?: string;
118
+ eachDayCheckinEndTime?: string;
119
+ eachDayCheckoutEndTime?: string;
120
+ override?: StayWindow[];
121
+ };
122
+ export type BookWindow = {
123
+ /** The first ARRIVAL date this rate may be booked for. */
124
+ startDate?: string;
125
+ endDate?: string;
126
+ excludedDate?: string[];
127
+ /** The time of day it may be BOOKED at - a night-snack rate opens at 20:00. */
128
+ eachDayStartTime?: string;
129
+ eachDayEndTime?: string;
130
+ override?: BookWindow[];
131
+ };
132
+ /** One sellable thing: a room type under one rate code. */
133
+ export type Product = {
134
+ roomTypeCode: string;
135
+ roomTypeName: string;
136
+ rateCode: string;
137
+ rateCodeName?: string;
138
+ checkinType: CheckinType;
139
+ /** Promotions book at most 3 rooms, list rates at most 10. */
140
+ promotion: boolean;
141
+ promotionCode?: string;
142
+ stayWindow?: StayWindow;
143
+ bookWindow?: BookWindow;
144
+ hourage?: number;
145
+ /** See `GATED_TAGS`: some rates may only be shown to some guests, by contract. */
146
+ tags?: string[];
147
+ occupancy?: {
148
+ maxAdult?: number;
149
+ maxChild?: number;
150
+ maxOccupancy: number;
151
+ };
152
+ };
153
+ /** POST /ari/products */
154
+ export type ProductsContent = {
155
+ hotelId: string;
156
+ products?: Product[];
157
+ /** How far ahead ARI can be asked for. 90 in the example. */
158
+ sellDays: number;
159
+ };
160
+ export type RateInfo = {
161
+ rackRate?: number[];
162
+ amountBeforeTax?: number[];
163
+ amountAfterTax: number[];
164
+ /**
165
+ * The price for up to this many adults. "仅返回maxAdultCount为3,则1 2人价与3相同" -
166
+ * one entry of 3 prices one, two and three adults alike.
167
+ */
168
+ maxAdultCount: number;
169
+ maxChildCount?: number;
170
+ childAges?: number[];
171
+ };
172
+ /** Every list is one element per DATE of the asked range. `null` in a list means "no limit". */
173
+ export type Restriction = {
174
+ close: (boolean | null)[];
175
+ minStayArrival: (number | null)[];
176
+ maxStayArrival: (number | null)[];
177
+ minStayThrough: (number | null)[];
178
+ maxStayThrough: (number | null)[];
179
+ minAdvanceDay: (number | null)[];
180
+ maxAdvanceDay: (number | null)[];
181
+ cta: (boolean | null)[];
182
+ ctd: (boolean | null)[];
183
+ fplos: (string | null)[];
184
+ };
185
+ export type DailyOffer = {
186
+ roomTypeCode: string;
187
+ rateCode: string;
188
+ currencyCode: string;
189
+ rates: RateInfo[];
190
+ /** BB BF HB FB AI RO */
191
+ mealPlanType: string;
192
+ /** Per date: how many of that meal. */
193
+ mealPlanCounts: (number | null)[];
194
+ restriction: Restriction;
195
+ /** Per date. The ARRIVAL date's is the one a booking is made under. */
196
+ guaranteePolicies: {
197
+ code: string;
198
+ }[];
199
+ /** Per date. The ARRIVAL date's is the one a booking is made under. */
200
+ cancelPolicies: {
201
+ code: string;
202
+ }[];
203
+ };
204
+ /** POST /ari/daily/offers - at most 30 dates a call, both ends included. */
205
+ export type OffersContent = {
206
+ hotelId: string;
207
+ startDate: string;
208
+ endDate: string;
209
+ dailyOffers: DailyOffer[];
210
+ };
211
+ /** POST /ari/daily/inventory - at most 30 dates a call, both ends included. */
212
+ export type InventoryContent = {
213
+ hotelId: string;
214
+ startDate: string;
215
+ endDate: string;
216
+ dailyInventories: {
217
+ roomTypeCode: string;
218
+ rateCode: string;
219
+ inventories: (number | null)[];
220
+ }[];
221
+ };
222
+ export type ProductCandidate = {
223
+ roomTypeCode: string;
224
+ rateCode: string;
225
+ };
226
+ /**
227
+ * How the stay is settled - chosen by the distributor, and allowed only where
228
+ * the arrival date's guarantee code allows it (`PAYMENT_FOR_GUARANTEE`).
229
+ *
230
+ * NGPL 无担保到店付 - nobody guarantees it; the guest pays at the hotel
231
+ * OGPL 中介担保到店付 - WE guarantee it; the guest pays at the hotel
232
+ * OPN 中介预付 - we pay Huazhu; the guest paid us
233
+ * CCPL/CCPN - a credit card number goes on the reservation
234
+ * CPN 信用住预付
235
+ */
236
+ export type PaymentType = 'NGPL' | 'OGPL' | 'OPN' | 'CCPL' | 'CCPN' | 'CPN';
237
+ /** The rate's guarantee code → the payment types it accepts (the dictionary's own table). */
238
+ export declare const PAYMENT_FOR_GUARANTEE: Record<string, PaymentType[]>;
239
+ export type ContactPerson = {
240
+ firstName?: string;
241
+ /** Required, 16 characters. "姓、名无区分时,可把姓名传至此字段". */
242
+ lastName: string;
243
+ /** 32 characters at most. */
244
+ email?: string;
245
+ phone?: string;
246
+ countryAccessCode?: string;
247
+ roomIndex?: string;
248
+ };
249
+ export type ReservationLine = {
250
+ roomTypeCode: string;
251
+ rateCode: string;
252
+ checkin: string;
253
+ checkout: string;
254
+ rackRate?: number[];
255
+ amountBeforeTax?: number[];
256
+ /** One per night, check-out excluded. */
257
+ amountAfterTax: number[];
258
+ currencyCode: string;
259
+ roomCount: number;
260
+ /** Per room. */
261
+ adultCount: number;
262
+ childCount?: number;
263
+ childAges?: number[];
264
+ };
265
+ /** POST /reservation/prebook */
266
+ export type PrebookRequest = {
267
+ hotelId: string;
268
+ checkinType: CheckinType;
269
+ /** "暂只支持单酒店,单产品的预订,集合只需传1个" */
270
+ reservations: [ReservationLine];
271
+ paymentType: PaymentType;
272
+ };
273
+ export type ReservationAri = {
274
+ checkin: string;
275
+ checkout: string;
276
+ roomTypeCode: string;
277
+ rateCode: string;
278
+ currencyCode: string;
279
+ mealPlanType: string;
280
+ mealPlanCounts: (number | null)[];
281
+ inventories: (number | null)[];
282
+ rates: RateInfo[];
283
+ restriction: Restriction;
284
+ guaranteePolicies: {
285
+ code: string;
286
+ }[];
287
+ cancelPolicies: {
288
+ code: string;
289
+ }[];
290
+ };
291
+ export type PrebookContent = {
292
+ hotelId: string;
293
+ /** Only on success. Passed to /reservation/book with the same request, the price is not checked again. */
294
+ preBookToken?: string;
295
+ /** On success AND on a refusal - a refusal carries the price and rooms as they are now. */
296
+ reservationsAri?: ReservationAri[];
297
+ };
298
+ /** POST /reservation/book */
299
+ export type BookRequest = {
300
+ hotelId: string;
301
+ checkinType: CheckinType;
302
+ contactPerson: ContactPerson;
303
+ reservations: [
304
+ ReservationLine & {
305
+ guaranteePolicyCode: string;
306
+ /** HH:mm, default 12:00. */
307
+ estimatedArrivalTime?: string;
308
+ resGuest?: ContactPerson[];
309
+ }
310
+ ];
311
+ /**
312
+ * OURS, and permanently idempotent: distributorId + distributorResId is one
313
+ * booking forever. A retry with the same id cannot make a second one - which
314
+ * is what makes a retry after a network error safe at all.
315
+ */
316
+ distributorResId: string;
317
+ paymentType: PaymentType;
318
+ /** 512 characters; neither `|` nor `'`. */
319
+ guestComment?: string;
320
+ hotelComment?: string;
321
+ memberId?: string;
322
+ preBookToken?: string;
323
+ };
324
+ export type BookContent = {
325
+ resId: string;
326
+ resCode?: string;
327
+ };
328
+ /** HOTEL_FAILED is only ever seen from the consistency query. */
329
+ export type OrderStatus = 'HOTEL_RESERVATION' | 'HOTEL_CANCEL' | 'HOTEL_ROOM_CHECK_IN' | 'HOTEL_COMPLETE' | 'HOTEL_NO_SHOW' | 'HOTEL_ROOM_CHECK_OUT' | 'HOTEL_FAILED';
330
+ /** POST /reservation/detail */
331
+ export type ReservationDetail = {
332
+ hotelId: string;
333
+ checkInType?: CheckinType;
334
+ reservations: (ReservationLine & {
335
+ guaranteePolicyCode: string;
336
+ cancelPolicyCode: string;
337
+ estimatedArrivalTime?: string;
338
+ })[];
339
+ distributorResId: string;
340
+ paymentType: PaymentType;
341
+ guestComment?: string;
342
+ resId: string;
343
+ resCode?: string;
344
+ bookingTime: number;
345
+ status: OrderStatus;
346
+ };
347
+ /** POST /reservation/cancel */
348
+ export type CancelContent = {
349
+ penaltyAmount?: number;
350
+ penaltyCurrencyCode?: string;
351
+ };
352
+ /** POST /reservation/consistency/query - only after a network error on /reservation/book. */
353
+ export type ConsistencyContent = {
354
+ resId: string;
355
+ status: OrderStatus;
356
+ };
357
+ /** The global codes, any endpoint. */
358
+ export declare const CODES: {
359
+ readonly systemError: 2001;
360
+ readonly invalidToken: 2002;
361
+ readonly invalidDistributor: 2003;
362
+ readonly requiredField: 2004;
363
+ readonly invalidField: 2005;
364
+ readonly fieldFormat: 2006;
365
+ readonly hotelNotCooperating: 2007;
366
+ readonly invalidProduct: 2008;
367
+ readonly rateLimited: 2009;
368
+ };
369
+ /** "请求次数超过每日限制" - /hotels and /hotel. The catalog stops and resumes tomorrow. */
370
+ export declare const DAILY_LIMIT: Set<number>;
371
+ /** Nothing matched - an empty answer, not a failure. */
372
+ export declare const NO_MATCH: Set<number>;
373
+ /** "Hotel is closed" / "Invalid hotel Id" - the hotel is not sellable, from any endpoint. */
374
+ export declare const HOTEL_GONE: Set<number>;
375
+ /**
376
+ * Codes after which /reservation/book is retried with the SAME
377
+ * distributorResId - the documentation's own list ("下单失败,重试建议的异常码").
378
+ */
379
+ export declare const BOOK_RETRYABLE: Set<2001 | 2002>;
380
+ /**
381
+ * Rate tags that decide WHO may see a rate. "相关使用逻辑务必遵守商务约定,未遵守导致的
382
+ * 损失需承担相应责任" - a rate for students, first-time guests or coupon holders
383
+ * shown to anyone is a loss the contract puts on us. None of them is offered
384
+ * unless the deployment's config lets it through by name.
385
+ */
386
+ export declare const GATED_TAGS: Set<string>;
387
+ /** Meal plans that put a meal on the rate. RO is room only. */
388
+ export declare const MEAL_PLANS: Record<string, string>;
389
+ //# sourceMappingURL=wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/huazhu/wire.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ // Huazhu's distributor OpenAPI, as its documentation describes it - the wire
2
+ // shapes and the codes, nothing else.
3
+ //
4
+ // Source: https://docs.huazhu.com/crs/api/distributor/docs/v1/ (read in full
5
+ // 2026-09-30, before any account existed). Every field here is copied from a
6
+ // table on those pages; where a table and its own example disagree, the
7
+ // example is what a server actually sent and both are accepted - see
8
+ // `HuazhuDate`.
9
+ //
10
+ // ⚠️ NOTHING HERE HAS BEEN SEEN FROM A REAL HUAZHU SERVER YET. The shapes are
11
+ // the documentation's. The first call against the test environment is where
12
+ // they are checked, and anything that disagrees is fixed HERE, in one place.
13
+ export const SUCCESS = 1000;
14
+ /** The rate's guarantee code → the payment types it accepts (the dictionary's own table). */
15
+ export const PAYMENT_FOR_GUARANTEE = {
16
+ PL: ['NGPL', 'OGPL', 'CCPL'],
17
+ GTX: ['OGPL', 'OPN', 'CCPL', 'CPN'],
18
+ PN: ['OPN', 'CCPN', 'CPN'],
19
+ };
20
+ // ------------------------------------------------------------------ codes ----
21
+ /** The global codes, any endpoint. */
22
+ export const CODES = {
23
+ systemError: 2001,
24
+ invalidToken: 2002,
25
+ invalidDistributor: 2003,
26
+ requiredField: 2004,
27
+ invalidField: 2005,
28
+ fieldFormat: 2006,
29
+ hotelNotCooperating: 2007,
30
+ invalidProduct: 2008,
31
+ rateLimited: 2009,
32
+ };
33
+ /** "请求次数超过每日限制" - /hotels and /hotel. The catalog stops and resumes tomorrow. */
34
+ export const DAILY_LIMIT = new Set([3102, 3204]);
35
+ /** Nothing matched - an empty answer, not a failure. */
36
+ export const NO_MATCH = new Set([3101, 4103, 4206, 4306]);
37
+ /** "Hotel is closed" / "Invalid hotel Id" - the hotel is not sellable, from any endpoint. */
38
+ export const HOTEL_GONE = new Set([
39
+ 3201, 3202, 3203, 4101, 4102, 4201, 4202, 4304, 4305, 5104, 5105, 5204, 5205,
40
+ ]);
41
+ /**
42
+ * Codes after which /reservation/book is retried with the SAME
43
+ * distributorResId - the documentation's own list ("下单失败,重试建议的异常码").
44
+ */
45
+ export const BOOK_RETRYABLE = new Set([CODES.systemError, CODES.invalidToken]);
46
+ /**
47
+ * Rate tags that decide WHO may see a rate. "相关使用逻辑务必遵守商务约定,未遵守导致的
48
+ * 损失需承担相应责任" - a rate for students, first-time guests or coupon holders
49
+ * shown to anyone is a loss the contract puts on us. None of them is offered
50
+ * unless the deployment's config lets it through by name.
51
+ */
52
+ export const GATED_TAGS = new Set([
53
+ 'PrePayCoupons',
54
+ 'FirstStayDiscount',
55
+ 'BrandNewCustomerDiscount',
56
+ 'StudnetDiscount',
57
+ 'DistrVipDiscount',
58
+ 'PassengerRate',
59
+ 'DistrCoupons',
60
+ 'CityBrandNewCustomerDiscount',
61
+ 'ConnectivityFreeRoom',
62
+ 'MediaPrePayCoupons',
63
+ ]);
64
+ /** Meal plans that put a meal on the rate. RO is room only. */
65
+ export const MEAL_PLANS = {
66
+ BB: 'Breakfast',
67
+ BF: 'Buffet breakfast',
68
+ HB: 'Half board',
69
+ FB: 'Full board',
70
+ AI: 'All inclusive',
71
+ };
72
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/huazhu/wire.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,sCAAsC;AACtC,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,wEAAwE;AACxE,qEAAqE;AACrE,gBAAgB;AAChB,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,6EAA6E;AAY7E,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC;AA8O5B,6FAA6F;AAC7F,MAAM,CAAC,MAAM,qBAAqB,GAAkC;IAClE,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAC5B,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;IACnC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;CAC3B,CAAC;AA6HF,gFAAgF;AAEhF,sCAAsC;AACtC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,IAAI;IAClB,kBAAkB,EAAE,IAAI;IACxB,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,IAAI;IAClB,WAAW,EAAE,IAAI;IACjB,mBAAmB,EAAE,IAAI;IACzB,cAAc,EAAE,IAAI;IACpB,WAAW,EAAE,IAAI;CACT,CAAC;AAEX,iFAAiF;AACjF,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEjD,wDAAwD;AACxD,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAE1D,6FAA6F;AAC7F,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IAChC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC7E,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;AAE/E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IAChC,eAAe;IACf,mBAAmB;IACnB,0BAA0B;IAC1B,iBAAiB;IACjB,kBAAkB;IAClB,eAAe;IACf,cAAc;IACd,8BAA8B;IAC9B,sBAAsB;IACtB,oBAAoB;CACrB,CAAC,CAAC;AAEH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,UAAU,GAA2B;IAChD,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,kBAAkB;IACtB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,eAAe;CACpB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { serve } from '@hono/node-server';
3
+ import { checkHuazhu } from './huazhu/check.js';
3
4
  import { VERSION, buildServer, loadConfig } from './server.js';
4
5
  // The binary. Everything it does is in server.ts; this reads the environment,
5
6
  // starts listening, and says what it is serving.
@@ -7,17 +8,30 @@ import { VERSION, buildServer, loadConfig } from './server.js';
7
8
  // The config path is an argument or an environment variable, never a default
8
9
  // that points at one brand's file - a connector that falls back to Shangri-La's
9
10
  // data is a connector that serves the wrong hotels to the next group.
10
- const path = process.argv[2] ?? process.env.HOTEL_CONFIG;
11
+ //
12
+ // `--check <config.json>` does not serve: it walks a group's own API read-only
13
+ // and says what came back - see huazhu/check.ts.
14
+ const checking = process.argv[2] === '--check';
15
+ const path = (checking ? process.argv[3] : process.argv[2]) ?? process.env.HOTEL_CONFIG;
11
16
  if (!path) {
12
- console.error('usage: curless-hotel-storefront <config.json> (or HOTEL_CONFIG=...)');
17
+ console.error('usage: curless-hotel-storefront [--check] <config.json> (or HOTEL_CONFIG=...)');
13
18
  process.exit(2);
14
19
  }
15
20
  const { config, configPath } = loadConfig(path);
16
- const { app, brand } = buildServer({ config, configPath });
21
+ if (checking) {
22
+ const api = config.data.api;
23
+ if (config.data.source !== 'api' || !api) {
24
+ console.error(`${config.brand}: --check is for a config whose data.source is "api"`);
25
+ process.exit(2);
26
+ }
27
+ const ok = await checkHuazhu(api, process.env);
28
+ process.exit(ok ? 0 : 1);
29
+ }
30
+ const { app, brand, deps } = buildServer({ config, configPath });
17
31
  const port = Number(process.env.PORT ?? 8790);
18
32
  serve({ fetch: app.fetch, port }, (info) => {
19
33
  console.log(`${config.server.title} — ${brand.vocab.demo ? 'DEMONSTRATION DATA' : 'live'} — hotel-storefront ${VERSION} on :${info.port}`);
20
34
  console.log(` mcp POST ${config.urls.publicUrl ?? config.urls.appUrl}/mcp`);
21
- console.log(` tools ${Object.values(brand.tools).join(', ')}`);
35
+ console.log(` tools ${[...(deps.offered ?? Object.values(brand.tools))].join(', ')}`);
22
36
  });
23
37
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE/D,8EAA8E;AAC9E,iDAAiD;AACjD,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,sEAAsE;AAEtE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AACzD,IAAI,CAAC,IAAI,EAAE,CAAC;IACV,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;IACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;AAChD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAE9C,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;IACzC,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,uBAAuB,OAAO,QAAQ,IAAI,CAAC,IAAI,EAAE,CAC9H,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE/D,8EAA8E;AAC9E,iDAAiD;AACjD,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,sEAAsE;AACtE,EAAE;AACF,+EAA+E;AAC/E,iDAAiD;AAEjD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;AAC/C,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AACxF,IAAI,CAAC,IAAI,EAAE,CAAC;IACV,OAAO,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAC;IACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;AAEhD,IAAI,QAAQ,EAAE,CAAC;IACb,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC5B,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,sDAAsD,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AACjE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAE9C,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;IACzC,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,uBAAuB,OAAO,QAAQ,IAAI,CAAC,IAAI,EAAE,CAC9H,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3F,CAAC,CAAC,CAAC"}
package/dist/legal.d.ts CHANGED
@@ -1,5 +1,6 @@
1
+ import { type BackendCapabilities } from './backend.js';
1
2
  import type { HotelConfig } from './config.js';
2
- export declare const docsPage: (config: HotelConfig) => string;
3
- export declare const privacyPage: (config: HotelConfig, imageHosts?: string[]) => string;
4
- export declare const termsPage: (config: HotelConfig) => string;
3
+ export declare const docsPage: (config: HotelConfig, caps?: BackendCapabilities) => string;
4
+ export declare const privacyPage: (config: HotelConfig, imageHosts?: string[], caps?: BackendCapabilities) => string;
5
+ export declare const termsPage: (config: HotelConfig, caps?: BackendCapabilities) => string;
5
6
  //# sourceMappingURL=legal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"legal.d.ts","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAoE/C,eAAO,MAAM,QAAQ,GAAI,QAAQ,WAAW,KAAG,MAgC5C,CAAC;AAEJ,eAAO,MAAM,WAAW,GAAI,QAAQ,WAAW,EAAE,aAAY,MAAM,EAAO,KAAG,MA2E1E,CAAC;AAEJ,eAAO,MAAM,SAAS,GAAI,QAAQ,WAAW,KAAG,MA2B7C,CAAC"}
1
+ {"version":3,"file":"legal.d.ts","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAqB,MAAM,cAAc,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA8F/C,eAAO,MAAM,QAAQ,GACnB,QAAQ,WAAW,EACnB,OAAM,mBAAuC,KAC5C,MA0CA,CAAC;AAEJ,eAAO,MAAM,WAAW,GACtB,QAAQ,WAAW,EACnB,aAAY,MAAM,EAAO,EACzB,OAAM,mBAAuC,KAC5C,MAmFA,CAAC;AAEJ,eAAO,MAAM,SAAS,GACpB,QAAQ,WAAW,EACnB,OAAM,mBAAuC,KAC5C,MAiCA,CAAC"}