sabre-client 0.1.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/LICENSE +21 -0
- package/README.md +116 -0
- package/dist/index.d.mts +7460 -0
- package/dist/index.d.ts +7460 -0
- package/dist/index.js +257 -0
- package/dist/index.mjs +230 -0
- package/package.json +56 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
Sabre: () => Sabre
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(index_exports);
|
|
26
|
+
|
|
27
|
+
// src/authentication/authentication.ts
|
|
28
|
+
var grantType = new URLSearchParams({ "grant_type": "client_credentials" }).toString();
|
|
29
|
+
var Authentication = class {
|
|
30
|
+
constructor(sabre) {
|
|
31
|
+
this.sabre = sabre;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* V2 AUTH TOKEN
|
|
35
|
+
* See https://developer.sabre.com/docs/rest_apis/session_management/token_create_api/v2
|
|
36
|
+
* @param payload El tipo de concesión utilizado para obtener el token. Sólo se admiten 'client_credentials'.
|
|
37
|
+
* @param options CreateTokenRequestOptions
|
|
38
|
+
* @returns TokenResponse
|
|
39
|
+
*/
|
|
40
|
+
async OAuthTokenV2(payload = grantType, options = {}) {
|
|
41
|
+
const data = await this.sabre.auth(
|
|
42
|
+
"/v2/auth/token",
|
|
43
|
+
payload,
|
|
44
|
+
options
|
|
45
|
+
);
|
|
46
|
+
this.sabre.setAuthorization(data.access_token);
|
|
47
|
+
return data;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// src/booking-management/booking/booking.ts
|
|
52
|
+
var Booking = class {
|
|
53
|
+
/**
|
|
54
|
+
* Booking
|
|
55
|
+
*
|
|
56
|
+
* La API de reservas está diseñada para proporcionar una vista normalizada de una reserva de Sabre combinando el PNR de Sabre y el pedido de Sabre.
|
|
57
|
+
*
|
|
58
|
+
* @param sabre Sabre Client Reference
|
|
59
|
+
*/
|
|
60
|
+
constructor(sabre) {
|
|
61
|
+
this.sabre = sabre;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Crea una solicitud que contiene un "Id. de confirmación" y un "apellido" del viajero para obtener información de la reserva.
|
|
65
|
+
*
|
|
66
|
+
* payload - Contiene elementos tanto obligatorios como opcionales para realizar una solicitud de reserva.
|
|
67
|
+
* @param payload GetBookingOptions
|
|
68
|
+
* @returns GetBookingResponse
|
|
69
|
+
*/
|
|
70
|
+
async get(payload) {
|
|
71
|
+
const path = "/v1/trip/orders/getBooking";
|
|
72
|
+
return this.sabre.post(path, payload);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Crea una reserva aérea (NDC/ATPCO/LCC).
|
|
76
|
+
*
|
|
77
|
+
* payload - Contiene elementos obligatorios y opcionales para realizar una solicitud de reserva.
|
|
78
|
+
* @param payload CreateBookingOptions
|
|
79
|
+
* @returns CreateBookingResponse
|
|
80
|
+
*/
|
|
81
|
+
async create(payload) {
|
|
82
|
+
const path = "/v1/trip/orders/createBooking";
|
|
83
|
+
return this.sabre.post(path, payload);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Crea una lista de elementos de reserva que deben cancelarse.
|
|
87
|
+
*
|
|
88
|
+
* payload - Contiene elementos obligatorios y opcionales para cancelar la totalidad o partes de una reserva.
|
|
89
|
+
* @param payload CancelBookingOptions
|
|
90
|
+
* @returns CancelBookingRequest
|
|
91
|
+
*/
|
|
92
|
+
async cancel(payload) {
|
|
93
|
+
const path = "/v1/trip/orders/cancelBooking";
|
|
94
|
+
return this.sabre.post(path, payload);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Crea una lista de elementos de reserva que deben modificarse.
|
|
98
|
+
*
|
|
99
|
+
* payload - Contiene elementos obligatorios y opcionales para modificar datos no relacionados con el itinerario en la reserva existente.
|
|
100
|
+
* @param payload ModifyBookingOptions
|
|
101
|
+
* @returns ModifyBookingResponse
|
|
102
|
+
*/
|
|
103
|
+
async modify(payload) {
|
|
104
|
+
const path = "/v1/trip/orders/modifyBooking";
|
|
105
|
+
return this.sabre.post(path, payload);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// src/booking-management/flight-tickets/flight-tickets.ts
|
|
110
|
+
var FlightTickets = class {
|
|
111
|
+
/**
|
|
112
|
+
* Flight Tickets
|
|
113
|
+
*
|
|
114
|
+
* Los endpoint de Flight Tickets son un conjunto de métodos diseñados para obtener detalles de los billetes y
|
|
115
|
+
* realizar operaciones específicas (anulación/reembolso) sobre ellos.
|
|
116
|
+
*
|
|
117
|
+
* @param sabre Sabre Client Reference
|
|
118
|
+
*/
|
|
119
|
+
constructor(sabre) {
|
|
120
|
+
this.sabre = sabre;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Procesa tickets proporcionando una solicitud que contiene una lista de números de ticket que se anularán.
|
|
124
|
+
*
|
|
125
|
+
* payload - Contiene elementos obligatorios y opcionales para anular los billetes.
|
|
126
|
+
* @param payload VoidTicketsOptions
|
|
127
|
+
* @returns VoidTicketsResponse
|
|
128
|
+
*/
|
|
129
|
+
async void(payload) {
|
|
130
|
+
const path = "/v1/trip/orders/voidFlightTickets";
|
|
131
|
+
return this.sabre.post(path, payload);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Procesa los boletos proporcionando una solicitud que contiene una lista de números de boletos que deben reembolsarse.
|
|
135
|
+
* Actualmente, los EMD no son compatibles.
|
|
136
|
+
*
|
|
137
|
+
* payload - Contiene elementos obligatorios y opcionales para el reembolso de los billetes.
|
|
138
|
+
* @param payload RefundTicketsOptions
|
|
139
|
+
* @returns RefundTicketsResponse
|
|
140
|
+
*/
|
|
141
|
+
async refund(payload) {
|
|
142
|
+
const path = "/v1/trip/orders/refundFlightTickets";
|
|
143
|
+
return this.sabre.post(path, payload);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Procesa tickets proporcionando una solicitud que contiene una lista de números de ticket que se verificarán.
|
|
147
|
+
* Actualmente, los EMD no son compatibles.
|
|
148
|
+
*
|
|
149
|
+
* payload - Contiene elementos obligatorios y opcionales para consultar los tickets.
|
|
150
|
+
* @param payload CheckTicketsOptions
|
|
151
|
+
* @returns CheckTicketsResponse
|
|
152
|
+
*/
|
|
153
|
+
async check(payload) {
|
|
154
|
+
const path = "/v1/trip/orders/checkFlightTickets";
|
|
155
|
+
return this.sabre.post(path, payload);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Procesa tickets proporcionando una solicitud que contiene una lista de números de ticket que se verificarán.
|
|
159
|
+
* Actualmente, los EMD no son compatibles.
|
|
160
|
+
*
|
|
161
|
+
* payload - Contiene elementos obligatorios y opcionales para consultar los tickets.
|
|
162
|
+
* @param payload CheckTicketsOptions
|
|
163
|
+
* @returns CheckTicketsResponse
|
|
164
|
+
*/
|
|
165
|
+
async fulfill(payload) {
|
|
166
|
+
const path = "/v1/trip/orders/fulfillFlightTickets";
|
|
167
|
+
return this.sabre.post(path, payload);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
// package.json
|
|
172
|
+
var version = "0.1.0";
|
|
173
|
+
|
|
174
|
+
// src/config.ts
|
|
175
|
+
var defaultBaseUrl = "https://api.platform.sabre.com";
|
|
176
|
+
var defaultUserAgent = `sabre-client-node:${version}`;
|
|
177
|
+
var defaultConversationId = `sabre.client.node:${version}`;
|
|
178
|
+
var defaultDomain = "AA";
|
|
179
|
+
var baseUrl = typeof process !== "undefined" && process.env ? process.env.SABRE_REST_URL || defaultBaseUrl : defaultBaseUrl;
|
|
180
|
+
var userAgent = typeof process !== "undefined" && process.env ? process.env.SABRE_USER_AGENT || defaultUserAgent : defaultUserAgent;
|
|
181
|
+
var domain = typeof process !== "undefined" && process.env ? process.env.SABRE_DOMAIN || defaultDomain : defaultDomain;
|
|
182
|
+
var conversationId = typeof process !== "undefined" && process.env ? process.env.SABRE_CONVERSATION_ID || defaultConversationId : defaultConversationId;
|
|
183
|
+
|
|
184
|
+
// src/sabre.ts
|
|
185
|
+
var Sabre = class {
|
|
186
|
+
constructor(options = {}) {
|
|
187
|
+
this.options = options;
|
|
188
|
+
const processEnv = typeof process !== "undefined" && process.env;
|
|
189
|
+
if (!this.options.username && processEnv)
|
|
190
|
+
this.options.username = processEnv.SABRE_USERNAME;
|
|
191
|
+
if (!this.options.password && processEnv)
|
|
192
|
+
this.options.password = processEnv.SABRE_PASSWORD;
|
|
193
|
+
if (!this.options.organization && processEnv)
|
|
194
|
+
this.options.organization = processEnv.SABRE_ORGANIZATION;
|
|
195
|
+
if (!this.options.username || !this.options.password || !this.options.organization) {
|
|
196
|
+
throw new Error(`Missing Sabre authorization. Pass it to the constructor new Sabre({
|
|
197
|
+
username: '773400',
|
|
198
|
+
password: 'PASSWORD_GOES_HERE',
|
|
199
|
+
organization: '7TZA', // pcc
|
|
200
|
+
});})`);
|
|
201
|
+
}
|
|
202
|
+
this.headers = new Headers({
|
|
203
|
+
"User-Agent": userAgent,
|
|
204
|
+
"Conversation-ID": conversationId
|
|
205
|
+
});
|
|
206
|
+
this.secret = this.getSecret();
|
|
207
|
+
}
|
|
208
|
+
headers;
|
|
209
|
+
secret;
|
|
210
|
+
authentication = new Authentication(this);
|
|
211
|
+
booking = new Booking(this);
|
|
212
|
+
flightTickets = new FlightTickets(this);
|
|
213
|
+
setAuthorization(token) {
|
|
214
|
+
this.headers.set("Authorization", `Bearer ${token}`);
|
|
215
|
+
this.headers.set("Content-Type", "application/json");
|
|
216
|
+
}
|
|
217
|
+
async fetchRequest(path, options = {}) {
|
|
218
|
+
const response = await fetch(`${baseUrl}${path}`, options);
|
|
219
|
+
if (!response.ok) {
|
|
220
|
+
const error = await response.json();
|
|
221
|
+
throw new Error(JSON.stringify(error));
|
|
222
|
+
}
|
|
223
|
+
const data = await response.json();
|
|
224
|
+
return data;
|
|
225
|
+
}
|
|
226
|
+
async post(path, entity, options = {}) {
|
|
227
|
+
const requestOptions = {
|
|
228
|
+
method: "POST",
|
|
229
|
+
headers: this.headers,
|
|
230
|
+
body: JSON.stringify(entity),
|
|
231
|
+
...options
|
|
232
|
+
};
|
|
233
|
+
return this.fetchRequest(path, requestOptions);
|
|
234
|
+
}
|
|
235
|
+
async auth(path, entity, options = {}) {
|
|
236
|
+
this.headers.set("Authorization", `Basic ${this.secret}`);
|
|
237
|
+
this.headers.set("Content-Type", "application/x-www-form-urlencoded");
|
|
238
|
+
const requestOptions = {
|
|
239
|
+
method: "POST",
|
|
240
|
+
headers: this.headers,
|
|
241
|
+
body: entity,
|
|
242
|
+
...options
|
|
243
|
+
};
|
|
244
|
+
return this.fetchRequest(path, requestOptions);
|
|
245
|
+
}
|
|
246
|
+
getSecret() {
|
|
247
|
+
if (!this.options.password) throw new Error("Missing Sabre password");
|
|
248
|
+
return btoa(`${this.userID()}:${btoa(this.options.password)}`);
|
|
249
|
+
}
|
|
250
|
+
userID() {
|
|
251
|
+
return btoa(`V1:${this.options.username}:${this.options.organization}:${domain}`);
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
255
|
+
0 && (module.exports = {
|
|
256
|
+
Sabre
|
|
257
|
+
});
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// src/authentication/authentication.ts
|
|
2
|
+
var grantType = new URLSearchParams({ "grant_type": "client_credentials" }).toString();
|
|
3
|
+
var Authentication = class {
|
|
4
|
+
constructor(sabre) {
|
|
5
|
+
this.sabre = sabre;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* V2 AUTH TOKEN
|
|
9
|
+
* See https://developer.sabre.com/docs/rest_apis/session_management/token_create_api/v2
|
|
10
|
+
* @param payload El tipo de concesión utilizado para obtener el token. Sólo se admiten 'client_credentials'.
|
|
11
|
+
* @param options CreateTokenRequestOptions
|
|
12
|
+
* @returns TokenResponse
|
|
13
|
+
*/
|
|
14
|
+
async OAuthTokenV2(payload = grantType, options = {}) {
|
|
15
|
+
const data = await this.sabre.auth(
|
|
16
|
+
"/v2/auth/token",
|
|
17
|
+
payload,
|
|
18
|
+
options
|
|
19
|
+
);
|
|
20
|
+
this.sabre.setAuthorization(data.access_token);
|
|
21
|
+
return data;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// src/booking-management/booking/booking.ts
|
|
26
|
+
var Booking = class {
|
|
27
|
+
/**
|
|
28
|
+
* Booking
|
|
29
|
+
*
|
|
30
|
+
* La API de reservas está diseñada para proporcionar una vista normalizada de una reserva de Sabre combinando el PNR de Sabre y el pedido de Sabre.
|
|
31
|
+
*
|
|
32
|
+
* @param sabre Sabre Client Reference
|
|
33
|
+
*/
|
|
34
|
+
constructor(sabre) {
|
|
35
|
+
this.sabre = sabre;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Crea una solicitud que contiene un "Id. de confirmación" y un "apellido" del viajero para obtener información de la reserva.
|
|
39
|
+
*
|
|
40
|
+
* payload - Contiene elementos tanto obligatorios como opcionales para realizar una solicitud de reserva.
|
|
41
|
+
* @param payload GetBookingOptions
|
|
42
|
+
* @returns GetBookingResponse
|
|
43
|
+
*/
|
|
44
|
+
async get(payload) {
|
|
45
|
+
const path = "/v1/trip/orders/getBooking";
|
|
46
|
+
return this.sabre.post(path, payload);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Crea una reserva aérea (NDC/ATPCO/LCC).
|
|
50
|
+
*
|
|
51
|
+
* payload - Contiene elementos obligatorios y opcionales para realizar una solicitud de reserva.
|
|
52
|
+
* @param payload CreateBookingOptions
|
|
53
|
+
* @returns CreateBookingResponse
|
|
54
|
+
*/
|
|
55
|
+
async create(payload) {
|
|
56
|
+
const path = "/v1/trip/orders/createBooking";
|
|
57
|
+
return this.sabre.post(path, payload);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Crea una lista de elementos de reserva que deben cancelarse.
|
|
61
|
+
*
|
|
62
|
+
* payload - Contiene elementos obligatorios y opcionales para cancelar la totalidad o partes de una reserva.
|
|
63
|
+
* @param payload CancelBookingOptions
|
|
64
|
+
* @returns CancelBookingRequest
|
|
65
|
+
*/
|
|
66
|
+
async cancel(payload) {
|
|
67
|
+
const path = "/v1/trip/orders/cancelBooking";
|
|
68
|
+
return this.sabre.post(path, payload);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Crea una lista de elementos de reserva que deben modificarse.
|
|
72
|
+
*
|
|
73
|
+
* payload - Contiene elementos obligatorios y opcionales para modificar datos no relacionados con el itinerario en la reserva existente.
|
|
74
|
+
* @param payload ModifyBookingOptions
|
|
75
|
+
* @returns ModifyBookingResponse
|
|
76
|
+
*/
|
|
77
|
+
async modify(payload) {
|
|
78
|
+
const path = "/v1/trip/orders/modifyBooking";
|
|
79
|
+
return this.sabre.post(path, payload);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// src/booking-management/flight-tickets/flight-tickets.ts
|
|
84
|
+
var FlightTickets = class {
|
|
85
|
+
/**
|
|
86
|
+
* Flight Tickets
|
|
87
|
+
*
|
|
88
|
+
* Los endpoint de Flight Tickets son un conjunto de métodos diseñados para obtener detalles de los billetes y
|
|
89
|
+
* realizar operaciones específicas (anulación/reembolso) sobre ellos.
|
|
90
|
+
*
|
|
91
|
+
* @param sabre Sabre Client Reference
|
|
92
|
+
*/
|
|
93
|
+
constructor(sabre) {
|
|
94
|
+
this.sabre = sabre;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Procesa tickets proporcionando una solicitud que contiene una lista de números de ticket que se anularán.
|
|
98
|
+
*
|
|
99
|
+
* payload - Contiene elementos obligatorios y opcionales para anular los billetes.
|
|
100
|
+
* @param payload VoidTicketsOptions
|
|
101
|
+
* @returns VoidTicketsResponse
|
|
102
|
+
*/
|
|
103
|
+
async void(payload) {
|
|
104
|
+
const path = "/v1/trip/orders/voidFlightTickets";
|
|
105
|
+
return this.sabre.post(path, payload);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Procesa los boletos proporcionando una solicitud que contiene una lista de números de boletos que deben reembolsarse.
|
|
109
|
+
* Actualmente, los EMD no son compatibles.
|
|
110
|
+
*
|
|
111
|
+
* payload - Contiene elementos obligatorios y opcionales para el reembolso de los billetes.
|
|
112
|
+
* @param payload RefundTicketsOptions
|
|
113
|
+
* @returns RefundTicketsResponse
|
|
114
|
+
*/
|
|
115
|
+
async refund(payload) {
|
|
116
|
+
const path = "/v1/trip/orders/refundFlightTickets";
|
|
117
|
+
return this.sabre.post(path, payload);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Procesa tickets proporcionando una solicitud que contiene una lista de números de ticket que se verificarán.
|
|
121
|
+
* Actualmente, los EMD no son compatibles.
|
|
122
|
+
*
|
|
123
|
+
* payload - Contiene elementos obligatorios y opcionales para consultar los tickets.
|
|
124
|
+
* @param payload CheckTicketsOptions
|
|
125
|
+
* @returns CheckTicketsResponse
|
|
126
|
+
*/
|
|
127
|
+
async check(payload) {
|
|
128
|
+
const path = "/v1/trip/orders/checkFlightTickets";
|
|
129
|
+
return this.sabre.post(path, payload);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Procesa tickets proporcionando una solicitud que contiene una lista de números de ticket que se verificarán.
|
|
133
|
+
* Actualmente, los EMD no son compatibles.
|
|
134
|
+
*
|
|
135
|
+
* payload - Contiene elementos obligatorios y opcionales para consultar los tickets.
|
|
136
|
+
* @param payload CheckTicketsOptions
|
|
137
|
+
* @returns CheckTicketsResponse
|
|
138
|
+
*/
|
|
139
|
+
async fulfill(payload) {
|
|
140
|
+
const path = "/v1/trip/orders/fulfillFlightTickets";
|
|
141
|
+
return this.sabre.post(path, payload);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
// package.json
|
|
146
|
+
var version = "0.1.0";
|
|
147
|
+
|
|
148
|
+
// src/config.ts
|
|
149
|
+
var defaultBaseUrl = "https://api.platform.sabre.com";
|
|
150
|
+
var defaultUserAgent = `sabre-client-node:${version}`;
|
|
151
|
+
var defaultConversationId = `sabre.client.node:${version}`;
|
|
152
|
+
var defaultDomain = "AA";
|
|
153
|
+
var baseUrl = typeof process !== "undefined" && process.env ? process.env.SABRE_REST_URL || defaultBaseUrl : defaultBaseUrl;
|
|
154
|
+
var userAgent = typeof process !== "undefined" && process.env ? process.env.SABRE_USER_AGENT || defaultUserAgent : defaultUserAgent;
|
|
155
|
+
var domain = typeof process !== "undefined" && process.env ? process.env.SABRE_DOMAIN || defaultDomain : defaultDomain;
|
|
156
|
+
var conversationId = typeof process !== "undefined" && process.env ? process.env.SABRE_CONVERSATION_ID || defaultConversationId : defaultConversationId;
|
|
157
|
+
|
|
158
|
+
// src/sabre.ts
|
|
159
|
+
var Sabre = class {
|
|
160
|
+
constructor(options = {}) {
|
|
161
|
+
this.options = options;
|
|
162
|
+
const processEnv = typeof process !== "undefined" && process.env;
|
|
163
|
+
if (!this.options.username && processEnv)
|
|
164
|
+
this.options.username = processEnv.SABRE_USERNAME;
|
|
165
|
+
if (!this.options.password && processEnv)
|
|
166
|
+
this.options.password = processEnv.SABRE_PASSWORD;
|
|
167
|
+
if (!this.options.organization && processEnv)
|
|
168
|
+
this.options.organization = processEnv.SABRE_ORGANIZATION;
|
|
169
|
+
if (!this.options.username || !this.options.password || !this.options.organization) {
|
|
170
|
+
throw new Error(`Missing Sabre authorization. Pass it to the constructor new Sabre({
|
|
171
|
+
username: '773400',
|
|
172
|
+
password: 'PASSWORD_GOES_HERE',
|
|
173
|
+
organization: '7TZA', // pcc
|
|
174
|
+
});})`);
|
|
175
|
+
}
|
|
176
|
+
this.headers = new Headers({
|
|
177
|
+
"User-Agent": userAgent,
|
|
178
|
+
"Conversation-ID": conversationId
|
|
179
|
+
});
|
|
180
|
+
this.secret = this.getSecret();
|
|
181
|
+
}
|
|
182
|
+
headers;
|
|
183
|
+
secret;
|
|
184
|
+
authentication = new Authentication(this);
|
|
185
|
+
booking = new Booking(this);
|
|
186
|
+
flightTickets = new FlightTickets(this);
|
|
187
|
+
setAuthorization(token) {
|
|
188
|
+
this.headers.set("Authorization", `Bearer ${token}`);
|
|
189
|
+
this.headers.set("Content-Type", "application/json");
|
|
190
|
+
}
|
|
191
|
+
async fetchRequest(path, options = {}) {
|
|
192
|
+
const response = await fetch(`${baseUrl}${path}`, options);
|
|
193
|
+
if (!response.ok) {
|
|
194
|
+
const error = await response.json();
|
|
195
|
+
throw new Error(JSON.stringify(error));
|
|
196
|
+
}
|
|
197
|
+
const data = await response.json();
|
|
198
|
+
return data;
|
|
199
|
+
}
|
|
200
|
+
async post(path, entity, options = {}) {
|
|
201
|
+
const requestOptions = {
|
|
202
|
+
method: "POST",
|
|
203
|
+
headers: this.headers,
|
|
204
|
+
body: JSON.stringify(entity),
|
|
205
|
+
...options
|
|
206
|
+
};
|
|
207
|
+
return this.fetchRequest(path, requestOptions);
|
|
208
|
+
}
|
|
209
|
+
async auth(path, entity, options = {}) {
|
|
210
|
+
this.headers.set("Authorization", `Basic ${this.secret}`);
|
|
211
|
+
this.headers.set("Content-Type", "application/x-www-form-urlencoded");
|
|
212
|
+
const requestOptions = {
|
|
213
|
+
method: "POST",
|
|
214
|
+
headers: this.headers,
|
|
215
|
+
body: entity,
|
|
216
|
+
...options
|
|
217
|
+
};
|
|
218
|
+
return this.fetchRequest(path, requestOptions);
|
|
219
|
+
}
|
|
220
|
+
getSecret() {
|
|
221
|
+
if (!this.options.password) throw new Error("Missing Sabre password");
|
|
222
|
+
return btoa(`${this.userID()}:${btoa(this.options.password)}`);
|
|
223
|
+
}
|
|
224
|
+
userID() {
|
|
225
|
+
return btoa(`V1:${this.options.username}:${this.options.organization}:${domain}`);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
export {
|
|
229
|
+
Sabre
|
|
230
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sabre-client",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Sabre Node.js SDK",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"sabre",
|
|
7
|
+
"client",
|
|
8
|
+
"devStudio",
|
|
9
|
+
"rest"
|
|
10
|
+
],
|
|
11
|
+
"homepage": "https://github.com/CarlosIvanSoto/sabre#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/CarlosIvanSoto/sabre/issues"
|
|
14
|
+
},
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/CarlosIvanSoto/sabre.git"
|
|
18
|
+
},
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"author": "Carlos Ivan Soto <csoto_99@outlook.com>",
|
|
21
|
+
"main": "./dist/index.js",
|
|
22
|
+
"module": "./dist/index.mjs",
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"files": [
|
|
25
|
+
"dist/**"
|
|
26
|
+
],
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"import": {
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"default": "./dist/index.mjs"
|
|
32
|
+
},
|
|
33
|
+
"require": {
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"default": "./dist/index.js"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsup src/index.ts --format esm,cjs --dts",
|
|
41
|
+
"test": "jest --passWithNoTests",
|
|
42
|
+
"test:watch": "jest --watch"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@eslint/js": "^9.21.0",
|
|
46
|
+
"@types/jest": "^29.5.14",
|
|
47
|
+
"@types/node": "^22.13.3",
|
|
48
|
+
"eslint": "^9.22.0",
|
|
49
|
+
"jest": "^29.7.0",
|
|
50
|
+
"ts-jest": "^29.2.5",
|
|
51
|
+
"ts-node": "^10.9.2",
|
|
52
|
+
"tsup": "^8.4.0",
|
|
53
|
+
"typescript": "^5.7.3",
|
|
54
|
+
"typescript-eslint": "^8.25.0"
|
|
55
|
+
}
|
|
56
|
+
}
|