instantsearch.js 4.54.1 → 4.56.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 (114) hide show
  1. package/cjs/components/Breadcrumb/Breadcrumb.js +2 -2
  2. package/cjs/components/Hits/Hits.js +16 -7
  3. package/cjs/components/InfiniteHits/InfiniteHits.js +13 -2
  4. package/cjs/components/RangeInput/RangeInput.js +22 -11
  5. package/cjs/components/RefinementList/RefinementList.js +34 -52
  6. package/cjs/components/Slider/Rheostat.js +163 -249
  7. package/cjs/connectors/autocomplete/connectAutocomplete.js +1 -1
  8. package/cjs/connectors/geo-search/connectGeoSearch.js +1 -1
  9. package/cjs/connectors/hierarchical-menu/connectHierarchicalMenu.js +1 -1
  10. package/cjs/connectors/hits/connectHits.js +1 -1
  11. package/cjs/connectors/infinite-hits/connectInfiniteHits.js +55 -32
  12. package/cjs/connectors/menu/connectMenu.js +1 -1
  13. package/cjs/connectors/numeric-menu/connectNumericMenu.js +1 -1
  14. package/cjs/connectors/rating-menu/connectRatingMenu.js +7 -3
  15. package/cjs/connectors/refinement-list/connectRefinementList.js +1 -1
  16. package/cjs/connectors/toggle-refinement/connectToggleRefinement.js +14 -4
  17. package/cjs/helpers/insights.js +3 -4
  18. package/cjs/lib/InstantSearch.js +20 -6
  19. package/cjs/lib/insights/listener.js +43 -36
  20. package/cjs/lib/routers/history.js +55 -1
  21. package/cjs/lib/stateMappings/simple.js +1 -0
  22. package/cjs/lib/stateMappings/singleIndex.js +1 -0
  23. package/cjs/lib/utils/createSendEventForFacet.js +12 -2
  24. package/cjs/lib/utils/createSendEventForHits.js +34 -11
  25. package/cjs/lib/utils/render-args.js +3 -2
  26. package/cjs/lib/version.js +1 -1
  27. package/cjs/middlewares/createInsightsMiddleware.js +135 -33
  28. package/cjs/middlewares/createMetadataMiddleware.js +17 -5
  29. package/cjs/middlewares/createRouterMiddleware.js +5 -1
  30. package/cjs/widgets/hits/hits.js +1 -2
  31. package/cjs/widgets/hits-per-page/hits-per-page.js +3 -1
  32. package/cjs/widgets/index/index.js +8 -8
  33. package/cjs/widgets/infinite-hits/infinite-hits.js +1 -2
  34. package/dist/instantsearch.development.d.ts +143 -84
  35. package/dist/instantsearch.development.js +770 -584
  36. package/dist/instantsearch.development.js.map +1 -1
  37. package/dist/instantsearch.production.d.ts +143 -84
  38. package/dist/instantsearch.production.min.d.ts +143 -84
  39. package/dist/instantsearch.production.min.js +2 -2
  40. package/dist/instantsearch.production.min.js.map +1 -1
  41. package/es/components/Breadcrumb/Breadcrumb.d.ts +2 -2
  42. package/es/components/Breadcrumb/Breadcrumb.js +2 -2
  43. package/es/components/GeoSearchControls/GeoSearchButton.d.ts +1 -1
  44. package/es/components/GeoSearchControls/GeoSearchControls.d.ts +3 -3
  45. package/es/components/GeoSearchControls/GeoSearchToggle.d.ts +1 -1
  46. package/es/components/Hits/Hits.d.ts +5 -5
  47. package/es/components/Hits/Hits.js +15 -5
  48. package/es/components/InfiniteHits/InfiniteHits.d.ts +3 -2
  49. package/es/components/InfiniteHits/InfiniteHits.js +13 -2
  50. package/es/components/Pagination/Pagination.d.ts +2 -2
  51. package/es/components/RangeInput/RangeInput.d.ts +7 -4
  52. package/es/components/RangeInput/RangeInput.js +22 -11
  53. package/es/components/RefinementList/RefinementList.d.ts +0 -1
  54. package/es/components/RefinementList/RefinementList.js +34 -52
  55. package/es/components/RelevantSort/RelevantSort.d.ts +1 -1
  56. package/es/components/Selector/Selector.d.ts +2 -2
  57. package/es/components/Slider/Rheostat.d.ts +23 -17
  58. package/es/components/Slider/Rheostat.js +163 -249
  59. package/es/components/Slider/Slider.d.ts +1 -1
  60. package/es/connectors/autocomplete/connectAutocomplete.js +1 -1
  61. package/es/connectors/current-refinements/connectCurrentRefinements.d.ts +2 -2
  62. package/es/connectors/dynamic-widgets/connectDynamicWidgets.d.ts +2 -2
  63. package/es/connectors/geo-search/connectGeoSearch.d.ts +7 -7
  64. package/es/connectors/geo-search/connectGeoSearch.js +1 -1
  65. package/es/connectors/hierarchical-menu/connectHierarchicalMenu.js +1 -1
  66. package/es/connectors/hits/connectHits.js +1 -1
  67. package/es/connectors/infinite-hits/connectInfiniteHits.js +56 -33
  68. package/es/connectors/menu/connectMenu.d.ts +2 -2
  69. package/es/connectors/menu/connectMenu.js +1 -1
  70. package/es/connectors/numeric-menu/connectNumericMenu.js +1 -1
  71. package/es/connectors/pagination/connectPagination.d.ts +1 -1
  72. package/es/connectors/range/connectRange.d.ts +3 -3
  73. package/es/connectors/rating-menu/connectRatingMenu.js +7 -3
  74. package/es/connectors/refinement-list/connectRefinementList.d.ts +3 -3
  75. package/es/connectors/refinement-list/connectRefinementList.js +1 -1
  76. package/es/connectors/relevant-sort/connectRelevantSort.d.ts +1 -1
  77. package/es/connectors/toggle-refinement/connectToggleRefinement.js +13 -3
  78. package/es/helpers/insights.d.ts +2 -1
  79. package/es/helpers/insights.js +3 -3
  80. package/es/lib/InstantSearch.d.ts +24 -14
  81. package/es/lib/InstantSearch.js +21 -7
  82. package/es/lib/insights/listener.d.ts +10 -6
  83. package/es/lib/insights/listener.js +42 -36
  84. package/es/lib/routers/history.d.ts +3 -2
  85. package/es/lib/routers/history.js +56 -2
  86. package/es/lib/stateMappings/simple.js +1 -0
  87. package/es/lib/stateMappings/singleIndex.js +1 -0
  88. package/es/lib/utils/createSendEventForFacet.js +12 -2
  89. package/es/lib/utils/createSendEventForHits.d.ts +8 -0
  90. package/es/lib/utils/createSendEventForHits.js +33 -11
  91. package/es/lib/utils/defer.d.ts +2 -2
  92. package/es/lib/utils/render-args.js +3 -2
  93. package/es/lib/version.d.ts +1 -1
  94. package/es/lib/version.js +1 -1
  95. package/es/middlewares/createInsightsMiddleware.d.ts +12 -12
  96. package/es/middlewares/createInsightsMiddleware.js +136 -34
  97. package/es/middlewares/createMetadataMiddleware.d.ts +3 -1
  98. package/es/middlewares/createMetadataMiddleware.js +17 -5
  99. package/es/middlewares/createRouterMiddleware.js +5 -1
  100. package/es/types/insights.d.ts +19 -1
  101. package/es/types/middleware.d.ts +22 -6
  102. package/es/types/router.d.ts +15 -7
  103. package/es/types/widget.d.ts +1 -1
  104. package/es/widgets/dynamic-widgets/dynamic-widgets.d.ts +2 -2
  105. package/es/widgets/geo-search/createHTMLMarker.d.ts +1 -1
  106. package/es/widgets/geo-search/geo-search.d.ts +1 -1
  107. package/es/widgets/hits/hits.js +2 -3
  108. package/es/widgets/hits-per-page/hits-per-page.js +3 -1
  109. package/es/widgets/index/index.d.ts +20 -20
  110. package/es/widgets/index/index.js +8 -8
  111. package/es/widgets/infinite-hits/infinite-hits.js +2 -3
  112. package/es/widgets/panel/panel.d.ts +2 -2
  113. package/es/widgets/range-slider/range-slider.d.ts +1 -1
  114. package/package.json +7 -7
@@ -137,7 +137,7 @@ var connectGeoSearch = function connectGeoSearch(renderFn) {
137
137
  widgetState.internalToggleRefineOnMapMove = createInternalToggleRefinementOnMapMove(renderArgs, this.render.bind(this));
138
138
  widgetState.internalSetMapMoveSinceLastRefine = createInternalSetMapMoveSinceLastRefine(renderArgs, this.render.bind(this));
139
139
  var widgetRenderState = this.getWidgetRenderState(renderArgs);
140
- sendEvent('view', widgetRenderState.items);
140
+ sendEvent('view:internal', widgetRenderState.items);
141
141
  renderFn(_objectSpread(_objectSpread({}, widgetRenderState), {}, {
142
142
  instantSearchInstance: instantSearchInstance
143
143
  }), isFirstRendering);
@@ -161,7 +161,7 @@ var connectHierarchicalMenu = function connectHierarchicalMenu(renderFn) {
161
161
  }
162
162
  if (!_refine) {
163
163
  _refine = function _refine(facetValue) {
164
- sendEvent('click', facetValue);
164
+ sendEvent('click:internal', facetValue);
165
165
  helper.toggleFacetRefinement(hierarchicalFacetName, facetValue).search();
166
166
  };
167
167
  }
@@ -40,7 +40,7 @@ var connectHits = function connectHits(renderFn) {
40
40
  renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
41
41
  instantSearchInstance: renderOptions.instantSearchInstance
42
42
  }), false);
43
- renderState.sendEvent('view', renderState.hits);
43
+ renderState.sendEvent('view:internal', renderState.hits);
44
44
  },
45
45
  getRenderState: function getRenderState(renderState, renderOptions) {
46
46
  return _objectSpread(_objectSpread({}, renderState), {}, {
@@ -6,7 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _utils = require("../../lib/utils");
9
- var _excluded = ["page"];
9
+ var _excluded = ["page"],
10
+ _excluded2 = ["clickAnalytics", "userToken"];
10
11
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
11
12
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
12
13
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
@@ -30,17 +31,24 @@ function getStateWithoutPage(state) {
30
31
  rest = _objectWithoutProperties(_ref, _excluded);
31
32
  return rest;
32
33
  }
34
+ function normalizeState(state) {
35
+ var _ref2 = state || {},
36
+ clickAnalytics = _ref2.clickAnalytics,
37
+ userToken = _ref2.userToken,
38
+ rest = _objectWithoutProperties(_ref2, _excluded2);
39
+ return rest;
40
+ }
33
41
  function getInMemoryCache() {
34
42
  var cachedHits = null;
35
43
  var cachedState = null;
36
44
  return {
37
- read: function read(_ref2) {
38
- var state = _ref2.state;
45
+ read: function read(_ref3) {
46
+ var state = _ref3.state;
39
47
  return (0, _utils.isEqual)(cachedState, getStateWithoutPage(state)) ? cachedHits : null;
40
48
  },
41
- write: function write(_ref3) {
42
- var state = _ref3.state,
43
- hits = _ref3.hits;
49
+ write: function write(_ref4) {
50
+ var state = _ref4.state,
51
+ hits = _ref4.hits;
44
52
  cachedState = getStateWithoutPage(state);
45
53
  cachedHits = hits;
46
54
  }
@@ -60,15 +68,15 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
60
68
  // @TODO: this should be a generic, but a Connector can not yet be generic itself
61
69
 
62
70
  return function (widgetParams) {
63
- var _ref4 = widgetParams || {},
64
- _ref4$escapeHTML = _ref4.escapeHTML,
65
- escapeHTML = _ref4$escapeHTML === void 0 ? true : _ref4$escapeHTML,
66
- _ref4$transformItems = _ref4.transformItems,
67
- transformItems = _ref4$transformItems === void 0 ? function (items) {
71
+ var _ref5 = widgetParams || {},
72
+ _ref5$escapeHTML = _ref5.escapeHTML,
73
+ escapeHTML = _ref5$escapeHTML === void 0 ? true : _ref5$escapeHTML,
74
+ _ref5$transformItems = _ref5.transformItems,
75
+ transformItems = _ref5$transformItems === void 0 ? function (items) {
68
76
  return items;
69
- } : _ref4$transformItems,
70
- _ref4$cache = _ref4.cache,
71
- cache = _ref4$cache === void 0 ? getInMemoryCache() : _ref4$cache;
77
+ } : _ref5$transformItems,
78
+ _ref5$cache = _ref5.cache,
79
+ cache = _ref5$cache === void 0 ? getInMemoryCache() : _ref5$cache;
72
80
  var showPrevious;
73
81
  var showMore;
74
82
  var sendEvent;
@@ -99,7 +107,7 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
99
107
  // avoid updating the browser URL when the user displays the previous page.
100
108
  helper.overrideStateWithoutTriggeringChangeEvent(_objectSpread(_objectSpread({}, helper.state), {}, {
101
109
  page: getFirstReceivedPage(helper.state, cache.read({
102
- state: helper.state
110
+ state: normalizeState(helper.state)
103
111
  }) || {}) - 1
104
112
  })).searchWithoutTriggeringOnStateChange();
105
113
  };
@@ -107,7 +115,7 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
107
115
  var getShowMore = function getShowMore(helper) {
108
116
  return function () {
109
117
  helper.setPage(getLastReceivedPage(helper.state, cache.read({
110
- state: helper.state
118
+ state: normalizeState(helper.state)
111
119
  }) || {}) + 1).search();
112
120
  };
113
121
  };
@@ -124,19 +132,19 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
124
132
  renderFn(_objectSpread(_objectSpread({}, widgetRenderState), {}, {
125
133
  instantSearchInstance: instantSearchInstance
126
134
  }), false);
127
- sendEvent('view', widgetRenderState.currentPageHits);
135
+ sendEvent('view:internal', widgetRenderState.currentPageHits);
128
136
  },
129
137
  getRenderState: function getRenderState(renderState, renderOptions) {
130
138
  return _objectSpread(_objectSpread({}, renderState), {}, {
131
139
  infiniteHits: this.getWidgetRenderState(renderOptions)
132
140
  });
133
141
  },
134
- getWidgetRenderState: function getWidgetRenderState(_ref5) {
135
- var results = _ref5.results,
136
- helper = _ref5.helper,
137
- parent = _ref5.parent,
138
- existingState = _ref5.state,
139
- instantSearchInstance = _ref5.instantSearchInstance;
142
+ getWidgetRenderState: function getWidgetRenderState(_ref6) {
143
+ var results = _ref6.results,
144
+ helper = _ref6.helper,
145
+ parent = _ref6.parent,
146
+ existingState = _ref6.state,
147
+ instantSearchInstance = _ref6.instantSearchInstance;
140
148
  var isFirstPage;
141
149
  var currentPageHits = [];
142
150
  /**
@@ -146,7 +154,7 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
146
154
  */
147
155
  var state = parent.getPreviousState() || existingState;
148
156
  var cachedHits = cache.read({
149
- state: state
157
+ state: normalizeState(state)
150
158
  }) || {};
151
159
  if (!results) {
152
160
  showPrevious = getShowPrevious(helper);
@@ -163,6 +171,7 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
163
171
  });
164
172
  isFirstPage = state.page === undefined || getFirstReceivedPage(state, cachedHits) === 0;
165
173
  } else {
174
+ var _results$disjunctiveF, _results$facets, _results$hierarchical;
166
175
  var _state$page3 = state.page,
167
176
  _page = _state$page3 === void 0 ? 0 : _state$page3;
168
177
  if (escapeHTML && results.hits.length > 0) {
@@ -173,10 +182,24 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
173
182
  var transformedHits = transformItems(hitsWithAbsolutePositionAndQueryID, {
174
183
  results: results
175
184
  });
176
- if (cachedHits[_page] === undefined && !results.__isArtificial && instantSearchInstance.status === 'idle') {
185
+
186
+ /*
187
+ With dynamic widgets, facets are not included in the state before their relevant widgets are mounted. Until then, we need to bail out of writing this incomplete state representation in cache.
188
+ */
189
+ var hasDynamicWidgets = false;
190
+ (0, _utils.walkIndex)(instantSearchInstance.mainIndex, function (indexWidget) {
191
+ if (!hasDynamicWidgets && indexWidget.getWidgets().some(function (_ref7) {
192
+ var $$type = _ref7.$$type;
193
+ return $$type === 'ais.dynamicWidgets';
194
+ })) {
195
+ hasDynamicWidgets = true;
196
+ }
197
+ });
198
+ var hasNoFacets = !((_results$disjunctiveF = results.disjunctiveFacets) !== null && _results$disjunctiveF !== void 0 && _results$disjunctiveF.length) && !((_results$facets = results.facets) !== null && _results$facets !== void 0 && _results$facets.length) && !((_results$hierarchical = results.hierarchicalFacets) !== null && _results$hierarchical !== void 0 && _results$hierarchical.length);
199
+ if (cachedHits[_page] === undefined && !results.__isArtificial && instantSearchInstance.status === 'idle' && !(hasDynamicWidgets && hasNoFacets)) {
177
200
  cachedHits[_page] = transformedHits;
178
201
  cache.write({
179
- state: state,
202
+ state: normalizeState(state),
180
203
  hits: cachedHits
181
204
  });
182
205
  }
@@ -198,8 +221,8 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
198
221
  widgetParams: widgetParams
199
222
  };
200
223
  },
201
- dispose: function dispose(_ref6) {
202
- var state = _ref6.state;
224
+ dispose: function dispose(_ref8) {
225
+ var state = _ref8.state;
203
226
  unmountFn();
204
227
  var stateWithoutPage = state.setQueryParameter('page', undefined);
205
228
  if (!escapeHTML) {
@@ -209,8 +232,8 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
209
232
  return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, key, undefined));
210
233
  }, {}));
211
234
  },
212
- getWidgetUiState: function getWidgetUiState(uiState, _ref7) {
213
- var searchParameters = _ref7.searchParameters;
235
+ getWidgetUiState: function getWidgetUiState(uiState, _ref9) {
236
+ var searchParameters = _ref9.searchParameters;
214
237
  var page = searchParameters.page || 0;
215
238
  if (!page) {
216
239
  // return without adding `page` to uiState
@@ -223,8 +246,8 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
223
246
  page: page + 1
224
247
  });
225
248
  },
226
- getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref8) {
227
- var uiState = _ref8.uiState;
249
+ getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref10) {
250
+ var uiState = _ref10.uiState;
228
251
  var widgetSearchParameters = searchParameters;
229
252
  if (escapeHTML) {
230
253
  widgetSearchParameters = searchParameters.setQueryParameters(_utils.TAG_PLACEHOLDER);
@@ -127,7 +127,7 @@ var connectMenu = function connectMenu(renderFn) {
127
127
  var _helper$getHierarchic = helper.getHierarchicalFacetBreadcrumb(attribute),
128
128
  _helper$getHierarchic2 = _slicedToArray(_helper$getHierarchic, 1),
129
129
  refinedItem = _helper$getHierarchic2[0];
130
- sendEvent('click', facetValue ? facetValue : refinedItem);
130
+ sendEvent('click:internal', facetValue ? facetValue : refinedItem);
131
131
  helper.toggleFacetRefinement(attribute, facetValue ? facetValue : refinedItem).search();
132
132
  };
133
133
  }
@@ -143,7 +143,7 @@ var connectNumericMenu = function connectNumericMenu(renderFn) {
143
143
  if (!connectorState.refine) {
144
144
  connectorState.refine = function (facetValue) {
145
145
  var refinedState = getRefinedState(helper.state, attribute, facetValue);
146
- connectorState.sendEvent('click', facetValue);
146
+ connectorState.sendEvent('click:internal', facetValue);
147
147
  helper.setState(refinedState).search();
148
148
  };
149
149
  }
@@ -41,10 +41,13 @@ var createSendEvent = function createSendEvent(_ref) {
41
41
  instantSearchInstance.sendEventToInsights(args[0]);
42
42
  return;
43
43
  }
44
- var eventType = args[0],
45
- facetValue = args[1],
44
+ var facetValue = args[1],
46
45
  _args$ = args[2],
47
46
  eventName = _args$ === void 0 ? 'Filter Applied' : _args$;
47
+ var _args$0$split = args[0].split(':'),
48
+ _args$0$split2 = _slicedToArray(_args$0$split, 2),
49
+ eventType = _args$0$split2[0],
50
+ eventModifier = _args$0$split2[1];
48
51
  if (eventType !== 'click') {
49
52
  return;
50
53
  }
@@ -54,6 +57,7 @@ var createSendEvent = function createSendEvent(_ref) {
54
57
  insightsMethod: 'clickedFilters',
55
58
  widgetType: $$type,
56
59
  eventType: eventType,
60
+ eventModifier: eventModifier,
57
61
  payload: {
58
62
  eventName: eventName,
59
63
  index: helper.getIndex(),
@@ -129,7 +133,7 @@ var connectRatingMenu = function connectRatingMenu(renderFn) {
129
133
  return emptyState;
130
134
  }
131
135
  var toggleRefinement = function toggleRefinement(helper, facetValue) {
132
- sendEvent('click', facetValue);
136
+ sendEvent('click:internal', facetValue);
133
137
  helper.setState(getRefinedState(helper.state, facetValue)).search();
134
138
  };
135
139
  var connectorState = {
@@ -178,7 +178,7 @@ var connectRefinementList = function connectRefinementList(renderFn) {
178
178
  widgetType: this.$$type
179
179
  });
180
180
  triggerRefine = function triggerRefine(facetValue) {
181
- sendEvent('click', facetValue);
181
+ sendEvent('click:internal', facetValue);
182
182
  helper.toggleFacetRefinement(attribute, facetValue).search();
183
183
  };
184
184
  searchForFacetValues = createSearchForFacetValues(helper, this);
@@ -1,16 +1,22 @@
1
1
  "use strict";
2
2
 
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.default = void 0;
7
8
  var _utils = require("../../lib/utils");
8
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
9
9
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
10
10
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
11
11
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
12
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
13
13
  function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
14
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
15
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
16
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
17
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
18
+ function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
19
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
20
  var withUsage = (0, _utils.createDocumentationMessageGenerator)({
15
21
  name: 'toggle-refinement',
16
22
  connector: true
@@ -29,10 +35,13 @@ var createSendEvent = function createSendEvent(_ref) {
29
35
  instantSearchInstance.sendEventToInsights(args[0]);
30
36
  return;
31
37
  }
32
- var eventType = args[0],
33
- isRefined = args[1],
38
+ var isRefined = args[1],
34
39
  _args$ = args[2],
35
40
  eventName = _args$ === void 0 ? 'Filter Applied' : _args$;
41
+ var _args$0$split = args[0].split(':'),
42
+ _args$0$split2 = _slicedToArray(_args$0$split, 2),
43
+ eventType = _args$0$split2[0],
44
+ eventModifier = _args$0$split2[1];
36
45
  if (eventType !== 'click' || on === undefined) {
37
46
  return;
38
47
  }
@@ -44,6 +53,7 @@ var createSendEvent = function createSendEvent(_ref) {
44
53
  insightsMethod: 'clickedFilters',
45
54
  widgetType: $$type,
46
55
  eventType: eventType,
56
+ eventModifier: eventModifier,
47
57
  payload: {
48
58
  eventName: eventName,
49
59
  index: helper.getIndex(),
@@ -90,7 +100,7 @@ var connectToggleRefinement = function connectToggleRefinement(renderFn) {
90
100
  },
91
101
  isRefined = _ref3.isRefined;
92
102
  if (!isRefined) {
93
- sendEvent('click', isRefined);
103
+ sendEvent('click:internal', isRefined);
94
104
  if (hasAnOffValue) {
95
105
  off.forEach(function (v) {
96
106
  return helper.removeDisjunctiveFacetRefinement(attribute, v);
@@ -4,11 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = insights;
7
- exports.hasDataAttributes = hasDataAttributes;
8
7
  exports.readDataAttributes = readDataAttributes;
9
8
  exports.writeDataAttributes = writeDataAttributes;
10
9
  var _utils = require("../lib/utils");
11
10
  function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
11
+ /** @deprecated use bindEvent instead */
12
12
  function readDataAttributes(domElement) {
13
13
  var method = domElement.getAttribute('data-insights-method');
14
14
  var serializedPayload = domElement.getAttribute('data-insights-payload');
@@ -25,9 +25,8 @@ function readDataAttributes(domElement) {
25
25
  throw new Error('The insights helper was unable to parse `data-insights-payload`.');
26
26
  }
27
27
  }
28
- function hasDataAttributes(domElement) {
29
- return domElement.hasAttribute('data-insights-method');
30
- }
28
+
29
+ /** @deprecated use bindEvent instead */
31
30
  function writeDataAttributes(_ref) {
32
31
  var method = _ref.method,
33
32
  payload = _ref.payload;
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _events = _interopRequireDefault(require("@algolia/events"));
8
8
  var _algoliasearchHelper = _interopRequireDefault(require("algoliasearch-helper"));
9
+ var _createInsightsMiddleware = require("../middlewares/createInsightsMiddleware");
9
10
  var _createMetadataMiddleware = require("../middlewares/createMetadataMiddleware");
10
11
  var _createRouterMiddleware = require("../middlewares/createRouterMiddleware");
11
12
  var _index = _interopRequireDefault(require("../widgets/index/index"));
@@ -106,12 +107,14 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
106
107
  }));
107
108
  _this.setMaxListeners(100);
108
109
  var _options$indexName = options.indexName,
109
- indexName = _options$indexName === void 0 ? null : _options$indexName,
110
+ indexName = _options$indexName === void 0 ? '' : _options$indexName,
110
111
  numberLocale = options.numberLocale,
111
112
  _options$initialUiSta = options.initialUiState,
112
113
  initialUiState = _options$initialUiSta === void 0 ? {} : _options$initialUiSta,
113
114
  _options$routing = options.routing,
114
115
  routing = _options$routing === void 0 ? null : _options$routing,
116
+ _options$insights = options.insights,
117
+ insights = _options$insights === void 0 ? false : _options$insights,
115
118
  searchFunction = options.searchFunction,
116
119
  _options$stalledSearc = options.stalledSearchDelay,
117
120
  stalledSearchDelay = _options$stalledSearc === void 0 ? 200 : _options$stalledSearc,
@@ -121,9 +124,6 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
121
124
  insightsClient = _options$insightsClie === void 0 ? null : _options$insightsClie,
122
125
  _options$onStateChang = options.onStateChange,
123
126
  onStateChange = _options$onStateChang === void 0 ? null : _options$onStateChang;
124
- if (indexName === null) {
125
- throw new Error(withUsage('The `indexName` option is required.'));
126
- }
127
127
  if (searchClient === null) {
128
128
  throw new Error(withUsage('The `searchClient` option is required.'));
129
129
  }
@@ -167,11 +167,22 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
167
167
  }
168
168
  _this.sendEventToInsights = _utils.noop;
169
169
  if (routing) {
170
- var routerOptions = typeof routing === 'boolean' ? undefined : routing;
170
+ var routerOptions = typeof routing === 'boolean' ? {} : routing;
171
+ routerOptions.$$internal = true;
171
172
  _this.use((0, _createRouterMiddleware.createRouterMiddleware)(routerOptions));
172
173
  }
174
+
175
+ // This is the default middleware,
176
+ // any user-provided middleware will be added later and override this one.
177
+ if (insights) {
178
+ var insightsOptions = typeof insights === 'boolean' ? {} : insights;
179
+ insightsOptions.$$internal = true;
180
+ _this.use((0, _createInsightsMiddleware.createInsightsMiddleware)(insightsOptions));
181
+ }
173
182
  if ((0, _createMetadataMiddleware.isMetadataEnabled)()) {
174
- _this.use((0, _createMetadataMiddleware.createMetadataMiddleware)());
183
+ _this.use((0, _createMetadataMiddleware.createMetadataMiddleware)({
184
+ $$internal: true
185
+ }));
175
186
  }
176
187
  return _this;
177
188
  }
@@ -207,6 +218,8 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
207
218
  }
208
219
  var newMiddlewareList = middleware.map(function (fn) {
209
220
  var newMiddleware = _objectSpread({
221
+ $$type: '__unknown__',
222
+ $$internal: false,
210
223
  subscribe: _utils.noop,
211
224
  started: _utils.noop,
212
225
  unsubscribe: _utils.noop,
@@ -352,6 +365,7 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
352
365
  mainHelper.search = function () {
353
366
  _this3.status = 'loading';
354
367
  _this3.scheduleRender(false);
368
+ process.env.NODE_ENV === 'development' ? (0, _utils.warning)(Boolean(_this3.indexName) || _this3.mainIndex.getWidgets().some(_utils.isIndexWidget), 'No indexName provided, nor an explicit index widget in the widgets tree. This is required to be able to display results.') : void 0;
355
369
 
356
370
  // This solution allows us to keep the exact same API for the users but
357
371
  // under the hood, we have a different implementation. It should be
@@ -3,11 +3,40 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
6
+ exports.createInsightsEventHandler = void 0;
7
+ exports.default = withInsightsListener;
7
8
  var _preact = require("preact");
8
9
  var _insights = require("../../helpers/insights");
9
10
  var _utils = require("../utils");
10
- var findInsightsTarget = function findInsightsTarget(startElement, endElement, validator) {
11
+ var createInsightsEventHandler = function createInsightsEventHandler(_ref) {
12
+ var insights = _ref.insights,
13
+ sendEvent = _ref.sendEvent;
14
+ return function (event) {
15
+ // new way, e.g. bindEvent("click", hit, "Hit clicked")
16
+ var insightsThroughSendEvent = findInsightsTarget(event.target, event.currentTarget, function (element) {
17
+ return element.hasAttribute('data-insights-event');
18
+ });
19
+ if (insightsThroughSendEvent) {
20
+ var payload = parseInsightsEvent(insightsThroughSendEvent);
21
+ payload.forEach(function (single) {
22
+ return sendEvent(single);
23
+ });
24
+ }
25
+
26
+ // old way, e.g. instantsearch.insights("clickedObjectIDsAfterSearch", { .. })
27
+ var insightsThroughFunction = findInsightsTarget(event.target, event.currentTarget, function (element) {
28
+ return element.hasAttribute('data-insights-method') && element.hasAttribute('data-insights-payload');
29
+ });
30
+ if (insightsThroughFunction) {
31
+ var _readDataAttributes = (0, _insights.readDataAttributes)(insightsThroughFunction),
32
+ method = _readDataAttributes.method,
33
+ _payload = _readDataAttributes.payload;
34
+ insights(method, _payload);
35
+ }
36
+ };
37
+ };
38
+ exports.createInsightsEventHandler = createInsightsEventHandler;
39
+ function findInsightsTarget(startElement, endElement, validator) {
11
40
  var element = startElement;
12
41
  while (element && !validator(element)) {
13
42
  if (element === endElement) {
@@ -16,8 +45,8 @@ var findInsightsTarget = function findInsightsTarget(startElement, endElement, v
16
45
  element = element.parentElement;
17
46
  }
18
47
  return element;
19
- };
20
- var parseInsightsEvent = function parseInsightsEvent(element) {
48
+ }
49
+ function parseInsightsEvent(element) {
21
50
  var serializedPayload = element.getAttribute('data-insights-event');
22
51
  if (typeof serializedPayload !== 'string') {
23
52
  throw new Error('The insights middleware expects `data-insights-event` to be a base64-encoded JSON string.');
@@ -27,39 +56,17 @@ var parseInsightsEvent = function parseInsightsEvent(element) {
27
56
  } catch (error) {
28
57
  throw new Error('The insights middleware was unable to parse `data-insights-event`.');
29
58
  }
30
- };
31
- var insightsListener = function insightsListener(BaseComponent) {
32
- function WithInsightsListener(props) {
33
- var handleClick = function handleClick(event) {
34
- if (props.sendEvent) {
35
- // new way with insights middleware
36
- var targetWithEvent = findInsightsTarget(event.target, event.currentTarget, function (element) {
37
- return element.hasAttribute('data-insights-event');
38
- });
39
- if (targetWithEvent) {
40
- var payload = parseInsightsEvent(targetWithEvent);
41
- payload.forEach(function (single) {
42
- return props.sendEvent(single);
43
- });
44
- }
45
- }
59
+ }
46
60
 
47
- // old way, e.g. instantsearch.insights("clickedObjectIDsAfterSearch", { .. })
48
- var insightsTarget = findInsightsTarget(event.target, event.currentTarget, function (element) {
49
- return (0, _insights.hasDataAttributes)(element);
50
- });
51
- if (insightsTarget) {
52
- var _readDataAttributes = (0, _insights.readDataAttributes)(insightsTarget),
53
- method = _readDataAttributes.method,
54
- _payload = _readDataAttributes.payload;
55
- props.insights(method, _payload);
56
- }
57
- };
61
+ /**
62
+ * @deprecated use `sendEvent` directly instead
63
+ */
64
+ function withInsightsListener(BaseComponent) {
65
+ process.env.NODE_ENV === 'development' ? (0, _utils.warning)(false, 'The `withInsightsListener` function is deprecated and will be removed in the next major version. Please use `sendEvent` directly instead.') : void 0;
66
+ return function WithInsightsListener(props) {
67
+ var handleClick = createInsightsEventHandler(props);
58
68
  return (0, _preact.h)("div", {
59
69
  onClick: handleClick
60
70
  }, (0, _preact.h)(BaseComponent, props));
61
- }
62
- return WithInsightsListener;
63
- };
64
- var _default = insightsListener;
65
- exports.default = _default;
71
+ };
72
+ }
@@ -22,6 +22,48 @@ var setWindowTitle = function setWindowTitle(title) {
22
22
  }
23
23
  };
24
24
  var BrowserHistory = /*#__PURE__*/function () {
25
+ /**
26
+ * Transforms a UI state into a title for the page.
27
+ */
28
+
29
+ /**
30
+ * Time in milliseconds before performing a write in the history.
31
+ * It prevents from adding too many entries in the history and
32
+ * makes the back button more usable.
33
+ *
34
+ * @default 400
35
+ */
36
+
37
+ /**
38
+ * Creates a full URL based on the route state.
39
+ * The storage adaptor maps all syncable keys to the query string of the URL.
40
+ */
41
+
42
+ /**
43
+ * Parses the URL into a route state.
44
+ * It should be symmetrical to `createURL`.
45
+ */
46
+
47
+ /**
48
+ * Returns the location to store in the history.
49
+ * @default () => window.location
50
+ */
51
+
52
+ /**
53
+ * Indicates if last action was back/forward in the browser.
54
+ */
55
+
56
+ /**
57
+ * Indicates whether the history router is disposed or not.
58
+ */
59
+
60
+ /**
61
+ * Indicates the window.history.length before the last call to
62
+ * window.history.pushState (called in `write`).
63
+ * It allows to determine if a `pushState` has been triggered elsewhere,
64
+ * and thus to prevent the `write` method from calling `pushState`.
65
+ */
66
+
25
67
  /**
26
68
  * Initializes a new storage provider that syncs the search state to the URL
27
69
  * using web APIs (`window.location.pushState` and `onpopstate` event).
@@ -38,12 +80,14 @@ var BrowserHistory = /*#__PURE__*/function () {
38
80
  dispose = _ref.dispose,
39
81
  push = _ref.push;
40
82
  _classCallCheck(this, BrowserHistory);
83
+ _defineProperty(this, "$$type", 'ais.browser');
41
84
  _defineProperty(this, "windowTitle", void 0);
42
85
  _defineProperty(this, "writeDelay", void 0);
43
86
  _defineProperty(this, "_createURL", void 0);
44
87
  _defineProperty(this, "parseURL", void 0);
45
88
  _defineProperty(this, "getLocation", void 0);
46
89
  _defineProperty(this, "writeTimer", void 0);
90
+ _defineProperty(this, "_onPopState", void 0);
47
91
  _defineProperty(this, "inPopState", false);
48
92
  _defineProperty(this, "isDisposed", false);
49
93
  _defineProperty(this, "latestAcknowledgedHistory", 0);
@@ -149,11 +193,21 @@ var BrowserHistory = /*#__PURE__*/function () {
149
193
  }, {
150
194
  key: "createURL",
151
195
  value: function createURL(routeState) {
152
- return this._createURL({
196
+ var url = this._createURL({
153
197
  qsModule: _qs.default,
154
198
  routeState: routeState,
155
199
  location: this.getLocation()
156
200
  });
201
+ if (process.env.NODE_ENV === 'development') {
202
+ try {
203
+ // We just want to check if the URL is valid.
204
+ // eslint-disable-next-line no-new
205
+ new URL(url);
206
+ } catch (e) {
207
+ process.env.NODE_ENV === 'development' ? (0, _utils.warning)(false, "The URL returned by the `createURL` function is invalid.\nPlease make sure it returns an absolute URL to avoid issues, e.g: `https://algolia.com/search?query=iphone`.") : void 0;
208
+ }
209
+ }
210
+ return url;
157
211
  }
158
212
 
159
213
  /**
@@ -24,6 +24,7 @@ function getIndexStateWithoutConfigure(uiState) {
24
24
  // which excludes "configure" as this function does.
25
25
  function simpleStateMapping() {
26
26
  return {
27
+ $$type: 'ais.simple',
27
28
  stateToRoute: function stateToRoute(uiState) {
28
29
  return Object.keys(uiState).reduce(function (state, indexId) {
29
30
  return _objectSpread(_objectSpread({}, state), {}, _defineProperty({}, indexId, getIndexStateWithoutConfigure(uiState[indexId])));
@@ -18,6 +18,7 @@ function getIndexStateWithoutConfigure(uiState) {
18
18
  }
19
19
  function singleIndexStateMapping(indexName) {
20
20
  return {
21
+ $$type: 'ais.singleIndex',
21
22
  stateToRoute: function stateToRoute(uiState) {
22
23
  return getIndexStateWithoutConfigure(uiState[indexName] || {});
23
24
  },