@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.
- package/LICENSE +21 -0
- package/README.md +261 -0
- package/dist/cjs/Client/Client.d.ts +29 -0
- package/dist/cjs/Client/Client.d.ts.map +1 -0
- package/dist/cjs/Client/Client.js +278 -0
- package/dist/cjs/Client/NetworkCache/NetworkCache.d.ts +12 -0
- package/dist/cjs/Client/NetworkCache/NetworkCache.d.ts.map +1 -0
- package/dist/cjs/Client/NetworkCache/NetworkCache.js +198 -0
- package/dist/cjs/Client/apis/Abstract.d.ts +60 -0
- package/dist/cjs/Client/apis/Abstract.d.ts.map +1 -0
- package/dist/cjs/Client/apis/Abstract.js +297 -0
- package/dist/cjs/Client/apis/Meta.d.ts +8 -0
- package/dist/cjs/Client/apis/Meta.d.ts.map +1 -0
- package/dist/cjs/Client/apis/Meta.js +102 -0
- package/dist/cjs/Client/apis/Recommend.d.ts +15 -0
- package/dist/cjs/Client/apis/Recommend.d.ts.map +1 -0
- package/dist/cjs/Client/apis/Recommend.js +276 -0
- package/dist/cjs/Client/apis/Search.d.ts +12 -0
- package/dist/cjs/Client/apis/Search.d.ts.map +1 -0
- package/dist/cjs/Client/apis/Search.js +137 -0
- package/dist/cjs/Client/apis/Suggest.d.ts +9 -0
- package/dist/cjs/Client/apis/Suggest.d.ts.map +1 -0
- package/dist/cjs/Client/apis/Suggest.js +145 -0
- package/dist/cjs/Client/apis/index.d.ts +6 -0
- package/dist/cjs/Client/apis/index.d.ts.map +1 -0
- package/dist/cjs/Client/apis/index.js +21 -0
- package/dist/cjs/Client/transforms/index.d.ts +5 -0
- package/dist/cjs/Client/transforms/index.d.ts.map +1 -0
- package/dist/cjs/Client/transforms/index.js +20 -0
- package/dist/cjs/Client/transforms/recommendationFiltersPost.d.ts +3 -0
- package/dist/cjs/Client/transforms/recommendationFiltersPost.d.ts.map +1 -0
- package/dist/cjs/Client/transforms/recommendationFiltersPost.js +63 -0
- package/dist/cjs/Client/transforms/searchRequest.d.ts +49 -0
- package/dist/cjs/Client/transforms/searchRequest.d.ts.map +1 -0
- package/dist/cjs/Client/transforms/searchRequest.js +169 -0
- package/dist/cjs/Client/transforms/searchResponse.d.ts +146 -0
- package/dist/cjs/Client/transforms/searchResponse.d.ts.map +1 -0
- package/dist/cjs/Client/transforms/searchResponse.js +296 -0
- package/dist/cjs/Client/transforms/suggestResponse.d.ts +18 -0
- package/dist/cjs/Client/transforms/suggestResponse.d.ts.map +1 -0
- package/dist/cjs/Client/transforms/suggestResponse.js +30 -0
- package/dist/cjs/Client/utils/fibonacci.d.ts +2 -0
- package/dist/cjs/Client/utils/fibonacci.d.ts.map +1 -0
- package/dist/cjs/Client/utils/fibonacci.js +14 -0
- package/dist/cjs/Client/utils/index.d.ts +2 -0
- package/dist/cjs/Client/utils/index.d.ts.map +1 -0
- package/dist/cjs/Client/utils/index.js +17 -0
- package/dist/cjs/Client/utils/mergeParams.d.ts +2 -0
- package/dist/cjs/Client/utils/mergeParams.d.ts.map +1 -0
- package/dist/cjs/Client/utils/mergeParams.js +27 -0
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +17 -0
- package/dist/cjs/types.d.ts +212 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +2 -0
- package/dist/esm/Client/Client.d.ts +29 -0
- package/dist/esm/Client/Client.d.ts.map +1 -0
- package/dist/esm/Client/Client.js +157 -0
- package/dist/esm/Client/NetworkCache/NetworkCache.d.ts +12 -0
- package/dist/esm/Client/NetworkCache/NetworkCache.d.ts.map +1 -0
- package/dist/esm/Client/NetworkCache/NetworkCache.js +168 -0
- package/dist/esm/Client/apis/Abstract.d.ts +60 -0
- package/dist/esm/Client/apis/Abstract.d.ts.map +1 -0
- package/dist/esm/Client/apis/Abstract.js +165 -0
- package/dist/esm/Client/apis/Meta.d.ts +8 -0
- package/dist/esm/Client/apis/Meta.d.ts.map +1 -0
- package/dist/esm/Client/apis/Meta.js +23 -0
- package/dist/esm/Client/apis/Recommend.d.ts +15 -0
- package/dist/esm/Client/apis/Recommend.d.ts.map +1 -0
- package/dist/esm/Client/apis/Recommend.js +172 -0
- package/dist/esm/Client/apis/Search.d.ts +12 -0
- package/dist/esm/Client/apis/Search.d.ts.map +1 -0
- package/dist/esm/Client/apis/Search.js +41 -0
- package/dist/esm/Client/apis/Suggest.d.ts +9 -0
- package/dist/esm/Client/apis/Suggest.d.ts.map +1 -0
- package/dist/esm/Client/apis/Suggest.js +45 -0
- package/dist/esm/Client/apis/index.d.ts +6 -0
- package/dist/esm/Client/apis/index.d.ts.map +1 -0
- package/dist/esm/Client/apis/index.js +5 -0
- package/dist/esm/Client/transforms/index.d.ts +5 -0
- package/dist/esm/Client/transforms/index.d.ts.map +1 -0
- package/dist/esm/Client/transforms/index.js +4 -0
- package/dist/esm/Client/transforms/recommendationFiltersPost.d.ts +3 -0
- package/dist/esm/Client/transforms/recommendationFiltersPost.d.ts.map +1 -0
- package/dist/esm/Client/transforms/recommendationFiltersPost.js +59 -0
- package/dist/esm/Client/transforms/searchRequest.d.ts +49 -0
- package/dist/esm/Client/transforms/searchRequest.d.ts.map +1 -0
- package/dist/esm/Client/transforms/searchRequest.js +152 -0
- package/dist/esm/Client/transforms/searchResponse.d.ts +146 -0
- package/dist/esm/Client/transforms/searchResponse.d.ts.map +1 -0
- package/dist/esm/Client/transforms/searchResponse.js +284 -0
- package/dist/esm/Client/transforms/suggestResponse.d.ts +18 -0
- package/dist/esm/Client/transforms/suggestResponse.d.ts.map +1 -0
- package/dist/esm/Client/transforms/suggestResponse.js +26 -0
- package/dist/esm/Client/utils/fibonacci.d.ts +2 -0
- package/dist/esm/Client/utils/fibonacci.d.ts.map +1 -0
- package/dist/esm/Client/utils/fibonacci.js +10 -0
- package/dist/esm/Client/utils/index.d.ts +2 -0
- package/dist/esm/Client/utils/index.d.ts.map +1 -0
- package/dist/esm/Client/utils/index.js +1 -0
- package/dist/esm/Client/utils/mergeParams.d.ts +2 -0
- package/dist/esm/Client/utils/mergeParams.d.ts.map +1 -0
- package/dist/esm/Client/utils/mergeParams.js +20 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/types.d.ts +212 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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,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
|
+
};
|