instantsearch.js 4.35.0 → 4.36.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ # [4.36.0](https://github.com/algolia/instantsearch.js/compare/v4.35.0...v4.36.0) (2021-12-16)
2
+
3
+
4
+ ### Features
5
+
6
+ * **dynamicWidgets:** send facets * and maxValuesPerFacet by default ([#4968](https://github.com/algolia/instantsearch.js/issues/4968)) ([969ae89](https://github.com/algolia/instantsearch.js/commit/969ae8980f7c8a055bb4c6c5967d04744644f555))
7
+ * **DynamicWidgets:** throw when transformItems returns anything that isn't an array ([#4975](https://github.com/algolia/instantsearch.js/issues/4975)) ([5c328c8](https://github.com/algolia/instantsearch.js/commit/5c328c85428eb9a5c1450fd01154751f4e0ea2fa))
8
+
9
+
10
+
1
11
  # [4.35.0](https://github.com/algolia/instantsearch.js/compare/v4.34.0...v4.35.0) (2021-12-13)
2
12
 
3
13
 
@@ -19,12 +19,17 @@ var withUsage = (0, _utils.createDocumentationMessageGenerator)({
19
19
  name: 'dynamic-widgets',
20
20
  connector: true
21
21
  });
22
+ var MAX_WILDCARD_FACETS = 20;
22
23
 
23
24
  var connectDynamicWidgets = function connectDynamicWidgets(renderFn) {
24
25
  var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _utils.noop;
25
26
  (0, _utils.checkRendering)(renderFn, withUsage());
26
27
  return function (widgetParams) {
27
28
  var widgets = widgetParams.widgets,
29
+ _widgetParams$maxValu = widgetParams.maxValuesPerFacet,
30
+ maxValuesPerFacet = _widgetParams$maxValu === void 0 ? 20 : _widgetParams$maxValu,
31
+ _widgetParams$facets = widgetParams.facets,
32
+ facets = _widgetParams$facets === void 0 ? ['*'] : _widgetParams$facets,
28
33
  _widgetParams$transfo = widgetParams.transformItems,
29
34
  transformItems = _widgetParams$transfo === void 0 ? function (items) {
30
35
  return items;
@@ -37,6 +42,10 @@ var connectDynamicWidgets = function connectDynamicWidgets(renderFn) {
37
42
  throw new Error(withUsage('The `widgets` option expects an array of widgets.'));
38
43
  }
39
44
 
45
+ if (!(Array.isArray(facets) && facets.length <= 1 && (facets[0] === '*' || facets[0] === undefined))) {
46
+ throw new Error(withUsage("The `facets` option only accepts [] or [\"*\"], you passed ".concat(JSON.stringify(facets))));
47
+ }
48
+
40
49
  var localWidgets = new Map();
41
50
  return {
42
51
  $$type: 'ais.dynamicWidgets',
@@ -116,6 +125,14 @@ var connectDynamicWidgets = function connectDynamicWidgets(renderFn) {
116
125
  parent.removeWidgets(toRemove);
117
126
  unmountFn();
118
127
  },
128
+ getWidgetSearchParameters: function getWidgetSearchParameters(state) {
129
+ // broadening the scope of facets to avoid conflict between never and *
130
+ return facets.reduce(function (acc, curr) {
131
+ return acc.addFacet(curr);
132
+ }, state.setQueryParameters({
133
+ maxValuesPerFacet: Math.max(maxValuesPerFacet || 0, state.maxValuesPerFacet || 0)
134
+ }));
135
+ },
119
136
  getRenderState: function getRenderState(renderState, renderOptions) {
120
137
  return _objectSpread(_objectSpread({}, renderState), {}, {
121
138
  dynamicWidgets: this.getWidgetRenderState(renderOptions)
@@ -124,7 +141,8 @@ var connectDynamicWidgets = function connectDynamicWidgets(renderFn) {
124
141
  getWidgetRenderState: function getWidgetRenderState(_ref4) {
125
142
  var _results$renderingCon, _results$renderingCon2, _results$renderingCon3, _results$renderingCon4;
126
143
 
127
- var results = _ref4.results;
144
+ var results = _ref4.results,
145
+ state = _ref4.state;
128
146
 
129
147
  if (!results) {
130
148
  return {
@@ -133,11 +151,18 @@ var connectDynamicWidgets = function connectDynamicWidgets(renderFn) {
133
151
  };
134
152
  }
135
153
 
136
- var attributesToRender = (_results$renderingCon = (_results$renderingCon2 = results.renderingContent) === null || _results$renderingCon2 === void 0 ? void 0 : (_results$renderingCon3 = _results$renderingCon2.facetOrdering) === null || _results$renderingCon3 === void 0 ? void 0 : (_results$renderingCon4 = _results$renderingCon3.facets) === null || _results$renderingCon4 === void 0 ? void 0 : _results$renderingCon4.order) !== null && _results$renderingCon !== void 0 ? _results$renderingCon : [];
154
+ var attributesToRender = transformItems((_results$renderingCon = (_results$renderingCon2 = results.renderingContent) === null || _results$renderingCon2 === void 0 ? void 0 : (_results$renderingCon3 = _results$renderingCon2.facetOrdering) === null || _results$renderingCon3 === void 0 ? void 0 : (_results$renderingCon4 = _results$renderingCon3.facets) === null || _results$renderingCon4 === void 0 ? void 0 : _results$renderingCon4.order) !== null && _results$renderingCon !== void 0 ? _results$renderingCon : [], {
155
+ results: results
156
+ });
157
+
158
+ if (!Array.isArray(attributesToRender)) {
159
+ throw new Error(withUsage('The `transformItems` option expects a function that returns an Array.'));
160
+ }
161
+
162
+ process.env.NODE_ENV === 'development' ? (0, _utils.warning)(maxValuesPerFacet >= (state.maxValuesPerFacet || 0), "The maxValuesPerFacet set by dynamic widgets (".concat(maxValuesPerFacet, ") is smaller than one of the limits set by a widget (").concat(state.maxValuesPerFacet, "). This causes a mismatch in query parameters and thus an extra network request when that widget is mounted.")) : void 0;
163
+ process.env.NODE_ENV === 'development' ? (0, _utils.warning)(attributesToRender.length <= MAX_WILDCARD_FACETS || widgetParams.facets !== undefined, "More than ".concat(MAX_WILDCARD_FACETS, " facets are requested to be displayed without explicitly setting which facets to retrieve. This could have a performance impact. Set \"facets\" to [] to do two smaller network requests, or explicitly to ['*'] to avoid this warning.")) : void 0;
137
164
  return {
138
- attributesToRender: transformItems(attributesToRender, {
139
- results: results
140
- }),
165
+ attributesToRender: attributesToRender,
141
166
  widgetParams: widgetParams
142
167
  };
143
168
  }
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = '4.35.0';
7
+ var _default = '4.36.0';
8
8
  exports.default = _default;
@@ -19,6 +19,10 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
19
19
 
20
20
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
21
21
 
22
+ 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; }
23
+
24
+ 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; }
25
+
22
26
  var withUsage = (0, _utils.createDocumentationMessageGenerator)({
23
27
  name: 'dynamic-widgets'
24
28
  });
@@ -36,9 +40,9 @@ function createContainer(rootContainer) {
36
40
  var dynamicWidgets = function dynamicWidgets(widgetParams) {
37
41
  var _ref = widgetParams || {},
38
42
  containerSelector = _ref.container,
39
- transformItems = _ref.transformItems,
40
43
  widgets = _ref.widgets,
41
- fallbackWidget = _ref.fallbackWidget;
44
+ fallbackWidget = _ref.fallbackWidget,
45
+ otherWidgetParams = _objectWithoutProperties(_ref, ["container", "widgets", "fallbackWidget"]);
42
46
 
43
47
  if (!containerSelector) {
44
48
  throw new Error(withUsage('The `container` option is required.'));
@@ -73,8 +77,7 @@ var dynamicWidgets = function dynamicWidgets(widgetParams) {
73
77
  }, function () {
74
78
  userContainer.removeChild(rootContainer);
75
79
  });
76
- var widget = makeWidget({
77
- transformItems: transformItems,
80
+ var widget = makeWidget(_objectSpread(_objectSpread({}, otherWidgetParams), {}, {
78
81
  widgets: connectorWidgets,
79
82
  fallbackWidget: typeof fallbackWidget === 'function' ? function (_ref3) {
80
83
  var attribute = _ref3.attribute;
@@ -85,7 +88,7 @@ var dynamicWidgets = function dynamicWidgets(widgetParams) {
85
88
  container: container
86
89
  });
87
90
  } : undefined
88
- });
91
+ }));
89
92
  return _objectSpread(_objectSpread({}, widget), {}, {
90
93
  init: function init(initOptions) {
91
94
  widgets.forEach(function (cb) {
@@ -1101,6 +1101,20 @@ declare type DynamicWidgetsConnectorParams = {
1101
1101
  transformItems?(items: string[], metadata: {
1102
1102
  results: SearchResults;
1103
1103
  }): string[];
1104
+ /**
1105
+ * To prevent unneeded extra network requests when widgets mount or unmount,
1106
+ * we request all facet values.
1107
+ *
1108
+ * @default ['*']
1109
+ */
1110
+ facets?: ['*'] | never[];
1111
+ /**
1112
+ * If you have more than 20 facet values pinned, you need to increase the
1113
+ * maxValuesPerFacet to at least that value.
1114
+ *
1115
+ * @default 20
1116
+ */
1117
+ maxValuesPerFacet?: number;
1104
1118
  };
1105
1119
 
1106
1120
  declare type DynamicWidgetsRenderState = {
@@ -1,4 +1,4 @@
1
- /*! InstantSearch.js 4.35.0 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch.js */
1
+ /*! InstantSearch.js 4.36.0 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch.js */
2
2
  (function (global, factory) {
3
3
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
4
4
  typeof define === 'function' && define.amd ? define(factory) :
@@ -8483,7 +8483,7 @@
8483
8483
  instantSearchInstance.renderState = _objectSpread2(_objectSpread2({}, instantSearchInstance.renderState), {}, _defineProperty({}, parentIndexName, _objectSpread2(_objectSpread2({}, instantSearchInstance.renderState[parentIndexName]), renderState)));
8484
8484
  }
8485
8485
 
8486
- var version$1 = '4.35.0';
8486
+ var version$1 = '4.36.0';
8487
8487
 
8488
8488
  var NAMESPACE = 'ais';
8489
8489
  var component = function component(componentName) {
@@ -15221,12 +15221,17 @@
15221
15221
  name: 'dynamic-widgets',
15222
15222
  connector: true
15223
15223
  });
15224
+ var MAX_WILDCARD_FACETS = 20;
15224
15225
 
15225
15226
  var connectDynamicWidgets = function connectDynamicWidgets(renderFn) {
15226
15227
  var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;
15227
15228
  checkRendering(renderFn, withUsage$r());
15228
15229
  return function (widgetParams) {
15229
15230
  var widgets = widgetParams.widgets,
15231
+ _widgetParams$maxValu = widgetParams.maxValuesPerFacet,
15232
+ maxValuesPerFacet = _widgetParams$maxValu === void 0 ? 20 : _widgetParams$maxValu,
15233
+ _widgetParams$facets = widgetParams.facets,
15234
+ facets = _widgetParams$facets === void 0 ? ['*'] : _widgetParams$facets,
15230
15235
  _widgetParams$transfo = widgetParams.transformItems,
15231
15236
  transformItems = _widgetParams$transfo === void 0 ? function (items) {
15232
15237
  return items;
@@ -15239,6 +15244,10 @@
15239
15244
  throw new Error(withUsage$r('The `widgets` option expects an array of widgets.'));
15240
15245
  }
15241
15246
 
15247
+ if (!(Array.isArray(facets) && facets.length <= 1 && (facets[0] === '*' || facets[0] === undefined))) {
15248
+ throw new Error(withUsage$r("The `facets` option only accepts [] or [\"*\"], you passed ".concat(JSON.stringify(facets))));
15249
+ }
15250
+
15242
15251
  var localWidgets = new Map();
15243
15252
  return {
15244
15253
  $$type: 'ais.dynamicWidgets',
@@ -15318,6 +15327,14 @@
15318
15327
  parent.removeWidgets(toRemove);
15319
15328
  unmountFn();
15320
15329
  },
15330
+ getWidgetSearchParameters: function getWidgetSearchParameters(state) {
15331
+ // broadening the scope of facets to avoid conflict between never and *
15332
+ return facets.reduce(function (acc, curr) {
15333
+ return acc.addFacet(curr);
15334
+ }, state.setQueryParameters({
15335
+ maxValuesPerFacet: Math.max(maxValuesPerFacet || 0, state.maxValuesPerFacet || 0)
15336
+ }));
15337
+ },
15321
15338
  getRenderState: function getRenderState(renderState, renderOptions) {
15322
15339
  return _objectSpread2(_objectSpread2({}, renderState), {}, {
15323
15340
  dynamicWidgets: this.getWidgetRenderState(renderOptions)
@@ -15326,7 +15343,8 @@
15326
15343
  getWidgetRenderState: function getWidgetRenderState(_ref4) {
15327
15344
  var _results$renderingCon, _results$renderingCon2, _results$renderingCon3, _results$renderingCon4;
15328
15345
 
15329
- var results = _ref4.results;
15346
+ var results = _ref4.results,
15347
+ state = _ref4.state;
15330
15348
 
15331
15349
  if (!results) {
15332
15350
  return {
@@ -15335,11 +15353,18 @@
15335
15353
  };
15336
15354
  }
15337
15355
 
15338
- var attributesToRender = (_results$renderingCon = (_results$renderingCon2 = results.renderingContent) === null || _results$renderingCon2 === void 0 ? void 0 : (_results$renderingCon3 = _results$renderingCon2.facetOrdering) === null || _results$renderingCon3 === void 0 ? void 0 : (_results$renderingCon4 = _results$renderingCon3.facets) === null || _results$renderingCon4 === void 0 ? void 0 : _results$renderingCon4.order) !== null && _results$renderingCon !== void 0 ? _results$renderingCon : [];
15356
+ var attributesToRender = transformItems((_results$renderingCon = (_results$renderingCon2 = results.renderingContent) === null || _results$renderingCon2 === void 0 ? void 0 : (_results$renderingCon3 = _results$renderingCon2.facetOrdering) === null || _results$renderingCon3 === void 0 ? void 0 : (_results$renderingCon4 = _results$renderingCon3.facets) === null || _results$renderingCon4 === void 0 ? void 0 : _results$renderingCon4.order) !== null && _results$renderingCon !== void 0 ? _results$renderingCon : [], {
15357
+ results: results
15358
+ });
15359
+
15360
+ if (!Array.isArray(attributesToRender)) {
15361
+ throw new Error(withUsage$r('The `transformItems` option expects a function that returns an Array.'));
15362
+ }
15363
+
15364
+ _warning(maxValuesPerFacet >= (state.maxValuesPerFacet || 0), "The maxValuesPerFacet set by dynamic widgets (".concat(maxValuesPerFacet, ") is smaller than one of the limits set by a widget (").concat(state.maxValuesPerFacet, "). This causes a mismatch in query parameters and thus an extra network request when that widget is mounted.")) ;
15365
+ _warning(attributesToRender.length <= MAX_WILDCARD_FACETS || widgetParams.facets !== undefined, "More than ".concat(MAX_WILDCARD_FACETS, " facets are requested to be displayed without explicitly setting which facets to retrieve. This could have a performance impact. Set \"facets\" to [] to do two smaller network requests, or explicitly to ['*'] to avoid this warning.")) ;
15339
15366
  return {
15340
- attributesToRender: transformItems(attributesToRender, {
15341
- results: results
15342
- }),
15367
+ attributesToRender: attributesToRender,
15343
15368
  widgetParams: widgetParams
15344
15369
  };
15345
15370
  }
@@ -16211,9 +16236,9 @@
16211
16236
  var dynamicWidgets = function dynamicWidgets(widgetParams) {
16212
16237
  var _ref = widgetParams || {},
16213
16238
  containerSelector = _ref.container,
16214
- transformItems = _ref.transformItems,
16215
16239
  widgets = _ref.widgets,
16216
- fallbackWidget = _ref.fallbackWidget;
16240
+ fallbackWidget = _ref.fallbackWidget,
16241
+ otherWidgetParams = _objectWithoutProperties(_ref, ["container", "widgets", "fallbackWidget"]);
16217
16242
 
16218
16243
  if (!containerSelector) {
16219
16244
  throw new Error(withUsage$x('The `container` option is required.'));
@@ -16248,8 +16273,7 @@
16248
16273
  }, function () {
16249
16274
  userContainer.removeChild(rootContainer);
16250
16275
  });
16251
- var widget = makeWidget({
16252
- transformItems: transformItems,
16276
+ var widget = makeWidget(_objectSpread2(_objectSpread2({}, otherWidgetParams), {}, {
16253
16277
  widgets: connectorWidgets,
16254
16278
  fallbackWidget: typeof fallbackWidget === 'function' ? function (_ref3) {
16255
16279
  var attribute = _ref3.attribute;
@@ -16260,7 +16284,7 @@
16260
16284
  container: container
16261
16285
  });
16262
16286
  } : undefined
16263
- });
16287
+ }));
16264
16288
  return _objectSpread2(_objectSpread2({}, widget), {}, {
16265
16289
  init: function init(initOptions) {
16266
16290
  widgets.forEach(function (cb) {