instantsearch.js 4.68.0 → 4.69.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 (56) 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 +9 -1
  7. package/cjs/lib/utils/addWidgetId.js +13 -0
  8. package/cjs/lib/utils/render-args.js +3 -3
  9. package/cjs/lib/version.js +1 -1
  10. package/cjs/widgets/frequently-bought-together/frequently-bought-together.js +120 -0
  11. package/cjs/widgets/index/index.js +82 -20
  12. package/cjs/widgets/index.js +28 -0
  13. package/cjs/widgets/looking-similar/looking-similar.js +122 -0
  14. package/cjs/widgets/related-products/related-products.js +122 -0
  15. package/cjs/widgets/trending-items/trending-items.js +126 -0
  16. package/dist/instantsearch.development.d.ts +403 -10
  17. package/dist/instantsearch.development.js +1679 -274
  18. package/dist/instantsearch.development.js.map +1 -1
  19. package/dist/instantsearch.production.d.ts +403 -10
  20. package/dist/instantsearch.production.min.d.ts +403 -10
  21. package/dist/instantsearch.production.min.js +2 -2
  22. package/dist/instantsearch.production.min.js.map +1 -1
  23. package/es/connectors/frequently-bought-together/connectFrequentlyBoughtTogether.d.ts +45 -0
  24. package/es/connectors/frequently-bought-together/connectFrequentlyBoughtTogether.js +86 -0
  25. package/es/connectors/index.d.ts +4 -0
  26. package/es/connectors/index.js +5 -1
  27. package/es/connectors/looking-similar/connectLookingSimilar.d.ts +49 -0
  28. package/es/connectors/looking-similar/connectLookingSimilar.js +87 -0
  29. package/es/connectors/related-products/connectRelatedProducts.d.ts +49 -0
  30. package/es/connectors/related-products/connectRelatedProducts.js +87 -0
  31. package/es/connectors/trending-items/connectTrendingItems.d.ts +57 -0
  32. package/es/connectors/trending-items/connectTrendingItems.js +83 -0
  33. package/es/lib/InstantSearch.d.ts +2 -0
  34. package/es/lib/InstantSearch.js +9 -1
  35. package/es/lib/templating/renderTemplate.d.ts +1 -1
  36. package/es/lib/utils/addWidgetId.d.ts +2 -0
  37. package/es/lib/utils/addWidgetId.js +7 -0
  38. package/es/lib/utils/render-args.d.ts +3 -3
  39. package/es/lib/utils/render-args.js +3 -3
  40. package/es/lib/version.d.ts +1 -1
  41. package/es/lib/version.js +1 -1
  42. package/es/types/templates.d.ts +1 -1
  43. package/es/types/widget.d.ts +16 -9
  44. package/es/widgets/frequently-bought-together/frequently-bought-together.d.ts +41 -0
  45. package/es/widgets/frequently-bought-together/frequently-bought-together.js +112 -0
  46. package/es/widgets/index/index.d.ts +2 -1
  47. package/es/widgets/index/index.js +82 -20
  48. package/es/widgets/index.d.ts +4 -0
  49. package/es/widgets/index.js +5 -1
  50. package/es/widgets/looking-similar/looking-similar.d.ts +41 -0
  51. package/es/widgets/looking-similar/looking-similar.js +114 -0
  52. package/es/widgets/related-products/related-products.d.ts +41 -0
  53. package/es/widgets/related-products/related-products.js +114 -0
  54. package/es/widgets/trending-items/trending-items.d.ts +41 -0
  55. package/es/widgets/trending-items/trending-items.js +118 -0
  56. package/package.json +7 -7
@@ -0,0 +1,45 @@
1
+ import type { Connector, TransformItems, Hit, BaseHit } from '../../types';
2
+ import type { PlainSearchParameters, RecommendResultItem } from 'algoliasearch-helper';
3
+ export type FrequentlyBoughtTogetherRenderState<THit extends BaseHit = BaseHit> = {
4
+ /**
5
+ * The matched recommendations from Algolia API.
6
+ */
7
+ items: Array<Hit<THit>>;
8
+ };
9
+ export type FrequentlyBoughtTogetherConnectorParams<THit extends BaseHit = BaseHit> = {
10
+ /**
11
+ * The objectIDs of the items to get the frequently bought together items for.
12
+ */
13
+ objectIDs: string[];
14
+ /**
15
+ * Threshold for the recommendations confidence score (between 0 and 100). Only recommendations with a greater score are returned.
16
+ */
17
+ threshold?: number;
18
+ /**
19
+ * The maximum number of recommendations to return.
20
+ */
21
+ limit?: number;
22
+ /**
23
+ * Parameters to pass to the request.
24
+ */
25
+ queryParameters?: Omit<PlainSearchParameters, 'page' | 'hitsPerPage' | 'offset' | 'length'>;
26
+ /**
27
+ * Whether to escape HTML tags from items string values.
28
+ *
29
+ * @default true
30
+ */
31
+ escapeHTML?: boolean;
32
+ /**
33
+ * Function to transform the items passed to the templates.
34
+ */
35
+ transformItems?: TransformItems<Hit<THit>, {
36
+ results: RecommendResultItem;
37
+ }>;
38
+ };
39
+ export type FrequentlyBoughtTogetherWidgetDescription<THit extends BaseHit = BaseHit> = {
40
+ $$type: 'ais.frequentlyBoughtTogether';
41
+ renderState: FrequentlyBoughtTogetherRenderState<THit>;
42
+ };
43
+ export type FrequentlyBoughtTogetherConnector<THit extends BaseHit = BaseHit> = Connector<FrequentlyBoughtTogetherWidgetDescription<THit>, FrequentlyBoughtTogetherConnectorParams<THit>>;
44
+ declare const connectFrequentlyBoughtTogether: FrequentlyBoughtTogetherConnector;
45
+ export default connectFrequentlyBoughtTogether;
@@ -0,0 +1,86 @@
1
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
+ 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; }
3
+ 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; }
4
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
6
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
7
+ import { createDocumentationMessageGenerator, checkRendering, noop, escapeHits, TAG_PLACEHOLDER } from "../../lib/utils/index.js";
8
+ var withUsage = createDocumentationMessageGenerator({
9
+ name: 'frequently-bought-together',
10
+ connector: true
11
+ });
12
+ var connectFrequentlyBoughtTogether = function connectFrequentlyBoughtTogether(renderFn) {
13
+ var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;
14
+ checkRendering(renderFn, withUsage());
15
+ return function (widgetParams) {
16
+ var _ref = widgetParams || {},
17
+ _ref$escapeHTML = _ref.escapeHTML,
18
+ escapeHTML = _ref$escapeHTML === void 0 ? true : _ref$escapeHTML,
19
+ _ref$transformItems = _ref.transformItems,
20
+ transformItems = _ref$transformItems === void 0 ? function (items) {
21
+ return items;
22
+ } : _ref$transformItems,
23
+ objectIDs = _ref.objectIDs,
24
+ limit = _ref.limit,
25
+ threshold = _ref.threshold,
26
+ queryParameters = _ref.queryParameters;
27
+ if (!objectIDs || objectIDs.length === 0) {
28
+ throw new Error(withUsage('The `objectIDs` option is required.'));
29
+ }
30
+ return {
31
+ dependsOn: 'recommend',
32
+ $$type: 'ais.frequentlyBoughtTogether',
33
+ init: function init(initOptions) {
34
+ renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(initOptions)), {}, {
35
+ instantSearchInstance: initOptions.instantSearchInstance
36
+ }), true);
37
+ },
38
+ render: function render(renderOptions) {
39
+ var renderState = this.getWidgetRenderState(renderOptions);
40
+ renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
41
+ instantSearchInstance: renderOptions.instantSearchInstance
42
+ }), false);
43
+ },
44
+ getRenderState: function getRenderState(renderState) {
45
+ return renderState;
46
+ },
47
+ getWidgetRenderState: function getWidgetRenderState(_ref2) {
48
+ var results = _ref2.results;
49
+ if (results === null || results === undefined) {
50
+ return {
51
+ items: [],
52
+ widgetParams: widgetParams
53
+ };
54
+ }
55
+ if (escapeHTML && results.hits.length > 0) {
56
+ results.hits = escapeHits(results.hits);
57
+ }
58
+ var transformedItems = transformItems(results.hits, {
59
+ results: results
60
+ });
61
+ return {
62
+ items: transformedItems,
63
+ widgetParams: widgetParams
64
+ };
65
+ },
66
+ dispose: function dispose(_ref3) {
67
+ var recommendState = _ref3.recommendState;
68
+ unmountFn();
69
+ return recommendState.removeParams(this.$$id);
70
+ },
71
+ getWidgetParameters: function getWidgetParameters(state) {
72
+ var _this = this;
73
+ return objectIDs.reduce(function (acc, objectID) {
74
+ return acc.addFrequentlyBoughtTogether({
75
+ objectID: objectID,
76
+ threshold: threshold,
77
+ maxRecommendations: limit,
78
+ queryParameters: _objectSpread(_objectSpread({}, queryParameters), escapeHTML ? TAG_PLACEHOLDER : {}),
79
+ $$id: _this.$$id
80
+ });
81
+ }, state.removeParams(this.$$id));
82
+ }
83
+ };
84
+ };
85
+ };
86
+ export default connectFrequentlyBoughtTogether;
@@ -17,11 +17,13 @@ export { default as connectNumericMenu } from './numeric-menu/connectNumericMenu
17
17
  export { default as connectPagination } from './pagination/connectPagination';
18
18
  export { default as connectRange } from './range/connectRange';
19
19
  export { default as connectRefinementList } from './refinement-list/connectRefinementList';
20
+ export { default as connectRelatedProducts } from './related-products/connectRelatedProducts';
20
21
  export { default as connectSearchBox } from './search-box/connectSearchBox';
21
22
  export { default as connectSortBy } from './sort-by/connectSortBy';
22
23
  export { default as connectRatingMenu } from './rating-menu/connectRatingMenu';
23
24
  export { default as connectStats } from './stats/connectStats';
24
25
  export { default as connectToggleRefinement } from './toggle-refinement/connectToggleRefinement';
26
+ export { default as connectTrendingItems } from './trending-items/connectTrendingItems';
25
27
  export { default as connectBreadcrumb } from './breadcrumb/connectBreadcrumb';
26
28
  export { default as connectGeoSearch } from './geo-search/connectGeoSearch';
27
29
  export { default as connectPoweredBy } from './powered-by/connectPoweredBy';
@@ -31,3 +33,5 @@ export { default as connectAutocomplete } from './autocomplete/connectAutocomple
31
33
  export { default as connectQueryRules } from './query-rules/connectQueryRules';
32
34
  export { default as connectVoiceSearch } from './voice-search/connectVoiceSearch';
33
35
  export { default as connectRelevantSort } from './relevant-sort/connectRelevantSort';
36
+ export { default as connectFrequentlyBoughtTogether } from './frequently-bought-together/connectFrequentlyBoughtTogether';
37
+ export { default as connectLookingSimilar } from './looking-similar/connectLookingSimilar';
@@ -21,11 +21,13 @@ export { default as connectNumericMenu } from "./numeric-menu/connectNumericMenu
21
21
  export { default as connectPagination } from "./pagination/connectPagination.js";
22
22
  export { default as connectRange } from "./range/connectRange.js";
23
23
  export { default as connectRefinementList } from "./refinement-list/connectRefinementList.js";
24
+ export { default as connectRelatedProducts } from "./related-products/connectRelatedProducts.js";
24
25
  export { default as connectSearchBox } from "./search-box/connectSearchBox.js";
25
26
  export { default as connectSortBy } from "./sort-by/connectSortBy.js";
26
27
  export { default as connectRatingMenu } from "./rating-menu/connectRatingMenu.js";
27
28
  export { default as connectStats } from "./stats/connectStats.js";
28
29
  export { default as connectToggleRefinement } from "./toggle-refinement/connectToggleRefinement.js";
30
+ export { default as connectTrendingItems } from "./trending-items/connectTrendingItems.js";
29
31
  export { default as connectBreadcrumb } from "./breadcrumb/connectBreadcrumb.js";
30
32
  export { default as connectGeoSearch } from "./geo-search/connectGeoSearch.js";
31
33
  export { default as connectPoweredBy } from "./powered-by/connectPoweredBy.js";
@@ -34,4 +36,6 @@ export { default as EXPERIMENTAL_connectConfigureRelatedItems } from "./configur
34
36
  export { default as connectAutocomplete } from "./autocomplete/connectAutocomplete.js";
35
37
  export { default as connectQueryRules } from "./query-rules/connectQueryRules.js";
36
38
  export { default as connectVoiceSearch } from "./voice-search/connectVoiceSearch.js";
37
- export { default as connectRelevantSort } from "./relevant-sort/connectRelevantSort.js";
39
+ export { default as connectRelevantSort } from "./relevant-sort/connectRelevantSort.js";
40
+ export { default as connectFrequentlyBoughtTogether } from "./frequently-bought-together/connectFrequentlyBoughtTogether.js";
41
+ export { default as connectLookingSimilar } from "./looking-similar/connectLookingSimilar.js";
@@ -0,0 +1,49 @@
1
+ import type { Connector, TransformItems, Hit, BaseHit } from '../../types';
2
+ import type { PlainSearchParameters, RecommendResultItem } from 'algoliasearch-helper';
3
+ export type LookingSimilarRenderState<THit extends BaseHit = BaseHit> = {
4
+ /**
5
+ * The matched recommendations from the Algolia API.
6
+ */
7
+ items: Array<Hit<THit>>;
8
+ };
9
+ export type LookingSimilarConnectorParams<THit extends BaseHit = BaseHit> = {
10
+ /**
11
+ * The `objectIDs` of the items to get similar looking products from.
12
+ */
13
+ objectIDs: string[];
14
+ /**
15
+ * The number of recommendations to retrieve.
16
+ */
17
+ limit?: number;
18
+ /**
19
+ * The threshold for the recommendations confidence score (between 0 and 100).
20
+ */
21
+ threshold?: number;
22
+ /**
23
+ * List of search parameters to send.
24
+ */
25
+ fallbackParameters?: Omit<PlainSearchParameters, 'page' | 'hitsPerPage' | 'offset' | 'length'>;
26
+ /**
27
+ * List of search parameters to send.
28
+ */
29
+ queryParameters?: Omit<PlainSearchParameters, 'page' | 'hitsPerPage' | 'offset' | 'length'>;
30
+ /**
31
+ * Whether to escape HTML tags from items string values.
32
+ *
33
+ * @default true
34
+ */
35
+ escapeHTML?: boolean;
36
+ /**
37
+ * Function to transform the items passed to the templates.
38
+ */
39
+ transformItems?: TransformItems<Hit<THit>, {
40
+ results: RecommendResultItem;
41
+ }>;
42
+ };
43
+ export type LookingSimilarWidgetDescription<THit extends BaseHit = BaseHit> = {
44
+ $$type: 'ais.lookingSimilar';
45
+ renderState: LookingSimilarRenderState<THit>;
46
+ };
47
+ export type LookingSimilarConnector<THit extends BaseHit = BaseHit> = Connector<LookingSimilarWidgetDescription<THit>, LookingSimilarConnectorParams<THit>>;
48
+ declare const connectLookingSimilar: LookingSimilarConnector;
49
+ export default connectLookingSimilar;
@@ -0,0 +1,87 @@
1
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
+ 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; }
3
+ 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; }
4
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
6
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
7
+ import { createDocumentationMessageGenerator, checkRendering, noop, escapeHits, TAG_PLACEHOLDER } from "../../lib/utils/index.js";
8
+ var withUsage = createDocumentationMessageGenerator({
9
+ name: 'looking-similar',
10
+ connector: true
11
+ });
12
+ var connectLookingSimilar = function connectLookingSimilar(renderFn) {
13
+ var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;
14
+ checkRendering(renderFn, withUsage());
15
+ return function LookingSimilar(widgetParams) {
16
+ var _ref = widgetParams || {},
17
+ _ref$escapeHTML = _ref.escapeHTML,
18
+ escapeHTML = _ref$escapeHTML === void 0 ? true : _ref$escapeHTML,
19
+ objectIDs = _ref.objectIDs,
20
+ limit = _ref.limit,
21
+ threshold = _ref.threshold,
22
+ fallbackParameters = _ref.fallbackParameters,
23
+ queryParameters = _ref.queryParameters,
24
+ _ref$transformItems = _ref.transformItems,
25
+ transformItems = _ref$transformItems === void 0 ? function (items) {
26
+ return items;
27
+ } : _ref$transformItems;
28
+ if (!objectIDs || objectIDs.length === 0) {
29
+ throw new Error(withUsage('The `objectIDs` option is required.'));
30
+ }
31
+ return {
32
+ dependsOn: 'recommend',
33
+ $$type: 'ais.lookingSimilar',
34
+ init: function init(initOptions) {
35
+ renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(initOptions)), {}, {
36
+ instantSearchInstance: initOptions.instantSearchInstance
37
+ }), true);
38
+ },
39
+ render: function render(renderOptions) {
40
+ var renderState = this.getWidgetRenderState(renderOptions);
41
+ renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
42
+ instantSearchInstance: renderOptions.instantSearchInstance
43
+ }), false);
44
+ },
45
+ getRenderState: function getRenderState(renderState) {
46
+ return renderState;
47
+ },
48
+ getWidgetRenderState: function getWidgetRenderState(_ref2) {
49
+ var results = _ref2.results;
50
+ if (results === null || results === undefined) {
51
+ return {
52
+ items: [],
53
+ widgetParams: widgetParams
54
+ };
55
+ }
56
+ if (escapeHTML && results.hits.length > 0) {
57
+ results.hits = escapeHits(results.hits);
58
+ }
59
+ return {
60
+ items: transformItems(results.hits, {
61
+ results: results
62
+ }),
63
+ widgetParams: widgetParams
64
+ };
65
+ },
66
+ dispose: function dispose(_ref3) {
67
+ var recommendState = _ref3.recommendState;
68
+ unmountFn();
69
+ return recommendState.removeParams(this.$$id);
70
+ },
71
+ getWidgetParameters: function getWidgetParameters(state) {
72
+ var _this = this;
73
+ return objectIDs.reduce(function (acc, objectID) {
74
+ return acc.addLookingSimilar({
75
+ objectID: objectID,
76
+ maxRecommendations: limit,
77
+ threshold: threshold,
78
+ fallbackParameters: _objectSpread(_objectSpread({}, fallbackParameters), escapeHTML ? TAG_PLACEHOLDER : {}),
79
+ queryParameters: _objectSpread(_objectSpread({}, queryParameters), escapeHTML ? TAG_PLACEHOLDER : {}),
80
+ $$id: _this.$$id
81
+ });
82
+ }, state.removeParams(this.$$id));
83
+ }
84
+ };
85
+ };
86
+ };
87
+ export default connectLookingSimilar;
@@ -0,0 +1,49 @@
1
+ import type { Connector, TransformItems, Hit, BaseHit } from '../../types';
2
+ import type { PlainSearchParameters, RecommendResultItem } from 'algoliasearch-helper';
3
+ export type RelatedProductsRenderState<THit extends BaseHit = BaseHit> = {
4
+ /**
5
+ * The matched recommendations from the Algolia API.
6
+ */
7
+ items: Array<Hit<THit>>;
8
+ };
9
+ export type RelatedProductsConnectorParams<THit extends BaseHit = BaseHit> = {
10
+ /**
11
+ * The `objectIDs` of the items to get related products from.
12
+ */
13
+ objectIDs: string[];
14
+ /**
15
+ * The number of recommendations to retrieve.
16
+ */
17
+ limit?: number;
18
+ /**
19
+ * The threshold for the recommendations confidence score (between 0 and 100).
20
+ */
21
+ threshold?: number;
22
+ /**
23
+ * List of search parameters to send.
24
+ */
25
+ fallbackParameters?: Omit<PlainSearchParameters, 'page' | 'hitsPerPage' | 'offset' | 'length'>;
26
+ /**
27
+ * List of search parameters to send.
28
+ */
29
+ queryParameters?: Omit<PlainSearchParameters, 'page' | 'hitsPerPage' | 'offset' | 'length'>;
30
+ /**
31
+ * Whether to escape HTML tags from items string values.
32
+ *
33
+ * @default true
34
+ */
35
+ escapeHTML?: boolean;
36
+ /**
37
+ * Function to transform the items passed to the templates.
38
+ */
39
+ transformItems?: TransformItems<Hit<THit>, {
40
+ results: RecommendResultItem;
41
+ }>;
42
+ };
43
+ export type RelatedProductsWidgetDescription<THit extends BaseHit = BaseHit> = {
44
+ $$type: 'ais.relatedProducts';
45
+ renderState: RelatedProductsRenderState<THit>;
46
+ };
47
+ export type RelatedProductsConnector<THit extends BaseHit = BaseHit> = Connector<RelatedProductsWidgetDescription<THit>, RelatedProductsConnectorParams<THit>>;
48
+ declare const connectRelatedProducts: RelatedProductsConnector;
49
+ export default connectRelatedProducts;
@@ -0,0 +1,87 @@
1
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
+ 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; }
3
+ 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; }
4
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
6
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
7
+ import { createDocumentationMessageGenerator, checkRendering, noop, escapeHits, TAG_PLACEHOLDER } from "../../lib/utils/index.js";
8
+ var withUsage = createDocumentationMessageGenerator({
9
+ name: 'related-products',
10
+ connector: true
11
+ });
12
+ var connectRelatedProducts = function connectRelatedProducts(renderFn) {
13
+ var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;
14
+ checkRendering(renderFn, withUsage());
15
+ return function relatedProducts(widgetParams) {
16
+ var _ref = widgetParams || {},
17
+ _ref$escapeHTML = _ref.escapeHTML,
18
+ escapeHTML = _ref$escapeHTML === void 0 ? true : _ref$escapeHTML,
19
+ objectIDs = _ref.objectIDs,
20
+ limit = _ref.limit,
21
+ threshold = _ref.threshold,
22
+ fallbackParameters = _ref.fallbackParameters,
23
+ queryParameters = _ref.queryParameters,
24
+ _ref$transformItems = _ref.transformItems,
25
+ transformItems = _ref$transformItems === void 0 ? function (items) {
26
+ return items;
27
+ } : _ref$transformItems;
28
+ if (!objectIDs || objectIDs.length === 0) {
29
+ throw new Error(withUsage('The `objectIDs` option is required.'));
30
+ }
31
+ return {
32
+ dependsOn: 'recommend',
33
+ $$type: 'ais.relatedProducts',
34
+ init: function init(initOptions) {
35
+ renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(initOptions)), {}, {
36
+ instantSearchInstance: initOptions.instantSearchInstance
37
+ }), true);
38
+ },
39
+ render: function render(renderOptions) {
40
+ var renderState = this.getWidgetRenderState(renderOptions);
41
+ renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
42
+ instantSearchInstance: renderOptions.instantSearchInstance
43
+ }), false);
44
+ },
45
+ getRenderState: function getRenderState(renderState) {
46
+ return renderState;
47
+ },
48
+ getWidgetRenderState: function getWidgetRenderState(_ref2) {
49
+ var results = _ref2.results;
50
+ if (results === null || results === undefined) {
51
+ return {
52
+ items: [],
53
+ widgetParams: widgetParams
54
+ };
55
+ }
56
+ if (escapeHTML && results.hits.length > 0) {
57
+ results.hits = escapeHits(results.hits);
58
+ }
59
+ return {
60
+ items: transformItems(results.hits, {
61
+ results: results
62
+ }),
63
+ widgetParams: widgetParams
64
+ };
65
+ },
66
+ dispose: function dispose(_ref3) {
67
+ var recommendState = _ref3.recommendState;
68
+ unmountFn();
69
+ return recommendState.removeParams(this.$$id);
70
+ },
71
+ getWidgetParameters: function getWidgetParameters(state) {
72
+ var _this = this;
73
+ return objectIDs.reduce(function (acc, objectID) {
74
+ return acc.addRelatedProducts({
75
+ objectID: objectID,
76
+ maxRecommendations: limit,
77
+ threshold: threshold,
78
+ fallbackParameters: _objectSpread(_objectSpread({}, fallbackParameters), escapeHTML ? TAG_PLACEHOLDER : {}),
79
+ queryParameters: _objectSpread(_objectSpread({}, queryParameters), escapeHTML ? TAG_PLACEHOLDER : {}),
80
+ $$id: _this.$$id
81
+ });
82
+ }, state.removeParams(this.$$id));
83
+ }
84
+ };
85
+ };
86
+ };
87
+ export default connectRelatedProducts;
@@ -0,0 +1,57 @@
1
+ import type { Connector, TransformItems, Hit, BaseHit } from '../../types';
2
+ import type { PlainSearchParameters, RecommendResultItem } from 'algoliasearch-helper';
3
+ export type TrendingItemsRenderState<THit extends BaseHit = BaseHit> = {
4
+ /**
5
+ * The matched recommendations from the Algolia API.
6
+ */
7
+ items: Array<Hit<THit>>;
8
+ };
9
+ export type TrendingItemsConnectorParams<THit extends BaseHit = BaseHit> = ({
10
+ /**
11
+ * The facet attribute to get recommendations for.
12
+ */
13
+ facetName: string;
14
+ /**
15
+ * The facet value to get recommendations for.
16
+ */
17
+ facetValue: string;
18
+ } | {
19
+ facetName?: never;
20
+ facetValue?: never;
21
+ }) & {
22
+ /**
23
+ * The number of recommendations to retrieve.
24
+ */
25
+ limit?: number;
26
+ /**
27
+ * The threshold for the recommendations confidence score (between 0 and 100).
28
+ */
29
+ threshold?: number;
30
+ /**
31
+ * List of search parameters to send.
32
+ */
33
+ fallbackParameters?: Omit<PlainSearchParameters, 'page' | 'hitsPerPage' | 'offset' | 'length'>;
34
+ /**
35
+ * List of search parameters to send.
36
+ */
37
+ queryParameters?: Omit<PlainSearchParameters, 'page' | 'hitsPerPage' | 'offset' | 'length'>;
38
+ /**
39
+ * Whether to escape HTML tags from items string values.
40
+ *
41
+ * @default true
42
+ */
43
+ escapeHTML?: boolean;
44
+ /**
45
+ * Function to transform the items passed to the templates.
46
+ */
47
+ transformItems?: TransformItems<Hit<THit>, {
48
+ results: RecommendResultItem;
49
+ }>;
50
+ };
51
+ export type TrendingItemsWidgetDescription<THit extends BaseHit = BaseHit> = {
52
+ $$type: 'ais.trendingItems';
53
+ renderState: TrendingItemsRenderState<THit>;
54
+ };
55
+ export type TrendingItemsConnector<THit extends BaseHit = BaseHit> = Connector<TrendingItemsWidgetDescription<THit>, TrendingItemsConnectorParams<THit>>;
56
+ declare const connectTrendingItems: TrendingItemsConnector;
57
+ export default connectTrendingItems;
@@ -0,0 +1,83 @@
1
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
+ 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; }
3
+ 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; }
4
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
6
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
7
+ import { createDocumentationMessageGenerator, checkRendering, noop, escapeHits, TAG_PLACEHOLDER } from "../../lib/utils/index.js";
8
+ var withUsage = createDocumentationMessageGenerator({
9
+ name: 'trending-items',
10
+ connector: true
11
+ });
12
+ var connectTrendingItems = function connectTrendingItems(renderFn) {
13
+ var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;
14
+ checkRendering(renderFn, withUsage());
15
+ return function trendingItems(widgetParams) {
16
+ var _ref = widgetParams || {},
17
+ facetName = _ref.facetName,
18
+ facetValue = _ref.facetValue,
19
+ limit = _ref.limit,
20
+ threshold = _ref.threshold,
21
+ fallbackParameters = _ref.fallbackParameters,
22
+ queryParameters = _ref.queryParameters,
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
+ return {
30
+ dependsOn: 'recommend',
31
+ $$type: 'ais.trendingItems',
32
+ init: function init(initOptions) {
33
+ renderFn(_objectSpread(_objectSpread({}, this.getWidgetRenderState(initOptions)), {}, {
34
+ instantSearchInstance: initOptions.instantSearchInstance
35
+ }), true);
36
+ },
37
+ render: function render(renderOptions) {
38
+ var renderState = this.getWidgetRenderState(renderOptions);
39
+ renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
40
+ instantSearchInstance: renderOptions.instantSearchInstance
41
+ }), false);
42
+ },
43
+ getRenderState: function getRenderState(renderState) {
44
+ return renderState;
45
+ },
46
+ getWidgetRenderState: function getWidgetRenderState(_ref2) {
47
+ var results = _ref2.results;
48
+ if (results === null || results === undefined) {
49
+ return {
50
+ items: [],
51
+ widgetParams: widgetParams
52
+ };
53
+ }
54
+ if (escapeHTML && results.hits.length > 0) {
55
+ results.hits = escapeHits(results.hits);
56
+ }
57
+ return {
58
+ items: transformItems(results.hits, {
59
+ results: results
60
+ }),
61
+ widgetParams: widgetParams
62
+ };
63
+ },
64
+ dispose: function dispose(_ref3) {
65
+ var recommendState = _ref3.recommendState;
66
+ unmountFn();
67
+ return recommendState.removeParams(this.$$id);
68
+ },
69
+ getWidgetParameters: function getWidgetParameters(state) {
70
+ return state.removeParams(this.$$id).addTrendingItems({
71
+ facetName: facetName,
72
+ facetValue: facetValue,
73
+ maxRecommendations: limit,
74
+ threshold: threshold,
75
+ fallbackParameters: _objectSpread(_objectSpread({}, fallbackParameters), escapeHTML ? TAG_PLACEHOLDER : {}),
76
+ queryParameters: _objectSpread(_objectSpread({}, queryParameters), escapeHTML ? TAG_PLACEHOLDER : {}),
77
+ $$id: this.$$id
78
+ });
79
+ }
80
+ };
81
+ };
82
+ };
83
+ export default connectTrendingItems;
@@ -145,6 +145,8 @@ declare class InstantSearch<TUiState extends UiState = UiState, TRouteState = TU
145
145
  _createURL: CreateURL<TUiState>;
146
146
  _searchFunction?: InstantSearchOptions['searchFunction'];
147
147
  _mainHelperSearch?: AlgoliaSearchHelper['search'];
148
+ _hasSearchWidget: boolean;
149
+ _hasRecommendWidget: boolean;
148
150
  _insights: InstantSearchOptions['insights'];
149
151
  middleware: Array<{
150
152
  creator: Middleware<TUiState>;
@@ -74,6 +74,8 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
74
74
  _defineProperty(_assertThisInitialized(_this), "_createURL", void 0);
75
75
  _defineProperty(_assertThisInitialized(_this), "_searchFunction", void 0);
76
76
  _defineProperty(_assertThisInitialized(_this), "_mainHelperSearch", void 0);
77
+ _defineProperty(_assertThisInitialized(_this), "_hasSearchWidget", false);
78
+ _defineProperty(_assertThisInitialized(_this), "_hasRecommendWidget", false);
77
79
  _defineProperty(_assertThisInitialized(_this), "_insights", void 0);
78
80
  _defineProperty(_assertThisInitialized(_this), "middleware", []);
79
81
  _defineProperty(_assertThisInitialized(_this), "sendEventToInsights", void 0);
@@ -384,7 +386,13 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
384
386
  // under the hood, we have a different implementation. It should be
385
387
  // completely transparent for the rest of the codebase. Only this module
386
388
  // is impacted.
387
- return mainHelper.searchOnlyWithDerivedHelpers() && mainHelper.recommend();
389
+ if (_this3._hasSearchWidget) {
390
+ mainHelper.searchOnlyWithDerivedHelpers();
391
+ }
392
+ if (_this3._hasRecommendWidget) {
393
+ mainHelper.recommend();
394
+ }
395
+ return mainHelper;
388
396
  };
389
397
  if (this._searchFunction) {
390
398
  // this client isn't used to actually search, but required for the helper
@@ -9,4 +9,4 @@ export declare function renderTemplate({ templates, templateKey, compileOptions,
9
9
  data?: Record<string, any>;
10
10
  bindEvent?: BindEventForHits;
11
11
  sendEvent?: SendEventForHits;
12
- }): string | import("preact").VNode<{}> | import("preact").VNode<{}>[];
12
+ }): string | import("preact").VNode<{}> | import("preact").VNode<{}>[] | null;
@@ -0,0 +1,2 @@
1
+ import type { Widget } from '../../types';
2
+ export declare function addWidgetId(widget: Widget): void;
@@ -0,0 +1,7 @@
1
+ var id = 0;
2
+ export function addWidgetId(widget) {
3
+ if (widget.dependsOn !== 'recommend') {
4
+ return;
5
+ }
6
+ widget.$$id = id++;
7
+ }