@voyantjs/travel-composer 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +38 -0
  2. package/dist/catalog-component-adapter.d.ts +16 -0
  3. package/dist/catalog-component-adapter.d.ts.map +1 -0
  4. package/dist/catalog-component-adapter.js +34 -0
  5. package/dist/cruise-extension.d.ts +48 -0
  6. package/dist/cruise-extension.d.ts.map +1 -0
  7. package/dist/cruise-extension.js +66 -0
  8. package/dist/index.d.ts +21 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +29 -0
  11. package/dist/mcp-tools.d.ts +157 -0
  12. package/dist/mcp-tools.d.ts.map +1 -0
  13. package/dist/mcp-tools.js +109 -0
  14. package/dist/routes.d.ts +1988 -0
  15. package/dist/routes.d.ts.map +1 -0
  16. package/dist/routes.js +239 -0
  17. package/dist/schema.d.ts +1228 -0
  18. package/dist/schema.d.ts.map +1 -0
  19. package/dist/schema.js +163 -0
  20. package/dist/service-cancellation.d.ts +6 -0
  21. package/dist/service-cancellation.d.ts.map +1 -0
  22. package/dist/service-cancellation.js +251 -0
  23. package/dist/service-checkout.d.ts +6 -0
  24. package/dist/service-checkout.d.ts.map +1 -0
  25. package/dist/service-checkout.js +328 -0
  26. package/dist/service-drafts.d.ts +13 -0
  27. package/dist/service-drafts.d.ts.map +1 -0
  28. package/dist/service-drafts.js +223 -0
  29. package/dist/service-helpers.d.ts +17 -0
  30. package/dist/service-helpers.d.ts.map +1 -0
  31. package/dist/service-helpers.js +161 -0
  32. package/dist/service-internals.d.ts +11 -0
  33. package/dist/service-internals.d.ts.map +1 -0
  34. package/dist/service-internals.js +72 -0
  35. package/dist/service-pricing.d.ts +8 -0
  36. package/dist/service-pricing.d.ts.map +1 -0
  37. package/dist/service-pricing.js +142 -0
  38. package/dist/service-reservation.d.ts +5 -0
  39. package/dist/service-reservation.d.ts.map +1 -0
  40. package/dist/service-reservation.js +447 -0
  41. package/dist/service-trips.d.ts +14 -0
  42. package/dist/service-trips.d.ts.map +1 -0
  43. package/dist/service-trips.js +377 -0
  44. package/dist/service-types.d.ts +252 -0
  45. package/dist/service-types.d.ts.map +1 -0
  46. package/dist/service-types.js +6 -0
  47. package/dist/service.d.ts +33 -0
  48. package/dist/service.d.ts.map +1 -0
  49. package/dist/service.js +35 -0
  50. package/dist/traveler-party-validation.d.ts +3 -0
  51. package/dist/traveler-party-validation.d.ts.map +1 -0
  52. package/dist/traveler-party-validation.js +68 -0
  53. package/dist/validation.d.ts +363 -0
  54. package/dist/validation.d.ts.map +1 -0
  55. package/dist/validation.js +226 -0
  56. package/package.json +88 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAGnC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAGvB,MAAM,cAAc,CAAA;AAgBrB,KAAK,GAAG,GAAG;IACT,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,SAAS,EAAE;QACT,EAAE,EAAE,YAAY,CAAA;KACjB,CAAA;CACF,CAAA;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B,aAAa,CAAC,EAAE,uBAAuB,CAAC,aAAa,CAAC,CAAA;IACtD,eAAe,CAAC,EAAE,uBAAuB,CAAC,eAAe,CAAC,CAAA;IAC1D,iBAAiB,CAAC,EAAE,uBAAuB,CAAC,iBAAiB,CAAC,CAAA;IAC9D,wBAAwB,CAAC,EAAE,uBAAuB,CAAC,wBAAwB,CAAC,CAAA;CAC7E;AAED,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAA;AAmNjF,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,2BAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCA8DnF;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAA+B,CAAA;AAEhE,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAA"}
package/dist/routes.js ADDED
@@ -0,0 +1,239 @@
1
+ import { parseJsonBody, parseQuery } from "@voyantjs/hono";
2
+ import { Hono } from "hono";
3
+ import { TravelComposerInvariantError, travelComposerService, } from "./service.js";
4
+ import { cancelTripComponentsSchema, createTripComponentBodySchema, createTripEnvelopeSchema, listTripsQuerySchema, previewTripCancellationSchema, priceTripSchema, reorderTripComponentsSchema, reserveTripSchema, startTripCheckoutSchema, updateTripComponentRefsSchema, updateTripComponentSchema, updateTripEnvelopeSchema, } from "./validation.js";
5
+ const priceTripBodySchema = priceTripSchema.omit({ envelopeId: true });
6
+ const reserveTripBodySchema = reserveTripSchema.omit({ envelopeId: true });
7
+ const startCheckoutBodySchema = startTripCheckoutSchema.omit({ envelopeId: true });
8
+ const previewCancellationBodySchema = previewTripCancellationSchema.omit({ envelopeId: true });
9
+ const cancelTripComponentsBodySchema = cancelTripComponentsSchema.omit({ envelopeId: true });
10
+ function routeError(error) {
11
+ if (error instanceof TravelComposerInvariantError) {
12
+ return {
13
+ message: error.message,
14
+ status: error.message.includes("was not found") ? 404 : 409,
15
+ };
16
+ }
17
+ return {
18
+ message: error instanceof Error ? error.message : "Travel composer route failed",
19
+ status: 400,
20
+ };
21
+ }
22
+ function resolveRouteDeps(c, deps) {
23
+ if (typeof deps !== "function")
24
+ return deps;
25
+ const resolver = deps;
26
+ return resolver(c);
27
+ }
28
+ function isPublicSurface(options) {
29
+ return options.surface === "public";
30
+ }
31
+ function publicForbidden() {
32
+ return new Response(JSON.stringify({ error: "Travel composer operation is admin-only" }), {
33
+ status: 403,
34
+ headers: { "content-type": "application/json" },
35
+ });
36
+ }
37
+ function envelopeIdParam(c) {
38
+ const envelopeId = c.req.param("envelopeId");
39
+ if (!envelopeId)
40
+ throw new TravelComposerInvariantError("Trip envelope id is required");
41
+ return envelopeId;
42
+ }
43
+ async function listTripsHandler(c) {
44
+ const query = parseQuery(c, listTripsQuerySchema);
45
+ return c.json(await travelComposerService.listTrips(c.get("db"), query));
46
+ }
47
+ async function createTripHandler(c) {
48
+ try {
49
+ const trip = await travelComposerService.createTrip(c.get("db"), await parseJsonBody(c, createTripEnvelopeSchema));
50
+ return c.json({ data: trip }, 201);
51
+ }
52
+ catch (error) {
53
+ const { message, status } = routeError(error);
54
+ return c.json({ error: message }, status);
55
+ }
56
+ }
57
+ async function getTripHandler(c) {
58
+ const trip = await travelComposerService.getTrip(c.get("db"), envelopeIdParam(c));
59
+ if (!trip)
60
+ return c.json({ error: "Trip envelope not found" }, 404);
61
+ return c.json({ data: trip });
62
+ }
63
+ async function updateTripHandler(c, options) {
64
+ if (isPublicSurface(options))
65
+ return publicForbidden();
66
+ try {
67
+ const envelope = await travelComposerService.updateTrip(c.get("db"), envelopeIdParam(c), await parseJsonBody(c, updateTripEnvelopeSchema));
68
+ if (!envelope)
69
+ return c.json({ error: "Trip envelope not found" }, 404);
70
+ return c.json({ data: envelope });
71
+ }
72
+ catch (error) {
73
+ const { message, status } = routeError(error);
74
+ return c.json({ error: message }, status);
75
+ }
76
+ }
77
+ async function addTripComponentHandler(c) {
78
+ try {
79
+ const body = await parseJsonBody(c, createTripComponentBodySchema);
80
+ const component = await travelComposerService.addComponent(c.get("db"), {
81
+ ...body,
82
+ envelopeId: envelopeIdParam(c),
83
+ });
84
+ return c.json({ data: component }, 201);
85
+ }
86
+ catch (error) {
87
+ const { message, status } = routeError(error);
88
+ return c.json({ error: message }, status);
89
+ }
90
+ }
91
+ async function reorderTripComponentsHandler(c, options) {
92
+ if (isPublicSurface(options))
93
+ return publicForbidden();
94
+ try {
95
+ const body = await parseJsonBody(c, reorderTripComponentsSchema.omit({ envelopeId: true }));
96
+ const components = await travelComposerService.reorderComponents(c.get("db"), {
97
+ ...body,
98
+ envelopeId: envelopeIdParam(c),
99
+ });
100
+ return c.json({ data: components });
101
+ }
102
+ catch (error) {
103
+ const { message, status } = routeError(error);
104
+ return c.json({ error: message }, status);
105
+ }
106
+ }
107
+ async function priceTripHandler(c, options) {
108
+ const deps = resolveRouteDeps(c, options.priceTripDeps);
109
+ if (!deps) {
110
+ return c.json({ error: "Travel composer price dependencies are not configured" }, 501);
111
+ }
112
+ try {
113
+ const body = await parseJsonBody(c, priceTripBodySchema);
114
+ const result = await travelComposerService.priceTrip(c.get("db"), { ...body, envelopeId: envelopeIdParam(c) }, deps);
115
+ return c.json({ data: result });
116
+ }
117
+ catch (error) {
118
+ const { message, status } = routeError(error);
119
+ return c.json({ error: message }, status);
120
+ }
121
+ }
122
+ async function reserveTripHandler(c, options) {
123
+ const deps = resolveRouteDeps(c, options.reserveTripDeps);
124
+ if (!deps) {
125
+ return c.json({ error: "Travel composer reserve dependencies are not configured" }, 501);
126
+ }
127
+ try {
128
+ const body = await parseJsonBody(c, reserveTripBodySchema);
129
+ const result = await travelComposerService.reserveTrip(c.get("db"), { ...body, envelopeId: envelopeIdParam(c) }, deps);
130
+ return c.json({ data: result });
131
+ }
132
+ catch (error) {
133
+ const { message, status } = routeError(error);
134
+ return c.json({ error: message }, status);
135
+ }
136
+ }
137
+ async function startTripCheckoutHandler(c, options) {
138
+ const deps = resolveRouteDeps(c, options.startCheckoutDeps);
139
+ if (!deps) {
140
+ return c.json({ error: "Travel composer checkout dependencies are not configured" }, 501);
141
+ }
142
+ try {
143
+ const body = await parseJsonBody(c, startCheckoutBodySchema);
144
+ const result = await travelComposerService.startCheckout(c.get("db"), { ...body, envelopeId: envelopeIdParam(c) }, deps);
145
+ return c.json({ data: result });
146
+ }
147
+ catch (error) {
148
+ const { message, status } = routeError(error);
149
+ return c.json({ error: message }, status);
150
+ }
151
+ }
152
+ async function previewTripCancellationHandler(c, options) {
153
+ if (isPublicSurface(options))
154
+ return publicForbidden();
155
+ try {
156
+ const body = await parseJsonBody(c, previewCancellationBodySchema);
157
+ const deps = resolveRouteDeps(c, options.cancelTripComponentsDeps);
158
+ const result = await travelComposerService.previewCancellation(c.get("db"), { ...body, envelopeId: envelopeIdParam(c) }, deps);
159
+ return c.json({ data: result });
160
+ }
161
+ catch (error) {
162
+ const { message, status } = routeError(error);
163
+ return c.json({ error: message }, status);
164
+ }
165
+ }
166
+ async function cancelTripComponentsHandler(c, options) {
167
+ if (isPublicSurface(options))
168
+ return publicForbidden();
169
+ try {
170
+ const body = await parseJsonBody(c, cancelTripComponentsBodySchema);
171
+ const deps = resolveRouteDeps(c, options.cancelTripComponentsDeps);
172
+ const result = await travelComposerService.cancelComponents(c.get("db"), { ...body, envelopeId: envelopeIdParam(c) }, deps);
173
+ return c.json({ data: result });
174
+ }
175
+ catch (error) {
176
+ const { message, status } = routeError(error);
177
+ return c.json({ error: message }, status);
178
+ }
179
+ }
180
+ export function createTravelComposerRoutes(options = {}) {
181
+ return new Hono()
182
+ .get("/health", (c) => {
183
+ return c.json({ data: travelComposerService.getStatus() });
184
+ })
185
+ .get("/trips", listTripsHandler)
186
+ .post("/trips", createTripHandler)
187
+ .get("/trips/:envelopeId", getTripHandler)
188
+ .patch("/trips/:envelopeId", (c) => updateTripHandler(c, options))
189
+ .post("/trips/:envelopeId/components", addTripComponentHandler)
190
+ .post("/trips/:envelopeId/components/reorder", (c) => reorderTripComponentsHandler(c, options))
191
+ .post("/trips/:envelopeId/price", (c) => priceTripHandler(c, options))
192
+ .post("/trips/:envelopeId/reserve", (c) => reserveTripHandler(c, options))
193
+ .post("/trips/:envelopeId/checkout", (c) => startTripCheckoutHandler(c, options))
194
+ .post("/trips/:envelopeId/cancellation-preview", (c) => previewTripCancellationHandler(c, options))
195
+ .post("/trips/:envelopeId/cancel-components", (c) => cancelTripComponentsHandler(c, options))
196
+ .patch("/components/:componentId", async (c) => {
197
+ if (isPublicSurface(options))
198
+ return publicForbidden();
199
+ try {
200
+ const component = await travelComposerService.updateComponent(c.get("db"), c.req.param("componentId"), await parseJsonBody(c, updateTripComponentSchema));
201
+ if (!component)
202
+ return c.json({ error: "Trip component not found" }, 404);
203
+ return c.json({ data: component });
204
+ }
205
+ catch (error) {
206
+ const { message, status } = routeError(error);
207
+ return c.json({ error: message }, status);
208
+ }
209
+ })
210
+ .post("/components/:componentId/refs", async (c) => {
211
+ if (isPublicSurface(options))
212
+ return publicForbidden();
213
+ try {
214
+ const component = await travelComposerService.updateComponentRefs(c.get("db"), c.req.param("componentId"), await parseJsonBody(c, updateTripComponentRefsSchema));
215
+ if (!component)
216
+ return c.json({ error: "Trip component not found" }, 404);
217
+ return c.json({ data: component });
218
+ }
219
+ catch (error) {
220
+ const { message, status } = routeError(error);
221
+ return c.json({ error: message }, status);
222
+ }
223
+ })
224
+ .delete("/components/:componentId", async (c) => {
225
+ if (isPublicSurface(options))
226
+ return publicForbidden();
227
+ try {
228
+ const component = await travelComposerService.removeComponent(c.get("db"), c.req.param("componentId"));
229
+ if (!component)
230
+ return c.json({ error: "Trip component not found" }, 404);
231
+ return c.json({ data: component });
232
+ }
233
+ catch (error) {
234
+ const { message, status } = routeError(error);
235
+ return c.json({ error: message }, status);
236
+ }
237
+ });
238
+ }
239
+ export const travelComposerRoutes = createTravelComposerRoutes();