@voyant-travel/cruises 0.118.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +50 -0
- package/dist/adapters/connect-compat.d.ts +20 -0
- package/dist/adapters/connect-compat.d.ts.map +1 -0
- package/dist/adapters/connect-compat.js +71 -0
- package/dist/adapters/contract-fixture.d.ts +32 -0
- package/dist/adapters/contract-fixture.d.ts.map +1 -0
- package/dist/adapters/contract-fixture.js +152 -0
- package/dist/adapters/index.d.ts +331 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +16 -0
- package/dist/adapters/memoize.d.ts +28 -0
- package/dist/adapters/memoize.d.ts.map +1 -0
- package/dist/adapters/memoize.js +131 -0
- package/dist/adapters/mock.d.ts +44 -0
- package/dist/adapters/mock.d.ts.map +1 -0
- package/dist/adapters/mock.js +192 -0
- package/dist/adapters/registry.d.ts +26 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +42 -0
- package/dist/adapters/source-adapter-shim.d.ts +80 -0
- package/dist/adapters/source-adapter-shim.d.ts.map +1 -0
- package/dist/adapters/source-adapter-shim.js +390 -0
- package/dist/booking-engine/handler.d.ts +108 -0
- package/dist/booking-engine/handler.d.ts.map +1 -0
- package/dist/booking-engine/handler.js +225 -0
- package/dist/booking-engine/index.d.ts +9 -0
- package/dist/booking-engine/index.d.ts.map +1 -0
- package/dist/booking-engine/index.js +8 -0
- package/dist/booking-extension.d.ts +1179 -0
- package/dist/booking-extension.d.ts.map +1 -0
- package/dist/booking-extension.js +342 -0
- package/dist/cabin-features.d.ts +8 -0
- package/dist/cabin-features.d.ts.map +1 -0
- package/dist/cabin-features.js +7 -0
- package/dist/catalog-policy-cabins.d.ts +18 -0
- package/dist/catalog-policy-cabins.d.ts.map +1 -0
- package/dist/catalog-policy-cabins.js +96 -0
- package/dist/catalog-policy-core.d.ts +3 -0
- package/dist/catalog-policy-core.d.ts.map +1 -0
- package/dist/catalog-policy-core.js +247 -0
- package/dist/catalog-policy-structure.d.ts +3 -0
- package/dist/catalog-policy-structure.d.ts.map +1 -0
- package/dist/catalog-policy-structure.js +387 -0
- package/dist/catalog-policy.d.ts +15 -0
- package/dist/catalog-policy.d.ts.map +1 -0
- package/dist/catalog-policy.js +19 -0
- package/dist/content-shape.d.ts +5 -0
- package/dist/content-shape.d.ts.map +1 -0
- package/dist/content-shape.js +13 -0
- package/dist/draft-shape.d.ts +59 -0
- package/dist/draft-shape.d.ts.map +1 -0
- package/dist/draft-shape.js +98 -0
- package/dist/events.d.ts +21 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +21 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/lib/key.d.ts +41 -0
- package/dist/lib/key.d.ts.map +1 -0
- package/dist/lib/key.js +100 -0
- package/dist/routes-booking-payloads.d.ts +133 -0
- package/dist/routes-booking-payloads.d.ts.map +1 -0
- package/dist/routes-booking-payloads.js +142 -0
- package/dist/routes-content.d.ts +53 -0
- package/dist/routes-content.d.ts.map +1 -0
- package/dist/routes-content.js +158 -0
- package/dist/routes-core.d.ts +4 -0
- package/dist/routes-core.d.ts.map +1 -0
- package/dist/routes-core.js +68 -0
- package/dist/routes-detail.d.ts +4 -0
- package/dist/routes-detail.d.ts.map +1 -0
- package/dist/routes-detail.js +261 -0
- package/dist/routes-env.d.ts +13 -0
- package/dist/routes-env.d.ts.map +1 -0
- package/dist/routes-env.js +1 -0
- package/dist/routes-keying.d.ts +28 -0
- package/dist/routes-keying.d.ts.map +1 -0
- package/dist/routes-keying.js +70 -0
- package/dist/routes-public.d.ts +911 -0
- package/dist/routes-public.d.ts.map +1 -0
- package/dist/routes-public.js +252 -0
- package/dist/routes-sailings-prices.d.ts +4 -0
- package/dist/routes-sailings-prices.d.ts.map +1 -0
- package/dist/routes-sailings-prices.js +278 -0
- package/dist/routes-search-index.d.ts +4 -0
- package/dist/routes-search-index.d.ts.map +1 -0
- package/dist/routes-search-index.js +25 -0
- package/dist/routes-ships.d.ts +4 -0
- package/dist/routes-ships.d.ts.map +1 -0
- package/dist/routes-ships.js +147 -0
- package/dist/routes-voyage-groups.d.ts +4 -0
- package/dist/routes-voyage-groups.d.ts.map +1 -0
- package/dist/routes-voyage-groups.js +85 -0
- package/dist/routes.d.ts +5 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +14 -0
- package/dist/schema-cabins.d.ts +1098 -0
- package/dist/schema-cabins.d.ts.map +1 -0
- package/dist/schema-cabins.js +105 -0
- package/dist/schema-content.d.ts +577 -0
- package/dist/schema-content.d.ts.map +1 -0
- package/dist/schema-content.js +63 -0
- package/dist/schema-core.d.ts +1790 -0
- package/dist/schema-core.d.ts.map +1 -0
- package/dist/schema-core.js +171 -0
- package/dist/schema-itinerary.d.ts +556 -0
- package/dist/schema-itinerary.d.ts.map +1 -0
- package/dist/schema-itinerary.js +50 -0
- package/dist/schema-pricing.d.ts +633 -0
- package/dist/schema-pricing.d.ts.map +1 -0
- package/dist/schema-pricing.js +73 -0
- package/dist/schema-search.d.ts +611 -0
- package/dist/schema-search.d.ts.map +1 -0
- package/dist/schema-search.js +64 -0
- package/dist/schema-shared.d.ts +23 -0
- package/dist/schema-shared.d.ts.map +1 -0
- package/dist/schema-shared.js +107 -0
- package/dist/schema-sourced-content.d.ts +247 -0
- package/dist/schema-sourced-content.d.ts.map +1 -0
- package/dist/schema-sourced-content.js +38 -0
- package/dist/schema.d.ts +10 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +9 -0
- package/dist/service-booking-helpers.d.ts +12 -0
- package/dist/service-booking-helpers.d.ts.map +1 -0
- package/dist/service-booking-helpers.js +94 -0
- package/dist/service-booking-types.d.ts +101 -0
- package/dist/service-booking-types.d.ts.map +1 -0
- package/dist/service-booking-types.js +1 -0
- package/dist/service-bookings.d.ts +46 -0
- package/dist/service-bookings.d.ts.map +1 -0
- package/dist/service-bookings.js +420 -0
- package/dist/service-catalog-plane-cabins.d.ts +24 -0
- package/dist/service-catalog-plane-cabins.d.ts.map +1 -0
- package/dist/service-catalog-plane-cabins.js +90 -0
- package/dist/service-catalog-plane.d.ts +74 -0
- package/dist/service-catalog-plane.d.ts.map +1 -0
- package/dist/service-catalog-plane.js +194 -0
- package/dist/service-content-synthesizer.d.ts +42 -0
- package/dist/service-content-synthesizer.d.ts.map +1 -0
- package/dist/service-content-synthesizer.js +144 -0
- package/dist/service-content.d.ts +74 -0
- package/dist/service-content.d.ts.map +1 -0
- package/dist/service-content.js +315 -0
- package/dist/service-core.d.ts +134 -0
- package/dist/service-core.d.ts.map +1 -0
- package/dist/service-core.js +257 -0
- package/dist/service-detach.d.ts +18 -0
- package/dist/service-detach.d.ts.map +1 -0
- package/dist/service-detach.js +199 -0
- package/dist/service-enrichment.d.ts +11 -0
- package/dist/service-enrichment.d.ts.map +1 -0
- package/dist/service-enrichment.js +47 -0
- package/dist/service-external-refresh.d.ts +39 -0
- package/dist/service-external-refresh.d.ts.map +1 -0
- package/dist/service-external-refresh.js +47 -0
- package/dist/service-itinerary.d.ts +22 -0
- package/dist/service-itinerary.d.ts.map +1 -0
- package/dist/service-itinerary.js +34 -0
- package/dist/service-prices.d.ts +46 -0
- package/dist/service-prices.d.ts.map +1 -0
- package/dist/service-prices.js +89 -0
- package/dist/service-pricing.d.ts +97 -0
- package/dist/service-pricing.d.ts.map +1 -0
- package/dist/service-pricing.js +198 -0
- package/dist/service-sailings.d.ts +48 -0
- package/dist/service-sailings.d.ts.map +1 -0
- package/dist/service-sailings.js +145 -0
- package/dist/service-search-types.d.ts +54 -0
- package/dist/service-search-types.d.ts.map +1 -0
- package/dist/service-search-types.js +1 -0
- package/dist/service-search.d.ts +65 -0
- package/dist/service-search.d.ts.map +1 -0
- package/dist/service-search.js +467 -0
- package/dist/service-shared.d.ts +22 -0
- package/dist/service-shared.d.ts.map +1 -0
- package/dist/service-shared.js +22 -0
- package/dist/service-ships.d.ts +47 -0
- package/dist/service-ships.d.ts.map +1 -0
- package/dist/service-ships.js +156 -0
- package/dist/service.d.ts +255 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +12 -0
- package/dist/validation-cabins.d.ts +267 -0
- package/dist/validation-cabins.d.ts.map +1 -0
- package/dist/validation-cabins.js +77 -0
- package/dist/validation-content.d.ts +123 -0
- package/dist/validation-content.d.ts.map +1 -0
- package/dist/validation-content.js +40 -0
- package/dist/validation-core.d.ts +393 -0
- package/dist/validation-core.d.ts.map +1 -0
- package/dist/validation-core.js +162 -0
- package/dist/validation-itinerary.d.ts +123 -0
- package/dist/validation-itinerary.d.ts.map +1 -0
- package/dist/validation-itinerary.js +47 -0
- package/dist/validation-pricing.d.ts +137 -0
- package/dist/validation-pricing.d.ts.map +1 -0
- package/dist/validation-pricing.js +49 -0
- package/dist/validation-search.d.ts +118 -0
- package/dist/validation-search.d.ts.map +1 -0
- package/dist/validation-search.js +60 -0
- package/dist/validation-shared.d.ts +123 -0
- package/dist/validation-shared.d.ts.map +1 -0
- package/dist/validation-shared.js +103 -0
- package/dist/validation.d.ts +8 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +7 -0
- package/package.json +146 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter contract for external cruise inventory.
|
|
3
|
+
*
|
|
4
|
+
* The cruises module is a storage + service + routes layer for both self-managed
|
|
5
|
+
* and external cruises. External cruises live entirely in an upstream system
|
|
6
|
+
* (Voyant Connect, a custom agency adapter, etc.) and are reached through a
|
|
7
|
+
* registered adapter that implements this contract.
|
|
8
|
+
*
|
|
9
|
+
* The contract is deliberately small. Templates default to the Voyant Connect
|
|
10
|
+
* adapter; agencies that prefer their own connectivity engine register a custom
|
|
11
|
+
* implementation instead. See docs/architecture/cruises-module.md §10.
|
|
12
|
+
*/
|
|
13
|
+
import type { CabinAccessibilityFeature, CabinBedConfiguration, CabinViewType } from "../cabin-features.js";
|
|
14
|
+
import type { Quote, QuoteBookingTerms, QuoteComponent } from "../service-pricing.js";
|
|
15
|
+
/**
|
|
16
|
+
* Opaque pointer back to the adapter's upstream identifier(s) for a cruise,
|
|
17
|
+
* sailing, ship, or cabin category. Adapters may store any extra fields they
|
|
18
|
+
* need (connection IDs, vendor-specific codes, snapshot timestamps).
|
|
19
|
+
*/
|
|
20
|
+
export type SourceRef = {
|
|
21
|
+
connectionId?: string;
|
|
22
|
+
externalId: string;
|
|
23
|
+
[key: string]: unknown;
|
|
24
|
+
};
|
|
25
|
+
export type ExternalPassengerComposition = {
|
|
26
|
+
adults: number;
|
|
27
|
+
children?: number;
|
|
28
|
+
childAges?: number[];
|
|
29
|
+
infants?: number;
|
|
30
|
+
seniors?: number;
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
};
|
|
33
|
+
export type ExternalBookingTerms = QuoteBookingTerms;
|
|
34
|
+
export type ExternalFareVariant = "cruise_only" | "air_inclusive";
|
|
35
|
+
export type ExternalCruise = {
|
|
36
|
+
sourceRef: SourceRef;
|
|
37
|
+
name: string;
|
|
38
|
+
slug: string;
|
|
39
|
+
cruiseType: "ocean" | "river" | "expedition" | "coastal";
|
|
40
|
+
lineName: string;
|
|
41
|
+
defaultShipRef?: SourceRef;
|
|
42
|
+
nights: number;
|
|
43
|
+
embarkPortName?: string | null;
|
|
44
|
+
embarkPortCanonicalPlaceId?: string | null;
|
|
45
|
+
disembarkPortName?: string | null;
|
|
46
|
+
disembarkPortCanonicalPlaceId?: string | null;
|
|
47
|
+
description?: string | null;
|
|
48
|
+
shortDescription?: string | null;
|
|
49
|
+
highlights?: string[];
|
|
50
|
+
inclusionsHtml?: string | null;
|
|
51
|
+
exclusionsHtml?: string | null;
|
|
52
|
+
regionIds?: string[];
|
|
53
|
+
waterwayIds?: string[];
|
|
54
|
+
portIds?: string[];
|
|
55
|
+
countryIso?: string[];
|
|
56
|
+
regions?: string[];
|
|
57
|
+
waterways?: string[];
|
|
58
|
+
ports?: string[];
|
|
59
|
+
countries?: string[];
|
|
60
|
+
themes?: string[];
|
|
61
|
+
heroImageUrl?: string | null;
|
|
62
|
+
mapImageUrl?: string | null;
|
|
63
|
+
status?: "draft" | "awaiting_review" | "live" | "archived";
|
|
64
|
+
};
|
|
65
|
+
export type ExternalSailing = {
|
|
66
|
+
sourceRef: SourceRef;
|
|
67
|
+
cruiseRef: SourceRef;
|
|
68
|
+
shipRef: SourceRef;
|
|
69
|
+
departureDate: string;
|
|
70
|
+
returnDate: string;
|
|
71
|
+
embarkPortName?: string | null;
|
|
72
|
+
embarkPortCanonicalPlaceId?: string | null;
|
|
73
|
+
disembarkPortName?: string | null;
|
|
74
|
+
disembarkPortCanonicalPlaceId?: string | null;
|
|
75
|
+
direction?: "upstream" | "downstream" | "round_trip" | "one_way" | null;
|
|
76
|
+
availabilityNote?: string | null;
|
|
77
|
+
isCharter?: boolean;
|
|
78
|
+
salesStatus?: "open" | "on_request" | "wait_list" | "sold_out" | "closed";
|
|
79
|
+
lowestPriceCents?: number | null;
|
|
80
|
+
currency?: string | null;
|
|
81
|
+
};
|
|
82
|
+
export type ExternalShip = {
|
|
83
|
+
sourceRef: SourceRef;
|
|
84
|
+
name: string;
|
|
85
|
+
slug: string;
|
|
86
|
+
shipType: "ocean" | "river" | "expedition" | "yacht" | "sailing" | "coastal";
|
|
87
|
+
capacityGuests?: number | null;
|
|
88
|
+
capacityCrew?: number | null;
|
|
89
|
+
cabinCount?: number | null;
|
|
90
|
+
deckCount?: number | null;
|
|
91
|
+
lengthMeters?: string | null;
|
|
92
|
+
cruisingSpeedKnots?: string | null;
|
|
93
|
+
yearBuilt?: number | null;
|
|
94
|
+
yearRefurbished?: number | null;
|
|
95
|
+
imo?: string | null;
|
|
96
|
+
description?: string | null;
|
|
97
|
+
deckPlanUrl?: string | null;
|
|
98
|
+
gallery?: string[];
|
|
99
|
+
amenities?: Record<string, unknown>;
|
|
100
|
+
decks?: ExternalDeck[];
|
|
101
|
+
categories?: ExternalCabinCategory[];
|
|
102
|
+
};
|
|
103
|
+
export type ExternalDeck = {
|
|
104
|
+
name: string;
|
|
105
|
+
level?: number | null;
|
|
106
|
+
planImageUrl?: string | null;
|
|
107
|
+
};
|
|
108
|
+
export type ExternalCabinCategory = {
|
|
109
|
+
sourceRef: SourceRef;
|
|
110
|
+
code: string;
|
|
111
|
+
name: string;
|
|
112
|
+
roomType: "inside" | "oceanview" | "balcony" | "suite" | "penthouse" | "single";
|
|
113
|
+
description?: string | null;
|
|
114
|
+
minOccupancy: number;
|
|
115
|
+
maxOccupancy: number;
|
|
116
|
+
squareFeet?: string | null;
|
|
117
|
+
wheelchairAccessible?: boolean;
|
|
118
|
+
amenities?: string[];
|
|
119
|
+
featureCodes?: string[];
|
|
120
|
+
bedConfigurations?: CabinBedConfiguration[];
|
|
121
|
+
accessibilityFeatures?: CabinAccessibilityFeature[];
|
|
122
|
+
viewType?: CabinViewType | null;
|
|
123
|
+
images?: string[];
|
|
124
|
+
floorplanImages?: string[];
|
|
125
|
+
gradeCodes?: string[];
|
|
126
|
+
};
|
|
127
|
+
export type ExternalPriceRow = {
|
|
128
|
+
sourceRef?: SourceRef;
|
|
129
|
+
cabinCategoryRef: SourceRef;
|
|
130
|
+
occupancy: number;
|
|
131
|
+
passengerComposition?: ExternalPassengerComposition | null;
|
|
132
|
+
fareCode?: string | null;
|
|
133
|
+
fareCodeName?: string | null;
|
|
134
|
+
fareVariant?: ExternalFareVariant;
|
|
135
|
+
currency: string;
|
|
136
|
+
pricePerPerson: string;
|
|
137
|
+
originalPricePerPerson?: string | null;
|
|
138
|
+
secondGuestPricePerPerson?: string | null;
|
|
139
|
+
singlePricePerPerson?: string | null;
|
|
140
|
+
singleSupplementPercent?: string | null;
|
|
141
|
+
availability: "available" | "limited" | "on_request" | "wait_list" | "sold_out";
|
|
142
|
+
availabilityCount?: number | null;
|
|
143
|
+
bookingDeadline?: string | null;
|
|
144
|
+
earlyBookingDeadline?: string | null;
|
|
145
|
+
earlyBookingBonusDescription?: string | null;
|
|
146
|
+
requiresRequest?: boolean;
|
|
147
|
+
notes?: string | null;
|
|
148
|
+
components?: ExternalPriceComponent[];
|
|
149
|
+
bookingTerms?: ExternalBookingTerms | null;
|
|
150
|
+
};
|
|
151
|
+
export type ExternalPriceComponent = {
|
|
152
|
+
kind: "gratuity" | "onboard_credit" | "port_charge" | "tax" | "ncf" | "airfare" | "transfer" | "insurance" | "single_supplement" | "other";
|
|
153
|
+
label?: string | null;
|
|
154
|
+
amount: string;
|
|
155
|
+
currency: string;
|
|
156
|
+
direction: "addition" | "inclusion" | "credit";
|
|
157
|
+
perPerson: boolean;
|
|
158
|
+
};
|
|
159
|
+
export type ExternalItineraryDay = {
|
|
160
|
+
dayNumber: number;
|
|
161
|
+
title?: string | null;
|
|
162
|
+
description?: string | null;
|
|
163
|
+
portName?: string | null;
|
|
164
|
+
portCanonicalPlaceId?: string | null;
|
|
165
|
+
arrivalTime?: string | null;
|
|
166
|
+
departureTime?: string | null;
|
|
167
|
+
isOvernight?: boolean;
|
|
168
|
+
isSeaDay?: boolean;
|
|
169
|
+
isExpeditionLanding?: boolean;
|
|
170
|
+
meals?: {
|
|
171
|
+
breakfast?: boolean;
|
|
172
|
+
lunch?: boolean;
|
|
173
|
+
dinner?: boolean;
|
|
174
|
+
};
|
|
175
|
+
};
|
|
176
|
+
export type CruiseSearchProjectionEntry = {
|
|
177
|
+
sourceRef: SourceRef;
|
|
178
|
+
slug: string;
|
|
179
|
+
name: string;
|
|
180
|
+
cruiseType: "ocean" | "river" | "expedition" | "coastal";
|
|
181
|
+
lineName: string;
|
|
182
|
+
shipName: string;
|
|
183
|
+
/**
|
|
184
|
+
* Upstream external ids for the cruise line + ship. Map onto the catalog
|
|
185
|
+
* `lineSupplierId` / `defaultShipId` columns (the search index facets on
|
|
186
|
+
* ids, not the display names). Surfaced by `@voyant-travel/connect-cruises` ≥0.3.0.
|
|
187
|
+
*/
|
|
188
|
+
lineExternalId?: string;
|
|
189
|
+
shipExternalId?: string;
|
|
190
|
+
nights: number;
|
|
191
|
+
embarkPortName?: string | null;
|
|
192
|
+
embarkPortFacilityId?: string | null;
|
|
193
|
+
embarkPortCanonicalPlaceId?: string | null;
|
|
194
|
+
disembarkPortName?: string | null;
|
|
195
|
+
disembarkPortFacilityId?: string | null;
|
|
196
|
+
disembarkPortCanonicalPlaceId?: string | null;
|
|
197
|
+
regionIds?: string[];
|
|
198
|
+
waterwayIds?: string[];
|
|
199
|
+
portIds?: string[];
|
|
200
|
+
countryIso?: string[];
|
|
201
|
+
regions?: string[];
|
|
202
|
+
waterways?: string[];
|
|
203
|
+
ports?: string[];
|
|
204
|
+
countries?: string[];
|
|
205
|
+
themes?: string[];
|
|
206
|
+
earliestDeparture?: string | null;
|
|
207
|
+
latestDeparture?: string | null;
|
|
208
|
+
/**
|
|
209
|
+
* Distinct departure months across the cruise's sailings as `YYYY-MM`
|
|
210
|
+
* strings (e.g. `["2027-03", "2027-04"]`). Facetable so browse surfaces can
|
|
211
|
+
* filter by departure month/year. Populated from the per-cruise sailing list
|
|
212
|
+
* at sync time (the upstream search projection only carries the window).
|
|
213
|
+
*/
|
|
214
|
+
departureMonths?: string[] | null;
|
|
215
|
+
/** Total number of sailings (departures) the cruise has. */
|
|
216
|
+
departureCount?: number | null;
|
|
217
|
+
lowestPriceCents?: number | null;
|
|
218
|
+
lowestPriceCurrency?: string | null;
|
|
219
|
+
salesStatus?: string | null;
|
|
220
|
+
heroImageUrl?: string | null;
|
|
221
|
+
};
|
|
222
|
+
export type ExternalCruiseSummary = {
|
|
223
|
+
sourceRef: SourceRef;
|
|
224
|
+
name: string;
|
|
225
|
+
slug: string;
|
|
226
|
+
cruiseType: "ocean" | "river" | "expedition" | "coastal";
|
|
227
|
+
lineName: string;
|
|
228
|
+
shipName?: string;
|
|
229
|
+
nights: number;
|
|
230
|
+
earliestDeparture?: string | null;
|
|
231
|
+
departureCount?: number | null;
|
|
232
|
+
lowestPriceCents?: number | null;
|
|
233
|
+
lowestPriceCurrency?: string | null;
|
|
234
|
+
heroImageUrl?: string | null;
|
|
235
|
+
};
|
|
236
|
+
export type ListEntriesOptions = {
|
|
237
|
+
since?: Date;
|
|
238
|
+
cursor?: string;
|
|
239
|
+
limit?: number;
|
|
240
|
+
};
|
|
241
|
+
export type ListEntriesResult = {
|
|
242
|
+
entries: ExternalCruiseSummary[];
|
|
243
|
+
nextCursor?: string;
|
|
244
|
+
};
|
|
245
|
+
export type ExternalPassengerInput = {
|
|
246
|
+
firstName: string;
|
|
247
|
+
lastName: string;
|
|
248
|
+
email?: string | null;
|
|
249
|
+
phone?: string | null;
|
|
250
|
+
travelerCategory?: "adult" | "child" | "infant" | "senior" | "other" | null;
|
|
251
|
+
preferredLanguage?: string | null;
|
|
252
|
+
specialRequests?: string | null;
|
|
253
|
+
isPrimary?: boolean;
|
|
254
|
+
};
|
|
255
|
+
export type ExternalContactInput = {
|
|
256
|
+
firstName: string;
|
|
257
|
+
lastName: string;
|
|
258
|
+
email?: string | null;
|
|
259
|
+
phone?: string | null;
|
|
260
|
+
language?: string | null;
|
|
261
|
+
country?: string | null;
|
|
262
|
+
region?: string | null;
|
|
263
|
+
city?: string | null;
|
|
264
|
+
address?: string | null;
|
|
265
|
+
postalCode?: string | null;
|
|
266
|
+
};
|
|
267
|
+
export type CreateExternalBookingInput = {
|
|
268
|
+
sailingRef: SourceRef;
|
|
269
|
+
cabinCategoryRef: SourceRef;
|
|
270
|
+
occupancy: number;
|
|
271
|
+
passengerComposition?: ExternalPassengerComposition | null;
|
|
272
|
+
fareCode?: string | null;
|
|
273
|
+
fareVariant?: ExternalFareVariant | null;
|
|
274
|
+
passengers: ExternalPassengerInput[];
|
|
275
|
+
contact: ExternalContactInput;
|
|
276
|
+
bookingTerms?: ExternalBookingTerms | null;
|
|
277
|
+
notes?: string | null;
|
|
278
|
+
};
|
|
279
|
+
export type ExternalBookingResult = {
|
|
280
|
+
/** Upstream confirmation reference (e.g. cruise-line PNR, vendor booking id). */
|
|
281
|
+
connectorBookingRef: string;
|
|
282
|
+
/** Upstream-side status string for display. */
|
|
283
|
+
connectorStatus?: string | null;
|
|
284
|
+
/** Final quote as resolved by the upstream — used to refresh the local snapshot
|
|
285
|
+
in case of any minor adjustments (e.g. last-minute promo expiry). */
|
|
286
|
+
finalQuote?: Quote;
|
|
287
|
+
/** Optional snapshot components to override the locally-composed list. */
|
|
288
|
+
finalComponents?: QuoteComponent[];
|
|
289
|
+
/** Commercial terms confirmed by the upstream at commit time. */
|
|
290
|
+
finalBookingTerms?: ExternalBookingTerms | null;
|
|
291
|
+
};
|
|
292
|
+
export interface CruiseAdapter {
|
|
293
|
+
readonly name: string;
|
|
294
|
+
readonly version: string;
|
|
295
|
+
/**
|
|
296
|
+
* Catalog browse — backs admin list and the storefront list once it's wired
|
|
297
|
+
* to read external entries (phase 4 will run searchProjection in the background
|
|
298
|
+
* to keep cruise_search_index hot; admin can call this at request time).
|
|
299
|
+
*/
|
|
300
|
+
listEntries(options?: ListEntriesOptions): Promise<ListEntriesResult>;
|
|
301
|
+
/**
|
|
302
|
+
* Slim projection stream for storefront search-index population (phase 4).
|
|
303
|
+
* Default no-op-iter implementations are fine for adapters that don't power
|
|
304
|
+
* a customer-facing storefront.
|
|
305
|
+
*/
|
|
306
|
+
searchProjection(options?: ListEntriesOptions): AsyncIterable<CruiseSearchProjectionEntry>;
|
|
307
|
+
fetchCruise(sourceRef: SourceRef): Promise<ExternalCruise | null>;
|
|
308
|
+
fetchSailing(sourceRef: SourceRef): Promise<ExternalSailing | null>;
|
|
309
|
+
fetchSailingPricing(sourceRef: SourceRef): Promise<ExternalPriceRow[]>;
|
|
310
|
+
fetchSailingItinerary(sourceRef: SourceRef): Promise<ExternalItineraryDay[]>;
|
|
311
|
+
fetchShip(sourceRef: SourceRef): Promise<ExternalShip | null>;
|
|
312
|
+
/**
|
|
313
|
+
* Sailings on a given external cruise, used by GET /v1/admin/cruises/:key/sailings
|
|
314
|
+
* when the key is external.
|
|
315
|
+
*/
|
|
316
|
+
listSailingsForCruise(cruiseRef: SourceRef): Promise<ExternalSailing[]>;
|
|
317
|
+
/**
|
|
318
|
+
* Booking commit. Returns the upstream confirmation reference + a final quote
|
|
319
|
+
* snapshot that the local booking row stores in booking_cruise_details.
|
|
320
|
+
* Throws on upstream errors so the caller's transaction rolls back.
|
|
321
|
+
*/
|
|
322
|
+
createBooking(input: CreateExternalBookingInput): Promise<ExternalBookingResult>;
|
|
323
|
+
}
|
|
324
|
+
export type AdapterCallContext = {
|
|
325
|
+
adapterName: string;
|
|
326
|
+
method: string;
|
|
327
|
+
};
|
|
328
|
+
export { assertCruiseAdapterCompatibility, type CruiseAdapterCompatibilityCheck, type CruiseAdapterCompatibilityCheckName, type CruiseAdapterCompatibilityFixture, type CruiseAdapterCompatibilityReport, validateCruiseAdapterCompatibility, } from "./contract-fixture.js";
|
|
329
|
+
export { type CompatibilityMappingResult, type ConnectCabinRoomType, type ConnectCruiseType, type ConnectEnrichmentKind, type ConnectInclusionKind, type ConnectPriceComponentKind, mapConnectCabinRoomType, mapConnectCruiseType, mapConnectEnrichmentKind, mapConnectInclusionKind, mapConnectPriceComponentKind, } from "./connect-compat.js";
|
|
330
|
+
export { type CruiseSourceAdapterShim, type CruiseSourceAdapterShimOptions, cruiseAdapterToSourceAdapter, cruiseItineraryStopFrom, } from "./source-adapter-shim.js";
|
|
331
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter contract for external cruise inventory.
|
|
3
|
+
*
|
|
4
|
+
* The cruises module is a storage + service + routes layer for both self-managed
|
|
5
|
+
* and external cruises. External cruises live entirely in an upstream system
|
|
6
|
+
* (Voyant Connect, a custom agency adapter, etc.) and are reached through a
|
|
7
|
+
* registered adapter that implements this contract.
|
|
8
|
+
*
|
|
9
|
+
* The contract is deliberately small. Templates default to the Voyant Connect
|
|
10
|
+
* adapter; agencies that prefer their own connectivity engine register a custom
|
|
11
|
+
* implementation instead. See docs/architecture/cruises-module.md §10.
|
|
12
|
+
*/
|
|
13
|
+
export { assertCruiseAdapterCompatibility, validateCruiseAdapterCompatibility, } from "./contract-fixture.js";
|
|
14
|
+
// ---------- catalog SourceAdapter shim ----------
|
|
15
|
+
export { mapConnectCabinRoomType, mapConnectCruiseType, mapConnectEnrichmentKind, mapConnectInclusionKind, mapConnectPriceComponentKind, } from "./connect-compat.js";
|
|
16
|
+
export { cruiseAdapterToSourceAdapter, cruiseItineraryStopFrom, } from "./source-adapter-shim.js";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory TTL cache decorator for cruise adapters.
|
|
3
|
+
*
|
|
4
|
+
* Wraps a `CruiseAdapter` so that `fetch*` reads (cruise/sailing/ship/itinerary/
|
|
5
|
+
* pricing detail) are cached for a short window keyed on the source ref. Mutations
|
|
6
|
+
* (`createBooking`) and listings (`listEntries`, `listSailingsForCruise`,
|
|
7
|
+
* `searchProjection`) always go live — caching them risks staleness against
|
|
8
|
+
* upstream changes.
|
|
9
|
+
*
|
|
10
|
+
* Templates opt in by wrapping their adapter at registration time:
|
|
11
|
+
*
|
|
12
|
+
* registerCruiseAdapter(memoizeCruiseAdapter(createConnectCruiseAdapter(...), { ttlMs: 60_000 }))
|
|
13
|
+
*
|
|
14
|
+
* The cache is process-local. For multi-instance deployments, prefer Connect's
|
|
15
|
+
* own caching (it sits closer to the source replica) over wrapping at this layer.
|
|
16
|
+
*/
|
|
17
|
+
import type { CruiseAdapter } from "./index.js";
|
|
18
|
+
export type MemoizeOptions = {
|
|
19
|
+
/** Cache TTL in milliseconds. Default 60_000 (60 seconds). */
|
|
20
|
+
ttlMs?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Maximum cache entries before LRU eviction kicks in. Default 1000.
|
|
23
|
+
* Set to 0 to disable size cap (only TTL evicts).
|
|
24
|
+
*/
|
|
25
|
+
maxEntries?: number;
|
|
26
|
+
};
|
|
27
|
+
export declare function memoizeCruiseAdapter(adapter: CruiseAdapter, options?: MemoizeOptions): CruiseAdapter;
|
|
28
|
+
//# sourceMappingURL=memoize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoize.d.ts","sourceRoot":"","sources":["../../src/adapters/memoize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,aAAa,EAOd,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,cAAc,GAAG;IAC3B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAuDD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,cAAmB,GAC3B,aAAa,CAoEf"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory TTL cache decorator for cruise adapters.
|
|
3
|
+
*
|
|
4
|
+
* Wraps a `CruiseAdapter` so that `fetch*` reads (cruise/sailing/ship/itinerary/
|
|
5
|
+
* pricing detail) are cached for a short window keyed on the source ref. Mutations
|
|
6
|
+
* (`createBooking`) and listings (`listEntries`, `listSailingsForCruise`,
|
|
7
|
+
* `searchProjection`) always go live — caching them risks staleness against
|
|
8
|
+
* upstream changes.
|
|
9
|
+
*
|
|
10
|
+
* Templates opt in by wrapping their adapter at registration time:
|
|
11
|
+
*
|
|
12
|
+
* registerCruiseAdapter(memoizeCruiseAdapter(createConnectCruiseAdapter(...), { ttlMs: 60_000 }))
|
|
13
|
+
*
|
|
14
|
+
* The cache is process-local. For multi-instance deployments, prefer Connect's
|
|
15
|
+
* own caching (it sits closer to the source replica) over wrapping at this layer.
|
|
16
|
+
*/
|
|
17
|
+
class TTLCache {
|
|
18
|
+
ttlMs;
|
|
19
|
+
maxEntries;
|
|
20
|
+
store = new Map();
|
|
21
|
+
constructor(ttlMs, maxEntries) {
|
|
22
|
+
this.ttlMs = ttlMs;
|
|
23
|
+
this.maxEntries = maxEntries;
|
|
24
|
+
}
|
|
25
|
+
get(key) {
|
|
26
|
+
const entry = this.store.get(key);
|
|
27
|
+
if (!entry)
|
|
28
|
+
return undefined;
|
|
29
|
+
if (entry.expiresAt < Date.now()) {
|
|
30
|
+
this.store.delete(key);
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
// Refresh LRU order
|
|
34
|
+
this.store.delete(key);
|
|
35
|
+
this.store.set(key, entry);
|
|
36
|
+
return entry.value;
|
|
37
|
+
}
|
|
38
|
+
set(key, value) {
|
|
39
|
+
if (this.maxEntries > 0 && this.store.size >= this.maxEntries) {
|
|
40
|
+
const oldestKey = this.store.keys().next().value;
|
|
41
|
+
if (oldestKey !== undefined)
|
|
42
|
+
this.store.delete(oldestKey);
|
|
43
|
+
}
|
|
44
|
+
this.store.set(key, { value, expiresAt: Date.now() + this.ttlMs });
|
|
45
|
+
}
|
|
46
|
+
clear() {
|
|
47
|
+
this.store.clear();
|
|
48
|
+
}
|
|
49
|
+
size() {
|
|
50
|
+
return this.store.size;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function refKey(ref) {
|
|
54
|
+
return JSON.stringify(sortValue(ref));
|
|
55
|
+
}
|
|
56
|
+
function sortValue(value) {
|
|
57
|
+
if (Array.isArray(value))
|
|
58
|
+
return value.map(sortValue);
|
|
59
|
+
if (!value || typeof value !== "object")
|
|
60
|
+
return value;
|
|
61
|
+
const out = {};
|
|
62
|
+
for (const key of Object.keys(value).sort()) {
|
|
63
|
+
out[key] = sortValue(value[key]);
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
export function memoizeCruiseAdapter(adapter, options = {}) {
|
|
68
|
+
const ttlMs = options.ttlMs ?? 60_000;
|
|
69
|
+
const maxEntries = options.maxEntries ?? 1000;
|
|
70
|
+
const cruiseCache = new TTLCache(ttlMs, maxEntries);
|
|
71
|
+
const sailingCache = new TTLCache(ttlMs, maxEntries);
|
|
72
|
+
const shipCache = new TTLCache(ttlMs, maxEntries);
|
|
73
|
+
const pricingCache = new TTLCache(ttlMs, maxEntries);
|
|
74
|
+
const itineraryCache = new TTLCache(ttlMs, maxEntries);
|
|
75
|
+
return {
|
|
76
|
+
name: adapter.name,
|
|
77
|
+
version: adapter.version,
|
|
78
|
+
// Listings always go live — too risky to serve a cached page when upstream
|
|
79
|
+
// adds/removes sailings.
|
|
80
|
+
listEntries: (opts) => adapter.listEntries(opts),
|
|
81
|
+
listSailingsForCruise: (ref) => adapter.listSailingsForCruise(ref),
|
|
82
|
+
searchProjection: (opts) => adapter.searchProjection(opts),
|
|
83
|
+
async fetchCruise(ref) {
|
|
84
|
+
const key = refKey(ref);
|
|
85
|
+
const cached = cruiseCache.get(key);
|
|
86
|
+
if (cached !== undefined)
|
|
87
|
+
return cached;
|
|
88
|
+
const value = await adapter.fetchCruise(ref);
|
|
89
|
+
cruiseCache.set(key, value);
|
|
90
|
+
return value;
|
|
91
|
+
},
|
|
92
|
+
async fetchSailing(ref) {
|
|
93
|
+
const key = refKey(ref);
|
|
94
|
+
const cached = sailingCache.get(key);
|
|
95
|
+
if (cached !== undefined)
|
|
96
|
+
return cached;
|
|
97
|
+
const value = await adapter.fetchSailing(ref);
|
|
98
|
+
sailingCache.set(key, value);
|
|
99
|
+
return value;
|
|
100
|
+
},
|
|
101
|
+
async fetchSailingPricing(ref) {
|
|
102
|
+
const key = refKey(ref);
|
|
103
|
+
const cached = pricingCache.get(key);
|
|
104
|
+
if (cached !== undefined)
|
|
105
|
+
return cached;
|
|
106
|
+
const value = await adapter.fetchSailingPricing(ref);
|
|
107
|
+
pricingCache.set(key, value);
|
|
108
|
+
return value;
|
|
109
|
+
},
|
|
110
|
+
async fetchSailingItinerary(ref) {
|
|
111
|
+
const key = refKey(ref);
|
|
112
|
+
const cached = itineraryCache.get(key);
|
|
113
|
+
if (cached !== undefined)
|
|
114
|
+
return cached;
|
|
115
|
+
const value = await adapter.fetchSailingItinerary(ref);
|
|
116
|
+
itineraryCache.set(key, value);
|
|
117
|
+
return value;
|
|
118
|
+
},
|
|
119
|
+
async fetchShip(ref) {
|
|
120
|
+
const key = refKey(ref);
|
|
121
|
+
const cached = shipCache.get(key);
|
|
122
|
+
if (cached !== undefined)
|
|
123
|
+
return cached;
|
|
124
|
+
const value = await adapter.fetchShip(ref);
|
|
125
|
+
shipCache.set(key, value);
|
|
126
|
+
return value;
|
|
127
|
+
},
|
|
128
|
+
// Bookings never cached.
|
|
129
|
+
createBooking: (input) => adapter.createBooking(input),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory CruiseAdapter for tests and templates that need a working
|
|
3
|
+
* external source without a real upstream.
|
|
4
|
+
*
|
|
5
|
+
* Seed it via the `add*` methods; queries against the registered data work
|
|
6
|
+
* exactly like a real adapter would. Booking commits return synthesized
|
|
7
|
+
* confirmation refs and increment a per-instance counter.
|
|
8
|
+
*/
|
|
9
|
+
import type { CreateExternalBookingInput, CruiseAdapter, CruiseSearchProjectionEntry, ExternalBookingResult, ExternalCruise, ExternalItineraryDay, ExternalPriceRow, ExternalSailing, ExternalShip, ListEntriesOptions, ListEntriesResult, SourceRef } from "./index.js";
|
|
10
|
+
export type MockCruiseAdapterOptions = {
|
|
11
|
+
name?: string;
|
|
12
|
+
version?: string;
|
|
13
|
+
/** Auto-fail every nth call to surface upstream-error handling in tests. */
|
|
14
|
+
failEveryNthCall?: number;
|
|
15
|
+
};
|
|
16
|
+
export declare class MockCruiseAdapter implements CruiseAdapter {
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly version: string;
|
|
19
|
+
private readonly cruisesByRef;
|
|
20
|
+
private readonly shipsByRef;
|
|
21
|
+
private readonly bookingResults;
|
|
22
|
+
callCount: number;
|
|
23
|
+
bookingCount: number;
|
|
24
|
+
private readonly failEveryNthCall;
|
|
25
|
+
constructor(options?: MockCruiseAdapterOptions);
|
|
26
|
+
addCruise(cruise: ExternalCruise, sailings?: ExternalSailing[]): void;
|
|
27
|
+
addSailing(cruiseRef: SourceRef, sailing: ExternalSailing): void;
|
|
28
|
+
addShip(ship: ExternalShip): void;
|
|
29
|
+
setSailingPricing(sailingRef: SourceRef, prices: ExternalPriceRow[]): void;
|
|
30
|
+
setSailingItinerary(sailingRef: SourceRef, days: ExternalItineraryDay[]): void;
|
|
31
|
+
/** Pre-program a specific booking response for the next createBooking that matches. */
|
|
32
|
+
setBookingResult(sailingRef: SourceRef, cabinCategoryRef: SourceRef, result: ExternalBookingResult): void;
|
|
33
|
+
private tickAndCheck;
|
|
34
|
+
listEntries(options?: ListEntriesOptions): Promise<ListEntriesResult>;
|
|
35
|
+
searchProjection(options?: ListEntriesOptions): AsyncIterable<CruiseSearchProjectionEntry>;
|
|
36
|
+
fetchCruise(ref: SourceRef): Promise<ExternalCruise | null>;
|
|
37
|
+
fetchSailing(ref: SourceRef): Promise<ExternalSailing | null>;
|
|
38
|
+
fetchSailingPricing(ref: SourceRef): Promise<ExternalPriceRow[]>;
|
|
39
|
+
fetchSailingItinerary(ref: SourceRef): Promise<ExternalItineraryDay[]>;
|
|
40
|
+
fetchShip(ref: SourceRef): Promise<ExternalShip | null>;
|
|
41
|
+
listSailingsForCruise(cruiseRef: SourceRef): Promise<ExternalSailing[]>;
|
|
42
|
+
createBooking(input: CreateExternalBookingInput): Promise<ExternalBookingResult>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/adapters/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,0BAA0B,EAC1B,aAAa,EACb,2BAA2B,EAC3B,qBAAqB,EACrB,cAAc,EAEd,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,SAAS,EACV,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAuBD,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IAExB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;IAC7D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2C;IAG1E,SAAS,SAAI;IACb,YAAY,SAAI;IAChB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;gBAE7B,OAAO,GAAE,wBAA6B;IAQlD,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,GAAE,eAAe,EAAO,GAAG,IAAI;IAUzE,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAMhE,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIjC,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI;IAW1E,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,EAAE,GAAG,IAAI;IAW9E,uFAAuF;IACvF,gBAAgB,CACd,UAAU,EAAE,SAAS,EACrB,gBAAgB,EAAE,SAAS,EAC3B,MAAM,EAAE,qBAAqB,GAC5B,IAAI;IAMP,OAAO,CAAC,YAAY;IAOd,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyBxE,gBAAgB,CACrB,OAAO,GAAE,kBAAuB,GAC/B,aAAa,CAAC,2BAA2B,CAAC;IAkCvC,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAK3D,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAS7D,mBAAmB,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAShE,qBAAqB,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAStE,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKvD,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAKvE,aAAa,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAYvF"}
|