@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,13 @@
|
|
|
1
|
+
import { mergeOverlaysIntoContent, } from "@voyant-travel/catalog";
|
|
2
|
+
import { cruiseContentSchema, validateCruiseContent, } from "@voyant-travel/cruises-contracts/content-shape";
|
|
3
|
+
export { BOARD_BASIS_FROM_SHORT_CODE, BOARD_BASIS_SHORT_CODES, BOARD_BASIS_VALUES, boardBasisSchema, CRUISES_CONTENT_SCHEMA_VERSION, cruiseCabinCategorySchema, cruiseContentSchema, cruiseItineraryStopSchema, cruisePolicySchema, cruiseSailingSchema, cruiseShipSchema, cruiseSummarySchema, validateCruiseContent, } from "@voyant-travel/cruises-contracts/content-shape";
|
|
4
|
+
export function mergeOverlaysIntoCruiseContent(payload, overlays, options = {}) {
|
|
5
|
+
const merged = mergeOverlaysIntoContent(payload, overlays, {
|
|
6
|
+
validate(p) {
|
|
7
|
+
const r = validateCruiseContent(p);
|
|
8
|
+
return r.valid ? { valid: true } : { valid: false, reason: r.reason };
|
|
9
|
+
},
|
|
10
|
+
onOverlayError: options.onOverlayError,
|
|
11
|
+
});
|
|
12
|
+
return cruiseContentSchema.parse(merged);
|
|
13
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project a `CruiseContent` payload into a `BookingDraftShape` so the
|
|
3
|
+
* journey wizard can render the correct sub-steps for a sourced
|
|
4
|
+
* cruise.
|
|
5
|
+
*
|
|
6
|
+
* Cruise products are the prototype for the journey's most-elaborate
|
|
7
|
+
* shape (per §F.1 in the journey doc):
|
|
8
|
+
* - Configure: departure (sailing date) → cabin-category → cabin-
|
|
9
|
+
* number → occupancy. Each sub-step is rendered only when its
|
|
10
|
+
* options array is non-empty.
|
|
11
|
+
* - Accommodation: pre/post extension hotels (when present).
|
|
12
|
+
* Cruise lines surface these via supplier-specific catalogs;
|
|
13
|
+
* the v1 builder leaves this empty and templates can override.
|
|
14
|
+
* - Add-ons: per-port excursions (`groupBy: "port"` when the
|
|
15
|
+
* itinerary stops surface them) plus optional insurance offer.
|
|
16
|
+
* - Pax bands: cruise-line-specific age cutoffs (infant ≤ 2,
|
|
17
|
+
* child 3-11, adult 12+) — caller-supplied via options because
|
|
18
|
+
* the cutoffs vary per supplier and aren't on the content
|
|
19
|
+
* payload.
|
|
20
|
+
*
|
|
21
|
+
* See `docs/architecture/booking-journey-architecture.md` §F.1.
|
|
22
|
+
*/
|
|
23
|
+
import { type BookingDraftShape, type PaxBandSpec } from "@voyant-travel/catalog/booking-engine";
|
|
24
|
+
import type { CruiseContent } from "./content-shape.js";
|
|
25
|
+
/**
|
|
26
|
+
* Default cruise pax bands — adult-only since age cutoffs vary per
|
|
27
|
+
* cruise line. Templates pass in supplier-specific bands when
|
|
28
|
+
* available; this default is conservative (12+ implied — adult only,
|
|
29
|
+
* 1-8 cabin cap).
|
|
30
|
+
*/
|
|
31
|
+
export declare const DEFAULT_CRUISE_PAX_BANDS: ReadonlyArray<PaxBandSpec>;
|
|
32
|
+
export interface BuildCruiseDraftShapeOptions {
|
|
33
|
+
locale?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Cruise-line-specific pax bands. Templates derive these from the
|
|
36
|
+
* supplier's catalog metadata (e.g. `infant ≤ 2`, `child 3-11`,
|
|
37
|
+
* `adult 12+` for major lines). Defaults to adult-only.
|
|
38
|
+
*/
|
|
39
|
+
paxBands?: ReadonlyArray<PaxBandSpec>;
|
|
40
|
+
paxBandsAllowedTotal?: {
|
|
41
|
+
min: number;
|
|
42
|
+
max: number;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* When true, render the cabin-number sub-step even if the
|
|
46
|
+
* `cabin_categories[]` items don't surface a cabin map. The
|
|
47
|
+
* journey then emits an empty per-category record and the wizard
|
|
48
|
+
* lets ops select "any cabin" within the category.
|
|
49
|
+
*/
|
|
50
|
+
forceCabinNumberSubStep?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Whether to include an insurance addon group. Templates pass
|
|
53
|
+
* `true` when the deployment ships an insurance offer; default
|
|
54
|
+
* `false` so we don't fabricate offers.
|
|
55
|
+
*/
|
|
56
|
+
includeInsurance?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare function buildCruiseDraftShape(content: CruiseContent, options?: BuildCruiseDraftShapeOptions): BookingDraftShape;
|
|
59
|
+
//# sourceMappingURL=draft-shape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-shape.d.ts","sourceRoot":"","sources":["../src/draft-shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,KAAK,iBAAiB,EAMtB,KAAK,WAAW,EAEjB,MAAM,uCAAuC,CAAA;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,aAAa,CAAC,WAAW,CAE/D,CAAA;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;IACrC,oBAAoB,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACnD;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,4BAAiC,GACzC,iBAAiB,CAyDnB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project a `CruiseContent` payload into a `BookingDraftShape` so the
|
|
3
|
+
* journey wizard can render the correct sub-steps for a sourced
|
|
4
|
+
* cruise.
|
|
5
|
+
*
|
|
6
|
+
* Cruise products are the prototype for the journey's most-elaborate
|
|
7
|
+
* shape (per §F.1 in the journey doc):
|
|
8
|
+
* - Configure: departure (sailing date) → cabin-category → cabin-
|
|
9
|
+
* number → occupancy. Each sub-step is rendered only when its
|
|
10
|
+
* options array is non-empty.
|
|
11
|
+
* - Accommodation: pre/post extension hotels (when present).
|
|
12
|
+
* Cruise lines surface these via supplier-specific catalogs;
|
|
13
|
+
* the v1 builder leaves this empty and templates can override.
|
|
14
|
+
* - Add-ons: per-port excursions (`groupBy: "port"` when the
|
|
15
|
+
* itinerary stops surface them) plus optional insurance offer.
|
|
16
|
+
* - Pax bands: cruise-line-specific age cutoffs (infant ≤ 2,
|
|
17
|
+
* child 3-11, adult 12+) — caller-supplied via options because
|
|
18
|
+
* the cutoffs vary per supplier and aren't on the content
|
|
19
|
+
* payload.
|
|
20
|
+
*
|
|
21
|
+
* See `docs/architecture/booking-journey-architecture.md` §F.1.
|
|
22
|
+
*/
|
|
23
|
+
import { defaultBookingFields, defaultDraftShapeFlags, defaultTravelerFields, paxBandsAllowedTotalFrom, } from "@voyant-travel/catalog/booking-engine";
|
|
24
|
+
/**
|
|
25
|
+
* Default cruise pax bands — adult-only since age cutoffs vary per
|
|
26
|
+
* cruise line. Templates pass in supplier-specific bands when
|
|
27
|
+
* available; this default is conservative (12+ implied — adult only,
|
|
28
|
+
* 1-8 cabin cap).
|
|
29
|
+
*/
|
|
30
|
+
export const DEFAULT_CRUISE_PAX_BANDS = [
|
|
31
|
+
{ code: "adult", label: "Adult", minCount: 1, maxCount: 8 },
|
|
32
|
+
];
|
|
33
|
+
export function buildCruiseDraftShape(content, options = {}) {
|
|
34
|
+
const paxBands = options.paxBands ?? DEFAULT_CRUISE_PAX_BANDS;
|
|
35
|
+
const total = options.paxBandsAllowedTotal ?? paxBandsAllowedTotalFrom(paxBands);
|
|
36
|
+
// Configure sub-steps — built only when the content carries the
|
|
37
|
+
// relevant data. Order matters: departure → category → cabin-number
|
|
38
|
+
// → occupancy mirrors the doc's §F.1 flow.
|
|
39
|
+
const configureSubSteps = [];
|
|
40
|
+
if (content.sailings.length > 0) {
|
|
41
|
+
configureSubSteps.push({ kind: "departure", required: true });
|
|
42
|
+
}
|
|
43
|
+
if (content.cabin_categories.length > 0) {
|
|
44
|
+
configureSubSteps.push({
|
|
45
|
+
kind: "cabin-category",
|
|
46
|
+
categories: content.cabin_categories.map(toCabinCategoryOption),
|
|
47
|
+
});
|
|
48
|
+
if (options.forceCabinNumberSubStep) {
|
|
49
|
+
configureSubSteps.push({
|
|
50
|
+
kind: "cabin-number",
|
|
51
|
+
// Empty record: the wizard treats an empty array as "any
|
|
52
|
+
// cabin within the category" — templates wire real cabin
|
|
53
|
+
// pools when supplier surfaces them.
|
|
54
|
+
perCategory: {},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
configureSubSteps.push({ kind: "occupancy", bands: paxBands });
|
|
59
|
+
// Air-arrangement choice — cruises always render this; the
|
|
60
|
+
// wizard's three tiles cover cruise-line-arranged, independent,
|
|
61
|
+
// and no-flights flows. Per booking-journey-architecture §7.
|
|
62
|
+
configureSubSteps.push({ kind: "air-arrangement", required: false });
|
|
63
|
+
return {
|
|
64
|
+
...defaultDraftShapeFlags(),
|
|
65
|
+
paxBands,
|
|
66
|
+
paxBandsAllowedTotal: total,
|
|
67
|
+
travelerFields: defaultTravelerFields(),
|
|
68
|
+
bookingFields: defaultBookingFields(),
|
|
69
|
+
configureSubSteps,
|
|
70
|
+
paymentIntents: ["hold", "card"],
|
|
71
|
+
// Excursions: empty by default — they live on supplier-specific
|
|
72
|
+
// per-port catalogs that aren't on `CruiseContent` today.
|
|
73
|
+
// Templates / future content-shape extensions wire this.
|
|
74
|
+
addons: options.includeInsurance
|
|
75
|
+
? {
|
|
76
|
+
groups: [
|
|
77
|
+
{
|
|
78
|
+
kind: "insurance",
|
|
79
|
+
label: "Travel insurance",
|
|
80
|
+
perGuestSelection: false,
|
|
81
|
+
items: [],
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
}
|
|
85
|
+
: undefined,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function toCabinCategoryOption(cat) {
|
|
89
|
+
return {
|
|
90
|
+
id: cat.id,
|
|
91
|
+
code: cat.code ?? undefined,
|
|
92
|
+
name: cat.name,
|
|
93
|
+
type: cat.type ?? undefined,
|
|
94
|
+
capacityMin: cat.capacity_min ?? undefined,
|
|
95
|
+
capacityMax: cat.capacity_max ?? undefined,
|
|
96
|
+
description: cat.description ?? undefined,
|
|
97
|
+
};
|
|
98
|
+
}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cruise domain events.
|
|
3
|
+
*
|
|
4
|
+
* Emitted after successful local cruise mutations. Subscribers should treat
|
|
5
|
+
* these payloads as invalidation triggers and re-read current cruise state
|
|
6
|
+
* before updating catalog/search projections.
|
|
7
|
+
*/
|
|
8
|
+
import type { EventBus } from "@voyant-travel/core";
|
|
9
|
+
/** Stable string identifier for local cruise creation. */
|
|
10
|
+
export declare const CRUISE_CREATED_EVENT: "cruise.created";
|
|
11
|
+
/** Stable string identifier for local cruise updates. */
|
|
12
|
+
export declare const CRUISE_UPDATED_EVENT: "cruise.updated";
|
|
13
|
+
/** Stable string identifier for local cruise deletion/archive. */
|
|
14
|
+
export declare const CRUISE_DELETED_EVENT: "cruise.deleted";
|
|
15
|
+
export type CruiseLifecycleEventName = typeof CRUISE_CREATED_EVENT | typeof CRUISE_UPDATED_EVENT | typeof CRUISE_DELETED_EVENT;
|
|
16
|
+
export interface CruiseLifecycleEvent {
|
|
17
|
+
/** Cruise id whose lifecycle changed. */
|
|
18
|
+
id: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function emitCruiseLifecycleEvent(eventBus: EventBus | undefined, event: CruiseLifecycleEventName, payload: CruiseLifecycleEvent): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEnD,0DAA0D;AAC1D,eAAO,MAAM,oBAAoB,EAAG,gBAAyB,CAAA;AAE7D,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,EAAG,gBAAyB,CAAA;AAE7D,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,EAAG,gBAAyB,CAAA;AAE7D,MAAM,MAAM,wBAAwB,GAChC,OAAO,oBAAoB,GAC3B,OAAO,oBAAoB,GAC3B,OAAO,oBAAoB,CAAA;AAE/B,MAAM,WAAW,oBAAoB;IACnC,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAA;CACX;AAED,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,KAAK,EAAE,wBAAwB,EAC/B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cruise domain events.
|
|
3
|
+
*
|
|
4
|
+
* Emitted after successful local cruise mutations. Subscribers should treat
|
|
5
|
+
* these payloads as invalidation triggers and re-read current cruise state
|
|
6
|
+
* before updating catalog/search projections.
|
|
7
|
+
*/
|
|
8
|
+
/** Stable string identifier for local cruise creation. */
|
|
9
|
+
export const CRUISE_CREATED_EVENT = "cruise.created";
|
|
10
|
+
/** Stable string identifier for local cruise updates. */
|
|
11
|
+
export const CRUISE_UPDATED_EVENT = "cruise.updated";
|
|
12
|
+
/** Stable string identifier for local cruise deletion/archive. */
|
|
13
|
+
export const CRUISE_DELETED_EVENT = "cruise.deleted";
|
|
14
|
+
export async function emitCruiseLifecycleEvent(eventBus, event, payload) {
|
|
15
|
+
if (!eventBus)
|
|
16
|
+
return;
|
|
17
|
+
await eventBus.emit(event, payload, {
|
|
18
|
+
category: "domain",
|
|
19
|
+
source: "service",
|
|
20
|
+
});
|
|
21
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { LinkableDefinition, Module } from "@voyant-travel/core";
|
|
2
|
+
import type { HonoModule } from "@voyant-travel/hono/module";
|
|
3
|
+
export { type CompatibilityMappingResult, type ConnectCabinRoomType, type ConnectCruiseType, type ConnectEnrichmentKind, type ConnectInclusionKind, type ConnectPriceComponentKind, mapConnectCabinRoomType, mapConnectCruiseType, mapConnectEnrichmentKind, mapConnectInclusionKind, mapConnectPriceComponentKind, } from "./adapters/connect-compat.js";
|
|
4
|
+
export type { AdapterCallContext, CreateExternalBookingInput, CruiseAdapter, CruiseAdapterCompatibilityCheck, CruiseAdapterCompatibilityCheckName, CruiseAdapterCompatibilityFixture, CruiseAdapterCompatibilityReport, CruiseSearchProjectionEntry, ExternalBookingResult, ExternalBookingTerms, ExternalCabinCategory, ExternalContactInput, ExternalCruise, ExternalCruiseSummary, ExternalDeck, ExternalItineraryDay, ExternalPassengerComposition, ExternalPassengerInput, ExternalPriceComponent, ExternalPriceRow, ExternalSailing, ExternalShip, ListEntriesOptions, ListEntriesResult, SourceRef, } from "./adapters/index.js";
|
|
5
|
+
export { assertCruiseAdapterCompatibility, validateCruiseAdapterCompatibility, } from "./adapters/index.js";
|
|
6
|
+
export { type MemoizeOptions, memoizeCruiseAdapter } from "./adapters/memoize.js";
|
|
7
|
+
export { MockCruiseAdapter, type MockCruiseAdapterOptions } from "./adapters/mock.js";
|
|
8
|
+
export { clearCruiseAdapters, hasCruiseAdapter, listCruiseAdapters, registerCruiseAdapter, resolveCruiseAdapter, unregisterCruiseAdapter, } from "./adapters/registry.js";
|
|
9
|
+
export { type BookingCruiseDetail, type BookingGroupCruiseDetail, bookingCruiseDetails, bookingCruiseDetailsService, bookingGroupCruiseDetails, bookingGroupCruiseDetailsService, cruiseBookingModeEnum, cruisesBookingExtension, cruisesBookingExtensionRoutes, type NewBookingCruiseDetail, type NewBookingGroupCruiseDetail, } from "./booking-extension.js";
|
|
10
|
+
export { CABIN_ACCESSIBILITY_FEATURES, CABIN_BED_CONFIGURATIONS, CABIN_VIEW_TYPES, type CabinAccessibilityFeature, type CabinBedConfiguration, type CabinViewType, } from "./cabin-features.js";
|
|
11
|
+
export { CRUISE_CABIN_CATEGORY_FIELD_POLICY, CRUISE_CABIN_FACETS_FIELD_POLICY, CRUISE_DECK_FIELD_POLICY, cruiseCabinCategoryCatalogPolicy, cruiseCabinFacetsCatalogPolicy, cruiseDeckCatalogPolicy, } from "./catalog-policy-cabins.js";
|
|
12
|
+
export { CRUISE_CREATED_EVENT, CRUISE_DELETED_EVENT, CRUISE_UPDATED_EVENT, type CruiseLifecycleEvent, type CruiseLifecycleEventName, emitCruiseLifecycleEvent, } from "./events.js";
|
|
13
|
+
export type { CruiseAdminRoutes } from "./routes.js";
|
|
14
|
+
export { cruiseAdminRoutes } from "./routes.js";
|
|
15
|
+
export type { CruisePublicRoutes } from "./routes-public.js";
|
|
16
|
+
export { cruisePublicRoutes } from "./routes-public.js";
|
|
17
|
+
export type { CruiseMutationRuntime, EffectiveItineraryDay } from "./service.js";
|
|
18
|
+
export { cruisesService } from "./service.js";
|
|
19
|
+
export { type CreateCruiseBookingInput, type CreateCruiseBookingResult, type CreateCruisePartyBookingInput, type CreateCruisePartyBookingResult, type CreateExternalCruiseBookingInput, type CruiseBookingContact, type CruiseBookingMode, type CruiseBookingPassenger, type CruisePartyCabinEntry, cruisesBookingService, } from "./service-bookings.js";
|
|
20
|
+
export { type CruiseCabinFacetJoinRow, createCruiseCabinFacetProjectionExtension, projectCruiseCabinFacetRows, } from "./service-catalog-plane-cabins.js";
|
|
21
|
+
export { detachExternalCruise } from "./service-detach.js";
|
|
22
|
+
export { type ExternalCruiseCatalogRefreshOptions, type ExternalCruiseCatalogRefreshResult, refreshExternalCruiseCatalog, } from "./service-external-refresh.js";
|
|
23
|
+
export { type ComposeQuoteInput, composeQuote, type GridCell, type LowestPriceResult, pricingService, type Quote, type QuoteComponent, } from "./service-pricing.js";
|
|
24
|
+
export declare const cruiseLinkable: LinkableDefinition;
|
|
25
|
+
export declare const cruiseVoyageGroupLinkable: LinkableDefinition;
|
|
26
|
+
export declare const cruiseSailingLinkable: LinkableDefinition;
|
|
27
|
+
export declare const cruiseShipLinkable: LinkableDefinition;
|
|
28
|
+
export declare const cruisesModule: Module;
|
|
29
|
+
export declare const cruisesHonoModule: HonoModule;
|
|
30
|
+
export type { CruiseCabin, CruiseCabinCategory, CruiseDeck, CruiseShip, NewCruiseCabin, NewCruiseCabinCategory, NewCruiseDeck, NewCruiseShip, } from "./schema-cabins.js";
|
|
31
|
+
export { cruiseCabinCategories, cruiseCabins, cruiseDecks, cruiseShips, } from "./schema-cabins.js";
|
|
32
|
+
export type { CruiseEnrichmentProgram, CruiseInclusion, CruiseMedia, NewCruiseEnrichmentProgram, NewCruiseInclusion, NewCruiseMedia, } from "./schema-content.js";
|
|
33
|
+
export { cruiseEnrichmentPrograms, cruiseInclusions, cruiseMedia, } from "./schema-content.js";
|
|
34
|
+
export type { Cruise, CruiseSailing, CruiseVoyageGroup, CruiseVoyageGroupSegment, NewCruise, NewCruiseSailing, NewCruiseVoyageGroup, NewCruiseVoyageGroupSegment, } from "./schema-core.js";
|
|
35
|
+
export { cruiseSailings, cruises, cruiseVoyageGroupSegments, cruiseVoyageGroups, } from "./schema-core.js";
|
|
36
|
+
export type { CruiseDay, CruiseSailingDay, NewCruiseDay, NewCruiseSailingDay, } from "./schema-itinerary.js";
|
|
37
|
+
export { cruiseDays, cruiseSailingDays, } from "./schema-itinerary.js";
|
|
38
|
+
export type { CruisePrice, CruisePriceComponent, NewCruisePrice, NewCruisePriceComponent, } from "./schema-pricing.js";
|
|
39
|
+
export { cruisePriceComponents, cruisePrices, } from "./schema-pricing.js";
|
|
40
|
+
export type { CruiseSearchIndexRow, NewCruiseSearchIndexRow, } from "./schema-search.js";
|
|
41
|
+
export { cruiseSearchIndex } from "./schema-search.js";
|
|
42
|
+
export { cabinRoomTypeEnum, cruiseInclusionKindEnum, cruiseMediaTypeEnum, cruiseSailingDirectionEnum, cruiseSourceEnum, cruiseStatusEnum, cruiseTypeEnum, cruiseVoyageGroupKindEnum, cruiseVoyageSegmentKindEnum, cruiseVoyageSegmentRoleEnum, enrichmentProgramKindEnum, priceAvailabilityEnum, priceComponentDirectionEnum, priceComponentKindEnum, priceFareVariantEnum, sailingSalesStatusEnum, shipTypeEnum, } from "./schema-shared.js";
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { cruiseAdminRoutes } from "./routes.js";
|
|
2
|
+
import { cruisePublicRoutes } from "./routes-public.js";
|
|
3
|
+
export { mapConnectCabinRoomType, mapConnectCruiseType, mapConnectEnrichmentKind, mapConnectInclusionKind, mapConnectPriceComponentKind, } from "./adapters/connect-compat.js";
|
|
4
|
+
export { assertCruiseAdapterCompatibility, validateCruiseAdapterCompatibility, } from "./adapters/index.js";
|
|
5
|
+
export { memoizeCruiseAdapter } from "./adapters/memoize.js";
|
|
6
|
+
export { MockCruiseAdapter } from "./adapters/mock.js";
|
|
7
|
+
export { clearCruiseAdapters, hasCruiseAdapter, listCruiseAdapters, registerCruiseAdapter, resolveCruiseAdapter, unregisterCruiseAdapter, } from "./adapters/registry.js";
|
|
8
|
+
export { bookingCruiseDetails, bookingCruiseDetailsService, bookingGroupCruiseDetails, bookingGroupCruiseDetailsService, cruiseBookingModeEnum, cruisesBookingExtension, cruisesBookingExtensionRoutes, } from "./booking-extension.js";
|
|
9
|
+
export { CABIN_ACCESSIBILITY_FEATURES, CABIN_BED_CONFIGURATIONS, CABIN_VIEW_TYPES, } from "./cabin-features.js";
|
|
10
|
+
export { CRUISE_CABIN_CATEGORY_FIELD_POLICY, CRUISE_CABIN_FACETS_FIELD_POLICY, CRUISE_DECK_FIELD_POLICY, cruiseCabinCategoryCatalogPolicy, cruiseCabinFacetsCatalogPolicy, cruiseDeckCatalogPolicy, } from "./catalog-policy-cabins.js";
|
|
11
|
+
export { CRUISE_CREATED_EVENT, CRUISE_DELETED_EVENT, CRUISE_UPDATED_EVENT, emitCruiseLifecycleEvent, } from "./events.js";
|
|
12
|
+
export { cruiseAdminRoutes } from "./routes.js";
|
|
13
|
+
export { cruisePublicRoutes } from "./routes-public.js";
|
|
14
|
+
export { cruisesService } from "./service.js";
|
|
15
|
+
export { cruisesBookingService, } from "./service-bookings.js";
|
|
16
|
+
export { createCruiseCabinFacetProjectionExtension, projectCruiseCabinFacetRows, } from "./service-catalog-plane-cabins.js";
|
|
17
|
+
export { detachExternalCruise } from "./service-detach.js";
|
|
18
|
+
export { refreshExternalCruiseCatalog, } from "./service-external-refresh.js";
|
|
19
|
+
export { composeQuote, pricingService, } from "./service-pricing.js";
|
|
20
|
+
// Linkable definitions for cross-module links from a template's links/ directory.
|
|
21
|
+
export const cruiseLinkable = {
|
|
22
|
+
module: "cruises",
|
|
23
|
+
entity: "cruise",
|
|
24
|
+
table: "cruises",
|
|
25
|
+
idPrefix: "cru",
|
|
26
|
+
};
|
|
27
|
+
export const cruiseVoyageGroupLinkable = {
|
|
28
|
+
module: "cruises",
|
|
29
|
+
entity: "cruise_voyage_group",
|
|
30
|
+
table: "cruise_voyage_groups",
|
|
31
|
+
idPrefix: "crvg",
|
|
32
|
+
};
|
|
33
|
+
export const cruiseSailingLinkable = {
|
|
34
|
+
module: "cruises",
|
|
35
|
+
entity: "cruise_sailing",
|
|
36
|
+
table: "cruise_sailings",
|
|
37
|
+
idPrefix: "crsl",
|
|
38
|
+
};
|
|
39
|
+
export const cruiseShipLinkable = {
|
|
40
|
+
module: "cruises",
|
|
41
|
+
entity: "cruise_ship",
|
|
42
|
+
table: "cruise_ships",
|
|
43
|
+
idPrefix: "crsh",
|
|
44
|
+
};
|
|
45
|
+
export const cruisesModule = {
|
|
46
|
+
name: "cruises",
|
|
47
|
+
linkable: {
|
|
48
|
+
cruise: cruiseLinkable,
|
|
49
|
+
cruise_voyage_group: cruiseVoyageGroupLinkable,
|
|
50
|
+
cruise_sailing: cruiseSailingLinkable,
|
|
51
|
+
cruise_ship: cruiseShipLinkable,
|
|
52
|
+
},
|
|
53
|
+
requiresTransactionalDb: true,
|
|
54
|
+
};
|
|
55
|
+
export const cruisesHonoModule = {
|
|
56
|
+
module: cruisesModule,
|
|
57
|
+
adminRoutes: cruiseAdminRoutes,
|
|
58
|
+
publicRoutes: cruisePublicRoutes,
|
|
59
|
+
};
|
|
60
|
+
export { cruiseCabinCategories, cruiseCabins, cruiseDecks, cruiseShips, } from "./schema-cabins.js";
|
|
61
|
+
export { cruiseEnrichmentPrograms, cruiseInclusions, cruiseMedia, } from "./schema-content.js";
|
|
62
|
+
export { cruiseSailings, cruises, cruiseVoyageGroupSegments, cruiseVoyageGroups, } from "./schema-core.js";
|
|
63
|
+
export { cruiseDays, cruiseSailingDays, } from "./schema-itinerary.js";
|
|
64
|
+
export { cruisePriceComponents, cruisePrices, } from "./schema-pricing.js";
|
|
65
|
+
export { cruiseSearchIndex } from "./schema-search.js";
|
|
66
|
+
export { cabinRoomTypeEnum, cruiseInclusionKindEnum, cruiseMediaTypeEnum, cruiseSailingDirectionEnum, cruiseSourceEnum, cruiseStatusEnum, cruiseTypeEnum, cruiseVoyageGroupKindEnum, cruiseVoyageSegmentKindEnum, cruiseVoyageSegmentRoleEnum, enrichmentProgramKindEnum, priceAvailabilityEnum, priceComponentDirectionEnum, priceComponentKindEnum, priceFareVariantEnum, sailingSalesStatusEnum, shipTypeEnum, } from "./schema-shared.js";
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified key parser for cruise admin routes.
|
|
3
|
+
*
|
|
4
|
+
* The same admin endpoint (e.g. `GET /v1/admin/cruises/:key`) accepts both
|
|
5
|
+
* local TypeIDs (`cru_abc123…`) and external adapter-scoped keys
|
|
6
|
+
* (`<provider>:<ref>`, e.g. `voyant-connect:cnx_xx/extId`). The parser
|
|
7
|
+
* normalises the URL parameter into a discriminated union so route handlers
|
|
8
|
+
* can dispatch to the local DB or to an adapter.
|
|
9
|
+
*
|
|
10
|
+
* Phase 2 only handles `kind: 'local'`; external keys return 501. Phase 3
|
|
11
|
+
* wires the adapter contract.
|
|
12
|
+
*/
|
|
13
|
+
export type ParsedKey = {
|
|
14
|
+
kind: "local";
|
|
15
|
+
id: string;
|
|
16
|
+
} | {
|
|
17
|
+
kind: "external";
|
|
18
|
+
provider: string;
|
|
19
|
+
ref: string;
|
|
20
|
+
} | {
|
|
21
|
+
kind: "invalid";
|
|
22
|
+
raw: string;
|
|
23
|
+
};
|
|
24
|
+
export type EncodableSourceRef = {
|
|
25
|
+
externalId: string;
|
|
26
|
+
connectionId?: string;
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
};
|
|
29
|
+
export declare function parseUnifiedKey(raw: string): ParsedKey;
|
|
30
|
+
/**
|
|
31
|
+
* True when `id` is a catalog sourced entity id: a TypeID prefix followed by an
|
|
32
|
+
* encoded SourceRef (`<prefix>_sr_<base64url>`). Distinguishes sourced ids from
|
|
33
|
+
* owned TypeIDs so content routes dispatch sourced ids without the owned-key
|
|
34
|
+
* opt-in. See `cruiseAdapterToSourceAdapter`'s `buildEntityId`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isEncodedSourceEntityId(id: string): boolean;
|
|
37
|
+
export declare function makeExternalSourceKey(provider: string, sourceRef: EncodableSourceRef): string;
|
|
38
|
+
export declare function encodeSourceRef(sourceRef: EncodableSourceRef): string;
|
|
39
|
+
export declare function decodeSourceRef(encoded: string): EncodableSourceRef | null;
|
|
40
|
+
export declare function sourceRefFromExternalKeyRef(ref: string): EncodableSourceRef;
|
|
41
|
+
//# sourceMappingURL=key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../src/lib/key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAKpC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAgBtD;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAI3D;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,GAAG,MAAM,CAE7F;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,kBAAkB,GAAG,MAAM,CAErE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAe1E;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAE3E"}
|
package/dist/lib/key.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified key parser for cruise admin routes.
|
|
3
|
+
*
|
|
4
|
+
* The same admin endpoint (e.g. `GET /v1/admin/cruises/:key`) accepts both
|
|
5
|
+
* local TypeIDs (`cru_abc123…`) and external adapter-scoped keys
|
|
6
|
+
* (`<provider>:<ref>`, e.g. `voyant-connect:cnx_xx/extId`). The parser
|
|
7
|
+
* normalises the URL parameter into a discriminated union so route handlers
|
|
8
|
+
* can dispatch to the local DB or to an adapter.
|
|
9
|
+
*
|
|
10
|
+
* Phase 2 only handles `kind: 'local'`; external keys return 501. Phase 3
|
|
11
|
+
* wires the adapter contract.
|
|
12
|
+
*/
|
|
13
|
+
const TYPEID_RE = /^[a-z]+_[0-9a-zA-Z]+$/;
|
|
14
|
+
const ENCODED_SOURCE_REF_PREFIX = "sr_";
|
|
15
|
+
export function parseUnifiedKey(raw) {
|
|
16
|
+
const decoded = decodeURIComponent(raw);
|
|
17
|
+
const colon = decoded.indexOf(":");
|
|
18
|
+
if (colon > 0) {
|
|
19
|
+
const provider = decoded.slice(0, colon);
|
|
20
|
+
const ref = decoded.slice(colon + 1);
|
|
21
|
+
if (provider && ref)
|
|
22
|
+
return { kind: "external", provider, ref };
|
|
23
|
+
return { kind: "invalid", raw: decoded };
|
|
24
|
+
}
|
|
25
|
+
// Catalog sourced entity id (`<prefix>_sr_<base64url>`) — the id the catalog
|
|
26
|
+
// plane builds for sourced cruises (`buildEntityId`) and indexes. It carries
|
|
27
|
+
// a second underscore (and base64url `-`/`_`) the TypeID regex rejects, so
|
|
28
|
+
// detect it explicitly and pass it through as the entity id.
|
|
29
|
+
if (isEncodedSourceEntityId(decoded))
|
|
30
|
+
return { kind: "local", id: decoded };
|
|
31
|
+
if (TYPEID_RE.test(decoded))
|
|
32
|
+
return { kind: "local", id: decoded };
|
|
33
|
+
return { kind: "invalid", raw: decoded };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* True when `id` is a catalog sourced entity id: a TypeID prefix followed by an
|
|
37
|
+
* encoded SourceRef (`<prefix>_sr_<base64url>`). Distinguishes sourced ids from
|
|
38
|
+
* owned TypeIDs so content routes dispatch sourced ids without the owned-key
|
|
39
|
+
* opt-in. See `cruiseAdapterToSourceAdapter`'s `buildEntityId`.
|
|
40
|
+
*/
|
|
41
|
+
export function isEncodedSourceEntityId(id) {
|
|
42
|
+
const underscore = id.indexOf("_");
|
|
43
|
+
if (underscore <= 0)
|
|
44
|
+
return false;
|
|
45
|
+
return decodeSourceRef(id.slice(underscore + 1)) !== null;
|
|
46
|
+
}
|
|
47
|
+
export function makeExternalSourceKey(provider, sourceRef) {
|
|
48
|
+
return `${provider}:${encodeSourceRef(sourceRef)}`;
|
|
49
|
+
}
|
|
50
|
+
export function encodeSourceRef(sourceRef) {
|
|
51
|
+
return `${ENCODED_SOURCE_REF_PREFIX}${base64UrlEncode(stableStringify(sourceRef))}`;
|
|
52
|
+
}
|
|
53
|
+
export function decodeSourceRef(encoded) {
|
|
54
|
+
if (!encoded.startsWith(ENCODED_SOURCE_REF_PREFIX))
|
|
55
|
+
return null;
|
|
56
|
+
try {
|
|
57
|
+
const decoded = JSON.parse(base64UrlDecode(encoded.slice(ENCODED_SOURCE_REF_PREFIX.length)));
|
|
58
|
+
if (decoded &&
|
|
59
|
+
typeof decoded === "object" &&
|
|
60
|
+
typeof decoded.externalId === "string") {
|
|
61
|
+
return decoded;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Invalid encoded refs are treated as legacy raw external ids by callers.
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
export function sourceRefFromExternalKeyRef(ref) {
|
|
70
|
+
return decodeSourceRef(ref) ?? { externalId: ref };
|
|
71
|
+
}
|
|
72
|
+
function stableStringify(value) {
|
|
73
|
+
return JSON.stringify(sortValue(value));
|
|
74
|
+
}
|
|
75
|
+
function sortValue(value) {
|
|
76
|
+
if (Array.isArray(value))
|
|
77
|
+
return value.map(sortValue);
|
|
78
|
+
if (!value || typeof value !== "object")
|
|
79
|
+
return value;
|
|
80
|
+
const out = {};
|
|
81
|
+
for (const key of Object.keys(value).sort()) {
|
|
82
|
+
out[key] = sortValue(value[key]);
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
function base64UrlEncode(input) {
|
|
87
|
+
const bytes = new TextEncoder().encode(input);
|
|
88
|
+
let binary = "";
|
|
89
|
+
for (const byte of bytes)
|
|
90
|
+
binary += String.fromCharCode(byte);
|
|
91
|
+
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
92
|
+
}
|
|
93
|
+
function base64UrlDecode(input) {
|
|
94
|
+
const padded = input.padEnd(Math.ceil(input.length / 4) * 4, "=");
|
|
95
|
+
const binary = atob(padded.replace(/-/g, "+").replace(/_/g, "/"));
|
|
96
|
+
const bytes = new Uint8Array(binary.length);
|
|
97
|
+
for (let i = 0; i < binary.length; i += 1)
|
|
98
|
+
bytes[i] = binary.charCodeAt(i);
|
|
99
|
+
return new TextDecoder().decode(bytes);
|
|
100
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ExternalPassengerComposition, SourceRef } from "./adapters/index.js";
|
|
3
|
+
export declare const createBookingPayloadSchema: z.ZodObject<{
|
|
4
|
+
sailingId: z.ZodString;
|
|
5
|
+
cabinCategoryId: z.ZodString;
|
|
6
|
+
cabinCategoryRef: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
7
|
+
cabinId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
8
|
+
occupancy: z.ZodNumber;
|
|
9
|
+
passengerComposition: z.ZodNullable<z.ZodOptional<z.ZodObject<{
|
|
10
|
+
adults: z.ZodNumber;
|
|
11
|
+
children: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
childAges: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
|
|
13
|
+
infants: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
seniors: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
}, z.core.$catchall<z.ZodUnknown>>>>;
|
|
16
|
+
fareCode: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
17
|
+
fareVariant: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
|
|
18
|
+
cruise_only: "cruise_only";
|
|
19
|
+
air_inclusive: "air_inclusive";
|
|
20
|
+
}>>>;
|
|
21
|
+
mode: z.ZodOptional<z.ZodEnum<{
|
|
22
|
+
inquiry: "inquiry";
|
|
23
|
+
reserve: "reserve";
|
|
24
|
+
}>>;
|
|
25
|
+
personId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
26
|
+
organizationId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
27
|
+
contact: z.ZodObject<{
|
|
28
|
+
firstName: z.ZodString;
|
|
29
|
+
lastName: z.ZodString;
|
|
30
|
+
email: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
31
|
+
phone: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
32
|
+
language: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
33
|
+
country: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
34
|
+
region: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
35
|
+
city: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
36
|
+
address: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
37
|
+
postalCode: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
passengers: z.ZodArray<z.ZodObject<{
|
|
40
|
+
firstName: z.ZodString;
|
|
41
|
+
lastName: z.ZodString;
|
|
42
|
+
email: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
43
|
+
phone: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
44
|
+
travelerCategory: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
|
|
45
|
+
other: "other";
|
|
46
|
+
adult: "adult";
|
|
47
|
+
child: "child";
|
|
48
|
+
infant: "infant";
|
|
49
|
+
senior: "senior";
|
|
50
|
+
}>>>;
|
|
51
|
+
preferredLanguage: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
52
|
+
specialRequests: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
53
|
+
personId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
54
|
+
isPrimary: z.ZodOptional<z.ZodBoolean>;
|
|
55
|
+
notes: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
56
|
+
}, z.core.$strip>>;
|
|
57
|
+
notes: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
58
|
+
}, z.core.$strip>;
|
|
59
|
+
export declare const createPartyBookingPayloadSchema: z.ZodObject<{
|
|
60
|
+
sailingId: z.ZodString;
|
|
61
|
+
cabins: z.ZodArray<z.ZodObject<{
|
|
62
|
+
cabinCategoryId: z.ZodString;
|
|
63
|
+
cabinId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
64
|
+
occupancy: z.ZodNumber;
|
|
65
|
+
fareCode: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
66
|
+
fareVariant: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
|
|
67
|
+
cruise_only: "cruise_only";
|
|
68
|
+
air_inclusive: "air_inclusive";
|
|
69
|
+
}>>>;
|
|
70
|
+
passengers: z.ZodArray<z.ZodObject<{
|
|
71
|
+
firstName: z.ZodString;
|
|
72
|
+
lastName: z.ZodString;
|
|
73
|
+
email: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
74
|
+
phone: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
75
|
+
travelerCategory: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
|
|
76
|
+
other: "other";
|
|
77
|
+
adult: "adult";
|
|
78
|
+
child: "child";
|
|
79
|
+
infant: "infant";
|
|
80
|
+
senior: "senior";
|
|
81
|
+
}>>>;
|
|
82
|
+
preferredLanguage: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
83
|
+
specialRequests: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
84
|
+
personId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
85
|
+
isPrimary: z.ZodOptional<z.ZodBoolean>;
|
|
86
|
+
notes: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
87
|
+
}, z.core.$strip>>;
|
|
88
|
+
notes: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
89
|
+
}, z.core.$strip>>;
|
|
90
|
+
leadPersonId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
91
|
+
organizationId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
92
|
+
contact: z.ZodObject<{
|
|
93
|
+
firstName: z.ZodString;
|
|
94
|
+
lastName: z.ZodString;
|
|
95
|
+
email: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
96
|
+
phone: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
97
|
+
language: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
98
|
+
country: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
99
|
+
region: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
100
|
+
city: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
101
|
+
address: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
102
|
+
postalCode: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
103
|
+
}, z.core.$strip>;
|
|
104
|
+
mode: z.ZodOptional<z.ZodEnum<{
|
|
105
|
+
inquiry: "inquiry";
|
|
106
|
+
reserve: "reserve";
|
|
107
|
+
}>>;
|
|
108
|
+
label: z.ZodOptional<z.ZodString>;
|
|
109
|
+
notes: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
110
|
+
}, z.core.$strip>;
|
|
111
|
+
export declare const quotePayloadSchema: z.ZodObject<{
|
|
112
|
+
cabinCategoryId: z.ZodString;
|
|
113
|
+
cabinCategoryRef: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
114
|
+
occupancy: z.ZodNumber;
|
|
115
|
+
guestCount: z.ZodOptional<z.ZodNumber>;
|
|
116
|
+
passengerComposition: z.ZodNullable<z.ZodOptional<z.ZodObject<{
|
|
117
|
+
adults: z.ZodNumber;
|
|
118
|
+
children: z.ZodOptional<z.ZodNumber>;
|
|
119
|
+
childAges: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
|
|
120
|
+
infants: z.ZodOptional<z.ZodNumber>;
|
|
121
|
+
seniors: z.ZodOptional<z.ZodNumber>;
|
|
122
|
+
}, z.core.$catchall<z.ZodUnknown>>>>;
|
|
123
|
+
fareCode: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
124
|
+
fareVariant: z.ZodNullable<z.ZodOptional<z.ZodEnum<{
|
|
125
|
+
cruise_only: "cruise_only";
|
|
126
|
+
air_inclusive: "air_inclusive";
|
|
127
|
+
}>>>;
|
|
128
|
+
}, z.core.$strip>;
|
|
129
|
+
export declare function passengerCountFromComposition(composition: ExternalPassengerComposition | null | undefined): number | null;
|
|
130
|
+
export declare function sourceRefFromPayload(maybeRef: Record<string, unknown> | null | undefined, externalId: string): SourceRef;
|
|
131
|
+
export declare function sourceRefMatches(candidate: SourceRef, requested: SourceRef): boolean;
|
|
132
|
+
export declare function passengerCompositionMatches(candidate: ExternalPassengerComposition | null | undefined, requested: ExternalPassengerComposition | null | undefined): boolean;
|
|
133
|
+
//# sourceMappingURL=routes-booking-payloads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes-booking-payloads.d.ts","sourceRoot":"","sources":["../src/routes-booking-payloads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,4BAA4B,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAIlF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4CS,CAAA;AAEhD,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmDS,CAAA;AAErD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;iBAQ7B,CAAA;AAmBF,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GAC3D,MAAM,GAAG,IAAI,CAQf;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EACpD,UAAU,EAAE,MAAM,GACjB,SAAS,CAGX;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAKpF;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,EAC1D,SAAS,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GACzD,OAAO,CAQT"}
|