instantsearch.js 4.69.0 → 4.71.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 (91) hide show
  1. package/cjs/connectors/frequently-bought-together/connectFrequentlyBoughtTogether.js +1 -2
  2. package/cjs/connectors/geo-search/connectGeoSearch.js +4 -3
  3. package/cjs/connectors/hits/connectHits.js +10 -7
  4. package/cjs/connectors/infinite-hits/connectInfiniteHits.js +7 -8
  5. package/cjs/connectors/looking-similar/connectLookingSimilar.js +2 -3
  6. package/cjs/connectors/related-products/connectRelatedProducts.js +2 -3
  7. package/cjs/connectors/trending-items/connectTrendingItems.js +5 -3
  8. package/cjs/lib/InstantSearch.js +3 -2
  9. package/cjs/lib/server.js +28 -9
  10. package/cjs/lib/utils/addWidgetId.js +4 -0
  11. package/cjs/lib/utils/hydrateRecommendCache.js +23 -0
  12. package/cjs/lib/utils/hydrateSearchClient.js +7 -3
  13. package/cjs/lib/utils/index.js +22 -0
  14. package/cjs/lib/version.js +1 -1
  15. package/cjs/widgets/frequently-bought-together/frequently-bought-together.js +1 -3
  16. package/cjs/widgets/geo-search/geo-search.js +4 -3
  17. package/cjs/widgets/hits/defaultTemplates.js +2 -0
  18. package/cjs/widgets/hits/hits.js +3 -4
  19. package/cjs/widgets/index/index.js +8 -1
  20. package/cjs/widgets/infinite-hits/infinite-hits.js +3 -4
  21. package/cjs/widgets/looking-similar/looking-similar.js +4 -6
  22. package/cjs/widgets/rating-menu/defaultTemplates.js +1 -0
  23. package/cjs/widgets/related-products/related-products.js +1 -3
  24. package/cjs/widgets/trending-items/trending-items.js +1 -3
  25. package/dist/instantsearch.development.d.ts +4306 -237
  26. package/dist/instantsearch.development.js +8572 -8530
  27. package/dist/instantsearch.development.js.map +1 -1
  28. package/dist/instantsearch.production.d.ts +4306 -237
  29. package/dist/instantsearch.production.min.d.ts +4306 -237
  30. package/dist/instantsearch.production.min.js +2 -2
  31. package/dist/instantsearch.production.min.js.map +1 -1
  32. package/es/connectors/frequently-bought-together/connectFrequentlyBoughtTogether.d.ts +311 -7
  33. package/es/connectors/frequently-bought-together/connectFrequentlyBoughtTogether.js +2 -3
  34. package/es/connectors/geo-search/connectGeoSearch.d.ts +218 -8
  35. package/es/connectors/geo-search/connectGeoSearch.js +5 -4
  36. package/es/connectors/hits/connectHits.d.ts +128 -7
  37. package/es/connectors/hits/connectHits.js +11 -8
  38. package/es/connectors/hits/connectHitsWithInsights.d.ts +190 -1
  39. package/es/connectors/infinite-hits/connectInfiniteHits.d.ts +192 -12
  40. package/es/connectors/infinite-hits/connectInfiniteHits.js +8 -9
  41. package/es/connectors/infinite-hits/connectInfiniteHitsWithInsights.d.ts +249 -1
  42. package/es/connectors/looking-similar/connectLookingSimilar.d.ts +303 -7
  43. package/es/connectors/looking-similar/connectLookingSimilar.js +3 -4
  44. package/es/connectors/related-products/connectRelatedProducts.d.ts +303 -7
  45. package/es/connectors/related-products/connectRelatedProducts.js +3 -4
  46. package/es/connectors/trending-items/connectTrendingItems.d.ts +310 -9
  47. package/es/connectors/trending-items/connectTrendingItems.js +7 -5
  48. package/es/lib/InstantSearch.d.ts +1 -2
  49. package/es/lib/InstantSearch.js +3 -2
  50. package/es/lib/server.d.ts +1 -1
  51. package/es/lib/server.js +28 -9
  52. package/es/lib/utils/addWidgetId.d.ts +1 -0
  53. package/es/lib/utils/addWidgetId.js +3 -0
  54. package/es/lib/utils/checkIndexUiState.d.ts +1 -2
  55. package/es/lib/utils/checkRendering.d.ts +1 -1
  56. package/es/lib/utils/getWidgetAttribute.d.ts +1 -2
  57. package/es/lib/utils/hydrateRecommendCache.d.ts +3 -0
  58. package/es/lib/utils/hydrateRecommendCache.js +17 -0
  59. package/es/lib/utils/hydrateSearchClient.js +7 -3
  60. package/es/lib/utils/index.d.ts +2 -0
  61. package/es/lib/utils/index.js +2 -0
  62. package/es/lib/utils/isIndexWidget.d.ts +1 -2
  63. package/es/lib/utils/render-args.d.ts +1 -2
  64. package/es/lib/utils/resolveSearchParameters.d.ts +1 -1
  65. package/es/lib/utils/setIndexHelperState.d.ts +1 -2
  66. package/es/lib/version.d.ts +1 -1
  67. package/es/lib/version.js +1 -1
  68. package/es/types/index.d.ts +0 -1
  69. package/es/types/index.js +1 -4
  70. package/es/types/results.d.ts +11 -6
  71. package/es/types/widget.d.ts +2 -2
  72. package/es/widgets/frequently-bought-together/frequently-bought-together.d.ts +306 -9
  73. package/es/widgets/frequently-bought-together/frequently-bought-together.js +2 -4
  74. package/es/widgets/geo-search/geo-search.d.ts +328 -8
  75. package/es/widgets/geo-search/geo-search.js +5 -4
  76. package/es/widgets/hits/defaultTemplates.d.ts +32 -2
  77. package/es/widgets/hits/defaultTemplates.js +3 -0
  78. package/es/widgets/hits/hits.d.ts +204 -8
  79. package/es/widgets/hits/hits.js +4 -5
  80. package/es/widgets/index/index.js +8 -1
  81. package/es/widgets/index.d.ts +1 -0
  82. package/es/widgets/infinite-hits/infinite-hits.d.ts +262 -9
  83. package/es/widgets/infinite-hits/infinite-hits.js +4 -5
  84. package/es/widgets/looking-similar/looking-similar.d.ts +309 -9
  85. package/es/widgets/looking-similar/looking-similar.js +5 -7
  86. package/es/widgets/rating-menu/defaultTemplates.js +1 -0
  87. package/es/widgets/related-products/related-products.d.ts +306 -9
  88. package/es/widgets/related-products/related-products.js +2 -4
  89. package/es/widgets/trending-items/trending-items.d.ts +310 -9
  90. package/es/widgets/trending-items/trending-items.js +2 -4
  91. package/package.json +6 -6
@@ -1,12 +1,12 @@
1
- import type { Connector, TransformItems, Hit, BaseHit } from '../../types';
1
+ import type { Connector, TransformItems, Hit, BaseHit, Renderer, Unmounter } from '../../types';
2
2
  import type { PlainSearchParameters, RecommendResultItem } from 'algoliasearch-helper';
3
- export type TrendingItemsRenderState<THit extends BaseHit = BaseHit> = {
3
+ export type TrendingItemsRenderState<THit extends NonNullable<object> = BaseHit> = {
4
4
  /**
5
5
  * The matched recommendations from the Algolia API.
6
6
  */
7
7
  items: Array<Hit<THit>>;
8
8
  };
9
- export type TrendingItemsConnectorParams<THit extends BaseHit = BaseHit> = ({
9
+ export type TrendingItemsConnectorParams<THit extends NonNullable<object> = BaseHit> = ({
10
10
  /**
11
11
  * The facet attribute to get recommendations for.
12
12
  */
@@ -16,8 +16,8 @@ export type TrendingItemsConnectorParams<THit extends BaseHit = BaseHit> = ({
16
16
  */
17
17
  facetValue: string;
18
18
  } | {
19
- facetName?: never;
20
- facetValue?: never;
19
+ facetName?: string;
20
+ facetValue?: string;
21
21
  }) & {
22
22
  /**
23
23
  * The number of recommendations to retrieve.
@@ -48,10 +48,311 @@ export type TrendingItemsConnectorParams<THit extends BaseHit = BaseHit> = ({
48
48
  results: RecommendResultItem;
49
49
  }>;
50
50
  };
51
- export type TrendingItemsWidgetDescription<THit extends BaseHit = BaseHit> = {
51
+ export type TrendingItemsWidgetDescription<THit extends NonNullable<object> = BaseHit> = {
52
52
  $$type: 'ais.trendingItems';
53
53
  renderState: TrendingItemsRenderState<THit>;
54
54
  };
55
- export type TrendingItemsConnector<THit extends BaseHit = BaseHit> = Connector<TrendingItemsWidgetDescription<THit>, TrendingItemsConnectorParams<THit>>;
56
- declare const connectTrendingItems: TrendingItemsConnector;
57
- export default connectTrendingItems;
55
+ export type TrendingItemsConnector<THit extends NonNullable<object> = BaseHit> = Connector<TrendingItemsWidgetDescription<THit>, TrendingItemsConnectorParams<THit>>;
56
+ declare const _default: <TWidgetParams extends object>(renderFn: Renderer<TrendingItemsRenderState<BaseHit>, TWidgetParams & TrendingItemsConnectorParams<BaseHit>>, unmountFn?: Unmounter) => <THit extends object = BaseHit>(widgetParams: TWidgetParams & TrendingItemsConnectorParams<THit>) => {
57
+ dependsOn: "recommend";
58
+ $$type: "ais.trendingItems";
59
+ init(initOptions: import("../../types").InitOptions): void;
60
+ render(renderOptions: import("../../types").RenderOptions): void;
61
+ getRenderState(renderState: {
62
+ answers?: import("../../types").WidgetRenderState<import("../answers/connectAnswers").AnswersRenderState, import("../answers/connectAnswers").AnswersConnectorParams> | undefined;
63
+ autocomplete?: import("../../types").WidgetRenderState<import("../autocomplete/connectAutocomplete").AutocompleteRenderState, import("../autocomplete/connectAutocomplete").AutocompleteConnectorParams> | undefined;
64
+ breadcrumb?: {
65
+ [rootAttribute: string]: import("../../types").WidgetRenderState<import("../breadcrumb/connectBreadcrumb").BreadcrumbRenderState, import("../breadcrumb/connectBreadcrumb").BreadcrumbConnectorParams>;
66
+ } | undefined;
67
+ clearRefinements?: import("../../types").WidgetRenderState<import("../clear-refinements/connectClearRefinements").ClearRefinementsRenderState, import("../clear-refinements/connectClearRefinements").ClearRefinementsConnectorParams> | undefined;
68
+ configure?: import("../../types").WidgetRenderState<import("../configure/connectConfigure").ConfigureRenderState, import("../configure/connectConfigure").ConfigureConnectorParams> | undefined;
69
+ currentRefinements?: import("../../types").WidgetRenderState<import("../current-refinements/connectCurrentRefinements").CurrentRefinementsRenderState, import("../current-refinements/connectCurrentRefinements").CurrentRefinementsConnectorParams> | undefined;
70
+ geoSearch?: import("../../types").WidgetRenderState<import("../geo-search/connectGeoSearch").GeoSearchRenderState<import("../../types").GeoHit>, import("../geo-search/connectGeoSearch").GeoSearchConnectorParams<import("../../types").GeoHit>> | undefined;
71
+ hierarchicalMenu?: {
72
+ [rootAttribute: string]: import("../../types").WidgetRenderState<import("../hierarchical-menu/connectHierarchicalMenu").HierarchicalMenuRenderState, import("../hierarchical-menu/connectHierarchicalMenu").HierarchicalMenuConnectorParams>;
73
+ } | undefined;
74
+ hits?: import("../../types").WidgetRenderState<import("../hits/connectHits").HitsRenderState<BaseHit>, import("../hits/connectHits").HitsConnectorParams<BaseHit>> | undefined;
75
+ hitsPerPage?: import("../../types").WidgetRenderState<import("../hits-per-page/connectHitsPerPage").HitsPerPageRenderState, import("../hits-per-page/connectHitsPerPage").HitsPerPageConnectorParams> | undefined;
76
+ infiniteHits?: import("../../types").WidgetRenderState<import("../infinite-hits/connectInfiniteHits").InfiniteHitsRenderState<BaseHit>, import("../infinite-hits/connectInfiniteHits").InfiniteHitsConnectorParams<BaseHit>> | undefined;
77
+ menu?: {
78
+ [attribute: string]: import("../../types").WidgetRenderState<import("../menu/connectMenu").MenuRenderState, import("../menu/connectMenu").MenuConnectorParams>;
79
+ } | undefined;
80
+ numericMenu?: {
81
+ [attribute: string]: import("../../types").WidgetRenderState<import("../numeric-menu/connectNumericMenu").NumericMenuRenderState, import("../numeric-menu/connectNumericMenu").NumericMenuConnectorParams>;
82
+ } | undefined;
83
+ pagination?: import("../../types").WidgetRenderState<import("../pagination/connectPagination").PaginationRenderState, import("../pagination/connectPagination").PaginationConnectorParams> | undefined;
84
+ poweredBy?: import("../../types").WidgetRenderState<import("../powered-by/connectPoweredBy").PoweredByRenderState, import("../powered-by/connectPoweredBy").PoweredByConnectorParams> | undefined;
85
+ queryRules?: import("../../types").WidgetRenderState<import("../query-rules/connectQueryRules").QueryRulesRenderState, import("../query-rules/connectQueryRules").QueryRulesConnectorParams> | undefined;
86
+ range?: {
87
+ [attribute: string]: import("../../types").WidgetRenderState<import("../range/connectRange").RangeRenderState, import("../range/connectRange").RangeConnectorParams>;
88
+ } | undefined;
89
+ ratingMenu?: {
90
+ [attribute: string]: import("../../types").WidgetRenderState<import("../rating-menu/connectRatingMenu").RatingMenuRenderState, import("../rating-menu/connectRatingMenu").RatingMenuConnectorParams>;
91
+ } | undefined;
92
+ refinementList?: {
93
+ [attribute: string]: import("../../types").WidgetRenderState<import("../refinement-list/connectRefinementList").RefinementListRenderState, import("../refinement-list/connectRefinementList").RefinementListConnectorParams>;
94
+ } | undefined;
95
+ relevantSort?: import("../../types").WidgetRenderState<import("../relevant-sort/connectRelevantSort").RelevantSortRenderState, import("../relevant-sort/connectRelevantSort").RelevantSortConnectorParams> | undefined;
96
+ searchBox?: import("../../types").WidgetRenderState<import("../search-box/connectSearchBox").SearchBoxRenderState, import("../search-box/connectSearchBox").SearchBoxConnectorParams> | undefined;
97
+ sortBy?: import("../../types").WidgetRenderState<import("../sort-by/connectSortBy").SortByRenderState, import("../sort-by/connectSortBy").SortByConnectorParams> | undefined;
98
+ stats?: import("../../types").WidgetRenderState<import("../stats/connectStats").StatsRenderState, import("../stats/connectStats").StatsConnectorParams> | undefined;
99
+ toggleRefinement?: {
100
+ [attribute: string]: import("../../types").WidgetRenderState<import("../toggle-refinement/connectToggleRefinement").ToggleRefinementRenderState, import("../toggle-refinement/connectToggleRefinement").ToggleRefinementConnectorParams>;
101
+ } | undefined;
102
+ voiceSearch?: import("../../types").WidgetRenderState<import("../voice-search/connectVoiceSearch").VoiceSearchRenderState, import("../voice-search/connectVoiceSearch").VoiceSearchConnectorParams> | undefined;
103
+ analytics?: import("../../types").WidgetRenderState<Record<string, unknown>, import("../../widgets/analytics/analytics").AnalyticsWidgetParams> | undefined;
104
+ places?: import("../../types").WidgetRenderState<Record<string, unknown>, import("../../widgets/places/places").PlacesWidgetParams> | undefined;
105
+ }): {
106
+ answers?: import("../../types").WidgetRenderState<import("../answers/connectAnswers").AnswersRenderState, import("../answers/connectAnswers").AnswersConnectorParams> | undefined;
107
+ autocomplete?: import("../../types").WidgetRenderState<import("../autocomplete/connectAutocomplete").AutocompleteRenderState, import("../autocomplete/connectAutocomplete").AutocompleteConnectorParams> | undefined;
108
+ breadcrumb?: {
109
+ [rootAttribute: string]: import("../../types").WidgetRenderState<import("../breadcrumb/connectBreadcrumb").BreadcrumbRenderState, import("../breadcrumb/connectBreadcrumb").BreadcrumbConnectorParams>;
110
+ } | undefined;
111
+ clearRefinements?: import("../../types").WidgetRenderState<import("../clear-refinements/connectClearRefinements").ClearRefinementsRenderState, import("../clear-refinements/connectClearRefinements").ClearRefinementsConnectorParams> | undefined;
112
+ configure?: import("../../types").WidgetRenderState<import("../configure/connectConfigure").ConfigureRenderState, import("../configure/connectConfigure").ConfigureConnectorParams> | undefined;
113
+ currentRefinements?: import("../../types").WidgetRenderState<import("../current-refinements/connectCurrentRefinements").CurrentRefinementsRenderState, import("../current-refinements/connectCurrentRefinements").CurrentRefinementsConnectorParams> | undefined;
114
+ geoSearch?: import("../../types").WidgetRenderState<import("../geo-search/connectGeoSearch").GeoSearchRenderState<import("../../types").GeoHit>, import("../geo-search/connectGeoSearch").GeoSearchConnectorParams<import("../../types").GeoHit>> | undefined;
115
+ hierarchicalMenu?: {
116
+ [rootAttribute: string]: import("../../types").WidgetRenderState<import("../hierarchical-menu/connectHierarchicalMenu").HierarchicalMenuRenderState, import("../hierarchical-menu/connectHierarchicalMenu").HierarchicalMenuConnectorParams>;
117
+ } | undefined;
118
+ hits?: import("../../types").WidgetRenderState<import("../hits/connectHits").HitsRenderState<BaseHit>, import("../hits/connectHits").HitsConnectorParams<BaseHit>> | undefined;
119
+ hitsPerPage?: import("../../types").WidgetRenderState<import("../hits-per-page/connectHitsPerPage").HitsPerPageRenderState, import("../hits-per-page/connectHitsPerPage").HitsPerPageConnectorParams> | undefined;
120
+ infiniteHits?: import("../../types").WidgetRenderState<import("../infinite-hits/connectInfiniteHits").InfiniteHitsRenderState<BaseHit>, import("../infinite-hits/connectInfiniteHits").InfiniteHitsConnectorParams<BaseHit>> | undefined;
121
+ menu?: {
122
+ [attribute: string]: import("../../types").WidgetRenderState<import("../menu/connectMenu").MenuRenderState, import("../menu/connectMenu").MenuConnectorParams>;
123
+ } | undefined;
124
+ numericMenu?: {
125
+ [attribute: string]: import("../../types").WidgetRenderState<import("../numeric-menu/connectNumericMenu").NumericMenuRenderState, import("../numeric-menu/connectNumericMenu").NumericMenuConnectorParams>;
126
+ } | undefined;
127
+ pagination?: import("../../types").WidgetRenderState<import("../pagination/connectPagination").PaginationRenderState, import("../pagination/connectPagination").PaginationConnectorParams> | undefined;
128
+ poweredBy?: import("../../types").WidgetRenderState<import("../powered-by/connectPoweredBy").PoweredByRenderState, import("../powered-by/connectPoweredBy").PoweredByConnectorParams> | undefined;
129
+ queryRules?: import("../../types").WidgetRenderState<import("../query-rules/connectQueryRules").QueryRulesRenderState, import("../query-rules/connectQueryRules").QueryRulesConnectorParams> | undefined;
130
+ range?: {
131
+ [attribute: string]: import("../../types").WidgetRenderState<import("../range/connectRange").RangeRenderState, import("../range/connectRange").RangeConnectorParams>;
132
+ } | undefined;
133
+ ratingMenu?: {
134
+ [attribute: string]: import("../../types").WidgetRenderState<import("../rating-menu/connectRatingMenu").RatingMenuRenderState, import("../rating-menu/connectRatingMenu").RatingMenuConnectorParams>;
135
+ } | undefined;
136
+ refinementList?: {
137
+ [attribute: string]: import("../../types").WidgetRenderState<import("../refinement-list/connectRefinementList").RefinementListRenderState, import("../refinement-list/connectRefinementList").RefinementListConnectorParams>;
138
+ } | undefined;
139
+ relevantSort?: import("../../types").WidgetRenderState<import("../relevant-sort/connectRelevantSort").RelevantSortRenderState, import("../relevant-sort/connectRelevantSort").RelevantSortConnectorParams> | undefined;
140
+ searchBox?: import("../../types").WidgetRenderState<import("../search-box/connectSearchBox").SearchBoxRenderState, import("../search-box/connectSearchBox").SearchBoxConnectorParams> | undefined;
141
+ sortBy?: import("../../types").WidgetRenderState<import("../sort-by/connectSortBy").SortByRenderState, import("../sort-by/connectSortBy").SortByConnectorParams> | undefined;
142
+ stats?: import("../../types").WidgetRenderState<import("../stats/connectStats").StatsRenderState, import("../stats/connectStats").StatsConnectorParams> | undefined;
143
+ toggleRefinement?: {
144
+ [attribute: string]: import("../../types").WidgetRenderState<import("../toggle-refinement/connectToggleRefinement").ToggleRefinementRenderState, import("../toggle-refinement/connectToggleRefinement").ToggleRefinementConnectorParams>;
145
+ } | undefined;
146
+ voiceSearch?: import("../../types").WidgetRenderState<import("../voice-search/connectVoiceSearch").VoiceSearchRenderState, import("../voice-search/connectVoiceSearch").VoiceSearchConnectorParams> | undefined;
147
+ analytics?: import("../../types").WidgetRenderState<Record<string, unknown>, import("../../widgets/analytics/analytics").AnalyticsWidgetParams> | undefined;
148
+ places?: import("../../types").WidgetRenderState<Record<string, unknown>, import("../../widgets/places/places").PlacesWidgetParams> | undefined;
149
+ };
150
+ getWidgetRenderState({ results }: import("../../types").InitOptions | import("../../types").RenderOptions | ({
151
+ /**
152
+ * The matched recommendations from the Algolia API.
153
+ */
154
+ instantSearchInstance: import("../../lib/InstantSearch").default<import("../../types").UiState, import("../../types").UiState>;
155
+ parent: import("../../types").IndexWidget;
156
+ templatesConfig: Record<string, unknown>;
157
+ scopedResults: import("../../types").ScopedResult[];
158
+ state: import("algoliasearch-helper").SearchParameters;
159
+ renderState: Partial<{
160
+ answers: import("../../types").WidgetRenderState<import("../answers/connectAnswers").AnswersRenderState, import("../answers/connectAnswers").AnswersConnectorParams>;
161
+ } & {
162
+ autocomplete: import("../../types").WidgetRenderState<import("../autocomplete/connectAutocomplete").AutocompleteRenderState, import("../autocomplete/connectAutocomplete").AutocompleteConnectorParams>;
163
+ } & {
164
+ breadcrumb: {
165
+ [rootAttribute: string]: import("../../types").WidgetRenderState<import("../breadcrumb/connectBreadcrumb").BreadcrumbRenderState, import("../breadcrumb/connectBreadcrumb").BreadcrumbConnectorParams>;
166
+ };
167
+ } & {
168
+ clearRefinements: import("../../types").WidgetRenderState<import("../clear-refinements/connectClearRefinements").ClearRefinementsRenderState, import("../clear-refinements/connectClearRefinements").ClearRefinementsConnectorParams>;
169
+ } & {
170
+ configure: import("../../types").WidgetRenderState<import("../configure/connectConfigure").ConfigureRenderState, import("../configure/connectConfigure").ConfigureConnectorParams>;
171
+ } & {
172
+ currentRefinements: import("../../types").WidgetRenderState<import("../current-refinements/connectCurrentRefinements").CurrentRefinementsRenderState, import("../current-refinements/connectCurrentRefinements").CurrentRefinementsConnectorParams>;
173
+ } & {
174
+ geoSearch: import("../../types").WidgetRenderState<import("../geo-search/connectGeoSearch").GeoSearchRenderState<import("../../types").GeoHit>, import("../geo-search/connectGeoSearch").GeoSearchConnectorParams<import("../../types").GeoHit>>;
175
+ } & {
176
+ hierarchicalMenu: {
177
+ [rootAttribute: string]: import("../../types").WidgetRenderState<import("../hierarchical-menu/connectHierarchicalMenu").HierarchicalMenuRenderState, import("../hierarchical-menu/connectHierarchicalMenu").HierarchicalMenuConnectorParams>;
178
+ };
179
+ } & {
180
+ hits: import("../../types").WidgetRenderState<import("../hits/connectHits").HitsRenderState<BaseHit>, import("../hits/connectHits").HitsConnectorParams<BaseHit>>;
181
+ } & {
182
+ hitsPerPage: import("../../types").WidgetRenderState<import("../hits-per-page/connectHitsPerPage").HitsPerPageRenderState, import("../hits-per-page/connectHitsPerPage").HitsPerPageConnectorParams>;
183
+ } & {
184
+ infiniteHits: import("../../types").WidgetRenderState<import("../infinite-hits/connectInfiniteHits").InfiniteHitsRenderState<BaseHit>, import("../infinite-hits/connectInfiniteHits").InfiniteHitsConnectorParams<BaseHit>>;
185
+ } & {
186
+ menu: {
187
+ [attribute: string]: import("../../types").WidgetRenderState<import("../menu/connectMenu").MenuRenderState, import("../menu/connectMenu").MenuConnectorParams>;
188
+ };
189
+ } & {
190
+ numericMenu: {
191
+ [attribute: string]: import("../../types").WidgetRenderState<import("../numeric-menu/connectNumericMenu").NumericMenuRenderState, import("../numeric-menu/connectNumericMenu").NumericMenuConnectorParams>;
192
+ };
193
+ } & {
194
+ pagination: import("../../types").WidgetRenderState<import("../pagination/connectPagination").PaginationRenderState, import("../pagination/connectPagination").PaginationConnectorParams>;
195
+ } & {
196
+ poweredBy: import("../../types").WidgetRenderState<import("../powered-by/connectPoweredBy").PoweredByRenderState, import("../powered-by/connectPoweredBy").PoweredByConnectorParams>;
197
+ } & {
198
+ queryRules: import("../../types").WidgetRenderState<import("../query-rules/connectQueryRules").QueryRulesRenderState, import("../query-rules/connectQueryRules").QueryRulesConnectorParams>;
199
+ } & {
200
+ range: {
201
+ [attribute: string]: import("../../types").WidgetRenderState<import("../range/connectRange").RangeRenderState, import("../range/connectRange").RangeConnectorParams>;
202
+ };
203
+ } & {
204
+ ratingMenu: {
205
+ [attribute: string]: import("../../types").WidgetRenderState<import("../rating-menu/connectRatingMenu").RatingMenuRenderState, import("../rating-menu/connectRatingMenu").RatingMenuConnectorParams>;
206
+ };
207
+ } & {
208
+ refinementList: {
209
+ [attribute: string]: import("../../types").WidgetRenderState<import("../refinement-list/connectRefinementList").RefinementListRenderState, import("../refinement-list/connectRefinementList").RefinementListConnectorParams>;
210
+ };
211
+ } & {
212
+ relevantSort: import("../../types").WidgetRenderState<import("../relevant-sort/connectRelevantSort").RelevantSortRenderState, import("../relevant-sort/connectRelevantSort").RelevantSortConnectorParams>;
213
+ } & {
214
+ searchBox: import("../../types").WidgetRenderState<import("../search-box/connectSearchBox").SearchBoxRenderState, import("../search-box/connectSearchBox").SearchBoxConnectorParams>;
215
+ } & {
216
+ sortBy: import("../../types").WidgetRenderState<import("../sort-by/connectSortBy").SortByRenderState, import("../sort-by/connectSortBy").SortByConnectorParams>;
217
+ } & {
218
+ stats: import("../../types").WidgetRenderState<import("../stats/connectStats").StatsRenderState, import("../stats/connectStats").StatsConnectorParams>;
219
+ } & {
220
+ toggleRefinement: {
221
+ [attribute: string]: import("../../types").WidgetRenderState<import("../toggle-refinement/connectToggleRefinement").ToggleRefinementRenderState, import("../toggle-refinement/connectToggleRefinement").ToggleRefinementConnectorParams>;
222
+ };
223
+ } & {
224
+ voiceSearch: import("../../types").WidgetRenderState<import("../voice-search/connectVoiceSearch").VoiceSearchRenderState, import("../voice-search/connectVoiceSearch").VoiceSearchConnectorParams>;
225
+ } & {
226
+ analytics: import("../../types").WidgetRenderState<Record<string, unknown>, import("../../widgets/analytics/analytics").AnalyticsWidgetParams>;
227
+ } & {
228
+ places: import("../../types").WidgetRenderState<Record<string, unknown>, import("../../widgets/places/places").PlacesWidgetParams>;
229
+ }>; /**
230
+ * The facet attribute to get recommendations for.
231
+ */
232
+ helper: import("algoliasearch-helper").AlgoliaSearchHelper;
233
+ searchMetadata: {
234
+ isSearchStalled: boolean;
235
+ };
236
+ status: import("../../types").InstantSearchStatus;
237
+ error: Error | undefined;
238
+ createURL: (nextState: import("algoliasearch-helper").SearchParameters | ((state: Partial<{
239
+ query: string;
240
+ } & {
241
+ configure: PlainSearchParameters;
242
+ } & {
243
+ geoSearch: {
244
+ boundingBox: string;
245
+ };
246
+ } & {
247
+ hierarchicalMenu: {
248
+ [rootAttribute: string]: string[];
249
+ };
250
+ } & {
251
+ hitsPerPage: number;
252
+ } & {
253
+ page: number;
254
+ } & {
255
+ menu: {
256
+ [attribute: string]: string;
257
+ };
258
+ } & {
259
+ numericMenu: {
260
+ [attribute: string]: string;
261
+ };
262
+ } & {
263
+ page: number;
264
+ } & {
265
+ range: {
266
+ [attribute: string]: string;
267
+ };
268
+ } & {
269
+ ratingMenu: {
270
+ [attribute: string]: number | undefined;
271
+ };
272
+ } & {
273
+ refinementList: {
274
+ [attribute: string]: string[];
275
+ };
276
+ } & {
277
+ relevantSort: number;
278
+ } & {
279
+ query: string;
280
+ } & {
281
+ sortBy: string;
282
+ } & {
283
+ toggle: {
284
+ [attribute: string]: boolean;
285
+ };
286
+ } & {
287
+ query: string;
288
+ } & {
289
+ places: {
290
+ query: string;
291
+ position: string;
292
+ };
293
+ }>) => Partial<{
294
+ query: string;
295
+ } & {
296
+ configure: PlainSearchParameters;
297
+ } & {
298
+ geoSearch: {
299
+ boundingBox: string;
300
+ };
301
+ } & {
302
+ hierarchicalMenu: {
303
+ [rootAttribute: string]: string[];
304
+ };
305
+ } & {
306
+ hitsPerPage: number;
307
+ } & {
308
+ page: number;
309
+ } & {
310
+ menu: {
311
+ [attribute: string]: string;
312
+ };
313
+ } & {
314
+ numericMenu: {
315
+ [attribute: string]: string;
316
+ };
317
+ } & {
318
+ page: number;
319
+ } & {
320
+ range: {
321
+ [attribute: string]: string;
322
+ };
323
+ } & {
324
+ ratingMenu: {
325
+ [attribute: string]: number | undefined;
326
+ };
327
+ } & {
328
+ refinementList: {
329
+ [attribute: string]: string[];
330
+ };
331
+ } & {
332
+ relevantSort: number;
333
+ } & {
334
+ query: string;
335
+ } & {
336
+ sortBy: string;
337
+ } & {
338
+ toggle: {
339
+ [attribute: string]: boolean;
340
+ };
341
+ } & {
342
+ query: string;
343
+ } & {
344
+ places: {
345
+ query: string;
346
+ position: string;
347
+ };
348
+ }>)) => string;
349
+ } & {
350
+ results: RecommendResultItem;
351
+ })): {
352
+ items: Hit<THit>[];
353
+ widgetParams: TWidgetParams & TrendingItemsConnectorParams<THit>;
354
+ };
355
+ dispose({ recommendState }: import("../../types").DisposeOptions): import("algoliasearch-helper").RecommendParameters;
356
+ getWidgetParameters(state: import("algoliasearch-helper").RecommendParameters): import("algoliasearch-helper").RecommendParameters;
357
+ };
358
+ export default _default;
@@ -4,15 +4,15 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
4
4
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
5
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
6
6
  function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
7
- import { createDocumentationMessageGenerator, checkRendering, noop, escapeHits, TAG_PLACEHOLDER } from "../../lib/utils/index.js";
7
+ import { createDocumentationMessageGenerator, checkRendering, noop, escapeHits, TAG_PLACEHOLDER, getObjectType } from "../../lib/utils/index.js";
8
8
  var withUsage = createDocumentationMessageGenerator({
9
9
  name: 'trending-items',
10
10
  connector: true
11
11
  });
12
- var connectTrendingItems = function connectTrendingItems(renderFn) {
12
+ export default (function connectTrendingItems(renderFn) {
13
13
  var unmountFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;
14
14
  checkRendering(renderFn, withUsage());
15
- return function trendingItems(widgetParams) {
15
+ return function (widgetParams) {
16
16
  var _ref = widgetParams || {},
17
17
  facetName = _ref.facetName,
18
18
  facetValue = _ref.facetValue,
@@ -26,6 +26,9 @@ var connectTrendingItems = function connectTrendingItems(renderFn) {
26
26
  transformItems = _ref$transformItems === void 0 ? function (items) {
27
27
  return items;
28
28
  } : _ref$transformItems;
29
+ if (facetName && !facetValue || !facetName && facetValue) {
30
+ throw new Error(withUsage("When you provide facetName (received type ".concat(getObjectType(facetName), "), you must also provide facetValue (received type ").concat(getObjectType(facetValue), ").")));
31
+ }
29
32
  return {
30
33
  dependsOn: 'recommend',
31
34
  $$type: 'ais.trendingItems',
@@ -79,5 +82,4 @@ var connectTrendingItems = function connectTrendingItems(renderFn) {
79
82
  }
80
83
  };
81
84
  };
82
- };
83
- export default connectTrendingItems;
85
+ });
@@ -1,8 +1,7 @@
1
1
  import EventEmitter from '@algolia/events';
2
2
  import type { InsightsEvent, InsightsProps } from '../middlewares/createInsightsMiddleware';
3
3
  import type { RouterProps } from '../middlewares/createRouterMiddleware';
4
- import type { InsightsClient as AlgoliaInsightsClient, SearchClient, Widget, UiState, CreateURL, Middleware, MiddlewareDefinition, RenderState, InitialResults } from '../types';
5
- import type { IndexWidget } from '../widgets/index/index';
4
+ import type { InsightsClient as AlgoliaInsightsClient, SearchClient, Widget, IndexWidget, UiState, CreateURL, Middleware, MiddlewareDefinition, RenderState, InitialResults } from '../types';
6
5
  import type { AlgoliaSearchHelper } from 'algoliasearch-helper';
7
6
  type NoInfer<T> = T extends infer S ? S : never;
8
7
  /**
@@ -19,9 +19,9 @@ import algoliasearchHelper from 'algoliasearch-helper';
19
19
  import { createInsightsMiddleware } from "../middlewares/createInsightsMiddleware.js";
20
20
  import { createMetadataMiddleware, isMetadataEnabled } from "../middlewares/createMetadataMiddleware.js";
21
21
  import { createRouterMiddleware } from "../middlewares/createRouterMiddleware.js";
22
- import index from "../widgets/index/index.js";
22
+ import { index } from "../widgets/index.js";
23
23
  import createHelpers from "./createHelpers.js";
24
- import { createDocumentationMessageGenerator, createDocumentationLink, defer, hydrateSearchClient, noop, warning, setIndexHelperState, isIndexWidget } from "./utils/index.js";
24
+ import { createDocumentationMessageGenerator, createDocumentationLink, defer, hydrateRecommendCache, hydrateSearchClient, noop, warning, setIndexHelperState, isIndexWidget } from "./utils/index.js";
25
25
  import version from "./version.js";
26
26
  var withUsage = createDocumentationMessageGenerator({
27
27
  name: 'instantsearch'
@@ -459,6 +459,7 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
459
459
  });
460
460
  if (this._initialResults) {
461
461
  hydrateSearchClient(this.client, this._initialResults);
462
+ hydrateRecommendCache(this.mainHelper, this._initialResults);
462
463
  var originalScheduleSearch = this.scheduleSearch;
463
464
  // We don't schedule a first search when initial results are provided
464
465
  // because we already have the results to render. This skips the initial
@@ -3,7 +3,7 @@ import type { IndexWidget, InitialResults, InstantSearch, SearchOptions } from '
3
3
  * Waits for the results from the search instance to coordinate the next steps
4
4
  * in `getServerState()`.
5
5
  */
6
- export declare function waitForResults(search: InstantSearch): Promise<SearchOptions[]>;
6
+ export declare function waitForResults(search: InstantSearch, skipRecommend?: boolean): Promise<SearchOptions[]>;
7
7
  /**
8
8
  * Walks the InstantSearch root index to construct the initial results.
9
9
  */
package/es/lib/server.js CHANGED
@@ -10,13 +10,14 @@ import { walkIndex } from "./utils/index.js";
10
10
  * in `getServerState()`.
11
11
  */
12
12
  export function waitForResults(search) {
13
+ var skipRecommend = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
13
14
  var helper = search.mainHelper;
14
15
 
15
16
  // Extract search parameters from the search client to use them
16
17
  // later during hydration.
17
18
  var requestParamsList;
18
19
  var client = helper.getClient();
19
- helper.setClient({
20
+ helper.setClient(_objectSpread(_objectSpread({}, client), {}, {
20
21
  search: function search(queries) {
21
22
  requestParamsList = queries.map(function (_ref) {
22
23
  var params = _ref.params;
@@ -24,13 +25,25 @@ export function waitForResults(search) {
24
25
  });
25
26
  return client.search(queries);
26
27
  }
27
- });
28
- helper.searchOnlyWithDerivedHelpers();
28
+ }));
29
+ search._hasSearchWidget && helper.searchOnlyWithDerivedHelpers();
30
+ !skipRecommend && search._hasRecommendWidget && helper.recommend();
29
31
  return new Promise(function (resolve, reject) {
32
+ var searchResultsReceived = !search._hasSearchWidget;
33
+ var recommendResultsReceived = !search._hasRecommendWidget || skipRecommend;
30
34
  // All derived helpers resolve in the same tick so we're safe only relying
31
35
  // on the first one.
32
36
  helper.derivedHelpers[0].on('result', function () {
33
- resolve(requestParamsList);
37
+ searchResultsReceived = true;
38
+ if (recommendResultsReceived) {
39
+ resolve(requestParamsList);
40
+ }
41
+ });
42
+ helper.derivedHelpers[0].on('recommend:result', function () {
43
+ recommendResultsReceived = true;
44
+ if (searchResultsReceived) {
45
+ resolve(requestParamsList);
46
+ }
34
47
  });
35
48
 
36
49
  // However, we listen to errors that can happen on any derived helper because
@@ -61,15 +74,21 @@ requestParamsList) {
61
74
  var initialResults = {};
62
75
  var requestParamsIndex = 0;
63
76
  walkIndex(rootIndex, function (widget) {
77
+ var _widget$getHelper;
64
78
  var searchResults = widget.getResults();
65
- if (searchResults) {
79
+ var recommendResults = (_widget$getHelper = widget.getHelper()) === null || _widget$getHelper === void 0 ? void 0 : _widget$getHelper.lastRecommendResults;
80
+ if (searchResults || recommendResults) {
66
81
  var requestParams = requestParamsList === null || requestParamsList === void 0 ? void 0 : requestParamsList[requestParamsIndex++];
67
- initialResults[widget.getIndexId()] = _objectSpread({
68
- // We convert the Helper state to a plain object to pass parsable data
69
- // structures from server to client.
82
+ initialResults[widget.getIndexId()] = _objectSpread(_objectSpread(_objectSpread({}, searchResults && {
70
83
  state: _objectSpread({}, searchResults._state),
71
84
  results: searchResults._rawResults
72
- }, requestParams && {
85
+ }), recommendResults && {
86
+ recommendResults: {
87
+ // We have to stringify + parse because of some explicitly undefined values.
88
+ params: JSON.parse(JSON.stringify(recommendResults._state.params)),
89
+ results: recommendResults._rawResults
90
+ }
91
+ }), requestParams && {
73
92
  requestParams: requestParams
74
93
  });
75
94
  }
@@ -1,2 +1,3 @@
1
1
  import type { Widget } from '../../types';
2
2
  export declare function addWidgetId(widget: Widget): void;
3
+ export declare function resetWidgetId(): void;
@@ -4,4 +4,7 @@ export function addWidgetId(widget) {
4
4
  return;
5
5
  }
6
6
  widget.$$id = id++;
7
+ }
8
+ export function resetWidgetId() {
9
+ id = 0;
7
10
  }
@@ -1,5 +1,4 @@
1
- import type { IndexUiState } from '../../types';
2
- import type { IndexWidget } from '../../widgets/index/index';
1
+ import type { IndexUiState, IndexWidget } from '../../types';
3
2
  type CheckIndexUiStateParams = {
4
3
  index: IndexWidget;
5
4
  indexUiState: IndexUiState;
@@ -1,2 +1,2 @@
1
1
  import type { Renderer } from '../../types/connector';
2
- export declare function checkRendering<TRenderOptions, TWidgetParams>(rendering: Renderer<TRenderOptions, TWidgetParams>, usage: string): void;
2
+ export declare function checkRendering(rendering: any, usage: string): asserts rendering is Renderer<any, any>;
@@ -1,3 +1,2 @@
1
- import type { InitOptions, Widget } from '../../types';
2
- import type { IndexWidget } from '../../widgets/index/index';
1
+ import type { InitOptions, Widget, IndexWidget } from '../../types';
3
2
  export declare function getWidgetAttribute(widget: Widget | IndexWidget, initOptions: InitOptions): string;
@@ -0,0 +1,3 @@
1
+ import type { InitialResults } from '../../types';
2
+ import type { AlgoliaSearchHelper } from 'algoliasearch-helper';
3
+ export declare function hydrateRecommendCache(helper: AlgoliaSearchHelper, initialResults: InitialResults): void;
@@ -0,0 +1,17 @@
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
+ export function hydrateRecommendCache(helper, initialResults) {
8
+ var recommendCache = Object.keys(initialResults).reduce(function (acc, indexName) {
9
+ var initialResult = initialResults[indexName];
10
+ if (initialResult.recommendResults) {
11
+ // @MAJOR: Use `Object.assign` instead of spread operator
12
+ return _objectSpread(_objectSpread({}, acc), initialResult.recommendResults.results);
13
+ }
14
+ return acc;
15
+ }, {});
16
+ helper._recommendCache = recommendCache;
17
+ }
@@ -27,16 +27,20 @@ export function hydrateSearchClient(client, results) {
27
27
  state = _results$key.state,
28
28
  requestParams = _results$key.requestParams,
29
29
  serverResults = _results$key.results;
30
- return serverResults.map(function (result) {
30
+ return serverResults && state ? serverResults.map(function (result) {
31
31
  return _objectSpread({
32
32
  indexName: state.index || result.index
33
33
  }, requestParams || result.params ? {
34
34
  params: serializeQueryParameters(requestParams || deserializeQueryParameters(result.params))
35
35
  } : {});
36
- });
36
+ }) : [];
37
37
  });
38
38
  var cachedResults = Object.keys(results).reduce(function (acc, key) {
39
- return acc.concat(results[key].results);
39
+ var res = results[key].results;
40
+ if (!res) {
41
+ return acc;
42
+ }
43
+ return acc.concat(res);
40
44
  }, []);
41
45
 
42
46
  // Algoliasearch API Client >= v4
@@ -1,3 +1,4 @@
1
+ export * from './addWidgetId';
1
2
  export * from './capitalize';
2
3
  export * from './checkIndexUiState';
3
4
  export * from './checkRendering';
@@ -27,6 +28,7 @@ export * from './getRefinements';
27
28
  export * from './getWidgetAttribute';
28
29
  export * from './hits-absolute-position';
29
30
  export * from './hits-query-id';
31
+ export * from './hydrateRecommendCache';
30
32
  export * from './hydrateSearchClient';
31
33
  export * from './isDomElement';
32
34
  export * from './isEqual';
@@ -1,3 +1,4 @@
1
+ export * from "./addWidgetId.js";
1
2
  export * from "./capitalize.js";
2
3
  export * from "./checkIndexUiState.js";
3
4
  export * from "./checkRendering.js";
@@ -27,6 +28,7 @@ export * from "./getRefinements.js";
27
28
  export * from "./getWidgetAttribute.js";
28
29
  export * from "./hits-absolute-position.js";
29
30
  export * from "./hits-query-id.js";
31
+ export * from "./hydrateRecommendCache.js";
30
32
  export * from "./hydrateSearchClient.js";
31
33
  export * from "./isDomElement.js";
32
34
  export * from "./isEqual.js";
@@ -1,3 +1,2 @@
1
- import type { Widget } from '../../types';
2
- import type { IndexWidget } from '../../widgets/index/index';
1
+ import type { Widget, IndexWidget } from '../../types';
3
2
  export declare function isIndexWidget(widget: Widget | IndexWidget): widget is IndexWidget;
@@ -1,5 +1,4 @@
1
- import type { InstantSearch, UiState, Widget } from '../../types';
2
- import type { IndexWidget } from '../../widgets/index/index';
1
+ import type { InstantSearch, UiState, Widget, IndexWidget } from '../../types';
3
2
  export declare function createInitArgs(instantSearchInstance: InstantSearch, parent: IndexWidget, uiState: UiState): {
4
3
  uiState: UiState;
5
4
  helper: import("algoliasearch-helper").AlgoliaSearchHelper;