instantsearch.js 4.63.1 → 4.64.1

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 (30) hide show
  1. package/cjs/connectors/numeric-menu/connectNumericMenu.js +5 -5
  2. package/cjs/connectors/rating-menu/connectRatingMenu.js +1 -2
  3. package/cjs/connectors/refinement-list/connectRefinementList.js +1 -2
  4. package/cjs/connectors/toggle-refinement/connectToggleRefinement.js +1 -1
  5. package/cjs/lib/InstantSearch.js +2 -6
  6. package/cjs/lib/server.js +27 -4
  7. package/cjs/lib/utils/hydrateSearchClient.js +10 -7
  8. package/cjs/lib/version.js +1 -1
  9. package/cjs/middlewares/createInsightsMiddleware.js +57 -21
  10. package/dist/instantsearch.development.d.ts +4 -6
  11. package/dist/instantsearch.development.js +93 -54
  12. package/dist/instantsearch.development.js.map +1 -1
  13. package/dist/instantsearch.production.d.ts +4 -6
  14. package/dist/instantsearch.production.min.d.ts +4 -6
  15. package/dist/instantsearch.production.min.js +2 -2
  16. package/dist/instantsearch.production.min.js.map +1 -1
  17. package/es/connectors/numeric-menu/connectNumericMenu.js +5 -5
  18. package/es/connectors/rating-menu/connectRatingMenu.js +1 -2
  19. package/es/connectors/refinement-list/connectRefinementList.js +1 -2
  20. package/es/connectors/toggle-refinement/connectToggleRefinement.js +1 -1
  21. package/es/lib/InstantSearch.d.ts +2 -6
  22. package/es/lib/InstantSearch.js +2 -6
  23. package/es/lib/server.d.ts +8 -3
  24. package/es/lib/server.js +27 -4
  25. package/es/lib/utils/hydrateSearchClient.js +10 -7
  26. package/es/lib/version.d.ts +1 -1
  27. package/es/lib/version.js +1 -1
  28. package/es/middlewares/createInsightsMiddleware.js +57 -21
  29. package/es/types/results.d.ts +2 -0
  30. package/package.json +6 -6
@@ -88,7 +88,7 @@ var connectNumericMenu = function connectNumericMenu(renderFn) {
88
88
  dispose: function dispose(_ref4) {
89
89
  var state = _ref4.state;
90
90
  unmountFn();
91
- return state.clearRefinements(attribute);
91
+ return state.removeNumericRefinement(attribute);
92
92
  },
93
93
  getWidgetUiState: function getWidgetUiState(uiState, _ref5) {
94
94
  var searchParameters = _ref5.searchParameters;
@@ -108,11 +108,11 @@ var connectNumericMenu = function connectNumericMenu(renderFn) {
108
108
  getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref6) {
109
109
  var uiState = _ref6.uiState;
110
110
  var value = uiState.numericMenu && uiState.numericMenu[attribute];
111
- var withoutRefinements = searchParameters.clearRefinements(attribute);
111
+ var withoutRefinements = searchParameters.setQueryParameters({
112
+ numericRefinements: _objectSpread(_objectSpread({}, searchParameters.numericRefinements), {}, _defineProperty({}, attribute, {}))
113
+ });
112
114
  if (!value) {
113
- return withoutRefinements.setQueryParameters({
114
- numericRefinements: _objectSpread(_objectSpread({}, withoutRefinements.numericRefinements), {}, _defineProperty({}, attribute, {}))
115
- });
115
+ return withoutRefinements;
116
116
  }
117
117
  var isExact = value.indexOf(':') === -1;
118
118
  if (isExact) {
@@ -269,8 +269,7 @@ var connectRatingMenu = function connectRatingMenu(renderFn) {
269
269
  getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref8) {
270
270
  var uiState = _ref8.uiState;
271
271
  var value = uiState.ratingMenu && uiState.ratingMenu[attribute];
272
- var withoutRefinements = searchParameters.clearRefinements(attribute);
273
- var withDisjunctiveFacet = withoutRefinements.addDisjunctiveFacet(attribute);
272
+ var withDisjunctiveFacet = searchParameters.addDisjunctiveFacet(attribute).removeNumericRefinement(attribute).removeDisjunctiveFacetRefinement(attribute);
274
273
  if (!value) {
275
274
  return withDisjunctiveFacet.setQueryParameters({
276
275
  numericRefinements: _objectSpread(_objectSpread({}, withDisjunctiveFacet.numericRefinements), {}, _defineProperty({}, attribute, {}))
@@ -265,8 +265,7 @@ var connectRefinementList = function connectRefinementList(renderFn) {
265
265
  return searchParameters;
266
266
  }
267
267
  var values = uiState.refinementList && uiState.refinementList[attribute];
268
- var withoutRefinements = searchParameters.clearRefinements(attribute);
269
- var withFacetConfiguration = isDisjunctive ? withoutRefinements.addDisjunctiveFacet(attribute) : withoutRefinements.addFacet(attribute);
268
+ var withFacetConfiguration = isDisjunctive ? searchParameters.addDisjunctiveFacet(attribute).removeDisjunctiveFacetRefinement(attribute) : searchParameters.addFacet(attribute).removeFacetRefinement(attribute);
270
269
  var currentMaxValuesPerFacet = withFacetConfiguration.maxValuesPerFacet || 0;
271
270
  var nextMaxValuesPerFacet = Math.max(currentMaxValuesPerFacet, showMore ? showMoreLimit : limit);
272
271
  var withMaxValuesPerFacet = withFacetConfiguration.setQueryParameter('maxValuesPerFacet', nextMaxValuesPerFacet);
@@ -283,7 +283,7 @@ var connectToggleRefinement = function connectToggleRefinement(renderFn) {
283
283
  process.env.NODE_ENV === 'development' ? (0, _utils.warning)(false, "ToggleRefinement: Attribute \"".concat(attribute, "\" is already used by another widget of a different type.\nAs this is not supported, please make sure to remove this other widget or this ToggleRefinement widget will not work at all.")) : void 0;
284
284
  return searchParameters;
285
285
  }
286
- var withFacetConfiguration = searchParameters.clearRefinements(attribute).addDisjunctiveFacet(attribute);
286
+ var withFacetConfiguration = searchParameters.addDisjunctiveFacet(attribute).removeDisjunctiveFacetRefinement(attribute);
287
287
  var isRefined = Boolean(uiState.toggle && uiState.toggle[attribute]);
288
288
  if (isRefined) {
289
289
  if (on) {
@@ -365,9 +365,7 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
365
365
 
366
366
  /**
367
367
  * Ends the initialization of InstantSearch.js and triggers the
368
- * first search. This method should be called after all widgets have been added
369
- * to the instance of InstantSearch.js. InstantSearch.js also supports adding and removing
370
- * widgets after the start as an **EXPERIMENTAL** feature.
368
+ * first search.
371
369
  */
372
370
  }, {
373
371
  key: "start",
@@ -519,9 +517,7 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
519
517
  }
520
518
 
521
519
  /**
522
- * Removes all widgets without triggering a search afterwards. This is an **EXPERIMENTAL** feature,
523
- * if you find an issue with it, please
524
- * [open an issue](https://github.com/algolia/instantsearch/issues/new?title=Problem%20with%20dispose).
520
+ * Removes all widgets without triggering a search afterwards.
525
521
  * @return {undefined} This method does not return anything
526
522
  */
527
523
  }, {
package/cjs/lib/server.js CHANGED
@@ -18,12 +18,26 @@ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input ==
18
18
  */
19
19
  function waitForResults(search) {
20
20
  var helper = search.mainHelper;
21
+
22
+ // Extract search parameters from the search client to use them
23
+ // later during hydration.
24
+ var requestParamsList;
25
+ var client = helper.getClient();
26
+ helper.setClient({
27
+ search: function search(queries) {
28
+ requestParamsList = queries.map(function (_ref) {
29
+ var params = _ref.params;
30
+ return params;
31
+ });
32
+ return client.search(queries);
33
+ }
34
+ });
21
35
  helper.searchOnlyWithDerivedHelpers();
22
36
  return new Promise(function (resolve, reject) {
23
37
  // All derived helpers resolve in the same tick so we're safe only relying
24
38
  // on the first one.
25
39
  helper.derivedHelpers[0].on('result', function () {
26
- resolve();
40
+ resolve(requestParamsList);
27
41
  });
28
42
 
29
43
  // However, we listen to errors that can happen on any derived helper because
@@ -45,17 +59,26 @@ function waitForResults(search) {
45
59
  /**
46
60
  * Walks the InstantSearch root index to construct the initial results.
47
61
  */
48
- function getInitialResults(rootIndex) {
62
+ function getInitialResults(rootIndex,
63
+ /**
64
+ * Search parameters sent to the search client,
65
+ * returned by `waitForResults()`.
66
+ */
67
+ requestParamsList) {
49
68
  var initialResults = {};
69
+ var requestParamsIndex = 0;
50
70
  (0, _utils.walkIndex)(rootIndex, function (widget) {
51
71
  var searchResults = widget.getResults();
52
72
  if (searchResults) {
53
- initialResults[widget.getIndexId()] = {
73
+ var requestParams = requestParamsList === null || requestParamsList === void 0 ? void 0 : requestParamsList[requestParamsIndex++];
74
+ initialResults[widget.getIndexId()] = _objectSpread({
54
75
  // We convert the Helper state to a plain object to pass parsable data
55
76
  // structures from server to client.
56
77
  state: _objectSpread({}, searchResults._state),
57
78
  results: searchResults._rawResults
58
- };
79
+ }, requestParams && {
80
+ requestParams: requestParams
81
+ });
59
82
  }
60
83
  });
61
84
  if (Object.keys(initialResults).length === 0) {
@@ -29,13 +29,16 @@ function hydrateSearchClient(client, results) {
29
29
  return;
30
30
  }
31
31
  var cachedRequest = Object.keys(results).map(function (key) {
32
- return results[key].results.map(function (result) {
33
- return {
34
- indexName: result.index,
35
- // We normalize the params received from the server as they can
36
- // be serialized differently depending on the engine.
37
- params: serializeQueryParameters(deserializeQueryParameters(result.params))
38
- };
32
+ var _results$key = results[key],
33
+ state = _results$key.state,
34
+ requestParams = _results$key.requestParams,
35
+ serverResults = _results$key.results;
36
+ return serverResults.map(function (result) {
37
+ return _objectSpread({
38
+ indexName: state.index || result.index
39
+ }, requestParams || result.params ? {
40
+ params: serializeQueryParameters(requestParams || deserializeQueryParameters(result.params))
41
+ } : {});
39
42
  });
40
43
  });
41
44
  var cachedResults = Object.keys(results).reduce(function (acc, key) {
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = '4.63.1';
7
+ var _default = '4.64.1';
8
8
  exports.default = _default;
@@ -80,8 +80,11 @@ function createInsightsMiddleware() {
80
80
  // search-insights.js also throws an error so dev-only clarification is sufficient
81
81
  process.env.NODE_ENV === 'development' ? (0, _utils.warning)(Boolean(appId && apiKey), 'could not extract Algolia credentials from searchClient in insights middleware.') : void 0;
82
82
  var queuedUserToken = undefined;
83
+ var queuedAuthenticatedUserToken = undefined;
83
84
  var userTokenBeforeInit = undefined;
84
- if (Array.isArray(insightsClient.queue)) {
85
+ var authenticatedUserTokenBeforeInit = undefined;
86
+ var queue = insightsClient.queue;
87
+ if (Array.isArray(queue)) {
85
88
  // Context: The umd build of search-insights is asynchronously loaded by the snippet.
86
89
  //
87
90
  // When user calls `aa('setUserToken', 'my-user-token')` before `search-insights` is loaded,
@@ -92,22 +95,32 @@ function createInsightsMiddleware() {
92
95
  // At this point, even though `search-insights` is not loaded yet,
93
96
  // we still want to read the token from the queue.
94
97
  // Otherwise, the first search call will be fired without the token.
95
- var _ref3 = (0, _utils.find)(insightsClient.queue.slice().reverse(), function (_ref5) {
96
- var _ref6 = _slicedToArray(_ref5, 1),
97
- method = _ref6[0];
98
- return method === 'setUserToken';
99
- }) || [];
100
- var _ref4 = _slicedToArray(_ref3, 2);
101
- queuedUserToken = _ref4[1];
98
+ var _map = ['setUserToken', 'setAuthenticatedUserToken'].map(function (key) {
99
+ var _ref3 = (0, _utils.find)(queue.slice().reverse(), function (_ref5) {
100
+ var _ref6 = _slicedToArray(_ref5, 1),
101
+ method = _ref6[0];
102
+ return method === key;
103
+ }) || [],
104
+ _ref4 = _slicedToArray(_ref3, 2),
105
+ value = _ref4[1];
106
+ return value;
107
+ });
108
+ var _map2 = _slicedToArray(_map, 2);
109
+ queuedUserToken = _map2[0];
110
+ queuedAuthenticatedUserToken = _map2[1];
102
111
  }
112
+
113
+ // If user called `aa('setUserToken')` or `aa('setAuthenticatedUserToken')`
114
+ // before creating the Insights middleware, we temporarily store the token
115
+ // and set it later on.
116
+ //
117
+ // Otherwise, the `init` call might override them with anonymous user token.
103
118
  insightsClient('getUserToken', null, function (_error, userToken) {
104
- // If user has called `aa('setUserToken', 'my-user-token')` before creating
105
- // the `insights` middleware, we store them temporarily and
106
- // set it later on.
107
- //
108
- // Otherwise, the `init` call might override it with anonymous user token.
109
119
  userTokenBeforeInit = normalizeUserToken(userToken);
110
120
  });
121
+ insightsClient('getAuthenticatedUserToken', null, function (_error, userToken) {
122
+ authenticatedUserTokenBeforeInit = normalizeUserToken(userToken);
123
+ });
111
124
 
112
125
  // Only `init` if the `insightsInitParams` option is passed or
113
126
  // if the `insightsClient` version doesn't supports optional `init` calling.
@@ -189,21 +202,43 @@ function createInsightsMiddleware() {
189
202
  // We can set it as userToken.
190
203
  setUserTokenToSearch(anonymousUserToken, true);
191
204
  }
205
+ function setUserToken(token, userToken, authenticatedUserToken) {
206
+ setUserTokenToSearch(token, true);
207
+ if (userToken) {
208
+ insightsClient('setUserToken', userToken);
209
+ }
210
+ if (authenticatedUserToken) {
211
+ insightsClient('setAuthenticatedUserToken', authenticatedUserToken);
212
+ }
213
+ }
192
214
 
193
- // We consider the `userToken` coming from a `init` call to have a higher
194
- // importance than the one coming from the queue.
195
- if (userTokenBeforeInit) {
196
- setUserTokenToSearch(userTokenBeforeInit, true);
197
- insightsClient('setUserToken', userTokenBeforeInit);
198
- } else if (queuedUserToken) {
199
- setUserTokenToSearch(queuedUserToken, true);
200
- insightsClient('setUserToken', queuedUserToken);
215
+ // We consider the `userToken` or `authenticatedUserToken` before an
216
+ // `init` call of higher importance than one from the queue.
217
+ var tokenBeforeInit = authenticatedUserTokenBeforeInit || userTokenBeforeInit;
218
+ var queuedToken = queuedAuthenticatedUserToken || queuedUserToken;
219
+ if (tokenBeforeInit) {
220
+ setUserToken(tokenBeforeInit, userTokenBeforeInit, authenticatedUserTokenBeforeInit);
221
+ } else if (queuedToken) {
222
+ setUserToken(queuedToken, queuedUserToken, queuedAuthenticatedUserToken);
201
223
  }
202
224
 
203
225
  // This updates userToken which is set explicitly by `aa('setUserToken', userToken)`
204
226
  insightsClient('onUserTokenChange', setUserTokenToSearch, {
205
227
  immediate: true
206
228
  });
229
+
230
+ // This updates userToken which is set explicitly by `aa('setAuthenticatedtUserToken', authenticatedUserToken)`
231
+ insightsClient('onAuthenticatedUserTokenChange', function (authenticatedUserToken) {
232
+ // If we're unsetting the `authenticatedUserToken`, we revert to the `userToken`
233
+ if (!authenticatedUserToken) {
234
+ insightsClient('getUserToken', null, function (_, userToken) {
235
+ setUserTokenToSearch(userToken);
236
+ });
237
+ }
238
+ setUserTokenToSearch(authenticatedUserToken);
239
+ }, {
240
+ immediate: true
241
+ });
207
242
  var insightsClientWithLocalCredentials = insightsClient;
208
243
  if (isModernInsightsClient(insightsClient)) {
209
244
  insightsClientWithLocalCredentials = function insightsClientWithLocalCredentials(method, payload) {
@@ -239,6 +274,7 @@ function createInsightsMiddleware() {
239
274
  },
240
275
  unsubscribe: function unsubscribe() {
241
276
  insightsClient('onUserTokenChange', undefined);
277
+ insightsClient('onAuthenticatedUserTokenChange', undefined);
242
278
  instantSearchInstance.sendEventToInsights = _utils.noop;
243
279
  if (helper && initialParameters) {
244
280
  helper.overrideStateWithoutTriggeringChangeEvent(_objectSpread(_objectSpread({}, helper.state), initialParameters));
@@ -15,6 +15,7 @@ import type * as Places from 'places.js';
15
15
  import type { PlainSearchParameters } from 'algoliasearch-helper';
16
16
  import { default as qs_2 } from 'qs';
17
17
  import { SearchClient } from 'algoliasearch-helper/types/algoliasearch.js';
18
+ import { SearchOptions } from 'algoliasearch-helper/types/algoliasearch.js';
18
19
  import type { SearchParameters } from 'algoliasearch-helper';
19
20
  import type { SearchResults } from 'algoliasearch-helper';
20
21
  import { VNode } from 'preact';
@@ -2310,6 +2311,7 @@ declare type InfiniteHitsWidgetParams = {
2310
2311
  declare type InitialResult = {
2311
2312
  state: PlainSearchParameters;
2312
2313
  results: SearchResults['_rawResults'];
2314
+ requestParams?: SearchOptions;
2313
2315
  };
2314
2316
 
2315
2317
  declare type InitialResults = Record<string, InitialResult>;
@@ -2455,15 +2457,11 @@ declare class InstantSearch<TUiState extends UiState = UiState, TRouteState = TU
2455
2457
  removeWidgets(widgets: Array<Widget | IndexWidget>): this;
2456
2458
  /**
2457
2459
  * Ends the initialization of InstantSearch.js and triggers the
2458
- * first search. This method should be called after all widgets have been added
2459
- * to the instance of InstantSearch.js. InstantSearch.js also supports adding and removing
2460
- * widgets after the start as an **EXPERIMENTAL** feature.
2460
+ * first search.
2461
2461
  */
2462
2462
  start(): void;
2463
2463
  /**
2464
- * Removes all widgets without triggering a search afterwards. This is an **EXPERIMENTAL** feature,
2465
- * if you find an issue with it, please
2466
- * [open an issue](https://github.com/algolia/instantsearch/issues/new?title=Problem%20with%20dispose).
2464
+ * Removes all widgets without triggering a search afterwards.
2467
2465
  * @return {undefined} This method does not return anything
2468
2466
  */
2469
2467
  dispose(): void;
@@ -1,4 +1,4 @@
1
- /*! InstantSearch.js 4.63.1 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch */
1
+ /*! InstantSearch.js 4.64.1 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch */
2
2
  (function (global, factory) {
3
3
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
4
4
  typeof define === 'function' && define.amd ? define(factory) :
@@ -1424,13 +1424,16 @@
1424
1424
  return;
1425
1425
  }
1426
1426
  var cachedRequest = Object.keys(results).map(function (key) {
1427
- return results[key].results.map(function (result) {
1428
- return {
1429
- indexName: result.index,
1430
- // We normalize the params received from the server as they can
1431
- // be serialized differently depending on the engine.
1432
- params: serializeQueryParameters(deserializeQueryParameters(result.params))
1433
- };
1427
+ var _results$key = results[key],
1428
+ state = _results$key.state,
1429
+ requestParams = _results$key.requestParams,
1430
+ serverResults = _results$key.results;
1431
+ return serverResults.map(function (result) {
1432
+ return _objectSpread2({
1433
+ indexName: state.index || result.index
1434
+ }, requestParams || result.params ? {
1435
+ params: serializeQueryParameters(requestParams || deserializeQueryParameters(result.params))
1436
+ } : {});
1434
1437
  });
1435
1438
  });
1436
1439
  var cachedResults = Object.keys(results).reduce(function (acc, key) {
@@ -3588,7 +3591,7 @@
3588
3591
  dispose: function dispose(_ref4) {
3589
3592
  var state = _ref4.state;
3590
3593
  unmountFn();
3591
- return state.clearRefinements(attribute);
3594
+ return state.removeNumericRefinement(attribute);
3592
3595
  },
3593
3596
  getWidgetUiState: function getWidgetUiState(uiState, _ref5) {
3594
3597
  var searchParameters = _ref5.searchParameters;
@@ -3608,11 +3611,11 @@
3608
3611
  getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref6) {
3609
3612
  var uiState = _ref6.uiState;
3610
3613
  var value = uiState.numericMenu && uiState.numericMenu[attribute];
3611
- var withoutRefinements = searchParameters.clearRefinements(attribute);
3614
+ var withoutRefinements = searchParameters.setQueryParameters({
3615
+ numericRefinements: _objectSpread2(_objectSpread2({}, searchParameters.numericRefinements), {}, _defineProperty({}, attribute, {}))
3616
+ });
3612
3617
  if (!value) {
3613
- return withoutRefinements.setQueryParameters({
3614
- numericRefinements: _objectSpread2(_objectSpread2({}, withoutRefinements.numericRefinements), {}, _defineProperty({}, attribute, {}))
3615
- });
3618
+ return withoutRefinements;
3616
3619
  }
3617
3620
  var isExact = value.indexOf(':') === -1;
3618
3621
  if (isExact) {
@@ -4478,8 +4481,7 @@
4478
4481
  return searchParameters;
4479
4482
  }
4480
4483
  var values = uiState.refinementList && uiState.refinementList[attribute];
4481
- var withoutRefinements = searchParameters.clearRefinements(attribute);
4482
- var withFacetConfiguration = isDisjunctive ? withoutRefinements.addDisjunctiveFacet(attribute) : withoutRefinements.addFacet(attribute);
4484
+ var withFacetConfiguration = isDisjunctive ? searchParameters.addDisjunctiveFacet(attribute).removeDisjunctiveFacetRefinement(attribute) : searchParameters.addFacet(attribute).removeFacetRefinement(attribute);
4483
4485
  var currentMaxValuesPerFacet = withFacetConfiguration.maxValuesPerFacet || 0;
4484
4486
  var nextMaxValuesPerFacet = Math.max(currentMaxValuesPerFacet, showMore ? showMoreLimit : limit);
4485
4487
  var withMaxValuesPerFacet = withFacetConfiguration.setQueryParameter('maxValuesPerFacet', nextMaxValuesPerFacet);
@@ -4947,8 +4949,7 @@
4947
4949
  getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref8) {
4948
4950
  var uiState = _ref8.uiState;
4949
4951
  var value = uiState.ratingMenu && uiState.ratingMenu[attribute];
4950
- var withoutRefinements = searchParameters.clearRefinements(attribute);
4951
- var withDisjunctiveFacet = withoutRefinements.addDisjunctiveFacet(attribute);
4952
+ var withDisjunctiveFacet = searchParameters.addDisjunctiveFacet(attribute).removeNumericRefinement(attribute).removeDisjunctiveFacetRefinement(attribute);
4952
4953
  if (!value) {
4953
4954
  return withDisjunctiveFacet.setQueryParameters({
4954
4955
  numericRefinements: _objectSpread2(_objectSpread2({}, withDisjunctiveFacet.numericRefinements), {}, _defineProperty({}, attribute, {}))
@@ -5306,7 +5307,7 @@
5306
5307
  _warning(false, "ToggleRefinement: Attribute \"".concat(attribute, "\" is already used by another widget of a different type.\nAs this is not supported, please make sure to remove this other widget or this ToggleRefinement widget will not work at all.")) ;
5307
5308
  return searchParameters;
5308
5309
  }
5309
- var withFacetConfiguration = searchParameters.clearRefinements(attribute).addDisjunctiveFacet(attribute);
5310
+ var withFacetConfiguration = searchParameters.addDisjunctiveFacet(attribute).removeDisjunctiveFacetRefinement(attribute);
5310
5311
  var isRefined = Boolean(uiState.toggle && uiState.toggle[attribute]);
5311
5312
  if (isRefined) {
5312
5313
  if (on) {
@@ -6521,9 +6522,12 @@
6521
6522
  .sort()
6522
6523
  .forEach(function (facetName) {
6523
6524
  var facetValues = facetsRefinements[facetName] || [];
6524
- facetValues.sort().forEach(function (facetValue) {
6525
- facetFilters.push(facetName + ':' + facetValue);
6526
- });
6525
+ facetValues
6526
+ .slice()
6527
+ .sort()
6528
+ .forEach(function (facetValue) {
6529
+ facetFilters.push(facetName + ':' + facetValue);
6530
+ });
6527
6531
  });
6528
6532
 
6529
6533
  var facetsExcludes = state.facetsExcludes || {};
@@ -6546,9 +6550,12 @@
6546
6550
  }
6547
6551
  var orFilters = [];
6548
6552
 
6549
- facetValues.sort().forEach(function (facetValue) {
6550
- orFilters.push(facetName + ':' + facetValue);
6551
- });
6553
+ facetValues
6554
+ .slice()
6555
+ .sort()
6556
+ .forEach(function (facetValue) {
6557
+ orFilters.push(facetName + ':' + facetValue);
6558
+ });
6552
6559
 
6553
6560
  facetFilters.push(orFilters);
6554
6561
  });
@@ -7214,7 +7221,7 @@
7214
7221
  numbers.numericRefinements = numericRefinements;
7215
7222
  }
7216
7223
 
7217
- return merge_1({}, partialState, numbers);
7224
+ return merge_1(partialState, numbers);
7218
7225
  };
7219
7226
 
7220
7227
  /**
@@ -10086,7 +10093,7 @@
10086
10093
 
10087
10094
  var SearchResults_1 = SearchResults;
10088
10095
 
10089
- var version = '3.16.1';
10096
+ var version = '3.16.2';
10090
10097
 
10091
10098
  var escapeFacetValue$4 = escapeFacetValue_1.escapeFacetValue;
10092
10099
 
@@ -12789,8 +12796,11 @@
12789
12796
  // search-insights.js also throws an error so dev-only clarification is sufficient
12790
12797
  _warning(Boolean(appId && apiKey), 'could not extract Algolia credentials from searchClient in insights middleware.') ;
12791
12798
  var queuedUserToken = undefined;
12799
+ var queuedAuthenticatedUserToken = undefined;
12792
12800
  var userTokenBeforeInit = undefined;
12793
- if (Array.isArray(insightsClient.queue)) {
12801
+ var authenticatedUserTokenBeforeInit = undefined;
12802
+ var queue = insightsClient.queue;
12803
+ if (Array.isArray(queue)) {
12794
12804
  // Context: The umd build of search-insights is asynchronously loaded by the snippet.
12795
12805
  //
12796
12806
  // When user calls `aa('setUserToken', 'my-user-token')` before `search-insights` is loaded,
@@ -12801,22 +12811,32 @@
12801
12811
  // At this point, even though `search-insights` is not loaded yet,
12802
12812
  // we still want to read the token from the queue.
12803
12813
  // Otherwise, the first search call will be fired without the token.
12804
- var _ref3 = find(insightsClient.queue.slice().reverse(), function (_ref5) {
12805
- var _ref6 = _slicedToArray(_ref5, 1),
12806
- method = _ref6[0];
12807
- return method === 'setUserToken';
12808
- }) || [];
12809
- var _ref4 = _slicedToArray(_ref3, 2);
12810
- queuedUserToken = _ref4[1];
12814
+ var _map = ['setUserToken', 'setAuthenticatedUserToken'].map(function (key) {
12815
+ var _ref3 = find(queue.slice().reverse(), function (_ref5) {
12816
+ var _ref6 = _slicedToArray(_ref5, 1),
12817
+ method = _ref6[0];
12818
+ return method === key;
12819
+ }) || [],
12820
+ _ref4 = _slicedToArray(_ref3, 2),
12821
+ value = _ref4[1];
12822
+ return value;
12823
+ });
12824
+ var _map2 = _slicedToArray(_map, 2);
12825
+ queuedUserToken = _map2[0];
12826
+ queuedAuthenticatedUserToken = _map2[1];
12811
12827
  }
12828
+
12829
+ // If user called `aa('setUserToken')` or `aa('setAuthenticatedUserToken')`
12830
+ // before creating the Insights middleware, we temporarily store the token
12831
+ // and set it later on.
12832
+ //
12833
+ // Otherwise, the `init` call might override them with anonymous user token.
12812
12834
  insightsClient('getUserToken', null, function (_error, userToken) {
12813
- // If user has called `aa('setUserToken', 'my-user-token')` before creating
12814
- // the `insights` middleware, we store them temporarily and
12815
- // set it later on.
12816
- //
12817
- // Otherwise, the `init` call might override it with anonymous user token.
12818
12835
  userTokenBeforeInit = normalizeUserToken(userToken);
12819
12836
  });
12837
+ insightsClient('getAuthenticatedUserToken', null, function (_error, userToken) {
12838
+ authenticatedUserTokenBeforeInit = normalizeUserToken(userToken);
12839
+ });
12820
12840
 
12821
12841
  // Only `init` if the `insightsInitParams` option is passed or
12822
12842
  // if the `insightsClient` version doesn't supports optional `init` calling.
@@ -12898,21 +12918,43 @@
12898
12918
  // We can set it as userToken.
12899
12919
  setUserTokenToSearch(anonymousUserToken, true);
12900
12920
  }
12921
+ function setUserToken(token, userToken, authenticatedUserToken) {
12922
+ setUserTokenToSearch(token, true);
12923
+ if (userToken) {
12924
+ insightsClient('setUserToken', userToken);
12925
+ }
12926
+ if (authenticatedUserToken) {
12927
+ insightsClient('setAuthenticatedUserToken', authenticatedUserToken);
12928
+ }
12929
+ }
12901
12930
 
12902
- // We consider the `userToken` coming from a `init` call to have a higher
12903
- // importance than the one coming from the queue.
12904
- if (userTokenBeforeInit) {
12905
- setUserTokenToSearch(userTokenBeforeInit, true);
12906
- insightsClient('setUserToken', userTokenBeforeInit);
12907
- } else if (queuedUserToken) {
12908
- setUserTokenToSearch(queuedUserToken, true);
12909
- insightsClient('setUserToken', queuedUserToken);
12931
+ // We consider the `userToken` or `authenticatedUserToken` before an
12932
+ // `init` call of higher importance than one from the queue.
12933
+ var tokenBeforeInit = authenticatedUserTokenBeforeInit || userTokenBeforeInit;
12934
+ var queuedToken = queuedAuthenticatedUserToken || queuedUserToken;
12935
+ if (tokenBeforeInit) {
12936
+ setUserToken(tokenBeforeInit, userTokenBeforeInit, authenticatedUserTokenBeforeInit);
12937
+ } else if (queuedToken) {
12938
+ setUserToken(queuedToken, queuedUserToken, queuedAuthenticatedUserToken);
12910
12939
  }
12911
12940
 
12912
12941
  // This updates userToken which is set explicitly by `aa('setUserToken', userToken)`
12913
12942
  insightsClient('onUserTokenChange', setUserTokenToSearch, {
12914
12943
  immediate: true
12915
12944
  });
12945
+
12946
+ // This updates userToken which is set explicitly by `aa('setAuthenticatedtUserToken', authenticatedUserToken)`
12947
+ insightsClient('onAuthenticatedUserTokenChange', function (authenticatedUserToken) {
12948
+ // If we're unsetting the `authenticatedUserToken`, we revert to the `userToken`
12949
+ if (!authenticatedUserToken) {
12950
+ insightsClient('getUserToken', null, function (_, userToken) {
12951
+ setUserTokenToSearch(userToken);
12952
+ });
12953
+ }
12954
+ setUserTokenToSearch(authenticatedUserToken);
12955
+ }, {
12956
+ immediate: true
12957
+ });
12916
12958
  var insightsClientWithLocalCredentials = insightsClient;
12917
12959
  if (isModernInsightsClient(insightsClient)) {
12918
12960
  insightsClientWithLocalCredentials = function insightsClientWithLocalCredentials(method, payload) {
@@ -12948,6 +12990,7 @@
12948
12990
  },
12949
12991
  unsubscribe: function unsubscribe() {
12950
12992
  insightsClient('onUserTokenChange', undefined);
12993
+ insightsClient('onAuthenticatedUserTokenChange', undefined);
12951
12994
  instantSearchInstance.sendEventToInsights = noop;
12952
12995
  if (helper && initialParameters) {
12953
12996
  helper.overrideStateWithoutTriggeringChangeEvent(_objectSpread2(_objectSpread2({}, helper.state), initialParameters));
@@ -14847,7 +14890,7 @@
14847
14890
  };
14848
14891
  }
14849
14892
 
14850
- var version$1 = '4.63.1';
14893
+ var version$1 = '4.64.1';
14851
14894
 
14852
14895
  var withUsage$r = createDocumentationMessageGenerator({
14853
14896
  name: 'instantsearch'
@@ -15183,9 +15226,7 @@
15183
15226
 
15184
15227
  /**
15185
15228
  * Ends the initialization of InstantSearch.js and triggers the
15186
- * first search. This method should be called after all widgets have been added
15187
- * to the instance of InstantSearch.js. InstantSearch.js also supports adding and removing
15188
- * widgets after the start as an **EXPERIMENTAL** feature.
15229
+ * first search.
15189
15230
  */
15190
15231
  }, {
15191
15232
  key: "start",
@@ -15337,9 +15378,7 @@
15337
15378
  }
15338
15379
 
15339
15380
  /**
15340
- * Removes all widgets without triggering a search afterwards. This is an **EXPERIMENTAL** feature,
15341
- * if you find an issue with it, please
15342
- * [open an issue](https://github.com/algolia/instantsearch/issues/new?title=Problem%20with%20dispose).
15381
+ * Removes all widgets without triggering a search afterwards.
15343
15382
  * @return {undefined} This method does not return anything
15344
15383
  */
15345
15384
  }, {