@duffel/api 1.4.0 → 1.7.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.
- package/README.md +23 -15
- package/dist/Client.d.ts +2 -2
- package/dist/DuffelPayments/PaymentIntents/PaymentIntents.d.ts +28 -0
- package/dist/DuffelPayments/PaymentIntents/PaymentIntentsType.d.ts +112 -0
- package/dist/DuffelPayments/PaymentIntents/index.d.ts +1 -0
- package/dist/DuffelPayments/index.d.ts +1 -0
- package/dist/Resource.d.ts +2 -2
- package/dist/booking/Offers/OfferTypes.d.ts +41 -1
- package/dist/booking/Offers/Offers.d.ts +19 -1
- package/dist/booking/OrderChangeOffers/index.d.ts +1 -1
- package/dist/booking/OrderChanges/index.d.ts +1 -1
- package/dist/booking/Orders/OrdersTypes.d.ts +5 -1
- package/dist/booking/SeatMaps/index.d.ts +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.es.js +1 -1
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/ClientType.d.ts +1 -1
- package/dist/types/index.d.ts +207 -6
- package/package.json +20 -6
package/README.md
CHANGED
|
@@ -26,7 +26,7 @@ import { Duffel } from '@duffel/api'
|
|
|
26
26
|
|
|
27
27
|
const duffel = new Duffel({
|
|
28
28
|
// Store your access token in an environment variable, keep it secret and only readable on your server
|
|
29
|
-
token: process.env.DUFFEL_ACCESS_TOKEN
|
|
29
|
+
token: process.env.DUFFEL_ACCESS_TOKEN,
|
|
30
30
|
})
|
|
31
31
|
|
|
32
32
|
// To quickly test whether your integration is working, you can get a single aircraft by its Duffel ID
|
|
@@ -57,7 +57,7 @@ Sometimes, you can pass in optional query parameters:
|
|
|
57
57
|
|
|
58
58
|
```javascript
|
|
59
59
|
duffel.offers.get(offer_id, {
|
|
60
|
-
return_available_services: true
|
|
60
|
+
return_available_services: true,
|
|
61
61
|
})
|
|
62
62
|
```
|
|
63
63
|
|
|
@@ -183,7 +183,7 @@ console.log(firstPage)
|
|
|
183
183
|
// You can then manually paginate by passing in the relevant query parameters
|
|
184
184
|
const nextPage = await duffel.airlines.list({
|
|
185
185
|
limit: firstPage.meta.limit,
|
|
186
|
-
after: firstPage.meta.after
|
|
186
|
+
after: firstPage.meta.after,
|
|
187
187
|
})
|
|
188
188
|
console.log(nextPage)
|
|
189
189
|
```
|
|
@@ -198,12 +198,12 @@ const offerRequestResponse = await duffel.offerRequests.create({
|
|
|
198
198
|
{
|
|
199
199
|
origin: 'NYC',
|
|
200
200
|
destination: 'ATL',
|
|
201
|
-
departure_date: '2021-06-21'
|
|
202
|
-
}
|
|
201
|
+
departure_date: '2021-06-21',
|
|
202
|
+
},
|
|
203
203
|
],
|
|
204
204
|
passengers: [{ type: 'adult' }],
|
|
205
205
|
cabin_class: 'economy',
|
|
206
|
-
return_offers: false
|
|
206
|
+
return_offers: false,
|
|
207
207
|
})
|
|
208
208
|
|
|
209
209
|
console.log(offerRequestResponse.data.id)
|
|
@@ -214,7 +214,9 @@ console.log(offerRequestResponse.data.id)
|
|
|
214
214
|
On certain endpoints you can perform actions, such as confirming an order cancellation. Usually you'll do that by just passing in the ID, but sometimes you can also pass in optional query parameters.
|
|
215
215
|
|
|
216
216
|
```javascript
|
|
217
|
-
const orderCancellationResponse = await duffel.orderCancellations.confirm(
|
|
217
|
+
const orderCancellationResponse = await duffel.orderCancellations.confirm(
|
|
218
|
+
order_cancellation_id
|
|
219
|
+
)
|
|
218
220
|
console.log(orderCancellationResponse.data.id)
|
|
219
221
|
```
|
|
220
222
|
|
|
@@ -223,11 +225,14 @@ console.log(orderCancellationResponse.data.id)
|
|
|
223
225
|
On certain endpoints you can perform updates, such as updating an order. Usually you'll do that by passing the object ID with the object data changes.
|
|
224
226
|
|
|
225
227
|
```javascript
|
|
226
|
-
const orderUpdateResponse = await duffel.orders.update(
|
|
227
|
-
|
|
228
|
-
|
|
228
|
+
const orderUpdateResponse = await duffel.orders.update(
|
|
229
|
+
'ord_00009hthhsUZ8W4LxQgkjo',
|
|
230
|
+
{
|
|
231
|
+
metadata: {
|
|
232
|
+
payment_intent_id: 'pit_00009htYpSCXrwaB9DnUm2',
|
|
233
|
+
},
|
|
229
234
|
}
|
|
230
|
-
|
|
235
|
+
)
|
|
231
236
|
|
|
232
237
|
console.log(orderUpdateResponse.data.id)
|
|
233
238
|
```
|
|
@@ -235,9 +240,12 @@ console.log(orderUpdateResponse.data.id)
|
|
|
235
240
|
And if you want to clear metadata:
|
|
236
241
|
|
|
237
242
|
```javascript
|
|
238
|
-
const orderUpdateResponse = await duffel.orders.update(
|
|
239
|
-
|
|
240
|
-
|
|
243
|
+
const orderUpdateResponse = await duffel.orders.update(
|
|
244
|
+
'ord_00009hthhsUZ8W4LxQgkjo',
|
|
245
|
+
{
|
|
246
|
+
metadata: {},
|
|
247
|
+
}
|
|
248
|
+
)
|
|
241
249
|
|
|
242
250
|
console.log(orderUpdateResponse.data.id)
|
|
243
251
|
```
|
|
@@ -260,7 +268,7 @@ We currently provide some basic logging in the library, and there are plans to a
|
|
|
260
268
|
const duffel = new Duffel({
|
|
261
269
|
// We recommend storing your access token in an environment variable for security
|
|
262
270
|
token: process.env.DUFFEL_ACCESS_TOKEN,
|
|
263
|
-
debug: { verbose: true }
|
|
271
|
+
debug: { verbose: true },
|
|
264
272
|
})
|
|
265
273
|
```
|
|
266
274
|
|
package/dist/Client.d.ts
CHANGED
|
@@ -11,14 +11,14 @@ export declare class Client {
|
|
|
11
11
|
private apiVersion;
|
|
12
12
|
private debug;
|
|
13
13
|
constructor({ token, basePath, apiVersion, debug }: Config);
|
|
14
|
-
request: <T_Data = any>({ method, path, data, params, compress }: {
|
|
14
|
+
request: <T_Data = any>({ method, path, data, params, compress, }: {
|
|
15
15
|
method: string;
|
|
16
16
|
path: string;
|
|
17
17
|
data?: Record<string, any> | undefined;
|
|
18
18
|
params?: Record<string, any> | undefined;
|
|
19
19
|
compress?: boolean | undefined;
|
|
20
20
|
}) => Promise<DuffelResponse<T_Data>>;
|
|
21
|
-
paginatedRequest<T_Data = any>({ path, params }: {
|
|
21
|
+
paginatedRequest<T_Data = any>({ path, params, }: {
|
|
22
22
|
path: string;
|
|
23
23
|
params?: Record<string, any>;
|
|
24
24
|
}): AsyncGenerator<DuffelResponse<T_Data>, void, unknown>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DuffelResponse } from '../../types';
|
|
2
|
+
import { Resource } from '../../Resource';
|
|
3
|
+
import { CreatePaymentIntent, PaymentIntent } from './PaymentIntentsType';
|
|
4
|
+
export declare class PaymentIntents extends Resource {
|
|
5
|
+
/**
|
|
6
|
+
* Endpoint path
|
|
7
|
+
*/
|
|
8
|
+
path: string;
|
|
9
|
+
constructor(args: any);
|
|
10
|
+
/**
|
|
11
|
+
* You should use this API to get the complete, up-to-date information about a Payment Intent.
|
|
12
|
+
* @param {string} id - Duffel's unique identifier for the Payment Intent
|
|
13
|
+
* @link https://duffel.com/docs/api/payment-intents/get-payment-intent-by-id
|
|
14
|
+
*/
|
|
15
|
+
get: (id: string) => Promise<DuffelResponse<PaymentIntent>>;
|
|
16
|
+
/**
|
|
17
|
+
* Once you've successfully collected the customer's card details, using the `client_token` from when you first created the Payment Intent, you then need to confirm it using this endpoint.
|
|
18
|
+
* Once confirmed, the amount charged to your customer's card will be added to your `Balance` (minus any Duffel Payment fees).
|
|
19
|
+
*/
|
|
20
|
+
confirm: (id: string) => Promise<DuffelResponse<PaymentIntent>>;
|
|
21
|
+
/**
|
|
22
|
+
* To begin the process of collecting a card payment from your customer, you need to create a Payment Intent.
|
|
23
|
+
* The Payment Intent will contain a `client_token` that you use to collect the card payment in your application.
|
|
24
|
+
* If the Payment Intent is created in test mode you should use a [test card](https://duffel.com/docs/api/overview/test-mode/test-card-numbers).
|
|
25
|
+
* @param {Object.<CreatePaymentIntent>} params - Endpoint params (amount and string)
|
|
26
|
+
*/
|
|
27
|
+
create: (params: CreatePaymentIntent) => Promise<DuffelResponse<PaymentIntent>>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
export interface PaymentIntent {
|
|
2
|
+
/**
|
|
3
|
+
* The amount of the Payment Intent that covers the cost of the flight being sold and any additional markup.
|
|
4
|
+
* The card payment will be charged this amount.
|
|
5
|
+
*/
|
|
6
|
+
amount: string;
|
|
7
|
+
/**
|
|
8
|
+
* The [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code of the country that issued the card used to confirm the Payment Intent.
|
|
9
|
+
* It will be null until the Payment Intent is confirmed.
|
|
10
|
+
*/
|
|
11
|
+
card_country_code: string | null;
|
|
12
|
+
/**
|
|
13
|
+
* The last four digits of the card used to confirm the Payment Intent.
|
|
14
|
+
* It will be null until the Payment Intent is confirmed.
|
|
15
|
+
*/
|
|
16
|
+
card_last_four_digits: string | null;
|
|
17
|
+
/**
|
|
18
|
+
* The card network in which the Payment Intent was processed on.
|
|
19
|
+
* It will be null until the Payment Intent is confirmed.
|
|
20
|
+
*/
|
|
21
|
+
card_network: 'amex' | 'cartes_bancaires' | 'diners' | 'discover' | 'interac' | 'jcb' | 'mastercard' | 'unionpay' | 'visa' | 'unknown' | null;
|
|
22
|
+
/**
|
|
23
|
+
* This value is used when displaying the payment collection form to securely identify and transmit the values to Duffel.
|
|
24
|
+
*/
|
|
25
|
+
client_token: string;
|
|
26
|
+
/**
|
|
27
|
+
* The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime at which the Payment Intent was confirmed
|
|
28
|
+
*/
|
|
29
|
+
confirmed_at: string;
|
|
30
|
+
/**
|
|
31
|
+
* The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime at which the Payment Intent was created
|
|
32
|
+
*/
|
|
33
|
+
created_at: string;
|
|
34
|
+
/**
|
|
35
|
+
* The currency of the `amount`, as an [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code.
|
|
36
|
+
* The card payment will be charged in this currency.
|
|
37
|
+
* If it's different to your Balance currency, it will be converted to your Balance currency before the Balance is topped up.
|
|
38
|
+
*/
|
|
39
|
+
currency: string;
|
|
40
|
+
/**
|
|
41
|
+
* The amount of the fees to process the Payment Intent.
|
|
42
|
+
* It will be `null` until the Payment Intent is confirmed.
|
|
43
|
+
*/
|
|
44
|
+
fees_amount: string | null;
|
|
45
|
+
/**
|
|
46
|
+
* The currency of the fees_amount, as an [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code.
|
|
47
|
+
* This currency will match your Balance currency.
|
|
48
|
+
* It will be null until the Payment Intent is confirmed.
|
|
49
|
+
*/
|
|
50
|
+
fees_currency: string | null;
|
|
51
|
+
/**
|
|
52
|
+
* Duffel's unique identifier for the `Payment Intent`
|
|
53
|
+
*/
|
|
54
|
+
id: string;
|
|
55
|
+
/**
|
|
56
|
+
* Whether the Payment Intent was created in live mode. This field will be set to `true` if the Payment Intent was created in live mode, or `false` if it was created in test mode.
|
|
57
|
+
*/
|
|
58
|
+
live_mode: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* The amount of the Payment Intent that was added to the Balance.
|
|
61
|
+
* It'll be `amount` (in the Balance currency) less the `fees_amount`.
|
|
62
|
+
* It will be `null` until the Payment Intent is confirmed.
|
|
63
|
+
*/
|
|
64
|
+
net_amount: string | null;
|
|
65
|
+
/**
|
|
66
|
+
* The currency of the net_amount, as an [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code.
|
|
67
|
+
* This currency will match your Balance currency.
|
|
68
|
+
* It will be null until the Payment Intent is confirmed.
|
|
69
|
+
*/
|
|
70
|
+
net_currency: string | null;
|
|
71
|
+
/**
|
|
72
|
+
* The Refunds for this Payment Intent
|
|
73
|
+
* @link https://duffel.com/docs/api/payment-intents/schema#payment-intents-schema-refunds
|
|
74
|
+
*/
|
|
75
|
+
refunds: {
|
|
76
|
+
amount: string;
|
|
77
|
+
arrival: string;
|
|
78
|
+
created_at: string;
|
|
79
|
+
currency: string;
|
|
80
|
+
destination: string;
|
|
81
|
+
id: string;
|
|
82
|
+
live_mode: boolean;
|
|
83
|
+
net_amount: string;
|
|
84
|
+
net_currency: string;
|
|
85
|
+
payment_intent_id: string;
|
|
86
|
+
status: 'succeeded' | 'pending' | 'failed';
|
|
87
|
+
updated_at: string;
|
|
88
|
+
}[];
|
|
89
|
+
/**
|
|
90
|
+
* The status of this Payment Intent
|
|
91
|
+
*/
|
|
92
|
+
status: null | 'requires_payment_method' | 'requires_confirmation' | 'requires_action' | 'processing' | 'requires_capture' | 'cancelled' | 'succeeded';
|
|
93
|
+
/**
|
|
94
|
+
* The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) datetime at which the Payment Intent was updated
|
|
95
|
+
*/
|
|
96
|
+
updated_at: string;
|
|
97
|
+
}
|
|
98
|
+
export interface CreatePaymentIntent {
|
|
99
|
+
/**
|
|
100
|
+
* This is the amount that the card payment being taken will be charged.
|
|
101
|
+
* It should be enough to cover the service(s) you want to sell (enough to book an Offer for example) and the processing fees.
|
|
102
|
+
* If the currency is different from your Balance currency you should also account for foreign exchange.
|
|
103
|
+
* It can be higher than that, in which case the remainder will be considered your markup.
|
|
104
|
+
* If it's higher than the maximum allowed for you organisation you will get a validation error. By default the maximum is 5,000.00 GBP (or equivalent in the same currency). If you need a maximum higher than the default please get in touch with us via help@duffel.com.
|
|
105
|
+
*/
|
|
106
|
+
amount: string;
|
|
107
|
+
/**
|
|
108
|
+
* The currency of the amount, as an [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code.
|
|
109
|
+
* This is going to be the currency that the card payment being taken in will be charged in.
|
|
110
|
+
*/
|
|
111
|
+
currency: string;
|
|
112
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './PaymentIntents';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './PaymentIntents';
|
package/dist/Resource.d.ts
CHANGED
|
@@ -3,13 +3,13 @@ import { DuffelResponse } from './types';
|
|
|
3
3
|
export declare class Resource {
|
|
4
4
|
private client;
|
|
5
5
|
constructor(client: Client);
|
|
6
|
-
protected request: <T_Data = any>({ method, path, data, params }: {
|
|
6
|
+
protected request: <T_Data = any>({ method, path, data, params, }: {
|
|
7
7
|
method: string;
|
|
8
8
|
path: string;
|
|
9
9
|
data?: Record<string, any> | undefined;
|
|
10
10
|
params?: Record<string, any> | undefined;
|
|
11
11
|
}) => Promise<DuffelResponse<T_Data>>;
|
|
12
|
-
protected paginatedRequest: <T_Data = any>({ path, params }: {
|
|
12
|
+
protected paginatedRequest: <T_Data = any>({ path, params, }: {
|
|
13
13
|
path: string;
|
|
14
14
|
params?: Record<string, any> | undefined;
|
|
15
15
|
}) => AsyncGenerator<DuffelResponse<T_Data>, void, unknown>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CabinClass, FlightsConditions, PassengerIdentityDocumentType, Place, PlaceType, Aircraft, Airline, Airport, PaginationMeta } from '../../types';
|
|
1
|
+
import { CabinClass, FlightsConditions, LoyaltyProgrammeAccount, PassengerIdentityDocumentType, Place, PlaceType, Aircraft, Airline, Airport, PaginationMeta } from '../../types';
|
|
2
2
|
/**
|
|
3
3
|
* Each offer represents flights you can buy from an airline at a particular price that meet your search criteria.
|
|
4
4
|
* @link https://duffel.com/docs/api/offers/schema
|
|
@@ -193,6 +193,28 @@ export interface OfferPassenger {
|
|
|
193
193
|
* The type of the passenger.
|
|
194
194
|
*/
|
|
195
195
|
type?: 'adult';
|
|
196
|
+
/**
|
|
197
|
+
* The passenger's family name. Only `space`, `-`, `'`, and letters from the `ASCII`, `Latin-1 Supplement` and `Latin
|
|
198
|
+
* Extended-A` (with the exceptions of `Æ`, `æ`, `IJ`, `ij`, `Œ`, `œ`, `Þ`, , and `ð`) Unicode charts are accepted. All
|
|
199
|
+
* other characters will result in a validation error. The minimum length is 1 character, and the maximum is 20
|
|
200
|
+
* characters.
|
|
201
|
+
*
|
|
202
|
+
* This is only required if you're also including **Loyalty Programme Accounts**.
|
|
203
|
+
*/
|
|
204
|
+
family_name?: string;
|
|
205
|
+
/**
|
|
206
|
+
* The passenger's given name. Only `space`, `-`, `'`, and letters from the `ASCII`, `Latin-1 Supplement` and `Latin
|
|
207
|
+
* Extended-A` (with the exceptions of `Æ`, `æ`, `IJ`, `ij`, `Œ`, `œ`, `Þ`, , and `ð`) Unicode charts are accepted. All
|
|
208
|
+
* other characters will result in a validation error. The minimum length is 1 character, and the maximum is 20
|
|
209
|
+
* characters.
|
|
210
|
+
*
|
|
211
|
+
* This is only required if you're also including **Loyalty Programme Accounts**.
|
|
212
|
+
*/
|
|
213
|
+
given_name?: string;
|
|
214
|
+
/**
|
|
215
|
+
* The **Loyalty Programme Accounts** for this passenger.
|
|
216
|
+
*/
|
|
217
|
+
loyalty_programme_accounts?: LoyaltyProgrammeAccount[];
|
|
196
218
|
/**
|
|
197
219
|
* The identifier for the passenger, unique within this Offer Request and across all Offer Requests.
|
|
198
220
|
* This ID will be generated by Duffel unless you had optionally provided one.
|
|
@@ -363,3 +385,21 @@ export interface ListOffersParams extends PaginationMeta {
|
|
|
363
385
|
*/
|
|
364
386
|
sort?: 'total_amount' | 'total_duration';
|
|
365
387
|
}
|
|
388
|
+
export interface LoyaltyProgrammeAccounts {
|
|
389
|
+
/**
|
|
390
|
+
* The passenger's account number for this Loyalty Programme Account
|
|
391
|
+
*/
|
|
392
|
+
account_number: string;
|
|
393
|
+
/**
|
|
394
|
+
* The IATA code for the airline that this Loyalty Programme Account belongs to
|
|
395
|
+
*/
|
|
396
|
+
airline_iata_code: string;
|
|
397
|
+
}
|
|
398
|
+
export interface UpdateOffer {
|
|
399
|
+
type: string;
|
|
400
|
+
loyalty_programme_accounts: LoyaltyProgrammeAccounts;
|
|
401
|
+
id: string;
|
|
402
|
+
given_name: string;
|
|
403
|
+
family_name: string;
|
|
404
|
+
age: number;
|
|
405
|
+
}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { Resource } from '../../Resource';
|
|
2
|
-
import { DuffelResponse, ListOffersParams, Offer } from '../../types';
|
|
2
|
+
import { DuffelResponse, ListOffersParams, Offer, LoyaltyProgrammeAccounts, UpdateOffer } from '../../types';
|
|
3
|
+
interface UpdateOfferBodyParameters {
|
|
4
|
+
loyalty_programme_accounts: LoyaltyProgrammeAccounts[];
|
|
5
|
+
given_name: string;
|
|
6
|
+
family_name: string;
|
|
7
|
+
}
|
|
8
|
+
interface UpdateOfferBodyParametersWithoutLoyalty {
|
|
9
|
+
loyalty_programme_accounts: never;
|
|
10
|
+
}
|
|
3
11
|
/**
|
|
4
12
|
* Each offer represents flights you can buy from an airline at a particular price that meet your search criteria.
|
|
5
13
|
* @class
|
|
@@ -34,4 +42,14 @@ export declare class Offers extends Resource {
|
|
|
34
42
|
* @link https://duffel.com/docs/api/offers/get-offers
|
|
35
43
|
*/
|
|
36
44
|
listWithGenerator: ({ offer_request_id, ...params }: ListOffersParams) => AsyncGenerator<DuffelResponse<Offer>, void, unknown>;
|
|
45
|
+
/**
|
|
46
|
+
* Some offer passenger fields are updateable. Each field that can be updated is detailed in the request object.
|
|
47
|
+
* @param {string} offerId - Duffel's unique identifier for the offer
|
|
48
|
+
* @param {string} passengerId - The identifier for the passenger. This ID will be generated by Duffel
|
|
49
|
+
* @param {string} params.family_name - The passenger's family name. Only space, -, ', and letters from the ASCII, Latin-1 Supplement and Latin Extended-A (with the exceptions of Æ, æ, IJ, ij, Œ, œ, Þ, and ð) Unicode charts are accepted. All other characters will result in a validation error. The minimum length is 1 character, and the maximum is 20 characters. This is only required if you're also including Loyalty Programme Accounts.
|
|
50
|
+
* @param {string} params.given_name - The passenger's given name. Only space, -, ', and letters from the ASCII, Latin-1 Supplement and Latin Extended-A (with the exceptions of Æ, æ, IJ, ij, Œ, œ, Þ, and ð) Unicode charts are accepted. All other characters will result in a validation error. The minimum length is 1 character, and the maximum is 20 characters. This is only required if you're also including Loyalty Programme Accounts.
|
|
51
|
+
* @param {Object.<LoyaltyProgrammeAccounts>} params.loyalty_programme_accounts - The Loyalty Programme Accounts for this passenger
|
|
52
|
+
*/
|
|
53
|
+
update: (offerId: string, passengerId: string, params?: UpdateOfferBodyParameters | UpdateOfferBodyParametersWithoutLoyalty | undefined) => Promise<DuffelResponse<UpdateOffer>>;
|
|
37
54
|
}
|
|
55
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from
|
|
1
|
+
export * from './OrderChangeOffers';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from
|
|
1
|
+
export * from './OrderChanges';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Aircraft, Airline, CabinClass, DuffelPassengerGender, DuffelPassengerTitle, DuffelPassengerType, FlightsConditions, OfferAvailableServiceBaggageMetadata, PassengerIdentityDocumentType, PaymentType, Place, PlaceType } from '../../types';
|
|
1
|
+
import { Aircraft, Airline, CabinClass, DuffelPassengerGender, DuffelPassengerTitle, DuffelPassengerType, FlightsConditions, LoyaltyProgrammeAccount, OfferAvailableServiceBaggageMetadata, PassengerIdentityDocumentType, PaymentType, Place, PlaceType } from '../../types';
|
|
2
2
|
/**
|
|
3
3
|
* An object containing metadata about the service, like the designator of the seat.
|
|
4
4
|
*/
|
|
@@ -140,6 +140,10 @@ export interface OrderPassenger {
|
|
|
140
140
|
* @return "adult", "child", or "infant_without_seat"
|
|
141
141
|
*/
|
|
142
142
|
infant_passenger_id?: string | null;
|
|
143
|
+
/**
|
|
144
|
+
* The **Loyalty Programme Accounts** for this passenger.
|
|
145
|
+
*/
|
|
146
|
+
loyalty_programme_accounts?: LoyaltyProgrammeAccount[];
|
|
143
147
|
}
|
|
144
148
|
export interface OrderPassengerIdentityDocument {
|
|
145
149
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from
|
|
1
|
+
export * from './SeatMaps';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { PaymentIntents } from './DuffelPayments';
|
|
1
2
|
import { OfferRequests, Offers, OrderCancellations, Orders, OrderChangeRequests, OrderChangeOffers, OrderChanges, Payments, SeatMaps } from './booking';
|
|
2
3
|
import { Config } from './Client';
|
|
3
4
|
import { Aircraft, Airlines, Airports } from './supportingResources';
|
|
@@ -29,5 +30,6 @@ export declare class Duffel {
|
|
|
29
30
|
orderCancellations: OrderCancellations;
|
|
30
31
|
payments: Payments;
|
|
31
32
|
seatMaps: SeatMaps;
|
|
33
|
+
paymentIntents: PaymentIntents;
|
|
32
34
|
constructor(config: Config);
|
|
33
35
|
}
|
package/dist/index.es.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import t from"stream";import e from"http";import r,{URL as o,URLSearchParams as n}from"url";import s from"https";import i from"zlib";function a(t,e){var r={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&e.indexOf(o)<0&&(r[o]=t[o]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(t);n<o.length;n++)e.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(t,o[n])&&(r[o[n]]=t[o[n]])}return r}function u(t,e,r,o){return new(r||(r=Promise))((function(n,s){function i(t){try{u(o.next(t))}catch(t){s(t)}}function a(t){try{u(o.throw(t))}catch(t){s(t)}}function u(t){var e;t.done?n(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(i,a)}u((o=o.apply(t,e||[])).next())}))}function h(t){return this instanceof h?(this.v=t,this):new h(t)}function c(t,e,r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var o,n=r.apply(t,e||[]),s=[];return o={},i("next"),i("throw"),i("return"),o[Symbol.asyncIterator]=function(){return this},o;function i(t){n[t]&&(o[t]=function(e){return new Promise((function(r,o){s.push([t,e,r,o])>1||a(t,e)}))})}function a(t,e){try{!function(t){t.value instanceof h?Promise.resolve(t.value.v).then(u,c):l(s[0][2],t)}(n[t](e))}catch(t){l(s[0][3],t)}}function u(t){a("next",t)}function c(t){a("throw",t)}function l(t,e){t(e),s.shift(),s.length&&a(s[0][0],s[0][1])}}!function(){const t={npm_package_version:"1.4.0"};try{if(process)return process.env=Object.assign({},process.env),void Object.assign(process.env,t)}catch(t){}globalThis.process={env:t}}();class l{constructor(t){this.request=({method:t,path:e,data:r,params:o})=>u(this,void 0,void 0,(function*(){return this.client.request({method:t,path:e,data:r,params:o})})),this.paginatedRequest=({path:t,params:e})=>this.client.paginatedRequest({path:t,params:e}),this.client=t}}class f extends Error{constructor({meta:t,errors:e}){super(),this.meta=t,this.errors=e}}class p extends Error{constructor(t){super("Invalid data: "+t),this.name="ValidationError"}}class d extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.list=t=>this.request({method:"GET",path:this.path,params:t}),this.listWithGenerator=()=>this.paginatedRequest({path:this.path}),this.create=t=>u(this,void 0,void 0,(function*(){const{return_offers:e}=t,r=a(t,["return_offers"]);return r.passengers&&r.passengers.forEach((t=>{if(t.loyalty_programme_accounts&&t.loyalty_programme_accounts.length>0&&(!t.given_name||!t.family_name))throw new p("loyalty programme requires family_name and given_name parameters")})),this.request({method:"POST",path:`${this.path}/`,data:r,params:Object.assign({},null!=e&&{return_offers:e})})})),this.path="air/offer_requests"}}class m extends l{constructor(t){super(t),this.get=(t,e)=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`,params:e})})),this.list=t=>{var{offer_request_id:e}=t,r=a(t,["offer_request_id"]);return this.request({method:"GET",path:this.path,params:Object.assign(Object.assign({},r),{offer_request_id:e})})},this.listWithGenerator=t=>{var{offer_request_id:e}=t,r=a(t,["offer_request_id"]);return this.paginatedRequest({path:this.path,params:Object.assign(Object.assign({},r),{offer_request_id:e})})},this.path="air/offers"}}class y extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.create=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:this.path,data:t})})),this.confirm=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:`${this.path}/${t}/actions/confirm`})})),this.path="air/order_cancellations"}}class b extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.list=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:this.path,params:t})})),this.listWithGenerator=t=>this.paginatedRequest({path:"air/orders",params:t}),this.create=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:this.path,data:t})})),this.update=(t,e)=>u(this,void 0,void 0,(function*(){return this.request({method:"PATCH",path:`${this.path}/${t}`,data:{options:e}})})),this.path="air/orders"}}class g extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.create=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:this.path,data:t})})),this.path="air/order_change_requests"}}class v extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.list=t=>this.request({method:"GET",path:this.path,params:t}),this.listWithGenerator=()=>this.paginatedRequest({path:this.path}),this.path="air/order_change_offers"}}class w extends l{constructor(t){super(t),this.create=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:this.path,data:t})})),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.confirm=(t,e)=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:`${this.path}/${t}/actions/confirm`,data:e})})),this.path="air/order_changes"}}class T extends l{constructor(t){super(t),this.create=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:this.path,data:t})})),this.path="air/payments"}}class O extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}`,params:t})})),this.path="air/seat_maps"}}var j="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function S(t){if(t.__esModule)return t;var e=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(t).forEach((function(r){var o=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,o.get?o:{enumerable:!0,get:function(){return t[r]}})})),e}var E=S(Object.freeze({__proto__:null,default:function(t,e){return e=e||{},new Promise((function(r,o){var n=new XMLHttpRequest,s=[],i=[],a={},u=function(){return{ok:2==(n.status/100|0),statusText:n.statusText,status:n.status,url:n.responseURL,text:function(){return Promise.resolve(n.responseText)},json:function(){return Promise.resolve(n.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([n.response]))},clone:u,headers:{keys:function(){return s},entries:function(){return i},get:function(t){return a[t.toLowerCase()]},has:function(t){return t.toLowerCase()in a}}}};for(var h in n.open(e.method||"get",t,!0),n.onload=function(){n.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm,(function(t,e,r){s.push(e=e.toLowerCase()),i.push([e,r]),a[e]=a[e]?a[e]+","+r:r})),r(u())},n.onerror=o,n.withCredentials="include"==e.credentials,e.headers)n.setRequestHeader(h,e.headers[h]);n.send(e.body||null)}))}}));const P=t.Readable,x=Symbol("buffer"),q=Symbol("type");class ${constructor(){this[q]="";const t=arguments[0],e=arguments[1],r=[];let o=0;if(t){const e=t,n=Number(e.length);for(let t=0;t<n;t++){const n=e[t];let s;s=n instanceof Buffer?n:ArrayBuffer.isView(n)?Buffer.from(n.buffer,n.byteOffset,n.byteLength):n instanceof ArrayBuffer?Buffer.from(n):n instanceof $?n[x]:Buffer.from("string"==typeof n?n:String(n)),o+=s.length,r.push(s)}}this[x]=Buffer.concat(r);let n=e&&void 0!==e.type&&String(e.type).toLowerCase();n&&!/[^\u0020-\u007E]/.test(n)&&(this[q]=n)}get size(){return this[x].length}get type(){return this[q]}text(){return Promise.resolve(this[x].toString())}arrayBuffer(){const t=this[x],e=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength);return Promise.resolve(e)}stream(){const t=new P;return t._read=function(){},t.push(this[x]),t.push(null),t}toString(){return"[object Blob]"}slice(){const t=this.size,e=arguments[0],r=arguments[1];let o,n;o=void 0===e?0:e<0?Math.max(t+e,0):Math.min(e,t),n=void 0===r?t:r<0?Math.max(t+r,0):Math.min(r,t);const s=Math.max(n-o,0),i=this[x].slice(o,o+s),a=new $([],{type:arguments[2]});return a[x]=i,a}}function _(t,e,r){Error.call(this,t),this.message=t,this.type=e,r&&(this.code=this.errno=r.code),Error.captureStackTrace(this,this.constructor)}let B;Object.defineProperties($.prototype,{size:{enumerable:!0},type:{enumerable:!0},slice:{enumerable:!0}}),Object.defineProperty($.prototype,Symbol.toStringTag,{value:"Blob",writable:!1,enumerable:!1,configurable:!0}),_.prototype=Object.create(Error.prototype),_.prototype.constructor=_,_.prototype.name="FetchError";try{B=require("encoding").convert}catch(t){}const C=Symbol("Body internals"),R=t.PassThrough;function k(e){var r=this,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=o.size;let s=void 0===n?0:n;var i=o.timeout;let a=void 0===i?0:i;null==e?e=null:L(e)?e=Buffer.from(e.toString()):G(e)||Buffer.isBuffer(e)||("[object ArrayBuffer]"===Object.prototype.toString.call(e)?e=Buffer.from(e):ArrayBuffer.isView(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):e instanceof t||(e=Buffer.from(String(e)))),this[C]={body:e,disturbed:!1,error:null},this.size=s,this.timeout=a,e instanceof t&&e.on("error",(function(t){const e="AbortError"===t.name?t:new _(`Invalid response body while trying to fetch ${r.url}: ${t.message}`,"system",t);r[C].error=e}))}function A(){var e=this;if(this[C].disturbed)return k.Promise.reject(new TypeError(`body used already for: ${this.url}`));if(this[C].disturbed=!0,this[C].error)return k.Promise.reject(this[C].error);let r=this.body;if(null===r)return k.Promise.resolve(Buffer.alloc(0));if(G(r)&&(r=r.stream()),Buffer.isBuffer(r))return k.Promise.resolve(r);if(!(r instanceof t))return k.Promise.resolve(Buffer.alloc(0));let o=[],n=0,s=!1;return new k.Promise((function(t,i){let a;e.timeout&&(a=setTimeout((function(){s=!0,i(new _(`Response timeout while trying to fetch ${e.url} (over ${e.timeout}ms)`,"body-timeout"))}),e.timeout)),r.on("error",(function(t){"AbortError"===t.name?(s=!0,i(t)):i(new _(`Invalid response body while trying to fetch ${e.url}: ${t.message}`,"system",t))})),r.on("data",(function(t){if(!s&&null!==t){if(e.size&&n+t.length>e.size)return s=!0,void i(new _(`content size at ${e.url} over limit: ${e.size}`,"max-size"));n+=t.length,o.push(t)}})),r.on("end",(function(){if(!s){clearTimeout(a);try{t(Buffer.concat(o,n))}catch(t){i(new _(`Could not create Buffer from response body for ${e.url}: ${t.message}`,"system",t))}}}))}))}function L(t){return"object"==typeof t&&"function"==typeof t.append&&"function"==typeof t.delete&&"function"==typeof t.get&&"function"==typeof t.getAll&&"function"==typeof t.has&&"function"==typeof t.set&&("URLSearchParams"===t.constructor.name||"[object URLSearchParams]"===Object.prototype.toString.call(t)||"function"==typeof t.sort)}function G(t){return"object"==typeof t&&"function"==typeof t.arrayBuffer&&"string"==typeof t.type&&"function"==typeof t.stream&&"function"==typeof t.constructor&&"string"==typeof t.constructor.name&&/^(Blob|File)$/.test(t.constructor.name)&&/^(Blob|File)$/.test(t[Symbol.toStringTag])}function z(e){let r,o,n=e.body;if(e.bodyUsed)throw new Error("cannot clone body after it is used");return n instanceof t&&"function"!=typeof n.getBoundary&&(r=new R,o=new R,n.pipe(r),n.pipe(o),e[C].body=r,n=o),n}function U(e){return null===e?null:"string"==typeof e?"text/plain;charset=UTF-8":L(e)?"application/x-www-form-urlencoded;charset=UTF-8":G(e)?e.type||null:Buffer.isBuffer(e)||"[object ArrayBuffer]"===Object.prototype.toString.call(e)||ArrayBuffer.isView(e)?null:"function"==typeof e.getBoundary?`multipart/form-data;boundary=${e.getBoundary()}`:e instanceof t?null:"text/plain;charset=UTF-8"}function H(t){const e=t.body;return null===e?0:G(e)?e.size:Buffer.isBuffer(e)?e.length:e&&"function"==typeof e.getLengthSync&&(e._lengthRetrievers&&0==e._lengthRetrievers.length||e.hasKnownLength&&e.hasKnownLength())?e.getLengthSync():null}k.prototype={get body(){return this[C].body},get bodyUsed(){return this[C].disturbed},arrayBuffer(){return A.call(this).then((function(t){return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}))},blob(){let t=this.headers&&this.headers.get("content-type")||"";return A.call(this).then((function(e){return Object.assign(new $([],{type:t.toLowerCase()}),{[x]:e})}))},json(){var t=this;return A.call(this).then((function(e){try{return JSON.parse(e.toString())}catch(e){return k.Promise.reject(new _(`invalid json response body at ${t.url} reason: ${e.message}`,"invalid-json"))}}))},text(){return A.call(this).then((function(t){return t.toString()}))},buffer(){return A.call(this)},textConverted(){var t=this;return A.call(this).then((function(e){return function(t,e){if("function"!=typeof B)throw new Error("The package `encoding` must be installed to use the textConverted() function");const r=e.get("content-type");let o,n,s="utf-8";r&&(o=/charset=([^;]*)/i.exec(r));n=t.slice(0,1024).toString(),!o&&n&&(o=/<meta.+?charset=(['"])(.+?)\1/i.exec(n));!o&&n&&(o=/<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(n),o||(o=/<meta[\s]+?content=(['"])(.+?)\1[\s]+?http-equiv=(['"])content-type\3/i.exec(n),o&&o.pop()),o&&(o=/charset=(.*)/i.exec(o.pop())));!o&&n&&(o=/<\?xml.+?encoding=(['"])(.+?)\1/i.exec(n));o&&(s=o.pop(),"gb2312"!==s&&"gbk"!==s||(s="gb18030"));return B(t,"UTF-8",s).toString()}(e,t.headers)}))}},Object.defineProperties(k.prototype,{body:{enumerable:!0},bodyUsed:{enumerable:!0},arrayBuffer:{enumerable:!0},blob:{enumerable:!0},json:{enumerable:!0},text:{enumerable:!0}}),k.mixIn=function(t){for(const e of Object.getOwnPropertyNames(k.prototype))if(!(e in t)){const r=Object.getOwnPropertyDescriptor(k.prototype,e);Object.defineProperty(t,e,r)}},k.Promise=global.Promise;const I=/[^\^_`a-zA-Z\-0-9!#$%&'*+.|~]/,F=/[^\t\x20-\x7e\x80-\xff]/;function M(t){if(t=`${t}`,I.test(t)||""===t)throw new TypeError(`${t} is not a legal HTTP header name`)}function D(t){if(t=`${t}`,F.test(t))throw new TypeError(`${t} is not a legal HTTP header value`)}function V(t,e){e=e.toLowerCase();for(const r in t)if(r.toLowerCase()===e)return r}const N=Symbol("map");class W{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;if(this[N]=Object.create(null),t instanceof W){const e=t.raw(),r=Object.keys(e);for(const t of r)for(const r of e[t])this.append(t,r)}else if(null==t);else{if("object"!=typeof t)throw new TypeError("Provided initializer must be an object");{const e=t[Symbol.iterator];if(null!=e){if("function"!=typeof e)throw new TypeError("Header pairs must be iterable");const r=[];for(const e of t){if("object"!=typeof e||"function"!=typeof e[Symbol.iterator])throw new TypeError("Each header pair must be iterable");r.push(Array.from(e))}for(const t of r){if(2!==t.length)throw new TypeError("Each header pair must be a name/value tuple");this.append(t[0],t[1])}}else for(const e of Object.keys(t)){const r=t[e];this.append(e,r)}}}}get(t){M(t=`${t}`);const e=V(this[N],t);return void 0===e?null:this[N][e].join(", ")}forEach(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,r=J(this),o=0;for(;o<r.length;){var n=r[o];const s=n[0],i=n[1];t.call(e,i,s,this),r=J(this),o++}}set(t,e){e=`${e}`,M(t=`${t}`),D(e);const r=V(this[N],t);this[N][void 0!==r?r:t]=[e]}append(t,e){e=`${e}`,M(t=`${t}`),D(e);const r=V(this[N],t);void 0!==r?this[N][r].push(e):this[N][t]=[e]}has(t){return M(t=`${t}`),void 0!==V(this[N],t)}delete(t){M(t=`${t}`);const e=V(this[N],t);void 0!==e&&delete this[N][e]}raw(){return this[N]}keys(){return K(this,"key")}values(){return K(this,"value")}[Symbol.iterator](){return K(this,"key+value")}}function J(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"key+value";const r=Object.keys(t[N]).sort();return r.map("key"===e?function(t){return t.toLowerCase()}:"value"===e?function(e){return t[N][e].join(", ")}:function(e){return[e.toLowerCase(),t[N][e].join(", ")]})}W.prototype.entries=W.prototype[Symbol.iterator],Object.defineProperty(W.prototype,Symbol.toStringTag,{value:"Headers",writable:!1,enumerable:!1,configurable:!0}),Object.defineProperties(W.prototype,{get:{enumerable:!0},forEach:{enumerable:!0},set:{enumerable:!0},append:{enumerable:!0},has:{enumerable:!0},delete:{enumerable:!0},keys:{enumerable:!0},values:{enumerable:!0},entries:{enumerable:!0}});const Z=Symbol("internal");function K(t,e){const r=Object.create(Y);return r[Z]={target:t,kind:e,index:0},r}const Y=Object.setPrototypeOf({next(){if(!this||Object.getPrototypeOf(this)!==Y)throw new TypeError("Value of `this` is not a HeadersIterator");var t=this[Z];const e=t.target,r=t.kind,o=t.index,n=J(e,r);return o>=n.length?{value:void 0,done:!0}:(this[Z].index=o+1,{value:n[o],done:!1})}},Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));function Q(t){const e=Object.assign({__proto__:null},t[N]),r=V(t[N],"Host");return void 0!==r&&(e[r]=e[r][0]),e}Object.defineProperty(Y,Symbol.toStringTag,{value:"HeadersIterator",writable:!1,enumerable:!1,configurable:!0});const X=Symbol("Response internals"),tt=e.STATUS_CODES;class et{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};k.call(this,t,e);const r=e.status||200,o=new W(e.headers);if(null!=t&&!o.has("Content-Type")){const e=U(t);e&&o.append("Content-Type",e)}this[X]={url:e.url,status:r,statusText:e.statusText||tt[r],headers:o,counter:e.counter}}get url(){return this[X].url||""}get status(){return this[X].status}get ok(){return this[X].status>=200&&this[X].status<300}get redirected(){return this[X].counter>0}get statusText(){return this[X].statusText}get headers(){return this[X].headers}clone(){return new et(z(this),{url:this.url,status:this.status,statusText:this.statusText,headers:this.headers,ok:this.ok,redirected:this.redirected})}}k.mixIn(et.prototype),Object.defineProperties(et.prototype,{url:{enumerable:!0},status:{enumerable:!0},ok:{enumerable:!0},redirected:{enumerable:!0},statusText:{enumerable:!0},headers:{enumerable:!0},clone:{enumerable:!0}}),Object.defineProperty(et.prototype,Symbol.toStringTag,{value:"Response",writable:!1,enumerable:!1,configurable:!0});const rt=Symbol("Request internals"),ot=r.parse,nt=r.format,st="destroy"in t.Readable.prototype;function it(t){return"object"==typeof t&&"object"==typeof t[rt]}class at{constructor(t){let e,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};it(t)?e=ot(t.url):(e=t&&t.href?ot(t.href):ot(`${t}`),t={});let o=r.method||t.method||"GET";if(o=o.toUpperCase(),(null!=r.body||it(t)&&null!==t.body)&&("GET"===o||"HEAD"===o))throw new TypeError("Request with GET/HEAD method cannot have body");let n=null!=r.body?r.body:it(t)&&null!==t.body?z(t):null;k.call(this,n,{timeout:r.timeout||t.timeout||0,size:r.size||t.size||0});const s=new W(r.headers||t.headers||{});if(null!=n&&!s.has("Content-Type")){const t=U(n);t&&s.append("Content-Type",t)}let i=it(t)?t.signal:null;if("signal"in r&&(i=r.signal),null!=i&&!function(t){const e=t&&"object"==typeof t&&Object.getPrototypeOf(t);return!(!e||"AbortSignal"!==e.constructor.name)}(i))throw new TypeError("Expected signal to be an instanceof AbortSignal");this[rt]={method:o,redirect:r.redirect||t.redirect||"follow",headers:s,parsedURL:e,signal:i},this.follow=void 0!==r.follow?r.follow:void 0!==t.follow?t.follow:20,this.compress=void 0!==r.compress?r.compress:void 0===t.compress||t.compress,this.counter=r.counter||t.counter||0,this.agent=r.agent||t.agent}get method(){return this[rt].method}get url(){return nt(this[rt].parsedURL)}get headers(){return this[rt].headers}get redirect(){return this[rt].redirect}get signal(){return this[rt].signal}clone(){return new at(this)}}function ut(t){Error.call(this,t),this.type="aborted",this.message=t,Error.captureStackTrace(this,this.constructor)}k.mixIn(at.prototype),Object.defineProperty(at.prototype,Symbol.toStringTag,{value:"Request",writable:!1,enumerable:!1,configurable:!0}),Object.defineProperties(at.prototype,{method:{enumerable:!0},url:{enumerable:!0},headers:{enumerable:!0},redirect:{enumerable:!0},clone:{enumerable:!0},signal:{enumerable:!0}}),ut.prototype=Object.create(Error.prototype),ut.prototype.constructor=ut,ut.prototype.name="AbortError";const ht=t.PassThrough,ct=r.resolve;function lt(r,o){if(!lt.Promise)throw new Error("native promise missing, set fetch.Promise to your favorite alternative");return k.Promise=lt.Promise,new lt.Promise((function(n,a){const u=new at(r,o),h=function(e){const r=e[rt].parsedURL,o=new W(e[rt].headers);if(o.has("Accept")||o.set("Accept","*/*"),!r.protocol||!r.hostname)throw new TypeError("Only absolute URLs are supported");if(!/^https?:$/.test(r.protocol))throw new TypeError("Only HTTP(S) protocols are supported");if(e.signal&&e.body instanceof t.Readable&&!st)throw new Error("Cancellation of streamed requests with AbortSignal is not supported in node < 8");let n=null;if(null==e.body&&/^(POST|PUT)$/i.test(e.method)&&(n="0"),null!=e.body){const t=H(e);"number"==typeof t&&(n=String(t))}n&&o.set("Content-Length",n),o.has("User-Agent")||o.set("User-Agent","node-fetch/1.0 (+https://github.com/bitinn/node-fetch)"),e.compress&&!o.has("Accept-Encoding")&&o.set("Accept-Encoding","gzip,deflate");let s=e.agent;return"function"==typeof s&&(s=s(r)),o.has("Connection")||s||o.set("Connection","close"),Object.assign({},r,{method:e.method,headers:Q(o),agent:s})}(u),c=("https:"===h.protocol?s:e).request,l=u.signal;let f=null;const p=function(){let e=new ut("The user aborted a request.");a(e),u.body&&u.body instanceof t.Readable&&u.body.destroy(e),f&&f.body&&f.body.emit("error",e)};if(l&&l.aborted)return void p();const d=function(){p(),b()},m=c(h);let y;function b(){m.abort(),l&&l.removeEventListener("abort",d),clearTimeout(y)}l&&l.addEventListener("abort",d),u.timeout&&m.once("socket",(function(t){y=setTimeout((function(){a(new _(`network timeout at: ${u.url}`,"request-timeout")),b()}),u.timeout)})),m.on("error",(function(t){a(new _(`request to ${u.url} failed, reason: ${t.message}`,"system",t)),b()})),m.on("response",(function(t){clearTimeout(y);const e=function(t){const e=new W;for(const r of Object.keys(t))if(!I.test(r))if(Array.isArray(t[r]))for(const o of t[r])F.test(o)||(void 0===e[N][r]?e[N][r]=[o]:e[N][r].push(o));else F.test(t[r])||(e[N][r]=[t[r]]);return e}(t.headers);if(lt.isRedirect(t.statusCode)){const r=e.get("Location"),o=null===r?null:ct(u.url,r);switch(u.redirect){case"error":return a(new _(`uri requested responds with a redirect, redirect mode is set to error: ${u.url}`,"no-redirect")),void b();case"manual":if(null!==o)try{e.set("Location",o)}catch(t){a(t)}break;case"follow":if(null===o)break;if(u.counter>=u.follow)return a(new _(`maximum redirect reached at: ${u.url}`,"max-redirect")),void b();const r={headers:new W(u.headers),follow:u.follow,counter:u.counter+1,agent:u.agent,compress:u.compress,method:u.method,body:u.body,signal:u.signal,timeout:u.timeout,size:u.size};return 303!==t.statusCode&&u.body&&null===H(u)?(a(new _("Cannot follow redirect with body being a readable stream","unsupported-redirect")),void b()):(303!==t.statusCode&&(301!==t.statusCode&&302!==t.statusCode||"POST"!==u.method)||(r.method="GET",r.body=void 0,r.headers.delete("content-length")),n(lt(new at(o,r))),void b())}}t.once("end",(function(){l&&l.removeEventListener("abort",d)}));let r=t.pipe(new ht);const o={url:u.url,status:t.statusCode,statusText:t.statusMessage,headers:e,size:u.size,timeout:u.timeout,counter:u.counter},s=e.get("Content-Encoding");if(!u.compress||"HEAD"===u.method||null===s||204===t.statusCode||304===t.statusCode)return f=new et(r,o),void n(f);const h={flush:i.Z_SYNC_FLUSH,finishFlush:i.Z_SYNC_FLUSH};if("gzip"==s||"x-gzip"==s)return r=r.pipe(i.createGunzip(h)),f=new et(r,o),void n(f);if("deflate"!=s&&"x-deflate"!=s){if("br"==s&&"function"==typeof i.createBrotliDecompress)return r=r.pipe(i.createBrotliDecompress()),f=new et(r,o),void n(f);f=new et(r,o),n(f)}else{t.pipe(new ht).once("data",(function(t){r=8==(15&t[0])?r.pipe(i.createInflate()):r.pipe(i.createInflateRaw()),f=new et(r,o),n(f)}))}})),function(t,e){const r=e.body;null===r?t.end():G(r)?r.stream().pipe(t):Buffer.isBuffer(r)?(t.write(r),t.end()):r.pipe(t)}(m,u)}))}lt.isRedirect=function(t){return 301===t||302===t||303===t||307===t||308===t},lt.Promise=global.Promise;var ft=S(Object.freeze({__proto__:null,default:lt,Headers:W,Request:at,Response:et,FetchError:_}));function pt(t){return t&&t.default||t}var dt=j.fetch=j.fetch||("undefined"==typeof process?pt(E):function(t,e){return pt(ft)(String(t).replace(/^\/\//g,"https://"),e)});class mt{constructor({token:t,basePath:e,apiVersion:r,debug:s}){this.request=({method:t,path:e,data:r,params:s,compress:i=!0})=>u(this,void 0,void 0,(function*(){var a;let u,h;const c=new o(e,this.basePath),l={"User-Agent":`Duffel/${this.apiVersion} duffel_api_javascript/${process.env.npm_package_version}`,Accept:"application/json","Accept-Encoding":"gzip","Content-Type":"application/json","Duffel-Version":this.apiVersion,Authorization:`Bearer ${this.token}`};if(s){const t=Object.entries(s).sort().filter((t=>null!==t[0]));c.search=new n(t).toString()}r&&(u=JSON.stringify({data:Object.assign({},r)})),(null===(a=this.debug)||void 0===a?void 0:a.verbose)&&(console.info("Endpoint: ",c.href),console.info("Method: ",t),r&&console.info("Body Parameters: ",r),s&&console.info("Query Parameters: ",s));const p=yield dt(c.href,{method:t,headers:l,body:u,compress:i}),d=p.headers.get("content-type");if(h=d&&d.includes("json")?yield p.json():yield p.text(),!p.ok||"errors"in h&&h.errors)throw new f(h);return h})),this.token=t,this.basePath=e||"https://api.duffel.com",this.apiVersion=r||"beta",this.debug=s}paginatedRequest({path:t,params:e}){return c(this,arguments,(function*(){let r=yield h(this.request({method:"GET",path:t,params:e}));for(const t of r.data)yield yield h({data:t});for(;r.meta&&"after"in r.meta&&r.meta.after;){r=yield h(this.request({method:"GET",path:t,params:{limit:r.meta.limit,after:r.meta.after}}));for(const t of r.data)yield yield h({data:t})}}))}}class yt extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.list=t=>this.request({method:"GET",path:this.path,params:t}),this.listWithGenerator=()=>this.paginatedRequest({path:this.path}),this.path="air/aircraft"}}class bt extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.list=t=>this.request({method:"GET",path:this.path,params:t}),this.listWithGenerator=()=>this.paginatedRequest({path:this.path}),this.path="air/airlines"}}class gt extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.list=t=>this.request({method:"GET",path:this.path,params:t}),this.listWithGenerator=()=>this.paginatedRequest({path:this.path}),this.path="air/airports"}}class vt{constructor(t){this.client=new mt(t),this.aircraft=new yt(this.client),this.airlines=new bt(this.client),this.airports=new gt(this.client),this.offerRequests=new d(this.client),this.offers=new m(this.client),this.orders=new b(this.client),this.orderChangeRequests=new g(this.client),this.orderChangeOffers=new v(this.client),this.orderChanges=new w(this.client),this.orderCancellations=new y(this.client),this.payments=new T(this.client),this.seatMaps=new O(this.client)}}export{vt as Duffel};
|
|
1
|
+
import t from"stream";import e from"http";import r,{URL as o,URLSearchParams as n}from"url";import s from"https";import i from"zlib";function a(t,e){var r={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&e.indexOf(o)<0&&(r[o]=t[o]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(t);n<o.length;n++)e.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(t,o[n])&&(r[o[n]]=t[o[n]])}return r}function u(t,e,r,o){return new(r||(r=Promise))((function(n,s){function i(t){try{u(o.next(t))}catch(t){s(t)}}function a(t){try{u(o.throw(t))}catch(t){s(t)}}function u(t){var e;t.done?n(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(i,a)}u((o=o.apply(t,e||[])).next())}))}function h(t){return this instanceof h?(this.v=t,this):new h(t)}function c(t,e,r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var o,n=r.apply(t,e||[]),s=[];return o={},i("next"),i("throw"),i("return"),o[Symbol.asyncIterator]=function(){return this},o;function i(t){n[t]&&(o[t]=function(e){return new Promise((function(r,o){s.push([t,e,r,o])>1||a(t,e)}))})}function a(t,e){try{!function(t){t.value instanceof h?Promise.resolve(t.value.v).then(u,c):l(s[0][2],t)}(n[t](e))}catch(t){l(s[0][3],t)}}function u(t){a("next",t)}function c(t){a("throw",t)}function l(t,e){t(e),s.shift(),s.length&&a(s[0][0],s[0][1])}}!function(){const t={npm_package_version:"1.6.0"};try{if(process)return process.env=Object.assign({},process.env),void Object.assign(process.env,t)}catch(t){}globalThis.process={env:t}}();class l{constructor(t){this.request=({method:t,path:e,data:r,params:o})=>u(this,void 0,void 0,(function*(){return this.client.request({method:t,path:e,data:r,params:o})})),this.paginatedRequest=({path:t,params:e})=>this.client.paginatedRequest({path:t,params:e}),this.client=t}}class f extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.confirm=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:`${this.path}/${t}/actions/confirm`})})),this.create=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:this.path,data:t})})),this.path="air/payments/payment_intents"}}class p extends Error{constructor({meta:t,errors:e}){super(),this.meta=t,this.errors=e}}class d extends Error{constructor(t){super("Invalid data: "+t),this.name="ValidationError"}}class m extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.list=t=>this.request({method:"GET",path:this.path,params:t}),this.listWithGenerator=()=>this.paginatedRequest({path:this.path}),this.create=t=>u(this,void 0,void 0,(function*(){const{return_offers:e}=t,r=a(t,["return_offers"]);return r.passengers&&r.passengers.forEach((t=>{if(t.loyalty_programme_accounts&&t.loyalty_programme_accounts.length>0&&(!t.given_name||!t.family_name))throw new d("loyalty programme requires family_name and given_name parameters")})),this.request({method:"POST",path:`${this.path}/`,data:r,params:Object.assign({},null!=e&&{return_offers:e})})})),this.path="air/offer_requests"}}class y extends l{constructor(t){super(t),this.get=(t,e)=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`,params:e})})),this.list=t=>{var{offer_request_id:e}=t,r=a(t,["offer_request_id"]);return this.request({method:"GET",path:this.path,params:Object.assign(Object.assign({},r),{offer_request_id:e})})},this.listWithGenerator=t=>{var{offer_request_id:e}=t,r=a(t,["offer_request_id"]);return this.paginatedRequest({path:this.path,params:Object.assign(Object.assign({},r),{offer_request_id:e})})},this.update=(t,e,r)=>u(this,void 0,void 0,(function*(){return this.request(Object.assign({method:"PATCH",path:`${this.path}/${t}/passengers/${e}`},r&&{data:r}))})),this.path="air/offers"}}class b extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.create=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:this.path,data:t})})),this.confirm=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:`${this.path}/${t}/actions/confirm`})})),this.path="air/order_cancellations"}}class g extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.list=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:this.path,params:t})})),this.listWithGenerator=t=>this.paginatedRequest({path:"air/orders",params:t}),this.create=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:this.path,data:t})})),this.update=(t,e)=>u(this,void 0,void 0,(function*(){return this.request({method:"PATCH",path:`${this.path}/${t}`,data:{options:e}})})),this.path="air/orders"}}class v extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.create=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:this.path,data:t})})),this.path="air/order_change_requests"}}class w extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.list=t=>this.request({method:"GET",path:this.path,params:t}),this.listWithGenerator=()=>this.paginatedRequest({path:this.path}),this.path="air/order_change_offers"}}class T extends l{constructor(t){super(t),this.create=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:this.path,data:t})})),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.confirm=(t,e)=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:`${this.path}/${t}/actions/confirm`,data:e})})),this.path="air/order_changes"}}class O extends l{constructor(t){super(t),this.create=t=>u(this,void 0,void 0,(function*(){return this.request({method:"POST",path:this.path,data:t})})),this.path="air/payments"}}class j extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}`,params:t})})),this.path="air/seat_maps"}}var S="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function E(t){if(t.__esModule)return t;var e=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(t).forEach((function(r){var o=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,o.get?o:{enumerable:!0,get:function(){return t[r]}})})),e}var P=E(Object.freeze({__proto__:null,default:function(t,e){return e=e||{},new Promise((function(r,o){var n=new XMLHttpRequest,s=[],i=[],a={},u=function(){return{ok:2==(n.status/100|0),statusText:n.statusText,status:n.status,url:n.responseURL,text:function(){return Promise.resolve(n.responseText)},json:function(){return Promise.resolve(n.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([n.response]))},clone:u,headers:{keys:function(){return s},entries:function(){return i},get:function(t){return a[t.toLowerCase()]},has:function(t){return t.toLowerCase()in a}}}};for(var h in n.open(e.method||"get",t,!0),n.onload=function(){n.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm,(function(t,e,r){s.push(e=e.toLowerCase()),i.push([e,r]),a[e]=a[e]?a[e]+","+r:r})),r(u())},n.onerror=o,n.withCredentials="include"==e.credentials,e.headers)n.setRequestHeader(h,e.headers[h]);n.send(e.body||null)}))}}));const $=t.Readable,q=Symbol("buffer"),x=Symbol("type");class _{constructor(){this[x]="";const t=arguments[0],e=arguments[1],r=[];let o=0;if(t){const e=t,n=Number(e.length);for(let t=0;t<n;t++){const n=e[t];let s;s=n instanceof Buffer?n:ArrayBuffer.isView(n)?Buffer.from(n.buffer,n.byteOffset,n.byteLength):n instanceof ArrayBuffer?Buffer.from(n):n instanceof _?n[q]:Buffer.from("string"==typeof n?n:String(n)),o+=s.length,r.push(s)}}this[q]=Buffer.concat(r);let n=e&&void 0!==e.type&&String(e.type).toLowerCase();n&&!/[^\u0020-\u007E]/.test(n)&&(this[x]=n)}get size(){return this[q].length}get type(){return this[x]}text(){return Promise.resolve(this[q].toString())}arrayBuffer(){const t=this[q],e=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength);return Promise.resolve(e)}stream(){const t=new $;return t._read=function(){},t.push(this[q]),t.push(null),t}toString(){return"[object Blob]"}slice(){const t=this.size,e=arguments[0],r=arguments[1];let o,n;o=void 0===e?0:e<0?Math.max(t+e,0):Math.min(e,t),n=void 0===r?t:r<0?Math.max(t+r,0):Math.min(r,t);const s=Math.max(n-o,0),i=this[q].slice(o,o+s),a=new _([],{type:arguments[2]});return a[q]=i,a}}function B(t,e,r){Error.call(this,t),this.message=t,this.type=e,r&&(this.code=this.errno=r.code),Error.captureStackTrace(this,this.constructor)}let C;Object.defineProperties(_.prototype,{size:{enumerable:!0},type:{enumerable:!0},slice:{enumerable:!0}}),Object.defineProperty(_.prototype,Symbol.toStringTag,{value:"Blob",writable:!1,enumerable:!1,configurable:!0}),B.prototype=Object.create(Error.prototype),B.prototype.constructor=B,B.prototype.name="FetchError";try{C=require("encoding").convert}catch(t){}const R=Symbol("Body internals"),A=t.PassThrough;function k(e){var r=this,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=o.size;let s=void 0===n?0:n;var i=o.timeout;let a=void 0===i?0:i;null==e?e=null:L(e)?e=Buffer.from(e.toString()):z(e)||Buffer.isBuffer(e)||("[object ArrayBuffer]"===Object.prototype.toString.call(e)?e=Buffer.from(e):ArrayBuffer.isView(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):e instanceof t||(e=Buffer.from(String(e)))),this[R]={body:e,disturbed:!1,error:null},this.size=s,this.timeout=a,e instanceof t&&e.on("error",(function(t){const e="AbortError"===t.name?t:new B(`Invalid response body while trying to fetch ${r.url}: ${t.message}`,"system",t);r[R].error=e}))}function G(){var e=this;if(this[R].disturbed)return k.Promise.reject(new TypeError(`body used already for: ${this.url}`));if(this[R].disturbed=!0,this[R].error)return k.Promise.reject(this[R].error);let r=this.body;if(null===r)return k.Promise.resolve(Buffer.alloc(0));if(z(r)&&(r=r.stream()),Buffer.isBuffer(r))return k.Promise.resolve(r);if(!(r instanceof t))return k.Promise.resolve(Buffer.alloc(0));let o=[],n=0,s=!1;return new k.Promise((function(t,i){let a;e.timeout&&(a=setTimeout((function(){s=!0,i(new B(`Response timeout while trying to fetch ${e.url} (over ${e.timeout}ms)`,"body-timeout"))}),e.timeout)),r.on("error",(function(t){"AbortError"===t.name?(s=!0,i(t)):i(new B(`Invalid response body while trying to fetch ${e.url}: ${t.message}`,"system",t))})),r.on("data",(function(t){if(!s&&null!==t){if(e.size&&n+t.length>e.size)return s=!0,void i(new B(`content size at ${e.url} over limit: ${e.size}`,"max-size"));n+=t.length,o.push(t)}})),r.on("end",(function(){if(!s){clearTimeout(a);try{t(Buffer.concat(o,n))}catch(t){i(new B(`Could not create Buffer from response body for ${e.url}: ${t.message}`,"system",t))}}}))}))}function L(t){return"object"==typeof t&&"function"==typeof t.append&&"function"==typeof t.delete&&"function"==typeof t.get&&"function"==typeof t.getAll&&"function"==typeof t.has&&"function"==typeof t.set&&("URLSearchParams"===t.constructor.name||"[object URLSearchParams]"===Object.prototype.toString.call(t)||"function"==typeof t.sort)}function z(t){return"object"==typeof t&&"function"==typeof t.arrayBuffer&&"string"==typeof t.type&&"function"==typeof t.stream&&"function"==typeof t.constructor&&"string"==typeof t.constructor.name&&/^(Blob|File)$/.test(t.constructor.name)&&/^(Blob|File)$/.test(t[Symbol.toStringTag])}function U(e){let r,o,n=e.body;if(e.bodyUsed)throw new Error("cannot clone body after it is used");return n instanceof t&&"function"!=typeof n.getBoundary&&(r=new A,o=new A,n.pipe(r),n.pipe(o),e[R].body=r,n=o),n}function H(e){return null===e?null:"string"==typeof e?"text/plain;charset=UTF-8":L(e)?"application/x-www-form-urlencoded;charset=UTF-8":z(e)?e.type||null:Buffer.isBuffer(e)||"[object ArrayBuffer]"===Object.prototype.toString.call(e)||ArrayBuffer.isView(e)?null:"function"==typeof e.getBoundary?`multipart/form-data;boundary=${e.getBoundary()}`:e instanceof t?null:"text/plain;charset=UTF-8"}function I(t){const e=t.body;return null===e?0:z(e)?e.size:Buffer.isBuffer(e)?e.length:e&&"function"==typeof e.getLengthSync&&(e._lengthRetrievers&&0==e._lengthRetrievers.length||e.hasKnownLength&&e.hasKnownLength())?e.getLengthSync():null}k.prototype={get body(){return this[R].body},get bodyUsed(){return this[R].disturbed},arrayBuffer(){return G.call(this).then((function(t){return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}))},blob(){let t=this.headers&&this.headers.get("content-type")||"";return G.call(this).then((function(e){return Object.assign(new _([],{type:t.toLowerCase()}),{[q]:e})}))},json(){var t=this;return G.call(this).then((function(e){try{return JSON.parse(e.toString())}catch(e){return k.Promise.reject(new B(`invalid json response body at ${t.url} reason: ${e.message}`,"invalid-json"))}}))},text(){return G.call(this).then((function(t){return t.toString()}))},buffer(){return G.call(this)},textConverted(){var t=this;return G.call(this).then((function(e){return function(t,e){if("function"!=typeof C)throw new Error("The package `encoding` must be installed to use the textConverted() function");const r=e.get("content-type");let o,n,s="utf-8";r&&(o=/charset=([^;]*)/i.exec(r));n=t.slice(0,1024).toString(),!o&&n&&(o=/<meta.+?charset=(['"])(.+?)\1/i.exec(n));!o&&n&&(o=/<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(n),o||(o=/<meta[\s]+?content=(['"])(.+?)\1[\s]+?http-equiv=(['"])content-type\3/i.exec(n),o&&o.pop()),o&&(o=/charset=(.*)/i.exec(o.pop())));!o&&n&&(o=/<\?xml.+?encoding=(['"])(.+?)\1/i.exec(n));o&&(s=o.pop(),"gb2312"!==s&&"gbk"!==s||(s="gb18030"));return C(t,"UTF-8",s).toString()}(e,t.headers)}))}},Object.defineProperties(k.prototype,{body:{enumerable:!0},bodyUsed:{enumerable:!0},arrayBuffer:{enumerable:!0},blob:{enumerable:!0},json:{enumerable:!0},text:{enumerable:!0}}),k.mixIn=function(t){for(const e of Object.getOwnPropertyNames(k.prototype))if(!(e in t)){const r=Object.getOwnPropertyDescriptor(k.prototype,e);Object.defineProperty(t,e,r)}},k.Promise=global.Promise;const F=/[^\^_`a-zA-Z\-0-9!#$%&'*+.|~]/,M=/[^\t\x20-\x7e\x80-\xff]/;function D(t){if(t=`${t}`,F.test(t)||""===t)throw new TypeError(`${t} is not a legal HTTP header name`)}function V(t){if(t=`${t}`,M.test(t))throw new TypeError(`${t} is not a legal HTTP header value`)}function N(t,e){e=e.toLowerCase();for(const r in t)if(r.toLowerCase()===e)return r}const W=Symbol("map");class J{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;if(this[W]=Object.create(null),t instanceof J){const e=t.raw(),r=Object.keys(e);for(const t of r)for(const r of e[t])this.append(t,r)}else if(null==t);else{if("object"!=typeof t)throw new TypeError("Provided initializer must be an object");{const e=t[Symbol.iterator];if(null!=e){if("function"!=typeof e)throw new TypeError("Header pairs must be iterable");const r=[];for(const e of t){if("object"!=typeof e||"function"!=typeof e[Symbol.iterator])throw new TypeError("Each header pair must be iterable");r.push(Array.from(e))}for(const t of r){if(2!==t.length)throw new TypeError("Each header pair must be a name/value tuple");this.append(t[0],t[1])}}else for(const e of Object.keys(t)){const r=t[e];this.append(e,r)}}}}get(t){D(t=`${t}`);const e=N(this[W],t);return void 0===e?null:this[W][e].join(", ")}forEach(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,r=Z(this),o=0;for(;o<r.length;){var n=r[o];const s=n[0],i=n[1];t.call(e,i,s,this),r=Z(this),o++}}set(t,e){e=`${e}`,D(t=`${t}`),V(e);const r=N(this[W],t);this[W][void 0!==r?r:t]=[e]}append(t,e){e=`${e}`,D(t=`${t}`),V(e);const r=N(this[W],t);void 0!==r?this[W][r].push(e):this[W][t]=[e]}has(t){return D(t=`${t}`),void 0!==N(this[W],t)}delete(t){D(t=`${t}`);const e=N(this[W],t);void 0!==e&&delete this[W][e]}raw(){return this[W]}keys(){return Y(this,"key")}values(){return Y(this,"value")}[Symbol.iterator](){return Y(this,"key+value")}}function Z(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"key+value";const r=Object.keys(t[W]).sort();return r.map("key"===e?function(t){return t.toLowerCase()}:"value"===e?function(e){return t[W][e].join(", ")}:function(e){return[e.toLowerCase(),t[W][e].join(", ")]})}J.prototype.entries=J.prototype[Symbol.iterator],Object.defineProperty(J.prototype,Symbol.toStringTag,{value:"Headers",writable:!1,enumerable:!1,configurable:!0}),Object.defineProperties(J.prototype,{get:{enumerable:!0},forEach:{enumerable:!0},set:{enumerable:!0},append:{enumerable:!0},has:{enumerable:!0},delete:{enumerable:!0},keys:{enumerable:!0},values:{enumerable:!0},entries:{enumerable:!0}});const K=Symbol("internal");function Y(t,e){const r=Object.create(Q);return r[K]={target:t,kind:e,index:0},r}const Q=Object.setPrototypeOf({next(){if(!this||Object.getPrototypeOf(this)!==Q)throw new TypeError("Value of `this` is not a HeadersIterator");var t=this[K];const e=t.target,r=t.kind,o=t.index,n=Z(e,r);return o>=n.length?{value:void 0,done:!0}:(this[K].index=o+1,{value:n[o],done:!1})}},Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));function X(t){const e=Object.assign({__proto__:null},t[W]),r=N(t[W],"Host");return void 0!==r&&(e[r]=e[r][0]),e}Object.defineProperty(Q,Symbol.toStringTag,{value:"HeadersIterator",writable:!1,enumerable:!1,configurable:!0});const tt=Symbol("Response internals"),et=e.STATUS_CODES;class rt{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};k.call(this,t,e);const r=e.status||200,o=new J(e.headers);if(null!=t&&!o.has("Content-Type")){const e=H(t);e&&o.append("Content-Type",e)}this[tt]={url:e.url,status:r,statusText:e.statusText||et[r],headers:o,counter:e.counter}}get url(){return this[tt].url||""}get status(){return this[tt].status}get ok(){return this[tt].status>=200&&this[tt].status<300}get redirected(){return this[tt].counter>0}get statusText(){return this[tt].statusText}get headers(){return this[tt].headers}clone(){return new rt(U(this),{url:this.url,status:this.status,statusText:this.statusText,headers:this.headers,ok:this.ok,redirected:this.redirected})}}k.mixIn(rt.prototype),Object.defineProperties(rt.prototype,{url:{enumerable:!0},status:{enumerable:!0},ok:{enumerable:!0},redirected:{enumerable:!0},statusText:{enumerable:!0},headers:{enumerable:!0},clone:{enumerable:!0}}),Object.defineProperty(rt.prototype,Symbol.toStringTag,{value:"Response",writable:!1,enumerable:!1,configurable:!0});const ot=Symbol("Request internals"),nt=r.parse,st=r.format,it="destroy"in t.Readable.prototype;function at(t){return"object"==typeof t&&"object"==typeof t[ot]}class ut{constructor(t){let e,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};at(t)?e=nt(t.url):(e=t&&t.href?nt(t.href):nt(`${t}`),t={});let o=r.method||t.method||"GET";if(o=o.toUpperCase(),(null!=r.body||at(t)&&null!==t.body)&&("GET"===o||"HEAD"===o))throw new TypeError("Request with GET/HEAD method cannot have body");let n=null!=r.body?r.body:at(t)&&null!==t.body?U(t):null;k.call(this,n,{timeout:r.timeout||t.timeout||0,size:r.size||t.size||0});const s=new J(r.headers||t.headers||{});if(null!=n&&!s.has("Content-Type")){const t=H(n);t&&s.append("Content-Type",t)}let i=at(t)?t.signal:null;if("signal"in r&&(i=r.signal),null!=i&&!function(t){const e=t&&"object"==typeof t&&Object.getPrototypeOf(t);return!(!e||"AbortSignal"!==e.constructor.name)}(i))throw new TypeError("Expected signal to be an instanceof AbortSignal");this[ot]={method:o,redirect:r.redirect||t.redirect||"follow",headers:s,parsedURL:e,signal:i},this.follow=void 0!==r.follow?r.follow:void 0!==t.follow?t.follow:20,this.compress=void 0!==r.compress?r.compress:void 0===t.compress||t.compress,this.counter=r.counter||t.counter||0,this.agent=r.agent||t.agent}get method(){return this[ot].method}get url(){return st(this[ot].parsedURL)}get headers(){return this[ot].headers}get redirect(){return this[ot].redirect}get signal(){return this[ot].signal}clone(){return new ut(this)}}function ht(t){Error.call(this,t),this.type="aborted",this.message=t,Error.captureStackTrace(this,this.constructor)}k.mixIn(ut.prototype),Object.defineProperty(ut.prototype,Symbol.toStringTag,{value:"Request",writable:!1,enumerable:!1,configurable:!0}),Object.defineProperties(ut.prototype,{method:{enumerable:!0},url:{enumerable:!0},headers:{enumerable:!0},redirect:{enumerable:!0},clone:{enumerable:!0},signal:{enumerable:!0}}),ht.prototype=Object.create(Error.prototype),ht.prototype.constructor=ht,ht.prototype.name="AbortError";const ct=t.PassThrough,lt=r.resolve;function ft(r,o){if(!ft.Promise)throw new Error("native promise missing, set fetch.Promise to your favorite alternative");return k.Promise=ft.Promise,new ft.Promise((function(n,a){const u=new ut(r,o),h=function(e){const r=e[ot].parsedURL,o=new J(e[ot].headers);if(o.has("Accept")||o.set("Accept","*/*"),!r.protocol||!r.hostname)throw new TypeError("Only absolute URLs are supported");if(!/^https?:$/.test(r.protocol))throw new TypeError("Only HTTP(S) protocols are supported");if(e.signal&&e.body instanceof t.Readable&&!it)throw new Error("Cancellation of streamed requests with AbortSignal is not supported in node < 8");let n=null;if(null==e.body&&/^(POST|PUT)$/i.test(e.method)&&(n="0"),null!=e.body){const t=I(e);"number"==typeof t&&(n=String(t))}n&&o.set("Content-Length",n),o.has("User-Agent")||o.set("User-Agent","node-fetch/1.0 (+https://github.com/bitinn/node-fetch)"),e.compress&&!o.has("Accept-Encoding")&&o.set("Accept-Encoding","gzip,deflate");let s=e.agent;return"function"==typeof s&&(s=s(r)),o.has("Connection")||s||o.set("Connection","close"),Object.assign({},r,{method:e.method,headers:X(o),agent:s})}(u),c=("https:"===h.protocol?s:e).request,l=u.signal;let f=null;const p=function(){let e=new ht("The user aborted a request.");a(e),u.body&&u.body instanceof t.Readable&&u.body.destroy(e),f&&f.body&&f.body.emit("error",e)};if(l&&l.aborted)return void p();const d=function(){p(),b()},m=c(h);let y;function b(){m.abort(),l&&l.removeEventListener("abort",d),clearTimeout(y)}l&&l.addEventListener("abort",d),u.timeout&&m.once("socket",(function(t){y=setTimeout((function(){a(new B(`network timeout at: ${u.url}`,"request-timeout")),b()}),u.timeout)})),m.on("error",(function(t){a(new B(`request to ${u.url} failed, reason: ${t.message}`,"system",t)),b()})),m.on("response",(function(t){clearTimeout(y);const e=function(t){const e=new J;for(const r of Object.keys(t))if(!F.test(r))if(Array.isArray(t[r]))for(const o of t[r])M.test(o)||(void 0===e[W][r]?e[W][r]=[o]:e[W][r].push(o));else M.test(t[r])||(e[W][r]=[t[r]]);return e}(t.headers);if(ft.isRedirect(t.statusCode)){const r=e.get("Location"),o=null===r?null:lt(u.url,r);switch(u.redirect){case"error":return a(new B(`uri requested responds with a redirect, redirect mode is set to error: ${u.url}`,"no-redirect")),void b();case"manual":if(null!==o)try{e.set("Location",o)}catch(t){a(t)}break;case"follow":if(null===o)break;if(u.counter>=u.follow)return a(new B(`maximum redirect reached at: ${u.url}`,"max-redirect")),void b();const r={headers:new J(u.headers),follow:u.follow,counter:u.counter+1,agent:u.agent,compress:u.compress,method:u.method,body:u.body,signal:u.signal,timeout:u.timeout,size:u.size};return 303!==t.statusCode&&u.body&&null===I(u)?(a(new B("Cannot follow redirect with body being a readable stream","unsupported-redirect")),void b()):(303!==t.statusCode&&(301!==t.statusCode&&302!==t.statusCode||"POST"!==u.method)||(r.method="GET",r.body=void 0,r.headers.delete("content-length")),n(ft(new ut(o,r))),void b())}}t.once("end",(function(){l&&l.removeEventListener("abort",d)}));let r=t.pipe(new ct);const o={url:u.url,status:t.statusCode,statusText:t.statusMessage,headers:e,size:u.size,timeout:u.timeout,counter:u.counter},s=e.get("Content-Encoding");if(!u.compress||"HEAD"===u.method||null===s||204===t.statusCode||304===t.statusCode)return f=new rt(r,o),void n(f);const h={flush:i.Z_SYNC_FLUSH,finishFlush:i.Z_SYNC_FLUSH};if("gzip"==s||"x-gzip"==s)return r=r.pipe(i.createGunzip(h)),f=new rt(r,o),void n(f);if("deflate"!=s&&"x-deflate"!=s){if("br"==s&&"function"==typeof i.createBrotliDecompress)return r=r.pipe(i.createBrotliDecompress()),f=new rt(r,o),void n(f);f=new rt(r,o),n(f)}else{t.pipe(new ct).once("data",(function(t){r=8==(15&t[0])?r.pipe(i.createInflate()):r.pipe(i.createInflateRaw()),f=new rt(r,o),n(f)}))}})),function(t,e){const r=e.body;null===r?t.end():z(r)?r.stream().pipe(t):Buffer.isBuffer(r)?(t.write(r),t.end()):r.pipe(t)}(m,u)}))}ft.isRedirect=function(t){return 301===t||302===t||303===t||307===t||308===t},ft.Promise=global.Promise;var pt=E(Object.freeze({__proto__:null,default:ft,Headers:J,Request:ut,Response:rt,FetchError:B}));function dt(t){return t&&t.default||t}var mt=S.fetch=S.fetch||("undefined"==typeof process?dt(P):function(t,e){return dt(pt)(String(t).replace(/^\/\//g,"https://"),e)});class yt{constructor({token:t,basePath:e,apiVersion:r,debug:s}){this.request=({method:t,path:e,data:r,params:s,compress:i=!0})=>u(this,void 0,void 0,(function*(){var a;let u,h;const c=new o(e,this.basePath),l={"User-Agent":`Duffel/${this.apiVersion} duffel_api_javascript/${process.env.npm_package_version}`,Accept:"application/json","Accept-Encoding":"gzip","Content-Type":"application/json","Duffel-Version":this.apiVersion,Authorization:`Bearer ${this.token}`};if(s){const t=Object.entries(s).sort().filter((t=>null!==t[0]));c.search=new n(t).toString()}r&&(u=JSON.stringify({data:Object.assign({},r)})),(null===(a=this.debug)||void 0===a?void 0:a.verbose)&&(console.info("Endpoint: ",c.href),console.info("Method: ",t),r&&console.info("Body Parameters: ",r),s&&console.info("Query Parameters: ",s));const f=yield mt(c.href,{method:t,headers:l,body:u,compress:i}),d=f.headers.get("content-type");if(h=d&&d.includes("json")?yield f.json():yield f.text(),!f.ok||"errors"in h&&h.errors)throw new p(h);return h})),this.token=t,this.basePath=e||"https://api.duffel.com",this.apiVersion=r||"beta",this.debug=s}paginatedRequest({path:t,params:e}){return c(this,arguments,(function*(){let r=yield h(this.request({method:"GET",path:t,params:e}));for(const t of r.data)yield yield h({data:t});for(;r.meta&&"after"in r.meta&&r.meta.after;){r=yield h(this.request({method:"GET",path:t,params:{limit:r.meta.limit,after:r.meta.after}}));for(const t of r.data)yield yield h({data:t})}}))}}class bt extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.list=t=>this.request({method:"GET",path:this.path,params:t}),this.listWithGenerator=()=>this.paginatedRequest({path:this.path}),this.path="air/aircraft"}}class gt extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.list=t=>this.request({method:"GET",path:this.path,params:t}),this.listWithGenerator=()=>this.paginatedRequest({path:this.path}),this.path="air/airlines"}}class vt extends l{constructor(t){super(t),this.get=t=>u(this,void 0,void 0,(function*(){return this.request({method:"GET",path:`${this.path}/${t}`})})),this.list=t=>this.request({method:"GET",path:this.path,params:t}),this.listWithGenerator=()=>this.paginatedRequest({path:this.path}),this.path="air/airports"}}class wt{constructor(t){this.client=new yt(t),this.aircraft=new bt(this.client),this.airlines=new gt(this.client),this.airports=new vt(this.client),this.offerRequests=new m(this.client),this.offers=new y(this.client),this.orders=new g(this.client),this.orderChangeRequests=new v(this.client),this.orderChangeOffers=new w(this.client),this.orderChanges=new T(this.client),this.orderCancellations=new b(this.client),this.payments=new O(this.client),this.seatMaps=new j(this.client),this.paymentIntents=new f(this.client)}}export{wt as Duffel};
|
|
2
2
|
//# sourceMappingURL=index.es.js.map
|