@curless/hotel-storefront 0.54.0 → 0.55.0

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 (76) hide show
  1. package/dist/backend.d.ts +9 -0
  2. package/dist/backend.d.ts.map +1 -1
  3. package/dist/backend.js.map +1 -1
  4. package/dist/card.generated.d.ts +1 -1
  5. package/dist/card.generated.js +2 -2
  6. package/dist/card.generated.js.map +1 -1
  7. package/dist/config.d.ts +33 -2
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js.map +1 -1
  10. package/dist/demo-hotels.d.ts.map +1 -1
  11. package/dist/demo-hotels.js +29 -13
  12. package/dist/demo-hotels.js.map +1 -1
  13. package/dist/fence.d.ts.map +1 -1
  14. package/dist/fence.js +4 -3
  15. package/dist/fence.js.map +1 -1
  16. package/dist/huazhu/backend.d.ts.map +1 -1
  17. package/dist/huazhu/backend.js +17 -22
  18. package/dist/huazhu/backend.js.map +1 -1
  19. package/dist/huazhu/catalog.d.ts +6 -6
  20. package/dist/huazhu/catalog.d.ts.map +1 -1
  21. package/dist/huazhu/catalog.js +6 -9
  22. package/dist/huazhu/catalog.js.map +1 -1
  23. package/dist/legal.d.ts.map +1 -1
  24. package/dist/legal.js +104 -80
  25. package/dist/legal.js.map +1 -1
  26. package/dist/lib.d.ts +1 -1
  27. package/dist/lib.d.ts.map +1 -1
  28. package/dist/lib.js +1 -1
  29. package/dist/lib.js.map +1 -1
  30. package/dist/otaless/backend.d.ts +31 -0
  31. package/dist/otaless/backend.d.ts.map +1 -0
  32. package/dist/otaless/backend.js +502 -0
  33. package/dist/otaless/backend.js.map +1 -0
  34. package/dist/otaless/client.d.ts +103 -0
  35. package/dist/otaless/client.d.ts.map +1 -0
  36. package/dist/otaless/client.js +110 -0
  37. package/dist/otaless/client.js.map +1 -0
  38. package/dist/otaless/fake.d.ts +27 -0
  39. package/dist/otaless/fake.d.ts.map +1 -0
  40. package/dist/otaless/fake.js +239 -0
  41. package/dist/otaless/fake.js.map +1 -0
  42. package/dist/otaless/make.d.ts +4 -0
  43. package/dist/otaless/make.d.ts.map +1 -0
  44. package/dist/otaless/make.js +71 -0
  45. package/dist/otaless/make.js.map +1 -0
  46. package/dist/paid.d.ts.map +1 -1
  47. package/dist/paid.js +9 -11
  48. package/dist/paid.js.map +1 -1
  49. package/dist/present.d.ts +6 -1
  50. package/dist/present.d.ts.map +1 -1
  51. package/dist/present.js +20 -5
  52. package/dist/present.js.map +1 -1
  53. package/dist/reference.d.ts.map +1 -1
  54. package/dist/reference.js +10 -10
  55. package/dist/reference.js.map +1 -1
  56. package/dist/server.d.ts +2 -2
  57. package/dist/server.d.ts.map +1 -1
  58. package/dist/server.js +6 -4
  59. package/dist/server.js.map +1 -1
  60. package/dist/supplier.d.ts.map +1 -1
  61. package/dist/supplier.js +3 -0
  62. package/dist/supplier.js.map +1 -1
  63. package/dist/surface.d.ts.map +1 -1
  64. package/dist/surface.js +86 -66
  65. package/dist/surface.js.map +1 -1
  66. package/dist/tools.d.ts +8 -0
  67. package/dist/tools.d.ts.map +1 -1
  68. package/dist/tools.js +152 -109
  69. package/dist/tools.js.map +1 -1
  70. package/dist/types.d.ts +35 -0
  71. package/dist/types.d.ts.map +1 -1
  72. package/dist/vocab.d.ts +0 -28
  73. package/dist/vocab.d.ts.map +1 -1
  74. package/dist/vocab.js +19 -46
  75. package/dist/vocab.js.map +1 -1
  76. package/package.json +1 -1
@@ -0,0 +1,103 @@
1
+ /** Every answer: `code` 200 is success; anything else is the backend's refusal, `msg` its words. */
2
+ export type R<T> = {
3
+ code?: number;
4
+ msg?: string;
5
+ data?: T;
6
+ };
7
+ /** An amount in the hotel's own currency - and a USD figure we never show or sort by (robin, 2026-10-21). */
8
+ export type WirePrice = {
9
+ originalCurrency?: string;
10
+ originalAmount?: number | string;
11
+ settlementCurrency?: string;
12
+ settlementAmount?: number | string;
13
+ feeNotice?: string;
14
+ };
15
+ export type WireHotel = {
16
+ unifiedId?: string;
17
+ providerCode?: string;
18
+ brand?: string;
19
+ originalId?: string;
20
+ name?: string;
21
+ city?: string;
22
+ country?: string;
23
+ address?: string;
24
+ latitude?: number;
25
+ longitude?: number;
26
+ distanceKm?: number;
27
+ score?: number;
28
+ minPrice?: WirePrice;
29
+ amenities?: string[];
30
+ extensions?: Record<string, unknown>;
31
+ };
32
+ export type WireSearch = {
33
+ totalCount?: number;
34
+ queriedProviders?: string[];
35
+ successProviders?: string[];
36
+ degradedProviders?: string[];
37
+ executionTimes?: Record<string, number>;
38
+ hotels?: WireHotel[];
39
+ };
40
+ export type WireRoom = {
41
+ unifiedRoomId?: string;
42
+ originalRoomId?: string;
43
+ providerCode?: string;
44
+ name?: string;
45
+ bedType?: string;
46
+ maxOccupancy?: number;
47
+ price?: WirePrice;
48
+ breakfastIncluded?: boolean;
49
+ cancellationPolicy?: string;
50
+ amenities?: string[];
51
+ };
52
+ export type SearchBody = {
53
+ destination?: string;
54
+ checkIn?: string;
55
+ checkOut?: string;
56
+ adultCount?: number;
57
+ channelCodes?: string[];
58
+ sortBy?: 'price_asc' | 'price_desc' | 'score_desc';
59
+ lang?: string;
60
+ };
61
+ export type QuoteBody = {
62
+ unifiedHotelId: string;
63
+ roomId: string;
64
+ checkIn: string;
65
+ checkOut: string;
66
+ roomCount: number;
67
+ adultCount: number;
68
+ };
69
+ /** The backend refused, in its own code and words - or did not answer. */
70
+ export declare class OtalessError extends Error {
71
+ readonly status?: number | undefined;
72
+ readonly backendCode?: number | undefined;
73
+ constructor(message: string, status?: number | undefined, backendCode?: number | undefined);
74
+ }
75
+ /**
76
+ * The backend's `@RepeatSubmit`: the same request again within its window is
77
+ * refused with this code - reads too (总线程, 2026-11-03). Every read is kept
78
+ * for `CACHE_MS`, so a card redrawing or a model asking twice is answered from
79
+ * here and never sends the same request twice in a row.
80
+ */
81
+ export declare const REPEAT_SUBMIT = 10014;
82
+ export type OtalessClientOptions = {
83
+ baseUrl: string;
84
+ tenant: string;
85
+ fetch?: typeof fetch;
86
+ now?: () => number;
87
+ /** How long one request is waited for. */
88
+ timeoutMs?: number;
89
+ /** For tests: how long to wait before asking again after a repeat-submit refusal. */
90
+ repeatPauseMs?: number;
91
+ };
92
+ export type OtalessClient = {
93
+ search(body: SearchBody): Promise<WireSearch>;
94
+ rooms(q: {
95
+ unifiedHotelId: string;
96
+ checkIn?: string;
97
+ checkOut?: string;
98
+ lang?: string;
99
+ }): Promise<WireRoom[]>;
100
+ quote(body: QuoteBody): Promise<WirePrice>;
101
+ };
102
+ export declare const createOtalessClient: (opts: OtalessClientOptions) => OtalessClient;
103
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/otaless/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ // The Otaless hotel backend ("酒旅统一中台聚合 API", `/api/v1/ota/*`, the
2
+ // document of 2026-11-02 - kept on robin's machine, not in git): what it says
3
+ // on the wire, and how one request is made.
4
+ //
5
+ // ⚠️ READ-ONLY. Only search, rooms and quote are called. Every endpoint there
6
+ // is anonymous - an order id is enough to cancel anyone's booking (docs/
7
+ // otaless-hotels.md §8.0) - so nothing that books, cancels, signs in or lists
8
+ // orders is called from here until the backend says who is asking.
9
+ /** The backend refused, in its own code and words - or did not answer. */
10
+ export class OtalessError extends Error {
11
+ status;
12
+ backendCode;
13
+ constructor(message, status, backendCode) {
14
+ super(message);
15
+ this.status = status;
16
+ this.backendCode = backendCode;
17
+ }
18
+ }
19
+ /**
20
+ * The backend's `@RepeatSubmit`: the same request again within its window is
21
+ * refused with this code - reads too (总线程, 2026-11-03). Every read is kept
22
+ * for `CACHE_MS`, so a card redrawing or a model asking twice is answered from
23
+ * here and never sends the same request twice in a row.
24
+ */
25
+ export const REPEAT_SUBMIT = 10014;
26
+ const CACHE_MS = 60_000;
27
+ const CACHE_MAX = 300;
28
+ /** …and refused anyway (another process asked the same): once more, after a pause. */
29
+ const REPEAT_PAUSE_MS = 2_000;
30
+ export const createOtalessClient = (opts) => {
31
+ const base = opts.baseUrl.replace(/\/+$/, '');
32
+ const doFetch = opts.fetch ?? fetch;
33
+ const now = opts.now ?? Date.now;
34
+ const timeoutMs = opts.timeoutMs ?? 10_000;
35
+ const pause = opts.repeatPauseMs ?? REPEAT_PAUSE_MS;
36
+ const cache = new Map();
37
+ const once = async (method, path, body) => {
38
+ let res;
39
+ try {
40
+ res = await doFetch(`${base}${path}`, {
41
+ method,
42
+ headers: {
43
+ accept: 'application/json',
44
+ ...(body === undefined ? {} : { 'content-type': 'application/json' }),
45
+ 'X-Tenant-Id': opts.tenant,
46
+ },
47
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
48
+ signal: AbortSignal.timeout(timeoutMs),
49
+ });
50
+ }
51
+ catch (err) {
52
+ throw new OtalessError(`the Otaless hotel backend did not answer: ${err.message}`);
53
+ }
54
+ const text = await res.text();
55
+ let json;
56
+ try {
57
+ json = JSON.parse(text);
58
+ }
59
+ catch {
60
+ json = undefined;
61
+ }
62
+ if (!res.ok || !json || typeof json !== 'object') {
63
+ throw new OtalessError(`the Otaless hotel backend answered HTTP ${res.status}${json?.msg ? `: ${json.msg}` : ''}`, res.status, json?.code);
64
+ }
65
+ return json;
66
+ };
67
+ const call = async (method, path, body) => {
68
+ let r = await once(method, path, body);
69
+ if (r.code === REPEAT_SUBMIT) {
70
+ await new Promise((ok) => setTimeout(ok, pause));
71
+ r = await once(method, path, body);
72
+ }
73
+ if (r.code !== 200) {
74
+ throw new OtalessError(`the Otaless hotel backend refused: ${r.code ?? '?'} ${r.msg ?? ''}`.trim(), 200, r.code);
75
+ }
76
+ return r.data;
77
+ };
78
+ /** One read, kept for a minute - a failure is not kept. */
79
+ const read = (key, make) => {
80
+ const t = now();
81
+ const hit = cache.get(key);
82
+ if (hit && t - hit.at < CACHE_MS)
83
+ return hit.value;
84
+ const value = make();
85
+ cache.set(key, { at: t, value });
86
+ value.catch(() => {
87
+ if (cache.get(key)?.value === value)
88
+ cache.delete(key);
89
+ });
90
+ while (cache.size > CACHE_MAX) {
91
+ const first = cache.keys().next().value;
92
+ if (first === undefined)
93
+ break;
94
+ cache.delete(first);
95
+ }
96
+ return value;
97
+ };
98
+ return {
99
+ search: (body) => read(`search ${JSON.stringify(body)}`, () => call('POST', '/api/v1/ota/search', body)),
100
+ rooms: (q) => {
101
+ const qs = new URLSearchParams(Object.entries(q).filter((e) => typeof e[1] === 'string'));
102
+ return read(`rooms ${qs}`, async () => {
103
+ const data = await call('GET', `/api/v1/ota/rooms?${qs}`);
104
+ return Array.isArray(data) ? data : [];
105
+ });
106
+ },
107
+ quote: (body) => read(`quote ${JSON.stringify(body)}`, () => call('POST', '/api/v1/ota/rooms/quote', body)),
108
+ };
109
+ };
110
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/otaless/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { R, WireHotel, WireRoom, WireSearch } from './client.js';
2
+ export type OtalessScene = 'data' | 'empty' | 'degraded';
3
+ /** The dev backend's search answer, 2026-11-03 (总线程 and 酒店对接 both read it). */
4
+ export declare const RECORDED_DEGRADED: R<WireSearch>;
5
+ export declare const FAKE_HOTELS: WireHotel[];
6
+ export declare const FAKE_ROOMS: Record<string, WireRoom[]>;
7
+ export type FakeCall = {
8
+ method: string;
9
+ path: string;
10
+ body?: unknown;
11
+ };
12
+ export type OtalessFake = {
13
+ fetch: typeof fetch;
14
+ /** Every request it was sent, in order. */
15
+ calls: FakeCall[];
16
+ /** Which answer a search gets from now on. */
17
+ scene: (s: OtalessScene) => void;
18
+ /** These groups are degraded in the `data` scene too - their hotels left out. */
19
+ degrade: (codes: string[]) => void;
20
+ /** The next request is refused as a repeat (`@RepeatSubmit`, code 10014). */
21
+ refuseNextAsRepeat: () => void;
22
+ };
23
+ export declare const createOtalessFake: (opts?: {
24
+ scene?: OtalessScene;
25
+ tenant?: string;
26
+ }) => OtalessFake;
27
+ //# sourceMappingURL=fake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake.d.ts","sourceRoot":"","sources":["../../src/otaless/fake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,SAAS,EAAa,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAUjF,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AAIzD,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,UAAU,CAW3C,CAAC;AAUF,eAAO,MAAM,WAAW,EAAE,SAAS,EA2DlC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CA4EjD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,2CAA2C;IAC3C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,8CAA8C;IAC9C,KAAK,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;IACjC,iFAAiF;IACjF,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,6EAA6E;IAC7E,kBAAkB,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAWF,eAAO,MAAM,iBAAiB,GAC5B,OAAM;IAAE,KAAK,CAAC,EAAE,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,KACnD,WAgFF,CAAC"}
@@ -0,0 +1,239 @@
1
+ const ALL = ['clubmed', 'atour', 'ji', 'ascott', 'shangrila', 'curlessatour'];
2
+ /** The dev backend's search answer, 2026-11-03 (总线程 and 酒店对接 both read it). */
3
+ export const RECORDED_DEGRADED = {
4
+ code: 200,
5
+ data: {
6
+ totalCount: 0,
7
+ queriedProviders: ALL,
8
+ successProviders: [],
9
+ degradedProviders: ALL,
10
+ hotels: [],
11
+ executionTimes: { atour: 6, clubmed: 7, ascott: 6, curlessatour: 5, shangrila: 6, ji: 7 },
12
+ },
13
+ msg: 'Operation successful',
14
+ };
15
+ const price = (amount, currency = 'CNY', feeNotice) => ({
16
+ originalCurrency: currency,
17
+ originalAmount: amount,
18
+ settlementCurrency: 'USD',
19
+ settlementAmount: Math.round(amount * 0.14 * 100) / 100,
20
+ ...(feeNotice ? { feeNotice } : {}),
21
+ });
22
+ export const FAKE_HOTELS = [
23
+ // The document's own example, as it gives it.
24
+ {
25
+ unifiedId: 'ascott:orchard_sh',
26
+ providerCode: 'ascott',
27
+ brand: 'Ascott The Residence',
28
+ originalId: 'orchard_sh',
29
+ name: '上海雅诗阁淮海路服务公寓',
30
+ city: '上海',
31
+ country: 'CN',
32
+ address: '淮海中路282号香港广场',
33
+ latitude: 31.2231,
34
+ longitude: 121.4789,
35
+ distanceKm: 0.5,
36
+ score: 4.8,
37
+ minPrice: price(1280, 'CNY', '包含10%服务费与6%增值税'),
38
+ amenities: ['全套厨房', '室内恒温泳池', '洗衣干衣机', '高速WiFi'],
39
+ extensions: { residence_type: 'serviced_apartment', has_balcony: true },
40
+ },
41
+ {
42
+ unifiedId: 'atour:sh-xintiandi',
43
+ providerCode: 'atour',
44
+ brand: '亚朵酒店',
45
+ originalId: 'sh-xintiandi',
46
+ name: '上海新天地亚朵酒店',
47
+ city: '上海',
48
+ country: 'CN',
49
+ address: '黄浦区马当路388号',
50
+ latitude: 31.2152,
51
+ longitude: 121.4751,
52
+ score: 4.7,
53
+ minPrice: price(689),
54
+ amenities: ['健身房', '洗衣房', '高速WiFi'],
55
+ },
56
+ {
57
+ unifiedId: 'shangrila:pudong',
58
+ providerCode: 'shangrila',
59
+ brand: 'Shangri-La',
60
+ originalId: 'pudong',
61
+ // A name as long as a real one gets, for the card's wrapping.
62
+ name: '上海浦东香格里拉大酒店(陆家嘴滨江大道国际金融中心店)',
63
+ city: '上海',
64
+ country: 'CN',
65
+ address: '浦东富城路33号',
66
+ score: 4.9,
67
+ minPrice: price(1650),
68
+ amenities: ['室内泳池', '水疗中心', '健身中心'],
69
+ },
70
+ {
71
+ unifiedId: 'shangrila:penang-rasa',
72
+ providerCode: 'shangrila',
73
+ brand: 'Shangri-La',
74
+ originalId: 'penang-rasa',
75
+ name: 'Shangri-La Rasa Sayang, Penang',
76
+ city: 'Penang',
77
+ country: 'MY',
78
+ minPrice: price(980, 'MYR'),
79
+ amenities: ['Beachfront', 'Spa', 'Pool'],
80
+ },
81
+ ];
82
+ export const FAKE_ROOMS = {
83
+ 'ascott:orchard_sh': [
84
+ {
85
+ unifiedRoomId: 'ascott:room_1br_exec',
86
+ originalRoomId: '1br_exec',
87
+ providerCode: 'ascott',
88
+ name: '豪华一居室行政套房',
89
+ bedType: '特大双人床',
90
+ maxOccupancy: 2,
91
+ price: price(1380, 'CNY', '含税费及服务费'),
92
+ breakfastIncluded: true,
93
+ cancellationPolicy: '入住日前24小时内不可免费取消',
94
+ amenities: ['独立客厅', '高层景观', 'Nespresso咖啡机', '浴缸'],
95
+ },
96
+ {
97
+ unifiedRoomId: 'ascott:room_studio',
98
+ originalRoomId: 'studio',
99
+ providerCode: 'ascott',
100
+ name: '开间公寓',
101
+ bedType: '大床',
102
+ maxOccupancy: 2,
103
+ price: price(1280, 'CNY', '含税费及服务费'),
104
+ breakfastIncluded: false,
105
+ cancellationPolicy: '入住前1天18:00前可免费取消',
106
+ },
107
+ ],
108
+ 'atour:sh-xintiandi': [
109
+ {
110
+ unifiedRoomId: 'atour:room_king',
111
+ originalRoomId: 'king',
112
+ providerCode: 'atour',
113
+ name: '高级大床房',
114
+ bedType: '1.8米大床',
115
+ maxOccupancy: 2,
116
+ price: price(689),
117
+ breakfastIncluded: false,
118
+ cancellationPolicy: '入住前1天18:00前可免费取消',
119
+ },
120
+ {
121
+ unifiedRoomId: 'atour:room_twin',
122
+ originalRoomId: 'twin',
123
+ providerCode: 'atour',
124
+ name: '高级双床房',
125
+ bedType: '1.2米双床',
126
+ maxOccupancy: 2,
127
+ price: price(729),
128
+ breakfastIncluded: true,
129
+ // No terms sent: none are said.
130
+ },
131
+ ],
132
+ 'shangrila:pudong': [
133
+ {
134
+ unifiedRoomId: 'shangrila:deluxe_river',
135
+ originalRoomId: 'deluxe_river',
136
+ providerCode: 'shangrila',
137
+ name: '豪华江景房(含双人自助早餐及行政酒廊礼遇,可延迟退房至下午两点)',
138
+ bedType: '特大床',
139
+ maxOccupancy: 3,
140
+ price: price(1650),
141
+ breakfastIncluded: true,
142
+ cancellationPolicy: '2026-11-14 18:00 前免费取消',
143
+ },
144
+ ],
145
+ 'shangrila:penang-rasa': [
146
+ {
147
+ unifiedRoomId: 'shangrila:garden',
148
+ originalRoomId: 'garden',
149
+ providerCode: 'shangrila',
150
+ name: 'Garden Wing Deluxe',
151
+ bedType: 'King',
152
+ maxOccupancy: 2,
153
+ price: price(980, 'MYR'),
154
+ breakfastIncluded: false,
155
+ cancellationPolicy: 'Free cancellation until 3 days before arrival',
156
+ },
157
+ ],
158
+ };
159
+ const json = (body, status = 200) => new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json' } });
160
+ const nightsBetween = (a, b) => Math.max(1, Math.round((Date.parse(`${b}T00:00:00Z`) - Date.parse(`${a}T00:00:00Z`)) / 86_400_000));
161
+ export const createOtalessFake = (opts = {}) => {
162
+ let scene = opts.scene ?? 'data';
163
+ let down = [];
164
+ let repeat = false;
165
+ const calls = [];
166
+ const fetchFake = (async (input, init) => {
167
+ const url = new URL(String(input instanceof Request ? input.url : input));
168
+ const method = init?.method ?? 'GET';
169
+ const body = typeof init?.body === 'string' ? JSON.parse(init.body) : undefined;
170
+ calls.push({ method, path: `${url.pathname}${url.search}`, ...(body ? { body } : {}) });
171
+ const tenant = new Headers(init?.headers).get('X-Tenant-Id');
172
+ if (opts.tenant && tenant !== opts.tenant)
173
+ return json({ code: 401, msg: '租户不存在' });
174
+ if (repeat) {
175
+ repeat = false;
176
+ return json({ code: 10014, msg: 'Repeat submit is not allowed' });
177
+ }
178
+ if (url.pathname === '/api/v1/ota/search' && method === 'POST') {
179
+ if (scene === 'degraded')
180
+ return json(RECORDED_DEGRADED);
181
+ const asked = body?.channelCodes?.length
182
+ ? body.channelCodes
183
+ : ALL;
184
+ const failing = scene === 'empty' ? [] : asked.filter((c) => down.includes(c));
185
+ const where = String(body?.destination ?? '').toLowerCase();
186
+ const hotels = scene === 'empty'
187
+ ? []
188
+ : FAKE_HOTELS.filter((h) => asked.includes(h.providerCode ?? '') &&
189
+ !failing.includes(h.providerCode ?? '') &&
190
+ (!where ||
191
+ String(h.city).toLowerCase().includes(where) ||
192
+ (where === 'shanghai' && h.city === '上海') ||
193
+ String(h.name).toLowerCase().includes(where)));
194
+ return json({
195
+ code: 200,
196
+ msg: '操作成功',
197
+ data: {
198
+ totalCount: hotels.length,
199
+ queriedProviders: asked,
200
+ successProviders: asked.filter((c) => !failing.includes(c)),
201
+ degradedProviders: failing,
202
+ executionTimes: Object.fromEntries(asked.map((c) => [c, 200])),
203
+ hotels,
204
+ },
205
+ });
206
+ }
207
+ if (url.pathname === '/api/v1/ota/rooms' && method === 'GET') {
208
+ const id = url.searchParams.get('unifiedHotelId') ?? '';
209
+ return json({ code: 200, msg: '操作成功', data: FAKE_ROOMS[id] ?? [] });
210
+ }
211
+ if (url.pathname === '/api/v1/ota/rooms/quote' && method === 'POST') {
212
+ const room = (FAKE_ROOMS[String(body?.unifiedHotelId)] ?? []).find((r) => r.unifiedRoomId === `${String(body?.unifiedHotelId).split(':')[0]}:${body?.roomId}`);
213
+ if (!room?.price)
214
+ return json({ code: 500, msg: '房型不存在' });
215
+ const n = nightsBetween(String(body?.checkIn), String(body?.checkOut));
216
+ const total = Number(room.price.originalAmount) * n * Number(body?.roomCount ?? 1);
217
+ return json({
218
+ code: 200,
219
+ msg: '操作成功',
220
+ data: price(total, room.price.originalCurrency, `共${n}晚总价,已含税费及服务费`),
221
+ });
222
+ }
223
+ return json({ code: 404, msg: 'Not Found' }, 404);
224
+ });
225
+ return {
226
+ fetch: fetchFake,
227
+ calls,
228
+ scene: (s) => {
229
+ scene = s;
230
+ },
231
+ degrade: (codes) => {
232
+ down = codes;
233
+ },
234
+ refuseNextAsRepeat: () => {
235
+ repeat = true;
236
+ },
237
+ };
238
+ };
239
+ //# sourceMappingURL=fake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake.js","sourceRoot":"","sources":["../../src/otaless/fake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { HotelConfig } from '../config.js';
2
+ import type { Made, SupplierContext } from '../supplier.js';
3
+ export declare const makeOtaless: (data: HotelConfig["data"], ctx: SupplierContext) => Made;
4
+ //# sourceMappingURL=make.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make.d.ts","sourceRoot":"","sources":["../../src/otaless/make.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAkB5D,eAAO,MAAM,WAAW,GAAI,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,KAAK,eAAe,KAAG,IA4D7E,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { logoUrlOf } from '../aggregate/make.js';
2
+ import { createOtalessHotels } from './backend.js';
3
+ import { createOtalessClient } from './client.js';
4
+ // The Otaless hotel market as a config's `data` section (robin, 2026-11-03):
5
+ //
6
+ // "data": {
7
+ // "source": "otaless",
8
+ // "otaless": {
9
+ // "baseUrl": "https://apidev.curless.ai", "tenant": "207650",
10
+ // "groups": [{ "code": "atour", "name": "Atour", "names": { "zh": "亚朵" } }]
11
+ // }
12
+ // }
13
+ //
14
+ // `OTALESS_API_URL` and `OTALESS_TENANT_ID` in the environment win over both.
15
+ const CODE = /^[a-z0-9][a-z0-9-]{0,39}$/;
16
+ export const makeOtaless = (data, ctx) => {
17
+ const o = data.otaless ?? {};
18
+ const prefix = o.envPrefix ?? 'OTALESS';
19
+ const baseUrl = ctx.env[`${prefix}_API_URL`]?.trim() || o.baseUrl?.trim();
20
+ const tenant = ctx.env[`${prefix}_TENANT_ID`]?.trim() || o.tenant?.trim();
21
+ if (!baseUrl || !/^https?:\/\//.test(baseUrl)) {
22
+ throw new Error(`${ctx.brand}: data.source "otaless" needs the backend's address - ${prefix}_API_URL, or data.otaless.baseUrl`);
23
+ }
24
+ if (!tenant) {
25
+ throw new Error(`${ctx.brand}: data.source "otaless" needs the tenant id - ${prefix}_TENANT_ID, or data.otaless.tenant`);
26
+ }
27
+ const groups = (o.groups ?? []).map((g) => {
28
+ // ⚠️ THE CODE IS AN ADDRESS TOO: a group's logo is /suppliers/<code>/logo.png.
29
+ if (!CODE.test(g.code ?? '')) {
30
+ throw new Error(`${ctx.brand}: data.otaless.groups code "${String(g.code)}" must be the backend's providerCode: lower-case letters, digits and -`);
31
+ }
32
+ if (!g.name?.trim())
33
+ throw new Error(`${ctx.brand}: data.otaless.groups "${g.code}" needs a name`);
34
+ const logoUrl = ctx.publicUrl
35
+ ? logoUrlOf(ctx.publicUrl, g.code, g.logoFile, ctx.configPath)
36
+ : undefined;
37
+ return {
38
+ code: g.code,
39
+ name: g.name.trim(),
40
+ ...(g.names ? { names: g.names } : {}),
41
+ ...(logoUrl ? { logoUrl } : {}),
42
+ };
43
+ });
44
+ if (new Set(groups.map((g) => g.code)).size !== groups.length) {
45
+ throw new Error(`${ctx.brand}: data.otaless.groups names one code twice`);
46
+ }
47
+ const client = createOtalessClient({
48
+ baseUrl,
49
+ tenant,
50
+ ...(ctx.fetch ? { fetch: ctx.fetch } : {}),
51
+ now: ctx.now,
52
+ ...(data.timeoutMs ? { timeoutMs: data.timeoutMs } : {}),
53
+ });
54
+ const state = ctx.state.file('otaless-hotels.json');
55
+ const backend = createOtalessHotels({
56
+ brand: ctx.brand,
57
+ client,
58
+ groups,
59
+ ...(state ? { state } : {}),
60
+ });
61
+ return {
62
+ backend: data.reference ? { ...backend, reference: data.reference } : backend,
63
+ // The backend sends no picture (§8.2), so the card loads none.
64
+ imageDomains: () => [],
65
+ // Not known until a search: the home is never "the deployment's few hotels".
66
+ hotelCount: () => 0,
67
+ health: () => ({ backend: new URL(baseUrl).host, tenant }),
68
+ ready: () => Promise.resolve(),
69
+ };
70
+ };
71
+ //# sourceMappingURL=make.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make.js","sourceRoot":"","sources":["../../src/otaless/make.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,6EAA6E;AAC7E,EAAE;AACF,cAAc;AACd,2BAA2B;AAC3B,mBAAmB;AACnB,oEAAoE;AACpE,kFAAkF;AAClF,QAAQ;AACR,MAAM;AACN,EAAE;AACF,8EAA8E;AAE9E,MAAM,IAAI,GAAG,2BAA2B,CAAC;AAEzC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAyB,EAAE,GAAoB,EAAQ,EAAE;IACnF,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1E,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1E,IAAI,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,GAAG,GAAG,CAAC,KAAK,yDAAyD,MAAM,mCAAmC,CAC/G,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,GAAG,GAAG,CAAC,KAAK,iDAAiD,MAAM,oCAAoC,CACxG,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACxC,+EAA+E;QAC/E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,GAAG,GAAG,CAAC,KAAK,+BAA+B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,wEAAwE,CAClI,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,0BAA0B,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS;YAC3B,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC;YAC9D,CAAC,CAAC,SAAS,CAAC;QACd,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;YACnB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,4CAA4C,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,MAAM,GAAG,mBAAmB,CAAC;QACjC,OAAO;QACP,MAAM;QACN,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,mBAAmB,CAAC;QAClC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM;QACN,MAAM;QACN,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5B,CAAC,CAAC;IACH,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO;QAC7E,+DAA+D;QAC/D,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE;QACtB,6EAA6E;QAC7E,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1D,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;KAC/B,CAAC;AACJ,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"paid.d.ts","sourceRoot":"","sources":["../src/paid.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAmBlD,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;AAE/C,oHAAoH;AACpH,eAAO,MAAM,QAAQ,GAAI,SAAS,MAAM,GAAG,IAAI,KAAG,QAqBjD,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,UAAU,QAAwC,CAAC;AAEhE,2GAA2G;AAC3G,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,MAAM,KAAK,CAAC;AAQzB,MAAM,MAAM,OAAO,GAAG;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IAClE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,yGAAyG;IACzG,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,UAAU,GAAU,GAAG,OAAO,KAAG,OAAO,CAAC;IAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAuBxF,CAAC;AAEF,iHAAiH;AACjH,KAAK,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC,GAAG;IAClF,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAWF,eAAO,MAAM,QAAQ,GAAI,GAAG,KAAK,KAAG,MAoRnC,CAAC"}
1
+ {"version":3,"file":"paid.d.ts","sourceRoot":"","sources":["../src/paid.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAmBlD,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;AAE/C,oHAAoH;AACpH,eAAO,MAAM,QAAQ,GAAI,SAAS,MAAM,GAAG,IAAI,KAAG,QAqBjD,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,UAAU,QAAwC,CAAC;AAEhE,2GAA2G;AAC3G,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,MAAM,KAAK,CAAC;AAQzB,MAAM,MAAM,OAAO,GAAG;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IAClE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,yGAAyG;IACzG,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,UAAU,GAAU,GAAG,OAAO,KAAG,OAAO,CAAC;IAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAuBxF,CAAC;AAEF,iHAAiH;AACjH,KAAK,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC,GAAG;IAClF,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAQF,eAAO,MAAM,QAAQ,GAAI,GAAG,KAAK,KAAG,MAmRnC,CAAC"}