@curless/hotel-storefront 0.27.5 → 0.27.6

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 (105) hide show
  1. package/README.md +18 -8
  2. package/dist/fence.d.ts +12 -1
  3. package/dist/fence.d.ts.map +1 -1
  4. package/dist/fence.js +0 -0
  5. package/dist/fence.js.map +1 -1
  6. package/dist/legal.js +1 -1
  7. package/dist/legal.js.map +1 -1
  8. package/dist/money.d.ts +2 -0
  9. package/dist/money.d.ts.map +1 -1
  10. package/dist/money.js +43 -6
  11. package/dist/money.js.map +1 -1
  12. package/dist/server.d.ts +1 -1
  13. package/dist/server.d.ts.map +1 -1
  14. package/dist/server.js +9 -1
  15. package/dist/server.js.map +1 -1
  16. package/dist/sessions.d.ts.map +1 -1
  17. package/dist/sessions.js +3 -2
  18. package/dist/sessions.js.map +1 -1
  19. package/dist/surface.d.ts +2 -0
  20. package/dist/surface.d.ts.map +1 -1
  21. package/dist/surface.js +10 -1
  22. package/dist/surface.js.map +1 -1
  23. package/dist/tools.d.ts +4 -4
  24. package/dist/tools.d.ts.map +1 -1
  25. package/dist/tools.js +21 -8
  26. package/dist/tools.js.map +1 -1
  27. package/dist/trip-ids.js +1 -1
  28. package/dist/trip-ids.js.map +1 -1
  29. package/package.json +2 -2
  30. package/dist/__tests__/__fixtures__/huazhu-fake.d.ts +0 -2
  31. package/dist/__tests__/__fixtures__/huazhu-fake.d.ts.map +0 -1
  32. package/dist/__tests__/__fixtures__/huazhu-fake.js +0 -3
  33. package/dist/__tests__/__fixtures__/huazhu-fake.js.map +0 -1
  34. package/dist/__tests__/__helpers__/sessions.d.ts +0 -10
  35. package/dist/__tests__/__helpers__/sessions.d.ts.map +0 -1
  36. package/dist/__tests__/__helpers__/sessions.js +0 -40
  37. package/dist/__tests__/__helpers__/sessions.js.map +0 -1
  38. package/dist/__tests__/audit-p0.test.d.ts +0 -2
  39. package/dist/__tests__/audit-p0.test.d.ts.map +0 -1
  40. package/dist/__tests__/audit-p0.test.js +0 -274
  41. package/dist/__tests__/audit-p0.test.js.map +0 -1
  42. package/dist/__tests__/audit-p2.test.d.ts +0 -2
  43. package/dist/__tests__/audit-p2.test.d.ts.map +0 -1
  44. package/dist/__tests__/audit-p2.test.js +0 -98
  45. package/dist/__tests__/audit-p2.test.js.map +0 -1
  46. package/dist/__tests__/card-contract.test.d.ts +0 -2
  47. package/dist/__tests__/card-contract.test.d.ts.map +0 -1
  48. package/dist/__tests__/card-contract.test.js +0 -282
  49. package/dist/__tests__/card-contract.test.js.map +0 -1
  50. package/dist/__tests__/data.test.d.ts +0 -2
  51. package/dist/__tests__/data.test.d.ts.map +0 -1
  52. package/dist/__tests__/data.test.js +0 -210
  53. package/dist/__tests__/data.test.js.map +0 -1
  54. package/dist/__tests__/dates.test.d.ts +0 -2
  55. package/dist/__tests__/dates.test.d.ts.map +0 -1
  56. package/dist/__tests__/dates.test.js +0 -107
  57. package/dist/__tests__/dates.test.js.map +0 -1
  58. package/dist/__tests__/demo-hotels.test.d.ts +0 -2
  59. package/dist/__tests__/demo-hotels.test.d.ts.map +0 -1
  60. package/dist/__tests__/demo-hotels.test.js +0 -765
  61. package/dist/__tests__/demo-hotels.test.js.map +0 -1
  62. package/dist/__tests__/huazhu-audit.test.d.ts +0 -2
  63. package/dist/__tests__/huazhu-audit.test.d.ts.map +0 -1
  64. package/dist/__tests__/huazhu-audit.test.js +0 -234
  65. package/dist/__tests__/huazhu-audit.test.js.map +0 -1
  66. package/dist/__tests__/huazhu-backend.test.d.ts +0 -2
  67. package/dist/__tests__/huazhu-backend.test.d.ts.map +0 -1
  68. package/dist/__tests__/huazhu-backend.test.js +0 -1326
  69. package/dist/__tests__/huazhu-backend.test.js.map +0 -1
  70. package/dist/__tests__/huazhu-cancel-policy.test.d.ts +0 -2
  71. package/dist/__tests__/huazhu-cancel-policy.test.d.ts.map +0 -1
  72. package/dist/__tests__/huazhu-cancel-policy.test.js +0 -82
  73. package/dist/__tests__/huazhu-cancel-policy.test.js.map +0 -1
  74. package/dist/__tests__/huazhu-sandbox.test.d.ts +0 -2
  75. package/dist/__tests__/huazhu-sandbox.test.d.ts.map +0 -1
  76. package/dist/__tests__/huazhu-sandbox.test.js +0 -195
  77. package/dist/__tests__/huazhu-sandbox.test.js.map +0 -1
  78. package/dist/__tests__/huazhu-sellable.test.d.ts +0 -2
  79. package/dist/__tests__/huazhu-sellable.test.d.ts.map +0 -1
  80. package/dist/__tests__/huazhu-sellable.test.js +0 -192
  81. package/dist/__tests__/huazhu-sellable.test.js.map +0 -1
  82. package/dist/__tests__/present.test.d.ts +0 -2
  83. package/dist/__tests__/present.test.d.ts.map +0 -1
  84. package/dist/__tests__/present.test.js +0 -367
  85. package/dist/__tests__/present.test.js.map +0 -1
  86. package/dist/__tests__/prose.test.d.ts +0 -2
  87. package/dist/__tests__/prose.test.d.ts.map +0 -1
  88. package/dist/__tests__/prose.test.js +0 -171
  89. package/dist/__tests__/prose.test.js.map +0 -1
  90. package/dist/__tests__/server.test.d.ts +0 -2
  91. package/dist/__tests__/server.test.d.ts.map +0 -1
  92. package/dist/__tests__/server.test.js +0 -557
  93. package/dist/__tests__/server.test.js.map +0 -1
  94. package/dist/__tests__/state.test.d.ts +0 -2
  95. package/dist/__tests__/state.test.d.ts.map +0 -1
  96. package/dist/__tests__/state.test.js +0 -204
  97. package/dist/__tests__/state.test.js.map +0 -1
  98. package/dist/__tests__/tool-descriptions.test.d.ts +0 -2
  99. package/dist/__tests__/tool-descriptions.test.d.ts.map +0 -1
  100. package/dist/__tests__/tool-descriptions.test.js +0 -220
  101. package/dist/__tests__/tool-descriptions.test.js.map +0 -1
  102. package/dist/__tests__/tools.test.d.ts +0 -2
  103. package/dist/__tests__/tools.test.d.ts.map +0 -1
  104. package/dist/__tests__/tools.test.js +0 -1598
  105. package/dist/__tests__/tools.test.js.map +0 -1
@@ -1,192 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { addDays } from '../dates.js';
3
- import { ariRanges, bookableNow, offeredAtAll, sell, } from '../huazhu/sellable.js';
4
- // The checks Huazhu's page 销售条款示例 works through, one rule at a time: a
5
- // restriction set on 2021-10-01..10 and the bookings it allows and refuses.
6
- const START = '2021-09-28';
7
- const DAYS = 20;
8
- const product = {
9
- roomTypeCode: 'DR1',
10
- roomTypeName: '高级大床房',
11
- rateCode: 'BAR',
12
- checkinType: 'DAY',
13
- promotion: false,
14
- };
15
- /** An offer over 2021-09-28 .. 2021-10-17 with one restriction set on 10-01..10-10. */
16
- const offer = (field, value, over = {}) => {
17
- const days = Array.from({ length: DAYS }, (_, i) => addDays(START, i));
18
- const inRange = (d) => d >= '2021-10-01' && d <= '2021-10-10';
19
- const base = {
20
- close: days.map(() => false),
21
- minStayArrival: days.map(() => null),
22
- maxStayArrival: days.map(() => 999),
23
- minStayThrough: days.map(() => 0),
24
- maxStayThrough: days.map(() => 0),
25
- minAdvanceDay: days.map(() => null),
26
- maxAdvanceDay: days.map(() => 999),
27
- cta: days.map(() => false),
28
- ctd: days.map(() => false),
29
- fplos: days.map(() => null),
30
- };
31
- const restriction = field
32
- ? { ...base, [field]: days.map((d, i) => (inRange(d) ? value : base[field][i])) }
33
- : base;
34
- return {
35
- start: START,
36
- offer: {
37
- roomTypeCode: 'DR1',
38
- rateCode: 'BAR',
39
- currencyCode: 'CNY',
40
- rates: [
41
- {
42
- maxAdultCount: 2,
43
- amountAfterTax: days.map(() => 328),
44
- amountBeforeTax: days.map(() => 309),
45
- },
46
- ],
47
- mealPlanType: 'BB',
48
- mealPlanCounts: days.map(() => 1),
49
- restriction: restriction,
50
- guaranteePolicies: days.map(() => ({ code: 'PL' })),
51
- cancelPolicies: days.map(() => ({ code: 'AD0_0' })),
52
- ...over,
53
- },
54
- inventory: days.map(() => 3),
55
- };
56
- };
57
- const ctx = (checkIn, checkOut, over = {}) => ({
58
- checkIn,
59
- checkOut,
60
- adults: 2,
61
- rooms: 1,
62
- today: '2021-09-22',
63
- clock: '12:00',
64
- paymentType: 'NGPL',
65
- allowTags: new Set(),
66
- ...over,
67
- });
68
- const ok = (w, c) => sell(product, w, undefined, c).ok;
69
- describe('Huazhu sale rules (销售条款示例)', () => {
70
- it('close: a closed night anywhere in the stay refuses it', () => {
71
- const w = offer('close', true);
72
- expect(ok(w, ctx('2021-09-30', '2021-10-02'))).toBe(false);
73
- expect(ok(w, ctx('2021-10-10', '2021-10-11'))).toBe(false);
74
- expect(ok(w, ctx('2021-09-29', '2021-10-01'))).toBe(true);
75
- });
76
- it('minStayArrival 3: judged on the arrival date only', () => {
77
- const w = offer('minStayArrival', 3);
78
- expect(ok(w, ctx('2021-09-30', '2021-10-02'))).toBe(true);
79
- expect(ok(w, ctx('2021-10-01', '2021-10-02'))).toBe(false);
80
- expect(ok(w, ctx('2021-10-10', '2021-10-11'))).toBe(false);
81
- expect(ok(w, ctx('2021-10-11', '2021-10-12'))).toBe(true);
82
- });
83
- it('maxStayArrival 10: eleven nights from 10-01 refused', () => {
84
- const w = offer('maxStayArrival', 10);
85
- expect(ok(w, ctx('2021-10-01', '2021-10-12'))).toBe(false);
86
- expect(ok(w, ctx('2021-10-01', '2021-10-11'))).toBe(true);
87
- });
88
- it('minStayThrough 3: every night of the stay is checked', () => {
89
- const w = offer('minStayThrough', 3);
90
- expect(ok(w, ctx('2021-09-30', '2021-10-02'))).toBe(false);
91
- expect(ok(w, ctx('2021-10-06', '2021-10-11'))).toBe(true);
92
- expect(ok(w, ctx('2021-10-11', '2021-10-12'))).toBe(true);
93
- });
94
- it('minAdvanceDay 3: booked on 09-30, arriving 10-02 is too soon and 10-03 is not', () => {
95
- const w = offer('minAdvanceDay', 3);
96
- expect(ok(w, ctx('2021-10-02', '2021-10-03', { today: '2021-09-30' }))).toBe(false);
97
- expect(ok(w, ctx('2021-10-03', '2021-10-04', { today: '2021-09-30' }))).toBe(true);
98
- });
99
- // ⚠️ THE PAGE'S OWN ARITHMETIC SLIPS HERE. It counts 09-22 → 10-01 as "提前10"
100
- // and 09-22 → 10-02 as "提前11" - true only if September had 31 days. Its
101
- // minAdvanceDay examples count the plain calendar difference (09-30 → 10-01
102
- // is "提前1"), and so does this: one rule, counted one way. Prebook is the
103
- // authority if Huazhu's server counts differently.
104
- it('maxAdvanceDay 10: ten days ahead is allowed, eleven is not', () => {
105
- const w = offer('maxAdvanceDay', 10);
106
- expect(ok(w, ctx('2021-10-02', '2021-10-03', { today: '2021-09-22' }))).toBe(true);
107
- expect(ok(w, ctx('2021-10-03', '2021-10-04', { today: '2021-09-22' }))).toBe(false);
108
- });
109
- it('cta: no arrivals on a closed-to-arrival date, stays through it are fine', () => {
110
- const w = offer('cta', true);
111
- expect(ok(w, ctx('2021-10-01', '2021-10-02'))).toBe(false);
112
- expect(ok(w, ctx('2021-09-30', '2021-10-02'))).toBe(true);
113
- });
114
- it('ctd: no departures on a closed-to-departure date', () => {
115
- const w = offer('ctd', true);
116
- expect(ok(w, ctx('2021-09-29', '2021-10-01'))).toBe(false);
117
- expect(ok(w, ctx('2021-09-29', '2021-09-30'))).toBe(true);
118
- expect(ok(w, ctx('2021-09-29', '2021-10-11'))).toBe(true);
119
- });
120
- it('fplos: "1110111" refuses exactly four nights; the last place means seven or more', () => {
121
- const w = offer('fplos', '1110111');
122
- expect(ok(w, ctx('2021-10-01', '2021-10-04'))).toBe(true);
123
- expect(ok(w, ctx('2021-10-01', '2021-10-05'))).toBe(false);
124
- expect(ok(w, ctx('2021-10-01', '2021-10-09'))).toBe(true);
125
- expect(ok(offer('fplos', '0000000'), ctx('2021-10-01', '2021-10-02'))).toBe(false);
126
- });
127
- it('the party: more adults than the rate prices is refused as a party, not as a date', () => {
128
- const res = sell(product, offer(null, null), undefined, ctx('2021-10-01', '2021-10-02', { adults: 3 }));
129
- expect(res).toMatchObject({ ok: false, kind: 'party' });
130
- });
131
- it('rooms left: the fewest on any night, and a promotion books at most three', () => {
132
- const w = offer(null, null);
133
- w.inventory[5] = 1;
134
- const res = sell(product, w, undefined, ctx('2021-10-02', '2021-10-05', { rooms: 2 }));
135
- expect(res).toMatchObject({ ok: false, kind: 'sold-out' });
136
- const promo = sell({ ...product, promotion: true }, offer(null, null), undefined, ctx('2021-10-06', '2021-10-07', { rooms: 4 }));
137
- expect(promo).toMatchObject({ ok: false, kind: 'too-many-rooms' });
138
- });
139
- it('a prepaid rate is not sold as pay-at-the-hotel', () => {
140
- const w = offer(null, null, {
141
- guaranteePolicies: Array.from({ length: DAYS }, () => ({ code: 'PN' })),
142
- });
143
- expect(sell(product, w, undefined, ctx('2021-10-01', '2021-10-02'))).toMatchObject({
144
- ok: false,
145
- kind: 'prepaid',
146
- });
147
- // OGPL takes a guaranteed rate that NGPL cannot.
148
- const gtx = offer(null, null, {
149
- guaranteePolicies: Array.from({ length: DAYS }, () => ({ code: 'GTX' })),
150
- });
151
- expect(ok(gtx, ctx('2021-10-01', '2021-10-02'))).toBe(false);
152
- expect(ok(gtx, ctx('2021-10-01', '2021-10-02', { paymentType: 'OGPL' }))).toBe(true);
153
- });
154
- it("the arrival date's terms are the booking's", () => {
155
- const w = offer(null, null, {
156
- cancelPolicies: Array.from({ length: DAYS }, (_, i) => ({
157
- code: i === 3 ? '6PM1D1N_100P' : 'AD0_0',
158
- })),
159
- });
160
- const res = sell(product, w, undefined, ctx('2021-10-01', '2021-10-03'));
161
- expect(res).toMatchObject({
162
- ok: true,
163
- cancelCode: '6PM1D1N_100P',
164
- meal: 'Breakfast',
165
- after: [328, 328],
166
- before: [309, 309],
167
- });
168
- });
169
- it('gated tags are offered only when the contract lets them through', () => {
170
- const student = { ...product, tags: ['StudnetDiscount'] };
171
- expect(offeredAtAll(student, new Set())).toBe(false);
172
- expect(offeredAtAll(student, new Set(['StudnetDiscount']))).toBe(true);
173
- expect(offeredAtAll({ ...product, tags: ['Packages'] }, new Set())).toBe(true);
174
- expect(offeredAtAll({ ...product, checkinType: 'HOUR' }, new Set())).toBe(false);
175
- });
176
- it('a booking window hides a rate outside its hours, as the documentation says to', () => {
177
- const w = { eachDayStartTime: '20:00', eachDayEndTime: '23:59' };
178
- expect(bookableNow(w, '2021-10-01', '14:00')).toBe(false);
179
- expect(bookableNow(w, '2021-10-01', '20:30')).toBe(true);
180
- expect(bookableNow({ startDate: '2021-10-05' }, '2021-10-01', '12:00')).toBe(false);
181
- });
182
- it('cuts a span into pieces of at most thirty dates, both ends included', () => {
183
- expect(ariRanges('2021-10-01', '2021-10-30')).toEqual([
184
- { start: '2021-10-01', end: '2021-10-30' },
185
- ]);
186
- expect(ariRanges('2021-10-01', '2021-10-31')).toEqual([
187
- { start: '2021-10-01', end: '2021-10-30' },
188
- { start: '2021-10-31', end: '2021-10-31' },
189
- ]);
190
- });
191
- });
192
- //# sourceMappingURL=huazhu-sellable.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"huazhu-sellable.test.js","sourceRoot":"","sources":["../../src/__tests__/huazhu-sellable.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=present.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"present.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/present.test.ts"],"names":[],"mappings":""}
@@ -1,367 +0,0 @@
1
- import { fileURLToPath } from 'node:url';
2
- import { beforeEach, describe, expect, it } from 'vitest';
3
- import { loadHotelData } from '../data.js';
4
- import { createDemoHotels } from '../demo-hotels.js';
5
- import { buildItinerary, compareHotels } from '../present.js';
6
- // The two cards that carry the model's judgment. What is under test is the
7
- // division of labour: the model brings ids and prose, the server brings every
8
- // fact, and anything the model names that cannot be resolved is dropped by
9
- // name rather than rendered as a blank.
10
- const DATA = loadHotelData(fileURLToPath(new URL('./__fixtures__/brand.json', import.meta.url)));
11
- const STAY = { checkIn: '2026-10-19', checkOut: '2026-10-21', guests: 2 };
12
- let backend;
13
- beforeEach(() => {
14
- backend = createDemoHotels({ data: DATA, now: () => Date.parse('2026-10-01T02:00:00Z') });
15
- });
16
- describe('comparing', () => {
17
- it('takes the model’s reasons and fills in every figure itself', async () => {
18
- const c = await compareHotels(backend, [
19
- {
20
- hotel: 'hong-kong-island',
21
- bestFor: 'Being in the middle of it',
22
- pros: ['Harbour views'],
23
- },
24
- { hotel: 'hong-kong-kerry', bestFor: 'Kids', pros: ['Lawn'], cons: ['Across the water'] },
25
- ], { stay: STAY });
26
- expect(c.columns).toHaveLength(2);
27
- const [island, kerry] = c.columns;
28
- // The model's words come back as the model's words…
29
- expect(island?.bestFor).toBe('Being in the middle of it');
30
- expect(kerry?.cons).toEqual(['Across the water']);
31
- // …and the numbers are ours, off the hotel's own record.
32
- expect(island?.price?.stayTotal).toBe('HK$8,588');
33
- expect(island?.price?.room).toBe('Deluxe Peak View Room');
34
- });
35
- it('gives every column the same rows in the same order, so a comparison reads across', async () => {
36
- const c = await compareHotels(backend, [{ hotel: 'hong-kong-island' }, { hotel: 'hong-kong-kerry' }, { hotel: 'hong-kong-jen' }], { stay: STAY });
37
- for (const col of c.columns) {
38
- expect(col.rows.map((r) => r.label)).toEqual(c.rowLabels);
39
- }
40
- expect(c.rowLabels).toContain('Per night');
41
- expect(c.rowLabels).toContain('Free cancellation');
42
- });
43
- it('fills a row a hotel has no answer for with a dash rather than moving the row', async () => {
44
- // One hotel with a rating and one without. Picked BY ID rather than by
45
- // position: the shipped file is generated and sorted, so hotels[0] is
46
- // whichever city sorts first, which is not a fact this test is about.
47
- const rated = DATA.hotels.find((h) => h.id === 'hong-kong-island');
48
- if (!rated)
49
- throw new Error('the hand-written Island Shangri-La has left the data');
50
- const unrated = { ...rated, id: 'no-rating', name: 'No Rating Hotel', rating: undefined };
51
- const mixed = { ...DATA, hotels: [unrated, rated] };
52
- const c = await compareHotels(createDemoHotels({ data: mixed, now: () => Date.parse('2026-10-01T02:00:00Z') }), [{ hotel: mixed.hotels[0]?.id ?? '' }, { hotel: mixed.hotels[1]?.id ?? '' }], {});
53
- const ratingRow = c.rowLabels.indexOf('Rating');
54
- expect(ratingRow).toBeGreaterThanOrEqual(0);
55
- expect(c.columns[0]?.rows[ratingRow]?.value).toBe('—');
56
- expect(c.columns[1]?.rows[ratingRow]?.value).toContain('/');
57
- });
58
- // ⚠️ A TABLE IS READ AS A RANKING. Once the whole group is in the data a
59
- // comparison can put €1,060, ¥67,500 and HK$3,800 on one "Per night" line,
60
- // and nothing in this connector invents an exchange rate - so it has to say
61
- // so rather than let the digits be compared.
62
- it('names the currencies when the columns are not in the same one', async () => {
63
- const mixed = await compareHotels(backend, [{ hotel: 'hong-kong-island' }, { hotel: 'shanghai-pudong' }], { stay: STAY });
64
- expect(mixed.currencies).toEqual(['HKD', 'CNY']);
65
- // One currency is the ordinary case and says nothing.
66
- const same = await compareHotels(backend, [{ hotel: 'hong-kong-island' }, { hotel: 'hong-kong-kerry' }], { stay: STAY });
67
- expect(same.currencies).toBeUndefined();
68
- });
69
- it('drops a hotel nobody can resolve, by name', async () => {
70
- const c = await compareHotels(backend, [{ hotel: 'hong-kong-island' }, { hotel: 'the-ritz-of-narnia' }], {});
71
- expect(c.columns).toHaveLength(1);
72
- expect(c.dropped).toEqual([
73
- { name: 'the-ritz-of-narnia', why: 'no hotel here answers to that' },
74
- ]);
75
- });
76
- it('has no prices at all until someone names the nights', async () => {
77
- const c = await compareHotels(backend, [{ hotel: 'hong-kong-island' }, { hotel: 'hong-kong-jen' }], {});
78
- expect(c.columns[0]?.price).toBeUndefined();
79
- expect(c.columns[0]?.from).toBe('HK$3,800');
80
- expect(c.rowLabels).not.toContain('Whole stay');
81
- });
82
- it('marks the one the model picked, and only that one', async () => {
83
- const c = await compareHotels(backend, [{ hotel: 'hong-kong-island' }, { hotel: 'hong-kong-kerry' }], { recommended: 'hong-kong-kerry' });
84
- expect(c.columns.map((x) => x.recommended)).toEqual([false, true]);
85
- });
86
- it('takes four at most, and trims a list of reasons to what a column can hold', async () => {
87
- const c = await compareHotels(backend, Array.from({ length: 6 }, () => ({
88
- hotel: 'hong-kong-island',
89
- pros: ['a', 'b', 'c', 'd', 'e', 'f'],
90
- cons: ['x', 'y', 'z', 'w'],
91
- })), {});
92
- expect(c.columns).toHaveLength(4);
93
- expect(c.columns[0]?.pros).toHaveLength(4);
94
- expect(c.columns[0]?.cons).toHaveLength(3);
95
- });
96
- });
97
- describe('the itinerary', () => {
98
- const trip = [
99
- { kind: 'room', hotelId: 'hong-kong-kerry', roomId: 'harbour-balcony', stay: STAY, rooms: 1 },
100
- ];
101
- it('counts what is in the trip against what is only planned', async () => {
102
- const plan = await buildItinerary(backend, [
103
- {
104
- label: 'Day 1 — Arrive',
105
- note: 'Land and settle.',
106
- items: ['hong-kong-kerry', 'airport-transfer'],
107
- },
108
- { label: 'Day 2 — The island', items: ['hong-kong-island'] },
109
- ], { title: 'Four days', stay: STAY, trip });
110
- expect(plan.planned).toBe(3);
111
- expect(plan.inTrip).toBe(1);
112
- const flat = plan.days.flatMap((d) => d.items);
113
- expect(flat.find((i) => i.id === 'hong-kong-kerry')?.inTrip).toBe(true);
114
- expect(flat.find((i) => i.id === 'hong-kong-island')?.inTrip).toBe(false);
115
- expect(flat.find((i) => i.id === 'airport-transfer')?.inTrip).toBe(false);
116
- });
117
- // ⚠️ A PLAN WITH NO DATES IS A PICTURE, NOT A PATH. Every day showed a hotel
118
- // and tapping one opened it on whatever nights the date bar happened to hold
119
- // - so the guest priced nights the plan never said, off a plan that knew them
120
- // (robin, 2026-09-21). The dates come from the day's POSITION and the stay the
121
- // guest already gave, never from parsing "Day 3" out of a label the model wrote.
122
- it('gives each day its date, and each hotel the nights the plan puts it', async () => {
123
- const stay = { checkIn: '2026-10-19', checkOut: '2026-10-23', guests: 2 };
124
- const plan = await buildItinerary(backend, [
125
- { label: 'Day 1 — Arrive', items: ['hong-kong-kerry'] },
126
- { label: 'Day 2 — Stay put', items: ['hong-kong-kerry'] },
127
- { label: 'Day 3 — Cross the water', items: ['hong-kong-island'] },
128
- { label: 'Day 4 — Last morning', items: ['hong-kong-island'] },
129
- ], { title: 'Four days', stay, trip: [] });
130
- expect(plan.days.map((d) => d.date)).toEqual([
131
- '2026-10-19',
132
- '2026-10-20',
133
- '2026-10-21',
134
- '2026-10-22',
135
- ]);
136
- // Two consecutive days at one hotel is ONE stay of two nights…
137
- const kerry = plan.days[0]?.items[0];
138
- expect(kerry).toMatchObject({ checkIn: '2026-10-19', checkOut: '2026-10-21', nights: 2 });
139
- const island = plan.days[2]?.items[0];
140
- expect(island).toMatchObject({ checkIn: '2026-10-21', checkOut: '2026-10-23', nights: 2 });
141
- // …carried by EVERY day of the run, as the same nights. ⚠️ Only day 1 used
142
- // to: tapping day 2 opened Kerry on the plan's whole four nights, Island's
143
- // included, and priced them (2026-09-28 audit). The same nights from either
144
- // day are one trip line, so this cannot book the stay twice.
145
- expect(plan.days[1]?.items[0]).toMatchObject({
146
- checkIn: '2026-10-19',
147
- checkOut: '2026-10-21',
148
- nights: 2,
149
- night: 2,
150
- });
151
- expect(plan.days[3]?.items[0]).toMatchObject({ checkIn: '2026-10-21', night: 2 });
152
- // And it is two stays to add, not four days.
153
- expect(plan.planned).toBe(2);
154
- });
155
- // ⚠️ ONE CARD IS THE PLAN (robin, 2026-09-29): the moments of each day in the
156
- // model's words, and each stay priced for its own nights on its first day -
157
- // so nothing has to be looked up, and drawn, above it.
158
- it('carries the day in order and prices each stay for its own nights, once', async () => {
159
- const stay = { checkIn: '2026-10-19', checkOut: '2026-10-21', guests: 2 };
160
- const plan = await buildItinerary(backend, [
161
- {
162
- label: 'Day 1 — Arrive',
163
- items: ['hong-kong-kerry'],
164
- plan: [
165
- {
166
- time: 'Afternoon',
167
- what: ' Check in\u200b at Kerry ',
168
- note: 'The transfer meets the flight',
169
- },
170
- { time: 'Evening', what: '' },
171
- { what: 'x'.repeat(400) },
172
- ],
173
- },
174
- { label: 'Day 2 — Stay put', items: ['hong-kong-kerry'] },
175
- ], { title: 'Two nights', stay, trip: [] });
176
- const [first, second] = plan.days;
177
- // Cleaned, capped, and a moment with nothing in it is no moment.
178
- // Ninety characters and an ellipsis.
179
- expect(first?.plan?.map((m) => m.what.length <= 91)).toEqual([true, true]);
180
- expect(first?.plan?.[0]).toEqual({
181
- time: 'Afternoon',
182
- what: 'Check in at Kerry',
183
- note: 'The transfer meets the flight',
184
- });
185
- // The first day of the stay is priced for its nights, with its picture;
186
- // the next day is a night of it and is not priced again.
187
- expect(first?.items[0]?.price).toMatch(/^HK\$[\d,]+ for 2 nights, taxes in · /);
188
- expect(first?.items[0]?.imageUrl).toBeDefined();
189
- expect(second?.items[0]?.night).toBe(2);
190
- expect(second?.items[0]?.price).not.toMatch(/for 2 nights/);
191
- });
192
- it('gives a hotel the plan comes back to its own second stay', async () => {
193
- const plan = await buildItinerary(backend, [
194
- { label: 'Day 1', items: ['shanghai-pudong'] },
195
- { label: 'Day 2', items: ['beijing-china-world'] },
196
- { label: 'Day 3', items: ['shanghai-pudong'] },
197
- ], { title: 'There and back', stay: { ...STAY, checkOut: '2026-10-22' }, trip: [] });
198
- expect(plan.days[2]?.items[0]).toMatchObject({
199
- checkIn: '2026-10-21',
200
- checkOut: '2026-10-22',
201
- nights: 1,
202
- });
203
- expect(plan.planned).toBe(3);
204
- });
205
- // ⚠️ IN THE TRIP FOR THESE NIGHTS, NOT AT THIS HOTEL. A room held in November
206
- // put October's plan "in the trip", and the model repeated the count.
207
- it('counts a stay as in the trip only for the nights the trip holds', async () => {
208
- const november = [
209
- {
210
- kind: 'room',
211
- hotelId: 'shanghai-pudong',
212
- roomId: 'deluxe-city',
213
- stay: { checkIn: '2026-11-10', checkOut: '2026-11-12', guests: 2 },
214
- },
215
- ];
216
- const plan = await buildItinerary(backend, [
217
- { label: 'Day 1', items: ['shanghai-pudong'] },
218
- { label: 'Day 2', items: ['shanghai-pudong'] },
219
- ], { title: 'October', stay: STAY, trip: november });
220
- expect(plan.inTrip).toBe(0);
221
- expect(plan.days[0]?.items[0]?.inTrip).toBe(false);
222
- });
223
- // ⚠️ BOOKED IS NOT "PLAN ONLY". A booking empties the trip, so a plan read
224
- // against the trip alone called a booked stay a plan the moment it was booked.
225
- it('marks a night a booking already holds with its code', async () => {
226
- const [booking] = await backend.requestBooking({
227
- lines: [{ kind: 'room', hotelId: 'hong-kong-kerry', roomId: 'deluxe', stay: STAY }],
228
- }, { name: 'Robin Ruan', email: 'robin@example.com' }, { sessionId: 's' });
229
- const plan = await buildItinerary(backend, [
230
- { label: 'Day 1', items: ['hong-kong-kerry'] },
231
- { label: 'Day 2', items: ['hong-kong-kerry'] },
232
- { label: 'Day 3', items: ['hong-kong-island'] },
233
- ], {
234
- title: 'Booked and not',
235
- stay: { ...STAY, checkOut: '2026-10-22' },
236
- trip: [],
237
- bookings: await backend.listBookings({ sessionId: 's' }),
238
- });
239
- expect(plan.days[0]?.items[0]?.booked).toBe(booking?.confirmationCode);
240
- expect(plan.days[1]?.items[0]?.booked).toBe(booking?.confirmationCode);
241
- expect(plan.days[2]?.items[0]?.booked).toBeUndefined();
242
- expect([plan.booked, plan.inTrip, plan.planned]).toEqual([1, 0, 2]);
243
- // Booked AND put back in the trip is still one stay, booked: it was
244
- // counted as both, and "the rest" came out short (2026-09-28 audit).
245
- const again = await buildItinerary(backend, [
246
- { label: 'Day 1', items: ['hong-kong-kerry'] },
247
- { label: 'Day 2', items: ['hong-kong-kerry'] },
248
- { label: 'Day 3', items: ['hong-kong-island'] },
249
- ], {
250
- title: 'Booked and in the trip',
251
- stay: { ...STAY, checkOut: '2026-10-22' },
252
- trip: [{ kind: 'room', hotelId: 'hong-kong-kerry', roomId: 'deluxe', stay: STAY }],
253
- bookings: await backend.listBookings({ sessionId: 's' }),
254
- });
255
- expect([again.booked, again.inTrip, again.planned]).toEqual([1, 0, 2]);
256
- });
257
- // ⚠️ AN ADD-ON IS THE ONE WHERE THE GUEST IS THAT DAY. Every hotel here has an
258
- // `airport-transfer`; the Shanghai day's showed the Island's, in HK$.
259
- it("reads an add-on at the day's own hotel", async () => {
260
- const plan = await buildItinerary(backend, [
261
- { label: 'Day 1', items: ['hong-kong-island'] },
262
- { label: 'Day 2', items: ['airport-transfer', 'shanghai-pudong'] },
263
- ], { title: 'Two cities', stay: STAY, trip: [] });
264
- expect(plan.days[1]?.items[0]?.price).toMatch(/^¥/);
265
- });
266
- it('carries no dates at all when the plan was drawn without a stay', async () => {
267
- const plan = await buildItinerary(backend, [{ label: 'Day 1', items: ['hong-kong-island'] }], {
268
- title: 'A plan',
269
- trip: [],
270
- });
271
- expect(plan.days[0]?.date).toBeUndefined();
272
- expect(plan.days[0]?.items[0]?.checkIn).toBeUndefined();
273
- });
274
- // A plan longer than the stay stops carrying dates rather than inventing
275
- // nights past check-out.
276
- it('stops at check-out rather than planning nights nobody booked', async () => {
277
- const plan = await buildItinerary(backend, [1, 2, 3, 4, 5].map((n) => ({ label: `Day ${n}`, items: ['hong-kong-island'] })), {
278
- title: 'Five days on a two-night stay',
279
- stay: { checkIn: '2026-10-19', checkOut: '2026-10-21', guests: 2 },
280
- trip: [],
281
- });
282
- expect(plan.days.map((d) => d.date)).toEqual([
283
- '2026-10-19',
284
- '2026-10-20',
285
- undefined,
286
- undefined,
287
- undefined,
288
- ]);
289
- });
290
- // ⚠️ robin's 1-7 October in Shanghai: the hotel named on day 1 only, and the
291
- // card priced one night of six (2026-09-29).
292
- it('keeps the guest at the last hotel on a dated day that names none, up to check-out', async () => {
293
- const plan = await buildItinerary(backend, [
294
- { label: 'Arrive', items: ['shanghai-pudong', 'airport-transfer'] },
295
- { label: 'The Bund', items: [] },
296
- { label: 'Old town', items: [] },
297
- { label: 'Leave', items: [] },
298
- ], {
299
- title: 'Shanghai',
300
- stay: { checkIn: '2026-10-19', checkOut: '2026-10-22', guests: 2 },
301
- trip: [],
302
- });
303
- const stays = plan.days.map((d) => d.items.filter((x) => x.kind === 'hotel'));
304
- expect(stays.map((s) => s.map((x) => x.night))).toEqual([[1], [2], [3], []]);
305
- const first = stays[0]?.[0];
306
- expect([first?.checkIn, first?.checkOut, first?.nights]).toEqual([
307
- '2026-10-19',
308
- '2026-10-22',
309
- 3,
310
- ]);
311
- expect(first?.price).toMatch(/for 3 nights, taxes in/);
312
- // One stay, counted once - not one per night it was carried to.
313
- expect(plan.planned).toBe(2);
314
- });
315
- // ⚠️ robin's Beijing plan named Shangri-La on "Day 7 — 离京" and the card drew
316
- // a second stay at a from-price (2026-09-29).
317
- it('reads the hotel named on check-out day as leaving it, not as another stay', async () => {
318
- const plan = await buildItinerary(backend, [
319
- { label: 'Arrive', items: ['hong-kong-island'] },
320
- { label: 'Harbour', items: [] },
321
- { label: 'Leave', items: ['hong-kong-island'] },
322
- ], {
323
- title: 'Hong Kong',
324
- stay: { checkIn: '2026-10-19', checkOut: '2026-10-21', guests: 2 },
325
- trip: [],
326
- });
327
- const leave = plan.days[2]?.items[0];
328
- expect(leave?.checkout).toBe(true);
329
- expect(leave?.price).toBeUndefined();
330
- expect(plan.days[0]?.items[0]?.nights).toBe(2);
331
- expect(plan.planned).toBe(1);
332
- });
333
- // ⚠️ The whole reason the field exists: a plan with nothing added still
334
- // renders, and still says so.
335
- it('says nothing is in the trip when nothing is', async () => {
336
- const plan = await buildItinerary(backend, [{ label: 'Day 1', items: ['hong-kong-island'] }], {
337
- title: 'A plan',
338
- trip: [],
339
- });
340
- expect(plan.planned).toBe(1);
341
- expect(plan.inTrip).toBe(0);
342
- });
343
- it('finds an add-on at a hotel the same plan named, and drops one nobody offers', async () => {
344
- const plan = await buildItinerary(backend, [{ label: 'Day 1', items: ['hong-kong-kerry', 'kids-club', 'helicopter-to-macau'] }], { title: 'A plan', trip: [] });
345
- expect(plan.days[0]?.items.map((i) => i.id)).toEqual(['hong-kong-kerry', 'kids-club']);
346
- expect(plan.dropped).toEqual([
347
- { name: 'helicopter-to-macau', why: 'nothing here answers to that' },
348
- ]);
349
- });
350
- it('keeps the day’s own words and drops a day with no label', async () => {
351
- const plan = await buildItinerary(backend, [
352
- { label: '', items: [] },
353
- { label: 'Day 2 — A slow one', note: 'Pool, then the play zone.' },
354
- ], { title: 'A plan', trip: [] });
355
- expect(plan.days).toHaveLength(1);
356
- expect(plan.days[0]?.note).toBe('Pool, then the play zone.');
357
- });
358
- it('holds ten days and six things a day, and no more', async () => {
359
- const plan = await buildItinerary(backend, Array.from({ length: 14 }, (_, i) => ({
360
- label: `Day ${i + 1}`,
361
- items: Array.from({ length: 9 }, () => 'hong-kong-island'),
362
- })), { title: 'A long one', trip: [] });
363
- expect(plan.days).toHaveLength(10);
364
- expect(plan.days[0]?.items).toHaveLength(6);
365
- });
366
- });
367
- //# sourceMappingURL=present.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"present.test.js","sourceRoot":"","sources":["../../src/__tests__/present.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=prose.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prose.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/prose.test.ts"],"names":[],"mappings":""}