instantsearch.js 4.68.1 → 4.70.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 (68) hide show
  1. package/cjs/connectors/frequently-bought-together/connectFrequentlyBoughtTogether.js +93 -0
  2. package/cjs/connectors/index.js +28 -0
  3. package/cjs/connectors/looking-similar/connectLookingSimilar.js +94 -0
  4. package/cjs/connectors/related-products/connectRelatedProducts.js +94 -0
  5. package/cjs/connectors/trending-items/connectTrendingItems.js +90 -0
  6. package/cjs/lib/InstantSearch.js +10 -1
  7. package/cjs/lib/server.js +28 -9
  8. package/cjs/lib/utils/addWidgetId.js +17 -0
  9. package/cjs/lib/utils/hydrateRecommendCache.js +23 -0
  10. package/cjs/lib/utils/hydrateSearchClient.js +7 -3
  11. package/cjs/lib/utils/index.js +22 -0
  12. package/cjs/lib/utils/render-args.js +3 -3
  13. package/cjs/lib/version.js +1 -1
  14. package/cjs/widgets/frequently-bought-together/frequently-bought-together.js +120 -0
  15. package/cjs/widgets/index/index.js +89 -20
  16. package/cjs/widgets/index.js +28 -0
  17. package/cjs/widgets/looking-similar/looking-similar.js +122 -0
  18. package/cjs/widgets/related-products/related-products.js +122 -0
  19. package/cjs/widgets/trending-items/trending-items.js +126 -0
  20. package/dist/instantsearch.development.d.ts +411 -12
  21. package/dist/instantsearch.development.js +1702 -265
  22. package/dist/instantsearch.development.js.map +1 -1
  23. package/dist/instantsearch.production.d.ts +411 -12
  24. package/dist/instantsearch.production.min.d.ts +411 -12
  25. package/dist/instantsearch.production.min.js +2 -2
  26. package/dist/instantsearch.production.min.js.map +1 -1
  27. package/es/connectors/frequently-bought-together/connectFrequentlyBoughtTogether.d.ts +45 -0
  28. package/es/connectors/frequently-bought-together/connectFrequentlyBoughtTogether.js +86 -0
  29. package/es/connectors/index.d.ts +4 -0
  30. package/es/connectors/index.js +5 -1
  31. package/es/connectors/looking-similar/connectLookingSimilar.d.ts +49 -0
  32. package/es/connectors/looking-similar/connectLookingSimilar.js +87 -0
  33. package/es/connectors/related-products/connectRelatedProducts.d.ts +49 -0
  34. package/es/connectors/related-products/connectRelatedProducts.js +87 -0
  35. package/es/connectors/trending-items/connectTrendingItems.d.ts +57 -0
  36. package/es/connectors/trending-items/connectTrendingItems.js +83 -0
  37. package/es/lib/InstantSearch.d.ts +2 -0
  38. package/es/lib/InstantSearch.js +11 -2
  39. package/es/lib/server.d.ts +1 -1
  40. package/es/lib/server.js +28 -9
  41. package/es/lib/templating/renderTemplate.d.ts +1 -1
  42. package/es/lib/utils/addWidgetId.d.ts +3 -0
  43. package/es/lib/utils/addWidgetId.js +10 -0
  44. package/es/lib/utils/hydrateRecommendCache.d.ts +3 -0
  45. package/es/lib/utils/hydrateRecommendCache.js +17 -0
  46. package/es/lib/utils/hydrateSearchClient.js +7 -3
  47. package/es/lib/utils/index.d.ts +2 -0
  48. package/es/lib/utils/index.js +2 -0
  49. package/es/lib/utils/render-args.d.ts +3 -3
  50. package/es/lib/utils/render-args.js +3 -3
  51. package/es/lib/version.d.ts +1 -1
  52. package/es/lib/version.js +1 -1
  53. package/es/types/results.d.ts +7 -3
  54. package/es/types/templates.d.ts +1 -1
  55. package/es/types/widget.d.ts +16 -9
  56. package/es/widgets/frequently-bought-together/frequently-bought-together.d.ts +41 -0
  57. package/es/widgets/frequently-bought-together/frequently-bought-together.js +112 -0
  58. package/es/widgets/index/index.d.ts +2 -1
  59. package/es/widgets/index/index.js +89 -20
  60. package/es/widgets/index.d.ts +4 -0
  61. package/es/widgets/index.js +5 -1
  62. package/es/widgets/looking-similar/looking-similar.d.ts +41 -0
  63. package/es/widgets/looking-similar/looking-similar.js +114 -0
  64. package/es/widgets/related-products/related-products.d.ts +41 -0
  65. package/es/widgets/related-products/related-products.js +114 -0
  66. package/es/widgets/trending-items/trending-items.d.ts +41 -0
  67. package/es/widgets/trending-items/trending-items.js +118 -0
  68. package/package.json +7 -7
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _utils = require("../../lib/utils");
8
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
9
+ 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
+ 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
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
13
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
14
+ var withUsage = (0, _utils.createDocumentationMessageGenerator)({
15
+ name: 'frequently-bought-together',
16
+ connector: true
17
+ });
18
+ var connectFrequentlyBoughtTogether = function connectFrequentlyBoughtTogether(renderFn) {
19
+ var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _utils.noop;
20
+ (0, _utils.checkRendering)(renderFn, withUsage());
21
+ return function (widgetParams) {
22
+ var _ref = widgetParams || {},
23
+ _ref$escapeHTML = _ref.escapeHTML,
24
+ escapeHTML = _ref$escapeHTML === void 0 ? true : _ref$escapeHTML,
25
+ _ref$transformItems = _ref.transformItems,
26
+ transformItems = _ref$transformItems === void 0 ? function (items) {
27
+ return items;
28
+ } : _ref$transformItems,
29
+ objectIDs = _ref.objectIDs,
30
+ limit = _ref.limit,
31
+ threshold = _ref.threshold,
32
+ queryParameters = _ref.queryParameters;
33
+ if (!objectIDs || objectIDs.length === 0) {
34
+ throw new Error(withUsage('The `objectIDs` option is required.'));
35
+ }
36
+ return {
37
+ dependsOn: 'recommend',
38
+ $$type: 'ais.frequentlyBoughtTogether',
39
+ init: function init(initOptions) {
40
+ renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(initOptions)), {}, {
41
+ instantSearchInstance: initOptions.instantSearchInstance
42
+ }), true);
43
+ },
44
+ render: function render(renderOptions) {
45
+ var renderState = this.getWidgetRenderState(renderOptions);
46
+ renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
47
+ instantSearchInstance: renderOptions.instantSearchInstance
48
+ }), false);
49
+ },
50
+ getRenderState: function getRenderState(renderState) {
51
+ return renderState;
52
+ },
53
+ getWidgetRenderState: function getWidgetRenderState(_ref2) {
54
+ var results = _ref2.results;
55
+ if (results === null || results === undefined) {
56
+ return {
57
+ items: [],
58
+ widgetParams: widgetParams
59
+ };
60
+ }
61
+ if (escapeHTML && results.hits.length > 0) {
62
+ results.hits = (0, _utils.escapeHits)(results.hits);
63
+ }
64
+ var transformedItems = transformItems(results.hits, {
65
+ results: results
66
+ });
67
+ return {
68
+ items: transformedItems,
69
+ widgetParams: widgetParams
70
+ };
71
+ },
72
+ dispose: function dispose(_ref3) {
73
+ var recommendState = _ref3.recommendState;
74
+ unmountFn();
75
+ return recommendState.removeParams(this.$$id);
76
+ },
77
+ getWidgetParameters: function getWidgetParameters(state) {
78
+ var _this = this;
79
+ return objectIDs.reduce(function (acc, objectID) {
80
+ return acc.addFrequentlyBoughtTogether({
81
+ objectID: objectID,
82
+ threshold: threshold,
83
+ maxRecommendations: limit,
84
+ queryParameters: _objectSpread(_objectSpread({}, queryParameters), escapeHTML ? _utils.TAG_PLACEHOLDER : {}),
85
+ $$id: _this.$$id
86
+ });
87
+ }, state.removeParams(this.$$id));
88
+ }
89
+ };
90
+ };
91
+ };
92
+ var _default = connectFrequentlyBoughtTogether;
93
+ exports.default = _default;
@@ -47,6 +47,12 @@ Object.defineProperty(exports, "connectDynamicWidgets", {
47
47
  return _connectDynamicWidgets.default;
48
48
  }
49
49
  });
50
+ Object.defineProperty(exports, "connectFrequentlyBoughtTogether", {
51
+ enumerable: true,
52
+ get: function get() {
53
+ return _connectFrequentlyBoughtTogether.default;
54
+ }
55
+ });
50
56
  Object.defineProperty(exports, "connectGeoSearch", {
51
57
  enumerable: true,
52
58
  get: function get() {
@@ -89,6 +95,12 @@ Object.defineProperty(exports, "connectInfiniteHitsWithInsights", {
89
95
  return _connectInfiniteHitsWithInsights.default;
90
96
  }
91
97
  });
98
+ Object.defineProperty(exports, "connectLookingSimilar", {
99
+ enumerable: true,
100
+ get: function get() {
101
+ return _connectLookingSimilar.default;
102
+ }
103
+ });
92
104
  Object.defineProperty(exports, "connectMenu", {
93
105
  enumerable: true,
94
106
  get: function get() {
@@ -137,6 +149,12 @@ Object.defineProperty(exports, "connectRefinementList", {
137
149
  return _connectRefinementList.default;
138
150
  }
139
151
  });
152
+ Object.defineProperty(exports, "connectRelatedProducts", {
153
+ enumerable: true,
154
+ get: function get() {
155
+ return _connectRelatedProducts.default;
156
+ }
157
+ });
140
158
  Object.defineProperty(exports, "connectRelevantSort", {
141
159
  enumerable: true,
142
160
  get: function get() {
@@ -167,6 +185,12 @@ Object.defineProperty(exports, "connectToggleRefinement", {
167
185
  return _connectToggleRefinement.default;
168
186
  }
169
187
  });
188
+ Object.defineProperty(exports, "connectTrendingItems", {
189
+ enumerable: true,
190
+ get: function get() {
191
+ return _connectTrendingItems.default;
192
+ }
193
+ });
170
194
  Object.defineProperty(exports, "connectVoiceSearch", {
171
195
  enumerable: true,
172
196
  get: function get() {
@@ -189,11 +213,13 @@ var _connectNumericMenu = _interopRequireDefault(require("./numeric-menu/connect
189
213
  var _connectPagination = _interopRequireDefault(require("./pagination/connectPagination"));
190
214
  var _connectRange = _interopRequireDefault(require("./range/connectRange"));
191
215
  var _connectRefinementList = _interopRequireDefault(require("./refinement-list/connectRefinementList"));
216
+ var _connectRelatedProducts = _interopRequireDefault(require("./related-products/connectRelatedProducts"));
192
217
  var _connectSearchBox = _interopRequireDefault(require("./search-box/connectSearchBox"));
193
218
  var _connectSortBy = _interopRequireDefault(require("./sort-by/connectSortBy"));
194
219
  var _connectRatingMenu = _interopRequireDefault(require("./rating-menu/connectRatingMenu"));
195
220
  var _connectStats = _interopRequireDefault(require("./stats/connectStats"));
196
221
  var _connectToggleRefinement = _interopRequireDefault(require("./toggle-refinement/connectToggleRefinement"));
222
+ var _connectTrendingItems = _interopRequireDefault(require("./trending-items/connectTrendingItems"));
197
223
  var _connectBreadcrumb = _interopRequireDefault(require("./breadcrumb/connectBreadcrumb"));
198
224
  var _connectGeoSearch = _interopRequireDefault(require("./geo-search/connectGeoSearch"));
199
225
  var _connectPoweredBy = _interopRequireDefault(require("./powered-by/connectPoweredBy"));
@@ -203,6 +229,8 @@ var _connectAutocomplete = _interopRequireDefault(require("./autocomplete/connec
203
229
  var _connectQueryRules = _interopRequireDefault(require("./query-rules/connectQueryRules"));
204
230
  var _connectVoiceSearch = _interopRequireDefault(require("./voice-search/connectVoiceSearch"));
205
231
  var _connectRelevantSort = _interopRequireDefault(require("./relevant-sort/connectRelevantSort"));
232
+ var _connectFrequentlyBoughtTogether = _interopRequireDefault(require("./frequently-bought-together/connectFrequentlyBoughtTogether"));
233
+ var _connectLookingSimilar = _interopRequireDefault(require("./looking-similar/connectLookingSimilar"));
206
234
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
207
235
  /** @deprecated answers is no longer supported */
208
236
  var EXPERIMENTAL_connectAnswers = (0, _utils.deprecate)(_connectAnswers.default, 'answers is no longer supported');
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _utils = require("../../lib/utils");
8
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
9
+ 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
+ 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
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
13
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
14
+ var withUsage = (0, _utils.createDocumentationMessageGenerator)({
15
+ name: 'looking-similar',
16
+ connector: true
17
+ });
18
+ var connectLookingSimilar = function connectLookingSimilar(renderFn) {
19
+ var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _utils.noop;
20
+ (0, _utils.checkRendering)(renderFn, withUsage());
21
+ return function LookingSimilar(widgetParams) {
22
+ var _ref = widgetParams || {},
23
+ _ref$escapeHTML = _ref.escapeHTML,
24
+ escapeHTML = _ref$escapeHTML === void 0 ? true : _ref$escapeHTML,
25
+ objectIDs = _ref.objectIDs,
26
+ limit = _ref.limit,
27
+ threshold = _ref.threshold,
28
+ fallbackParameters = _ref.fallbackParameters,
29
+ queryParameters = _ref.queryParameters,
30
+ _ref$transformItems = _ref.transformItems,
31
+ transformItems = _ref$transformItems === void 0 ? function (items) {
32
+ return items;
33
+ } : _ref$transformItems;
34
+ if (!objectIDs || objectIDs.length === 0) {
35
+ throw new Error(withUsage('The `objectIDs` option is required.'));
36
+ }
37
+ return {
38
+ dependsOn: 'recommend',
39
+ $$type: 'ais.lookingSimilar',
40
+ init: function init(initOptions) {
41
+ renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(initOptions)), {}, {
42
+ instantSearchInstance: initOptions.instantSearchInstance
43
+ }), true);
44
+ },
45
+ render: function render(renderOptions) {
46
+ var renderState = this.getWidgetRenderState(renderOptions);
47
+ renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
48
+ instantSearchInstance: renderOptions.instantSearchInstance
49
+ }), false);
50
+ },
51
+ getRenderState: function getRenderState(renderState) {
52
+ return renderState;
53
+ },
54
+ getWidgetRenderState: function getWidgetRenderState(_ref2) {
55
+ var results = _ref2.results;
56
+ if (results === null || results === undefined) {
57
+ return {
58
+ items: [],
59
+ widgetParams: widgetParams
60
+ };
61
+ }
62
+ if (escapeHTML && results.hits.length > 0) {
63
+ results.hits = (0, _utils.escapeHits)(results.hits);
64
+ }
65
+ return {
66
+ items: transformItems(results.hits, {
67
+ results: results
68
+ }),
69
+ widgetParams: widgetParams
70
+ };
71
+ },
72
+ dispose: function dispose(_ref3) {
73
+ var recommendState = _ref3.recommendState;
74
+ unmountFn();
75
+ return recommendState.removeParams(this.$$id);
76
+ },
77
+ getWidgetParameters: function getWidgetParameters(state) {
78
+ var _this = this;
79
+ return objectIDs.reduce(function (acc, objectID) {
80
+ return acc.addLookingSimilar({
81
+ objectID: objectID,
82
+ maxRecommendations: limit,
83
+ threshold: threshold,
84
+ fallbackParameters: _objectSpread(_objectSpread({}, fallbackParameters), escapeHTML ? _utils.TAG_PLACEHOLDER : {}),
85
+ queryParameters: _objectSpread(_objectSpread({}, queryParameters), escapeHTML ? _utils.TAG_PLACEHOLDER : {}),
86
+ $$id: _this.$$id
87
+ });
88
+ }, state.removeParams(this.$$id));
89
+ }
90
+ };
91
+ };
92
+ };
93
+ var _default = connectLookingSimilar;
94
+ exports.default = _default;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _utils = require("../../lib/utils");
8
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
9
+ 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
+ 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
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
13
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
14
+ var withUsage = (0, _utils.createDocumentationMessageGenerator)({
15
+ name: 'related-products',
16
+ connector: true
17
+ });
18
+ var connectRelatedProducts = function connectRelatedProducts(renderFn) {
19
+ var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _utils.noop;
20
+ (0, _utils.checkRendering)(renderFn, withUsage());
21
+ return function relatedProducts(widgetParams) {
22
+ var _ref = widgetParams || {},
23
+ _ref$escapeHTML = _ref.escapeHTML,
24
+ escapeHTML = _ref$escapeHTML === void 0 ? true : _ref$escapeHTML,
25
+ objectIDs = _ref.objectIDs,
26
+ limit = _ref.limit,
27
+ threshold = _ref.threshold,
28
+ fallbackParameters = _ref.fallbackParameters,
29
+ queryParameters = _ref.queryParameters,
30
+ _ref$transformItems = _ref.transformItems,
31
+ transformItems = _ref$transformItems === void 0 ? function (items) {
32
+ return items;
33
+ } : _ref$transformItems;
34
+ if (!objectIDs || objectIDs.length === 0) {
35
+ throw new Error(withUsage('The `objectIDs` option is required.'));
36
+ }
37
+ return {
38
+ dependsOn: 'recommend',
39
+ $$type: 'ais.relatedProducts',
40
+ init: function init(initOptions) {
41
+ renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(initOptions)), {}, {
42
+ instantSearchInstance: initOptions.instantSearchInstance
43
+ }), true);
44
+ },
45
+ render: function render(renderOptions) {
46
+ var renderState = this.getWidgetRenderState(renderOptions);
47
+ renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
48
+ instantSearchInstance: renderOptions.instantSearchInstance
49
+ }), false);
50
+ },
51
+ getRenderState: function getRenderState(renderState) {
52
+ return renderState;
53
+ },
54
+ getWidgetRenderState: function getWidgetRenderState(_ref2) {
55
+ var results = _ref2.results;
56
+ if (results === null || results === undefined) {
57
+ return {
58
+ items: [],
59
+ widgetParams: widgetParams
60
+ };
61
+ }
62
+ if (escapeHTML && results.hits.length > 0) {
63
+ results.hits = (0, _utils.escapeHits)(results.hits);
64
+ }
65
+ return {
66
+ items: transformItems(results.hits, {
67
+ results: results
68
+ }),
69
+ widgetParams: widgetParams
70
+ };
71
+ },
72
+ dispose: function dispose(_ref3) {
73
+ var recommendState = _ref3.recommendState;
74
+ unmountFn();
75
+ return recommendState.removeParams(this.$$id);
76
+ },
77
+ getWidgetParameters: function getWidgetParameters(state) {
78
+ var _this = this;
79
+ return objectIDs.reduce(function (acc, objectID) {
80
+ return acc.addRelatedProducts({
81
+ objectID: objectID,
82
+ maxRecommendations: limit,
83
+ threshold: threshold,
84
+ fallbackParameters: _objectSpread(_objectSpread({}, fallbackParameters), escapeHTML ? _utils.TAG_PLACEHOLDER : {}),
85
+ queryParameters: _objectSpread(_objectSpread({}, queryParameters), escapeHTML ? _utils.TAG_PLACEHOLDER : {}),
86
+ $$id: _this.$$id
87
+ });
88
+ }, state.removeParams(this.$$id));
89
+ }
90
+ };
91
+ };
92
+ };
93
+ var _default = connectRelatedProducts;
94
+ exports.default = _default;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _utils = require("../../lib/utils");
8
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
9
+ 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
+ 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
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
13
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
14
+ var withUsage = (0, _utils.createDocumentationMessageGenerator)({
15
+ name: 'trending-items',
16
+ connector: true
17
+ });
18
+ var connectTrendingItems = function connectTrendingItems(renderFn) {
19
+ var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _utils.noop;
20
+ (0, _utils.checkRendering)(renderFn, withUsage());
21
+ return function trendingItems(widgetParams) {
22
+ var _ref = widgetParams || {},
23
+ facetName = _ref.facetName,
24
+ facetValue = _ref.facetValue,
25
+ limit = _ref.limit,
26
+ threshold = _ref.threshold,
27
+ fallbackParameters = _ref.fallbackParameters,
28
+ queryParameters = _ref.queryParameters,
29
+ _ref$escapeHTML = _ref.escapeHTML,
30
+ escapeHTML = _ref$escapeHTML === void 0 ? true : _ref$escapeHTML,
31
+ _ref$transformItems = _ref.transformItems,
32
+ transformItems = _ref$transformItems === void 0 ? function (items) {
33
+ return items;
34
+ } : _ref$transformItems;
35
+ return {
36
+ dependsOn: 'recommend',
37
+ $$type: 'ais.trendingItems',
38
+ init: function init(initOptions) {
39
+ renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(initOptions)), {}, {
40
+ instantSearchInstance: initOptions.instantSearchInstance
41
+ }), true);
42
+ },
43
+ render: function render(renderOptions) {
44
+ var renderState = this.getWidgetRenderState(renderOptions);
45
+ renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
46
+ instantSearchInstance: renderOptions.instantSearchInstance
47
+ }), false);
48
+ },
49
+ getRenderState: function getRenderState(renderState) {
50
+ return renderState;
51
+ },
52
+ getWidgetRenderState: function getWidgetRenderState(_ref2) {
53
+ var results = _ref2.results;
54
+ if (results === null || results === undefined) {
55
+ return {
56
+ items: [],
57
+ widgetParams: widgetParams
58
+ };
59
+ }
60
+ if (escapeHTML && results.hits.length > 0) {
61
+ results.hits = (0, _utils.escapeHits)(results.hits);
62
+ }
63
+ return {
64
+ items: transformItems(results.hits, {
65
+ results: results
66
+ }),
67
+ widgetParams: widgetParams
68
+ };
69
+ },
70
+ dispose: function dispose(_ref3) {
71
+ var recommendState = _ref3.recommendState;
72
+ unmountFn();
73
+ return recommendState.removeParams(this.$$id);
74
+ },
75
+ getWidgetParameters: function getWidgetParameters(state) {
76
+ return state.removeParams(this.$$id).addTrendingItems({
77
+ facetName: facetName,
78
+ facetValue: facetValue,
79
+ maxRecommendations: limit,
80
+ threshold: threshold,
81
+ fallbackParameters: _objectSpread(_objectSpread({}, fallbackParameters), escapeHTML ? _utils.TAG_PLACEHOLDER : {}),
82
+ queryParameters: _objectSpread(_objectSpread({}, queryParameters), escapeHTML ? _utils.TAG_PLACEHOLDER : {}),
83
+ $$id: this.$$id
84
+ });
85
+ }
86
+ };
87
+ };
88
+ };
89
+ var _default = connectTrendingItems;
90
+ exports.default = _default;
@@ -82,6 +82,8 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
82
82
  _defineProperty(_assertThisInitialized(_this), "_createURL", void 0);
83
83
  _defineProperty(_assertThisInitialized(_this), "_searchFunction", void 0);
84
84
  _defineProperty(_assertThisInitialized(_this), "_mainHelperSearch", void 0);
85
+ _defineProperty(_assertThisInitialized(_this), "_hasSearchWidget", false);
86
+ _defineProperty(_assertThisInitialized(_this), "_hasRecommendWidget", false);
85
87
  _defineProperty(_assertThisInitialized(_this), "_insights", void 0);
86
88
  _defineProperty(_assertThisInitialized(_this), "middleware", []);
87
89
  _defineProperty(_assertThisInitialized(_this), "sendEventToInsights", void 0);
@@ -392,7 +394,13 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
392
394
  // under the hood, we have a different implementation. It should be
393
395
  // completely transparent for the rest of the codebase. Only this module
394
396
  // is impacted.
395
- return mainHelper.searchOnlyWithDerivedHelpers() && mainHelper.recommend();
397
+ if (_this3._hasSearchWidget) {
398
+ mainHelper.searchOnlyWithDerivedHelpers();
399
+ }
400
+ if (_this3._hasRecommendWidget) {
401
+ mainHelper.recommend();
402
+ }
403
+ return mainHelper;
396
404
  };
397
405
  if (this._searchFunction) {
398
406
  // this client isn't used to actually search, but required for the helper
@@ -459,6 +467,7 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
459
467
  });
460
468
  if (this._initialResults) {
461
469
  (0, _utils.hydrateSearchClient)(this.client, this._initialResults);
470
+ (0, _utils.hydrateRecommendCache)(this.mainHelper, this._initialResults);
462
471
  var originalScheduleSearch = this.scheduleSearch;
463
472
  // We don't schedule a first search when initial results are provided
464
473
  // because we already have the results to render. This skips the initial
package/cjs/lib/server.js CHANGED
@@ -17,13 +17,14 @@ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input ==
17
17
  * in `getServerState()`.
18
18
  */
19
19
  function waitForResults(search) {
20
+ var skipRecommend = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
20
21
  var helper = search.mainHelper;
21
22
 
22
23
  // Extract search parameters from the search client to use them
23
24
  // later during hydration.
24
25
  var requestParamsList;
25
26
  var client = helper.getClient();
26
- helper.setClient({
27
+ helper.setClient(_objectSpread(_objectSpread({}, client), {}, {
27
28
  search: function search(queries) {
28
29
  requestParamsList = queries.map(function (_ref) {
29
30
  var params = _ref.params;
@@ -31,13 +32,25 @@ function waitForResults(search) {
31
32
  });
32
33
  return client.search(queries);
33
34
  }
34
- });
35
- helper.searchOnlyWithDerivedHelpers();
35
+ }));
36
+ search._hasSearchWidget && helper.searchOnlyWithDerivedHelpers();
37
+ !skipRecommend && search._hasRecommendWidget && helper.recommend();
36
38
  return new Promise(function (resolve, reject) {
39
+ var searchResultsReceived = !search._hasSearchWidget;
40
+ var recommendResultsReceived = !search._hasRecommendWidget || skipRecommend;
37
41
  // All derived helpers resolve in the same tick so we're safe only relying
38
42
  // on the first one.
39
43
  helper.derivedHelpers[0].on('result', function () {
40
- resolve(requestParamsList);
44
+ searchResultsReceived = true;
45
+ if (recommendResultsReceived) {
46
+ resolve(requestParamsList);
47
+ }
48
+ });
49
+ helper.derivedHelpers[0].on('recommend:result', function () {
50
+ recommendResultsReceived = true;
51
+ if (searchResultsReceived) {
52
+ resolve(requestParamsList);
53
+ }
41
54
  });
42
55
 
43
56
  // However, we listen to errors that can happen on any derived helper because
@@ -68,15 +81,21 @@ requestParamsList) {
68
81
  var initialResults = {};
69
82
  var requestParamsIndex = 0;
70
83
  (0, _utils.walkIndex)(rootIndex, function (widget) {
84
+ var _widget$getHelper;
71
85
  var searchResults = widget.getResults();
72
- if (searchResults) {
86
+ var recommendResults = (_widget$getHelper = widget.getHelper()) === null || _widget$getHelper === void 0 ? void 0 : _widget$getHelper.lastRecommendResults;
87
+ if (searchResults || recommendResults) {
73
88
  var requestParams = requestParamsList === null || requestParamsList === void 0 ? void 0 : requestParamsList[requestParamsIndex++];
74
- initialResults[widget.getIndexId()] = _objectSpread({
75
- // We convert the Helper state to a plain object to pass parsable data
76
- // structures from server to client.
89
+ initialResults[widget.getIndexId()] = _objectSpread(_objectSpread(_objectSpread({}, searchResults && {
77
90
  state: _objectSpread({}, searchResults._state),
78
91
  results: searchResults._rawResults
79
- }, requestParams && {
92
+ }), recommendResults && {
93
+ recommendResults: {
94
+ // We have to stringify + parse because of some explicitly undefined values.
95
+ params: JSON.parse(JSON.stringify(recommendResults._state.params)),
96
+ results: recommendResults._rawResults
97
+ }
98
+ }), requestParams && {
80
99
  requestParams: requestParams
81
100
  });
82
101
  }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.addWidgetId = addWidgetId;
7
+ exports.resetWidgetId = resetWidgetId;
8
+ var id = 0;
9
+ function addWidgetId(widget) {
10
+ if (widget.dependsOn !== 'recommend') {
11
+ return;
12
+ }
13
+ widget.$$id = id++;
14
+ }
15
+ function resetWidgetId() {
16
+ id = 0;
17
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.hydrateRecommendCache = hydrateRecommendCache;
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 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; }
9
+ 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; }
10
+ 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; }
11
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
12
+ 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); }
13
+ function hydrateRecommendCache(helper, initialResults) {
14
+ var recommendCache = Object.keys(initialResults).reduce(function (acc, indexName) {
15
+ var initialResult = initialResults[indexName];
16
+ if (initialResult.recommendResults) {
17
+ // @MAJOR: Use `Object.assign` instead of spread operator
18
+ return _objectSpread(_objectSpread({}, acc), initialResult.recommendResults.results);
19
+ }
20
+ return acc;
21
+ }, {});
22
+ helper._recommendCache = recommendCache;
23
+ }
@@ -33,16 +33,20 @@ function hydrateSearchClient(client, results) {
33
33
  state = _results$key.state,
34
34
  requestParams = _results$key.requestParams,
35
35
  serverResults = _results$key.results;
36
- return serverResults.map(function (result) {
36
+ return serverResults && state ? serverResults.map(function (result) {
37
37
  return _objectSpread({
38
38
  indexName: state.index || result.index
39
39
  }, requestParams || result.params ? {
40
40
  params: serializeQueryParameters(requestParams || deserializeQueryParameters(result.params))
41
41
  } : {});
42
- });
42
+ }) : [];
43
43
  });
44
44
  var cachedResults = Object.keys(results).reduce(function (acc, key) {
45
- return acc.concat(results[key].results);
45
+ var res = results[key].results;
46
+ if (!res) {
47
+ return acc;
48
+ }
49
+ return acc.concat(res);
46
50
  }, []);
47
51
 
48
52
  // Algoliasearch API Client >= v4
@@ -3,6 +3,17 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ var _addWidgetId = require("./addWidgetId");
7
+ Object.keys(_addWidgetId).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _addWidgetId[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function get() {
13
+ return _addWidgetId[key];
14
+ }
15
+ });
16
+ });
6
17
  var _capitalize = require("./capitalize");
7
18
  Object.keys(_capitalize).forEach(function (key) {
8
19
  if (key === "default" || key === "__esModule") return;
@@ -322,6 +333,17 @@ Object.keys(_hitsQueryId).forEach(function (key) {
322
333
  }
323
334
  });
324
335
  });
336
+ var _hydrateRecommendCache = require("./hydrateRecommendCache");
337
+ Object.keys(_hydrateRecommendCache).forEach(function (key) {
338
+ if (key === "default" || key === "__esModule") return;
339
+ if (key in exports && exports[key] === _hydrateRecommendCache[key]) return;
340
+ Object.defineProperty(exports, key, {
341
+ enumerable: true,
342
+ get: function get() {
343
+ return _hydrateRecommendCache[key];
344
+ }
345
+ });
346
+ });
325
347
  var _hydrateSearchClient = require("./hydrateSearchClient");
326
348
  Object.keys(_hydrateSearchClient).forEach(function (key) {
327
349
  if (key === "default" || key === "__esModule") return;