@voyantjs/flights-react 0.21.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 (58) hide show
  1. package/dist/client.d.ts +16 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +75 -0
  4. package/dist/hooks/index.d.ts +13 -0
  5. package/dist/hooks/index.d.ts.map +1 -0
  6. package/dist/hooks/index.js +12 -0
  7. package/dist/hooks/use-aircraft.d.ts +17 -0
  8. package/dist/hooks/use-aircraft.d.ts.map +1 -0
  9. package/dist/hooks/use-aircraft.js +18 -0
  10. package/dist/hooks/use-airlines.d.ts +18 -0
  11. package/dist/hooks/use-airlines.d.ts.map +1 -0
  12. package/dist/hooks/use-airlines.js +18 -0
  13. package/dist/hooks/use-airport-search.d.ts +28 -0
  14. package/dist/hooks/use-airport-search.d.ts.map +1 -0
  15. package/dist/hooks/use-airport-search.js +23 -0
  16. package/dist/hooks/use-airports.d.ts +21 -0
  17. package/dist/hooks/use-airports.d.ts.map +1 -0
  18. package/dist/hooks/use-airports.js +17 -0
  19. package/dist/hooks/use-flight-ancillaries.d.ts +63 -0
  20. package/dist/hooks/use-flight-ancillaries.d.ts.map +1 -0
  21. package/dist/hooks/use-flight-ancillaries.js +24 -0
  22. package/dist/hooks/use-flight-book.d.ts +139 -0
  23. package/dist/hooks/use-flight-book.d.ts.map +1 -0
  24. package/dist/hooks/use-flight-book.js +24 -0
  25. package/dist/hooks/use-flight-offer.d.ts +106 -0
  26. package/dist/hooks/use-flight-offer.d.ts.map +1 -0
  27. package/dist/hooks/use-flight-offer.js +20 -0
  28. package/dist/hooks/use-flight-order.d.ts +286 -0
  29. package/dist/hooks/use-flight-order.d.ts.map +1 -0
  30. package/dist/hooks/use-flight-order.js +38 -0
  31. package/dist/hooks/use-flight-orders.d.ts +147 -0
  32. package/dist/hooks/use-flight-orders.d.ts.map +1 -0
  33. package/dist/hooks/use-flight-orders.js +31 -0
  34. package/dist/hooks/use-flight-search.d.ts +110 -0
  35. package/dist/hooks/use-flight-search.d.ts.map +1 -0
  36. package/dist/hooks/use-flight-search.js +18 -0
  37. package/dist/hooks/use-flight-seat-map.d.ts +49 -0
  38. package/dist/hooks/use-flight-seat-map.d.ts.map +1 -0
  39. package/dist/hooks/use-flight-seat-map.js +23 -0
  40. package/dist/hooks/use-saved-payment-methods.d.ts +23 -0
  41. package/dist/hooks/use-saved-payment-methods.d.ts.map +1 -0
  42. package/dist/hooks/use-saved-payment-methods.js +20 -0
  43. package/dist/index.d.ts +7 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +6 -0
  46. package/dist/provider.d.ts +2 -0
  47. package/dist/provider.d.ts.map +1 -0
  48. package/dist/provider.js +1 -0
  49. package/dist/query-keys.d.ts +42 -0
  50. package/dist/query-keys.d.ts.map +1 -0
  51. package/dist/query-keys.js +22 -0
  52. package/dist/query-options.d.ts +827 -0
  53. package/dist/query-options.d.ts.map +1 -0
  54. package/dist/query-options.js +58 -0
  55. package/dist/schemas.d.ts +1658 -0
  56. package/dist/schemas.d.ts.map +1 -0
  57. package/dist/schemas.js +295 -0
  58. package/package.json +85 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Zod schemas mirroring the flight contract types from `@voyantjs/flights`.
3
+ * Used to validate API responses at the network boundary.
4
+ *
5
+ * Drift policy: when the contract types change (additive only — see
6
+ * `packages/flights/src/contract/types.ts`), update these schemas to match.
7
+ */
8
+ import { z } from "zod";
9
+ const cabinSchema = z.enum(["economy", "premium_economy", "business", "first"]);
10
+ const passengerTypeSchema = z.enum(["adult", "child", "infant", "senior", "youth"]);
11
+ const moneySchema = z.object({
12
+ amount: z.string(),
13
+ currency: z.string(),
14
+ });
15
+ const segmentEndpointSchema = z.object({
16
+ iataCode: z.string(),
17
+ terminal: z.string().optional(),
18
+ at: z.string(),
19
+ });
20
+ const flightSegmentSchema = z.object({
21
+ segmentId: z.string(),
22
+ carrierCode: z.string(),
23
+ flightNumber: z.string(),
24
+ operatingCarrierCode: z.string().optional(),
25
+ operatingFlightNumber: z.string().optional(),
26
+ departure: segmentEndpointSchema,
27
+ arrival: segmentEndpointSchema,
28
+ duration: z.string().optional(),
29
+ aircraft: z.string().optional(),
30
+ cabin: cabinSchema,
31
+ fareClass: z.string().optional(),
32
+ fareBasis: z.string().optional(),
33
+ status: z.string().optional(),
34
+ providerData: z.record(z.string(), z.unknown()).optional(),
35
+ });
36
+ const itinerarySchema = z.object({
37
+ segments: z.array(flightSegmentSchema),
38
+ duration: z.string().optional(),
39
+ });
40
+ const fareBreakdownSchema = z.object({
41
+ passengerType: passengerTypeSchema,
42
+ passengerCount: z.number(),
43
+ baseFare: moneySchema,
44
+ taxes: moneySchema,
45
+ fees: moneySchema.optional(),
46
+ total: moneySchema,
47
+ fareFamily: z.string().optional(),
48
+ });
49
+ const fareBundleInclusionsSchema = z.object({
50
+ cabinBag: z.object({ included: z.boolean(), weightKg: z.number().optional() }).optional(),
51
+ checkedBag: z
52
+ .object({
53
+ included: z.boolean(),
54
+ pieces: z.number().optional(),
55
+ weightKg: z.number().optional(),
56
+ })
57
+ .optional(),
58
+ seatSelection: z.enum(["none", "standard", "free"]).optional(),
59
+ priorityBoarding: z.boolean().optional(),
60
+ loungeAccess: z.boolean().optional(),
61
+ refundable: z.boolean().optional(),
62
+ changeable: z.boolean().optional(),
63
+ notes: z.array(z.string()).optional(),
64
+ });
65
+ export const fareBundleSchema = z.object({
66
+ id: z.string(),
67
+ label: z.string(),
68
+ tier: z.enum(["basic", "standard", "plus", "premium"]),
69
+ priceDelta: moneySchema,
70
+ recommended: z.boolean().optional(),
71
+ inclusions: fareBundleInclusionsSchema,
72
+ providerData: z.record(z.string(), z.unknown()).optional(),
73
+ });
74
+ export const flightOfferSchema = z.object({
75
+ offerId: z.string(),
76
+ source: z.string(),
77
+ itineraries: z.array(itinerarySchema),
78
+ fareBreakdowns: z.array(fareBreakdownSchema),
79
+ totalPrice: moneySchema,
80
+ validatingCarrier: z.string().optional(),
81
+ expiresAt: z.string().optional(),
82
+ lastTicketingDate: z.string().optional(),
83
+ instantTicketing: z.boolean().optional(),
84
+ fareBundles: z.array(fareBundleSchema).optional(),
85
+ providerData: z.record(z.string(), z.unknown()).optional(),
86
+ });
87
+ export const flightSearchPaginationMetaSchema = z.object({
88
+ total: z.number(),
89
+ cursor: z.string().optional(),
90
+ hasMore: z.boolean(),
91
+ });
92
+ export const flightSearchResponseSchema = z.object({
93
+ offers: z.array(flightOfferSchema),
94
+ pagination: flightSearchPaginationMetaSchema.optional(),
95
+ providerData: z.record(z.string(), z.unknown()).optional(),
96
+ });
97
+ export const flightPriceResponseSchema = z.object({
98
+ offer: flightOfferSchema,
99
+ valid: z.boolean(),
100
+ invalidReason: z.string().optional(),
101
+ });
102
+ // ── Booking ─────────────────────────────────────────────────────────────────
103
+ const flightTicketSchema = z.object({
104
+ ticketNumber: z.string(),
105
+ passengerId: z.string(),
106
+ segmentIds: z.array(z.string()),
107
+ status: z.string().optional(),
108
+ });
109
+ const flightOrderStatusSchema = z.enum(["pending", "confirmed", "ticketed", "cancelled", "failed"]);
110
+ export const flightOrderSchema = z.object({
111
+ orderId: z.string(),
112
+ pnr: z.string().optional(),
113
+ status: flightOrderStatusSchema,
114
+ offer: flightOfferSchema,
115
+ passengers: z.array(z.object({
116
+ passengerId: z.string(),
117
+ type: passengerTypeSchema,
118
+ firstName: z.string(),
119
+ middleName: z.string().optional(),
120
+ lastName: z.string(),
121
+ dateOfBirth: z.string(),
122
+ gender: z.enum(["M", "F", "X"]).optional(),
123
+ email: z.string().optional(),
124
+ phone: z.string().optional(),
125
+ documents: z
126
+ .array(z.object({
127
+ type: z.enum(["passport", "national_id", "visa"]),
128
+ number: z.string(),
129
+ countryOfIssue: z.string(),
130
+ countryOfNationality: z.string().optional(),
131
+ expiryDate: z.string().optional(),
132
+ }))
133
+ .optional(),
134
+ })),
135
+ contact: z.object({ email: z.string().optional(), phone: z.string().optional() }).optional(),
136
+ tickets: z.array(flightTicketSchema).optional(),
137
+ totalPrice: moneySchema,
138
+ paymentDeadline: z.string().optional(),
139
+ createdAt: z.string(),
140
+ updatedAt: z.string().optional(),
141
+ providerData: z.record(z.string(), z.unknown()).optional(),
142
+ });
143
+ export const flightBookResponseSchema = z.object({
144
+ order: flightOrderSchema,
145
+ });
146
+ export const flightGetOrderResponseSchema = z.object({
147
+ order: flightOrderSchema,
148
+ });
149
+ export const flightCancelResponseSchema = z.object({
150
+ order: flightOrderSchema,
151
+ refundedAmount: moneySchema.optional(),
152
+ });
153
+ export const flightOrdersListResponseSchema = z.object({
154
+ orders: z.array(flightOrderSchema),
155
+ pagination: z.object({
156
+ total: z.number(),
157
+ hasMore: z.boolean(),
158
+ cursor: z.string().optional(),
159
+ }),
160
+ });
161
+ // ── Ancillaries ─────────────────────────────────────────────────────────────
162
+ const baggageCategorySchema = z.enum(["checked", "cabin", "personal_item", "sports", "oversized"]);
163
+ const assistanceCategorySchema = z.enum([
164
+ "wheelchair",
165
+ "visual",
166
+ "hearing",
167
+ "cognitive",
168
+ "medical",
169
+ "other",
170
+ ]);
171
+ const ancillaryBaggageOptionSchema = z.object({
172
+ id: z.string(),
173
+ label: z.string(),
174
+ category: baggageCategorySchema,
175
+ weightKg: z.number().optional(),
176
+ dimensions: z
177
+ .object({
178
+ lengthCm: z.number().optional(),
179
+ widthCm: z.number().optional(),
180
+ heightCm: z.number().optional(),
181
+ })
182
+ .optional(),
183
+ price: moneySchema,
184
+ recommended: z.boolean().optional(),
185
+ providerData: z.record(z.string(), z.unknown()).optional(),
186
+ });
187
+ const ancillaryAssistanceOptionSchema = z.object({
188
+ id: z.string(),
189
+ label: z.string(),
190
+ category: assistanceCategorySchema,
191
+ price: moneySchema.optional(),
192
+ notes: z.string().optional(),
193
+ });
194
+ const ancillaryExtraOptionSchema = z.object({
195
+ id: z.string(),
196
+ label: z.string(),
197
+ category: z.string(),
198
+ price: moneySchema,
199
+ pricingScope: z.enum(["per_passenger", "per_booking"]).optional(),
200
+ });
201
+ export const ancillaryCatalogSchema = z.object({
202
+ baggage: z.array(ancillaryBaggageOptionSchema),
203
+ assistance: z.array(ancillaryAssistanceOptionSchema),
204
+ extras: z.array(ancillaryExtraOptionSchema),
205
+ });
206
+ export const ancillaryResponseSchema = z.object({
207
+ catalog: ancillaryCatalogSchema,
208
+ validUntil: z.string().optional(),
209
+ });
210
+ // ── Seat maps ───────────────────────────────────────────────────────────────
211
+ const seatStatusSchema = z.enum(["available", "blocked", "unavailable", "selected"]);
212
+ const seatCategorySchema = z.enum([
213
+ "standard",
214
+ "preferred",
215
+ "extra_legroom",
216
+ "exit_row",
217
+ "premium",
218
+ "bulkhead",
219
+ ]);
220
+ const seatSchema = z.object({
221
+ seatNumber: z.string(),
222
+ row: z.number(),
223
+ column: z.string(),
224
+ status: seatStatusSchema,
225
+ category: seatCategorySchema,
226
+ price: moneySchema.optional(),
227
+ notes: z.string().optional(),
228
+ window: z.boolean().optional(),
229
+ aisle: z.boolean().optional(),
230
+ providerData: z.record(z.string(), z.unknown()).optional(),
231
+ });
232
+ const seatRowSchema = z.object({
233
+ row: z.number(),
234
+ seats: z.array(seatSchema),
235
+ });
236
+ export const seatMapSchema = z.object({
237
+ segmentId: z.string(),
238
+ aircraft: z.string().optional(),
239
+ cabin: cabinSchema,
240
+ columnLayout: z.array(z.string().nullable()),
241
+ rows: z.array(seatRowSchema),
242
+ providerData: z.record(z.string(), z.unknown()).optional(),
243
+ });
244
+ export const seatMapResponseSchema = z.object({
245
+ seatMap: seatMapSchema,
246
+ validUntil: z.string().optional(),
247
+ });
248
+ // ── Saved payment methods (demo / template-side) ─────────────────────────────
249
+ export const savedPaymentMethodSchema = z.object({
250
+ id: z.string(),
251
+ /** Present on CRM-backed responses; ignored client-side. */
252
+ personId: z.string().optional(),
253
+ brand: z.enum(["visa", "mastercard", "amex", "revolut", "bank_transfer"]),
254
+ /** Null for non-card methods (bank_transfer). */
255
+ last4: z.string().nullable(),
256
+ holderName: z.string().nullable().optional(),
257
+ /** Null for non-card methods. */
258
+ expMonth: z.number().nullable().optional(),
259
+ expYear: z.number().nullable().optional(),
260
+ processorToken: z.string(),
261
+ isDefault: z.boolean(),
262
+ createdAt: z.string(),
263
+ });
264
+ export const savedPaymentMethodListResponseSchema = z.object({
265
+ data: z.array(savedPaymentMethodSchema),
266
+ });
267
+ // ── Reference data ──────────────────────────────────────────────────────────
268
+ export const airlineSchema = z.object({
269
+ iataCode: z.string(),
270
+ icaoCode: z.string().nullable().optional(),
271
+ name: z.string(),
272
+ country: z.string().nullable().optional(),
273
+ logoUrl: z.string().nullable().optional(),
274
+ alliance: z.string().nullable().optional(),
275
+ });
276
+ export const airportSchema = z.object({
277
+ iataCode: z.string(),
278
+ icaoCode: z.string().nullable().optional(),
279
+ name: z.string(),
280
+ city: z.string(),
281
+ country: z.string(),
282
+ timezone: z.string().nullable().optional(),
283
+ latitude: z.number().nullable().optional(),
284
+ longitude: z.number().nullable().optional(),
285
+ });
286
+ export const aircraftSchema = z.object({
287
+ iataCode: z.string(),
288
+ icaoCode: z.string().nullable().optional(),
289
+ name: z.string(),
290
+ manufacturer: z.string().nullable().optional(),
291
+ typicalSeats: z.number().nullable().optional(),
292
+ });
293
+ export const airlineListResponseSchema = z.object({ data: z.array(airlineSchema) });
294
+ export const airportListResponseSchema = z.object({ data: z.array(airportSchema) });
295
+ export const aircraftListResponseSchema = z.object({ data: z.array(aircraftSchema) });
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@voyantjs/flights-react",
3
+ "version": "0.21.0",
4
+ "license": "Apache-2.0",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/voyantjs/voyant.git",
8
+ "directory": "packages/flights-react"
9
+ },
10
+ "type": "module",
11
+ "sideEffects": false,
12
+ "exports": {
13
+ ".": "./src/index.ts",
14
+ "./provider": "./src/provider.tsx",
15
+ "./hooks": "./src/hooks/index.ts",
16
+ "./client": "./src/client.ts",
17
+ "./query-keys": "./src/query-keys.ts"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json",
21
+ "clean": "rm -rf dist",
22
+ "prepack": "pnpm run build",
23
+ "typecheck": "tsc --noEmit",
24
+ "lint": "biome check src/",
25
+ "test": "vitest run --passWithNoTests"
26
+ },
27
+ "peerDependencies": {
28
+ "@voyantjs/flights": "workspace:*",
29
+ "@tanstack/react-query": "^5.0.0",
30
+ "react": "^19.0.0",
31
+ "react-dom": "^19.0.0",
32
+ "zod": "^4.0.0"
33
+ },
34
+ "devDependencies": {
35
+ "@voyantjs/flights": "workspace:*",
36
+ "@voyantjs/react": "workspace:*",
37
+ "@voyantjs/voyant-typescript-config": "workspace:*",
38
+ "@tanstack/react-query": "^5.96.2",
39
+ "@types/react": "^19.2.14",
40
+ "@types/react-dom": "^19.2.3",
41
+ "react": "^19.2.4",
42
+ "react-dom": "^19.2.4",
43
+ "typescript": "^6.0.2",
44
+ "vitest": "^4.1.2",
45
+ "zod": "^4.3.6"
46
+ },
47
+ "dependencies": {
48
+ "@voyantjs/react": "workspace:*"
49
+ },
50
+ "files": [
51
+ "dist"
52
+ ],
53
+ "publishConfig": {
54
+ "access": "public",
55
+ "exports": {
56
+ ".": {
57
+ "types": "./dist/index.d.ts",
58
+ "import": "./dist/index.js",
59
+ "default": "./dist/index.js"
60
+ },
61
+ "./provider": {
62
+ "types": "./dist/provider.d.ts",
63
+ "import": "./dist/provider.js",
64
+ "default": "./dist/provider.js"
65
+ },
66
+ "./hooks": {
67
+ "types": "./dist/hooks/index.d.ts",
68
+ "import": "./dist/hooks/index.js",
69
+ "default": "./dist/hooks/index.js"
70
+ },
71
+ "./client": {
72
+ "types": "./dist/client.d.ts",
73
+ "import": "./dist/client.js",
74
+ "default": "./dist/client.js"
75
+ },
76
+ "./query-keys": {
77
+ "types": "./dist/query-keys.d.ts",
78
+ "import": "./dist/query-keys.js",
79
+ "default": "./dist/query-keys.js"
80
+ }
81
+ },
82
+ "main": "./dist/index.js",
83
+ "types": "./dist/index.d.ts"
84
+ }
85
+ }