@voyant-travel/flights 0.137.2 → 0.137.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../src/hono.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,KAAK,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEzC,OAAO,KAAK,EAEV,sBAAsB,EAEvB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAGV,WAAW,EAKZ,MAAM,qBAAqB,CAAA;AAO5B,qDAAqD;AACrD,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,mEAAmE;IACnE,kBAAkB,CAChB,CAAC,EAAE,OAAO,EACV,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAC5C,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,eAAe,GAAG,aAAa,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,GACxF,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAA;IAC5C,4EAA4E;IAC5E,kBAAkB,CAChB,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAA;CACnD;AAED,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAAA;IAClD,yDAAyD;IACzD,OAAO,CAAC,EAAE,wBAAwB,CAAA;CACnC;AAED,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,CAAA;AAoD1D,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CA+O1E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,UAAU,CAKrF"}
1
+ {"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../src/hono.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,KAAK,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEzC,OAAO,KAAK,EAEV,sBAAsB,EAEvB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAGV,WAAW,EAKZ,MAAM,qBAAqB,CAAA;AAO5B,qDAAqD;AACrD,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,mEAAmE;IACnE,kBAAkB,CAChB,CAAC,EAAE,OAAO,EACV,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAC5C,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,eAAe,GAAG,aAAa,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,GACxF,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAA;IAC5C,4EAA4E;IAC5E,kBAAkB,CAChB,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAA;CACnD;AAED,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAAA;IAClD,yDAAyD;IACzD,OAAO,CAAC,EAAE,wBAAwB,CAAA;CACnC;AAED,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,CAAA;AAiE1D,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAoP1E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,UAAU,CAKrF"}
package/dist/hono.js CHANGED
@@ -24,8 +24,17 @@ function attachPaymentSession(order, summary) {
24
24
  },
25
25
  };
26
26
  }
27
+ function adapterErrorDetails(err) {
28
+ const message = err instanceof Error ? err.message : String(err);
29
+ return { message, status: statusForAdapterErrorMessage(message) };
30
+ }
27
31
  function statusForAdapterErrorMessage(message) {
28
- return /(?:not found|_not_found\b)/i.test(message) ? 404 : 500;
32
+ if (/(?:not found|_not_found\b)/i.test(message))
33
+ return 404;
34
+ if (/(?:demo service is unavailable|FLIGHTS_DEMO_API_URL is not set|network connection lost|fetch failed|ECONNREFUSED|ENOTFOUND)/i.test(message)) {
35
+ return 503;
36
+ }
37
+ return 500;
29
38
  }
30
39
  function paymentSessionOptionsForIntent(intent) {
31
40
  if (!intent || intent.type === "hold")
@@ -66,7 +75,8 @@ export function createFlightAdminRoutes(options) {
66
75
  return c.json(response);
67
76
  }
68
77
  catch (err) {
69
- return c.json({ error: err instanceof Error ? err.message : String(err) }, 500);
78
+ const { message, status } = adapterErrorDetails(err);
79
+ return c.json({ error: message }, status);
70
80
  }
71
81
  });
72
82
  // ── Ancillaries ─────────────────────────────────────────────────────────
@@ -89,7 +99,8 @@ export function createFlightAdminRoutes(options) {
89
99
  return c.json(response);
90
100
  }
91
101
  catch (err) {
92
- return c.json({ error: err instanceof Error ? err.message : String(err) }, 500);
102
+ const { message, status } = adapterErrorDetails(err);
103
+ return c.json({ error: message }, status);
93
104
  }
94
105
  });
95
106
  // ── Seat map ────────────────────────────────────────────────────────────
@@ -114,8 +125,8 @@ export function createFlightAdminRoutes(options) {
114
125
  return c.json(response);
115
126
  }
116
127
  catch (err) {
117
- const message = err instanceof Error ? err.message : String(err);
118
- return c.json({ error: message }, statusForAdapterErrorMessage(message));
128
+ const { message, status } = adapterErrorDetails(err);
129
+ return c.json({ error: message }, status);
119
130
  }
120
131
  });
121
132
  // ── Re-price ────────────────────────────────────────────────────────────
@@ -134,7 +145,8 @@ export function createFlightAdminRoutes(options) {
134
145
  return c.json(response);
135
146
  }
136
147
  catch (err) {
137
- return c.json({ error: err instanceof Error ? err.message : String(err) }, 500);
148
+ const { message, status } = adapterErrorDetails(err);
149
+ return c.json({ error: message }, status);
138
150
  }
139
151
  });
140
152
  // ── Book ────────────────────────────────────────────────────────────────
@@ -162,7 +174,8 @@ export function createFlightAdminRoutes(options) {
162
174
  return c.json(response);
163
175
  }
164
176
  catch (err) {
165
- return c.json({ error: err instanceof Error ? err.message : String(err) }, 500);
177
+ const { message, status } = adapterErrorDetails(err);
178
+ return c.json({ error: message }, status);
166
179
  }
167
180
  });
168
181
  // ── List orders ─────────────────────────────────────────────────────────
@@ -199,7 +212,8 @@ export function createFlightAdminRoutes(options) {
199
212
  return c.json(response);
200
213
  }
201
214
  catch (err) {
202
- return c.json({ error: err instanceof Error ? err.message : String(err) }, 500);
215
+ const { message, status } = adapterErrorDetails(err);
216
+ return c.json({ error: message }, status);
203
217
  }
204
218
  });
205
219
  // ── Get order ───────────────────────────────────────────────────────────
@@ -217,8 +231,8 @@ export function createFlightAdminRoutes(options) {
217
231
  return c.json(response);
218
232
  }
219
233
  catch (err) {
220
- const message = err instanceof Error ? err.message : String(err);
221
- return c.json({ error: message }, statusForAdapterErrorMessage(message));
234
+ const { message, status } = adapterErrorDetails(err);
235
+ return c.json({ error: message }, status);
222
236
  }
223
237
  });
224
238
  // ── Cancel order ────────────────────────────────────────────────────────
@@ -238,8 +252,8 @@ export function createFlightAdminRoutes(options) {
238
252
  return c.json(response);
239
253
  }
240
254
  catch (err) {
241
- const message = err instanceof Error ? err.message : String(err);
242
- return c.json({ error: message }, statusForAdapterErrorMessage(message));
255
+ const { message, status } = adapterErrorDetails(err);
256
+ return c.json({ error: message }, status);
243
257
  }
244
258
  });
245
259
  // ── Reference: airports (with substring search) ───────────────────────────
package/dist/hono.test.js CHANGED
@@ -32,6 +32,22 @@ describe("flights hono module", () => {
32
32
  expect(res.status).toBe(200);
33
33
  expect(adapter.searchFlights).toHaveBeenCalledTimes(1);
34
34
  });
35
+ it("POST /search returns 503 when the demo adapter is unavailable", async () => {
36
+ const message = "Flights demo service is unavailable at http://localhost:3320. Start it with `pnpm --dir apps/flights-demo-api dev` or update FLIGHTS_DEMO_API_URL.";
37
+ const adapter = stubAdapter({
38
+ searchFlights: vi.fn(async () => {
39
+ throw new Error(message);
40
+ }),
41
+ });
42
+ const app = mount(adapter);
43
+ const res = await app.request("/v1/admin/flights/search", {
44
+ method: "POST",
45
+ headers: { "Content-Type": "application/json" },
46
+ body: JSON.stringify({ slices: [{}], passengers: { adults: 1 } }),
47
+ });
48
+ expect(res.status).toBe(503);
49
+ await expect(res.json()).resolves.toEqual({ error: message });
50
+ });
35
51
  it("POST /search validates required fields", async () => {
36
52
  const app = mount(stubAdapter());
37
53
  const res = await app.request("/v1/admin/flights/search", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyant-travel/flights",
3
- "version": "0.137.2",
3
+ "version": "0.137.4",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -84,10 +84,10 @@
84
84
  "hono": "^4.12.25",
85
85
  "zod": "^4.4.3",
86
86
  "@voyant-travel/db": "^0.109.4",
87
- "@voyant-travel/catalog": "^0.135.6",
88
- "@voyant-travel/catalog-contracts": "^0.108.0",
89
87
  "@voyant-travel/flights-contracts": "^0.104.6",
90
- "@voyant-travel/hono": "^0.118.2"
88
+ "@voyant-travel/hono": "^0.118.2",
89
+ "@voyant-travel/catalog": "^0.135.7",
90
+ "@voyant-travel/catalog-contracts": "^0.108.0"
91
91
  },
92
92
  "devDependencies": {
93
93
  "drizzle-kit": "^0.31.10",