UNPKG

sabre-client

Version:
1 lines 24.4 kB
{"version":3,"sources":["../src/index.ts","../src/air/search.ts","../src/air/ticketing.ts","../src/authentication/authentication.ts","../src/booking-management/booking.ts","../src/booking-management/flight-tickets.ts","../package.json","../src/config.ts","../src/errors.ts","../src/trip-management/reservation.ts","../src/sabre.ts"],"sourcesContent":["export { Sabre } from './sabre'\n\nexport * from './booking-management/interfaces'\nexport * from './trip-management/interfaces'\nexport * from './authentication/interfaces'\nexport * from './air/interfaces'","import { Sabre } from \"../sabre\"\nimport { BargainFinderMaxOptions, BargainFinderMaxResponseSuccess, RevalidateItineraryOptions, RevalidateItineraryResponseSuccess } from \"./interfaces\";\n\nexport class Search {\n /**\n * Bargain Finder Max v5\n * \n * Bargain Finder Max (BFM), \n * nuestro producto de búsqueda de tarifas bajas líder en su clase, \n * se utiliza para buscar los itinerarios con los precios más bajos disponibles según una fecha específica.\n * \n * Revalidate Itinerary v5\n * \n * La API Revalidate Itinerary permite volver a consultar la disponibilidad \n * y el precio de una opción de itinerario específica sin tener que reservarla. \n * La solución revalida si la opción de itinerario es válida para la compra. \n * Revalidate Itinerary no admite contenido NDC.\n * \n * @param sabre Sabre Client Reference\n */\n constructor (\n private sabre: Sabre\n ) {}\n\n /**\n * Crear solicitud de Buscador de ofertas Max.\n * \n * payload - El mensaje de solicitud de búsqueda de tarifa baja solicita opciones \n * de itinerario para vuelos entre pares de ciudades específicos, en fechas específicas, \n * para un número y tipo de pasajeros específicos. \n * La información opcional de la solicitud puede incluir: \n * hora/ventana horaria, ciudades de conexión \n * y preferencias del cliente (aerolíneas, cabina, tipo de vuelo, etc.). \n * La solicitud de búsqueda de tarifa baja contiene información similar a \n * la de una búsqueda de tarifa baja en el CRS o GDS de una aerolínea.\n * @param payload BargainFinderMaxOptions \n * @returns {Promise<BargainFinderMaxResponseSuccess>}\n */\n async shop(payload: BargainFinderMaxOptions): Promise<BargainFinderMaxResponseSuccess> {\n const path = \"/v5/offers/shop\";\n return this.sabre.post<BargainFinderMaxResponseSuccess>(path, payload)\n }\n /**\n * Crear solicitud de revalidación de itinerario.\n * \n * payload - El mensaje de solicitud de búsqueda de tarifa baja solicita opciones\n * de itinerario para vuelos entre pares de ciudades específicos, en fechas específicas, \n * para un número y tipo de pasajeros específicos. \n * La información opcional de la solicitud puede incluir: \n * hora/ventana horaria, ciudades de conexión \n * y preferencias del cliente (aerolíneas, cabina, tipo de vuelo, etc.). \n * La solicitud de búsqueda de tarifa baja contiene información similar a \n * la de una búsqueda de tarifa baja en el CRS o GDS de una aerolínea.\n * @param payload RevalidateItineraryOptions\n * @returns {Promise<RevalidateItineraryResponseSuccess>}\n */\n async revalidate(payload: RevalidateItineraryOptions): Promise<RevalidateItineraryResponseSuccess> {\n const path = \"/v5/shop/flights/revalidate\";\n return this.sabre.post<RevalidateItineraryResponseSuccess>(path, payload)\n }\n}","import { Sabre } from \"../sabre\"\nimport { EnhancedAirTicketOptions, EnhancedAirTicketResponseSuccess } from \"./interfaces\";\n\nexport class Ticketing {\n /**\n * Enhanced Air Ticket v1.3.0\n * \n * La API de boletos aéreos mejorados se utiliza para emitir uno o varios boletos aéreos \n * y/o EMD (documentos electrónicos varios) dentro de una sola llamada API.\n * \n * @param sabre Sabre Client Reference\n */\n constructor (\n private sabre: Sabre\n ) {}\n\n /**\n * La API de boletos aéreos mejorados (AirTicketRQ) \n * se utiliza para emitir boletos aéreos y documentos electrónicos varios (EMD) en una sola solicitud.\n * \n * payload - Solicitud de API de boletos aéreos orquestada.\n * @param payload EnhancedAirTicketOptions \n * @returns {Promise<EnhancedAirTicketResponseSuccess>}\n */\n async issue(payload: EnhancedAirTicketOptions): Promise<EnhancedAirTicketResponseSuccess> {\n const path = \"/v1.3.0/air/ticket\";\n return this.sabre.post<EnhancedAirTicketResponseSuccess>(path, payload)\n }\n}","import { Sabre } from \"../sabre\";\nimport { CreateTokenResponseSuccess } from \"./interfaces\";\n\nconst grantType = new URLSearchParams({ 'grant_type': 'client_credentials' }).toString()\n\nexport class Authentication {\n constructor(private readonly sabre: Sabre) {}\n /**\n * OAuth Token Create REST API v2\n * See https://developer.sabre.com/docs/rest_apis/session_management/token_create_api/v2\n * @param payload El tipo de concesión utilizado para obtener el token. Sólo se admiten 'client_credentials'.\n * @returns TokenResponse\n */\n async OAuthTokenV2(\n payload: string = grantType\n ): Promise<CreateTokenResponseSuccess> {\n const data = await this.sabre.auth<CreateTokenResponseSuccess>(\n '/v2/auth/token',\n payload\n );\n this.sabre.setAuthorization(data.access_token)\n return data\n }\n}","import { Sabre } from \"../sabre\"\nimport {\n CancelBookingOptions,\n CancelBookingResponseSuccess,\n CreateBookingOptions,\n CreateBookingResponseSuccess,\n GetBookingOptions,\n GetBookingResponseSuccess,\n ModifyBookingOptions,\n ModifyBookingResponseSuccess,\n} from \"./interfaces\"\n\nexport class Booking {\n /**\n * Booking\n * \n * 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.\n * \n * @param sabre Sabre Client Reference\n */\n constructor (\n private sabre: Sabre\n ) {}\n /**\n * Crea una solicitud que contiene un \"Id. de confirmación\" y un \"apellido\" del viajero para obtener información de la reserva.\n * \n * payload - Contiene elementos tanto obligatorios como opcionales para realizar una solicitud de reserva.\n * @param payload GetBookingOptions\n * @returns {Promise<GetBookingResponseSuccess>}\n */\n get(payload: GetBookingOptions): Promise<GetBookingResponseSuccess>{\n const path = '/v1/trip/orders/getBooking'\n return this.sabre.post<GetBookingResponseSuccess>(path, payload)\n }\n /**\n * Crea una reserva aérea (NDC/ATPCO/LCC).\n * \n * payload - Contiene elementos obligatorios y opcionales para realizar una solicitud de reserva.\n * @param payload CreateBookingOptions\n * @returns {Promise<CreateBookingResponseSuccess>}\n */\n async create(payload: CreateBookingOptions): Promise<CreateBookingResponseSuccess> {\n const path = '/v1/trip/orders/createBooking'\n return this.sabre.post<CreateBookingResponseSuccess>(path, payload)\n }\n /**\n * Crea una lista de elementos de reserva que deben cancelarse.\n * \n * payload - Contiene elementos obligatorios y opcionales para cancelar la totalidad o partes de una reserva.\n * @param payload CancelBookingOptions\n * @returns {Promise<CancelBookingResponseSuccess>}\n */\n async cancel(payload: CancelBookingOptions): Promise<CancelBookingResponseSuccess> {\n const path = '/v1/trip/orders/cancelBooking'\n return this.sabre.post<CancelBookingResponseSuccess>(path, payload)\n }\n /**\n * Crea una lista de elementos de reserva que deben modificarse.\n * \n * payload - Contiene elementos obligatorios y opcionales para modificar datos no relacionados con el itinerario en la reserva existente. \n * @param payload ModifyBookingOptions \n * @returns {Promise<ModifyBookingResponseSuccess>}\n */\n async modify(payload: ModifyBookingOptions): Promise<ModifyBookingResponseSuccess> {\n const path = '/v1/trip/orders/modifyBooking'\n return this.sabre.post<ModifyBookingResponseSuccess>(path, payload)\n }\n\n}","import { Sabre } from \"../sabre\"\nimport {\n CheckTicketsOptions,\n CheckTicketsResponseSuccess,\n FulfillTicketsOptions,\n FulfillTicketsResponseSuccess,\n RefundTicketsOptions,\n RefundTicketsResponseSuccess,\n VoidTicketsOptions,\n VoidTicketsResponseSuccess,\n} from \"./interfaces\"\n\nexport class FlightTickets {\n /**\n * Flight Tickets\n * \n * Los endpoint de Flight Tickets son un conjunto de métodos diseñados para obtener detalles de los billetes y \n * realizar operaciones específicas (anulación/reembolso) sobre ellos.\n * \n * @param sabre Sabre Client Reference\n */\n constructor (\n private sabre: Sabre\n ) {}\n\n /**\n * Procesa tickets proporcionando una solicitud que contiene una lista de números de ticket que se anularán.\n * \n * payload - Contiene elementos obligatorios y opcionales para anular los billetes.\n * @param payload VoidTicketsOptions\n * @returns {Promise<VoidTicketsResponseSuccess>}\n */\n async void(payload: VoidTicketsOptions): Promise<VoidTicketsResponseSuccess> {\n const path = '/v1/trip/orders/voidFlightTickets'\n return this.sabre.post<VoidTicketsResponseSuccess>(path, payload)\n }\n\n /**\n * Procesa los boletos proporcionando una solicitud que contiene una lista de números de boletos que deben reembolsarse. \n * Actualmente, los EMD no son compatibles.\n * \n * payload - Contiene elementos obligatorios y opcionales para el reembolso de los billetes.\n * @param payload RefundTicketsOptions\n * @returns {Promise<RefundTicketsResponseSuccess>}\n */\n async refund(payload: RefundTicketsOptions): Promise<RefundTicketsResponseSuccess> {\n const path = '/v1/trip/orders/refundFlightTickets'\n return this.sabre.post<RefundTicketsResponseSuccess>(path, payload)\n }\n \n /**\n * Procesa tickets proporcionando una solicitud que contiene una lista de números de ticket que se verificarán. \n * Actualmente, los EMD no son compatibles.\n * \n * payload - Contiene elementos obligatorios y opcionales para consultar los tickets.\n * @param payload CheckTicketsOptions\n * @returns {Promise<CheckTicketsResponseSuccess>} CheckTicketsResponse\n */\n async check(payload: CheckTicketsOptions): Promise<CheckTicketsResponseSuccess> {\n const path = '/v1/trip/orders/checkFlightTickets'\n return this.sabre.post<CheckTicketsResponseSuccess>(path, payload)\n }\n\n /**\n * Procesa la emisión de billetes y documentos varios electrónicos (EMD).\n * Actualmente, los EMD no son compatibles.\n * \n * payload - Contiene elementos obligatorios y opcionales para la emisión de billetes.\n * @param payload FulfillTicketsOptions\n * @returns {Promise<FulfillTicketsResponseSuccess>}\n */\n async fulfill(payload: FulfillTicketsOptions): Promise<FulfillTicketsResponseSuccess> {\n const path = '/v1/trip/orders/fulfillFlightTickets'\n return this.sabre.post<FulfillTicketsResponseSuccess>(path, payload)\n }\n}","{\n \"name\": \"sabre-client\",\n \"version\": \"0.2.4\",\n \"description\": \"Sabre Node.js SDK\",\n \"keywords\": [\n \"sabre\",\n \"client\",\n \"devStudio\",\n \"rest\"\n ],\n \"homepage\": \"https://github.com/CarlosIvanSoto/sabre#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/CarlosIvanSoto/sabre/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/CarlosIvanSoto/sabre.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Carlos Ivan Soto <csoto_99@outlook.com>\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist/**\"\n ],\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"prepublishOnly\": \"npm run build\",\n \"test\": \"jest --passWithNoTests\",\n \"test:watch\": \"jest --watch\",\n \"lint\": \"eslint . --ext .ts --report-unused-disable-directives --max-warnings 0\",\n \"type-check\": \"tsc --noEmit\",\n \"example:auth-atk\": \"node --env-file=.env --import=tsx examples/auth-atk.ts\",\n \"example:search-shop\": \"node --env-file=.env --import=tsx examples/search-shop.ts\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.38.0\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/node\": \"^24.8.1\",\n \"eslint\": \"^9.38.0\",\n \"jest\": \"^30.2.0\",\n \"ts-jest\": \"^29.4.5\",\n \"ts-node\": \"^10.9.2\",\n \"tsup\": \"^8.5.0\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.9.3\",\n \"typescript-eslint\": \"^8.46.1\"\n }\n}\n","import { version } from '../package.json';\n\nconst defaultBaseUrl = 'https://api.platform.sabre.com';\nconst defaultUserAgent = `sabre-client-node:${version}`;\nconst defaultConversationId = `sabre.client.node:${version}`\nconst defaultDomain = 'AA'\n\nconst baseUrl =\n typeof process !== 'undefined' && process.env\n ? process.env.SABRE_REST_URL || defaultBaseUrl\n : defaultBaseUrl;\n\nconst userAgent =\n typeof process !== 'undefined' && process.env\n ? process.env.SABRE_USER_AGENT || defaultUserAgent\n : defaultUserAgent;\n\nconst domain =\n typeof process !== 'undefined' && process.env\n ? process.env.SABRE_DOMAIN || defaultDomain\n : defaultDomain;\n\nconst conversationId = \n typeof process !== 'undefined' && process.env\n ? process.env.SABRE_CONVERSATION_ID || defaultConversationId\n : defaultConversationId\n \nexport { baseUrl, userAgent, domain, conversationId };","/**\n * Clase de error personalizada para los errores de la API de Sabre.\n * Extiende la clase Error nativa para proporcionar más contexto.\n */\nexport class SabreError extends Error {\n public readonly details: string;\n public readonly statusCode: number;\n\n constructor(message: string, statusCode: number, details: string) {\n super(message);\n this.name = 'SabreError';\n this.statusCode = statusCode;\n this.details = details;\n }\n}","import { Sabre } from \"../sabre\"\nimport { CreatePassengerNameRecordOptions, CreatePassengerNameRecordResponseSuccess } from \"./interfaces\"\n\nexport class Reservation {\n /**\n * Reservation\n * \n * La API para crear un registro de nombre de pasajero es una API \n * orquestada que integra varias funciones y operaciones en una sola llamada.\n * \n * Esta API permite crear un registro de nombre de pasajero (PNR), \n * incluyendo segmentos aéreos, en una sola llamada.\n * \n * @param sabre Sabre Client Reference\n */\n constructor (\n private sabre: Sabre\n ) {}\n /**\n * Cree una reserva completa de contenido aéreo, hotel y automóvil de alquiler, todo dentro de una sola solicitud.\n * \n * payload - Contiene elementos obligatorios y opcionales para realizar una solicitud de reserva.\n * @param payload CreatePassengerNameRecordOptions\n * @returns {Promise<CreatePassengerNameRecordResponseSuccess>}\n */\n create(payload: CreatePassengerNameRecordOptions): Promise<CreatePassengerNameRecordResponseSuccess> {\n const path = '/v2.5.0/passenger/records?mode=create'\n return this.sabre.post<CreatePassengerNameRecordResponseSuccess>(path, payload)\n }\n\n}","import { Search, Ticketing } from \"./air\";\nimport { Authentication } from \"./authentication/authentication\";\nimport { Booking, FlightTickets } from \"./booking-management\";\nimport { PostOptions } from \"./common/interfaces\";\nimport { baseUrl, conversationId, domain, userAgent } from \"./config\";\nimport { SabreError } from \"./errors\";\nimport { SabreOptions } from \"./interfaces\";\nimport { Reservation } from \"./trip-management/reservation\";\n\nexport class Sabre {\n private readonly headers: Headers;\n private readonly secret: string;\n\n readonly authentication = new Authentication(this)\n readonly booking = new Booking(this)\n readonly flightTickets = new FlightTickets(this)\n readonly search = new Search(this)\n readonly ticketing = new Ticketing(this)\n readonly reservation = new Reservation(this)\n\n constructor(private readonly options: SabreOptions = {}) {\n const processEnv = typeof process !== 'undefined' && process.env\n if (!this.options.username && processEnv)\n this.options.username = processEnv.SABRE_USERNAME\n if (!this.options.password && processEnv)\n this.options.password = processEnv.SABRE_PASSWORD\n if (!this.options.organization && processEnv)\n this.options.organization = processEnv.SABRE_ORGANIZATION\n\n if (!this.options.username || !this.options.password || !this.options.organization) {\n throw new Error(`Missing Sabre authorization. Pass it to the constructor new Sabre({\n username: '773400', \n password: 'PASSWORD_GOES_HERE',\n organization: '7TZA', // pcc\n });})`)\n }\n\n this.headers = new Headers({\n 'User-Agent': userAgent,\n 'Conversation-ID': conversationId\n });\n\n this.secret = this.getSecret()\n }\n\n setAuthorization(token: string): void {\n this.headers.set('Authorization', `Bearer ${token}`)\n this.headers.set('Content-Type', 'application/json')\n }\n\n async fetchRequest<T>(\n path: string,\n options = {},\n ): Promise<T> {\n const response = await fetch(`${baseUrl}${path}`, options);\n \n if (!response.ok) {\n let errorDetails = `Request failed with status ${response.status}`;\n try {\n const jsonError = await response.json() as unknown;\n errorDetails = JSON.stringify(jsonError);\n } catch (e) {\n console.error(e)\n errorDetails = response.statusText;\n }\n throw new SabreError(\n `Request failed with status ${response.status}`, \n response.status, \n errorDetails);\n }\n\n const data = await response.json() as T;\n return data;\n }\n async post<T>(path: string, entity?: unknown, options: PostOptions = {}): Promise<T> {\n const requestOptions = {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify(entity),\n ...options,\n };\n\n return this.fetchRequest<T>(path, requestOptions);\n }\n\n async auth<T>(path: string, entity?: unknown, options: PostOptions = {}): Promise<T> {\n /**\n * La palabra 'basic' seguida de un EPR codificado en base64 \n * como par base64(base64(V1:usuario:grupo:dominio):base64(contraseña)), \n * p.e. basic VmpFNmRYTmxjbWxrT21keWIzVndPbVJ2YldGcGJnPT06TVRJek5EVT0=\n */\n this.headers.set('Authorization', `Basic ${this.secret}`)\n this.headers.set('Content-Type', 'application/x-www-form-urlencoded')\n\n const requestOptions = {\n method: 'POST',\n headers: this.headers,\n body: entity,\n ...options,\n };\n\n return this.fetchRequest<T>(path, requestOptions);\n }\n\n private getSecret(): string {\n if (!this.options.password) throw new Error('Missing Sabre password')\n return btoa(`${this.userID()}:${btoa(this.options.password)}`)\n }\n private userID(): string {\n return btoa(`V1:${this.options.username}:${this.options.organization}:${domain}`)\n }\n}\n"],"mappings":"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","names":[]}