@athoscommerce/snap-client 1.0.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.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +261 -0
  3. package/dist/cjs/Client/Client.d.ts +29 -0
  4. package/dist/cjs/Client/Client.d.ts.map +1 -0
  5. package/dist/cjs/Client/Client.js +278 -0
  6. package/dist/cjs/Client/NetworkCache/NetworkCache.d.ts +12 -0
  7. package/dist/cjs/Client/NetworkCache/NetworkCache.d.ts.map +1 -0
  8. package/dist/cjs/Client/NetworkCache/NetworkCache.js +198 -0
  9. package/dist/cjs/Client/apis/Abstract.d.ts +60 -0
  10. package/dist/cjs/Client/apis/Abstract.d.ts.map +1 -0
  11. package/dist/cjs/Client/apis/Abstract.js +297 -0
  12. package/dist/cjs/Client/apis/Meta.d.ts +8 -0
  13. package/dist/cjs/Client/apis/Meta.d.ts.map +1 -0
  14. package/dist/cjs/Client/apis/Meta.js +102 -0
  15. package/dist/cjs/Client/apis/Recommend.d.ts +15 -0
  16. package/dist/cjs/Client/apis/Recommend.d.ts.map +1 -0
  17. package/dist/cjs/Client/apis/Recommend.js +276 -0
  18. package/dist/cjs/Client/apis/Search.d.ts +12 -0
  19. package/dist/cjs/Client/apis/Search.d.ts.map +1 -0
  20. package/dist/cjs/Client/apis/Search.js +137 -0
  21. package/dist/cjs/Client/apis/Suggest.d.ts +9 -0
  22. package/dist/cjs/Client/apis/Suggest.d.ts.map +1 -0
  23. package/dist/cjs/Client/apis/Suggest.js +145 -0
  24. package/dist/cjs/Client/apis/index.d.ts +6 -0
  25. package/dist/cjs/Client/apis/index.d.ts.map +1 -0
  26. package/dist/cjs/Client/apis/index.js +21 -0
  27. package/dist/cjs/Client/transforms/index.d.ts +5 -0
  28. package/dist/cjs/Client/transforms/index.d.ts.map +1 -0
  29. package/dist/cjs/Client/transforms/index.js +20 -0
  30. package/dist/cjs/Client/transforms/recommendationFiltersPost.d.ts +3 -0
  31. package/dist/cjs/Client/transforms/recommendationFiltersPost.d.ts.map +1 -0
  32. package/dist/cjs/Client/transforms/recommendationFiltersPost.js +63 -0
  33. package/dist/cjs/Client/transforms/searchRequest.d.ts +49 -0
  34. package/dist/cjs/Client/transforms/searchRequest.d.ts.map +1 -0
  35. package/dist/cjs/Client/transforms/searchRequest.js +169 -0
  36. package/dist/cjs/Client/transforms/searchResponse.d.ts +146 -0
  37. package/dist/cjs/Client/transforms/searchResponse.d.ts.map +1 -0
  38. package/dist/cjs/Client/transforms/searchResponse.js +296 -0
  39. package/dist/cjs/Client/transforms/suggestResponse.d.ts +18 -0
  40. package/dist/cjs/Client/transforms/suggestResponse.d.ts.map +1 -0
  41. package/dist/cjs/Client/transforms/suggestResponse.js +30 -0
  42. package/dist/cjs/Client/utils/fibonacci.d.ts +2 -0
  43. package/dist/cjs/Client/utils/fibonacci.d.ts.map +1 -0
  44. package/dist/cjs/Client/utils/fibonacci.js +14 -0
  45. package/dist/cjs/Client/utils/index.d.ts +2 -0
  46. package/dist/cjs/Client/utils/index.d.ts.map +1 -0
  47. package/dist/cjs/Client/utils/index.js +17 -0
  48. package/dist/cjs/Client/utils/mergeParams.d.ts +2 -0
  49. package/dist/cjs/Client/utils/mergeParams.d.ts.map +1 -0
  50. package/dist/cjs/Client/utils/mergeParams.js +27 -0
  51. package/dist/cjs/index.d.ts +3 -0
  52. package/dist/cjs/index.d.ts.map +1 -0
  53. package/dist/cjs/index.js +17 -0
  54. package/dist/cjs/types.d.ts +212 -0
  55. package/dist/cjs/types.d.ts.map +1 -0
  56. package/dist/cjs/types.js +2 -0
  57. package/dist/esm/Client/Client.d.ts +29 -0
  58. package/dist/esm/Client/Client.d.ts.map +1 -0
  59. package/dist/esm/Client/Client.js +157 -0
  60. package/dist/esm/Client/NetworkCache/NetworkCache.d.ts +12 -0
  61. package/dist/esm/Client/NetworkCache/NetworkCache.d.ts.map +1 -0
  62. package/dist/esm/Client/NetworkCache/NetworkCache.js +168 -0
  63. package/dist/esm/Client/apis/Abstract.d.ts +60 -0
  64. package/dist/esm/Client/apis/Abstract.d.ts.map +1 -0
  65. package/dist/esm/Client/apis/Abstract.js +165 -0
  66. package/dist/esm/Client/apis/Meta.d.ts +8 -0
  67. package/dist/esm/Client/apis/Meta.d.ts.map +1 -0
  68. package/dist/esm/Client/apis/Meta.js +23 -0
  69. package/dist/esm/Client/apis/Recommend.d.ts +15 -0
  70. package/dist/esm/Client/apis/Recommend.d.ts.map +1 -0
  71. package/dist/esm/Client/apis/Recommend.js +172 -0
  72. package/dist/esm/Client/apis/Search.d.ts +12 -0
  73. package/dist/esm/Client/apis/Search.d.ts.map +1 -0
  74. package/dist/esm/Client/apis/Search.js +41 -0
  75. package/dist/esm/Client/apis/Suggest.d.ts +9 -0
  76. package/dist/esm/Client/apis/Suggest.d.ts.map +1 -0
  77. package/dist/esm/Client/apis/Suggest.js +45 -0
  78. package/dist/esm/Client/apis/index.d.ts +6 -0
  79. package/dist/esm/Client/apis/index.d.ts.map +1 -0
  80. package/dist/esm/Client/apis/index.js +5 -0
  81. package/dist/esm/Client/transforms/index.d.ts +5 -0
  82. package/dist/esm/Client/transforms/index.d.ts.map +1 -0
  83. package/dist/esm/Client/transforms/index.js +4 -0
  84. package/dist/esm/Client/transforms/recommendationFiltersPost.d.ts +3 -0
  85. package/dist/esm/Client/transforms/recommendationFiltersPost.d.ts.map +1 -0
  86. package/dist/esm/Client/transforms/recommendationFiltersPost.js +59 -0
  87. package/dist/esm/Client/transforms/searchRequest.d.ts +49 -0
  88. package/dist/esm/Client/transforms/searchRequest.d.ts.map +1 -0
  89. package/dist/esm/Client/transforms/searchRequest.js +152 -0
  90. package/dist/esm/Client/transforms/searchResponse.d.ts +146 -0
  91. package/dist/esm/Client/transforms/searchResponse.d.ts.map +1 -0
  92. package/dist/esm/Client/transforms/searchResponse.js +284 -0
  93. package/dist/esm/Client/transforms/suggestResponse.d.ts +18 -0
  94. package/dist/esm/Client/transforms/suggestResponse.d.ts.map +1 -0
  95. package/dist/esm/Client/transforms/suggestResponse.js +26 -0
  96. package/dist/esm/Client/utils/fibonacci.d.ts +2 -0
  97. package/dist/esm/Client/utils/fibonacci.d.ts.map +1 -0
  98. package/dist/esm/Client/utils/fibonacci.js +10 -0
  99. package/dist/esm/Client/utils/index.d.ts +2 -0
  100. package/dist/esm/Client/utils/index.d.ts.map +1 -0
  101. package/dist/esm/Client/utils/index.js +1 -0
  102. package/dist/esm/Client/utils/mergeParams.d.ts +2 -0
  103. package/dist/esm/Client/utils/mergeParams.d.ts.map +1 -0
  104. package/dist/esm/Client/utils/mergeParams.js +20 -0
  105. package/dist/esm/index.d.ts +3 -0
  106. package/dist/esm/index.d.ts.map +1 -0
  107. package/dist/esm/index.js +1 -0
  108. package/dist/esm/types.d.ts +212 -0
  109. package/dist/esm/types.d.ts.map +1 -0
  110. package/dist/esm/types.js +1 -0
  111. package/package.json +31 -0
@@ -0,0 +1,15 @@
1
+ import { API } from './Abstract';
2
+ import { RecommendRequesterPaths } from '../../types';
3
+ import { ProfileRequestModel, ProfileResponseModel, RecommendResponseModel, RecommendRequestModel, RecommendPostRequestModel } from '../../types';
4
+ export declare class RecommendAPI extends API<RecommendRequesterPaths> {
5
+ private batches;
6
+ getProfile(queryParameters: ProfileRequestModel): Promise<ProfileResponseModel>;
7
+ batchRecommendations(parameters: RecommendRequestModel): Promise<RecommendResponseModel>;
8
+ postRecommendations(requestParameters: RecommendPostRequestModel): Promise<RecommendResponseModel[]>;
9
+ }
10
+ type DefinedProps = {
11
+ [key: string]: any;
12
+ };
13
+ export declare function defined(properties: Record<string, any>): DefinedProps;
14
+ export {};
15
+ //# sourceMappingURL=Recommend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Recommend.d.ts","sourceRoot":"","sources":["../../../../src/Client/apis/Recommend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAiD,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAGrG,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAsBlJ,qBAAa,YAAa,SAAQ,GAAG,CAAC,uBAAuB,CAAC;IAC7D,OAAO,CAAC,OAAO,CAMR;IAED,UAAU,CAAC,eAAe,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgB/E,oBAAoB,CAAC,UAAU,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAuHxF,mBAAmB,CAAC,iBAAiB,EAAE,yBAAyB,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;CAiB1G;AA2BD,KAAK,YAAY,GAAG;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB,CAAC;AAEF,wBAAgB,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,YAAY,CAUrE"}
@@ -0,0 +1,172 @@
1
+ import { API } from './Abstract';
2
+ import { AppMode } from '@athoscommerce/snap-toolbox';
3
+ import { transformRecommendationFiltersPost } from '../transforms';
4
+ import { DEVELOPMENT_MODE_PARAM } from './Search';
5
+ class Deferred {
6
+ constructor() {
7
+ this.promise = new Promise((resolve, reject) => {
8
+ this.reject = reject;
9
+ this.resolve = resolve;
10
+ });
11
+ }
12
+ }
13
+ const BATCH_TIMEOUT = 150;
14
+ export class RecommendAPI extends API {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.batches = {};
18
+ }
19
+ async getProfile(queryParameters) {
20
+ const headerParameters = {};
21
+ const response = await this.request({
22
+ path: this.configuration.paths.profile || '/v1/profile',
23
+ method: 'GET',
24
+ headers: headerParameters,
25
+ query: queryParameters,
26
+ }, JSON.stringify(queryParameters));
27
+ return response;
28
+ }
29
+ async batchRecommendations(parameters) {
30
+ const batchId = parameters.batchId || 1;
31
+ // set up batch key and deferred promises
32
+ const key = parameters.batched ? `${parameters.profile?.siteId || parameters.siteId}:${batchId}` : `${Math.random()}:${batchId}`;
33
+ const batch = (this.batches[key] = this.batches[key] || { timeout: null, request: { profiles: [] }, entries: [] });
34
+ const deferred = new Deferred();
35
+ // add each request to the list
36
+ batch.entries.push({ request: parameters, deferred: deferred });
37
+ // wait for all of the requests to come in
38
+ const timeoutClear = typeof window !== 'undefined' ? window.clearTimeout : clearTimeout;
39
+ const timeoutSet = typeof window !== 'undefined' ? window.setTimeout : setTimeout;
40
+ timeoutClear && timeoutClear(batch.timeout);
41
+ batch.timeout = timeoutSet(async () => {
42
+ // delete the batch so a new one can take its place
43
+ delete this.batches[key];
44
+ // resort batch entries based on order
45
+ batch.entries.sort(sortBatchEntries);
46
+ // now that the requests are in proper order, map through them and build out the batches
47
+ batch.entries.map((entry) => {
48
+ // use products request only and combine when needed
49
+ if (entry.request.product) {
50
+ if (Array.isArray(entry.request.products) && entry.request.products.indexOf(entry.request.product) == -1) {
51
+ entry.request.products = entry.request.products.concat(entry.request.product);
52
+ }
53
+ else {
54
+ entry.request.products = [entry.request.product];
55
+ }
56
+ }
57
+ // build profile specific parameters
58
+ if (entry.request.profile) {
59
+ const { tag, profile: { categories, brands, blockedItems, limit, query, filters, dedupe }, } = entry.request;
60
+ const profile = {
61
+ tag,
62
+ ...defined({
63
+ categories,
64
+ brands,
65
+ blockedItems,
66
+ limit: limit,
67
+ searchTerm: query,
68
+ filters: transformRecommendationFiltersPost(filters),
69
+ dedupe,
70
+ }),
71
+ };
72
+ batch.request.profiles?.push(profile);
73
+ }
74
+ else {
75
+ const { tag, categories, brands, limit, query, dedupe } = entry.request;
76
+ const profile = {
77
+ tag,
78
+ ...defined({
79
+ categories,
80
+ brands,
81
+ limit: limit,
82
+ searchTerm: query,
83
+ dedupe,
84
+ }),
85
+ };
86
+ batch.request.profiles?.push(profile);
87
+ }
88
+ // parameters used globally
89
+ const { products, blockedItems, filters, test, cart, lastViewed, shopper } = entry.request;
90
+ // merge and de-dupe global array fields
91
+ const dedupedProducts = Array.from(new Set((batch.request.products || []).concat(products || [])));
92
+ const dedupedBlockedItems = Array.from(new Set((batch.request.blockedItems || []).concat(blockedItems || [])));
93
+ const dedupedFilters = Array.from(new Set((batch.request.filters || []).concat(transformRecommendationFiltersPost(filters) || []).map((filter) => JSON.stringify(filter)))).map((stringyFilter) => JSON.parse(stringyFilter));
94
+ batch.request = {
95
+ ...batch.request,
96
+ ...defined({
97
+ siteId: entry.request.profile?.siteId || entry.request.siteId,
98
+ products: dedupedProducts.length ? dedupedProducts : undefined,
99
+ blockedItems: dedupedBlockedItems.length ? dedupedBlockedItems : undefined,
100
+ filters: dedupedFilters.length ? dedupedFilters : undefined,
101
+ test,
102
+ cart,
103
+ lastViewed,
104
+ shopper,
105
+ }),
106
+ };
107
+ if (this.configuration.mode == AppMode.development) {
108
+ batch.request[DEVELOPMENT_MODE_PARAM] = true;
109
+ }
110
+ });
111
+ try {
112
+ if (this.configuration.mode == AppMode.development) {
113
+ batch.request.test = true;
114
+ }
115
+ const response = await this.postRecommendations(batch.request);
116
+ batch.entries?.forEach((entry, index) => {
117
+ entry.deferred.resolve(response[index]);
118
+ });
119
+ }
120
+ catch (err) {
121
+ batch.entries?.forEach((entry) => {
122
+ entry.deferred.reject(err);
123
+ });
124
+ }
125
+ }, BATCH_TIMEOUT);
126
+ return deferred.promise;
127
+ }
128
+ async postRecommendations(requestParameters) {
129
+ const headerParameters = {};
130
+ headerParameters['Content-Type'] = 'text/plain';
131
+ const response = await this.request({
132
+ path: this.configuration.paths.recommend || '/v1/recommend',
133
+ method: 'POST',
134
+ headers: headerParameters,
135
+ body: requestParameters,
136
+ subDomain: 'p13n',
137
+ }, JSON.stringify(requestParameters));
138
+ return response;
139
+ }
140
+ }
141
+ function sortBatchEntries(a, b) {
142
+ const one = a.request;
143
+ const two = b.request;
144
+ const orderOne = one.order || one.profile?.order;
145
+ const orderTwo = two.order || two.profile?.order;
146
+ // undefined order goes last
147
+ if (orderOne == undefined && orderTwo == undefined) {
148
+ return 0;
149
+ }
150
+ if (orderOne == undefined && orderTwo != undefined) {
151
+ return 1;
152
+ }
153
+ if (orderTwo == undefined && orderOne != undefined) {
154
+ return -1;
155
+ }
156
+ if (orderOne < orderTwo) {
157
+ return -1;
158
+ }
159
+ if (orderOne > orderTwo) {
160
+ return 1;
161
+ }
162
+ return 0;
163
+ }
164
+ export function defined(properties) {
165
+ const definedProps = {};
166
+ Object.keys(properties).map((key) => {
167
+ if (properties[key] !== undefined) {
168
+ definedProps[key] = properties[key];
169
+ }
170
+ });
171
+ return definedProps;
172
+ }
@@ -0,0 +1,12 @@
1
+ import { AutocompleteRequestModel, AutocompleteResponseModel, SearchRequestModel, SearchResponseModel } from '@athoscommerce/snapi-types';
2
+ import { API } from '.';
3
+ import { SearchRequesterPaths } from '../../types';
4
+ export declare const DEVELOPMENT_MODE_PARAM = "test";
5
+ export declare class SearchAPI extends API<SearchRequesterPaths> {
6
+ private getEndpoint;
7
+ getAutocomplete(queryParameters: AutocompleteRequestModel): Promise<AutocompleteResponseModel>;
8
+ getSearch(queryParameters: SearchRequestModel): Promise<SearchResponseModel>;
9
+ getCategory(queryParameters: SearchRequestModel): Promise<SearchResponseModel>;
10
+ getFinder(queryParameters: SearchRequestModel): Promise<SearchResponseModel>;
11
+ }
12
+ //# sourceMappingURL=Search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Search.d.ts","sourceRoot":"","sources":["../../../../src/Client/apis/Search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAE1I,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAKnD,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAE7C,qBAAa,SAAU,SAAQ,GAAG,CAAC,oBAAoB,CAAC;YACzC,WAAW;IA8BZ,eAAe,CAAC,eAAe,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAI9F,SAAS,CAAC,eAAe,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI5E,WAAW,CAAC,eAAe,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI9E,SAAS,CAAC,eAAe,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAGzF"}
@@ -0,0 +1,41 @@
1
+ import { API } from '.';
2
+ import { AppMode } from '@athoscommerce/snap-toolbox';
3
+ import { transformSearchResponse } from '../transforms/searchResponse';
4
+ import { transformSearchRequest } from '../transforms';
5
+ export const DEVELOPMENT_MODE_PARAM = 'test';
6
+ export class SearchAPI extends API {
7
+ async getEndpoint(requestParameters, path) {
8
+ const searchRequestParameters = transformSearchRequest(requestParameters);
9
+ searchRequestParameters.ajaxCatalog = this.configuration.initiator;
10
+ searchRequestParameters.resultsFormat = 'native';
11
+ if (this.configuration.mode == AppMode.development) {
12
+ searchRequestParameters[DEVELOPMENT_MODE_PARAM] = true;
13
+ }
14
+ // remove pageLoadId from cache key query params
15
+ const cacheParameters = { ...searchRequestParameters };
16
+ delete cacheParameters.pageLoadId;
17
+ delete cacheParameters.domain;
18
+ // autocomplete only params
19
+ delete cacheParameters.input;
20
+ delete cacheParameters.redirectResponse;
21
+ const searchResponse = await this.request({
22
+ path,
23
+ method: 'GET',
24
+ headers: {},
25
+ query: searchRequestParameters,
26
+ }, JSON.stringify(cacheParameters));
27
+ return transformSearchResponse(searchResponse, requestParameters);
28
+ }
29
+ async getAutocomplete(queryParameters) {
30
+ return this.getEndpoint(queryParameters, this.configuration.paths.autocomplete || '/v1/autocomplete');
31
+ }
32
+ async getSearch(queryParameters) {
33
+ return this.getEndpoint(queryParameters, this.configuration.paths.search || '/v1/search');
34
+ }
35
+ async getCategory(queryParameters) {
36
+ return this.getEndpoint(queryParameters, this.configuration.paths.category || '/v1/category');
37
+ }
38
+ async getFinder(queryParameters) {
39
+ return this.getEndpoint(queryParameters, this.configuration.paths.finder || '/v1/finder');
40
+ }
41
+ }
@@ -0,0 +1,9 @@
1
+ import { API } from './Abstract';
2
+ import { SuggestRequesterPaths, SuggestRequestModel, SuggestResponseModel, TrendingRequestModel, TrendingResponseModel } from '../../types';
3
+ export declare class SuggestAPI extends API<SuggestRequesterPaths> {
4
+ getSuggest(queryParameters: SuggestRequestModel): Promise<SuggestResponseModel>;
5
+ postSuggest(requestParameters: SuggestRequestModel): Promise<SuggestResponseModel>;
6
+ getTrending(queryParameters: TrendingRequestModel): Promise<TrendingResponseModel>;
7
+ postTrending(requestParameters: TrendingRequestModel): Promise<TrendingResponseModel>;
8
+ }
9
+ //# sourceMappingURL=Suggest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Suggest.d.ts","sourceRoot":"","sources":["../../../../src/Client/apis/Suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAEN,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,MAAM,aAAa,CAAC;AAErB,qBAAa,UAAW,SAAQ,GAAG,CAAC,qBAAqB,CAAC;IACnD,UAAU,CAAC,eAAe,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgB/E,WAAW,CAAC,iBAAiB,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiBlF,WAAW,CAAC,eAAe,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAgBlF,YAAY,CAAC,iBAAiB,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAgB3F"}
@@ -0,0 +1,45 @@
1
+ import { API } from './Abstract';
2
+ export class SuggestAPI extends API {
3
+ async getSuggest(queryParameters) {
4
+ const headerParameters = {};
5
+ const response = await this.request({
6
+ path: this.configuration.paths.suggest || '/v1/suggest',
7
+ method: 'GET',
8
+ headers: headerParameters,
9
+ query: queryParameters,
10
+ }, JSON.stringify(queryParameters));
11
+ return response;
12
+ }
13
+ async postSuggest(requestParameters) {
14
+ const headerParameters = {};
15
+ headerParameters['Content-Type'] = 'application/json';
16
+ const response = await this.request({
17
+ path: this.configuration.paths.suggest || '/v1/suggest',
18
+ method: 'POST',
19
+ headers: headerParameters,
20
+ body: requestParameters,
21
+ }, JSON.stringify(requestParameters));
22
+ return response;
23
+ }
24
+ async getTrending(queryParameters) {
25
+ const headerParameters = {};
26
+ const response = await this.request({
27
+ path: this.configuration.paths.trending || '/v1/trending',
28
+ method: 'GET',
29
+ headers: headerParameters,
30
+ query: queryParameters,
31
+ }, JSON.stringify(queryParameters));
32
+ return response;
33
+ }
34
+ async postTrending(requestParameters) {
35
+ const headerParameters = {};
36
+ headerParameters['Content-Type'] = 'application/json';
37
+ const response = await this.request({
38
+ path: this.configuration.paths.trending || '/v1/trending',
39
+ method: 'POST',
40
+ headers: headerParameters,
41
+ body: requestParameters,
42
+ }, JSON.stringify(requestParameters));
43
+ return response;
44
+ }
45
+ }
@@ -0,0 +1,6 @@
1
+ export * from './Abstract';
2
+ export * from './Search';
3
+ export * from './Recommend';
4
+ export * from './Suggest';
5
+ export * from './Meta';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Client/apis/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './Abstract';
2
+ export * from './Search';
3
+ export * from './Recommend';
4
+ export * from './Suggest';
5
+ export * from './Meta';
@@ -0,0 +1,5 @@
1
+ export * from './searchRequest';
2
+ export * from './searchResponse';
3
+ export * from './suggestResponse';
4
+ export * from './recommendationFiltersPost';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Client/transforms/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './searchRequest';
2
+ export * from './searchResponse';
3
+ export * from './suggestResponse';
4
+ export * from './recommendationFiltersPost';
@@ -0,0 +1,3 @@
1
+ import { RecommendationRequestFilterModel, RecommendPostRequestFiltersModel } from '../../types';
2
+ export declare const transformRecommendationFiltersPost: (filters?: RecommendationRequestFilterModel[]) => RecommendPostRequestFiltersModel[] | undefined;
3
+ //# sourceMappingURL=recommendationFiltersPost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommendationFiltersPost.d.ts","sourceRoot":"","sources":["../../../../src/Client/transforms/recommendationFiltersPost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAEjG,eAAO,MAAM,kCAAkC,aAAc,gCAAgC,EAAE,mDA0D9F,CAAC"}
@@ -0,0 +1,59 @@
1
+ export const transformRecommendationFiltersPost = (filters) => {
2
+ if (!filters)
3
+ return;
4
+ const filterArray = [];
5
+ filters.map((filter) => {
6
+ if (filter.type == 'value') {
7
+ //check if filterArray contains a filter for this value already
8
+ const i = filterArray.findIndex((_filter) => _filter.field == filter.field);
9
+ if (i > -1) {
10
+ //if so just push another value to the already existing obj
11
+ filterArray[i].values.push(filter.value);
12
+ }
13
+ else {
14
+ //else create a new one
15
+ const val = {
16
+ field: filter.field,
17
+ type: '=',
18
+ values: [filter.value],
19
+ };
20
+ filterArray.push(val);
21
+ }
22
+ }
23
+ else if (filter.type == 'range') {
24
+ //low
25
+ if (typeof filter.value.low == 'number') {
26
+ const low = {
27
+ field: filter.field,
28
+ type: '>=',
29
+ values: [filter.value.low],
30
+ };
31
+ //dedupe
32
+ const i = filterArray.findIndex((_filter) => _filter.field == filter.field && _filter.type == '>=');
33
+ if (i > -1) {
34
+ filterArray[i] = low;
35
+ }
36
+ else {
37
+ filterArray.push(low);
38
+ }
39
+ }
40
+ //high
41
+ if (typeof filter.value.high == 'number') {
42
+ const high = {
43
+ field: filter.field,
44
+ type: '<=',
45
+ values: [filter.value.high],
46
+ };
47
+ //dedupe
48
+ const i = filterArray.findIndex((_filter) => _filter.field == filter.field && _filter.type == '<=');
49
+ if (i > -1) {
50
+ filterArray[i] = high;
51
+ }
52
+ else {
53
+ filterArray.push(high);
54
+ }
55
+ }
56
+ }
57
+ });
58
+ return filterArray;
59
+ };
@@ -0,0 +1,49 @@
1
+ import { SearchRequestModel, SearchRequestModelSortsDirectionEnum, SearchRequestModelFilterRangeAllOfValue, AutocompleteRequestModel } from '@athoscommerce/snapi-types';
2
+ export declare function transformSearchRequest(request: SearchRequestModel | AutocompleteRequestModel): any;
3
+ export declare namespace transformSearchRequest {
4
+ var sorts: (request?: SearchRequestModel | AutocompleteRequestModel) => Record<string, SearchRequestModelSortsDirectionEnum[]>;
5
+ var search: (request?: SearchRequestModel | AutocompleteRequestModel) => {
6
+ q?: string;
7
+ rq?: string;
8
+ originalQuery?: string;
9
+ fallbackQuery?: string;
10
+ redirectResponse?: string;
11
+ source?: string;
12
+ input?: string;
13
+ };
14
+ var filters: (request?: SearchRequestModel | AutocompleteRequestModel) => Record<string, (string | number | SearchRequestModelFilterRangeAllOfValue | undefined)[]>;
15
+ var merchandising: (request?: SearchRequestModel | AutocompleteRequestModel) => {
16
+ disableMerchandising?: boolean;
17
+ tag?: string[];
18
+ 'landing-page'?: string;
19
+ intellisuggest?: boolean;
20
+ disableInlineBanners?: boolean;
21
+ };
22
+ var pagination: (request?: SearchRequestModel | AutocompleteRequestModel) => {
23
+ page?: number;
24
+ resultsPerPage?: number;
25
+ };
26
+ var siteId: (request?: SearchRequestModel | AutocompleteRequestModel) => {
27
+ siteId: string;
28
+ } | {
29
+ siteId?: undefined;
30
+ };
31
+ var facets: (request?: SearchRequestModel | AutocompleteRequestModel) => {
32
+ includedFacets?: string[];
33
+ excludedFacets?: string[];
34
+ disableFacetDrillDown?: boolean;
35
+ };
36
+ var tracking: (request?: SearchRequestModel | AutocompleteRequestModel) => {
37
+ userId?: string;
38
+ domain?: string;
39
+ sessionId?: string;
40
+ pageLoadId?: string;
41
+ };
42
+ var personalization: (request?: SearchRequestModel | AutocompleteRequestModel) => {
43
+ skipPersonalization?: boolean;
44
+ cart?: string;
45
+ shopper?: string;
46
+ lastViewed?: string;
47
+ };
48
+ }
49
+ //# sourceMappingURL=searchRequest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchRequest.d.ts","sourceRoot":"","sources":["../../../../src/Client/transforms/searchRequest.ts"],"names":[],"mappings":"AACA,OAAO,EACN,kBAAkB,EAIlB,oCAAoC,EACpC,uCAAuC,EACvC,wBAAwB,EAExB,MAAM,4BAA4B,CAAC;AAEpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,wBAAwB,GAAG,GAAG,CAclG;yBAde,sBAAsB;0BAgBG,kBAAkB,GAAG,wBAAwB;2BAa5C,kBAAkB,GAAG,wBAAwB;YAGjF,MAAM;aACL,MAAM;wBACK,MAAM;wBACN,MAAM;2BACH,MAAM;iBAChB,MAAM;gBACP,MAAM;;4BAoC2B,kBAAkB,GAAG,wBAAwB;kCAmCvC,kBAAkB,GAAG,wBAAwB;+BAIrE,OAAO;cACxB,MAAM,EAAE;yBACG,MAAM;yBACN,OAAO;+BACD,OAAO;;+BAoBc,kBAAkB,GAAG,wBAAwB;eAGlF,MAAM;yBACI,MAAM;;2BAciB,kBAAkB,GAAG,wBAAwB;;;;;2BAQ7C,kBAAkB,GAAG,wBAAwB;yBAGpE,MAAM,EAAE;yBACR,MAAM,EAAE;gCACD,OAAO;;6BAsBW,kBAAkB,GAAG,wBAAwB;iBAG9E,MAAM;iBACN,MAAM;oBACH,MAAM;qBACL,MAAM;;oCAmB8B,kBAAkB,GAAG,wBAAwB;8BAGxE,OAAO;eACtB,MAAM;kBACH,MAAM;qBACH,MAAM"}
@@ -0,0 +1,152 @@
1
+ import { mergeParams } from '../utils';
2
+ export function transformSearchRequest(request) {
3
+ const data = mergeParams(transformSearchRequest.sorts(request), transformSearchRequest.search(request), transformSearchRequest.filters(request), transformSearchRequest.merchandising(request), transformSearchRequest.pagination(request), transformSearchRequest.siteId(request), transformSearchRequest.facets(request), transformSearchRequest.tracking(request), transformSearchRequest.personalization(request));
4
+ return data;
5
+ }
6
+ transformSearchRequest.sorts = (request = {}) => {
7
+ return (request.sorts || []).reduce((acc, sort) => {
8
+ if (!sort.field || !sort.direction || (sort.direction != 'asc' && sort.direction != 'desc')) {
9
+ return acc;
10
+ }
11
+ return {
12
+ ...acc,
13
+ ['sort.' + sort.field]: (acc[sort.field] || []).concat([sort.direction]),
14
+ };
15
+ }, {});
16
+ };
17
+ transformSearchRequest.search = (request = {}) => {
18
+ const reqSearch = request.search || {};
19
+ const search = {};
20
+ if (reqSearch.query && reqSearch.query.string) {
21
+ search.q = reqSearch.query.string;
22
+ }
23
+ if (reqSearch.subQuery) {
24
+ search.rq = reqSearch.subQuery.trim();
25
+ }
26
+ if (reqSearch.originalQuery) {
27
+ search.originalQuery = reqSearch.originalQuery.trim();
28
+ }
29
+ if (reqSearch.fallbackQuery) {
30
+ search.fallbackQuery = reqSearch.fallbackQuery.trim();
31
+ }
32
+ if (reqSearch.redirectResponse) {
33
+ search.redirectResponse = reqSearch.redirectResponse;
34
+ }
35
+ // for autocomplete only
36
+ if (reqSearch.source) {
37
+ search.source = reqSearch.source;
38
+ }
39
+ // for autocomplete only
40
+ if (reqSearch.input) {
41
+ search.input = reqSearch.input;
42
+ }
43
+ return search;
44
+ };
45
+ transformSearchRequest.filters = (request = {}) => {
46
+ return (request.filters || []).reduce((acc, filter) => {
47
+ const baseKey = filter.background ? 'bgfilter' : 'filter';
48
+ if (filter.type == 'value') {
49
+ const key = baseKey + '.' + filter.field;
50
+ return {
51
+ ...acc,
52
+ [key]: (acc[key] || []).concat([filter.value]),
53
+ };
54
+ }
55
+ else if (filter.type == 'range') {
56
+ const keyLow = baseKey + '.' + filter.field + '.low';
57
+ const keyHigh = baseKey + '.' + filter.field + '.high';
58
+ const low = filter?.value?.low ?? '*';
59
+ const high = filter?.value?.high ?? '*';
60
+ return {
61
+ ...acc,
62
+ [keyLow]: (acc[keyLow] || []).concat([low]),
63
+ [keyHigh]: (acc[keyHigh] || []).concat([high]),
64
+ };
65
+ }
66
+ return acc;
67
+ }, {});
68
+ };
69
+ transformSearchRequest.merchandising = (request = {}) => {
70
+ const reqMerch = request.merchandising || {};
71
+ const merch = reqMerch.disabled ? { disableMerchandising: true } : {};
72
+ if (reqMerch.landingPage) {
73
+ merch['landing-page'] = reqMerch.landingPage;
74
+ }
75
+ if (reqMerch.segments instanceof Array && reqMerch.segments.length) {
76
+ merch['tag'] = reqMerch.segments.map((segment) => {
77
+ return `merch.segment/${segment}`;
78
+ });
79
+ }
80
+ if (reqMerch.disableInlineBanners) {
81
+ merch['disableInlineBanners'] = reqMerch.disableInlineBanners;
82
+ }
83
+ return merch;
84
+ };
85
+ transformSearchRequest.pagination = (request = {}) => {
86
+ const pagination = request.pagination || {};
87
+ const params = {};
88
+ if (pagination.page) {
89
+ params.page = pagination.page;
90
+ }
91
+ if (pagination.pageSize || pagination.pageSize === 0) {
92
+ params.resultsPerPage = pagination.pageSize;
93
+ }
94
+ return params;
95
+ };
96
+ transformSearchRequest.siteId = (request = {}) => {
97
+ if (request.siteId) {
98
+ return { siteId: request.siteId };
99
+ }
100
+ return {};
101
+ };
102
+ transformSearchRequest.facets = (request = {}) => {
103
+ const facets = request.facets || {};
104
+ const params = {};
105
+ if (facets.include && facets.include.length && facets.exclude && facets.exclude.length) {
106
+ throw 'cannot use facet include and exclude at the same time';
107
+ }
108
+ if (facets.include?.length) {
109
+ params.includedFacets = facets.include;
110
+ }
111
+ if (facets.exclude?.length) {
112
+ params.excludedFacets = facets.exclude;
113
+ }
114
+ if (facets.autoDrillDown === false) {
115
+ params.disableFacetDrillDown = true;
116
+ }
117
+ return params;
118
+ };
119
+ transformSearchRequest.tracking = (request = {}) => {
120
+ const reqTracking = request.tracking || {};
121
+ const params = {};
122
+ if (reqTracking.userId) {
123
+ params.userId = reqTracking.userId;
124
+ }
125
+ if (reqTracking.domain) {
126
+ params.domain = reqTracking.domain;
127
+ }
128
+ if (reqTracking.sessionId) {
129
+ params.sessionId = reqTracking.sessionId;
130
+ }
131
+ if (reqTracking.pageLoadId) {
132
+ params.pageLoadId = reqTracking.pageLoadId;
133
+ }
134
+ return params;
135
+ };
136
+ transformSearchRequest.personalization = (request = {}) => {
137
+ const personalization = request.personalization || {};
138
+ const params = {};
139
+ if (personalization.disabled) {
140
+ params.skipPersonalization = personalization.disabled;
141
+ }
142
+ if (personalization.cart) {
143
+ params.cart = personalization.cart;
144
+ }
145
+ if (personalization.lastViewed) {
146
+ params.lastViewed = personalization.lastViewed;
147
+ }
148
+ if (personalization.shopper) {
149
+ params.shopper = personalization.shopper;
150
+ }
151
+ return params;
152
+ };