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/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
+ }