@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,365 @@
1
+ import { addDays, nights } from '../dates.js';
2
+ import { feeFor, parseCancelPolicy, penaltyAt } from './cancel-policy.js';
3
+ export const createFakeHuazhu = (opts) => {
4
+ const distributorId = opts.distributorId ?? 'CURLESS';
5
+ const basic = Buffer.from(`${opts.clientId ?? 'cid'}:${opts.secret ?? 'sec'}`).toString('base64');
6
+ let token = '';
7
+ // Huazhu keeps the previous token working for 120 seconds after issuing a new
8
+ // one, so two processes sharing an account (the service and a `--check`) do
9
+ // not knock each other's calls out.
10
+ let previous;
11
+ let tokens = 0;
12
+ const fails = [];
13
+ const bookings = new Map((opts.state?.bookings ?? []).map((b) => [b.resId, b]));
14
+ const calls = [];
15
+ const held = new Map(opts.state?.held ?? []);
16
+ let resSeq = opts.state?.resSeq ?? 1000;
17
+ const envelope = (code, content, message = code === 1000 ? 'Success' : 'Error', responseDes = '') => new Response(JSON.stringify({ code, ...(content !== undefined ? { content } : {}), message, responseDes }), {
18
+ status: 200,
19
+ headers: { 'content-type': 'application/json' },
20
+ });
21
+ const today = () => new Date(opts.now() + 8 * 3_600_000).toISOString().slice(0, 10);
22
+ const dates = (start, end) => {
23
+ const out = [];
24
+ for (let d = start; d <= end; d = addDays(d, 1))
25
+ out.push(d);
26
+ return out;
27
+ };
28
+ const key = (hotelId, p) => `${hotelId}|${p.roomTypeCode}|${p.rateCode}`;
29
+ const left = (hotelId, r, d) => Math.max(0, (r.inventory?.(d) ?? 5) - (held.get(`${key(hotelId, r.product)}|${d}`) ?? 0));
30
+ const offerOf = (hotelId, r, days) => {
31
+ const restriction = {
32
+ close: days.map((d) => r.restriction?.close?.(d) ?? false),
33
+ minStayArrival: days.map((d) => r.restriction?.minStayArrival?.(d) ?? null),
34
+ maxStayArrival: days.map((d) => r.restriction?.maxStayArrival?.(d) ?? 999),
35
+ minStayThrough: days.map((d) => r.restriction?.minStayThrough?.(d) ?? 0),
36
+ maxStayThrough: days.map((d) => r.restriction?.maxStayThrough?.(d) ?? 0),
37
+ minAdvanceDay: days.map((d) => r.restriction?.minAdvanceDay?.(d) ?? null),
38
+ maxAdvanceDay: days.map((d) => r.restriction?.maxAdvanceDay?.(d) ?? 999),
39
+ cta: days.map((d) => r.restriction?.cta?.(d) ?? false),
40
+ ctd: days.map((d) => r.restriction?.ctd?.(d) ?? false),
41
+ fplos: days.map((d) => r.restriction?.fplos?.(d) ?? null),
42
+ };
43
+ void hotelId;
44
+ return {
45
+ roomTypeCode: r.product.roomTypeCode,
46
+ rateCode: r.product.rateCode,
47
+ currencyCode: 'CNY',
48
+ rates: [
49
+ {
50
+ maxAdultCount: r.adults ?? 2,
51
+ amountAfterTax: days.map((d) => r.price(d)),
52
+ ...(r.before ? { amountBeforeTax: days.map((d) => r.before?.(d) ?? 0) } : {}),
53
+ },
54
+ ],
55
+ mealPlanType: r.meal?.type ?? 'RO',
56
+ mealPlanCounts: days.map(() => r.meal?.count ?? 0),
57
+ restriction,
58
+ guaranteePolicies: days.map(() => ({ code: r.guarantee ?? 'PL' })),
59
+ cancelPolicies: days.map(() => ({ code: r.cancel ?? '6PM1D1N_100P' })),
60
+ };
61
+ };
62
+ const handle = async (url, init) => {
63
+ const path = url.pathname;
64
+ const headers = Object.fromEntries(new Headers(init.headers).entries());
65
+ const body = init.body ? JSON.parse(String(init.body)) : undefined;
66
+ calls.push({ path, body, headers });
67
+ const f = fails.find((x) => x.path === path);
68
+ let passedOver = false;
69
+ if (f && (f.skip ?? 0) > 0) {
70
+ f.skip = (f.skip ?? 0) - 1;
71
+ passedOver = true;
72
+ }
73
+ else if (f && f.kind !== 'answer-lost') {
74
+ f.times = (f.times ?? 1) - 1;
75
+ if (f.times <= 0)
76
+ fails.splice(fails.indexOf(f), 1);
77
+ if (f.kind === 'unreachable')
78
+ throw new TypeError('fetch failed: ECONNRESET');
79
+ if (f.kind === 'http502')
80
+ return new Response('bad gateway', { status: 502 });
81
+ return envelope(f.kind, undefined, 'Injected', 'injected by the test');
82
+ }
83
+ if (path === '/oauth/token') {
84
+ if (headers.authorization !== `Basic ${basic}`)
85
+ return new Response('{"error":"invalid_client"}', { status: 401 });
86
+ if (token)
87
+ previous = { token, until: opts.now() + 120_000 };
88
+ tokens += 1;
89
+ token = `tok-${tokens}`;
90
+ return new Response(JSON.stringify({
91
+ access_token: token,
92
+ token_type: 'Bearer',
93
+ expires_in: 3600,
94
+ scope: 'ALL',
95
+ }), { status: 200 });
96
+ }
97
+ // Every business call: the four headers, and the current token.
98
+ if (headers.distributorid !== distributorId)
99
+ return envelope(2003, undefined, 'Invalid distributor ID');
100
+ if (!headers.timestamp || !headers.traceid)
101
+ return envelope(2004, undefined, 'Required field missing', 'timestamp/traceId');
102
+ const bearer = headers.authorization;
103
+ const current = bearer === `Bearer ${token}`;
104
+ const graced = !!previous && bearer === `Bearer ${previous.token}` && opts.now() < previous.until;
105
+ if (!current && !graced)
106
+ return envelope(2002, undefined, 'Invalid token');
107
+ const hotel = (id) => opts.hotels.find((h) => h.hotelId === id);
108
+ switch (path) {
109
+ case '/hotels':
110
+ return envelope(1000, opts.hotels.map((h) => ({ hotelId: h.hotelId, hotelName: h.hotelName })));
111
+ case '/hotel': {
112
+ const h = hotel(body.hotelId);
113
+ return h ? envelope(1000, h) : envelope(3201, undefined, 'Invalid hotel Id');
114
+ }
115
+ case '/ari/products': {
116
+ if (!hotel(body.hotelId))
117
+ return envelope(4101, undefined, 'Invalid hotel Id');
118
+ return envelope(1000, {
119
+ hotelId: body.hotelId,
120
+ sellDays: 90,
121
+ products: (opts.rates[body.hotelId] ?? []).map((r) => r.product),
122
+ });
123
+ }
124
+ case '/ari/daily/offers':
125
+ case '/ari/daily/inventory': {
126
+ if (!hotel(body.hotelId))
127
+ return envelope(path.endsWith('offers') ? 4201 : 4304, undefined, 'Invalid hotel Id');
128
+ if (!body.checkinType)
129
+ return envelope(2004, undefined, 'Required field missing', 'checkinType');
130
+ if (nights(body.startDate, body.endDate) > 29 || body.endDate < body.startDate)
131
+ return envelope(path.endsWith('offers') ? 4203 : 4301, undefined, 'Start date and end date does not match the rules');
132
+ if (body.startDate < addDays(today(), -1))
133
+ return envelope(path.endsWith('offers') ? 4205 : 4303, undefined, 'Start date is invalid');
134
+ const days = dates(body.startDate, body.endDate);
135
+ const rates = opts.rates[body.hotelId] ?? [];
136
+ if (path.endsWith('offers')) {
137
+ return envelope(1000, {
138
+ hotelId: body.hotelId,
139
+ startDate: body.startDate,
140
+ endDate: body.endDate,
141
+ dailyOffers: rates.map((r) => offerOf(body.hotelId, r, days)),
142
+ });
143
+ }
144
+ return envelope(1000, {
145
+ hotelId: body.hotelId,
146
+ startDate: body.startDate,
147
+ endDate: body.endDate,
148
+ dailyInventories: rates.map((r) => ({
149
+ roomTypeCode: r.product.roomTypeCode,
150
+ rateCode: r.product.rateCode,
151
+ inventories: days.map((d) => left(body.hotelId, r, d)),
152
+ })),
153
+ });
154
+ }
155
+ case '/reservation/prebook':
156
+ case '/reservation/book': {
157
+ const req = body;
158
+ const booking = path.endsWith('book') && !path.endsWith('prebook');
159
+ if (booking) {
160
+ if (!req.distributorResId)
161
+ return envelope(2004, undefined, 'Required field missing', 'distributorResId');
162
+ const had = [...bookings.values()].find((b) => b.distributorResId === req.distributorResId);
163
+ if (had)
164
+ return envelope(5218, undefined, 'DistributorResId already exist');
165
+ if (!req.contactPerson?.lastName || req.contactPerson.lastName.length > 16)
166
+ return envelope(2005, undefined, 'Invalid field', 'contactPerson.lastName');
167
+ }
168
+ const line = req.reservations?.[0];
169
+ if (!line)
170
+ return envelope(2004, undefined, 'Required field missing', 'reservations');
171
+ const r = (opts.rates[req.hotelId] ?? []).find((x) => x.product.roomTypeCode === line.roomTypeCode && x.product.rateCode === line.rateCode);
172
+ if (!r)
173
+ return envelope(booking ? 5236 : 5123, undefined, 'No match found');
174
+ const nightsOf = dates(line.checkin, addDays(line.checkout, -1));
175
+ const want = nightsOf.map((d) => r.price(d));
176
+ const priceOk = want.length === line.amountAfterTax.length &&
177
+ want.every((x, i) => x === line.amountAfterTax[i]);
178
+ const ari = {
179
+ checkin: line.checkin,
180
+ checkout: line.checkout,
181
+ ...offerOf(req.hotelId, r, nightsOf),
182
+ inventories: nightsOf.map((d) => left(req.hotelId, r, d)),
183
+ };
184
+ if (!priceOk)
185
+ return envelope(booking ? 5209 : 5108, { hotelId: req.hotelId, reservationsAri: [ari] }, 'Price incorrect for room');
186
+ if (nightsOf.some((d) => left(req.hotelId, r, d) < line.roomCount))
187
+ return envelope(booking ? 5210 : 5109, { hotelId: req.hotelId, reservationsAri: [ari] }, 'No rooms available for requested dates');
188
+ const guarantee = r.guarantee ?? 'PL';
189
+ const allowed = {
190
+ PL: ['NGPL', 'OGPL', 'CCPL'],
191
+ GTX: ['OGPL', 'OPN', 'CCPL', 'CPN'],
192
+ PN: ['OPN', 'CCPN', 'CPN'],
193
+ };
194
+ if (!(allowed[guarantee] ?? []).includes(req.paymentType))
195
+ return envelope(booking ? 5211 : 5114, undefined, 'Payment type invalid');
196
+ if (!booking)
197
+ return envelope(1000, {
198
+ hotelId: req.hotelId,
199
+ preBookToken: `PB${calls.length}`,
200
+ reservationsAri: [ari],
201
+ });
202
+ resSeq += 1;
203
+ const resId = `R${req.hotelId}${resSeq}`;
204
+ for (const d of nightsOf) {
205
+ const k = `${key(req.hotelId, r.product)}|${d}`;
206
+ held.set(k, (held.get(k) ?? 0) + line.roomCount);
207
+ }
208
+ bookings.set(resId, {
209
+ resId,
210
+ distributorResId: req.distributorResId,
211
+ request: req,
212
+ status: 'HOTEL_RESERVATION',
213
+ cancelCode: r.cancel ?? '6PM1D1N_100P',
214
+ });
215
+ const lost = passedOver
216
+ ? undefined
217
+ : fails.find((x) => x.path === path && x.kind === 'answer-lost');
218
+ if (lost) {
219
+ fails.splice(fails.indexOf(lost), 1);
220
+ throw new TypeError('fetch failed: read timeout');
221
+ }
222
+ return envelope(1000, { resId, resCode: `RC${resSeq}` });
223
+ }
224
+ case '/reservation/detail': {
225
+ const b = bookings.get(body.resId);
226
+ if (!b)
227
+ return envelope(5302, undefined, 'Reservation not found');
228
+ const line = b.request.reservations[0];
229
+ return envelope(1000, {
230
+ hotelId: b.request.hotelId,
231
+ checkInType: 'DAY',
232
+ paymentType: b.request.paymentType,
233
+ distributorResId: b.distributorResId,
234
+ resId: b.resId,
235
+ status: b.status,
236
+ bookingTime: opts.now(),
237
+ reservations: [
238
+ {
239
+ ...line,
240
+ cancelPolicyCode: b.cancelCode,
241
+ estimatedArrivalTime: line.estimatedArrivalTime ?? '12:00',
242
+ },
243
+ ],
244
+ });
245
+ }
246
+ case '/reservation/cancel': {
247
+ const b = bookings.get(body.resId);
248
+ if (!b)
249
+ return envelope(5403, undefined, 'Reservation not found');
250
+ if (b.status === 'HOTEL_CANCEL')
251
+ return envelope(5402, undefined, 'Reservation already cancelled');
252
+ const line = b.request.reservations[0];
253
+ // The fee the rate's own terms put on cancelling now - what Huazhu
254
+ // answers with, and what the connector reports after cancelling.
255
+ const policy = parseCancelPolicy(b.cancelCode);
256
+ const penalty = policy
257
+ ? penaltyAt(policy, line.checkin, 'Asia/Shanghai', opts.now())
258
+ : { kind: 'none' };
259
+ const fee = feeFor(penalty, {
260
+ currency: 'CNY',
261
+ nightlyMinor: line.amountAfterTax.map((x) => Math.round(x * 100)),
262
+ rooms: line.roomCount,
263
+ });
264
+ if (fee === null)
265
+ return envelope(5401, undefined, 'Reservation cannot be cancelled');
266
+ b.status = 'HOTEL_CANCEL';
267
+ for (const d of dates(line.checkin, addDays(line.checkout, -1))) {
268
+ const k = `${b.request.hotelId}|${line.roomTypeCode}|${line.rateCode}|${d}`;
269
+ held.set(k, Math.max(0, (held.get(k) ?? 0) - line.roomCount));
270
+ }
271
+ return envelope(1000, { penaltyAmount: fee / 100, penaltyCurrencyCode: 'CNY' });
272
+ }
273
+ case '/reservation/consistency/query': {
274
+ const b = [...bookings.values()].find((x) => x.distributorResId === body.distributorResId);
275
+ return b
276
+ ? envelope(1000, { resId: b.resId, status: b.status })
277
+ : envelope(5602, undefined, 'Reservation not found');
278
+ }
279
+ default:
280
+ return new Response('not found', { status: 404 });
281
+ }
282
+ };
283
+ return {
284
+ fetch: (async (input, init) => handle(new URL(typeof input === 'string' ? input : input instanceof URL ? input.href : input.url), init ?? {})),
285
+ calls,
286
+ bookings,
287
+ /** Everything `state` takes back, for the sandbox to write down after each call. */
288
+ snapshot: () => ({ bookings: [...bookings.values()], held: [...held], resSeq }),
289
+ fail: (f) => fails.push(f),
290
+ retireToken: () => {
291
+ token = `retired-${token}`;
292
+ },
293
+ get tokens() {
294
+ return tokens;
295
+ },
296
+ };
297
+ };
298
+ /** One domestic hotel shaped like the documentation's example. */
299
+ export const fakeHotel = (id, over = {}) => ({
300
+ hotelId: id,
301
+ hotelName: `汉庭酒店(上海人民广场${id}店)`,
302
+ hotelNameEn: `Hanting Hotel Shanghai People's Square ${id}`,
303
+ brandCode: 2,
304
+ brandName: '汉庭',
305
+ provinceNo: '310000',
306
+ provinceName: '上海市',
307
+ cityNo: '310100',
308
+ cityName: '上海市',
309
+ countyNo: '310101',
310
+ countyName: '黄浦区',
311
+ hotelAddress: '上海市黄浦区延安东路1号',
312
+ hotelAddressEn: "1 Yan'an East Road, Huangpu District, Shanghai",
313
+ telephone: '63200000',
314
+ hotelWordIntroduce: '近人民广场地铁站,步行可达南京路步行街。',
315
+ international: false,
316
+ tradeCurrency: 'CNY',
317
+ hotelRoomTypeList: [
318
+ {
319
+ roomTypeCode: 'DR1',
320
+ roomTypeName: '高级大床房',
321
+ hotelArea: 20,
322
+ isHasWindow: '1',
323
+ maxOccupancy: 999,
324
+ status: 1,
325
+ bedTypeList: [{ bedTypeCode: 'A', bedSpecNo: '-1', bedTypeName: '大床', bedSpec: '1.8m' }],
326
+ },
327
+ {
328
+ roomTypeCode: 'TR1',
329
+ roomTypeName: '高级双床房',
330
+ hotelArea: 22,
331
+ isHasWindow: '3',
332
+ maxOccupancy: 2,
333
+ status: 1,
334
+ bedTypeList: [{ bedTypeCode: 'B', bedSpecNo: '-1', bedTypeName: '双床', bedSpec: '1.2m' }],
335
+ },
336
+ ],
337
+ hotelServiceList: [
338
+ { childClassCode: 71, childClassName: '健身房' },
339
+ { childClassCode: 49, childClassName: '中餐厅' },
340
+ ],
341
+ hotelPhotoList: [
342
+ { typeCode: 'ImagePhoto', fileUrl: 'http://ws-p.example.com/f/a.jpg', sortId: 20, status: 1 },
343
+ {
344
+ typeCode: 'RoomType',
345
+ typeMappingCode: 'DR1',
346
+ fileUrl: 'http://ws-p.example.com/f/dr1.jpg',
347
+ sortId: 10,
348
+ status: 1,
349
+ },
350
+ ],
351
+ hotelTrafficList: [
352
+ { destinationType: '9', destinationName: '人民广场', destinationDistance: '300m' },
353
+ ],
354
+ ...over,
355
+ });
356
+ export const product = (roomTypeCode, rateCode, over = {}) => ({
357
+ roomTypeCode,
358
+ roomTypeName: roomTypeCode === 'DR1' ? '高级大床房' : '高级双床房',
359
+ rateCode,
360
+ rateCodeName: rateCode,
361
+ checkinType: 'DAY',
362
+ promotion: false,
363
+ ...over,
364
+ });
365
+ //# sourceMappingURL=fake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake.js","sourceRoot":"","sources":["../../src/huazhu/fake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type Server } from 'node:http';
2
+ import { type FakeRate } from './fake.js';
3
+ import type { HotelStatic } from './wire.js';
4
+ /** The invented hotels, shaped as Huazhu's /hotel answers them. No photographs: none of them exists. */
5
+ export declare const SANDBOX_HOTELS: HotelStatic[];
6
+ /** Three rates a hotel, fifty rooms of each a night: enough for many test bookings, since these never lapse. */
7
+ export declare const SANDBOX_RATES: Record<string, FakeRate[]>;
8
+ export type SandboxOptions = {
9
+ /** Default: any free port. */
10
+ port?: number;
11
+ host?: string;
12
+ /** Where bookings and held rooms are written, so a restart keeps them. None: memory only. */
13
+ stateFile?: string;
14
+ /** The credentials it accepts - the same names the connector reads (HUAZHU_*). */
15
+ clientId?: string;
16
+ secret?: string;
17
+ distributorId?: string;
18
+ now?: () => number;
19
+ log?: (line: string) => void;
20
+ };
21
+ export declare const startSandbox: (o?: SandboxOptions) => Promise<{
22
+ server: Server;
23
+ port: number;
24
+ close: () => Promise<void>;
25
+ }>;
26
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/huazhu/sandbox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,WAAW,CAAC;AAItD,OAAO,EAAE,KAAK,QAAQ,EAAwD,MAAM,WAAW,CAAC;AAChG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AA4K7C,wGAAwG;AACxG,eAAO,MAAM,cAAc,EAAE,WAAW,EAuBvC,CAAC;AASF,gHAAgH;AAChH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAyBpD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B,CAAC;AAKF,eAAO,MAAM,YAAY,GACvB,IAAG,cAAmB,KACrB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CA0EtE,CAAC"}