instantsearch.js 4.59.0 → 4.61.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 (40) hide show
  1. package/cjs/components/SearchBox/SearchBox.js +2 -2
  2. package/cjs/connectors/breadcrumb/connectBreadcrumb.js +18 -5
  3. package/cjs/connectors/dynamic-widgets/connectDynamicWidgets.js +2 -3
  4. package/cjs/connectors/hierarchical-menu/connectHierarchicalMenu.js +17 -6
  5. package/cjs/connectors/menu/connectMenu.js +18 -6
  6. package/cjs/connectors/numeric-menu/connectNumericMenu.js +18 -5
  7. package/cjs/connectors/rating-menu/connectRatingMenu.js +19 -6
  8. package/cjs/connectors/refinement-list/connectRefinementList.js +17 -6
  9. package/cjs/lib/InstantSearch.js +1 -0
  10. package/cjs/lib/utils/hydrateSearchClient.js +126 -0
  11. package/cjs/lib/utils/index.js +11 -0
  12. package/cjs/lib/version.js +1 -1
  13. package/cjs/widgets/search-box/defaultTemplates.js +9 -3
  14. package/dist/instantsearch.development.d.ts +13 -3
  15. package/dist/instantsearch.development.js +277 -95
  16. package/dist/instantsearch.development.js.map +1 -1
  17. package/dist/instantsearch.production.d.ts +13 -3
  18. package/dist/instantsearch.production.min.d.ts +13 -3
  19. package/dist/instantsearch.production.min.js +2 -2
  20. package/dist/instantsearch.production.min.js.map +1 -1
  21. package/es/components/SearchBox/SearchBox.js +2 -2
  22. package/es/connectors/breadcrumb/connectBreadcrumb.js +18 -5
  23. package/es/connectors/dynamic-widgets/connectDynamicWidgets.d.ts +12 -2
  24. package/es/connectors/dynamic-widgets/connectDynamicWidgets.js +2 -3
  25. package/es/connectors/hierarchical-menu/connectHierarchicalMenu.js +17 -6
  26. package/es/connectors/menu/connectMenu.js +18 -6
  27. package/es/connectors/numeric-menu/connectNumericMenu.js +18 -5
  28. package/es/connectors/rating-menu/connectRatingMenu.d.ts +1 -1
  29. package/es/connectors/rating-menu/connectRatingMenu.js +19 -6
  30. package/es/connectors/refinement-list/connectRefinementList.js +17 -6
  31. package/es/lib/InstantSearch.js +2 -1
  32. package/es/lib/utils/hydrateSearchClient.d.ts +5 -0
  33. package/es/lib/utils/hydrateSearchClient.js +120 -0
  34. package/es/lib/utils/index.d.ts +1 -0
  35. package/es/lib/utils/index.js +1 -0
  36. package/es/lib/utils/render-args.d.ts +4 -4
  37. package/es/lib/version.d.ts +1 -1
  38. package/es/lib/version.js +1 -1
  39. package/es/widgets/search-box/defaultTemplates.js +10 -3
  40. package/package.json +5 -5
@@ -184,7 +184,7 @@ var SearchBox = /*#__PURE__*/function (_Component) {
184
184
  rootProps: {
185
185
  className: cssClasses.submit,
186
186
  type: 'submit',
187
- title: 'Submit the search query.',
187
+ title: 'Submit the search query',
188
188
  hidden: !showSubmit
189
189
  },
190
190
  templates: templates,
@@ -197,7 +197,7 @@ var SearchBox = /*#__PURE__*/function (_Component) {
197
197
  rootProps: {
198
198
  className: cssClasses.reset,
199
199
  type: 'reset',
200
- title: 'Clear the search query.',
200
+ title: 'Clear the search query',
201
201
  hidden: !(showReset && this.state.query.trim() && !isSearchStalled)
202
202
  },
203
203
  templates: templates,
@@ -6,6 +6,9 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _utils = require("../../lib/utils");
9
+ var _excluded = ["hierarchicalMenu"];
10
+ 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; }
11
+ 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; }
9
12
  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
13
  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
14
  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; }
@@ -121,12 +124,9 @@ var connectBreadcrumb = function connectBreadcrumb(renderFn) {
121
124
  getWidgetUiState: function getWidgetUiState(uiState, _ref3) {
122
125
  var searchParameters = _ref3.searchParameters;
123
126
  var path = searchParameters.getHierarchicalFacetBreadcrumb(hierarchicalFacetName);
124
- if (!path.length) {
125
- return uiState;
126
- }
127
- return _objectSpread(_objectSpread({}, uiState), {}, {
127
+ return removeEmptyRefinementsFromUiState(_objectSpread(_objectSpread({}, uiState), {}, {
128
128
  hierarchicalMenu: _objectSpread(_objectSpread({}, uiState.hierarchicalMenu), {}, _defineProperty({}, hierarchicalFacetName, path))
129
- });
129
+ }));
130
130
  },
131
131
  getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref4) {
132
132
  var uiState = _ref4.uiState;
@@ -177,5 +177,18 @@ function shiftItemsValues(array) {
177
177
  };
178
178
  });
179
179
  }
180
+ function removeEmptyRefinementsFromUiState(indexUiState) {
181
+ var hierarchicalMenu = indexUiState.hierarchicalMenu,
182
+ indexUiStateBase = _objectWithoutProperties(indexUiState, _excluded);
183
+ if (!hierarchicalMenu) {
184
+ return indexUiState;
185
+ }
186
+ var connectorUiState = Object.keys(hierarchicalMenu).reduce(function (acc, key) {
187
+ return _objectSpread(_objectSpread({}, acc), hierarchicalMenu[key].length > 0 ? _defineProperty({}, key, hierarchicalMenu[key]) : {});
188
+ }, {});
189
+ return _objectSpread(_objectSpread({}, indexUiStateBase), Object.keys(connectorUiState).length > 0 ? {
190
+ hierarchicalMenu: connectorUiState
191
+ } : {});
192
+ }
180
193
  var _default = connectBreadcrumb;
181
194
  exports.default = _default;
@@ -35,8 +35,8 @@ var connectDynamicWidgets = function connectDynamicWidgets(renderFn) {
35
35
  }))) {
36
36
  throw new Error(withUsage('The `widgets` option expects an array of widgets.'));
37
37
  }
38
- if (!(Array.isArray(facets) && facets.length <= 1 && (facets[0] === '*' || facets[0] === undefined))) {
39
- throw new Error(withUsage("The `facets` option only accepts [] or [\"*\"], you passed ".concat(JSON.stringify(facets))));
38
+ if (!Array.isArray(facets)) {
39
+ throw new Error(withUsage("The `facets` option only accepts an array of facets, you passed ".concat(JSON.stringify(facets))));
40
40
  }
41
41
  var localWidgets = new Map();
42
42
  return {
@@ -114,7 +114,6 @@ var connectDynamicWidgets = function connectDynamicWidgets(renderFn) {
114
114
  unmountFn();
115
115
  },
116
116
  getWidgetSearchParameters: function getWidgetSearchParameters(state) {
117
- // broadening the scope of facets to avoid conflict between never and *
118
117
  return facets.reduce(function (acc, curr) {
119
118
  return acc.addFacet(curr);
120
119
  }, state.setQueryParameters({
@@ -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 = ["name", "escapedValue", "data", "path"];
9
+ var _excluded = ["name", "escapedValue", "data", "path"],
10
+ _excluded2 = ["hierarchicalMenu"];
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; }
@@ -205,12 +206,9 @@ var connectHierarchicalMenu = function connectHierarchicalMenu(renderFn) {
205
206
  getWidgetUiState: function getWidgetUiState(uiState, _ref5) {
206
207
  var searchParameters = _ref5.searchParameters;
207
208
  var path = searchParameters.getHierarchicalFacetBreadcrumb(hierarchicalFacetName);
208
- if (!path.length) {
209
- return uiState;
210
- }
211
- return _objectSpread(_objectSpread({}, uiState), {}, {
209
+ return removeEmptyRefinementsFromUiState(_objectSpread(_objectSpread({}, uiState), {}, {
212
210
  hierarchicalMenu: _objectSpread(_objectSpread({}, uiState.hierarchicalMenu), {}, _defineProperty({}, hierarchicalFacetName, path))
213
- });
211
+ }));
214
212
  },
215
213
  getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref6) {
216
214
  var uiState = _ref6.uiState;
@@ -243,5 +241,18 @@ var connectHierarchicalMenu = function connectHierarchicalMenu(renderFn) {
243
241
  };
244
242
  };
245
243
  };
244
+ function removeEmptyRefinementsFromUiState(indexUiState) {
245
+ var hierarchicalMenu = indexUiState.hierarchicalMenu,
246
+ indexUiStateBase = _objectWithoutProperties(indexUiState, _excluded2);
247
+ if (!hierarchicalMenu) {
248
+ return indexUiState;
249
+ }
250
+ var connectorUiState = Object.keys(hierarchicalMenu).reduce(function (acc, key) {
251
+ return _objectSpread(_objectSpread({}, acc), hierarchicalMenu[key].length > 0 ? _defineProperty({}, key, hierarchicalMenu[key]) : {});
252
+ }, {});
253
+ return _objectSpread(_objectSpread({}, indexUiStateBase), Object.keys(connectorUiState).length > 0 ? {
254
+ hierarchicalMenu: connectorUiState
255
+ } : {});
256
+ }
246
257
  var _default = connectHierarchicalMenu;
247
258
  exports.default = _default;
@@ -5,7 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _utils = require("../../lib/utils");
8
- var _excluded = ["name", "escapedValue", "path"];
8
+ var _excluded = ["name", "escapedValue", "path"],
9
+ _excluded2 = ["menu"];
9
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); }
10
11
  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; }
11
12
  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; }
@@ -177,12 +178,9 @@ var connectMenu = function connectMenu(renderFn) {
177
178
  var _searchParameters$get = searchParameters.getHierarchicalFacetBreadcrumb(attribute),
178
179
  _searchParameters$get2 = _slicedToArray(_searchParameters$get, 1),
179
180
  value = _searchParameters$get2[0];
180
- if (!value) {
181
- return uiState;
182
- }
183
- return _objectSpread(_objectSpread({}, uiState), {}, {
181
+ return removeEmptyRefinementsFromUiState(_objectSpread(_objectSpread({}, uiState), {}, {
184
182
  menu: _objectSpread(_objectSpread({}, uiState.menu), {}, _defineProperty({}, attribute, value))
185
- });
183
+ }));
186
184
  },
187
185
  getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref5) {
188
186
  var uiState = _ref5.uiState;
@@ -208,5 +206,19 @@ var connectMenu = function connectMenu(renderFn) {
208
206
  };
209
207
  };
210
208
  };
209
+ function removeEmptyRefinementsFromUiState(indexUiState) {
210
+ var menu = indexUiState.menu,
211
+ indexUiStateBase = _objectWithoutProperties(indexUiState, _excluded2);
212
+ if (!menu) {
213
+ return indexUiState;
214
+ }
215
+ var connectorUiState = Object.keys(menu).reduce(function (acc, key) {
216
+ var _menu$key;
217
+ return _objectSpread(_objectSpread({}, acc), ((_menu$key = menu[key]) === null || _menu$key === void 0 ? void 0 : _menu$key.length) > 0 ? _defineProperty({}, key, menu[key]) : {});
218
+ }, {});
219
+ return _objectSpread(_objectSpread({}, indexUiStateBase), Object.keys(connectorUiState).length > 0 ? {
220
+ menu: connectorUiState
221
+ } : {});
222
+ }
211
223
  var _default = connectMenu;
212
224
  exports.default = _default;
@@ -5,7 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _utils = require("../../lib/utils");
8
+ var _excluded = ["numericMenu"];
8
9
  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); }
10
+ 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; }
11
+ 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; }
9
12
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
10
13
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
11
14
  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."); }
@@ -101,12 +104,9 @@ var connectNumericMenu = function connectNumericMenu(renderFn) {
101
104
  }
102
105
  var min = values['>='] && values['>='][0] || '';
103
106
  var max = values['<='] && values['<='][0] || '';
104
- if (min === '' && max === '') {
105
- return uiState;
106
- }
107
- return _objectSpread(_objectSpread({}, uiState), {}, {
107
+ return removeEmptyRefinementsFromUiState(_objectSpread(_objectSpread({}, uiState), {}, {
108
108
  numericMenu: _objectSpread(_objectSpread({}, uiState.numericMenu), {}, _defineProperty({}, attribute, "".concat(min, ":").concat(max)))
109
- });
109
+ }));
110
110
  },
111
111
  getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref6) {
112
112
  var uiState = _ref6.uiState;
@@ -268,5 +268,18 @@ function getRefinedState(state, attribute, facetValue) {
268
268
  function hasNumericRefinement(currentRefinements, operator, value) {
269
269
  return currentRefinements[operator] !== undefined && currentRefinements[operator].includes(value);
270
270
  }
271
+ function removeEmptyRefinementsFromUiState(indexUiState) {
272
+ var numericMenu = indexUiState.numericMenu,
273
+ indexUiStateBase = _objectWithoutProperties(indexUiState, _excluded);
274
+ if (!numericMenu) {
275
+ return indexUiState;
276
+ }
277
+ var connectorUiState = Object.keys(numericMenu).reduce(function (acc, key) {
278
+ return _objectSpread(_objectSpread({}, acc), numericMenu[key] !== ':' ? _defineProperty({}, key, numericMenu[key]) : {});
279
+ }, {});
280
+ return _objectSpread(_objectSpread({}, indexUiStateBase), Object.keys(connectorUiState).length > 0 ? {
281
+ numericMenu: connectorUiState
282
+ } : {});
283
+ }
271
284
  var _default = connectNumericMenu;
272
285
  exports.default = _default;
@@ -6,6 +6,9 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _utils = require("../../lib/utils");
9
+ var _excluded = ["ratingMenu"];
10
+ 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; }
11
+ 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; }
9
12
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
10
13
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
11
14
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
@@ -262,12 +265,9 @@ var connectRatingMenu = function connectRatingMenu(renderFn) {
262
265
  getWidgetUiState: function getWidgetUiState(uiState, _ref7) {
263
266
  var searchParameters = _ref7.searchParameters;
264
267
  var value = _getRefinedStar(searchParameters);
265
- if (typeof value !== 'number') {
266
- return uiState;
267
- }
268
- return _objectSpread(_objectSpread({}, uiState), {}, {
269
- ratingMenu: _objectSpread(_objectSpread({}, uiState.ratingMenu), {}, _defineProperty({}, attribute, value))
270
- });
268
+ return removeEmptyRefinementsFromUiState(_objectSpread(_objectSpread({}, uiState), {}, {
269
+ ratingMenu: _objectSpread(_objectSpread({}, uiState.ratingMenu), {}, _defineProperty({}, attribute, typeof value === 'number' ? value : undefined))
270
+ }));
271
271
  },
272
272
  getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref8) {
273
273
  var uiState = _ref8.uiState;
@@ -284,5 +284,18 @@ var connectRatingMenu = function connectRatingMenu(renderFn) {
284
284
  };
285
285
  };
286
286
  };
287
+ function removeEmptyRefinementsFromUiState(indexUiState) {
288
+ var ratingMenu = indexUiState.ratingMenu,
289
+ indexUiStateBase = _objectWithoutProperties(indexUiState, _excluded);
290
+ if (!ratingMenu) {
291
+ return indexUiState;
292
+ }
293
+ var connectorUiState = Object.keys(ratingMenu).reduce(function (acc, key) {
294
+ return _objectSpread(_objectSpread({}, acc), typeof ratingMenu[key] === 'number' ? _defineProperty({}, key, ratingMenu[key]) : {});
295
+ }, {});
296
+ return _objectSpread(_objectSpread({}, indexUiStateBase), Object.keys(connectorUiState).length > 0 ? {
297
+ ratingMenu: connectorUiState
298
+ } : {});
299
+ }
287
300
  var _default = connectRatingMenu;
288
301
  exports.default = _default;
@@ -7,7 +7,8 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = void 0;
8
8
  var _utils = require("../../lib/utils");
9
9
  var _excluded = ["name", "escapedValue"],
10
- _excluded2 = ["escapedValue", "value"];
10
+ _excluded2 = ["escapedValue", "value"],
11
+ _excluded3 = ["refinementList"];
11
12
  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; }
12
13
  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; }
13
14
  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; }
@@ -249,12 +250,9 @@ var connectRefinementList = function connectRefinementList(renderFn) {
249
250
  getWidgetUiState: function getWidgetUiState(uiState, _ref5) {
250
251
  var searchParameters = _ref5.searchParameters;
251
252
  var values = operator === 'or' ? searchParameters.getDisjunctiveRefinements(attribute) : searchParameters.getConjunctiveRefinements(attribute);
252
- if (!values.length) {
253
- return uiState;
254
- }
255
- return _objectSpread(_objectSpread({}, uiState), {}, {
253
+ return removeEmptyRefinementsFromUiState(_objectSpread(_objectSpread({}, uiState), {}, {
256
254
  refinementList: _objectSpread(_objectSpread({}, uiState.refinementList), {}, _defineProperty({}, attribute, values))
257
- });
255
+ }));
258
256
  },
259
257
  getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref6) {
260
258
  var uiState = _ref6.uiState;
@@ -284,5 +282,18 @@ var connectRefinementList = function connectRefinementList(renderFn) {
284
282
  };
285
283
  };
286
284
  };
285
+ function removeEmptyRefinementsFromUiState(indexUiState) {
286
+ var refinementList = indexUiState.refinementList,
287
+ indexUiStateBase = _objectWithoutProperties(indexUiState, _excluded3);
288
+ if (!refinementList) {
289
+ return indexUiState;
290
+ }
291
+ var connectorUiState = Object.keys(refinementList).reduce(function (acc, key) {
292
+ return _objectSpread(_objectSpread({}, acc), refinementList[key].length > 0 ? _defineProperty({}, key, refinementList[key]) : {});
293
+ }, {});
294
+ return _objectSpread(_objectSpread({}, indexUiStateBase), Object.keys(connectorUiState).length > 0 ? {
295
+ refinementList: connectorUiState
296
+ } : {});
297
+ }
287
298
  var _default = connectRefinementList;
288
299
  exports.default = _default;
@@ -457,6 +457,7 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
457
457
  uiState: this._initialUiState
458
458
  });
459
459
  if (this._initialResults) {
460
+ (0, _utils.hydrateSearchClient)(this.client, this._initialResults);
460
461
  var originalScheduleSearch = this.scheduleSearch;
461
462
  // We don't schedule a first search when initial results are provided
462
463
  // because we already have the results to render. This skips the initial
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.hydrateSearchClient = hydrateSearchClient;
7
+ 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); }
8
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
9
+ 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."); }
10
+ 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); }
11
+ 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; }
12
+ 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; } }
13
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
+ 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; }
15
+ 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; }
16
+ 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; }
17
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
18
+ 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); }
19
+ function hydrateSearchClient(client, results) {
20
+ if (!results) {
21
+ return;
22
+ }
23
+
24
+ // Disable cache hydration on:
25
+ // - Algoliasearch API Client < v4 with cache disabled
26
+ // - Third party clients (detected by the `addAlgoliaAgent` function missing)
27
+
28
+ if ((!('transporter' in client) || client._cacheHydrated) && (!client._useCache || typeof client.addAlgoliaAgent !== 'function')) {
29
+ return;
30
+ }
31
+ var cachedRequest = Object.keys(results).map(function (key) {
32
+ return results[key].results.map(function (result) {
33
+ return {
34
+ indexName: result.index,
35
+ // We normalize the params received from the server as they can
36
+ // be serialized differently depending on the engine.
37
+ params: serializeQueryParameters(deserializeQueryParameters(result.params))
38
+ };
39
+ });
40
+ });
41
+ var cachedResults = Object.keys(results).reduce(function (acc, key) {
42
+ return acc.concat(results[key].results);
43
+ }, []);
44
+
45
+ // Algoliasearch API Client >= v4
46
+ // To hydrate the client we need to populate the cache with the data from
47
+ // the server (done in `hydrateSearchClientWithMultiIndexRequest` or
48
+ // `hydrateSearchClientWithSingleIndexRequest`). But since there is no way
49
+ // for us to compute the key the same way as `algoliasearch-client` we need
50
+ // to populate it on a custom key and override the `search` method to
51
+ // search on it first.
52
+ if ('transporter' in client && !client._cacheHydrated) {
53
+ client._cacheHydrated = true;
54
+ var baseMethod = client.search;
55
+ // @ts-ignore wanting type checks for v3 on this would make this too complex
56
+ client.search = function (requests) {
57
+ for (var _len = arguments.length, methodArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
58
+ methodArgs[_key - 1] = arguments[_key];
59
+ }
60
+ var requestsWithSerializedParams = requests.map(function (request) {
61
+ return _objectSpread(_objectSpread({}, request), {}, {
62
+ params: serializeQueryParameters(request.params)
63
+ });
64
+ });
65
+ return client.transporter.responsesCache.get({
66
+ method: 'search',
67
+ args: [requestsWithSerializedParams].concat(methodArgs)
68
+ }, function () {
69
+ return baseMethod.apply(void 0, [requests].concat(methodArgs));
70
+ });
71
+ };
72
+ client.transporter.responsesCache.set({
73
+ method: 'search',
74
+ args: cachedRequest
75
+ }, {
76
+ results: cachedResults
77
+ });
78
+ }
79
+
80
+ // Algoliasearch API Client < v4
81
+ // Prior to client v4 we didn't have a proper API to hydrate the client
82
+ // cache from the outside. The following code populates the cache with
83
+ // a single-index result. You can find more information about the
84
+ // computation of the key inside the client (see link below).
85
+ // https://github.com/algolia/algoliasearch-client-javascript/blob/c27e89ff92b2a854ae6f40dc524bffe0f0cbc169/src/AlgoliaSearchCore.js#L232-L240
86
+ if (!('transporter' in client)) {
87
+ var cacheKey = "/1/indexes/*/queries_body_".concat(JSON.stringify({
88
+ requests: cachedRequest
89
+ }));
90
+ client.cache = _objectSpread(_objectSpread({}, client.cache), {}, _defineProperty({}, cacheKey, JSON.stringify({
91
+ results: Object.keys(results).map(function (key) {
92
+ return results[key].results;
93
+ })
94
+ })));
95
+ }
96
+ }
97
+ function deserializeQueryParameters(parameters) {
98
+ return parameters.split('&').reduce(function (acc, parameter) {
99
+ var _parameter$split = parameter.split('='),
100
+ _parameter$split2 = _slicedToArray(_parameter$split, 2),
101
+ key = _parameter$split2[0],
102
+ value = _parameter$split2[1];
103
+ acc[key] = value ? decodeURIComponent(value) : '';
104
+ return acc;
105
+ }, {});
106
+ }
107
+
108
+ // This function is copied from the algoliasearch v4 API Client. If modified,
109
+ // consider updating it also in `serializeQueryParameters` from `@algolia/transporter`.
110
+ function serializeQueryParameters(parameters) {
111
+ var isObjectOrArray = function isObjectOrArray(value) {
112
+ return Object.prototype.toString.call(value) === '[object Object]' || Object.prototype.toString.call(value) === '[object Array]';
113
+ };
114
+ var encode = function encode(format) {
115
+ for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
116
+ args[_key2 - 1] = arguments[_key2];
117
+ }
118
+ var i = 0;
119
+ return format.replace(/%s/g, function () {
120
+ return encodeURIComponent(args[i++]);
121
+ });
122
+ };
123
+ return Object.keys(parameters).map(function (key) {
124
+ return encode('%s=%s', key, isObjectOrArray(parameters[key]) ? JSON.stringify(parameters[key]) : parameters[key]);
125
+ }).join('&');
126
+ }
@@ -322,6 +322,17 @@ Object.keys(_hitsQueryId).forEach(function (key) {
322
322
  }
323
323
  });
324
324
  });
325
+ var _hydrateSearchClient = require("./hydrateSearchClient");
326
+ Object.keys(_hydrateSearchClient).forEach(function (key) {
327
+ if (key === "default" || key === "__esModule") return;
328
+ if (key in exports && exports[key] === _hydrateSearchClient[key]) return;
329
+ Object.defineProperty(exports, key, {
330
+ enumerable: true,
331
+ get: function get() {
332
+ return _hydrateSearchClient[key];
333
+ }
334
+ });
335
+ });
325
336
  var _isDomElement = require("./isDomElement");
326
337
  Object.keys(_isDomElement).forEach(function (key) {
327
338
  if (key === "default" || key === "__esModule") return;
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = '4.59.0';
7
+ var _default = '4.61.0';
8
8
  exports.default = _default;
@@ -13,12 +13,12 @@ var _ref4 = (0, _preact.h)("path", {
13
13
  });
14
14
  var _ref6 = (0, _preact.h)("g", {
15
15
  fill: "none",
16
- fillRule: "evenodd"
16
+ "fill-rule": "evenodd"
17
17
  }, (0, _preact.h)("g", {
18
18
  transform: "translate(1 1)",
19
- strokeWidth: "2"
19
+ "stroke-width": "2"
20
20
  }, (0, _preact.h)("circle", {
21
- strokeOpacity: ".5",
21
+ "stroke-opacity": ".5",
22
22
  cx: "18",
23
23
  cy: "18",
24
24
  r: "18"
@@ -55,7 +55,12 @@ var defaultTemplate = {
55
55
  },
56
56
  loadingIndicator: function loadingIndicator(_ref5) {
57
57
  var cssClasses = _ref5.cssClasses;
58
+ /* eslint-disable react/no-unknown-property */
59
+ // Preact supports kebab case attributes, and using camel case would
60
+ // require using `preact/compat`.
61
+ // @TODO: reconsider using the `react` ESLint preset
58
62
  return (0, _preact.h)("svg", {
63
+ "aria-label": "Results are loading",
59
64
  className: cssClasses.loadingIcon,
60
65
  width: "16",
61
66
  height: "16",
@@ -63,6 +68,7 @@ var defaultTemplate = {
63
68
  stroke: "#444",
64
69
  "aria-hidden": "true"
65
70
  }, _ref6);
71
+ /* eslint-enable react/no-unknown-property */
66
72
  }
67
73
  };
68
74
  var _default = defaultTemplate;
@@ -1130,11 +1130,21 @@ declare type DynamicWidgetsConnectorParams = {
1130
1130
  }>;
1131
1131
  /**
1132
1132
  * To prevent unneeded extra network requests when widgets mount or unmount,
1133
- * we request all facet values.
1133
+ * we request all facet values by default. If you want to only request the
1134
+ * facet values that are needed, you can set this option to the list of
1135
+ * attributes you want to display.
1136
+ *
1137
+ * If `facets` is set to `['*']`, we request all facet values.
1138
+ *
1139
+ * Any facets that are requested due to the `facetOrdering` result are always
1140
+ * requested by the widget that mounted itself.
1141
+ *
1142
+ * Setting `facets` to a value other than `['*']` will only prevent extra
1143
+ * requests if all potential facets are listed.
1134
1144
  *
1135
1145
  * @default ['*']
1136
1146
  */
1137
- facets?: ['*'] | never[];
1147
+ facets?: ['*'] | string[];
1138
1148
  /**
1139
1149
  * If you have more than 20 facet values pinned, you need to increase the
1140
1150
  * maxValuesPerFacet to at least that value.
@@ -3965,7 +3975,7 @@ declare type RatingMenuWidgetDescription = {
3965
3975
  };
3966
3976
  indexUiState: {
3967
3977
  ratingMenu: {
3968
- [attribute: string]: number;
3978
+ [attribute: string]: number | undefined;
3969
3979
  };
3970
3980
  };
3971
3981
  };