@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.
Files changed (210) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +50 -0
  3. package/dist/adapters/connect-compat.d.ts +20 -0
  4. package/dist/adapters/connect-compat.d.ts.map +1 -0
  5. package/dist/adapters/connect-compat.js +71 -0
  6. package/dist/adapters/contract-fixture.d.ts +32 -0
  7. package/dist/adapters/contract-fixture.d.ts.map +1 -0
  8. package/dist/adapters/contract-fixture.js +152 -0
  9. package/dist/adapters/index.d.ts +331 -0
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters/index.js +16 -0
  12. package/dist/adapters/memoize.d.ts +28 -0
  13. package/dist/adapters/memoize.d.ts.map +1 -0
  14. package/dist/adapters/memoize.js +131 -0
  15. package/dist/adapters/mock.d.ts +44 -0
  16. package/dist/adapters/mock.d.ts.map +1 -0
  17. package/dist/adapters/mock.js +192 -0
  18. package/dist/adapters/registry.d.ts +26 -0
  19. package/dist/adapters/registry.d.ts.map +1 -0
  20. package/dist/adapters/registry.js +42 -0
  21. package/dist/adapters/source-adapter-shim.d.ts +80 -0
  22. package/dist/adapters/source-adapter-shim.d.ts.map +1 -0
  23. package/dist/adapters/source-adapter-shim.js +390 -0
  24. package/dist/booking-engine/handler.d.ts +108 -0
  25. package/dist/booking-engine/handler.d.ts.map +1 -0
  26. package/dist/booking-engine/handler.js +225 -0
  27. package/dist/booking-engine/index.d.ts +9 -0
  28. package/dist/booking-engine/index.d.ts.map +1 -0
  29. package/dist/booking-engine/index.js +8 -0
  30. package/dist/booking-extension.d.ts +1179 -0
  31. package/dist/booking-extension.d.ts.map +1 -0
  32. package/dist/booking-extension.js +342 -0
  33. package/dist/cabin-features.d.ts +8 -0
  34. package/dist/cabin-features.d.ts.map +1 -0
  35. package/dist/cabin-features.js +7 -0
  36. package/dist/catalog-policy-cabins.d.ts +18 -0
  37. package/dist/catalog-policy-cabins.d.ts.map +1 -0
  38. package/dist/catalog-policy-cabins.js +96 -0
  39. package/dist/catalog-policy-core.d.ts +3 -0
  40. package/dist/catalog-policy-core.d.ts.map +1 -0
  41. package/dist/catalog-policy-core.js +247 -0
  42. package/dist/catalog-policy-structure.d.ts +3 -0
  43. package/dist/catalog-policy-structure.d.ts.map +1 -0
  44. package/dist/catalog-policy-structure.js +387 -0
  45. package/dist/catalog-policy.d.ts +15 -0
  46. package/dist/catalog-policy.d.ts.map +1 -0
  47. package/dist/catalog-policy.js +19 -0
  48. package/dist/content-shape.d.ts +5 -0
  49. package/dist/content-shape.d.ts.map +1 -0
  50. package/dist/content-shape.js +13 -0
  51. package/dist/draft-shape.d.ts +59 -0
  52. package/dist/draft-shape.d.ts.map +1 -0
  53. package/dist/draft-shape.js +98 -0
  54. package/dist/events.d.ts +21 -0
  55. package/dist/events.d.ts.map +1 -0
  56. package/dist/events.js +21 -0
  57. package/dist/index.d.ts +43 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +66 -0
  60. package/dist/lib/key.d.ts +41 -0
  61. package/dist/lib/key.d.ts.map +1 -0
  62. package/dist/lib/key.js +100 -0
  63. package/dist/routes-booking-payloads.d.ts +133 -0
  64. package/dist/routes-booking-payloads.d.ts.map +1 -0
  65. package/dist/routes-booking-payloads.js +142 -0
  66. package/dist/routes-content.d.ts +53 -0
  67. package/dist/routes-content.d.ts.map +1 -0
  68. package/dist/routes-content.js +158 -0
  69. package/dist/routes-core.d.ts +4 -0
  70. package/dist/routes-core.d.ts.map +1 -0
  71. package/dist/routes-core.js +68 -0
  72. package/dist/routes-detail.d.ts +4 -0
  73. package/dist/routes-detail.d.ts.map +1 -0
  74. package/dist/routes-detail.js +261 -0
  75. package/dist/routes-env.d.ts +13 -0
  76. package/dist/routes-env.d.ts.map +1 -0
  77. package/dist/routes-env.js +1 -0
  78. package/dist/routes-keying.d.ts +28 -0
  79. package/dist/routes-keying.d.ts.map +1 -0
  80. package/dist/routes-keying.js +70 -0
  81. package/dist/routes-public.d.ts +911 -0
  82. package/dist/routes-public.d.ts.map +1 -0
  83. package/dist/routes-public.js +252 -0
  84. package/dist/routes-sailings-prices.d.ts +4 -0
  85. package/dist/routes-sailings-prices.d.ts.map +1 -0
  86. package/dist/routes-sailings-prices.js +278 -0
  87. package/dist/routes-search-index.d.ts +4 -0
  88. package/dist/routes-search-index.d.ts.map +1 -0
  89. package/dist/routes-search-index.js +25 -0
  90. package/dist/routes-ships.d.ts +4 -0
  91. package/dist/routes-ships.d.ts.map +1 -0
  92. package/dist/routes-ships.js +147 -0
  93. package/dist/routes-voyage-groups.d.ts +4 -0
  94. package/dist/routes-voyage-groups.d.ts.map +1 -0
  95. package/dist/routes-voyage-groups.js +85 -0
  96. package/dist/routes.d.ts +5 -0
  97. package/dist/routes.d.ts.map +1 -0
  98. package/dist/routes.js +14 -0
  99. package/dist/schema-cabins.d.ts +1098 -0
  100. package/dist/schema-cabins.d.ts.map +1 -0
  101. package/dist/schema-cabins.js +105 -0
  102. package/dist/schema-content.d.ts +577 -0
  103. package/dist/schema-content.d.ts.map +1 -0
  104. package/dist/schema-content.js +63 -0
  105. package/dist/schema-core.d.ts +1790 -0
  106. package/dist/schema-core.d.ts.map +1 -0
  107. package/dist/schema-core.js +171 -0
  108. package/dist/schema-itinerary.d.ts +556 -0
  109. package/dist/schema-itinerary.d.ts.map +1 -0
  110. package/dist/schema-itinerary.js +50 -0
  111. package/dist/schema-pricing.d.ts +633 -0
  112. package/dist/schema-pricing.d.ts.map +1 -0
  113. package/dist/schema-pricing.js +73 -0
  114. package/dist/schema-search.d.ts +611 -0
  115. package/dist/schema-search.d.ts.map +1 -0
  116. package/dist/schema-search.js +64 -0
  117. package/dist/schema-shared.d.ts +23 -0
  118. package/dist/schema-shared.d.ts.map +1 -0
  119. package/dist/schema-shared.js +107 -0
  120. package/dist/schema-sourced-content.d.ts +247 -0
  121. package/dist/schema-sourced-content.d.ts.map +1 -0
  122. package/dist/schema-sourced-content.js +38 -0
  123. package/dist/schema.d.ts +10 -0
  124. package/dist/schema.d.ts.map +1 -0
  125. package/dist/schema.js +9 -0
  126. package/dist/service-booking-helpers.d.ts +12 -0
  127. package/dist/service-booking-helpers.d.ts.map +1 -0
  128. package/dist/service-booking-helpers.js +94 -0
  129. package/dist/service-booking-types.d.ts +101 -0
  130. package/dist/service-booking-types.d.ts.map +1 -0
  131. package/dist/service-booking-types.js +1 -0
  132. package/dist/service-bookings.d.ts +46 -0
  133. package/dist/service-bookings.d.ts.map +1 -0
  134. package/dist/service-bookings.js +420 -0
  135. package/dist/service-catalog-plane-cabins.d.ts +24 -0
  136. package/dist/service-catalog-plane-cabins.d.ts.map +1 -0
  137. package/dist/service-catalog-plane-cabins.js +90 -0
  138. package/dist/service-catalog-plane.d.ts +74 -0
  139. package/dist/service-catalog-plane.d.ts.map +1 -0
  140. package/dist/service-catalog-plane.js +194 -0
  141. package/dist/service-content-synthesizer.d.ts +42 -0
  142. package/dist/service-content-synthesizer.d.ts.map +1 -0
  143. package/dist/service-content-synthesizer.js +144 -0
  144. package/dist/service-content.d.ts +74 -0
  145. package/dist/service-content.d.ts.map +1 -0
  146. package/dist/service-content.js +315 -0
  147. package/dist/service-core.d.ts +134 -0
  148. package/dist/service-core.d.ts.map +1 -0
  149. package/dist/service-core.js +257 -0
  150. package/dist/service-detach.d.ts +18 -0
  151. package/dist/service-detach.d.ts.map +1 -0
  152. package/dist/service-detach.js +199 -0
  153. package/dist/service-enrichment.d.ts +11 -0
  154. package/dist/service-enrichment.d.ts.map +1 -0
  155. package/dist/service-enrichment.js +47 -0
  156. package/dist/service-external-refresh.d.ts +39 -0
  157. package/dist/service-external-refresh.d.ts.map +1 -0
  158. package/dist/service-external-refresh.js +47 -0
  159. package/dist/service-itinerary.d.ts +22 -0
  160. package/dist/service-itinerary.d.ts.map +1 -0
  161. package/dist/service-itinerary.js +34 -0
  162. package/dist/service-prices.d.ts +46 -0
  163. package/dist/service-prices.d.ts.map +1 -0
  164. package/dist/service-prices.js +89 -0
  165. package/dist/service-pricing.d.ts +97 -0
  166. package/dist/service-pricing.d.ts.map +1 -0
  167. package/dist/service-pricing.js +198 -0
  168. package/dist/service-sailings.d.ts +48 -0
  169. package/dist/service-sailings.d.ts.map +1 -0
  170. package/dist/service-sailings.js +145 -0
  171. package/dist/service-search-types.d.ts +54 -0
  172. package/dist/service-search-types.d.ts.map +1 -0
  173. package/dist/service-search-types.js +1 -0
  174. package/dist/service-search.d.ts +65 -0
  175. package/dist/service-search.d.ts.map +1 -0
  176. package/dist/service-search.js +467 -0
  177. package/dist/service-shared.d.ts +22 -0
  178. package/dist/service-shared.d.ts.map +1 -0
  179. package/dist/service-shared.js +22 -0
  180. package/dist/service-ships.d.ts +47 -0
  181. package/dist/service-ships.d.ts.map +1 -0
  182. package/dist/service-ships.js +156 -0
  183. package/dist/service.d.ts +255 -0
  184. package/dist/service.d.ts.map +1 -0
  185. package/dist/service.js +12 -0
  186. package/dist/validation-cabins.d.ts +267 -0
  187. package/dist/validation-cabins.d.ts.map +1 -0
  188. package/dist/validation-cabins.js +77 -0
  189. package/dist/validation-content.d.ts +123 -0
  190. package/dist/validation-content.d.ts.map +1 -0
  191. package/dist/validation-content.js +40 -0
  192. package/dist/validation-core.d.ts +393 -0
  193. package/dist/validation-core.d.ts.map +1 -0
  194. package/dist/validation-core.js +162 -0
  195. package/dist/validation-itinerary.d.ts +123 -0
  196. package/dist/validation-itinerary.d.ts.map +1 -0
  197. package/dist/validation-itinerary.js +47 -0
  198. package/dist/validation-pricing.d.ts +137 -0
  199. package/dist/validation-pricing.d.ts.map +1 -0
  200. package/dist/validation-pricing.js +49 -0
  201. package/dist/validation-search.d.ts +118 -0
  202. package/dist/validation-search.d.ts.map +1 -0
  203. package/dist/validation-search.js +60 -0
  204. package/dist/validation-shared.d.ts +123 -0
  205. package/dist/validation-shared.d.ts.map +1 -0
  206. package/dist/validation-shared.js +103 -0
  207. package/dist/validation.d.ts +8 -0
  208. package/dist/validation.d.ts.map +1 -0
  209. package/dist/validation.js +7 -0
  210. 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":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,yBAAyB,EACzB,qBAAqB,EACrB,aAAa,EACd,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAIrF;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAA;AAEpD,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG,eAAe,CAAA;AAOjE,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAA;IACxD,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,SAAS,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,0BAA0B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1C,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,6BAA6B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,MAAM,CAAC,EAAE,OAAO,GAAG,iBAAiB,GAAG,MAAM,GAAG,UAAU,CAAA;CAC3D,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,SAAS,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,0BAA0B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1C,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,6BAA6B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7C,SAAS,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,IAAI,CAAA;IACvE,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAA;IACzE,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;IAC5E,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAA;IACtB,UAAU,CAAC,EAAE,qBAAqB,EAAE,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAA;IAC/E,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,CAAA;IAC3C,qBAAqB,CAAC,EAAE,yBAAyB,EAAE,CAAA;IACnD,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,gBAAgB,EAAE,SAAS,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,oBAAoB,CAAC,EAAE,4BAA4B,GAAG,IAAI,CAAA;IAC1D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,WAAW,CAAC,EAAE,mBAAmB,CAAA;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,yBAAyB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvC,YAAY,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,CAAA;IAC/E,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,4BAA4B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5C,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,UAAU,CAAC,EAAE,sBAAsB,EAAE,CAAA;IACrC,YAAY,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAA;CAC3C,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EACA,UAAU,GACV,gBAAgB,GAChB,aAAa,GACb,KAAK,GACL,KAAK,GACL,SAAS,GACT,UAAU,GACV,WAAW,GACX,mBAAmB,GACnB,OAAO,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAA;IAC9C,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CACnE,CAAA;AAID,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAA;IACxD,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,0BAA0B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1C,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvC,6BAA6B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACjC,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B,CAAA;AAID,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAA;IACxD,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,qBAAqB,EAAE,CAAA;IAChC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAID,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,gBAAgB,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAA;IAC3E,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,EAAE,SAAS,CAAA;IACrB,gBAAgB,EAAE,SAAS,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,oBAAoB,CAAC,EAAE,4BAA4B,GAAG,IAAI,CAAA;IAC1D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,WAAW,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAA;IACxC,UAAU,EAAE,sBAAsB,EAAE,CAAA;IACpC,OAAO,EAAE,oBAAoB,CAAA;IAC7B,YAAY,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAC1C,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,iFAAiF;IACjF,mBAAmB,EAAE,MAAM,CAAA;IAC3B,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B;4EACwE;IACxE,UAAU,CAAC,EAAE,KAAK,CAAA;IAClB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,cAAc,EAAE,CAAA;IAClC,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAA;CAChD,CAAA;AAID,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IAExB;;;;OAIG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAErE;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,aAAa,CAAC,2BAA2B,CAAC,CAAA;IAG1F,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IACjE,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAA;IACnE,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACtE,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAA;IAC5E,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;IAE7D;;;OAGG;IACH,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IAEvE;;;;OAIG;IACH,aAAa,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;CACjF;AAED,MAAM,MAAM,kBAAkB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAExE,OAAO,EACL,gCAAgC,EAChC,KAAK,+BAA+B,EACpC,KAAK,mCAAmC,EACxC,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EACrC,kCAAkC,GACnC,MAAM,uBAAuB,CAAA;AAI9B,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACnC,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,0BAA0B,CAAA"}
@@ -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"}