@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 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ClientGlobals, ClientConfig, TrendingRequestModel, TrendingResponseModel, RecommendRequestModel, RecommendCombinedResponseModel } from '../types';
|
|
2
|
+
import type { MetaRequestModel, MetaResponseModel, SearchRequestModel, SearchResponseModel, AutocompleteRequestModel, AutocompleteResponseModel } from '@athoscommerce/snapi-types';
|
|
3
|
+
export declare class Client {
|
|
4
|
+
private mode;
|
|
5
|
+
private globals;
|
|
6
|
+
private config;
|
|
7
|
+
private requesters;
|
|
8
|
+
constructor(globals: ClientGlobals, config?: ClientConfig);
|
|
9
|
+
meta(params?: MetaRequestModel): Promise<MetaResponseModel>;
|
|
10
|
+
autocomplete(params?: AutocompleteRequestModel): Promise<{
|
|
11
|
+
meta: MetaResponseModel;
|
|
12
|
+
search: AutocompleteResponseModel;
|
|
13
|
+
}>;
|
|
14
|
+
search(params?: SearchRequestModel): Promise<{
|
|
15
|
+
meta: MetaResponseModel;
|
|
16
|
+
search: SearchResponseModel;
|
|
17
|
+
}>;
|
|
18
|
+
category(params?: SearchRequestModel): Promise<{
|
|
19
|
+
meta: MetaResponseModel;
|
|
20
|
+
search: SearchResponseModel;
|
|
21
|
+
}>;
|
|
22
|
+
finder(params?: SearchRequestModel): Promise<{
|
|
23
|
+
meta: MetaResponseModel;
|
|
24
|
+
search: SearchResponseModel;
|
|
25
|
+
}>;
|
|
26
|
+
trending(params: Partial<TrendingRequestModel>): Promise<TrendingResponseModel>;
|
|
27
|
+
recommend(params: RecommendRequestModel): Promise<RecommendCombinedResponseModel>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=Client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Client.d.ts","sourceRoot":"","sources":["../../../src/Client/Client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACX,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EAErB,qBAAqB,EACrB,8BAA8B,EAE9B,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EACX,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EAEzB,MAAM,4BAA4B,CAAC;AAcpC,qBAAa,MAAM;IAClB,OAAO,CAAC,IAAI,CAAsB;IAClC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAKhB;gBAEU,OAAO,EAAE,aAAa,EAAE,MAAM,GAAE,YAAiB;IAgEvD,IAAI,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAO3D,YAAY,CAAC,MAAM,GAAE,wBAA6B,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,iBAAiB,CAAC;QAAC,MAAM,EAAE,yBAAyB,CAAA;KAAE,CAAC;IAgD5H,MAAM,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,iBAAiB,CAAC;QAAC,MAAM,EAAE,mBAAmB,CAAA;KAAE,CAAC;IAO1G,QAAQ,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,iBAAiB,CAAC;QAAC,MAAM,EAAE,mBAAmB,CAAA;KAAE,CAAC;IAO5G,MAAM,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,iBAAiB,CAAC;QAAC,MAAM,EAAE,mBAAmB,CAAA;KAAE,CAAC;IAO1G,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAM/E,SAAS,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,8BAA8B,CAAC;CAmCvF"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { AppMode } from '@athoscommerce/snap-toolbox';
|
|
2
|
+
import { SuggestAPI, RecommendAPI, ApiConfiguration, SearchAPI, MetaAPI } from './apis';
|
|
3
|
+
import deepmerge from 'deepmerge';
|
|
4
|
+
import { transformSuggestResponse } from './transforms';
|
|
5
|
+
const defaultConfig = {
|
|
6
|
+
mode: AppMode.production,
|
|
7
|
+
meta: {
|
|
8
|
+
cache: {
|
|
9
|
+
purgeable: false,
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
export class Client {
|
|
14
|
+
constructor(globals, config = {}) {
|
|
15
|
+
this.mode = AppMode.production;
|
|
16
|
+
if (!globals?.siteId) {
|
|
17
|
+
throw 'no siteId specified!';
|
|
18
|
+
}
|
|
19
|
+
this.globals = globals;
|
|
20
|
+
this.config = deepmerge(defaultConfig, config);
|
|
21
|
+
if (Object.values(AppMode).includes(this.config.mode)) {
|
|
22
|
+
this.mode = this.config.mode;
|
|
23
|
+
}
|
|
24
|
+
this.requesters = {
|
|
25
|
+
meta: new MetaAPI(new ApiConfiguration({
|
|
26
|
+
fetchApi: this.config.fetchApi,
|
|
27
|
+
initiator: this.config.initiator,
|
|
28
|
+
mode: this.mode,
|
|
29
|
+
origin: this.config.meta?.origin,
|
|
30
|
+
headers: this.config.meta?.headers,
|
|
31
|
+
cache: this.config.meta?.cache,
|
|
32
|
+
globals: this.config.meta?.globals,
|
|
33
|
+
paths: this.config.meta?.paths,
|
|
34
|
+
})),
|
|
35
|
+
recommend: new RecommendAPI(new ApiConfiguration({
|
|
36
|
+
fetchApi: this.config.fetchApi,
|
|
37
|
+
initiator: this.config.initiator,
|
|
38
|
+
mode: this.mode,
|
|
39
|
+
origin: this.config.recommend?.origin,
|
|
40
|
+
headers: this.config.recommend?.headers,
|
|
41
|
+
cache: this.config.recommend?.cache,
|
|
42
|
+
globals: this.config.recommend?.globals,
|
|
43
|
+
paths: this.config.recommend?.paths,
|
|
44
|
+
})),
|
|
45
|
+
search: new SearchAPI(new ApiConfiguration({
|
|
46
|
+
fetchApi: this.config.fetchApi,
|
|
47
|
+
initiator: this.config.initiator,
|
|
48
|
+
mode: this.mode,
|
|
49
|
+
origin: this.config.search?.origin,
|
|
50
|
+
headers: this.config.search?.headers,
|
|
51
|
+
cache: this.config.search?.cache,
|
|
52
|
+
globals: this.config.search?.globals,
|
|
53
|
+
paths: this.config.search?.paths,
|
|
54
|
+
})),
|
|
55
|
+
suggest: new SuggestAPI(new ApiConfiguration({
|
|
56
|
+
fetchApi: this.config.fetchApi,
|
|
57
|
+
initiator: this.config.initiator,
|
|
58
|
+
mode: this.mode,
|
|
59
|
+
origin: this.config.suggest?.origin,
|
|
60
|
+
headers: this.config.suggest?.headers,
|
|
61
|
+
cache: this.config.suggest?.cache,
|
|
62
|
+
globals: this.config.suggest?.globals,
|
|
63
|
+
paths: this.config.suggest?.paths,
|
|
64
|
+
})),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async meta(params) {
|
|
68
|
+
const defaultParams = { siteId: this.globals.siteId };
|
|
69
|
+
params = deepmerge(defaultParams, params || {});
|
|
70
|
+
return this.requesters.meta.getMeta(params);
|
|
71
|
+
}
|
|
72
|
+
async autocomplete(params = {}) {
|
|
73
|
+
if (!params.search?.query?.string) {
|
|
74
|
+
throw 'query string parameter is required';
|
|
75
|
+
}
|
|
76
|
+
params = deepmerge(this.globals, params);
|
|
77
|
+
// start meta request immediately so it runs in parallel with suggest/search
|
|
78
|
+
const metaPromise = this.meta({ siteId: params.siteId || '' });
|
|
79
|
+
const suggestParams = {
|
|
80
|
+
siteId: params.siteId || '',
|
|
81
|
+
language: 'en',
|
|
82
|
+
query: params.search?.query?.string || '',
|
|
83
|
+
suggestionCount: (params.suggestions || {}).count || 5,
|
|
84
|
+
};
|
|
85
|
+
if (params.search?.query?.spellCorrection === false) {
|
|
86
|
+
suggestParams.disableSpellCorrect = true;
|
|
87
|
+
}
|
|
88
|
+
const suggestResults = await this.requesters.suggest.getSuggest(suggestParams);
|
|
89
|
+
const transformedSuggestResults = transformSuggestResponse(suggestResults);
|
|
90
|
+
// determine the query to use for the search request
|
|
91
|
+
// suggested text → original query → correctedQuery
|
|
92
|
+
const q = (transformedSuggestResults.suggested || {}).text || transformedSuggestResults.query || transformedSuggestResults.correctedQuery;
|
|
93
|
+
params.search = params.search || {};
|
|
94
|
+
params.search.redirectResponse = 'full';
|
|
95
|
+
// set the query to the most relevant suggestion
|
|
96
|
+
// params.search.query = params.search.query || {};
|
|
97
|
+
if (q && params.search?.query?.string) {
|
|
98
|
+
params.search.query.string = q;
|
|
99
|
+
}
|
|
100
|
+
const searchResults = await this.requesters.search.getAutocomplete(params);
|
|
101
|
+
const autocompleteResponse = {
|
|
102
|
+
...searchResults,
|
|
103
|
+
autocomplete: transformedSuggestResults,
|
|
104
|
+
};
|
|
105
|
+
const [meta, search] = await Promise.all([metaPromise, autocompleteResponse]);
|
|
106
|
+
return { meta, search };
|
|
107
|
+
}
|
|
108
|
+
async search(params = {}) {
|
|
109
|
+
params = deepmerge(this.globals, params);
|
|
110
|
+
const [meta, search] = await Promise.all([this.meta({ siteId: params.siteId || '' }), this.requesters.search.getSearch(params)]);
|
|
111
|
+
return { meta, search };
|
|
112
|
+
}
|
|
113
|
+
async category(params = {}) {
|
|
114
|
+
params = deepmerge(this.globals, params);
|
|
115
|
+
const [meta, search] = await Promise.all([this.meta({ siteId: params.siteId || '' }), this.requesters.search.getCategory(params)]);
|
|
116
|
+
return { meta, search };
|
|
117
|
+
}
|
|
118
|
+
async finder(params = {}) {
|
|
119
|
+
params = deepmerge(this.globals, params);
|
|
120
|
+
const [meta, search] = await Promise.all([this.meta({ siteId: params.siteId || '' }), this.requesters.search.getFinder(params)]);
|
|
121
|
+
return { meta, search };
|
|
122
|
+
}
|
|
123
|
+
async trending(params) {
|
|
124
|
+
params = deepmerge({ siteId: this.globals.siteId }, params || {});
|
|
125
|
+
return this.requesters.suggest.getTrending(params);
|
|
126
|
+
}
|
|
127
|
+
async recommend(params) {
|
|
128
|
+
const { tag, ...otherParams } = params;
|
|
129
|
+
if (!tag) {
|
|
130
|
+
throw 'tag parameter is required';
|
|
131
|
+
}
|
|
132
|
+
const profileParams = {
|
|
133
|
+
tag,
|
|
134
|
+
siteId: params.siteId || this.globals.siteId,
|
|
135
|
+
};
|
|
136
|
+
if (otherParams.branch) {
|
|
137
|
+
profileParams.branch = otherParams.branch;
|
|
138
|
+
delete otherParams.branch;
|
|
139
|
+
}
|
|
140
|
+
const recommendParams = {
|
|
141
|
+
tag: tag,
|
|
142
|
+
...otherParams,
|
|
143
|
+
siteId: params.siteId || this.globals.siteId,
|
|
144
|
+
};
|
|
145
|
+
const [meta, profile, recommendations] = await Promise.all([
|
|
146
|
+
this.meta(params.siteId ? { siteId: params.siteId } : undefined),
|
|
147
|
+
this.requesters.recommend.getProfile(profileParams),
|
|
148
|
+
this.requesters.recommend.batchRecommendations(recommendParams),
|
|
149
|
+
]);
|
|
150
|
+
return {
|
|
151
|
+
...profile,
|
|
152
|
+
meta,
|
|
153
|
+
results: recommendations && recommendations.results,
|
|
154
|
+
responseId: recommendations ? recommendations.responseId : '',
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CacheConfig, Cache, DefaultCacheConfig } from '../../types';
|
|
2
|
+
export declare class NetworkCache {
|
|
3
|
+
protected memoryCache: Cache;
|
|
4
|
+
protected config: DefaultCacheConfig;
|
|
5
|
+
constructor(config?: CacheConfig);
|
|
6
|
+
load(): void;
|
|
7
|
+
get(key: string): Response | void;
|
|
8
|
+
private purgeExpired;
|
|
9
|
+
set(key: string, value: Response): void;
|
|
10
|
+
clear(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=NetworkCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NetworkCache.d.ts","sourceRoot":"","sources":["../../../../src/Client/NetworkCache/NetworkCache.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAWrE,qBAAa,YAAY;IACxB,SAAS,CAAC,WAAW,EAAE,KAAK,CAAM;IAClC,SAAS,CAAC,MAAM,EAAE,kBAAkB,CAAC;gBAEzB,MAAM,CAAC,EAAE,WAAW;IAczB,IAAI,IAAI,IAAI;IAcZ,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IA2ExC,OAAO,CAAC,YAAY;IAmBb,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI;IAuCvC,KAAK;CAUZ"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import deepmerge from 'deepmerge';
|
|
2
|
+
const CACHE_STORAGE_KEY = 'athos-networkcache';
|
|
3
|
+
const defaultConfig = {
|
|
4
|
+
enabled: true,
|
|
5
|
+
ttl: 300000, // ms
|
|
6
|
+
maxSize: 1000, // KB
|
|
7
|
+
purgeable: true,
|
|
8
|
+
};
|
|
9
|
+
export class NetworkCache {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.memoryCache = {};
|
|
12
|
+
this.config = deepmerge(defaultConfig, config || {});
|
|
13
|
+
this.load();
|
|
14
|
+
// this allows you to pre-populate the cache from the config - primarily used for email recs
|
|
15
|
+
this.config?.entries &&
|
|
16
|
+
Object.keys(this.config.entries).map((key) => {
|
|
17
|
+
if (this.config.entries && this.config.entries[key]) {
|
|
18
|
+
this.set(key, this.config.entries[key]);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
load() {
|
|
23
|
+
// initialize cache from session storage
|
|
24
|
+
if (typeof window !== 'undefined' && window?.sessionStorage) {
|
|
25
|
+
const stored = window.sessionStorage.getItem(CACHE_STORAGE_KEY);
|
|
26
|
+
const newStored = {
|
|
27
|
+
...(stored && JSON.parse(stored)),
|
|
28
|
+
};
|
|
29
|
+
this.memoryCache = newStored || {};
|
|
30
|
+
}
|
|
31
|
+
this.purgeExpired();
|
|
32
|
+
}
|
|
33
|
+
get(key) {
|
|
34
|
+
if (this.config.enabled) {
|
|
35
|
+
this.load();
|
|
36
|
+
try {
|
|
37
|
+
let ignoreKeys = [];
|
|
38
|
+
if (typeof window !== 'undefined') {
|
|
39
|
+
const navigationType = window.performance?.getEntriesByType('navigation')?.[0]?.type;
|
|
40
|
+
if (navigationType === 'back_forward') {
|
|
41
|
+
ignoreKeys = ['lastViewed', 'cart'];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (Object.keys(this.memoryCache).length && key) {
|
|
45
|
+
let storageKey = key;
|
|
46
|
+
// this only applies to search calls
|
|
47
|
+
if (ignoreKeys.length && key.startsWith('/v1/search')) {
|
|
48
|
+
try {
|
|
49
|
+
const url = key.split('{')[0];
|
|
50
|
+
const payload = '{' + key.split('{')[1];
|
|
51
|
+
const searchParams = JSON.parse(payload);
|
|
52
|
+
const foundKey = Object.keys(this.memoryCache).find((cachedResponse) => {
|
|
53
|
+
try {
|
|
54
|
+
const storedUrl = cachedResponse.split('{')[0];
|
|
55
|
+
if (storedUrl == url) {
|
|
56
|
+
const storedPayload = '{' + cachedResponse.split('{')[1];
|
|
57
|
+
const parsedPayload = JSON.parse(storedPayload);
|
|
58
|
+
const allKeys = Array.from(new Set([...Object.keys(searchParams), ...Object.keys(parsedPayload)]));
|
|
59
|
+
for (const k of allKeys) {
|
|
60
|
+
if (ignoreKeys.includes(k))
|
|
61
|
+
continue;
|
|
62
|
+
if (JSON.stringify(searchParams[k]) !== JSON.stringify(parsedPayload[k])) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
else
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
if (foundKey) {
|
|
76
|
+
storageKey = foundKey;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
// key is not json
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (this.memoryCache[storageKey]) {
|
|
84
|
+
// compare the expiry time of the item with the current time
|
|
85
|
+
if (Date.now() >= this.memoryCache[storageKey].expires) {
|
|
86
|
+
// remove item
|
|
87
|
+
const newStored = {
|
|
88
|
+
...this.memoryCache,
|
|
89
|
+
};
|
|
90
|
+
delete newStored[storageKey];
|
|
91
|
+
// update storage
|
|
92
|
+
window.sessionStorage.setItem(CACHE_STORAGE_KEY, JSON.stringify(newStored));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
return this.memoryCache[storageKey].value;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
console.warn('something went wrong getting from cache', err);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
purgeExpired() {
|
|
106
|
+
Object.keys(this.memoryCache).forEach((cacheKey) => {
|
|
107
|
+
//clean up expired cache keys in memory
|
|
108
|
+
if (Date.now() > this.memoryCache[cacheKey].expires) {
|
|
109
|
+
delete this.memoryCache[cacheKey];
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
// update storage
|
|
113
|
+
try {
|
|
114
|
+
if (typeof window !== 'undefined' && window?.sessionStorage) {
|
|
115
|
+
const stringifiedCache = JSON.stringify(this.memoryCache);
|
|
116
|
+
window.sessionStorage.setItem(CACHE_STORAGE_KEY, stringifiedCache);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
console.warn('failed to store network cache');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
set(key, value) {
|
|
124
|
+
if (this.config.enabled) {
|
|
125
|
+
this.load();
|
|
126
|
+
try {
|
|
127
|
+
const cacheObject = {
|
|
128
|
+
value,
|
|
129
|
+
expires: Date.now() + this.config.ttl,
|
|
130
|
+
purgeable: this.config.purgeable,
|
|
131
|
+
};
|
|
132
|
+
// purge old items if we are over max size
|
|
133
|
+
let size = new Blob([JSON.stringify(this.memoryCache)], { endings: 'native' }).size / 1024;
|
|
134
|
+
while (size > this.config.maxSize) {
|
|
135
|
+
const oldestKey = Object.keys(this.memoryCache)
|
|
136
|
+
.filter((key) => this.memoryCache[key].purgeable)
|
|
137
|
+
.sort((a, b) => {
|
|
138
|
+
return this.memoryCache[a].expires - this.memoryCache[b].expires;
|
|
139
|
+
})[0];
|
|
140
|
+
if (!oldestKey)
|
|
141
|
+
break;
|
|
142
|
+
delete this.memoryCache[oldestKey];
|
|
143
|
+
// recalculate size after removing oldest
|
|
144
|
+
size = new Blob([JSON.stringify(this.memoryCache)], { endings: 'native' }).size / 1024;
|
|
145
|
+
}
|
|
146
|
+
// store cache in memory
|
|
147
|
+
this.memoryCache[key] = cacheObject;
|
|
148
|
+
if (typeof window !== 'undefined' && window?.sessionStorage) {
|
|
149
|
+
window.sessionStorage.setItem(CACHE_STORAGE_KEY, JSON.stringify(this.memoryCache));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
console.warn('something went wrong setting to cache');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
clear() {
|
|
158
|
+
try {
|
|
159
|
+
this.memoryCache = {};
|
|
160
|
+
if (typeof window !== 'undefined' && window?.sessionStorage) {
|
|
161
|
+
window.sessionStorage.setItem(CACHE_STORAGE_KEY, '');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
console.warn('something went wrong clearing cache');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { AppMode } from '@athoscommerce/snap-toolbox';
|
|
2
|
+
import { NetworkCache } from '../NetworkCache/NetworkCache';
|
|
3
|
+
import { CacheConfig, HTTPHeaders, GenericGlobals } from '../../types';
|
|
4
|
+
export type Json = any;
|
|
5
|
+
export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';
|
|
6
|
+
export type HTTPQuery = {
|
|
7
|
+
[key: string]: string | number | null | boolean | Array<string | number | null | boolean> | HTTPQuery;
|
|
8
|
+
};
|
|
9
|
+
export type HTTPBody = Json | FormData | URLSearchParams;
|
|
10
|
+
export interface RequestOpts {
|
|
11
|
+
path: string;
|
|
12
|
+
method: HTTPMethod;
|
|
13
|
+
headers: HTTPHeaders;
|
|
14
|
+
query?: HTTPQuery;
|
|
15
|
+
body?: HTTPBody;
|
|
16
|
+
origin?: string;
|
|
17
|
+
subDomain?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class API<PathConfigurationType> {
|
|
20
|
+
configuration: ApiConfiguration<PathConfigurationType>;
|
|
21
|
+
private retryDelay;
|
|
22
|
+
private retryCount;
|
|
23
|
+
cache: NetworkCache;
|
|
24
|
+
constructor(configuration: ApiConfiguration<PathConfigurationType>);
|
|
25
|
+
protected get mode(): AppMode;
|
|
26
|
+
protected request<T>(context: RequestOpts, cacheKey?: string): Promise<T>;
|
|
27
|
+
private createFetchParams;
|
|
28
|
+
private fetchApi;
|
|
29
|
+
}
|
|
30
|
+
export type FetchAPI = WindowOrWorkerGlobalScope['fetch'];
|
|
31
|
+
export interface ApiConfigurationParameters<PathConfigurationType = Record<string, string>> {
|
|
32
|
+
mode?: keyof typeof AppMode | AppMode;
|
|
33
|
+
initiator?: string;
|
|
34
|
+
origin?: string;
|
|
35
|
+
fetchApi?: FetchAPI;
|
|
36
|
+
queryParamsStringify?: (params: HTTPQuery) => string;
|
|
37
|
+
headers?: HTTPHeaders;
|
|
38
|
+
maxRetry?: number;
|
|
39
|
+
cache?: CacheConfig;
|
|
40
|
+
globals?: GenericGlobals;
|
|
41
|
+
paths?: PathConfigurationType;
|
|
42
|
+
}
|
|
43
|
+
export declare class ApiConfiguration<PathConfigurationType> {
|
|
44
|
+
private config;
|
|
45
|
+
constructor(config?: ApiConfigurationParameters<PathConfigurationType>);
|
|
46
|
+
get cache(): CacheConfig;
|
|
47
|
+
get maxRetry(): number;
|
|
48
|
+
get origin(): string;
|
|
49
|
+
get initiator(): string;
|
|
50
|
+
get fetchApi(): FetchAPI;
|
|
51
|
+
get queryParamsStringify(): (params: HTTPQuery) => string;
|
|
52
|
+
get headers(): HTTPHeaders;
|
|
53
|
+
set headers(newHeaders: HTTPHeaders);
|
|
54
|
+
get globals(): GenericGlobals;
|
|
55
|
+
set globals(newGlobals: GenericGlobals);
|
|
56
|
+
get mode(): AppMode;
|
|
57
|
+
get paths(): PathConfigurationType;
|
|
58
|
+
}
|
|
59
|
+
export declare function querystring(params: HTTPQuery, prefix?: string): string;
|
|
60
|
+
//# sourceMappingURL=Abstract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Abstract.d.ts","sourceRoot":"","sources":["../../../../src/Client/apis/Abstract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import deepmerge from 'deepmerge';
|
|
2
|
+
import { AppMode, version } from '@athoscommerce/snap-toolbox';
|
|
3
|
+
import { fibonacci } from '../utils/fibonacci';
|
|
4
|
+
import { NetworkCache } from '../NetworkCache/NetworkCache';
|
|
5
|
+
const isBlob = (value) => typeof Blob !== 'undefined' && value instanceof Blob;
|
|
6
|
+
export class API {
|
|
7
|
+
constructor(configuration) {
|
|
8
|
+
this.configuration = configuration;
|
|
9
|
+
this.retryDelay = 1000;
|
|
10
|
+
this.retryCount = 0;
|
|
11
|
+
this.cache = new NetworkCache(this.configuration.cache);
|
|
12
|
+
}
|
|
13
|
+
get mode() {
|
|
14
|
+
return this.configuration.mode;
|
|
15
|
+
}
|
|
16
|
+
async request(context, cacheKey) {
|
|
17
|
+
const { url, init } = this.createFetchParams(context);
|
|
18
|
+
if (cacheKey) {
|
|
19
|
+
const cachedResponse = this.cache.get(`${context.path}/${cacheKey}`) || this.cache.get(`${context.path}/*`);
|
|
20
|
+
if (cachedResponse) {
|
|
21
|
+
this.retryCount = 0; // reset count and delay incase rate limit occurs again before a page refresh
|
|
22
|
+
this.retryDelay = 1000;
|
|
23
|
+
return cachedResponse;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
let response;
|
|
27
|
+
let responseJSON;
|
|
28
|
+
try {
|
|
29
|
+
response = await this.fetchApi(url, init);
|
|
30
|
+
responseJSON = await response?.json();
|
|
31
|
+
if (response.status >= 200 && response.status < 300) {
|
|
32
|
+
this.retryCount = 0; // reset count and delay incase rate limit occurs again before a page refresh
|
|
33
|
+
this.retryDelay = 1000;
|
|
34
|
+
if (cacheKey) {
|
|
35
|
+
// save in the cache before returning
|
|
36
|
+
this.cache.set(`${context.path}/${cacheKey}`, responseJSON);
|
|
37
|
+
}
|
|
38
|
+
return responseJSON;
|
|
39
|
+
}
|
|
40
|
+
else if (response.status == 429) {
|
|
41
|
+
if (this.retryCount < this.configuration.maxRetry) {
|
|
42
|
+
await new Promise((resolve) => setTimeout(resolve, this.retryDelay)); // delay retry
|
|
43
|
+
this.retryDelay = fibonacci(this.retryCount) * 1000;
|
|
44
|
+
this.retryCount++;
|
|
45
|
+
throw new Error('Rate limited.');
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
throw new Error('Retry rate limit exceeded.');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else if (response.status == 404 && responseJSON?.message == 'Profile is currently paused') {
|
|
52
|
+
//dont throw if profile is paused.
|
|
53
|
+
throw new Error(`${responseJSON.message}: ${context.query?.tag}`);
|
|
54
|
+
}
|
|
55
|
+
throw new Error('Unexpected Response Status.');
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (err.message == 'Rate limited.') {
|
|
59
|
+
return await this.request(context, cacheKey);
|
|
60
|
+
}
|
|
61
|
+
// throw an object with fetch details
|
|
62
|
+
throw { err, fetchDetails: { status: response?.status, message: response?.statusText || 'FAILED', url, ...init } };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
createFetchParams(context) {
|
|
66
|
+
// grab siteID out of context to generate apiHost fo URL
|
|
67
|
+
const siteId = context?.body?.siteId || context?.query?.siteId;
|
|
68
|
+
if (!siteId) {
|
|
69
|
+
throw new Error(`Request failed. Missing "siteId" parameter.`);
|
|
70
|
+
}
|
|
71
|
+
const siteIdHost = `https://${siteId}.a${context.subDomain ? `.${context.subDomain}` : ''}.athoscommerce.net`;
|
|
72
|
+
const origin = (context.origin || this.configuration.origin || siteIdHost).replace(/\/$/, '');
|
|
73
|
+
let url = `${origin}/${context.path.replace(/^\//, '')}`;
|
|
74
|
+
// merging globals to request query
|
|
75
|
+
const combinedQuery = deepmerge(context.query || {}, this.configuration.globals);
|
|
76
|
+
if (Object.keys(combinedQuery).length !== 0) {
|
|
77
|
+
// only add the querystring to the URL if there are query parameters.
|
|
78
|
+
url += '?' + this.configuration.queryParamsStringify(combinedQuery);
|
|
79
|
+
}
|
|
80
|
+
// merging globals to request body
|
|
81
|
+
const body = (typeof FormData !== 'undefined' && context.body instanceof FormData) || context.body instanceof URLSearchParams || isBlob(context.body)
|
|
82
|
+
? context.body
|
|
83
|
+
: JSON.stringify(context.body ? deepmerge(context.body, this.configuration.globals) : context.body);
|
|
84
|
+
const headers = { ...this.configuration.headers, ...context.headers };
|
|
85
|
+
const init = {
|
|
86
|
+
method: context.method,
|
|
87
|
+
headers: headers,
|
|
88
|
+
body,
|
|
89
|
+
};
|
|
90
|
+
return { url, init };
|
|
91
|
+
}
|
|
92
|
+
async fetchApi(url, init) {
|
|
93
|
+
const response = await this.configuration.fetchApi(url, init);
|
|
94
|
+
return response;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export class ApiConfiguration {
|
|
98
|
+
constructor(config = {}) {
|
|
99
|
+
this.config = config;
|
|
100
|
+
if (!config.maxRetry) {
|
|
101
|
+
this.config.maxRetry = 8;
|
|
102
|
+
}
|
|
103
|
+
this.config.cache = this.config.cache || {};
|
|
104
|
+
this.config.mode = this.config.mode || AppMode.production;
|
|
105
|
+
if (this.config.mode == AppMode.development) {
|
|
106
|
+
this.config.cache.enabled = false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
get cache() {
|
|
110
|
+
return this.config?.cache || {};
|
|
111
|
+
}
|
|
112
|
+
get maxRetry() {
|
|
113
|
+
return this.config.maxRetry || 8;
|
|
114
|
+
}
|
|
115
|
+
get origin() {
|
|
116
|
+
return this.config.origin || '';
|
|
117
|
+
}
|
|
118
|
+
get initiator() {
|
|
119
|
+
return this.config.initiator || `snap/client/${version}`;
|
|
120
|
+
}
|
|
121
|
+
get fetchApi() {
|
|
122
|
+
return this.config.fetchApi || (typeof window !== 'undefined' ? window.fetch?.bind(window) : fetch);
|
|
123
|
+
}
|
|
124
|
+
get queryParamsStringify() {
|
|
125
|
+
return this.config.queryParamsStringify || querystring;
|
|
126
|
+
}
|
|
127
|
+
get headers() {
|
|
128
|
+
return this.config.headers || {};
|
|
129
|
+
}
|
|
130
|
+
set headers(newHeaders) {
|
|
131
|
+
this.config.headers = newHeaders;
|
|
132
|
+
}
|
|
133
|
+
get globals() {
|
|
134
|
+
return this.config.globals || {};
|
|
135
|
+
}
|
|
136
|
+
set globals(newGlobals) {
|
|
137
|
+
this.config.globals = newGlobals;
|
|
138
|
+
}
|
|
139
|
+
get mode() {
|
|
140
|
+
return this.config.mode;
|
|
141
|
+
}
|
|
142
|
+
get paths() {
|
|
143
|
+
return this.config.paths || {};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export function querystring(params, prefix = '') {
|
|
147
|
+
return Object.keys(params)
|
|
148
|
+
.map((key) => {
|
|
149
|
+
const fullKey = prefix + (prefix.length ? `[${key}]` : key);
|
|
150
|
+
const value = params[key];
|
|
151
|
+
if (value instanceof Array) {
|
|
152
|
+
const multiValue = value.map((singleValue) => encodeURIComponent(String(singleValue))).join(`&${encodeURIComponent(fullKey)}=`);
|
|
153
|
+
return `${encodeURIComponent(fullKey)}=${multiValue}`;
|
|
154
|
+
}
|
|
155
|
+
if (value instanceof Date) {
|
|
156
|
+
return `${encodeURIComponent(fullKey)}=${encodeURIComponent(value.toISOString())}`;
|
|
157
|
+
}
|
|
158
|
+
if (value instanceof Object) {
|
|
159
|
+
return querystring(value, fullKey);
|
|
160
|
+
}
|
|
161
|
+
return `${encodeURIComponent(fullKey)}=${encodeURIComponent(String(value))}`;
|
|
162
|
+
})
|
|
163
|
+
.filter((part) => part.length > 0)
|
|
164
|
+
.join('&');
|
|
165
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MetaRequestModel, MetaResponseModel } from '@athoscommerce/snapi-types';
|
|
2
|
+
import { API } from '.';
|
|
3
|
+
import { MetaRequesterPaths } from '../../types';
|
|
4
|
+
export declare class MetaAPI extends API<MetaRequesterPaths> {
|
|
5
|
+
postMeta(requestParameters: MetaRequestModel): Promise<MetaResponseModel>;
|
|
6
|
+
getMeta(queryParameters: MetaRequestModel): Promise<MetaResponseModel>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=Meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Meta.d.ts","sourceRoot":"","sources":["../../../../src/Client/apis/Meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEjF,OAAO,EAAE,GAAG,EAAa,MAAM,GAAG,CAAC;AACnC,OAAO,EAAe,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE9D,qBAAa,OAAQ,SAAQ,GAAG,CAAC,kBAAkB,CAAC;IACtC,QAAQ,CAAC,iBAAiB,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkBzE,OAAO,CAAC,eAAe,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAanF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { API } from '.';
|
|
2
|
+
export class MetaAPI extends API {
|
|
3
|
+
async postMeta(requestParameters) {
|
|
4
|
+
const headerParameters = {};
|
|
5
|
+
headerParameters['Content-Type'] = 'application/json';
|
|
6
|
+
const response = await this.request({
|
|
7
|
+
path: this.configuration.paths.meta || '/v1/meta',
|
|
8
|
+
method: 'POST',
|
|
9
|
+
headers: headerParameters,
|
|
10
|
+
body: requestParameters,
|
|
11
|
+
}, JSON.stringify(requestParameters));
|
|
12
|
+
return response;
|
|
13
|
+
}
|
|
14
|
+
async getMeta(queryParameters) {
|
|
15
|
+
const response = await this.request({
|
|
16
|
+
path: this.configuration.paths.meta || '/v1/meta',
|
|
17
|
+
method: 'GET',
|
|
18
|
+
headers: {},
|
|
19
|
+
query: queryParameters,
|
|
20
|
+
}, JSON.stringify(queryParameters));
|
|
21
|
+
return response;
|
|
22
|
+
}
|
|
23
|
+
}
|