@searchspring/snap-controller 0.20.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +167 -0
  3. package/dist/cjs/Abstract/AbstractController.d.ts +40 -0
  4. package/dist/cjs/Abstract/AbstractController.d.ts.map +1 -0
  5. package/dist/cjs/Abstract/AbstractController.js +281 -0
  6. package/dist/cjs/Autocomplete/AutocompleteController.d.ts +40 -0
  7. package/dist/cjs/Autocomplete/AutocompleteController.d.ts.map +1 -0
  8. package/dist/cjs/Autocomplete/AutocompleteController.js +687 -0
  9. package/dist/cjs/Finder/FinderController.d.ts +14 -0
  10. package/dist/cjs/Finder/FinderController.d.ts.map +1 -0
  11. package/dist/cjs/Finder/FinderController.js +286 -0
  12. package/dist/cjs/Recommendation/RecommendationController.d.ts +31 -0
  13. package/dist/cjs/Recommendation/RecommendationController.d.ts.map +1 -0
  14. package/dist/cjs/Recommendation/RecommendationController.js +452 -0
  15. package/dist/cjs/Search/SearchController.d.ts +23 -0
  16. package/dist/cjs/Search/SearchController.d.ts.map +1 -0
  17. package/dist/cjs/Search/SearchController.js +429 -0
  18. package/dist/cjs/index.d.ts +7 -0
  19. package/dist/cjs/index.d.ts.map +1 -0
  20. package/dist/cjs/index.js +24 -0
  21. package/dist/cjs/types.d.ts +52 -0
  22. package/dist/cjs/types.d.ts.map +1 -0
  23. package/dist/cjs/types.js +2 -0
  24. package/dist/cjs/utils/getParams.d.ts +2 -0
  25. package/dist/cjs/utils/getParams.d.ts.map +1 -0
  26. package/dist/cjs/utils/getParams.js +72 -0
  27. package/dist/esm/Abstract/AbstractController.d.ts +40 -0
  28. package/dist/esm/Abstract/AbstractController.d.ts.map +1 -0
  29. package/dist/esm/Abstract/AbstractController.js +181 -0
  30. package/dist/esm/Autocomplete/AutocompleteController.d.ts +40 -0
  31. package/dist/esm/Autocomplete/AutocompleteController.d.ts.map +1 -0
  32. package/dist/esm/Autocomplete/AutocompleteController.js +472 -0
  33. package/dist/esm/Finder/FinderController.d.ts +14 -0
  34. package/dist/esm/Finder/FinderController.d.ts.map +1 -0
  35. package/dist/esm/Finder/FinderController.js +164 -0
  36. package/dist/esm/Recommendation/RecommendationController.d.ts +31 -0
  37. package/dist/esm/Recommendation/RecommendationController.d.ts.map +1 -0
  38. package/dist/esm/Recommendation/RecommendationController.js +330 -0
  39. package/dist/esm/Search/SearchController.d.ts +23 -0
  40. package/dist/esm/Search/SearchController.d.ts.map +1 -0
  41. package/dist/esm/Search/SearchController.js +282 -0
  42. package/dist/esm/index.d.ts +7 -0
  43. package/dist/esm/index.d.ts.map +1 -0
  44. package/dist/esm/index.js +6 -0
  45. package/dist/esm/types.d.ts +52 -0
  46. package/dist/esm/types.d.ts.map +1 -0
  47. package/dist/esm/types.js +1 -0
  48. package/dist/esm/utils/getParams.d.ts +2 -0
  49. package/dist/esm/utils/getParams.d.ts.map +1 -0
  50. package/dist/esm/utils/getParams.js +68 -0
  51. package/package.json +40 -0
@@ -0,0 +1,429 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
30
+ return new (P || (P = Promise))(function (resolve, reject) {
31
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
32
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
33
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
34
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
35
+ });
36
+ };
37
+ var __generator = (this && this.__generator) || function (thisArg, body) {
38
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
39
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
+ function verb(n) { return function (v) { return step([n, v]); }; }
41
+ function step(op) {
42
+ if (f) throw new TypeError("Generator is already executing.");
43
+ while (_) try {
44
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
45
+ if (y = 0, t) op = [op[0] & 2, t.value];
46
+ switch (op[0]) {
47
+ case 0: case 1: t = op; break;
48
+ case 4: _.label++; return { value: op[1], done: false };
49
+ case 5: _.label++; y = op[1]; op = [0]; continue;
50
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
+ default:
52
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
+ if (t[2]) _.ops.pop();
57
+ _.trys.pop(); continue;
58
+ }
59
+ op = body.call(thisArg, _);
60
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
+ }
63
+ };
64
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
65
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
66
+ if (ar || !(i in from)) {
67
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
68
+ ar[i] = from[i];
69
+ }
70
+ }
71
+ return to.concat(ar || Array.prototype.slice.call(from));
72
+ };
73
+ var __importDefault = (this && this.__importDefault) || function (mod) {
74
+ return (mod && mod.__esModule) ? mod : { "default": mod };
75
+ };
76
+ Object.defineProperty(exports, "__esModule", { value: true });
77
+ exports.SearchController = void 0;
78
+ var deepmerge_1 = __importDefault(require("deepmerge"));
79
+ var AbstractController_1 = require("../Abstract/AbstractController");
80
+ var snap_store_mobx_1 = require("@searchspring/snap-store-mobx");
81
+ var getParams_1 = require("../utils/getParams");
82
+ var HEIGHT_CHECK_INTERVAL = 50;
83
+ var defaultConfig = {
84
+ id: 'search',
85
+ globals: {},
86
+ settings: {
87
+ redirects: {
88
+ merchandising: true,
89
+ singleResult: true,
90
+ },
91
+ facets: {
92
+ trim: true,
93
+ pinFiltered: true,
94
+ },
95
+ },
96
+ };
97
+ var SearchController = /** @class */ (function (_super) {
98
+ __extends(SearchController, _super);
99
+ function SearchController(config, _a) {
100
+ var client = _a.client, store = _a.store, urlManager = _a.urlManager, eventManager = _a.eventManager, profiler = _a.profiler, logger = _a.logger, tracker = _a.tracker;
101
+ var _this = _super.call(this, config, { client: client, store: store, urlManager: urlManager, eventManager: eventManager, profiler: profiler, logger: logger, tracker: tracker }) || this;
102
+ _this.type = 'search';
103
+ _this.track = {
104
+ product: {
105
+ click: function (e, result) {
106
+ var _a;
107
+ // store scroll position
108
+ if (_this.config.settings.infinite) {
109
+ var stringyParams = _this.storage.get('lastStringyParams');
110
+ var scrollMap = {};
111
+ scrollMap[stringyParams] = window.scrollY;
112
+ _this.storage.set('scrollMap', scrollMap);
113
+ }
114
+ // track
115
+ var _b = result.attributes, intellisuggestData = _b.intellisuggestData, intellisuggestSignature = _b.intellisuggestSignature;
116
+ var target = e.target;
117
+ var href = (target === null || target === void 0 ? void 0 : target.href) || ((_a = result.mappings.core) === null || _a === void 0 ? void 0 : _a.url) || undefined;
118
+ var event = _this.tracker.track.product.click({
119
+ intellisuggestData: intellisuggestData,
120
+ intellisuggestSignature: intellisuggestSignature,
121
+ href: href,
122
+ });
123
+ _this.eventManager.fire('track.product.click', { controller: _this, event: e, result: result, trackEvent: event });
124
+ return event;
125
+ },
126
+ },
127
+ };
128
+ _this.search = function () { return __awaiter(_this, void 0, void 0, function () {
129
+ var params, stringyParams, prevStringyParams, err_1, preventBackfill, dontBackfill, searchProfile, _a, meta, response, previousResults_1, backfills, page, backfillParams, backfillResponses, afterSearchProfile, err_2, afterStoreProfile, err_3, err_4;
130
+ var _b, _c, _d, _e, _f, _g, _h;
131
+ return __generator(this, function (_j) {
132
+ switch (_j.label) {
133
+ case 0:
134
+ if (!!this.initialized) return [3 /*break*/, 2];
135
+ return [4 /*yield*/, this.init()];
136
+ case 1:
137
+ _j.sent();
138
+ _j.label = 2;
139
+ case 2:
140
+ params = this.params;
141
+ _j.label = 3;
142
+ case 3:
143
+ _j.trys.push([3, 20, , 21]);
144
+ stringyParams = JSON.stringify(params);
145
+ prevStringyParams = this.storage.get('lastStringyParams');
146
+ if (stringyParams == prevStringyParams) {
147
+ // no param change - not searching
148
+ return [2 /*return*/];
149
+ }
150
+ _j.label = 4;
151
+ case 4:
152
+ _j.trys.push([4, 6, , 7]);
153
+ return [4 /*yield*/, this.eventManager.fire('beforeSearch', {
154
+ controller: this,
155
+ request: params,
156
+ })];
157
+ case 5:
158
+ _j.sent();
159
+ return [3 /*break*/, 7];
160
+ case 6:
161
+ err_1 = _j.sent();
162
+ if ((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) == 'cancelled') {
163
+ this.log.warn("'beforeSearch' middleware cancelled");
164
+ return [2 /*return*/];
165
+ }
166
+ else {
167
+ this.log.error("error in 'beforeSearch' middleware");
168
+ throw err_1;
169
+ }
170
+ return [3 /*break*/, 7];
171
+ case 7:
172
+ if (this.config.settings.infinite) {
173
+ preventBackfill = ((_b = this.config.settings.infinite) === null || _b === void 0 ? void 0 : _b.backfill) && !this.store.results.length && ((_c = params.pagination) === null || _c === void 0 ? void 0 : _c.page) > this.config.settings.infinite.backfill;
174
+ dontBackfill = !((_d = this.config.settings.infinite) === null || _d === void 0 ? void 0 : _d.backfill) && !this.store.results.length && ((_e = params.pagination) === null || _e === void 0 ? void 0 : _e.page) > 1;
175
+ if (preventBackfill || dontBackfill) {
176
+ this.storage.set('scrollMap', {});
177
+ this.urlManager.set('page', 1).go();
178
+ return [2 /*return*/];
179
+ }
180
+ }
181
+ searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
182
+ return [4 /*yield*/, this.client.search(params)];
183
+ case 8:
184
+ _a = _j.sent(), meta = _a[0], response = _a[1];
185
+ if (!response.meta) {
186
+ /**
187
+ * MockClient will overwrite the client search() method and use
188
+ * SearchData to return mock data which already contains meta data
189
+ */
190
+ response.meta = meta;
191
+ }
192
+ if (!(this.config.settings.infinite && ((_f = params.pagination) === null || _f === void 0 ? void 0 : _f.page) > 1)) return [3 /*break*/, 11];
193
+ previousResults_1 = ((_g = this.store.data) === null || _g === void 0 ? void 0 : _g.results) || [];
194
+ if (!(((_h = this.config.settings) === null || _h === void 0 ? void 0 : _h.infinite.backfill) && !previousResults_1.length)) return [3 /*break*/, 10];
195
+ backfills = [];
196
+ for (page = 1; page < params.pagination.page; page++) {
197
+ backfillParams = (0, deepmerge_1.default)(__assign({}, params), { pagination: { page: page } });
198
+ backfills.push(this.client.search(backfillParams));
199
+ }
200
+ return [4 /*yield*/, Promise.all(backfills)];
201
+ case 9:
202
+ backfillResponses = _j.sent();
203
+ backfillResponses.map(function (_a) {
204
+ var meta = _a[0], data = _a[1];
205
+ previousResults_1 = previousResults_1.concat(data.results);
206
+ });
207
+ _j.label = 10;
208
+ case 10:
209
+ response.results = __spreadArray(__spreadArray([], previousResults_1, true), (response.results || []), true);
210
+ _j.label = 11;
211
+ case 11:
212
+ searchProfile.stop();
213
+ this.log.profile(searchProfile);
214
+ afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params }).start();
215
+ _j.label = 12;
216
+ case 12:
217
+ _j.trys.push([12, 14, , 15]);
218
+ return [4 /*yield*/, this.eventManager.fire('afterSearch', {
219
+ controller: this,
220
+ request: params,
221
+ response: response,
222
+ })];
223
+ case 13:
224
+ _j.sent();
225
+ return [3 /*break*/, 15];
226
+ case 14:
227
+ err_2 = _j.sent();
228
+ if ((err_2 === null || err_2 === void 0 ? void 0 : err_2.message) == 'cancelled') {
229
+ this.log.warn("'afterSearch' middleware cancelled");
230
+ afterSearchProfile.stop();
231
+ return [2 /*return*/];
232
+ }
233
+ else {
234
+ this.log.error("error in 'afterSearch' middleware");
235
+ throw err_2;
236
+ }
237
+ return [3 /*break*/, 15];
238
+ case 15:
239
+ afterSearchProfile.stop();
240
+ this.log.profile(afterSearchProfile);
241
+ // update the store
242
+ this.store.update(response);
243
+ afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start();
244
+ _j.label = 16;
245
+ case 16:
246
+ _j.trys.push([16, 18, , 19]);
247
+ return [4 /*yield*/, this.eventManager.fire('afterStore', {
248
+ controller: this,
249
+ request: params,
250
+ response: response,
251
+ })];
252
+ case 17:
253
+ _j.sent();
254
+ return [3 /*break*/, 19];
255
+ case 18:
256
+ err_3 = _j.sent();
257
+ if ((err_3 === null || err_3 === void 0 ? void 0 : err_3.message) == 'cancelled') {
258
+ this.log.warn("'afterStore' middleware cancelled");
259
+ afterStoreProfile.stop();
260
+ return [2 /*return*/];
261
+ }
262
+ else {
263
+ this.log.error("error in 'afterStore' middleware");
264
+ throw err_3;
265
+ }
266
+ return [3 /*break*/, 19];
267
+ case 19:
268
+ afterStoreProfile.stop();
269
+ this.log.profile(afterStoreProfile);
270
+ return [3 /*break*/, 21];
271
+ case 20:
272
+ err_4 = _j.sent();
273
+ if (err_4) {
274
+ switch (err_4) {
275
+ case 429:
276
+ this.store.error = {
277
+ code: 429,
278
+ type: snap_store_mobx_1.ErrorType.WARNING,
279
+ message: 'Too many requests try again later',
280
+ };
281
+ this.log.warn(this.store.error);
282
+ break;
283
+ case 500:
284
+ this.store.error = {
285
+ code: 500,
286
+ type: snap_store_mobx_1.ErrorType.ERROR,
287
+ message: 'Invalid Search Request or Service Unavailable',
288
+ };
289
+ this.log.error(this.store.error);
290
+ break;
291
+ default:
292
+ this.log.error(err_4);
293
+ break;
294
+ }
295
+ this.store.loading = false;
296
+ }
297
+ return [3 /*break*/, 21];
298
+ case 21: return [2 /*return*/];
299
+ }
300
+ });
301
+ }); };
302
+ // deep merge config with defaults
303
+ _this.config = (0, deepmerge_1.default)(defaultConfig, _this.config);
304
+ _this.store.setConfig(_this.config);
305
+ _this.storage = new snap_store_mobx_1.StorageStore({
306
+ type: snap_store_mobx_1.StorageType.SESSION,
307
+ key: "ss-controller-".concat(_this.config.id),
308
+ });
309
+ // set last params to undefined for compare in search
310
+ _this.storage.set('lastStringyParams', undefined);
311
+ // add 'beforeSearch' middleware
312
+ _this.eventManager.on('beforeSearch', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
313
+ return __generator(this, function (_a) {
314
+ switch (_a.label) {
315
+ case 0:
316
+ search.controller.store.loading = true;
317
+ return [4 /*yield*/, next()];
318
+ case 1:
319
+ _a.sent();
320
+ return [2 /*return*/];
321
+ }
322
+ });
323
+ }); });
324
+ // add 'afterSearch' middleware
325
+ _this.eventManager.on('afterSearch', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
326
+ var config, redirectURL, searchStore;
327
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
328
+ return __generator(this, function (_q) {
329
+ switch (_q.label) {
330
+ case 0:
331
+ config = search.controller.config;
332
+ redirectURL = (_b = (_a = search.response) === null || _a === void 0 ? void 0 : _a.merchandising) === null || _b === void 0 ? void 0 : _b.redirect;
333
+ searchStore = search.controller.store;
334
+ if (redirectURL && ((_d = (_c = config === null || config === void 0 ? void 0 : config.settings) === null || _c === void 0 ? void 0 : _c.redirects) === null || _d === void 0 ? void 0 : _d.merchandising) && !((_f = (_e = search === null || search === void 0 ? void 0 : search.response) === null || _e === void 0 ? void 0 : _e.filters) === null || _f === void 0 ? void 0 : _f.length) && !searchStore.loaded) {
335
+ window.location.replace(redirectURL);
336
+ return [2 /*return*/, false];
337
+ }
338
+ if (((_h = (_g = config === null || config === void 0 ? void 0 : config.settings) === null || _g === void 0 ? void 0 : _g.redirects) === null || _h === void 0 ? void 0 : _h.singleResult) &&
339
+ ((_k = (_j = search === null || search === void 0 ? void 0 : search.response) === null || _j === void 0 ? void 0 : _j.search) === null || _k === void 0 ? void 0 : _k.query) &&
340
+ ((_m = (_l = search === null || search === void 0 ? void 0 : search.response) === null || _l === void 0 ? void 0 : _l.pagination) === null || _m === void 0 ? void 0 : _m.totalResults) === 1 &&
341
+ !((_p = (_o = search === null || search === void 0 ? void 0 : search.response) === null || _o === void 0 ? void 0 : _o.filters) === null || _p === void 0 ? void 0 : _p.length)) {
342
+ window.location.replace(search === null || search === void 0 ? void 0 : search.response.results[0].mappings.core.url);
343
+ return [2 /*return*/, false];
344
+ }
345
+ return [4 /*yield*/, next()];
346
+ case 1:
347
+ _q.sent();
348
+ return [2 /*return*/];
349
+ }
350
+ });
351
+ }); });
352
+ _this.eventManager.on('afterStore', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
353
+ var stringyParams, scrollMap_1, scrollToPosition_1, checkCount_1, heightCheck_1;
354
+ var _this = this;
355
+ var _a;
356
+ return __generator(this, function (_b) {
357
+ switch (_b.label) {
358
+ case 0: return [4 /*yield*/, next()];
359
+ case 1:
360
+ _b.sent();
361
+ search.controller.store.loading = false;
362
+ stringyParams = JSON.stringify(search.request);
363
+ this.storage.set('lastStringyParams', stringyParams);
364
+ if (((_a = this.config.settings) === null || _a === void 0 ? void 0 : _a.infinite) && window.scrollY === 0) {
365
+ scrollMap_1 = this.storage.get('scrollMap') || {};
366
+ scrollToPosition_1 = scrollMap_1[stringyParams];
367
+ if (scrollToPosition_1) {
368
+ checkCount_1 = 0;
369
+ heightCheck_1 = window.setInterval(function () {
370
+ if (document.documentElement.scrollHeight >= scrollToPosition_1) {
371
+ window.scrollTo(0, scrollToPosition_1);
372
+ _this.log.debug('scrolling to: ', scrollMap_1[stringyParams]);
373
+ window.clearInterval(heightCheck_1);
374
+ }
375
+ if (checkCount_1 > 2000 / HEIGHT_CHECK_INTERVAL) {
376
+ window.clearInterval(heightCheck_1);
377
+ }
378
+ checkCount_1++;
379
+ }, HEIGHT_CHECK_INTERVAL);
380
+ }
381
+ }
382
+ return [2 /*return*/];
383
+ }
384
+ });
385
+ }); });
386
+ // attach config plugins and event middleware
387
+ _this.use(_this.config);
388
+ return _this;
389
+ }
390
+ Object.defineProperty(SearchController.prototype, "params", {
391
+ get: function () {
392
+ var _a, _b, _c, _d;
393
+ var params = (0, deepmerge_1.default)(__assign({}, (0, getParams_1.getSearchParams)(this.urlManager.state)), this.config.globals);
394
+ // redirect setting
395
+ if (!((_b = (_a = this.config.settings) === null || _a === void 0 ? void 0 : _a.redirects) === null || _b === void 0 ? void 0 : _b.merchandising) || this.store.loaded) {
396
+ params.search = params.search || {};
397
+ params.search.redirectResponse = 'full';
398
+ }
399
+ params.tracking = params.tracking || {};
400
+ params.tracking.domain = window.location.href;
401
+ var userId = this.tracker.getUserId();
402
+ if (userId) {
403
+ params.tracking.userId = userId;
404
+ }
405
+ if (!((_d = (_c = this.config.globals) === null || _c === void 0 ? void 0 : _c.personalization) === null || _d === void 0 ? void 0 : _d.disabled)) {
406
+ var cartItems = this.tracker.cookies.cart.get();
407
+ if (cartItems.length) {
408
+ params.personalization = params.personalization || {};
409
+ params.personalization.cart = cartItems.join(',');
410
+ }
411
+ var lastViewedItems = this.tracker.cookies.viewed.get();
412
+ if (lastViewedItems.length) {
413
+ params.personalization = params.personalization || {};
414
+ params.personalization.lastViewed = lastViewedItems.join(',');
415
+ }
416
+ var shopperId = this.tracker.getShopperId();
417
+ if (shopperId) {
418
+ params.personalization = params.personalization || {};
419
+ params.personalization.shopper = shopperId;
420
+ }
421
+ }
422
+ return params;
423
+ },
424
+ enumerable: false,
425
+ configurable: true
426
+ });
427
+ return SearchController;
428
+ }(AbstractController_1.AbstractController));
429
+ exports.SearchController = SearchController;
@@ -0,0 +1,7 @@
1
+ export { FinderController } from './Finder/FinderController';
2
+ export { SearchController } from './Search/SearchController';
3
+ export { AutocompleteController } from './Autocomplete/AutocompleteController';
4
+ export { RecommendationController } from './Recommendation/RecommendationController';
5
+ export { AbstractController } from './Abstract/AbstractController';
6
+ export * from './types';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,cAAc,SAAS,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AbstractController = exports.RecommendationController = exports.AutocompleteController = exports.SearchController = exports.FinderController = void 0;
14
+ var FinderController_1 = require("./Finder/FinderController");
15
+ Object.defineProperty(exports, "FinderController", { enumerable: true, get: function () { return FinderController_1.FinderController; } });
16
+ var SearchController_1 = require("./Search/SearchController");
17
+ Object.defineProperty(exports, "SearchController", { enumerable: true, get: function () { return SearchController_1.SearchController; } });
18
+ var AutocompleteController_1 = require("./Autocomplete/AutocompleteController");
19
+ Object.defineProperty(exports, "AutocompleteController", { enumerable: true, get: function () { return AutocompleteController_1.AutocompleteController; } });
20
+ var RecommendationController_1 = require("./Recommendation/RecommendationController");
21
+ Object.defineProperty(exports, "RecommendationController", { enumerable: true, get: function () { return RecommendationController_1.RecommendationController; } });
22
+ var AbstractController_1 = require("./Abstract/AbstractController");
23
+ Object.defineProperty(exports, "AbstractController", { enumerable: true, get: function () { return AbstractController_1.AbstractController; } });
24
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,52 @@
1
+ import type { AbstractController } from './Abstract/AbstractController';
2
+ import type { EventManager, Middleware, Next } from '@searchspring/snap-event-manager';
3
+ import type { Client } from '@searchspring/snap-client';
4
+ import type { AbstractStore, StoreConfig, SearchStoreConfig, FinderStoreConfig, AutocompleteStoreConfig, RecommendationStoreConfig } from '@searchspring/snap-store-mobx';
5
+ import type { Tracker } from '@searchspring/snap-tracker';
6
+ import type { Profiler } from '@searchspring/snap-profiler';
7
+ import type { UrlManager } from '@searchspring/snap-url-manager';
8
+ import type { Logger } from '@searchspring/snap-logger';
9
+ declare global {
10
+ interface Window {
11
+ searchspring?: any;
12
+ }
13
+ }
14
+ export declare type NextEvent = Next;
15
+ export declare type PluginFunction = (cntrlr: AbstractController, ...args: any[]) => Promise<void>;
16
+ export declare type PluginGrouping = [func: PluginFunction, ...args: unknown[]];
17
+ export declare type BeforeSearchObj = {
18
+ controller: AbstractController;
19
+ request: any;
20
+ };
21
+ export declare type AfterSearchObj = {
22
+ controller: AbstractController;
23
+ response: any;
24
+ };
25
+ export declare type AfterStoreObj = {
26
+ controller: AbstractController;
27
+ request: any;
28
+ response: any;
29
+ };
30
+ export declare type ControllerServices = {
31
+ client: Client;
32
+ store: AbstractStore;
33
+ urlManager: UrlManager;
34
+ eventManager: EventManager;
35
+ profiler: Profiler;
36
+ logger: Logger;
37
+ tracker: Tracker;
38
+ };
39
+ export declare type Attachments = {
40
+ middleware?: {
41
+ [eventName: string]: Middleware<unknown> | Middleware<unknown>[];
42
+ };
43
+ plugins?: PluginGrouping[];
44
+ [any: string]: unknown;
45
+ };
46
+ export declare type ControllerConfig = StoreConfig & Attachments;
47
+ export declare type SearchControllerConfig = ControllerConfig & SearchStoreConfig;
48
+ export declare type FinderControllerConfig = ControllerConfig & FinderStoreConfig;
49
+ export declare type AutocompleteControllerConfig = ControllerConfig & AutocompleteStoreConfig;
50
+ export declare type RecommendationControllerConfig = ControllerConfig & RecommendationStoreConfig;
51
+ export declare type ControllerConfigs = SearchControllerConfig | AutocompleteControllerConfig | FinderControllerConfig | RecommendationControllerConfig;
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kCAAkC,CAAC;AAEvF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EACX,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,YAAY,CAAC,EAAE,GAAG,CAAC;KACnB;CACD;AAID,oBAAY,SAAS,GAAG,IAAI,CAAC;AAE7B,oBAAY,cAAc,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,OAAA,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AACpF,oBAAY,cAAc,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAExE,oBAAY,eAAe,GAAG;IAC7B,UAAU,EAAE,kBAAkB,CAAC;IAC/B,OAAO,EAAE,GAAG,CAAC;CACb,CAAC;AAEF,oBAAY,cAAc,GAAG;IAC5B,UAAU,EAAE,kBAAkB,CAAC;IAC/B,QAAQ,EAAE,GAAG,CAAC;CACd,CAAC;AAEF,oBAAY,aAAa,GAAG;IAC3B,UAAU,EAAE,kBAAkB,CAAC;IAC/B,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,GAAG,CAAC;CACd,CAAC;AAEF,oBAAY,kBAAkB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,oBAAY,WAAW,GAAG;IACzB,UAAU,CAAC,EAAE;QACZ,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;KACjE,CAAC;IACF,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AAEF,oBAAY,gBAAgB,GAAG,WAAW,GAAG,WAAW,CAAC;AAGzD,oBAAY,sBAAsB,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAE1E,oBAAY,sBAAsB,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAE1E,oBAAY,4BAA4B,GAAG,gBAAgB,GAAG,uBAAuB,CAAC;AAEtF,oBAAY,8BAA8B,GAAG,gBAAgB,GAAG,yBAAyB,CAAC;AAE1F,oBAAY,iBAAiB,GAAG,sBAAsB,GAAG,4BAA4B,GAAG,sBAAsB,GAAG,8BAA8B,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ export declare function getSearchParams(state: any): Record<string, any>;
2
+ //# sourceMappingURL=getParams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getParams.d.ts","sourceRoot":"","sources":["../../../src/utils/getParams.ts"],"names":[],"mappings":"AAkCA,wBAAgB,eAAe,CAAC,KAAK,KAAA,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAgF1D"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ // translate state to snAPI params
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.getSearchParams = void 0;
5
+ function getSearchParams(state) {
6
+ var params = {};
7
+ if (state.tag) {
8
+ params.merchandising = params.merchandising || {};
9
+ params.merchandising.landingPage = state.tag;
10
+ }
11
+ if (state.query) {
12
+ params.search = params.search || {};
13
+ params.search.query = params.search.query || {};
14
+ params.search.query.string = state.query;
15
+ }
16
+ if (state.rq) {
17
+ params.search = params.search || {};
18
+ params.search.subQuery = state.rq;
19
+ }
20
+ if (state.oq) {
21
+ params.search = params.search || {};
22
+ params.search.originalQuery = state.oq;
23
+ }
24
+ if (state.page) {
25
+ params.pagination = params.pagination || {};
26
+ params.pagination.page = state.page;
27
+ }
28
+ if (state.pageSize) {
29
+ params.pagination = params.pagination || {};
30
+ params.pagination.pageSize = state.pageSize;
31
+ }
32
+ if (state.sort) {
33
+ params.sorts = params.sorts || [];
34
+ var sorts = Array.isArray(state.sort) ? state.sort : [state.sort];
35
+ var sort = sorts[0];
36
+ if (sort && sort.field && sort.direction) {
37
+ params.sorts.push({
38
+ field: sort.field,
39
+ direction: sort.direction,
40
+ });
41
+ }
42
+ }
43
+ if (state.filter) {
44
+ params.filters = params.filters || [];
45
+ Object.keys(state.filter).forEach(function (field) {
46
+ if (typeof field != 'string') {
47
+ return;
48
+ }
49
+ var filter = state.filter[field];
50
+ // ensure values are an array
51
+ var values = Array.isArray(filter) ? filter : [filter];
52
+ values.forEach(function (value) {
53
+ if (typeof value != 'object') {
54
+ params.filters.push({
55
+ type: 'value',
56
+ field: field,
57
+ value: value,
58
+ });
59
+ }
60
+ else if (typeof value.low != 'undefined' && typeof value.high != 'undefined') {
61
+ params.filters.push({
62
+ type: 'range',
63
+ field: field,
64
+ value: value,
65
+ });
66
+ }
67
+ });
68
+ });
69
+ }
70
+ return params;
71
+ }
72
+ exports.getSearchParams = getSearchParams;
@@ -0,0 +1,40 @@
1
+ import { LogMode } from '@searchspring/snap-logger';
2
+ import { DomTargeter } from '@searchspring/snap-toolbox';
3
+ import type { AbstractStore } from '@searchspring/snap-store-mobx';
4
+ import type { UrlManager } from '@searchspring/snap-url-manager';
5
+ import type { EventManager, Middleware } from '@searchspring/snap-event-manager';
6
+ import type { Profiler } from '@searchspring/snap-profiler';
7
+ import type { Logger } from '@searchspring/snap-logger';
8
+ import type { Tracker } from '@searchspring/snap-tracker';
9
+ import type { Target, OnTarget } from '@searchspring/snap-toolbox';
10
+ import type { ControllerServices, ControllerConfig, Attachments } from '../types';
11
+ export declare abstract class AbstractController {
12
+ id: string;
13
+ type: string;
14
+ config: ControllerConfig;
15
+ client: any;
16
+ store: AbstractStore;
17
+ urlManager: UrlManager;
18
+ eventManager: EventManager;
19
+ profiler: Profiler;
20
+ log: Logger;
21
+ tracker: Tracker;
22
+ targeters: {
23
+ [key: string]: DomTargeter;
24
+ };
25
+ private _initialized;
26
+ private _environment;
27
+ get initialized(): boolean;
28
+ constructor(config: ControllerConfig, { client, store, urlManager, eventManager, profiler, logger, tracker }: ControllerServices);
29
+ createTargeter(target: Target, onTarget: OnTarget, document?: Document): DomTargeter;
30
+ addTargeter(target: DomTargeter): DomTargeter;
31
+ set environment(env: LogMode);
32
+ get environment(): LogMode;
33
+ init(): Promise<void>;
34
+ retarget(): void;
35
+ abstract search(): Promise<void>;
36
+ plugin(func: (cntrlr: AbstractController, ...args: any[]) => Promise<void>, ...args: unknown[]): Promise<void>;
37
+ on<T>(event: string, ...func: Middleware<T>[]): void;
38
+ use(attachments: Attachments): void;
39
+ }
40
+ //# sourceMappingURL=AbstractController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractController.d.ts","sourceRoot":"","sources":["../../../src/Abstract/AbstractController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,WAAW,EAAgB,MAAM,4BAA4B,CAAC;AAGvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGlF,8BAAsB,kBAAkB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,SAAc;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,MAAC;IACP,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;KAC3B,CAAM;IAEP,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAsB;IAE1C,IAAI,WAAW,IAAI,OAAO,CAEzB;gBAEW,MAAM,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB;IAyEzH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,WAAW;IAIpF,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW;IASpD,IAAW,WAAW,CAAC,GAAG,EAAE,OAAO,EAKlC;IAED,IAAW,WAAW,IAAI,OAAO,CAEhC;IAEY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C3B,QAAQ,IAAI,IAAI;aAMP,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAE1B,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,OAAA,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7G,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAIpD,GAAG,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;CAoC1C"}