@findhotel/sapi 0.23.11 → 0.23.14

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.
@@ -33,6 +33,7 @@ export interface AppConfig {
33
33
  hsoIndex: IndexVariation[];
34
34
  };
35
35
  client: {
36
+ defaultRooms: string;
36
37
  features: Features[];
37
38
  blockedDefaultDates: string[];
38
39
  daysFromNow: number;
@@ -0,0 +1,108 @@
1
+ import { CugDeals, HotelId, HotelOfferEntity, Brand, Currency, DeviceType, RoomId, Meals, Logger } from './types';
2
+ interface V3RateBreakdown {
3
+ base: number;
4
+ hotelFees: number;
5
+ taxes: number;
6
+ }
7
+ interface CancellationPenalty {
8
+ amount: number;
9
+ percent?: number;
10
+ nights?: number;
11
+ currency: string;
12
+ end: string;
13
+ start: string;
14
+ }
15
+ declare type Amenities = Meals & 'internetIncluded';
16
+ declare type OfferTag = 'top_offer' | 'anchor_price' | 'exclusive_cheapest_offer';
17
+ interface SapiResponseOffer {
18
+ accessTier: string;
19
+ availableRooms: number;
20
+ cancellationPenalties: CancellationPenalty[];
21
+ currency: Currency;
22
+ id: string;
23
+ intermediaryProvider: string;
24
+ metadata: {
25
+ feedID: string;
26
+ providerRateType?: string;
27
+ };
28
+ occupancy: string | number | null;
29
+ package: {
30
+ amenities: Amenities[];
31
+ canPayLater: boolean;
32
+ refundable: boolean;
33
+ };
34
+ providerCode: string;
35
+ rate: V3RateBreakdown;
36
+ roomID: RoomId;
37
+ tags: OfferTag[] | null;
38
+ url: string;
39
+ }
40
+ declare type Rooms = Record<RoomId, {
41
+ name: string;
42
+ }>;
43
+ export interface SapiResponseOfferEntity {
44
+ anchorRate: V3RateBreakdown;
45
+ availableOffersCount: number;
46
+ fetchedAllOffers: boolean;
47
+ hasMoreOffers: boolean;
48
+ id: HotelId;
49
+ offers: SapiResponseOffer[];
50
+ rooms: Rooms;
51
+ }
52
+ interface Options {
53
+ brand?: Brand;
54
+ anonymousId: string;
55
+ currency: string;
56
+ countryCode: string;
57
+ language: string;
58
+ includeLocalTaxes?: boolean;
59
+ includeTaxes?: boolean;
60
+ skipBackendAugmentation?: boolean;
61
+ facetsEnabled?: boolean;
62
+ WebSocket?: any;
63
+ sapiCliKey?: string;
64
+ deviceType: DeviceType;
65
+ variations: string[];
66
+ logger: Logger;
67
+ }
68
+ export interface GetOffersParameters {
69
+ anchorHotelId?: HotelId;
70
+ hotelIds?: HotelId[];
71
+ cugDeals?: CugDeals;
72
+ getAllOffers?: boolean;
73
+ originId?: string;
74
+ checkIn: string;
75
+ checkOut: string;
76
+ rooms: string;
77
+ searchId: string;
78
+ filters?: {
79
+ freeCancellation?: boolean;
80
+ };
81
+ preferredRate?: number;
82
+ trafficSource?: string;
83
+ }
84
+ export interface OffersResponse {
85
+ anchorHotelOfferEntity?: HotelOfferEntity;
86
+ hotelOfferEntities?: HotelOfferEntity[];
87
+ }
88
+ export interface OffersClient {
89
+ getOffers: (parameters: GetOffersParameters, onOffersReceived?: (response: OffersResponse) => void) => Promise<OffersResponse>;
90
+ }
91
+ export declare function hasAnchorPrice(price: number, anchorPrice: number): boolean;
92
+ interface MappingContext {
93
+ checkIn: string;
94
+ checkOut: string;
95
+ includeTaxes?: boolean;
96
+ includeLocalTaxes?: boolean;
97
+ }
98
+ export declare function sapiResponseToHotelOfferEntity(offerEntity: SapiResponseOfferEntity, context: MappingContext): HotelOfferEntity;
99
+ interface ApiConfig {
100
+ baseUrl: string;
101
+ endpoints: {
102
+ offers: string;
103
+ };
104
+ }
105
+ export declare function offersClient(config: ApiConfig, options: Options): {
106
+ getOffers: (parameters: GetOffersParameters, onOffersReceived?: ((response: OffersResponse) => void) | undefined) => Promise<OffersResponse>;
107
+ };
108
+ export {};
@@ -1,107 +1,34 @@
1
- import { CugDeals, HotelId, HotelOfferEntity, Brand, Currency, DeviceType, RoomId, Meals, Logger } from './types';
2
- interface V3RateBreakdown {
3
- base: number;
4
- hotelFees: number;
5
- taxes: number;
6
- }
7
- interface CancellationPenalty {
8
- amount: number;
9
- percent?: number;
10
- nights?: number;
11
- currency: string;
12
- end: string;
13
- start: string;
14
- }
15
- declare type Amenities = Meals & 'internetIncluded';
16
- declare type OfferTag = 'top_offer' | 'anchor_price' | 'exclusive_cheapest_offer';
17
- interface SapiResponseOffer {
18
- accessTier: string;
19
- availableRooms: number;
20
- cancellationPenalties: CancellationPenalty[];
21
- currency: Currency;
22
- id: string;
23
- intermediaryProvider: string;
24
- metadata: {
25
- feedID: string;
26
- providerRateType?: string;
27
- };
28
- occupancy: string | number | null;
29
- package: {
30
- amenities: Amenities[];
31
- canPayLater: boolean;
32
- refundable: boolean;
33
- };
34
- providerCode: string;
35
- rate: V3RateBreakdown;
36
- roomID: RoomId;
37
- tags: OfferTag[] | null;
38
- url: string;
39
- }
40
- declare type Rooms = Record<RoomId, {
41
- name: string;
42
- }>;
43
- export interface SapiResponseOfferEntity {
44
- anchorRate: V3RateBreakdown;
45
- availableOffersCount: number;
46
- fetchedAllOffers: boolean;
47
- hasMoreOffers: boolean;
48
- id: HotelId;
49
- offers: SapiResponseOffer[];
50
- rooms: Rooms;
51
- }
52
- interface Options {
53
- brand?: Brand;
54
- anonymousId: string;
55
- currency: string;
56
- countryCode: string;
57
- language: string;
58
- includeLocalTaxes?: boolean;
59
- includeTaxes?: boolean;
60
- skipBackendAugmentation?: boolean;
61
- facetsEnabled?: boolean;
62
- WebSocket?: any;
63
- sapiCliKey?: string;
64
- deviceType: DeviceType;
65
- variations: string[];
66
- logger: Logger;
67
- }
68
- export interface GetOffersParameters {
69
- anchorHotelId?: HotelId;
70
- hotelIds?: HotelId[];
71
- cugDeals?: CugDeals;
72
- getAllOffers?: boolean;
73
- originId?: string;
1
+ import { BaseWithConfig } from '.';
2
+ import { GetOffersParameters } from './offers-client';
3
+ import { HotelId, HotelOfferEntity, CugDeals } from './types';
4
+ import { AppConfig } from './app-config';
5
+ interface OffersParameters {
6
+ hotelId: HotelId;
74
7
  checkIn: string;
75
8
  checkOut: string;
76
9
  rooms: string;
77
- searchId: string;
78
- filters?: {
79
- freeCancellation?: boolean;
80
- };
10
+ searchId?: string;
11
+ cugDeals?: CugDeals;
12
+ isAnchor?: boolean;
13
+ getAllOffers?: boolean;
14
+ originId?: string;
15
+ freeCancellation?: boolean;
81
16
  preferredRate?: number;
82
17
  trafficSource?: string;
83
18
  }
84
- export interface OffersResponse {
85
- anchorHotelOfferEntity?: HotelOfferEntity;
86
- hotelOfferEntities?: HotelOfferEntity[];
87
- }
88
- export interface OffersClient {
89
- getOffers: (parameters: GetOffersParameters, onOffersReceived?: (response: OffersResponse) => void) => Promise<OffersResponse>;
90
- }
91
- interface MappingContext {
92
- checkIn: string;
93
- checkOut: string;
94
- includeTaxes?: boolean;
95
- includeLocalTaxes?: boolean;
96
- }
97
- export declare function sapiResponseToHotelOfferEntity(offerEntity: SapiResponseOfferEntity, context: MappingContext): HotelOfferEntity;
98
- interface ApiConfig {
99
- baseUrl: string;
100
- endpoints: {
101
- offers: string;
102
- };
103
- }
104
- export declare function offers(config: ApiConfig, options: Options): {
105
- getOffers: (parameters: GetOffersParameters, onOffersReceived?: ((response: OffersResponse) => void) | undefined) => Promise<OffersResponse>;
106
- };
19
+ interface Callbacks {
20
+ onStart?: (parameters: GetOffersParameters) => void;
21
+ onOffersReceived?: (response: HotelOfferEntity | undefined) => void;
22
+ onComplete?: (response: HotelOfferEntity | undefined) => void;
23
+ }
24
+ export declare type OffersHandler = (parameters: OffersParameters, callbacks: Callbacks) => Promise<HotelOfferEntity | undefined>;
25
+ export declare function getOffersParameters(parameters: OffersParameters, options: BaseWithConfig['options'], appConfig: AppConfig): GetOffersParameters;
26
+ /**
27
+ * Creates offers function with configuration object
28
+ *
29
+ * @param configuration - Configuration for offers initialisation
30
+ *
31
+ * @returns function for fetching offers
32
+ */
33
+ export declare function offers({ offersClient, options, appConfig }: Pick<BaseWithConfig, 'offersClient' | 'options' | 'appConfig'>): OffersHandler;
107
34
  export {};
@@ -1,6 +1,6 @@
1
1
  import { SearchClient } from 'algoliasearch';
2
2
  import { Except } from 'type-fest';
3
- import { OffersClient } from './offers';
3
+ import { OffersClient } from './offers-client';
4
4
  import { Configs } from './algolia';
5
5
  import { AppConfig, Features } from './app-config';
6
6
  import { ProfileKey, ClientOptions, SapiClient, Language, Logger } from './types';
@@ -6,6 +6,7 @@ export interface RoomsRequestParameters {
6
6
  rooms: string;
7
7
  providerCode?: string;
8
8
  cugDeals?: string;
9
+ clickedOfferId?: string;
9
10
  }
10
11
  export interface RoomsRequestOptions {
11
12
  deviceType: DeviceType;
@@ -6,6 +6,7 @@ import { RoomsHandler } from '../rooms';
6
6
  import { HotelHandler } from '../hotel';
7
7
  import { SuggestHandler } from '../suggest';
8
8
  import { Configs } from '../algolia';
9
+ import { OffersHandler } from '../offers';
9
10
  export declare type ProfileKey = 'findhotel-website' | 'findhotel-website-e2e' | 'findhotel-website-stg' | 'findhotel-website-ci' | 'findhotel-website-dev' | 'findhotel-checkout' | 'findhotel-checkout-e2e' | 'findhotel-checkout-stg';
10
11
  interface Event {
11
12
  name: string;
@@ -19,6 +20,7 @@ export interface SapiClient {
19
20
  search: SearchHandler;
20
21
  suggest: SuggestHandler;
21
22
  hotel: HotelHandler;
23
+ offers: OffersHandler;
22
24
  }
23
25
  /** Options for initializing the Search API client. Persistent within single SAPI instance but may vary for different users */
24
26
  export interface ClientOptions {
@@ -52,7 +52,6 @@ export interface OptionalSearchParameters {
52
52
  cugDeals?: CugDeals;
53
53
  originId?: string;
54
54
  searchId?: string;
55
- useAlternativeRaaKeys?: boolean;
56
55
  skipGeoSearch?: boolean;
57
56
  preferredRate?: number;
58
57
  trafficSource?: string;
@@ -0,0 +1,21 @@
1
+ import { OffersResponse } from '../offers-client';
2
+ import { HotelOfferEntity, Offer } from '../types';
3
+ interface Parameters {
4
+ sortField?: string;
5
+ sortOrder?: string;
6
+ filters?: {
7
+ priceMin?: number;
8
+ priceMax?: number;
9
+ };
10
+ priceBucketWidth?: number;
11
+ priceBucketsCount: number;
12
+ exchangeRate: number;
13
+ variations?: string[];
14
+ }
15
+ export declare function isOfferInPriceRange(offer: Offer, upperBound: number, priceMin?: number, priceMax?: number): boolean;
16
+ export declare function applyPriceFilter(parameters: Parameters, hotelOfferEntity: HotelOfferEntity): HotelOfferEntity;
17
+ export declare function buildOffersResponse(offersResults: OffersResponse, parameters: Parameters): {
18
+ hotelIds: string[];
19
+ hotelOfferEntities: Record<string, HotelOfferEntity>;
20
+ };
21
+ export {};
@@ -7,3 +7,5 @@ export * from './state';
7
7
  export * from './search-id';
8
8
  export * from './regular-price';
9
9
  export * from './remove-empty';
10
+ export * from './sorting-boosts';
11
+ export * from './build-offers-response';
@@ -1,9 +1,9 @@
1
- import { AnonymousId, ApiSearchParameters } from '../types';
1
+ import { AnonymousId, ApiSearchParameters, Country, Currency, Language } from '../types';
2
2
  interface SearchIdOptions {
3
3
  anonymousId: AnonymousId;
4
- language: string;
5
- currency: string;
6
- countryCode: string;
4
+ language: Language;
5
+ currency: Currency;
6
+ countryCode: Country;
7
7
  }
8
8
  /**
9
9
  * Generates a deterministic hash of a combination of ApiSearchParameters and SAPI options.
@@ -0,0 +1,11 @@
1
+ export interface SortingBoostParameters {
2
+ filters?: {
3
+ freeCancellation?: boolean;
4
+ };
5
+ }
6
+ /**
7
+ * Generates sorting boost for offers request
8
+ *
9
+ * @param parameters - SortingBoostParameters
10
+ */
11
+ export declare function generateSortingBoost(parameters: SortingBoostParameters): "freeCancellation=true:100" | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@findhotel/sapi",
3
- "version": "0.23.11",
3
+ "version": "0.23.14",
4
4
  "description": "FindHotel Search API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/types/packages/core/src",
@@ -1,2 +0,0 @@
1
- export * from './raa';
2
- export * from './utils';
@@ -1,45 +0,0 @@
1
- import { CugDeals, HotelId, HotelOfferEntity, Logger } from '../types';
2
- export interface OffersClient {
3
- getOffers: GetOffers;
4
- }
5
- interface RaaOptions {
6
- anonymousId: string;
7
- currency: string;
8
- countryCode: string;
9
- language: string;
10
- includeLocalTaxes?: boolean;
11
- includeTaxes?: boolean;
12
- skipBackendAugmentation?: boolean;
13
- facetsEnabled?: boolean;
14
- WebSocket?: any;
15
- sapiCliKey?: string;
16
- deviceType: string;
17
- variations: string[];
18
- logger: Logger;
19
- }
20
- export interface GetOffersParameters {
21
- anchorHotelId?: HotelId;
22
- hotelIds?: HotelId[];
23
- cugDeals?: CugDeals;
24
- getAllOffers?: boolean;
25
- originId?: string;
26
- useAlternativeRaaKeys?: boolean;
27
- checkIn: string;
28
- checkOut: string;
29
- rooms: string;
30
- searchId: string;
31
- filters?: {
32
- freeCancellation?: boolean;
33
- };
34
- preferredRate?: number;
35
- trafficSource?: string;
36
- }
37
- export interface OffersResponse {
38
- anchorHotelOfferEntity?: HotelOfferEntity;
39
- hotelOfferEntities?: HotelOfferEntity[];
40
- }
41
- declare type GetOffers = (parameters: GetOffersParameters, onOffersReceived?: (response: OffersResponse) => void) => Promise<OffersResponse>;
42
- export declare function raa(raaEndpoint: string, options: RaaOptions): {
43
- getOffers: (parameters: GetOffersParameters, onOffersReceived?: ((response: OffersResponse) => void) | undefined) => Promise<OffersResponse>;
44
- };
45
- export {};
@@ -1,36 +0,0 @@
1
- import { OffersResponse } from './raa';
2
- import { HotelOfferEntity, Offer, TopOfferData, AnchorPriceRateBreakdown } from '../types';
3
- interface Parameters {
4
- sortField?: string;
5
- sortOrder?: string;
6
- filters?: {
7
- priceMin?: number;
8
- priceMax?: number;
9
- };
10
- priceBucketWidth?: number;
11
- priceBucketsCount: number;
12
- exchangeRate: number;
13
- variations?: string[];
14
- }
15
- interface SortingBoostParameters {
16
- filters?: {
17
- freeCancellation?: boolean;
18
- };
19
- }
20
- export declare function generateSortingBoost(parameters: SortingBoostParameters): "freeCancellation=true:100" | undefined;
21
- export declare function isOfferInPriceRange(offer: Offer, upperBound: number, priceMin?: number, priceMax?: number): boolean;
22
- export declare function applyPriceFilter(parameters: Parameters, hotelOfferEntity: HotelOfferEntity): HotelOfferEntity;
23
- interface TopOfferDataWithAnchorPriceParameters {
24
- topOfferData: TopOfferData;
25
- anchorPriceRateBreakdown: AnchorPriceRateBreakdown;
26
- }
27
- export declare function augmentTopOfferDataWithAnchorPrice({ topOfferData, anchorPriceRateBreakdown }: TopOfferDataWithAnchorPriceParameters): TopOfferData;
28
- export declare function augmentOffersWithAnchorPrice({ offers }: {
29
- offers: Offer[];
30
- }, topOfferData: TopOfferData): Offer[];
31
- export declare function augmentHotelOffersWithAnchorPrice(hotelOfferEntity: HotelOfferEntity): HotelOfferEntity;
32
- export declare function augmentRaaResponse(offersResults: OffersResponse, parameters: Parameters): {
33
- hotelIds: string[];
34
- hotelOfferEntities: Record<string, HotelOfferEntity>;
35
- };
36
- export {};