@searchspring/snap-controller 0.41.2 → 0.42.1
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/dist/cjs/Autocomplete/AutocompleteController.d.ts.map +1 -1
- package/dist/cjs/Autocomplete/AutocompleteController.js +6 -0
- package/dist/cjs/Search/SearchController.d.ts.map +1 -1
- package/dist/cjs/Search/SearchController.js +120 -37
- package/dist/cjs/types.d.ts +11 -1
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/Autocomplete/AutocompleteController.d.ts.map +1 -1
- package/dist/esm/Autocomplete/AutocompleteController.js +5 -0
- package/dist/esm/Search/SearchController.d.ts.map +1 -1
- package/dist/esm/Search/SearchController.js +84 -32
- package/dist/esm/types.d.ts +11 -1
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAA8C,MAAM,+BAA+B,CAAC;AACzG,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,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEnJ,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAG1E,eAAO,MAAM,WAAW,MAAM,CAAC;AA0B/B,aAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,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;IA6D3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;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;wBAkDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCAgDhD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,aAAa,KAAG,IAAI;;;;uBAiDpB,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAA8C,MAAM,+BAA+B,CAAC;AACzG,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,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEnJ,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAG1E,eAAO,MAAM,WAAW,MAAM,CAAC;AA0B/B,aAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,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;IA6D3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;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;wBAkDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCAgDhD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,aAAa,KAAG,IAAI;;;;uBAiDpB,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0E3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAwBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAiH9B;CACF"}
|
|
@@ -709,6 +709,8 @@ var AutocompleteController = /** @class */ (function (_super) {
|
|
|
709
709
|
var _a, _b, _c;
|
|
710
710
|
input.setAttribute('spellcheck', 'false');
|
|
711
711
|
input.setAttribute('autocomplete', 'off');
|
|
712
|
+
input.setAttribute('autocorrect', 'off');
|
|
713
|
+
input.setAttribute('autocapitalize', 'none');
|
|
712
714
|
input.setAttribute(INPUT_ATTRIBUTE, '');
|
|
713
715
|
input.addEventListener('keyup', _this.handlers.input.keyUp);
|
|
714
716
|
if (((_b = (_a = _this.config) === null || _a === void 0 ? void 0 : _a.settings) === null || _b === void 0 ? void 0 : _b.initializeFromUrl) && !input.value && _this.store.state.input) {
|
|
@@ -759,10 +761,14 @@ var AutocompleteController = /** @class */ (function (_super) {
|
|
|
759
761
|
}(AbstractController_1.AbstractController));
|
|
760
762
|
exports.AutocompleteController = AutocompleteController;
|
|
761
763
|
function addHiddenFormInput(form, name, value) {
|
|
764
|
+
var _a;
|
|
762
765
|
var inputElem = document.createElement('input');
|
|
763
766
|
inputElem.type = 'hidden';
|
|
764
767
|
inputElem.name = name;
|
|
765
768
|
inputElem.value = value;
|
|
769
|
+
// remove existing form element if it exists (prevent duplicates)
|
|
770
|
+
(_a = form.querySelector("[type=\"hidden\"][name=\"".concat(name, "\"]"))) === null || _a === void 0 ? void 0 : _a.remove();
|
|
771
|
+
// append form element
|
|
766
772
|
form.append(inputElem);
|
|
767
773
|
}
|
|
768
774
|
function timeout(time) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EACX,sBAAsB,EAItB,kBAAkB,EAClB,gBAAgB,EAGhB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,kBAAkB,EAA2E,MAAM,2BAA2B,CAAC;AAsB7I,aAAK,kBAAkB,GAAG;IACzB,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;KAC/D,CAAC;CACF,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,kBAAkB;IAChD,IAAI,kBAA0B;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,sBAAsB,CAAC;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,eAAe,CAAwC;gBAG9D,MAAM,EAAE,sBAAsB,EAC9B,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAqI3B,KAAK,EAAE,kBAAkB,CAoCvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CAmO9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF"}
|
|
@@ -103,7 +103,7 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
103
103
|
function SearchController(config, _a, context) {
|
|
104
104
|
var client = _a.client, store = _a.store, urlManager = _a.urlManager, eventManager = _a.eventManager, profiler = _a.profiler, logger = _a.logger, tracker = _a.tracker;
|
|
105
105
|
var _this = this;
|
|
106
|
-
var _b;
|
|
106
|
+
var _b, _c, _d;
|
|
107
107
|
_this = _super.call(this, config, { client: client, store: store, urlManager: urlManager, eventManager: eventManager, profiler: profiler, logger: logger, tracker: tracker }, context) || this;
|
|
108
108
|
_this.type = types_1.ControllerTypes.search;
|
|
109
109
|
_this.previousResults = [];
|
|
@@ -111,20 +111,23 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
111
111
|
product: {
|
|
112
112
|
click: function (e, result) {
|
|
113
113
|
var _a, _b;
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
114
|
+
var target = e.target;
|
|
115
|
+
var href = (target === null || target === void 0 ? void 0 : target.getAttribute('href')) || ((_a = result.mappings.core) === null || _a === void 0 ? void 0 : _a.url);
|
|
116
|
+
var scrollMap = {};
|
|
117
|
+
// generate the selector using element class and parent classes
|
|
118
|
+
var selector = generateHrefSelector(target, href);
|
|
119
|
+
var domRect = selector ? (_b = document === null || document === void 0 ? void 0 : document.querySelector(selector)) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect() : undefined;
|
|
120
|
+
// store element position data to scrollMap
|
|
121
|
+
if (selector && href && domRect) {
|
|
122
|
+
var stringyParams = JSON.parse(_this.storage.get('lastStringyParams'));
|
|
118
123
|
var storableRequestParams = getStorableRequestParams(stringyParams);
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
scrollMap[stringyParams] = window.scrollY;
|
|
122
|
-
_this.storage.set('scrollMap', scrollMap);
|
|
124
|
+
var storableStringyParams = JSON.stringify(storableRequestParams);
|
|
125
|
+
scrollMap[storableStringyParams] = { domRect: domRect, href: href, selector: selector };
|
|
123
126
|
}
|
|
127
|
+
// store position data or empty object
|
|
128
|
+
_this.storage.set('scrollMap', scrollMap);
|
|
124
129
|
// track
|
|
125
130
|
var _c = result.attributes, intellisuggestData = _c.intellisuggestData, intellisuggestSignature = _c.intellisuggestSignature;
|
|
126
|
-
var target = e.target;
|
|
127
|
-
var href = (target === null || target === void 0 ? void 0 : target.href) || ((_b = result.mappings.core) === null || _b === void 0 ? void 0 : _b.url) || undefined;
|
|
128
131
|
var event = _this.tracker.track.product.click({
|
|
129
132
|
intellisuggestData: intellisuggestData,
|
|
130
133
|
intellisuggestSignature: intellisuggestSignature,
|
|
@@ -378,8 +381,9 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
378
381
|
}); };
|
|
379
382
|
// deep merge config with defaults
|
|
380
383
|
_this.config = (0, deepmerge_1.default)(defaultConfig, _this.config);
|
|
381
|
-
|
|
382
|
-
|
|
384
|
+
// set restorePosition to be enabled by default when using infinite (if not provided)
|
|
385
|
+
if (((_b = _this.config.settings) === null || _b === void 0 ? void 0 : _b.infinite) && typeof _this.config.settings.restorePosition == 'undefined') {
|
|
386
|
+
_this.config.settings.restorePosition = { enabled: true };
|
|
383
387
|
}
|
|
384
388
|
_this.store.setConfig(_this.config);
|
|
385
389
|
_this.storage = new snap_store_mobx_1.StorageStore({
|
|
@@ -432,41 +436,105 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
432
436
|
});
|
|
433
437
|
}); });
|
|
434
438
|
_this.eventManager.on('afterStore', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
|
|
435
|
-
var storableRequestParams, stringyParams,
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
return __generator(this, function (_c) {
|
|
439
|
-
switch (_c.label) {
|
|
439
|
+
var storableRequestParams, stringyParams, scrollMap, elementPosition;
|
|
440
|
+
return __generator(this, function (_a) {
|
|
441
|
+
switch (_a.label) {
|
|
440
442
|
case 0: return [4 /*yield*/, next()];
|
|
441
443
|
case 1:
|
|
442
|
-
|
|
443
|
-
search.controller.store.loading = false;
|
|
444
|
+
_a.sent();
|
|
444
445
|
// save last params
|
|
445
446
|
this.storage.set('lastStringyParams', JSON.stringify(search.request));
|
|
446
447
|
storableRequestParams = getStorableRequestParams(search.request);
|
|
447
448
|
stringyParams = JSON.stringify(storableRequestParams);
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
heightCheck_1 = window.setInterval(function () {
|
|
454
|
-
if (document.documentElement.scrollHeight >= scrollToPosition_1) {
|
|
455
|
-
window.scrollTo(0, scrollToPosition_1);
|
|
456
|
-
_this.log.debug('scrolling to: ', scrollMap_1[stringyParams]);
|
|
457
|
-
window.clearInterval(heightCheck_1);
|
|
458
|
-
}
|
|
459
|
-
if (checkCount_1 > 2000 / HEIGHT_CHECK_INTERVAL) {
|
|
460
|
-
window.clearInterval(heightCheck_1);
|
|
461
|
-
}
|
|
462
|
-
checkCount_1++;
|
|
463
|
-
}, HEIGHT_CHECK_INTERVAL);
|
|
464
|
-
}
|
|
449
|
+
scrollMap = this.storage.get('scrollMap') || {};
|
|
450
|
+
elementPosition = scrollMap[stringyParams];
|
|
451
|
+
if (!elementPosition) {
|
|
452
|
+
// search params have changed - empty the scrollMap
|
|
453
|
+
this.storage.set('scrollMap', {});
|
|
465
454
|
}
|
|
455
|
+
return [4 /*yield*/, this.eventManager.fire('restorePosition', { controller: this, element: elementPosition })];
|
|
456
|
+
case 2:
|
|
457
|
+
_a.sent();
|
|
458
|
+
search.controller.store.loading = false;
|
|
466
459
|
return [2 /*return*/];
|
|
467
460
|
}
|
|
468
461
|
});
|
|
469
462
|
}); });
|
|
463
|
+
// restore position
|
|
464
|
+
if ((_d = (_c = _this.config.settings) === null || _c === void 0 ? void 0 : _c.restorePosition) === null || _d === void 0 ? void 0 : _d.enabled) {
|
|
465
|
+
_this.eventManager.on('restorePosition', function (_a, next) {
|
|
466
|
+
var controller = _a.controller, element = _a.element;
|
|
467
|
+
return __awaiter(_this, void 0, void 0, function () {
|
|
468
|
+
var scrollToPosition;
|
|
469
|
+
var _this = this;
|
|
470
|
+
return __generator(this, function (_b) {
|
|
471
|
+
switch (_b.label) {
|
|
472
|
+
case 0:
|
|
473
|
+
scrollToPosition = function () {
|
|
474
|
+
return new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () {
|
|
475
|
+
var offset, maxCheckTime, checkTime, maxScrolls, maxCheckCount, scrollBackCount, scrolledElem, checkAndScroll;
|
|
476
|
+
var _a;
|
|
477
|
+
return __generator(this, function (_b) {
|
|
478
|
+
switch (_b.label) {
|
|
479
|
+
case 0:
|
|
480
|
+
offset = ((_a = element === null || element === void 0 ? void 0 : element.domRect) === null || _a === void 0 ? void 0 : _a.top) || 0;
|
|
481
|
+
maxCheckTime = 500;
|
|
482
|
+
checkTime = 50;
|
|
483
|
+
maxScrolls = Math.ceil(maxCheckTime / checkTime);
|
|
484
|
+
maxCheckCount = maxScrolls + 1;
|
|
485
|
+
scrollBackCount = 0;
|
|
486
|
+
scrolledElem = undefined;
|
|
487
|
+
checkAndScroll = function () {
|
|
488
|
+
var elem = document.querySelector(element === null || element === void 0 ? void 0 : element.selector);
|
|
489
|
+
if (elem)
|
|
490
|
+
scrollBackCount++;
|
|
491
|
+
if (elem && scrollBackCount < maxCheckCount) {
|
|
492
|
+
var y = elem.getBoundingClientRect().y;
|
|
493
|
+
if (y > offset + 1 || y < offset - 1) {
|
|
494
|
+
elem.scrollIntoView();
|
|
495
|
+
// after scrolling into view, use top value with offset (for when element at bottom)
|
|
496
|
+
var top_1 = elem.getBoundingClientRect().top;
|
|
497
|
+
window.scrollBy(0, -(offset - top_1));
|
|
498
|
+
scrolledElem = elem;
|
|
499
|
+
return true;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return false;
|
|
503
|
+
};
|
|
504
|
+
_b.label = 1;
|
|
505
|
+
case 1:
|
|
506
|
+
if (!(checkAndScroll() || scrollBackCount <= maxScrolls)) return [3 /*break*/, 3];
|
|
507
|
+
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, checkTime); })];
|
|
508
|
+
case 2:
|
|
509
|
+
_b.sent();
|
|
510
|
+
return [3 /*break*/, 1];
|
|
511
|
+
case 3:
|
|
512
|
+
if (scrolledElem) {
|
|
513
|
+
controller.log.debug('restored position to: ', scrolledElem);
|
|
514
|
+
}
|
|
515
|
+
else {
|
|
516
|
+
controller.log.debug('could not locate element with selector: ', element === null || element === void 0 ? void 0 : element.selector);
|
|
517
|
+
}
|
|
518
|
+
resolve();
|
|
519
|
+
return [2 /*return*/];
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
}); });
|
|
523
|
+
};
|
|
524
|
+
if (!element) return [3 /*break*/, 2];
|
|
525
|
+
return [4 /*yield*/, scrollToPosition()];
|
|
526
|
+
case 1:
|
|
527
|
+
_b.sent();
|
|
528
|
+
_b.label = 2;
|
|
529
|
+
case 2: return [4 /*yield*/, next()];
|
|
530
|
+
case 3:
|
|
531
|
+
_b.sent();
|
|
532
|
+
return [2 /*return*/];
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
});
|
|
536
|
+
});
|
|
537
|
+
}
|
|
470
538
|
// attach config plugins and event middleware
|
|
471
539
|
_this.use(_this.config);
|
|
472
540
|
return _this;
|
|
@@ -539,6 +607,21 @@ function getStorableRequestParams(request) {
|
|
|
539
607
|
};
|
|
540
608
|
}
|
|
541
609
|
exports.getStorableRequestParams = getStorableRequestParams;
|
|
610
|
+
function generateHrefSelector(element, href, levels) {
|
|
611
|
+
if (levels === void 0) { levels = 7; }
|
|
612
|
+
var level = 0;
|
|
613
|
+
var elem = element;
|
|
614
|
+
while (elem && level < levels) {
|
|
615
|
+
// check within
|
|
616
|
+
var innerElemHref = elem.querySelector("[href*=\"".concat(href, "\"]"));
|
|
617
|
+
if (innerElemHref && elem.classList.value) {
|
|
618
|
+
return "".concat(elem.tagName, ".").concat(elem.classList.value.replace(/\s/g, '.'), " [href*=\"").concat(href, "\"]");
|
|
619
|
+
}
|
|
620
|
+
elem = elem.parentElement;
|
|
621
|
+
level++;
|
|
622
|
+
}
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
542
625
|
function backFillSize(pages, pageSize) {
|
|
543
626
|
var totalResults = pages * pageSize;
|
|
544
627
|
var numPages = Math.ceil(totalResults / API_LIMIT);
|
package/dist/cjs/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AbstractController } from './
|
|
1
|
+
import type { AbstractController, AutocompleteController, SearchController, FinderController, RecommendationController } from './index';
|
|
2
2
|
import type { EventManager, Middleware } from '@searchspring/snap-event-manager';
|
|
3
3
|
import type { Client } from '@searchspring/snap-client';
|
|
4
4
|
import type { SearchStore, AutocompleteStore, FinderStore, RecommendationStore, StoreConfig, SearchStoreConfig, FinderStoreConfig, AutocompleteStoreConfig, RecommendationStoreConfig } from '@searchspring/snap-store-mobx';
|
|
@@ -23,12 +23,22 @@ export declare type AfterStoreObj = {
|
|
|
23
23
|
request: any;
|
|
24
24
|
response: any;
|
|
25
25
|
};
|
|
26
|
+
export declare type RestorePositionObj = {
|
|
27
|
+
controller: AbstractController;
|
|
28
|
+
element?: ElementPositionObj;
|
|
29
|
+
};
|
|
30
|
+
export declare type ElementPositionObj = {
|
|
31
|
+
href: string;
|
|
32
|
+
selector: string;
|
|
33
|
+
domRect: DOMRect;
|
|
34
|
+
};
|
|
26
35
|
export declare enum ControllerTypes {
|
|
27
36
|
search = "search",
|
|
28
37
|
autocomplete = "autocomplete",
|
|
29
38
|
finder = "finder",
|
|
30
39
|
recommendation = "recommendation"
|
|
31
40
|
}
|
|
41
|
+
export declare type Controllers = SearchController | AutocompleteController | FinderController | RecommendationController;
|
|
32
42
|
export declare type ControllerServices = {
|
|
33
43
|
client: Client;
|
|
34
44
|
store: SearchStore | AutocompleteStore | FinderStore | RecommendationStore;
|
package/dist/cjs/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAA8C,MAAM,+BAA+B,CAAC;AACzG,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,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEnJ,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAG1E,eAAO,MAAM,WAAW,MAAM,CAAC;AA0B/B,aAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,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;IA6D3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;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;wBAkDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCAgDhD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,aAAa,KAAG,IAAI;;;;uBAiDpB,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAA8C,MAAM,+BAA+B,CAAC;AACzG,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,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEnJ,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAG1E,eAAO,MAAM,WAAW,MAAM,CAAC;AA0B/B,aAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,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;IA6D3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;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;wBAkDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCAgDhD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,aAAa,KAAG,IAAI;;;;uBAiDpB,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0E3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAwBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAiH9B;CACF"}
|
|
@@ -490,6 +490,8 @@ export class AutocompleteController extends AbstractController {
|
|
|
490
490
|
inputs.forEach((input) => {
|
|
491
491
|
input.setAttribute('spellcheck', 'false');
|
|
492
492
|
input.setAttribute('autocomplete', 'off');
|
|
493
|
+
input.setAttribute('autocorrect', 'off');
|
|
494
|
+
input.setAttribute('autocapitalize', 'none');
|
|
493
495
|
input.setAttribute(INPUT_ATTRIBUTE, '');
|
|
494
496
|
input.addEventListener('keyup', this.handlers.input.keyUp);
|
|
495
497
|
if (this.config?.settings?.initializeFromUrl && !input.value && this.store.state.input) {
|
|
@@ -541,6 +543,9 @@ function addHiddenFormInput(form, name, value) {
|
|
|
541
543
|
inputElem.type = 'hidden';
|
|
542
544
|
inputElem.name = name;
|
|
543
545
|
inputElem.value = value;
|
|
546
|
+
// remove existing form element if it exists (prevent duplicates)
|
|
547
|
+
form.querySelector(`[type="hidden"][name="${name}"]`)?.remove();
|
|
548
|
+
// append form element
|
|
544
549
|
form.append(inputElem);
|
|
545
550
|
}
|
|
546
551
|
async function timeout(time) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EACX,sBAAsB,EAItB,kBAAkB,EAClB,gBAAgB,EAGhB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,kBAAkB,EAA2E,MAAM,2BAA2B,CAAC;AAsB7I,aAAK,kBAAkB,GAAG;IACzB,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;KAC/D,CAAC;CACF,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,kBAAkB;IAChD,IAAI,kBAA0B;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,sBAAsB,CAAC;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,eAAe,CAAwC;gBAG9D,MAAM,EAAE,sBAAsB,EAC9B,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAqI3B,KAAK,EAAE,kBAAkB,CAoCvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CAmO9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF"}
|
|
@@ -29,20 +29,23 @@ export class SearchController extends AbstractController {
|
|
|
29
29
|
this.track = {
|
|
30
30
|
product: {
|
|
31
31
|
click: (e, result) => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
const target = e.target;
|
|
33
|
+
const href = target?.getAttribute('href') || result.mappings.core?.url;
|
|
34
|
+
const scrollMap = {};
|
|
35
|
+
// generate the selector using element class and parent classes
|
|
36
|
+
const selector = generateHrefSelector(target, href);
|
|
37
|
+
const domRect = selector ? document?.querySelector(selector)?.getBoundingClientRect() : undefined;
|
|
38
|
+
// store element position data to scrollMap
|
|
39
|
+
if (selector && href && domRect) {
|
|
40
|
+
const stringyParams = JSON.parse(this.storage.get('lastStringyParams'));
|
|
36
41
|
const storableRequestParams = getStorableRequestParams(stringyParams);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
scrollMap[stringyParams] = window.scrollY;
|
|
40
|
-
this.storage.set('scrollMap', scrollMap);
|
|
42
|
+
const storableStringyParams = JSON.stringify(storableRequestParams);
|
|
43
|
+
scrollMap[storableStringyParams] = { domRect, href, selector };
|
|
41
44
|
}
|
|
45
|
+
// store position data or empty object
|
|
46
|
+
this.storage.set('scrollMap', scrollMap);
|
|
42
47
|
// track
|
|
43
48
|
const { intellisuggestData, intellisuggestSignature } = result.attributes;
|
|
44
|
-
const target = e.target;
|
|
45
|
-
const href = target?.href || result.mappings.core?.url || undefined;
|
|
46
49
|
const event = this.tracker.track.product.click({
|
|
47
50
|
intellisuggestData,
|
|
48
51
|
intellisuggestSignature,
|
|
@@ -262,8 +265,9 @@ export class SearchController extends AbstractController {
|
|
|
262
265
|
};
|
|
263
266
|
// deep merge config with defaults
|
|
264
267
|
this.config = deepmerge(defaultConfig, this.config);
|
|
265
|
-
|
|
266
|
-
|
|
268
|
+
// set restorePosition to be enabled by default when using infinite (if not provided)
|
|
269
|
+
if (this.config.settings?.infinite && typeof this.config.settings.restorePosition == 'undefined') {
|
|
270
|
+
this.config.settings.restorePosition = { enabled: true };
|
|
267
271
|
}
|
|
268
272
|
this.store.setConfig(this.config);
|
|
269
273
|
this.storage = new StorageStore({
|
|
@@ -299,32 +303,66 @@ export class SearchController extends AbstractController {
|
|
|
299
303
|
});
|
|
300
304
|
this.eventManager.on('afterStore', async (search, next) => {
|
|
301
305
|
await next();
|
|
302
|
-
search.controller.store.loading = false;
|
|
303
306
|
// save last params
|
|
304
307
|
this.storage.set('lastStringyParams', JSON.stringify(search.request));
|
|
308
|
+
// get scrollTo positioning and send it to 'restorePosition' event
|
|
305
309
|
const storableRequestParams = getStorableRequestParams(search.request);
|
|
306
310
|
const stringyParams = JSON.stringify(storableRequestParams);
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
//
|
|
311
|
-
|
|
312
|
-
if (scrollToPosition) {
|
|
313
|
-
let checkCount = 0;
|
|
314
|
-
const heightCheck = window.setInterval(() => {
|
|
315
|
-
if (document.documentElement.scrollHeight >= scrollToPosition) {
|
|
316
|
-
window.scrollTo(0, scrollToPosition);
|
|
317
|
-
this.log.debug('scrolling to: ', scrollMap[stringyParams]);
|
|
318
|
-
window.clearInterval(heightCheck);
|
|
319
|
-
}
|
|
320
|
-
if (checkCount > 2000 / HEIGHT_CHECK_INTERVAL) {
|
|
321
|
-
window.clearInterval(heightCheck);
|
|
322
|
-
}
|
|
323
|
-
checkCount++;
|
|
324
|
-
}, HEIGHT_CHECK_INTERVAL);
|
|
325
|
-
}
|
|
311
|
+
const scrollMap = this.storage.get('scrollMap') || {};
|
|
312
|
+
const elementPosition = scrollMap[stringyParams];
|
|
313
|
+
if (!elementPosition) {
|
|
314
|
+
// search params have changed - empty the scrollMap
|
|
315
|
+
this.storage.set('scrollMap', {});
|
|
326
316
|
}
|
|
317
|
+
await this.eventManager.fire('restorePosition', { controller: this, element: elementPosition });
|
|
318
|
+
search.controller.store.loading = false;
|
|
327
319
|
});
|
|
320
|
+
// restore position
|
|
321
|
+
if (this.config.settings?.restorePosition?.enabled) {
|
|
322
|
+
this.eventManager.on('restorePosition', async ({ controller, element }, next) => {
|
|
323
|
+
const scrollToPosition = () => {
|
|
324
|
+
return new Promise(async (resolve) => {
|
|
325
|
+
const offset = element?.domRect?.top || 0;
|
|
326
|
+
const maxCheckTime = 500;
|
|
327
|
+
const checkTime = 50;
|
|
328
|
+
const maxScrolls = Math.ceil(maxCheckTime / checkTime);
|
|
329
|
+
const maxCheckCount = maxScrolls + 1;
|
|
330
|
+
let scrollBackCount = 0;
|
|
331
|
+
let scrolledElem = undefined;
|
|
332
|
+
const checkAndScroll = () => {
|
|
333
|
+
const elem = document.querySelector(element?.selector);
|
|
334
|
+
if (elem)
|
|
335
|
+
scrollBackCount++;
|
|
336
|
+
if (elem && scrollBackCount < maxCheckCount) {
|
|
337
|
+
const { y } = elem.getBoundingClientRect();
|
|
338
|
+
if (y > offset + 1 || y < offset - 1) {
|
|
339
|
+
elem.scrollIntoView();
|
|
340
|
+
// after scrolling into view, use top value with offset (for when element at bottom)
|
|
341
|
+
const { top } = elem.getBoundingClientRect();
|
|
342
|
+
window.scrollBy(0, -(offset - top));
|
|
343
|
+
scrolledElem = elem;
|
|
344
|
+
return true;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return false;
|
|
348
|
+
};
|
|
349
|
+
while (checkAndScroll() || scrollBackCount <= maxScrolls) {
|
|
350
|
+
await new Promise((resolve) => setTimeout(resolve, checkTime));
|
|
351
|
+
}
|
|
352
|
+
if (scrolledElem) {
|
|
353
|
+
controller.log.debug('restored position to: ', scrolledElem);
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
controller.log.debug('could not locate element with selector: ', element?.selector);
|
|
357
|
+
}
|
|
358
|
+
resolve();
|
|
359
|
+
});
|
|
360
|
+
};
|
|
361
|
+
if (element)
|
|
362
|
+
await scrollToPosition();
|
|
363
|
+
await next();
|
|
364
|
+
});
|
|
365
|
+
}
|
|
328
366
|
// attach config plugins and event middleware
|
|
329
367
|
this.use(this.config);
|
|
330
368
|
}
|
|
@@ -387,6 +425,20 @@ export function getStorableRequestParams(request) {
|
|
|
387
425
|
},
|
|
388
426
|
};
|
|
389
427
|
}
|
|
428
|
+
function generateHrefSelector(element, href, levels = 7) {
|
|
429
|
+
let level = 0;
|
|
430
|
+
let elem = element;
|
|
431
|
+
while (elem && level < levels) {
|
|
432
|
+
// check within
|
|
433
|
+
const innerElemHref = elem.querySelector(`[href*="${href}"]`);
|
|
434
|
+
if (innerElemHref && elem.classList.value) {
|
|
435
|
+
return `${elem.tagName}.${elem.classList.value.replace(/\s/g, '.')} [href*="${href}"]`;
|
|
436
|
+
}
|
|
437
|
+
elem = elem.parentElement;
|
|
438
|
+
level++;
|
|
439
|
+
}
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
390
442
|
function backFillSize(pages, pageSize) {
|
|
391
443
|
const totalResults = pages * pageSize;
|
|
392
444
|
let numPages = Math.ceil(totalResults / API_LIMIT);
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AbstractController } from './
|
|
1
|
+
import type { AbstractController, AutocompleteController, SearchController, FinderController, RecommendationController } from './index';
|
|
2
2
|
import type { EventManager, Middleware } from '@searchspring/snap-event-manager';
|
|
3
3
|
import type { Client } from '@searchspring/snap-client';
|
|
4
4
|
import type { SearchStore, AutocompleteStore, FinderStore, RecommendationStore, StoreConfig, SearchStoreConfig, FinderStoreConfig, AutocompleteStoreConfig, RecommendationStoreConfig } from '@searchspring/snap-store-mobx';
|
|
@@ -23,12 +23,22 @@ export declare type AfterStoreObj = {
|
|
|
23
23
|
request: any;
|
|
24
24
|
response: any;
|
|
25
25
|
};
|
|
26
|
+
export declare type RestorePositionObj = {
|
|
27
|
+
controller: AbstractController;
|
|
28
|
+
element?: ElementPositionObj;
|
|
29
|
+
};
|
|
30
|
+
export declare type ElementPositionObj = {
|
|
31
|
+
href: string;
|
|
32
|
+
selector: string;
|
|
33
|
+
domRect: DOMRect;
|
|
34
|
+
};
|
|
26
35
|
export declare enum ControllerTypes {
|
|
27
36
|
search = "search",
|
|
28
37
|
autocomplete = "autocomplete",
|
|
29
38
|
finder = "finder",
|
|
30
39
|
recommendation = "recommendation"
|
|
31
40
|
}
|
|
41
|
+
export declare type Controllers = SearchController | AutocompleteController | FinderController | RecommendationController;
|
|
32
42
|
export declare type ControllerServices = {
|
|
33
43
|
client: Client;
|
|
34
44
|
store: SearchStore | AutocompleteStore | FinderStore | RecommendationStore;
|
package/dist/esm/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@searchspring/snap-controller",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.42.1",
|
|
4
4
|
"description": "Snap Controllers",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -20,21 +20,21 @@
|
|
|
20
20
|
"test:watch": "jest --watch"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@searchspring/snap-toolbox": "^0.
|
|
23
|
+
"@searchspring/snap-toolbox": "^0.42.1",
|
|
24
24
|
"deepmerge": "4.2.2"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@searchspring/snap-client": "^0.
|
|
28
|
-
"@searchspring/snap-event-manager": "^0.
|
|
29
|
-
"@searchspring/snap-logger": "^0.
|
|
30
|
-
"@searchspring/snap-profiler": "^0.
|
|
31
|
-
"@searchspring/snap-store-mobx": "^0.
|
|
32
|
-
"@searchspring/snap-tracker": "^0.
|
|
33
|
-
"@searchspring/snap-url-manager": "^0.
|
|
27
|
+
"@searchspring/snap-client": "^0.42.1",
|
|
28
|
+
"@searchspring/snap-event-manager": "^0.42.1",
|
|
29
|
+
"@searchspring/snap-logger": "^0.42.1",
|
|
30
|
+
"@searchspring/snap-profiler": "^0.42.1",
|
|
31
|
+
"@searchspring/snap-store-mobx": "^0.42.1",
|
|
32
|
+
"@searchspring/snap-tracker": "^0.42.1",
|
|
33
|
+
"@searchspring/snap-url-manager": "^0.42.1"
|
|
34
34
|
},
|
|
35
35
|
"sideEffects": false,
|
|
36
36
|
"files": [
|
|
37
37
|
"dist/**/*"
|
|
38
38
|
],
|
|
39
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "1f3abdf844a08fbeb2e8b96aa0f83e88b1fc9aac"
|
|
40
40
|
}
|