@searchspring/snap-controller 0.73.7 → 0.75.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 (25) hide show
  1. package/dist/cjs/Autocomplete/AutocompleteController.d.ts +0 -1
  2. package/dist/cjs/Autocomplete/AutocompleteController.d.ts.map +1 -1
  3. package/dist/cjs/Autocomplete/AutocompleteController.js +124 -68
  4. package/dist/cjs/Finder/FinderController.d.ts.map +1 -1
  5. package/dist/cjs/Finder/FinderController.js +3 -0
  6. package/dist/cjs/Recommendation/RecommendationController.d.ts.map +1 -1
  7. package/dist/cjs/Recommendation/RecommendationController.js +84 -58
  8. package/dist/cjs/Search/SearchController.d.ts.map +1 -1
  9. package/dist/cjs/Search/SearchController.js +142 -66
  10. package/dist/cjs/utils/isClickWithinProductLink.d.ts +1 -1
  11. package/dist/cjs/utils/isClickWithinProductLink.d.ts.map +1 -1
  12. package/dist/cjs/utils/isClickWithinProductLink.js +14 -12
  13. package/dist/esm/Autocomplete/AutocompleteController.d.ts +0 -1
  14. package/dist/esm/Autocomplete/AutocompleteController.d.ts.map +1 -1
  15. package/dist/esm/Autocomplete/AutocompleteController.js +101 -28
  16. package/dist/esm/Finder/FinderController.d.ts.map +1 -1
  17. package/dist/esm/Finder/FinderController.js +3 -0
  18. package/dist/esm/Recommendation/RecommendationController.d.ts.map +1 -1
  19. package/dist/esm/Recommendation/RecommendationController.js +64 -22
  20. package/dist/esm/Search/SearchController.d.ts.map +1 -1
  21. package/dist/esm/Search/SearchController.js +106 -22
  22. package/dist/esm/utils/isClickWithinProductLink.d.ts +1 -1
  23. package/dist/esm/utils/isClickWithinProductLink.d.ts.map +1 -1
  24. package/dist/esm/utils/isClickWithinProductLink.js +13 -12
  25. package/package.json +10 -10
@@ -88,6 +88,9 @@ var BACKGROUND_FILTERS_VALUE_FLAGS = [1, 0, '1', '0', 'true', 'false', true, fal
88
88
  var defaultConfig = {
89
89
  id: 'search',
90
90
  globals: {},
91
+ beacon: {
92
+ enabled: true,
93
+ },
91
94
  settings: {
92
95
  redirects: {
93
96
  merchandising: true,
@@ -116,9 +119,17 @@ var SearchController = /** @class */ (function (_super) {
116
119
  _this.track = {
117
120
  banner: {
118
121
  impression: function (_a) {
119
- var _b, _c, _d;
122
+ var _b, _c, _d, _e;
120
123
  var uid = _a.uid, responseId = _a.responseId;
121
- if ((_c = (_b = _this.events[responseId]) === null || _b === void 0 ? void 0 : _b.banner[uid]) === null || _c === void 0 ? void 0 : _c.impression) {
124
+ if (!uid) {
125
+ _this.log.warn('No banner provided to track.banner.impression');
126
+ return;
127
+ }
128
+ if (!_this.events[responseId]) {
129
+ _this.log.warn('No responseId found in controller, ensure correct controller is used');
130
+ return;
131
+ }
132
+ else if ((_c = (_b = _this.events[responseId]) === null || _b === void 0 ? void 0 : _b.banner[uid]) === null || _c === void 0 ? void 0 : _c.impression) {
122
133
  return;
123
134
  }
124
135
  var banner = { uid: uid };
@@ -128,13 +139,21 @@ var SearchController = /** @class */ (function (_super) {
128
139
  results: [],
129
140
  };
130
141
  _this.eventManager.fire('track.banner.impression', { controller: _this, product: { uid: uid }, trackEvent: data });
131
- _this.tracker.events[_this.page.type].impression({ data: data, siteId: (_d = _this.config.globals) === null || _d === void 0 ? void 0 : _d.siteId });
142
+ ((_d = _this.config.beacon) === null || _d === void 0 ? void 0 : _d.enabled) && _this.tracker.events[_this.page.type].impression({ data: data, siteId: (_e = _this.config.globals) === null || _e === void 0 ? void 0 : _e.siteId });
132
143
  _this.events[responseId].banner[uid] = _this.events[responseId].banner[uid] || {};
133
144
  _this.events[responseId].banner[uid].impression = true;
134
145
  },
135
146
  click: function (e, banner) {
136
147
  var _a, _b, _c;
148
+ if (!banner) {
149
+ _this.log.warn('No banner provided to track.banner.click');
150
+ return;
151
+ }
137
152
  var responseId = banner.responseId, uid = banner.uid;
153
+ if (!_this.events[responseId]) {
154
+ _this.log.warn('No responseId found in controller, ensure correct controller is used');
155
+ return;
156
+ }
138
157
  if ((0, isClickWithinBannerLink_1.isClickWithinBannerLink)(e)) {
139
158
  if ((_c = (_b = (_a = _this.events) === null || _a === void 0 ? void 0 : _a[responseId]) === null || _b === void 0 ? void 0 : _b.banner[uid]) === null || _c === void 0 ? void 0 : _c.clickThrough) {
140
159
  return;
@@ -148,15 +167,23 @@ var SearchController = /** @class */ (function (_super) {
148
167
  }
149
168
  },
150
169
  clickThrough: function (e, _a) {
151
- var _b;
170
+ var _b, _c;
152
171
  var uid = _a.uid, responseId = _a.responseId;
172
+ if (!uid) {
173
+ _this.log.warn('No banner provided to track.banner.clickThrough');
174
+ return;
175
+ }
176
+ if (!_this.events[responseId]) {
177
+ _this.log.warn('No responseId found in controller, ensure correct controller is used');
178
+ return;
179
+ }
153
180
  var banner = { uid: uid };
154
181
  var data = {
155
182
  responseId: responseId,
156
183
  banners: [banner],
157
184
  };
158
185
  _this.eventManager.fire('track.banner.clickThrough', { controller: _this, event: e, product: { uid: uid }, trackEvent: data });
159
- _this.tracker.events[_this.page.type].clickThrough({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
186
+ ((_b = _this.config.beacon) === null || _b === void 0 ? void 0 : _b.enabled) && _this.tracker.events[_this.page.type].clickThrough({ data: data, siteId: (_c = _this.config.globals) === null || _c === void 0 ? void 0 : _c.siteId });
160
187
  _this.events[responseId].banner[uid] = _this.events[responseId].banner[uid] || {};
161
188
  _this.events[responseId].banner[uid].clickThrough = true;
162
189
  setTimeout(function () {
@@ -166,8 +193,16 @@ var SearchController = /** @class */ (function (_super) {
166
193
  },
167
194
  product: {
168
195
  clickThrough: function (e, result) {
169
- var _a, _b, _c, _d, _e, _f;
196
+ var _a, _b, _c, _d, _e, _f, _g, _h;
197
+ if (!result) {
198
+ _this.log.warn('No result provided to track.product.clickThrough');
199
+ return;
200
+ }
170
201
  var responseId = result.responseId;
202
+ if (!_this.events[responseId]) {
203
+ _this.log.warn('No responseId found in controller, ensure correct controller is used');
204
+ return;
205
+ }
171
206
  var target = e.target;
172
207
  var resultHref = ((_b = (_a = result.display) === null || _a === void 0 ? void 0 : _a.mappings.core) === null || _b === void 0 ? void 0 : _b.url) || ((_c = result.mappings.core) === null || _c === void 0 ? void 0 : _c.url) || '';
173
208
  var elemHref = target === null || target === void 0 ? void 0 : target.getAttribute('href');
@@ -194,22 +229,31 @@ var SearchController = /** @class */ (function (_super) {
194
229
  }
195
230
  // store position data or empty object
196
231
  _this.storage.set('scrollMap', scrollMap);
197
- var item = {
198
- type: result.type,
199
- uid: result.id,
200
- parentId: result.id,
201
- sku: (_e = result.mappings.core) === null || _e === void 0 ? void 0 : _e.sku,
202
- };
232
+ var type = (['product', 'banner'].includes(result.type) ? result.type : 'product');
233
+ var item = __assign({ type: type, uid: result.id ? '' + result.id : '' }, (type === 'product'
234
+ ? {
235
+ parentId: result.id ? '' + result.id : '',
236
+ sku: ((_e = result.mappings.core) === null || _e === void 0 ? void 0 : _e.sku) ? '' + ((_f = result.mappings.core) === null || _f === void 0 ? void 0 : _f.sku) : undefined,
237
+ }
238
+ : {}));
203
239
  var data = {
204
240
  responseId: responseId,
205
241
  results: [item],
206
242
  };
207
243
  _this.eventManager.fire('track.product.clickThrough', { controller: _this, event: e, product: result, trackEvent: data });
208
- _this.tracker.events[_this.page.type].clickThrough({ data: data, siteId: (_f = _this.config.globals) === null || _f === void 0 ? void 0 : _f.siteId });
244
+ ((_g = _this.config.beacon) === null || _g === void 0 ? void 0 : _g.enabled) && _this.tracker.events[_this.page.type].clickThrough({ data: data, siteId: (_h = _this.config.globals) === null || _h === void 0 ? void 0 : _h.siteId });
209
245
  },
210
246
  click: function (e, result) {
211
247
  var _a, _b, _c, _d, _e, _f;
248
+ if (!result) {
249
+ _this.log.warn('No result provided to track.product.click');
250
+ return;
251
+ }
212
252
  var responseId = result.responseId;
253
+ if (!_this.events[responseId]) {
254
+ _this.log.warn('No responseId found in controller, ensure correct controller is used');
255
+ return;
256
+ }
213
257
  if (result.type === 'banner' && (0, isClickWithinBannerLink_1.isClickWithinBannerLink)(e)) {
214
258
  if ((_c = (_b = (_a = _this.events) === null || _a === void 0 ? void 0 : _a[responseId]) === null || _b === void 0 ? void 0 : _b.product[result.id]) === null || _c === void 0 ? void 0 : _c.inlineBannerClickThrough) {
215
259
  return;
@@ -234,30 +278,47 @@ var SearchController = /** @class */ (function (_super) {
234
278
  }
235
279
  },
236
280
  impression: function (result) {
237
- var _a, _b, _c, _d;
281
+ var _a, _b, _c, _d, _e, _f;
282
+ if (!result) {
283
+ _this.log.warn('No result provided to track.product.impression');
284
+ return;
285
+ }
238
286
  var responseId = result.responseId;
239
- if ((_b = (_a = _this.events[responseId]) === null || _a === void 0 ? void 0 : _a.product[result.id]) === null || _b === void 0 ? void 0 : _b.impression) {
287
+ if (!_this.events[responseId]) {
288
+ _this.log.warn('No responseId found in controller, ensure correct controller is used');
240
289
  return;
241
290
  }
242
- var item = {
243
- type: result.type,
244
- uid: result.id,
245
- parentId: result.id,
246
- sku: (_c = result.mappings.core) === null || _c === void 0 ? void 0 : _c.sku,
247
- };
291
+ else if ((_b = (_a = _this.events[responseId]) === null || _a === void 0 ? void 0 : _a.product[result.id]) === null || _b === void 0 ? void 0 : _b.impression) {
292
+ return;
293
+ }
294
+ var type = (['product', 'banner'].includes(result.type) ? result.type : 'product');
295
+ var item = __assign({ type: type, uid: result.id ? '' + result.id : '' }, (type === 'product'
296
+ ? {
297
+ parentId: result.id ? '' + result.id : '',
298
+ sku: ((_c = result.mappings.core) === null || _c === void 0 ? void 0 : _c.sku) ? '' + ((_d = result.mappings.core) === null || _d === void 0 ? void 0 : _d.sku) : undefined,
299
+ }
300
+ : {}));
248
301
  var data = {
249
302
  responseId: responseId,
250
303
  results: [item],
251
304
  banners: [],
252
305
  };
253
306
  _this.eventManager.fire('track.product.impression', { controller: _this, product: result, trackEvent: data });
254
- _this.tracker.events[_this.page.type].impression({ data: data, siteId: (_d = _this.config.globals) === null || _d === void 0 ? void 0 : _d.siteId });
307
+ ((_e = _this.config.beacon) === null || _e === void 0 ? void 0 : _e.enabled) && _this.tracker.events[_this.page.type].impression({ data: data, siteId: (_f = _this.config.globals) === null || _f === void 0 ? void 0 : _f.siteId });
255
308
  _this.events[responseId].product[result.id] = _this.events[responseId].product[result.id] || {};
256
309
  _this.events[responseId].product[result.id].impression = true;
257
310
  },
258
311
  addToCart: function (result) {
259
- var _a, _b, _c;
312
+ var _a, _b, _c, _d;
313
+ if (!result) {
314
+ _this.log.warn('No result provided to track.product.addToCart');
315
+ return;
316
+ }
260
317
  var responseId = result.responseId;
318
+ if (!_this.events[responseId]) {
319
+ _this.log.warn('No responseId found in controller, ensure correct controller is used');
320
+ return;
321
+ }
261
322
  var product = {
262
323
  parentId: result.id,
263
324
  uid: result.id,
@@ -270,34 +331,38 @@ var SearchController = /** @class */ (function (_super) {
270
331
  results: [product],
271
332
  };
272
333
  _this.eventManager.fire('track.product.addToCart', { controller: _this, product: result, trackEvent: data });
273
- _this.tracker.events[_this.page.type].addToCart({ data: data, siteId: (_c = _this.config.globals) === null || _c === void 0 ? void 0 : _c.siteId });
334
+ ((_c = _this.config.beacon) === null || _c === void 0 ? void 0 : _c.enabled) && _this.tracker.events[_this.page.type].addToCart({ data: data, siteId: (_d = _this.config.globals) === null || _d === void 0 ? void 0 : _d.siteId });
274
335
  },
275
336
  },
276
337
  redirect: function (_a) {
277
- var _b;
338
+ var _b, _c;
278
339
  var redirectURL = _a.redirectURL, responseId = _a.responseId;
340
+ if (!redirectURL) {
341
+ _this.log.warn('No redirectURL provided to track.redirect');
342
+ return;
343
+ }
279
344
  var data = {
280
345
  responseId: responseId,
281
346
  redirect: redirectURL,
282
347
  };
283
348
  _this.eventManager.fire('track.redirect', { controller: _this, redirectURL: redirectURL, trackEvent: data });
284
- _this.tracker.events.search.redirect({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
349
+ ((_b = _this.config.beacon) === null || _b === void 0 ? void 0 : _b.enabled) && _this.tracker.events.search.redirect({ data: data, siteId: (_c = _this.config.globals) === null || _c === void 0 ? void 0 : _c.siteId });
285
350
  },
286
351
  };
287
352
  _this.search = function () { return __awaiter(_this, void 0, void 0, function () {
288
- var params_1, err_1, stringyParams, prevStringyParams, searchProfile, meta, response, preventBackfill, dontBackfill, backfillRequestsParams_1, backfillRequests, backfillResponses, backfillResults, responseId, responseId, afterSearchProfile, err_2, afterStoreProfile, err_3, err_4;
353
+ var params_1, err_1, stringyParams, prevStringyParams, searchProfile, meta, response, preventBackfill, dontBackfill, backfillRequestsParams_1, backfillRequests, backfillResponses, backfillResults, responseId, responseId, afterSearchProfile, err_2, data, afterStoreProfile, err_3, err_4;
289
354
  var _a, _b;
290
355
  var _this = this;
291
- var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
292
- return __generator(this, function (_o) {
293
- switch (_o.label) {
356
+ var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
357
+ return __generator(this, function (_q) {
358
+ switch (_q.label) {
294
359
  case 0:
295
- _o.trys.push([0, 22, 23, 24]);
360
+ _q.trys.push([0, 22, 23, 24]);
296
361
  if (!!this.initialized) return [3 /*break*/, 2];
297
362
  return [4 /*yield*/, this.init()];
298
363
  case 1:
299
- _o.sent();
300
- _o.label = 2;
364
+ _q.sent();
365
+ _q.label = 2;
301
366
  case 2:
302
367
  params_1 = this.params;
303
368
  if (((_d = (_c = params_1.search) === null || _c === void 0 ? void 0 : _c.query) === null || _d === void 0 ? void 0 : _d.string) && ((_f = (_e = params_1.search) === null || _e === void 0 ? void 0 : _e.query) === null || _f === void 0 ? void 0 : _f.string.length)) {
@@ -305,18 +370,18 @@ var SearchController = /** @class */ (function (_super) {
305
370
  this.store.history.save(params_1.search.query.string);
306
371
  }
307
372
  this.store.loading = true;
308
- _o.label = 3;
373
+ _q.label = 3;
309
374
  case 3:
310
- _o.trys.push([3, 5, , 6]);
375
+ _q.trys.push([3, 5, , 6]);
311
376
  return [4 /*yield*/, this.eventManager.fire('beforeSearch', {
312
377
  controller: this,
313
378
  request: params_1,
314
379
  })];
315
380
  case 4:
316
- _o.sent();
381
+ _q.sent();
317
382
  return [3 /*break*/, 6];
318
383
  case 5:
319
- err_1 = _o.sent();
384
+ err_1 = _q.sent();
320
385
  if ((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) == 'cancelled') {
321
386
  this.log.warn("'beforeSearch' middleware cancelled");
322
387
  return [2 /*return*/];
@@ -366,7 +431,7 @@ var SearchController = /** @class */ (function (_super) {
366
431
  });
367
432
  return [4 /*yield*/, Promise.all(backfillRequests)];
368
433
  case 7:
369
- backfillResponses = _o.sent();
434
+ backfillResponses = _q.sent();
370
435
  // backfillResponses are [meta, searchResponse][]
371
436
  // set the meta and response to the first page of backfillResponses
372
437
  meta = backfillResponses[0][0];
@@ -385,12 +450,12 @@ var SearchController = /** @class */ (function (_super) {
385
450
  case 8: return [4 /*yield*/, this.client[this.page.type](params_1)];
386
451
  case 9:
387
452
  // infinite with no backfills.
388
- _a = _o.sent(), meta = _a[0], response = _a[1];
453
+ _a = _q.sent(), meta = _a[0], response = _a[1];
389
454
  responseId = response.tracking.responseId;
390
455
  this.events[responseId] = this.events[responseId] || { product: {}, banner: {} };
391
456
  // append new results to previous results
392
457
  response.results = __spreadArray(__spreadArray([], this.previousResults, true), (response.results || []), true);
393
- _o.label = 10;
458
+ _q.label = 10;
394
459
  case 10: return [3 /*break*/, 13];
395
460
  case 11:
396
461
  // normal request
@@ -398,10 +463,10 @@ var SearchController = /** @class */ (function (_super) {
398
463
  this.previousResults = [];
399
464
  return [4 /*yield*/, this.client[this.page.type](params_1)];
400
465
  case 12:
401
- _b = _o.sent(), meta = _b[0], response = _b[1];
466
+ _b = _q.sent(), meta = _b[0], response = _b[1];
402
467
  responseId = response.tracking.responseId;
403
468
  this.events[responseId] = { product: {}, banner: {} };
404
- _o.label = 13;
469
+ _q.label = 13;
405
470
  case 13:
406
471
  // MockClient will overwrite the client search() method and use SearchData to return mock data which already contains meta data
407
472
  if (!response.meta) {
@@ -410,19 +475,19 @@ var SearchController = /** @class */ (function (_super) {
410
475
  searchProfile.stop();
411
476
  this.log.profile(searchProfile);
412
477
  afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params_1 }).start();
413
- _o.label = 14;
478
+ _q.label = 14;
414
479
  case 14:
415
- _o.trys.push([14, 16, , 17]);
480
+ _q.trys.push([14, 16, , 17]);
416
481
  return [4 /*yield*/, this.eventManager.fire('afterSearch', {
417
482
  controller: this,
418
483
  request: params_1,
419
484
  response: response,
420
485
  })];
421
486
  case 15:
422
- _o.sent();
487
+ _q.sent();
423
488
  return [3 /*break*/, 17];
424
489
  case 16:
425
- err_2 = _o.sent();
490
+ err_2 = _q.sent();
426
491
  if ((err_2 === null || err_2 === void 0 ? void 0 : err_2.message) == 'cancelled') {
427
492
  this.log.warn("'afterSearch' middleware cancelled");
428
493
  afterSearchProfile.stop();
@@ -440,20 +505,22 @@ var SearchController = /** @class */ (function (_super) {
440
505
  this.previousResults = JSON.parse(JSON.stringify(response.results));
441
506
  // update the store
442
507
  this.store.update(response);
508
+ data = { responseId: response.tracking.responseId };
509
+ ((_o = this.config.beacon) === null || _o === void 0 ? void 0 : _o.enabled) && this.tracker.events[this.page.type].render({ data: data, siteId: (_p = this.config.globals) === null || _p === void 0 ? void 0 : _p.siteId });
443
510
  afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params_1 }).start();
444
- _o.label = 18;
511
+ _q.label = 18;
445
512
  case 18:
446
- _o.trys.push([18, 20, , 21]);
513
+ _q.trys.push([18, 20, , 21]);
447
514
  return [4 /*yield*/, this.eventManager.fire('afterStore', {
448
515
  controller: this,
449
516
  request: params_1,
450
517
  response: response,
451
518
  })];
452
519
  case 19:
453
- _o.sent();
520
+ _q.sent();
454
521
  return [3 /*break*/, 21];
455
522
  case 20:
456
- err_3 = _o.sent();
523
+ err_3 = _q.sent();
457
524
  if ((err_3 === null || err_3 === void 0 ? void 0 : err_3.message) == 'cancelled') {
458
525
  this.log.warn("'afterStore' middleware cancelled");
459
526
  afterStoreProfile.stop();
@@ -469,7 +536,7 @@ var SearchController = /** @class */ (function (_super) {
469
536
  this.log.profile(afterStoreProfile);
470
537
  return [3 /*break*/, 24];
471
538
  case 22:
472
- err_4 = _o.sent();
539
+ err_4 = _q.sent();
473
540
  if (err_4) {
474
541
  if (err_4.err && err_4.fetchDetails) {
475
542
  switch (err_4.fetchDetails.status) {
@@ -521,7 +588,11 @@ var SearchController = /** @class */ (function (_super) {
521
588
  var products;
522
589
  var _this = this;
523
590
  return __generator(this, function (_a) {
524
- products = typeof _products.slice == 'function' ? _products.slice() : [_products];
591
+ products = typeof (_products === null || _products === void 0 ? void 0 : _products.slice) == 'function' ? _products.slice() : [_products];
592
+ if (!_products || products.length === 0) {
593
+ this.log.warn('No products provided to search controller.addToCart');
594
+ return [2 /*return*/];
595
+ }
525
596
  products.forEach(function (product) {
526
597
  _this.track.product.addToCart(product);
527
598
  });
@@ -681,23 +752,20 @@ var SearchController = /** @class */ (function (_super) {
681
752
  }); });
682
753
  }
683
754
  _this.eventManager.on('afterStore', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
684
- var controller, responseId, data, config_1, nonBackgroundFilters;
685
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
686
- return __generator(this, function (_k) {
687
- switch (_k.label) {
755
+ var controller, config_1, nonBackgroundFilters;
756
+ var _a, _b, _c, _d, _e, _f, _g, _h;
757
+ return __generator(this, function (_j) {
758
+ switch (_j.label) {
688
759
  case 0: return [4 /*yield*/, next()];
689
760
  case 1:
690
- _k.sent();
761
+ _j.sent();
691
762
  controller = search.controller;
692
- responseId = search.response.tracking.responseId;
693
763
  if (controller.store.loaded && !controller.store.error) {
694
- data = { responseId: responseId };
695
- this.tracker.events[this.page.type].render({ data: data, siteId: (_a = this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
696
764
  config_1 = search.controller.config;
697
- nonBackgroundFilters = (_c = (_b = search === null || search === void 0 ? void 0 : search.request) === null || _b === void 0 ? void 0 : _b.filters) === null || _c === void 0 ? void 0 : _c.filter(function (filter) { return !filter.background; });
698
- if (((_e = (_d = config_1 === null || config_1 === void 0 ? void 0 : config_1.settings) === null || _d === void 0 ? void 0 : _d.redirects) === null || _e === void 0 ? void 0 : _e.singleResult) &&
699
- ((_g = (_f = search === null || search === void 0 ? void 0 : search.response) === null || _f === void 0 ? void 0 : _f.search) === null || _g === void 0 ? void 0 : _g.query) &&
700
- ((_j = (_h = search === null || search === void 0 ? void 0 : search.response) === null || _h === void 0 ? void 0 : _h.pagination) === null || _j === void 0 ? void 0 : _j.totalResults) === 1 &&
765
+ nonBackgroundFilters = (_b = (_a = search === null || search === void 0 ? void 0 : search.request) === null || _a === void 0 ? void 0 : _a.filters) === null || _b === void 0 ? void 0 : _b.filter(function (filter) { return !filter.background; });
766
+ if (((_d = (_c = config_1 === null || config_1 === void 0 ? void 0 : config_1.settings) === null || _c === void 0 ? void 0 : _c.redirects) === null || _d === void 0 ? void 0 : _d.singleResult) &&
767
+ ((_f = (_e = search === null || search === void 0 ? void 0 : search.response) === null || _e === void 0 ? void 0 : _e.search) === null || _f === void 0 ? void 0 : _f.query) &&
768
+ ((_h = (_g = search === null || search === void 0 ? void 0 : search.response) === null || _g === void 0 ? void 0 : _g.pagination) === null || _h === void 0 ? void 0 : _h.totalResults) === 1 &&
701
769
  !(nonBackgroundFilters === null || nonBackgroundFilters === void 0 ? void 0 : nonBackgroundFilters.length)) {
702
770
  window.location.replace(search === null || search === void 0 ? void 0 : search.response.results[0].mappings.core.url);
703
771
  return [2 /*return*/, false];
@@ -884,8 +952,16 @@ function generateHrefSelector(element, href, levels) {
884
952
  var level = 0;
885
953
  var elem = element;
886
954
  while (elem && level <= levels) {
887
- // check within
888
- var innerHrefElem = elem.querySelector("[href*=\"".concat(href, "\"]"));
955
+ var innerHrefElem = null;
956
+ try {
957
+ innerHrefElem = elem.querySelector("[href*=\"".concat(href, "\"]"));
958
+ }
959
+ catch (e) {
960
+ try {
961
+ innerHrefElem = elem.querySelector((0, css_escape_1.default)("[href*=\"".concat(href, "\"]")));
962
+ }
963
+ catch (_a) { }
964
+ }
889
965
  if (innerHrefElem) {
890
966
  // innerHrefElem was found! now get selectors up to elem that contained it
891
967
  var selector = '';
@@ -1,5 +1,5 @@
1
1
  import type { Product } from '@searchspring/snap-store-mobx';
2
- export declare const CLICK_DUPLICATION_TIMEOUT = 300;
2
+ export declare const CLICK_DUPLICATION_TIMEOUT = 1000;
3
3
  export declare const CLICK_THROUGH_CLOSEST_MAX_LEVELS = 12;
4
4
  export declare const isClickWithinProductLink: (e: MouseEvent, result: Product) => boolean;
5
5
  //# sourceMappingURL=isClickWithinProductLink.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isClickWithinProductLink.d.ts","sourceRoot":"","sources":["../../../src/utils/isClickWithinProductLink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAE7D,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,eAAO,MAAM,wBAAwB,MAAO,UAAU,UAAU,OAAO,KAAG,OAgBzE,CAAC"}
1
+ {"version":3,"file":"isClickWithinProductLink.d.ts","sourceRoot":"","sources":["../../../src/utils/isClickWithinProductLink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAE7D,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAC9C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,eAAO,MAAM,wBAAwB,MAAO,UAAU,UAAU,OAAO,KAAG,OAoBzE,CAAC"}
@@ -1,22 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isClickWithinProductLink = exports.CLICK_THROUGH_CLOSEST_MAX_LEVELS = exports.CLICK_DUPLICATION_TIMEOUT = void 0;
4
- exports.CLICK_DUPLICATION_TIMEOUT = 300;
4
+ exports.CLICK_DUPLICATION_TIMEOUT = 1000;
5
5
  exports.CLICK_THROUGH_CLOSEST_MAX_LEVELS = 12;
6
6
  var isClickWithinProductLink = function (e, result) {
7
7
  var _a, _b, _c;
8
- var currentElement = e.target;
9
- var href = null;
10
- var level = 0;
11
- var resultCoreUrl = ((_b = (_a = result === null || result === void 0 ? void 0 : result.display) === null || _a === void 0 ? void 0 : _a.mappings.core) === null || _b === void 0 ? void 0 : _b.url) || '';
12
- var resultDisplayUrl = ((_c = result === null || result === void 0 ? void 0 : result.mappings.core) === null || _c === void 0 ? void 0 : _c.url) || '';
13
- while (currentElement && level < exports.CLICK_THROUGH_CLOSEST_MAX_LEVELS) {
14
- href = currentElement.getAttribute('href');
15
- if (href && ((resultCoreUrl && href.includes(resultCoreUrl)) || (resultDisplayUrl && href.includes(resultDisplayUrl)))) {
16
- return true;
8
+ var resultDisplayUrl = ((_b = (_a = result === null || result === void 0 ? void 0 : result.display) === null || _a === void 0 ? void 0 : _a.mappings.core) === null || _b === void 0 ? void 0 : _b.url) || '';
9
+ var resultCoreUrl = ((_c = result === null || result === void 0 ? void 0 : result.mappings.core) === null || _c === void 0 ? void 0 : _c.url) || '';
10
+ // Get the composed path to handle shadow DOM elements
11
+ var path = e.composedPath ? e.composedPath() : [e.target];
12
+ // Check up to CLICK_THROUGH_CLOSEST_MAX_LEVELS elements in the path
13
+ var elementsToCheck = path.slice(0, exports.CLICK_THROUGH_CLOSEST_MAX_LEVELS);
14
+ for (var _i = 0, elementsToCheck_1 = elementsToCheck; _i < elementsToCheck_1.length; _i++) {
15
+ var element = elementsToCheck_1[_i];
16
+ if (element instanceof Element) {
17
+ var href = element.getAttribute('href');
18
+ if (href && ((resultCoreUrl && href.includes(resultCoreUrl)) || (resultDisplayUrl && href.includes(resultDisplayUrl)))) {
19
+ return true;
20
+ }
17
21
  }
18
- currentElement = currentElement.parentElement;
19
- level++;
20
22
  }
21
23
  return false;
22
24
  };
@@ -28,7 +28,6 @@ export declare class AutocompleteController extends AbstractController {
28
28
  store: AutocompleteStore;
29
29
  config: AutocompleteControllerConfig;
30
30
  storage: StorageStore;
31
- private lastSearchQuery;
32
31
  private events;
33
32
  constructor(config: AutocompleteControllerConfig, { client, store, urlManager, eventManager, profiler, logger, tracker }: ControllerServices, context?: ContextVariables);
34
33
  track: AutocompleteTrackMethods;
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAa,OAAO,EAAE,MAAM,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AACrH,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAA6C,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE9I,OAAO,KAAK,EAAE,wBAAwB,EAA4C,MAAM,2BAA2B,CAAC;AAkBpH,eAAO,MAAM,WAAW,MAAM,CAAC;AA+B/B,KAAK,wBAAwB,GAAG;IAC/B,MAAM,EAAE;QACP,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,0BAA0B,KAAK,IAAI,CAAC;QAChF,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,0BAA0B,KAAK,IAAI,CAAC;QACvF,UAAU,EAAE,CAAC,mBAAmB,EAAE,0BAA0B,KAAK,IAAI,CAAC;KACtE,CAAC;IACF,OAAO,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QAChE,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QACzD,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QAC/C,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;KACtC,CAAC;IACF,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC7F,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;IAC7B,OAAO,CAAC,eAAe,CAAqB;IAE5C,OAAO,CAAC,MAAM,CAgBP;gBAGN,MAAM,EAAE,4BAA4B,EACpC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAwE3B,KAAK,EAAE,wBAAwB,CAwI7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CAkDrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBAiDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCA+ChD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,KAAK;;;;uBA0DL,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgF3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAwBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CA+J9B;IAEF,SAAS,cAAqB,OAAO,EAAE,GAAG,OAAO,KAAG,QAAQ,IAAI,CAAC,CAQ/D;CACF"}
1
+ {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAa,OAAO,EAAE,MAAM,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AACrH,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAA6C,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE9I,OAAO,KAAK,EAAE,wBAAwB,EAA4C,MAAM,2BAA2B,CAAC;AAkBpH,eAAO,MAAM,WAAW,MAAM,CAAC;AAkC/B,KAAK,wBAAwB,GAAG;IAC/B,MAAM,EAAE;QACP,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,0BAA0B,KAAK,IAAI,CAAC;QAChF,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,0BAA0B,KAAK,IAAI,CAAC;QACvF,UAAU,EAAE,CAAC,mBAAmB,EAAE,0BAA0B,KAAK,IAAI,CAAC;KACtE,CAAC;IACF,OAAO,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QAChE,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QACzD,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QAC/C,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;KACtC,CAAC;IACF,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC7F,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;IAE7B,OAAO,CAAC,MAAM,CAgBP;gBAGN,MAAM,EAAE,4BAA4B,EACpC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IA8D3B,KAAK,EAAE,wBAAwB,CA8N7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CAkDrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBAiDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCA+ChD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,KAAK;;;;uBA0DL,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgF3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAwBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAqK9B;IAEF,SAAS,cAAqB,OAAO,EAAE,GAAG,OAAO,KAAG,QAAQ,IAAI,CAAC,CAY/D;CACF"}