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
@@ -35,7 +35,7 @@ var connectAutocomplete = function connectAutocomplete(renderFn) {
35
35
  renderState.indices.forEach(function (_ref3) {
36
36
  var sendEvent = _ref3.sendEvent,
37
37
  hits = _ref3.hits;
38
- sendEvent('view', hits);
38
+ sendEvent('view:internal', hits);
39
39
  });
40
40
  renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
41
41
  instantSearchInstance: instantSearchInstance
@@ -53,7 +53,7 @@ export type CurrentRefinementsConnectorParamsItem = {
53
53
  /**
54
54
  * Removes the given refinement and triggers a new search.
55
55
  */
56
- refine(refinement: CurrentRefinementsConnectorParamsRefinement): void;
56
+ refine: (refinement: CurrentRefinementsConnectorParamsRefinement) => void;
57
57
  };
58
58
  export type CurrentRefinementsConnectorParams = {
59
59
  /**
@@ -87,7 +87,7 @@ export type CurrentRefinementsRenderState = {
87
87
  /**
88
88
  * Removes the given refinement and triggers a new search.
89
89
  */
90
- refine(refinement: CurrentRefinementsConnectorParamsRefinement): void;
90
+ refine: (refinement: CurrentRefinementsConnectorParamsRefinement) => void;
91
91
  /**
92
92
  * Generates a URL for the next state.
93
93
  */
@@ -11,10 +11,10 @@ export type DynamicWidgetsConnectorParams = {
11
11
  * Function to return a fallback widget when an attribute isn't found in
12
12
  * `widgets`.
13
13
  */
14
- fallbackWidget?(args: {
14
+ fallbackWidget?: (args: {
15
15
  /** The attribute name to create a widget for. */
16
16
  attribute: string;
17
- }): Widget;
17
+ }) => Widget;
18
18
  /**
19
19
  * Function to transform the items to render.
20
20
  * The function also exposes the full search response.
@@ -15,7 +15,7 @@ export type GeoSearchRenderState<THit extends BaseHit = Record<string, any>> = {
15
15
  /**
16
16
  * Reset the current bounding box refinement.
17
17
  */
18
- clearMapRefinement(): void;
18
+ clearMapRefinement: () => void;
19
19
  /**
20
20
  * The current bounding box of the search.
21
21
  */
@@ -23,15 +23,15 @@ export type GeoSearchRenderState<THit extends BaseHit = Record<string, any>> = {
23
23
  /**
24
24
  * Return true if the map has move since the last refinement.
25
25
  */
26
- hasMapMoveSinceLastRefine(): boolean;
26
+ hasMapMoveSinceLastRefine: () => boolean;
27
27
  /**
28
28
  * Return true if the current refinement is set with the map bounds.
29
29
  */
30
- isRefinedWithMap(): boolean;
30
+ isRefinedWithMap: () => boolean;
31
31
  /**
32
32
  * Return true if the user is able to refine on map move.
33
33
  */
34
- isRefineOnMapMove(): boolean;
34
+ isRefineOnMapMove: () => boolean;
35
35
  /**
36
36
  * The matched hits from Algolia API.
37
37
  */
@@ -43,7 +43,7 @@ export type GeoSearchRenderState<THit extends BaseHit = Record<string, any>> = {
43
43
  /**
44
44
  * Sets a bounding box to filter the results from the given map bounds.
45
45
  */
46
- refine(bounds: Bounds): void;
46
+ refine: (bounds: Bounds) => void;
47
47
  /**
48
48
  * Send event to insights middleware
49
49
  */
@@ -53,11 +53,11 @@ export type GeoSearchRenderState<THit extends BaseHit = Record<string, any>> = {
53
53
  * called on each map move. The call to the function triggers a new rendering
54
54
  * only when the value change.
55
55
  */
56
- setMapMoveSinceLastRefine(): void;
56
+ setMapMoveSinceLastRefine: () => void;
57
57
  /**
58
58
  * Toggle the fact that the user is able to refine on map move.
59
59
  */
60
- toggleRefineOnMapMove(): void;
60
+ toggleRefineOnMapMove: () => void;
61
61
  };
62
62
  export type GeoSearchConnectorParams<THit extends BaseHit = Record<string, any>> = {
63
63
  /**
@@ -131,7 +131,7 @@ var connectGeoSearch = function connectGeoSearch(renderFn) {
131
131
  widgetState.internalToggleRefineOnMapMove = createInternalToggleRefinementOnMapMove(renderArgs, this.render.bind(this));
132
132
  widgetState.internalSetMapMoveSinceLastRefine = createInternalSetMapMoveSinceLastRefine(renderArgs, this.render.bind(this));
133
133
  var widgetRenderState = this.getWidgetRenderState(renderArgs);
134
- sendEvent('view', widgetRenderState.items);
134
+ sendEvent('view:internal', widgetRenderState.items);
135
135
  renderFn(_objectSpread(_objectSpread({}, widgetRenderState), {}, {
136
136
  instantSearchInstance: instantSearchInstance
137
137
  }), isFirstRendering);
@@ -155,7 +155,7 @@ var connectHierarchicalMenu = function connectHierarchicalMenu(renderFn) {
155
155
  }
156
156
  if (!_refine) {
157
157
  _refine = function _refine(facetValue) {
158
- sendEvent('click', facetValue);
158
+ sendEvent('click:internal', facetValue);
159
159
  helper.toggleFacetRefinement(hierarchicalFacetName, facetValue).search();
160
160
  };
161
161
  }
@@ -34,7 +34,7 @@ var connectHits = function connectHits(renderFn) {
34
34
  renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
35
35
  instantSearchInstance: renderOptions.instantSearchInstance
36
36
  }), false);
37
- renderState.sendEvent('view', renderState.hits);
37
+ renderState.sendEvent('view:internal', renderState.hits);
38
38
  },
39
39
  getRenderState: function getRenderState(renderState, renderOptions) {
40
40
  return _objectSpread(_objectSpread({}, renderState), {}, {
@@ -1,5 +1,6 @@
1
1
  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); }
2
- var _excluded = ["page"];
2
+ var _excluded = ["page"],
3
+ _excluded2 = ["clickAnalytics", "userToken"];
3
4
  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; }
4
5
  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; }
5
6
  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; }
@@ -13,7 +14,7 @@ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToAr
13
14
  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; }
14
15
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
15
16
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
16
- import { escapeHits, TAG_PLACEHOLDER, checkRendering, createDocumentationMessageGenerator, isEqual, addAbsolutePosition, addQueryID, noop, createSendEventForHits, createBindEventForHits } from "../../lib/utils/index.js";
17
+ import { escapeHits, TAG_PLACEHOLDER, checkRendering, createDocumentationMessageGenerator, isEqual, addAbsolutePosition, addQueryID, noop, createSendEventForHits, createBindEventForHits, walkIndex } from "../../lib/utils/index.js";
17
18
  var withUsage = createDocumentationMessageGenerator({
18
19
  name: 'infinite-hits',
19
20
  connector: true
@@ -24,17 +25,24 @@ function getStateWithoutPage(state) {
24
25
  rest = _objectWithoutProperties(_ref, _excluded);
25
26
  return rest;
26
27
  }
28
+ function normalizeState(state) {
29
+ var _ref2 = state || {},
30
+ clickAnalytics = _ref2.clickAnalytics,
31
+ userToken = _ref2.userToken,
32
+ rest = _objectWithoutProperties(_ref2, _excluded2);
33
+ return rest;
34
+ }
27
35
  function getInMemoryCache() {
28
36
  var cachedHits = null;
29
37
  var cachedState = null;
30
38
  return {
31
- read: function read(_ref2) {
32
- var state = _ref2.state;
39
+ read: function read(_ref3) {
40
+ var state = _ref3.state;
33
41
  return isEqual(cachedState, getStateWithoutPage(state)) ? cachedHits : null;
34
42
  },
35
- write: function write(_ref3) {
36
- var state = _ref3.state,
37
- hits = _ref3.hits;
43
+ write: function write(_ref4) {
44
+ var state = _ref4.state,
45
+ hits = _ref4.hits;
38
46
  cachedState = getStateWithoutPage(state);
39
47
  cachedHits = hits;
40
48
  }
@@ -54,15 +62,15 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
54
62
  // @TODO: this should be a generic, but a Connector can not yet be generic itself
55
63
 
56
64
  return function (widgetParams) {
57
- var _ref4 = widgetParams || {},
58
- _ref4$escapeHTML = _ref4.escapeHTML,
59
- escapeHTML = _ref4$escapeHTML === void 0 ? true : _ref4$escapeHTML,
60
- _ref4$transformItems = _ref4.transformItems,
61
- transformItems = _ref4$transformItems === void 0 ? function (items) {
65
+ var _ref5 = widgetParams || {},
66
+ _ref5$escapeHTML = _ref5.escapeHTML,
67
+ escapeHTML = _ref5$escapeHTML === void 0 ? true : _ref5$escapeHTML,
68
+ _ref5$transformItems = _ref5.transformItems,
69
+ transformItems = _ref5$transformItems === void 0 ? function (items) {
62
70
  return items;
63
- } : _ref4$transformItems,
64
- _ref4$cache = _ref4.cache,
65
- cache = _ref4$cache === void 0 ? getInMemoryCache() : _ref4$cache;
71
+ } : _ref5$transformItems,
72
+ _ref5$cache = _ref5.cache,
73
+ cache = _ref5$cache === void 0 ? getInMemoryCache() : _ref5$cache;
66
74
  var showPrevious;
67
75
  var showMore;
68
76
  var sendEvent;
@@ -93,7 +101,7 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
93
101
  // avoid updating the browser URL when the user displays the previous page.
94
102
  helper.overrideStateWithoutTriggeringChangeEvent(_objectSpread(_objectSpread({}, helper.state), {}, {
95
103
  page: getFirstReceivedPage(helper.state, cache.read({
96
- state: helper.state
104
+ state: normalizeState(helper.state)
97
105
  }) || {}) - 1
98
106
  })).searchWithoutTriggeringOnStateChange();
99
107
  };
@@ -101,7 +109,7 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
101
109
  var getShowMore = function getShowMore(helper) {
102
110
  return function () {
103
111
  helper.setPage(getLastReceivedPage(helper.state, cache.read({
104
- state: helper.state
112
+ state: normalizeState(helper.state)
105
113
  }) || {}) + 1).search();
106
114
  };
107
115
  };
@@ -118,19 +126,19 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
118
126
  renderFn(_objectSpread(_objectSpread({}, widgetRenderState), {}, {
119
127
  instantSearchInstance: instantSearchInstance
120
128
  }), false);
121
- sendEvent('view', widgetRenderState.currentPageHits);
129
+ sendEvent('view:internal', widgetRenderState.currentPageHits);
122
130
  },
123
131
  getRenderState: function getRenderState(renderState, renderOptions) {
124
132
  return _objectSpread(_objectSpread({}, renderState), {}, {
125
133
  infiniteHits: this.getWidgetRenderState(renderOptions)
126
134
  });
127
135
  },
128
- getWidgetRenderState: function getWidgetRenderState(_ref5) {
129
- var results = _ref5.results,
130
- helper = _ref5.helper,
131
- parent = _ref5.parent,
132
- existingState = _ref5.state,
133
- instantSearchInstance = _ref5.instantSearchInstance;
136
+ getWidgetRenderState: function getWidgetRenderState(_ref6) {
137
+ var results = _ref6.results,
138
+ helper = _ref6.helper,
139
+ parent = _ref6.parent,
140
+ existingState = _ref6.state,
141
+ instantSearchInstance = _ref6.instantSearchInstance;
134
142
  var isFirstPage;
135
143
  var currentPageHits = [];
136
144
  /**
@@ -140,7 +148,7 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
140
148
  */
141
149
  var state = parent.getPreviousState() || existingState;
142
150
  var cachedHits = cache.read({
143
- state: state
151
+ state: normalizeState(state)
144
152
  }) || {};
145
153
  if (!results) {
146
154
  showPrevious = getShowPrevious(helper);
@@ -157,6 +165,7 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
157
165
  });
158
166
  isFirstPage = state.page === undefined || getFirstReceivedPage(state, cachedHits) === 0;
159
167
  } else {
168
+ var _results$disjunctiveF, _results$facets, _results$hierarchical;
160
169
  var _state$page3 = state.page,
161
170
  _page = _state$page3 === void 0 ? 0 : _state$page3;
162
171
  if (escapeHTML && results.hits.length > 0) {
@@ -167,10 +176,24 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
167
176
  var transformedHits = transformItems(hitsWithAbsolutePositionAndQueryID, {
168
177
  results: results
169
178
  });
170
- if (cachedHits[_page] === undefined && !results.__isArtificial && instantSearchInstance.status === 'idle') {
179
+
180
+ /*
181
+ 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.
182
+ */
183
+ var hasDynamicWidgets = false;
184
+ walkIndex(instantSearchInstance.mainIndex, function (indexWidget) {
185
+ if (!hasDynamicWidgets && indexWidget.getWidgets().some(function (_ref7) {
186
+ var $$type = _ref7.$$type;
187
+ return $$type === 'ais.dynamicWidgets';
188
+ })) {
189
+ hasDynamicWidgets = true;
190
+ }
191
+ });
192
+ 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);
193
+ if (cachedHits[_page] === undefined && !results.__isArtificial && instantSearchInstance.status === 'idle' && !(hasDynamicWidgets && hasNoFacets)) {
171
194
  cachedHits[_page] = transformedHits;
172
195
  cache.write({
173
- state: state,
196
+ state: normalizeState(state),
174
197
  hits: cachedHits
175
198
  });
176
199
  }
@@ -192,8 +215,8 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
192
215
  widgetParams: widgetParams
193
216
  };
194
217
  },
195
- dispose: function dispose(_ref6) {
196
- var state = _ref6.state;
218
+ dispose: function dispose(_ref8) {
219
+ var state = _ref8.state;
197
220
  unmountFn();
198
221
  var stateWithoutPage = state.setQueryParameter('page', undefined);
199
222
  if (!escapeHTML) {
@@ -203,8 +226,8 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
203
226
  return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, key, undefined));
204
227
  }, {}));
205
228
  },
206
- getWidgetUiState: function getWidgetUiState(uiState, _ref7) {
207
- var searchParameters = _ref7.searchParameters;
229
+ getWidgetUiState: function getWidgetUiState(uiState, _ref9) {
230
+ var searchParameters = _ref9.searchParameters;
208
231
  var page = searchParameters.page || 0;
209
232
  if (!page) {
210
233
  // return without adding `page` to uiState
@@ -217,8 +240,8 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
217
240
  page: page + 1
218
241
  });
219
242
  },
220
- getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref8) {
221
- var uiState = _ref8.uiState;
243
+ getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref10) {
244
+ var uiState = _ref10.uiState;
222
245
  var widgetSearchParameters = searchParameters;
223
246
  if (escapeHTML) {
224
247
  widgetSearchParameters = searchParameters.setQueryParameters(TAG_PLACEHOLDER);
@@ -61,7 +61,7 @@ export type MenuRenderState = {
61
61
  /**
62
62
  * Filter the search to item value.
63
63
  */
64
- refine(value: string): void;
64
+ refine: (value: string) => void;
65
65
  /**
66
66
  * True if refinement can be applied.
67
67
  */
@@ -73,7 +73,7 @@ export type MenuRenderState = {
73
73
  /**
74
74
  * Toggles the number of values displayed between `limit` and `showMore.limit`.
75
75
  */
76
- toggleShowMore(): void;
76
+ toggleShowMore: () => void;
77
77
  /**
78
78
  * `true` if the toggleShowMore button can be activated (enough items to display more or
79
79
  * already displaying more than `limit` items)
@@ -121,7 +121,7 @@ var connectMenu = function connectMenu(renderFn) {
121
121
  var _helper$getHierarchic = helper.getHierarchicalFacetBreadcrumb(attribute),
122
122
  _helper$getHierarchic2 = _slicedToArray(_helper$getHierarchic, 1),
123
123
  refinedItem = _helper$getHierarchic2[0];
124
- sendEvent('click', facetValue ? facetValue : refinedItem);
124
+ sendEvent('click:internal', facetValue ? facetValue : refinedItem);
125
125
  helper.toggleFacetRefinement(attribute, facetValue ? facetValue : refinedItem).search();
126
126
  };
127
127
  }
@@ -137,7 +137,7 @@ var connectNumericMenu = function connectNumericMenu(renderFn) {
137
137
  if (!connectorState.refine) {
138
138
  connectorState.refine = function (facetValue) {
139
139
  var refinedState = getRefinedState(helper.state, attribute, facetValue);
140
- connectorState.sendEvent('click', facetValue);
140
+ connectorState.sendEvent('click:internal', facetValue);
141
141
  helper.setState(refinedState).search();
142
142
  };
143
143
  }
@@ -14,7 +14,7 @@ export type PaginationRenderState = {
14
14
  /** Creates URLs for the next state, the number is the page to generate the URL for. */
15
15
  createURL: CreateURL<number>;
16
16
  /** Sets the current page and triggers a search. */
17
- refine(page: number): void;
17
+ refine: (page: number) => void;
18
18
  /** true if this search returned more than one page */
19
19
  canRefine: boolean;
20
20
  /** The number of the page currently displayed. */
@@ -14,7 +14,7 @@ export type RangeRenderState = {
14
14
  * previously set bound or to set an infinite bound.
15
15
  * @param rangeValue tuple of [min, max] bounds
16
16
  */
17
- refine(rangeValue: RangeBoundaries): void;
17
+ refine: (rangeValue: RangeBoundaries) => void;
18
18
  /**
19
19
  * Indicates whether this widget can be refined
20
20
  */
@@ -36,8 +36,8 @@ export type RangeRenderState = {
36
36
  * Both functions take a `number` as input and should output a `string`.
37
37
  */
38
38
  format: {
39
- from(fromValue: number): string;
40
- to(toValue: number): string;
39
+ from: (fromValue: number) => string;
40
+ to: (toValue: number) => string;
41
41
  };
42
42
  };
43
43
  export type RangeConnectorParams = {
@@ -35,10 +35,13 @@ var createSendEvent = function createSendEvent(_ref) {
35
35
  instantSearchInstance.sendEventToInsights(args[0]);
36
36
  return;
37
37
  }
38
- var eventType = args[0],
39
- facetValue = args[1],
38
+ var facetValue = args[1],
40
39
  _args$ = args[2],
41
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];
42
45
  if (eventType !== 'click') {
43
46
  return;
44
47
  }
@@ -48,6 +51,7 @@ var createSendEvent = function createSendEvent(_ref) {
48
51
  insightsMethod: 'clickedFilters',
49
52
  widgetType: $$type,
50
53
  eventType: eventType,
54
+ eventModifier: eventModifier,
51
55
  payload: {
52
56
  eventName: eventName,
53
57
  index: helper.getIndex(),
@@ -123,7 +127,7 @@ var connectRatingMenu = function connectRatingMenu(renderFn) {
123
127
  return emptyState;
124
128
  }
125
129
  var toggleRefinement = function toggleRefinement(helper, facetValue) {
126
- sendEvent('click', facetValue);
130
+ sendEvent('click:internal', facetValue);
127
131
  helper.setState(getRefinedState(helper.state, facetValue)).search();
128
132
  };
129
133
  var connectorState = {
@@ -79,7 +79,7 @@ export type RefinementListRenderState = {
79
79
  /**
80
80
  * Action to apply selected refinements.
81
81
  */
82
- refine(value: string): void;
82
+ refine: (value: string) => void;
83
83
  /**
84
84
  * Send event to insights middleware
85
85
  */
@@ -87,7 +87,7 @@ export type RefinementListRenderState = {
87
87
  /**
88
88
  * Searches for values inside the list.
89
89
  */
90
- searchForItems(query: string): void;
90
+ searchForItems: (query: string) => void;
91
91
  /**
92
92
  * `true` if the values are from an index search.
93
93
  */
@@ -108,7 +108,7 @@ export type RefinementListRenderState = {
108
108
  /**
109
109
  * Toggles the number of values displayed between `limit` and `showMoreLimit`.
110
110
  */
111
- toggleShowMore(): void;
111
+ toggleShowMore: () => void;
112
112
  };
113
113
  export type RefinementListWidgetDescription = {
114
114
  $$type: 'ais.refinementList';
@@ -172,7 +172,7 @@ var connectRefinementList = function connectRefinementList(renderFn) {
172
172
  widgetType: this.$$type
173
173
  });
174
174
  triggerRefine = function triggerRefine(facetValue) {
175
- sendEvent('click', facetValue);
175
+ sendEvent('click:internal', facetValue);
176
176
  helper.toggleFacetRefinement(attribute, facetValue).search();
177
177
  };
178
178
  searchForFacetValues = createSearchForFacetValues(helper, this);
@@ -1,6 +1,6 @@
1
1
  import type { Connector, WidgetRenderState } from '../../types';
2
2
  export type RelevantSortConnectorParams = Record<string, unknown>;
3
- type Refine = (relevancyStrictness: number) => void;
3
+ type Refine = (relevancyStrictness: number | undefined) => void;
4
4
  export type RelevantSortRenderState = {
5
5
  /**
6
6
  * Indicates if it has appliedRelevancyStrictness greater than zero
@@ -4,6 +4,12 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
4
4
  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; }
5
5
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
6
6
  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); }
7
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
+ 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."); }
9
+ 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); }
10
+ 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; }
11
+ 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; } }
12
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
13
  import { checkRendering, escapeFacetValue, createDocumentationMessageGenerator, find, noop, toArray, warning } from "../../lib/utils/index.js";
8
14
  var withUsage = createDocumentationMessageGenerator({
9
15
  name: 'toggle-refinement',
@@ -23,10 +29,13 @@ var createSendEvent = function createSendEvent(_ref) {
23
29
  instantSearchInstance.sendEventToInsights(args[0]);
24
30
  return;
25
31
  }
26
- var eventType = args[0],
27
- isRefined = args[1],
32
+ var isRefined = args[1],
28
33
  _args$ = args[2],
29
34
  eventName = _args$ === void 0 ? 'Filter Applied' : _args$;
35
+ var _args$0$split = args[0].split(':'),
36
+ _args$0$split2 = _slicedToArray(_args$0$split, 2),
37
+ eventType = _args$0$split2[0],
38
+ eventModifier = _args$0$split2[1];
30
39
  if (eventType !== 'click' || on === undefined) {
31
40
  return;
32
41
  }
@@ -38,6 +47,7 @@ var createSendEvent = function createSendEvent(_ref) {
38
47
  insightsMethod: 'clickedFilters',
39
48
  widgetType: $$type,
40
49
  eventType: eventType,
50
+ eventModifier: eventModifier,
41
51
  payload: {
42
52
  eventName: eventName,
43
53
  index: helper.getIndex(),
@@ -84,7 +94,7 @@ var connectToggleRefinement = function connectToggleRefinement(renderFn) {
84
94
  },
85
95
  isRefined = _ref3.isRefined;
86
96
  if (!isRefined) {
87
- sendEvent('click', isRefined);
97
+ sendEvent('click:internal', isRefined);
88
98
  if (hasAnOffValue) {
89
99
  off.forEach(function (v) {
90
100
  return helper.removeDisjunctiveFacetRefinement(attribute, v);
@@ -1,9 +1,10 @@
1
1
  import type { InsightsClientMethod, InsightsClientPayload } from '../types';
2
+ /** @deprecated use bindEvent instead */
2
3
  export declare function readDataAttributes(domElement: HTMLElement): {
3
4
  method: InsightsClientMethod;
4
5
  payload: Partial<InsightsClientPayload>;
5
6
  };
6
- export declare function hasDataAttributes(domElement: HTMLElement): boolean;
7
+ /** @deprecated use bindEvent instead */
7
8
  export declare function writeDataAttributes({ method, payload, }: {
8
9
  method: InsightsClientMethod;
9
10
  payload: Partial<InsightsClientPayload>;
@@ -1,5 +1,6 @@
1
1
  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); }
2
2
  import { warning, serializePayload, deserializePayload } from "../lib/utils/index.js";
3
+ /** @deprecated use bindEvent instead */
3
4
  export function readDataAttributes(domElement) {
4
5
  var method = domElement.getAttribute('data-insights-method');
5
6
  var serializedPayload = domElement.getAttribute('data-insights-payload');
@@ -16,9 +17,8 @@ export function readDataAttributes(domElement) {
16
17
  throw new Error('The insights helper was unable to parse `data-insights-payload`.');
17
18
  }
18
19
  }
19
- export function hasDataAttributes(domElement) {
20
- return domElement.hasAttribute('data-insights-method');
21
- }
20
+
21
+ /** @deprecated use bindEvent instead */
22
22
  export function writeDataAttributes(_ref) {
23
23
  var method = _ref.method,
24
24
  payload = _ref.payload;
@@ -1,5 +1,5 @@
1
1
  import EventEmitter from '@algolia/events';
2
- import type { InsightsEvent } from '../middlewares/createInsightsMiddleware';
2
+ import type { InsightsEvent, InsightsProps } from '../middlewares/createInsightsMiddleware';
3
3
  import type { RouterProps } from '../middlewares/createRouterMiddleware';
4
4
  import type { InsightsClient as AlgoliaInsightsClient, SearchClient, Widget, UiState, CreateURL, Middleware, MiddlewareDefinition, RenderState, InitialResults } from '../types';
5
5
  import type { IndexWidget } from '../widgets/index/index';
@@ -10,9 +10,9 @@ type NoInfer<T> = T extends infer S ? S : never;
10
10
  */
11
11
  export type InstantSearchOptions<TUiState extends UiState = UiState, TRouteState = TUiState> = {
12
12
  /**
13
- * The name of the main index
13
+ * The name of the main index. If no indexName is provided, you have to manually add an index widget.
14
14
  */
15
- indexName: string;
15
+ indexName?: string;
16
16
  /**
17
17
  * The search client to plug to InstantSearch.js
18
18
  *
@@ -61,7 +61,7 @@ export type InstantSearchOptions<TUiState extends UiState = UiState, TRouteState
61
61
  */
62
62
  onStateChange?: (params: {
63
63
  uiState: TUiState;
64
- setUiState(uiState: TUiState | ((previousUiState: TUiState) => TUiState)): void;
64
+ setUiState: (uiState: TUiState | ((previousUiState: TUiState) => TUiState)) => void;
65
65
  }) => void;
66
66
  /**
67
67
  * Injects a `uiState` to the `instantsearch` instance. You can use this option
@@ -79,6 +79,16 @@ export type InstantSearchOptions<TUiState extends UiState = UiState, TRouteState
79
79
  * client side persistence. Passing `true` will use the default URL options.
80
80
  */
81
81
  routing?: RouterProps<TUiState, TRouteState> | boolean;
82
+ /**
83
+ * Enables the Insights middleware and loads the Insights library
84
+ * if not already loaded.
85
+ *
86
+ * The Insights middleware sends view and click events automatically, and lets
87
+ * you set up your own events.
88
+ *
89
+ * @default false
90
+ */
91
+ insights?: InsightsProps | boolean;
82
92
  /**
83
93
  * the instance of search-insights to use for sending insights events inside
84
94
  * widgets like `hits`.
@@ -112,8 +122,8 @@ declare class InstantSearch<TUiState extends UiState = UiState, TRouteState = TU
112
122
  _searchFunction?: InstantSearchOptions['searchFunction'];
113
123
  _mainHelperSearch?: AlgoliaSearchHelper['search'];
114
124
  middleware: Array<{
115
- creator: Middleware;
116
- instance: MiddlewareDefinition;
125
+ creator: Middleware<TUiState>;
126
+ instance: MiddlewareDefinition<TUiState>;
117
127
  }>;
118
128
  sendEventToInsights: (event: InsightsEvent) => void;
119
129
  /**
@@ -133,11 +143,11 @@ declare class InstantSearch<TUiState extends UiState = UiState, TRouteState = TU
133
143
  /**
134
144
  * Hooks a middleware into the InstantSearch lifecycle.
135
145
  */
136
- use(...middleware: Middleware[]): this;
146
+ use(...middleware: Array<Middleware<TUiState>>): this;
137
147
  /**
138
148
  * Removes a middleware from the InstantSearch lifecycle.
139
149
  */
140
- unuse(...middlewareToUnuse: Middleware[]): this;
150
+ unuse(...middlewareToUnuse: Array<Middleware<TUiState>>): this;
141
151
  EXPERIMENTAL_use(...middleware: Middleware[]): this;
142
152
  /**
143
153
  * Adds a widget to the search instance.
@@ -183,12 +193,12 @@ declare class InstantSearch<TUiState extends UiState = UiState, TRouteState = TU
183
193
  */
184
194
  dispose(): void;
185
195
  scheduleSearch: (() => void) & {
186
- wait(): Promise<void>;
187
- cancel(): void;
196
+ wait: () => Promise<void>;
197
+ cancel: () => void;
188
198
  };
189
199
  scheduleRender: ((shouldResetStatus?: boolean) => void) & {
190
- wait(): Promise<void>;
191
- cancel(): void;
200
+ wait: () => Promise<void>;
201
+ cancel: () => void;
192
202
  };
193
203
  scheduleStalledRender(): void;
194
204
  /**
@@ -199,8 +209,8 @@ declare class InstantSearch<TUiState extends UiState = UiState, TRouteState = TU
199
209
  setUiState(uiState: TUiState | ((previousUiState: TUiState) => TUiState), callOnStateChange?: boolean): void;
200
210
  getUiState(): TUiState;
201
211
  onInternalStateChange: (() => void) & {
202
- wait(): Promise<void>;
203
- cancel(): void;
212
+ wait: () => Promise<void>;
213
+ cancel: () => void;
204
214
  };
205
215
  createURL(nextState?: TUiState): string;
206
216
  refresh(): void;