react-instantsearch-core 6.40.3 → 7.0.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 (263) hide show
  1. package/README.md +70 -2
  2. package/dist/cjs/components/Configure.js +13 -0
  3. package/dist/cjs/components/DynamicWidgets.js +63 -0
  4. package/dist/cjs/components/Index.js +24 -0
  5. package/dist/cjs/components/InstantSearch.js +27 -0
  6. package/dist/cjs/{connectors/connectConfigure.js → components/InstantSearchSSRProvider.js} +27 -63
  7. package/dist/cjs/components/InstantSearchServerContext.js +12 -0
  8. package/dist/cjs/connectors/useBreadcrumb.js +12 -0
  9. package/dist/cjs/connectors/useClearRefinements.js +12 -0
  10. package/dist/cjs/connectors/useConfigure.js +14 -0
  11. package/dist/cjs/connectors/useCurrentRefinements.js +12 -0
  12. package/dist/cjs/connectors/useDynamicWidgets.js +22 -0
  13. package/dist/cjs/connectors/useGeoSearch.js +12 -0
  14. package/dist/cjs/connectors/useHierarchicalMenu.js +12 -0
  15. package/dist/cjs/connectors/useHits.js +12 -0
  16. package/dist/cjs/connectors/useHitsPerPage.js +12 -0
  17. package/dist/cjs/connectors/useInfiniteHits.js +12 -0
  18. package/dist/cjs/connectors/useMenu.js +12 -0
  19. package/dist/cjs/connectors/useNumericMenu.js +12 -0
  20. package/dist/cjs/connectors/usePagination.js +12 -0
  21. package/dist/cjs/connectors/usePoweredBy.js +21 -0
  22. package/dist/cjs/connectors/useQueryRules.js +12 -0
  23. package/dist/cjs/connectors/useRange.js +12 -0
  24. package/dist/cjs/connectors/useRefinementList.js +12 -0
  25. package/dist/cjs/connectors/useSearchBox.js +12 -0
  26. package/dist/cjs/connectors/useSortBy.js +12 -0
  27. package/dist/cjs/connectors/useStats.js +12 -0
  28. package/dist/cjs/connectors/useToggleRefinement.js +12 -0
  29. package/dist/cjs/hooks/useConnector.js +136 -0
  30. package/dist/cjs/hooks/useInstantSearch.js +58 -0
  31. package/dist/cjs/index.js +328 -320
  32. package/dist/cjs/lib/IndexContext.js +12 -0
  33. package/dist/cjs/lib/InstantSearchContext.js +12 -0
  34. package/dist/cjs/lib/InstantSearchSSRContext.js +12 -0
  35. package/dist/cjs/lib/createSearchResults.js +27 -0
  36. package/dist/cjs/lib/dequal.js +53 -0
  37. package/dist/cjs/lib/getIndexSearchResults.js +32 -0
  38. package/dist/cjs/lib/invariant.js +25 -0
  39. package/dist/cjs/lib/noop.js +8 -0
  40. package/dist/cjs/lib/useForceUpdate.js +25 -0
  41. package/dist/cjs/lib/useIndex.js +38 -0
  42. package/dist/cjs/lib/useIndexContext.js +14 -0
  43. package/dist/cjs/lib/useInstantSearchApi.js +191 -0
  44. package/dist/cjs/lib/useInstantSearchContext.js +14 -0
  45. package/dist/cjs/lib/useInstantSearchSSRContext.js +11 -0
  46. package/dist/cjs/lib/useInstantSearchServerContext.js +11 -0
  47. package/dist/cjs/lib/useIsomorphicLayoutEffect.js +14 -0
  48. package/dist/cjs/lib/useSearchResults.js +46 -0
  49. package/dist/cjs/lib/useSearchState.js +48 -0
  50. package/dist/cjs/lib/useStableValue.js +26 -0
  51. package/dist/cjs/lib/useWidget.js +78 -0
  52. package/dist/cjs/lib/warn.js +41 -0
  53. package/dist/cjs/package.json +1 -0
  54. package/dist/cjs/server/getServerState.js +93 -0
  55. package/dist/cjs/{types → server}/index.js +4 -4
  56. package/dist/cjs/{core/version.js → version.js} +1 -1
  57. package/dist/es/components/Configure.d.ts +3 -0
  58. package/dist/es/components/Configure.js +7 -0
  59. package/dist/es/components/DynamicWidgets.d.ts +13 -0
  60. package/dist/es/components/DynamicWidgets.js +55 -0
  61. package/dist/es/components/Index.d.ts +6 -0
  62. package/dist/es/components/Index.js +17 -0
  63. package/dist/es/components/InstantSearch.d.ts +7 -0
  64. package/dist/es/components/InstantSearch.js +20 -0
  65. package/dist/es/components/InstantSearchSSRProvider.d.ts +13 -0
  66. package/dist/es/{connectors/connectConfigure.js → components/InstantSearchSSRProvider.js} +26 -61
  67. package/dist/es/components/InstantSearchServerContext.d.ts +12 -0
  68. package/dist/es/components/InstantSearchServerContext.js +5 -0
  69. package/dist/es/connectors/useBreadcrumb.d.ts +4 -0
  70. package/dist/es/connectors/useBreadcrumb.js +5 -0
  71. package/dist/es/connectors/useClearRefinements.d.ts +4 -0
  72. package/dist/es/connectors/useClearRefinements.js +5 -0
  73. package/dist/es/connectors/useConfigure.d.ts +4 -0
  74. package/dist/es/connectors/useConfigure.js +7 -0
  75. package/dist/es/connectors/useCurrentRefinements.d.ts +4 -0
  76. package/dist/es/connectors/useCurrentRefinements.js +5 -0
  77. package/dist/es/connectors/useDynamicWidgets.d.ts +4 -0
  78. package/dist/es/connectors/useDynamicWidgets.js +15 -0
  79. package/dist/es/connectors/useGeoSearch.d.ts +6 -0
  80. package/dist/es/connectors/useGeoSearch.js +5 -0
  81. package/dist/es/connectors/useHierarchicalMenu.d.ts +4 -0
  82. package/dist/es/connectors/useHierarchicalMenu.js +5 -0
  83. package/dist/es/connectors/useHits.d.ts +5 -0
  84. package/dist/es/connectors/useHits.js +5 -0
  85. package/dist/es/connectors/useHitsPerPage.d.ts +4 -0
  86. package/dist/es/connectors/useHitsPerPage.js +5 -0
  87. package/dist/es/connectors/useInfiniteHits.d.ts +5 -0
  88. package/dist/es/connectors/useInfiniteHits.js +5 -0
  89. package/dist/es/connectors/useMenu.d.ts +4 -0
  90. package/dist/es/connectors/useMenu.js +5 -0
  91. package/dist/es/connectors/useNumericMenu.d.ts +4 -0
  92. package/dist/es/connectors/useNumericMenu.js +5 -0
  93. package/dist/es/connectors/usePagination.d.ts +4 -0
  94. package/dist/es/connectors/usePagination.js +5 -0
  95. package/dist/es/connectors/usePoweredBy.d.ts +2 -0
  96. package/dist/es/connectors/usePoweredBy.js +15 -0
  97. package/dist/es/connectors/useQueryRules.d.ts +4 -0
  98. package/dist/es/connectors/useQueryRules.js +5 -0
  99. package/dist/es/connectors/useRange.d.ts +4 -0
  100. package/dist/es/connectors/useRange.js +5 -0
  101. package/dist/es/connectors/useRefinementList.d.ts +4 -0
  102. package/dist/es/connectors/useRefinementList.js +5 -0
  103. package/dist/es/connectors/useSearchBox.d.ts +4 -0
  104. package/dist/es/connectors/useSearchBox.js +5 -0
  105. package/dist/es/connectors/useSortBy.d.ts +4 -0
  106. package/dist/es/connectors/useSortBy.js +5 -0
  107. package/dist/es/connectors/useStats.d.ts +4 -0
  108. package/dist/es/connectors/useStats.js +5 -0
  109. package/dist/es/connectors/useToggleRefinement.d.ts +4 -0
  110. package/dist/es/connectors/useToggleRefinement.js +5 -0
  111. package/dist/es/hooks/useConnector.d.ts +3 -0
  112. package/dist/es/hooks/useConnector.js +130 -0
  113. package/dist/es/hooks/useInstantSearch.d.ts +32 -0
  114. package/dist/es/hooks/useInstantSearch.js +52 -0
  115. package/dist/es/index.d.ts +31 -0
  116. package/dist/es/index.js +31 -86
  117. package/dist/es/lib/IndexContext.d.ts +3 -0
  118. package/dist/es/lib/IndexContext.js +5 -0
  119. package/dist/es/lib/InstantSearchContext.d.ts +3 -0
  120. package/dist/es/lib/InstantSearchContext.js +5 -0
  121. package/dist/es/lib/InstantSearchSSRContext.d.ts +8 -0
  122. package/dist/es/lib/InstantSearchSSRContext.js +5 -0
  123. package/dist/es/lib/createSearchResults.d.ts +3 -0
  124. package/dist/es/lib/createSearchResults.js +20 -0
  125. package/dist/es/lib/dequal.d.ts +1 -0
  126. package/dist/es/lib/dequal.js +47 -0
  127. package/dist/es/lib/getIndexSearchResults.d.ts +9 -0
  128. package/dist/es/lib/getIndexSearchResults.js +26 -0
  129. package/dist/es/lib/invariant.d.ts +9 -0
  130. package/dist/es/lib/invariant.js +19 -0
  131. package/dist/es/lib/noop.d.ts +1 -0
  132. package/dist/es/lib/noop.js +1 -0
  133. package/dist/es/lib/useForceUpdate.d.ts +6 -0
  134. package/dist/es/lib/useForceUpdate.js +20 -0
  135. package/dist/es/lib/useIndex.d.ts +3 -0
  136. package/dist/es/lib/useIndex.js +31 -0
  137. package/dist/es/lib/useIndexContext.d.ts +2 -0
  138. package/dist/es/lib/useIndexContext.js +8 -0
  139. package/dist/es/lib/useInstantSearchApi.d.ts +21 -0
  140. package/dist/es/lib/useInstantSearchApi.js +184 -0
  141. package/dist/es/lib/useInstantSearchContext.d.ts +3 -0
  142. package/dist/es/lib/useInstantSearchContext.js +8 -0
  143. package/dist/es/lib/useInstantSearchSSRContext.d.ts +3 -0
  144. package/dist/es/lib/useInstantSearchSSRContext.js +5 -0
  145. package/dist/es/lib/useInstantSearchServerContext.d.ts +3 -0
  146. package/dist/es/lib/useInstantSearchServerContext.js +5 -0
  147. package/dist/es/lib/useIsomorphicLayoutEffect.d.ts +7 -0
  148. package/dist/es/lib/useIsomorphicLayoutEffect.js +8 -0
  149. package/dist/es/lib/useSearchResults.d.ts +7 -0
  150. package/dist/es/lib/useSearchResults.js +40 -0
  151. package/dist/es/lib/useSearchState.d.ts +8 -0
  152. package/dist/es/lib/useSearchState.js +42 -0
  153. package/dist/es/lib/useStableValue.d.ts +1 -0
  154. package/dist/es/lib/useStableValue.js +20 -0
  155. package/dist/es/lib/useWidget.d.ts +8 -0
  156. package/dist/es/lib/useWidget.js +72 -0
  157. package/dist/es/lib/warn.d.ts +10 -0
  158. package/dist/es/lib/warn.js +33 -0
  159. package/dist/es/server/getServerState.d.ts +10 -0
  160. package/dist/es/server/getServerState.js +86 -0
  161. package/dist/es/server/index.d.ts +1 -0
  162. package/dist/es/server/index.js +1 -0
  163. package/dist/es/version.d.ts +2 -0
  164. package/dist/es/version.js +1 -0
  165. package/dist/umd/ReactInstantSearchCore.js +16316 -10183
  166. package/dist/umd/ReactInstantSearchCore.js.map +1 -1
  167. package/dist/umd/ReactInstantSearchCore.min.js +1 -1
  168. package/dist/umd/ReactInstantSearchCore.min.js.map +1 -1
  169. package/package.json +24 -9
  170. package/dist/cjs/connectors/connectAutoComplete.js +0 -104
  171. package/dist/cjs/connectors/connectBreadcrumb.js +0 -123
  172. package/dist/cjs/connectors/connectConfigureRelatedItems.js +0 -127
  173. package/dist/cjs/connectors/connectCurrentRefinements.js +0 -69
  174. package/dist/cjs/connectors/connectDynamicWidgets.js +0 -65
  175. package/dist/cjs/connectors/connectGeoSearch.js +0 -189
  176. package/dist/cjs/connectors/connectHierarchicalMenu.js +0 -273
  177. package/dist/cjs/connectors/connectHighlight.js +0 -87
  178. package/dist/cjs/connectors/connectHitInsights.js +0 -76
  179. package/dist/cjs/connectors/connectHits.js +0 -88
  180. package/dist/cjs/connectors/connectHitsPerPage.js +0 -97
  181. package/dist/cjs/connectors/connectInfiniteHits.js +0 -154
  182. package/dist/cjs/connectors/connectMenu.js +0 -221
  183. package/dist/cjs/connectors/connectNumericMenu.js +0 -215
  184. package/dist/cjs/connectors/connectPagination.js +0 -94
  185. package/dist/cjs/connectors/connectPoweredBy.js +0 -27
  186. package/dist/cjs/connectors/connectQueryRules.js +0 -129
  187. package/dist/cjs/connectors/connectRange.js +0 -287
  188. package/dist/cjs/connectors/connectRefinementList.js +0 -243
  189. package/dist/cjs/connectors/connectRelevantSort.js +0 -56
  190. package/dist/cjs/connectors/connectScrollTo.js +0 -70
  191. package/dist/cjs/connectors/connectSearchBox.js +0 -104
  192. package/dist/cjs/connectors/connectSortBy.js +0 -100
  193. package/dist/cjs/connectors/connectStateResults.js +0 -79
  194. package/dist/cjs/connectors/connectStats.js +0 -39
  195. package/dist/cjs/connectors/connectToggleRefinement.js +0 -163
  196. package/dist/cjs/connectors/connectVoiceSearch.js +0 -124
  197. package/dist/cjs/core/context.js +0 -37
  198. package/dist/cjs/core/createConnector.js +0 -268
  199. package/dist/cjs/core/createInstantSearchManager.d.js +0 -1
  200. package/dist/cjs/core/createInstantSearchManager.js +0 -541
  201. package/dist/cjs/core/createStore.js +0 -27
  202. package/dist/cjs/core/createWidgetsManager.js +0 -39
  203. package/dist/cjs/core/highlight.js +0 -102
  204. package/dist/cjs/core/indexUtils.js +0 -214
  205. package/dist/cjs/core/metadata.js +0 -46
  206. package/dist/cjs/core/translatable.js +0 -82
  207. package/dist/cjs/core/utils.js +0 -161
  208. package/dist/cjs/types/algoliasearch.js +0 -1
  209. package/dist/cjs/types/translatable.js +0 -1
  210. package/dist/cjs/widgets/Configure.js +0 -48
  211. package/dist/cjs/widgets/ConfigureRelatedItems.js +0 -21
  212. package/dist/cjs/widgets/DynamicWidgets.js +0 -61
  213. package/dist/cjs/widgets/Index.js +0 -149
  214. package/dist/cjs/widgets/InstantSearch.js +0 -251
  215. package/dist/cjs/widgets/QueryRuleContext.js +0 -14
  216. package/dist/es/connectors/connectAutoComplete.js +0 -96
  217. package/dist/es/connectors/connectBreadcrumb.js +0 -115
  218. package/dist/es/connectors/connectConfigureRelatedItems.js +0 -121
  219. package/dist/es/connectors/connectCurrentRefinements.js +0 -62
  220. package/dist/es/connectors/connectDynamicWidgets.js +0 -56
  221. package/dist/es/connectors/connectGeoSearch.js +0 -182
  222. package/dist/es/connectors/connectHierarchicalMenu.js +0 -264
  223. package/dist/es/connectors/connectHighlight.js +0 -79
  224. package/dist/es/connectors/connectHitInsights.js +0 -69
  225. package/dist/es/connectors/connectHits.js +0 -81
  226. package/dist/es/connectors/connectHitsPerPage.js +0 -89
  227. package/dist/es/connectors/connectInfiniteHits.js +0 -146
  228. package/dist/es/connectors/connectMenu.js +0 -213
  229. package/dist/es/connectors/connectNumericMenu.js +0 -207
  230. package/dist/es/connectors/connectPagination.js +0 -86
  231. package/dist/es/connectors/connectPoweredBy.js +0 -20
  232. package/dist/es/connectors/connectQueryRules.js +0 -122
  233. package/dist/es/connectors/connectRange.js +0 -280
  234. package/dist/es/connectors/connectRefinementList.js +0 -235
  235. package/dist/es/connectors/connectRelevantSort.js +0 -50
  236. package/dist/es/connectors/connectScrollTo.js +0 -63
  237. package/dist/es/connectors/connectSearchBox.js +0 -96
  238. package/dist/es/connectors/connectSortBy.js +0 -92
  239. package/dist/es/connectors/connectStateResults.js +0 -72
  240. package/dist/es/connectors/connectStats.js +0 -32
  241. package/dist/es/connectors/connectToggleRefinement.js +0 -155
  242. package/dist/es/connectors/connectVoiceSearch.js +0 -116
  243. package/dist/es/core/context.js +0 -28
  244. package/dist/es/core/createConnector.js +0 -257
  245. package/dist/es/core/createInstantSearchManager.d.js +0 -0
  246. package/dist/es/core/createInstantSearchManager.js +0 -534
  247. package/dist/es/core/createStore.js +0 -21
  248. package/dist/es/core/createWidgetsManager.js +0 -33
  249. package/dist/es/core/highlight.js +0 -94
  250. package/dist/es/core/indexUtils.js +0 -203
  251. package/dist/es/core/metadata.js +0 -38
  252. package/dist/es/core/translatable.js +0 -74
  253. package/dist/es/core/utils.js +0 -139
  254. package/dist/es/core/version.js +0 -1
  255. package/dist/es/types/algoliasearch.js +0 -1
  256. package/dist/es/types/index.js +0 -1
  257. package/dist/es/types/translatable.js +0 -1
  258. package/dist/es/widgets/Configure.js +0 -42
  259. package/dist/es/widgets/ConfigureRelatedItems.js +0 -13
  260. package/dist/es/widgets/DynamicWidgets.js +0 -51
  261. package/dist/es/widgets/Index.js +0 -138
  262. package/dist/es/widgets/InstantSearch.js +0 -241
  263. package/dist/es/widgets/QueryRuleContext.js +0 -6
@@ -1,541 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = createInstantSearchManager;
7
- var _algoliasearchHelper = _interopRequireDefault(require("algoliasearch-helper"));
8
- var _createWidgetsManager = _interopRequireDefault(require("./createWidgetsManager"));
9
- var _createStore = _interopRequireDefault(require("./createStore"));
10
- var _highlight = require("./highlight");
11
- var _indexUtils = require("./indexUtils");
12
- var _react = require("react");
13
- var _version = _interopRequireDefault(require("./version"));
14
- var _excluded = ["resultsFacetValues"],
15
- _excluded2 = ["resultsFacetValues"],
16
- _excluded3 = ["resultsFacetValues"];
17
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
- 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); }
19
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
20
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
21
- 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; }
22
- 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; }
23
- 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; }
24
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
25
- 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); }
26
- function addAlgoliaAgents(searchClient) {
27
- if (typeof searchClient.addAlgoliaAgent === 'function') {
28
- searchClient.addAlgoliaAgent("react (".concat(_react.version, ")"));
29
- searchClient.addAlgoliaAgent("react-instantsearch (".concat(_version.default, ")"));
30
- }
31
- }
32
- var isMultiIndexContext = function isMultiIndexContext(widget) {
33
- return (0, _indexUtils.hasMultipleIndices)({
34
- ais: widget.props.contextValue,
35
- multiIndexContext: widget.props.indexContextValue
36
- });
37
- };
38
- var isTargetedIndexEqualIndex = function isTargetedIndexEqualIndex(widget, indexId) {
39
- return widget.props.indexContextValue.targetedIndex === indexId;
40
- };
41
-
42
- // Relying on the `indexId` is a bit brittle to detect the `Index` widget.
43
- // Since it's a class we could rely on `instanceof` or similar. We never
44
- // had an issue though. Works for now.
45
- var isIndexWidget = function isIndexWidget(widget) {
46
- return Boolean(widget.props.indexId);
47
- };
48
- var isIndexWidgetEqualIndex = function isIndexWidgetEqualIndex(widget, indexId) {
49
- return widget.props.indexId === indexId;
50
- };
51
- var sortIndexWidgetsFirst = function sortIndexWidgetsFirst(firstWidget, secondWidget) {
52
- var isFirstWidgetIndex = isIndexWidget(firstWidget);
53
- var isSecondWidgetIndex = isIndexWidget(secondWidget);
54
- if (isFirstWidgetIndex && !isSecondWidgetIndex) {
55
- return -1;
56
- }
57
- if (!isFirstWidgetIndex && isSecondWidgetIndex) {
58
- return 1;
59
- }
60
- return 0;
61
- };
62
-
63
- // This function is copied from the algoliasearch v4 API Client. If modified,
64
- // consider updating it also in `serializeQueryParameters` from `@algolia/transporter`.
65
- function serializeQueryParameters(parameters) {
66
- var isObjectOrArray = function isObjectOrArray(value) {
67
- return Object.prototype.toString.call(value) === '[object Object]' || Object.prototype.toString.call(value) === '[object Array]';
68
- };
69
- var encode = function encode(format) {
70
- for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
71
- args[_key - 1] = arguments[_key];
72
- }
73
- var i = 0;
74
- return format.replace(/%s/g, function () {
75
- return encodeURIComponent(args[i++]);
76
- });
77
- };
78
- return Object.keys(parameters).map(function (key) {
79
- return encode('%s=%s', key, isObjectOrArray(parameters[key]) ? JSON.stringify(parameters[key]) : parameters[key]);
80
- }).join('&');
81
- }
82
-
83
- /**
84
- * Creates a new instance of the InstantSearchManager which controls the widgets and
85
- * trigger the search when the widgets are updated.
86
- * @param {string} indexName - the main index name
87
- * @param {object} initialState - initial widget state
88
- * @param {object} SearchParameters - optional additional parameters to send to the algolia API
89
- * @param {number} stalledSearchDelay - time (in ms) after the search is stalled
90
- * @return {InstantSearchManager} a new instance of InstantSearchManager
91
- */
92
- function createInstantSearchManager(_ref) {
93
- var indexName = _ref.indexName,
94
- _ref$initialState = _ref.initialState,
95
- initialState = _ref$initialState === void 0 ? {} : _ref$initialState,
96
- searchClient = _ref.searchClient,
97
- resultsState = _ref.resultsState,
98
- stalledSearchDelay = _ref.stalledSearchDelay;
99
- var helper = (0, _algoliasearchHelper.default)(searchClient, indexName, _objectSpread({}, _highlight.HIGHLIGHT_TAGS));
100
- addAlgoliaAgents(searchClient);
101
- helper.on('search', handleNewSearch).on('result', handleSearchSuccess({
102
- indexId: indexName
103
- })).on('error', handleSearchError);
104
- var skip = false;
105
- var stalledSearchTimer = null;
106
- var initialSearchParameters = helper.state;
107
- var searchCounter;
108
- var widgetsManager = (0, _createWidgetsManager.default)(onWidgetsUpdate);
109
- hydrateSearchClient(searchClient, resultsState);
110
- var store = (0, _createStore.default)({
111
- widgets: initialState,
112
- metadata: hydrateMetadata(resultsState),
113
- results: hydrateResultsState(resultsState),
114
- error: null,
115
- searching: false,
116
- isSearchStalled: true,
117
- searchingForFacetValues: false
118
- });
119
- function skipSearch() {
120
- skip = true;
121
- }
122
- function updateClient(client) {
123
- addAlgoliaAgents(client);
124
- helper.setClient(client);
125
- search();
126
- }
127
- function clearCache() {
128
- helper.clearCache();
129
- search();
130
- }
131
- function getMetadata(state) {
132
- return widgetsManager.getWidgets().filter(function (widget) {
133
- return Boolean(widget.getMetadata);
134
- }).map(function (widget) {
135
- return widget.getMetadata(state);
136
- });
137
- }
138
- function getSearchParameters() {
139
- var sharedParameters = widgetsManager.getWidgets().filter(function (widget) {
140
- return Boolean(widget.getSearchParameters);
141
- }).filter(function (widget) {
142
- return !isMultiIndexContext(widget) && !isIndexWidget(widget);
143
- }).reduce(function (res, widget) {
144
- return widget.getSearchParameters(res);
145
- }, initialSearchParameters);
146
- var mainParameters = widgetsManager.getWidgets().filter(function (widget) {
147
- return Boolean(widget.getSearchParameters);
148
- }).filter(function (widget) {
149
- var targetedIndexEqualMainIndex = isMultiIndexContext(widget) && isTargetedIndexEqualIndex(widget, indexName);
150
- var subIndexEqualMainIndex = isIndexWidget(widget) && isIndexWidgetEqualIndex(widget, indexName);
151
- return targetedIndexEqualMainIndex || subIndexEqualMainIndex;
152
- })
153
- // We have to sort the `Index` widgets first so the `index` parameter
154
- // is correctly set in the `reduce` function for the following widgets
155
- .sort(sortIndexWidgetsFirst).reduce(function (res, widget) {
156
- return widget.getSearchParameters(res);
157
- }, sharedParameters);
158
- var derivedIndices = widgetsManager.getWidgets().filter(function (widget) {
159
- return Boolean(widget.getSearchParameters);
160
- }).filter(function (widget) {
161
- var targetedIndexNotEqualMainIndex = isMultiIndexContext(widget) && !isTargetedIndexEqualIndex(widget, indexName);
162
- var subIndexNotEqualMainIndex = isIndexWidget(widget) && !isIndexWidgetEqualIndex(widget, indexName);
163
- return targetedIndexNotEqualMainIndex || subIndexNotEqualMainIndex;
164
- })
165
- // We have to sort the `Index` widgets first so the `index` parameter
166
- // is correctly set in the `reduce` function for the following widgets
167
- .sort(sortIndexWidgetsFirst).reduce(function (indices, widget) {
168
- var indexId = isMultiIndexContext(widget) ? widget.props.indexContextValue.targetedIndex : widget.props.indexId;
169
- var widgets = indices[indexId] || [];
170
- return _objectSpread(_objectSpread({}, indices), {}, _defineProperty({}, indexId, widgets.concat(widget)));
171
- }, {});
172
- var derivedParameters = Object.keys(derivedIndices).map(function (indexId) {
173
- return {
174
- parameters: derivedIndices[indexId].reduce(function (res, widget) {
175
- return widget.getSearchParameters(res);
176
- }, sharedParameters),
177
- indexId: indexId
178
- };
179
- });
180
- return {
181
- mainParameters: mainParameters,
182
- derivedParameters: derivedParameters
183
- };
184
- }
185
- function search() {
186
- if (!skip) {
187
- var _getSearchParameters = getSearchParameters(helper.state),
188
- mainParameters = _getSearchParameters.mainParameters,
189
- derivedParameters = _getSearchParameters.derivedParameters;
190
- searchCounter = derivedParameters.length + 1;
191
-
192
- // We have to call `slice` because the method `detach` on the derived
193
- // helpers mutates the value `derivedHelpers`. The `forEach` loop does
194
- // not iterate on each value and we're not able to correctly clear the
195
- // previous derived helpers (memory leak + useless requests).
196
- helper.derivedHelpers.slice().forEach(function (derivedHelper) {
197
- // Since we detach the derived helpers on **every** new search they
198
- // won't receive intermediate results in case of a stalled search.
199
- // Only the last result is dispatched by the derived helper because
200
- // they are not detached yet:
201
- //
202
- // - a -> main helper receives results
203
- // - ap -> main helper receives results
204
- // - app -> main helper + derived helpers receive results
205
- //
206
- // The quick fix is to avoid to detach them on search but only once they
207
- // received the results. But it means that in case of a stalled search
208
- // all the derived helpers not detached yet register a new search inside
209
- // the helper. The number grows fast in case of a bad network and it's
210
- // not deterministic.
211
- derivedHelper.detach();
212
- });
213
- derivedParameters.forEach(function (_ref2) {
214
- var indexId = _ref2.indexId,
215
- parameters = _ref2.parameters;
216
- var derivedHelper = helper.derive(function () {
217
- return parameters;
218
- });
219
- derivedHelper.on('result', handleSearchSuccess({
220
- indexId: indexId
221
- })).on('error', handleSearchError);
222
- });
223
- helper.setState(mainParameters);
224
- helper.search();
225
- }
226
- }
227
- function handleSearchSuccess(_ref3) {
228
- var indexId = _ref3.indexId;
229
- return function (event) {
230
- searchCounter--;
231
- var state = store.getState();
232
- var isDerivedHelpersEmpty = !helper.derivedHelpers.length;
233
- var results = state.results ? state.results : {};
234
-
235
- // Switching from mono index to multi index and vice versa must reset the
236
- // results to an empty object, otherwise we keep reference of stalled and
237
- // unused results.
238
- results = !isDerivedHelpersEmpty && results.getFacetByName ? {} : results;
239
- if (!isDerivedHelpersEmpty) {
240
- results = _objectSpread(_objectSpread({}, results), {}, _defineProperty({}, indexId, event.results));
241
- } else {
242
- results = event.results;
243
- }
244
- var currentState = store.getState();
245
- var nextIsSearchStalled = currentState.isSearchStalled;
246
- if (!helper.hasPendingRequests()) {
247
- clearTimeout(stalledSearchTimer);
248
- stalledSearchTimer = null;
249
- nextIsSearchStalled = false;
250
- }
251
- var resultsFacetValues = currentState.resultsFacetValues,
252
- partialState = _objectWithoutProperties(currentState, _excluded);
253
- store.setState(_objectSpread(_objectSpread({}, partialState), {}, {
254
- results: results,
255
- isSearchStalled: nextIsSearchStalled,
256
- searching: searchCounter > 0,
257
- error: null
258
- }));
259
- };
260
- }
261
- function handleSearchError(_ref4) {
262
- var error = _ref4.error;
263
- var currentState = store.getState();
264
- var nextIsSearchStalled = currentState.isSearchStalled;
265
- if (!helper.hasPendingRequests()) {
266
- clearTimeout(stalledSearchTimer);
267
- nextIsSearchStalled = false;
268
- }
269
- var resultsFacetValues = currentState.resultsFacetValues,
270
- partialState = _objectWithoutProperties(currentState, _excluded2);
271
- store.setState(_objectSpread(_objectSpread({}, partialState), {}, {
272
- isSearchStalled: nextIsSearchStalled,
273
- error: error,
274
- searching: false
275
- }));
276
- }
277
- function handleNewSearch() {
278
- if (!stalledSearchTimer) {
279
- stalledSearchTimer = setTimeout(function () {
280
- var _store$getState = store.getState(),
281
- resultsFacetValues = _store$getState.resultsFacetValues,
282
- partialState = _objectWithoutProperties(_store$getState, _excluded3);
283
- store.setState(_objectSpread(_objectSpread({}, partialState), {}, {
284
- isSearchStalled: true
285
- }));
286
- }, stalledSearchDelay);
287
- }
288
- }
289
- function hydrateSearchClient(client, results) {
290
- if (!results) {
291
- return;
292
- }
293
-
294
- // Disable cache hydration on:
295
- // - Algoliasearch API Client < v4 with cache disabled
296
- // - Third party clients (detected by the `addAlgoliaAgent` function missing)
297
-
298
- if ((!client.transporter || client._cacheHydrated) && (!client._useCache || typeof client.addAlgoliaAgent !== 'function')) {
299
- return;
300
- }
301
-
302
- // Algoliasearch API Client >= v4
303
- // To hydrate the client we need to populate the cache with the data from
304
- // the server (done in `hydrateSearchClientWithMultiIndexRequest` or
305
- // `hydrateSearchClientWithSingleIndexRequest`). But since there is no way
306
- // for us to compute the key the same way as `algoliasearch-client` we need
307
- // to populate it on a custom key and override the `search` method to
308
- // search on it first.
309
- if (client.transporter && !client._cacheHydrated) {
310
- client._cacheHydrated = true;
311
- var baseMethod = client.search;
312
- client.search = function (requests) {
313
- for (var _len2 = arguments.length, methodArgs = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
314
- methodArgs[_key2 - 1] = arguments[_key2];
315
- }
316
- var requestsWithSerializedParams = requests.map(function (request) {
317
- return _objectSpread(_objectSpread({}, request), {}, {
318
- params: serializeQueryParameters(request.params)
319
- });
320
- });
321
- return client.transporter.responsesCache.get({
322
- method: 'search',
323
- args: [requestsWithSerializedParams].concat(methodArgs)
324
- }, function () {
325
- return baseMethod.apply(void 0, [requests].concat(methodArgs));
326
- });
327
- };
328
- }
329
- if (Array.isArray(results.results)) {
330
- hydrateSearchClientWithMultiIndexRequest(client, results.results);
331
- return;
332
- }
333
- hydrateSearchClientWithSingleIndexRequest(client, results);
334
- }
335
- function hydrateSearchClientWithMultiIndexRequest(client, results) {
336
- // Algoliasearch API Client >= v4
337
- // Populate the cache with the data from the server
338
- if (client.transporter) {
339
- client.transporter.responsesCache.set({
340
- method: 'search',
341
- args: [results.reduce(function (acc, result) {
342
- return acc.concat(result.rawResults.map(function (request) {
343
- return {
344
- indexName: request.index,
345
- params: request.params
346
- };
347
- }));
348
- }, [])]
349
- }, {
350
- results: results.reduce(function (acc, result) {
351
- return acc.concat(result.rawResults);
352
- }, [])
353
- });
354
- return;
355
- }
356
-
357
- // Algoliasearch API Client < v4
358
- // Prior to client v4 we didn't have a proper API to hydrate the client
359
- // cache from the outside. The following code populates the cache with
360
- // a single-index result. You can find more information about the
361
- // computation of the key inside the client (see link below).
362
- // https://github.com/algolia/algoliasearch-client-javascript/blob/c27e89ff92b2a854ae6f40dc524bffe0f0cbc169/src/AlgoliaSearchCore.js#L232-L240
363
- var key = "/1/indexes/*/queries_body_".concat(JSON.stringify({
364
- requests: results.reduce(function (acc, result) {
365
- return acc.concat(result.rawResults.map(function (request) {
366
- return {
367
- indexName: request.index,
368
- params: request.params
369
- };
370
- }));
371
- }, [])
372
- }));
373
- client.cache = _objectSpread(_objectSpread({}, client.cache), {}, _defineProperty({}, key, JSON.stringify({
374
- results: results.reduce(function (acc, result) {
375
- return acc.concat(result.rawResults);
376
- }, [])
377
- })));
378
- }
379
- function hydrateSearchClientWithSingleIndexRequest(client, results) {
380
- // Algoliasearch API Client >= v4
381
- // Populate the cache with the data from the server
382
- if (client.transporter) {
383
- client.transporter.responsesCache.set({
384
- method: 'search',
385
- args: [results.rawResults.map(function (request) {
386
- return {
387
- indexName: request.index,
388
- params: request.params
389
- };
390
- })]
391
- }, {
392
- results: results.rawResults
393
- });
394
- return;
395
- }
396
- // Algoliasearch API Client < v4
397
- // Prior to client v4 we didn't have a proper API to hydrate the client
398
- // cache from the outside. The following code populates the cache with
399
- // a single-index result. You can find more information about the
400
- // computation of the key inside the client (see link below).
401
- // https://github.com/algolia/algoliasearch-client-javascript/blob/c27e89ff92b2a854ae6f40dc524bffe0f0cbc169/src/AlgoliaSearchCore.js#L232-L240
402
- var key = "/1/indexes/*/queries_body_".concat(JSON.stringify({
403
- requests: results.rawResults.map(function (request) {
404
- return {
405
- indexName: request.index,
406
- params: request.params
407
- };
408
- })
409
- }));
410
- client.cache = _objectSpread(_objectSpread({}, client.cache), {}, _defineProperty({}, key, JSON.stringify({
411
- results: results.rawResults
412
- })));
413
- }
414
- function hydrateResultsState(results) {
415
- if (!results) {
416
- return null;
417
- }
418
- if (Array.isArray(results.results)) {
419
- return results.results.reduce(function (acc, result) {
420
- return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, result._internalIndexId, new _algoliasearchHelper.default.SearchResults(new _algoliasearchHelper.default.SearchParameters(result.state), result.rawResults)));
421
- }, {});
422
- }
423
- return new _algoliasearchHelper.default.SearchResults(new _algoliasearchHelper.default.SearchParameters(results.state), results.rawResults);
424
- }
425
-
426
- // Called whenever a widget has been rendered with new props.
427
- function onWidgetsUpdate() {
428
- var metadata = getMetadata(store.getState().widgets);
429
- store.setState(_objectSpread(_objectSpread({}, store.getState()), {}, {
430
- metadata: metadata,
431
- searching: true
432
- }));
433
-
434
- // Since the `getSearchParameters` method of widgets also depends on props,
435
- // the result search parameters might have changed.
436
- search();
437
- }
438
- function transitionState(nextSearchState) {
439
- var searchState = store.getState().widgets;
440
- return widgetsManager.getWidgets().filter(function (widget) {
441
- return Boolean(widget.transitionState);
442
- }).reduce(function (res, widget) {
443
- return widget.transitionState(searchState, res);
444
- }, nextSearchState);
445
- }
446
- function onExternalStateUpdate(nextSearchState) {
447
- var metadata = getMetadata(nextSearchState);
448
- store.setState(_objectSpread(_objectSpread({}, store.getState()), {}, {
449
- widgets: nextSearchState,
450
- metadata: metadata,
451
- searching: true
452
- }));
453
- search();
454
- }
455
- function onSearchForFacetValues(_ref5) {
456
- var facetName = _ref5.facetName,
457
- query = _ref5.query,
458
- _ref5$maxFacetHits = _ref5.maxFacetHits,
459
- maxFacetHits = _ref5$maxFacetHits === void 0 ? 10 : _ref5$maxFacetHits;
460
- // The values 1, 100 are the min / max values that the engine accepts.
461
- // see: https://www.algolia.com/doc/api-reference/api-parameters/maxFacetHits
462
- var maxFacetHitsWithinRange = Math.max(1, Math.min(maxFacetHits, 100));
463
- store.setState(_objectSpread(_objectSpread({}, store.getState()), {}, {
464
- searchingForFacetValues: true
465
- }));
466
- helper.searchForFacetValues(facetName, query, maxFacetHitsWithinRange).then(function (content) {
467
- var _objectSpread7;
468
- store.setState(_objectSpread(_objectSpread({}, store.getState()), {}, {
469
- error: null,
470
- searchingForFacetValues: false,
471
- resultsFacetValues: _objectSpread(_objectSpread({}, store.getState().resultsFacetValues), {}, (_objectSpread7 = {}, _defineProperty(_objectSpread7, facetName, content.facetHits), _defineProperty(_objectSpread7, "query", query), _objectSpread7))
472
- }));
473
- }, function (error) {
474
- store.setState(_objectSpread(_objectSpread({}, store.getState()), {}, {
475
- searchingForFacetValues: false,
476
- error: error
477
- }));
478
- }).catch(function (error) {
479
- // Since setState is synchronous, any error that occurs in the render of a
480
- // component will be swallowed by this promise.
481
- // This is a trick to make the error show up correctly in the console.
482
- // See http://stackoverflow.com/a/30741722/969302
483
- setTimeout(function () {
484
- throw error;
485
- });
486
- });
487
- }
488
- function updateIndex(newIndex) {
489
- initialSearchParameters = initialSearchParameters.setIndex(newIndex);
490
- // No need to trigger a new search here as the widgets will also update and trigger it if needed.
491
- }
492
-
493
- function getWidgetsIds() {
494
- return store.getState().metadata.reduce(function (res, meta) {
495
- return typeof meta.id !== 'undefined' ? res.concat(meta.id) : res;
496
- }, []);
497
- }
498
- return {
499
- store: store,
500
- widgetsManager: widgetsManager,
501
- getWidgetsIds: getWidgetsIds,
502
- getSearchParameters: getSearchParameters,
503
- onSearchForFacetValues: onSearchForFacetValues,
504
- onExternalStateUpdate: onExternalStateUpdate,
505
- transitionState: transitionState,
506
- updateClient: updateClient,
507
- updateIndex: updateIndex,
508
- clearCache: clearCache,
509
- skipSearch: skipSearch
510
- };
511
- }
512
- function hydrateMetadata(resultsState) {
513
- if (!resultsState) {
514
- return [];
515
- }
516
-
517
- // add a value noop, which gets replaced once the widgets are mounted
518
- return resultsState.metadata.map(function (datum) {
519
- return _objectSpread(_objectSpread({
520
- value: function value() {
521
- return {};
522
- }
523
- }, datum), {}, {
524
- items: datum.items && datum.items.map(function (item) {
525
- return _objectSpread(_objectSpread({
526
- value: function value() {
527
- return {};
528
- }
529
- }, item), {}, {
530
- items: item.items && item.items.map(function (nestedItem) {
531
- return _objectSpread({
532
- value: function value() {
533
- return {};
534
- }
535
- }, nestedItem);
536
- })
537
- });
538
- })
539
- });
540
- });
541
- }
@@ -1,27 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = createStore;
7
- function createStore(initialState) {
8
- var state = initialState;
9
- var listeners = [];
10
- return {
11
- getState: function getState() {
12
- return state;
13
- },
14
- setState: function setState(nextState) {
15
- state = nextState;
16
- listeners.forEach(function (listener) {
17
- return listener();
18
- });
19
- },
20
- subscribe: function subscribe(listener) {
21
- listeners.push(listener);
22
- return function unsubscribe() {
23
- listeners.splice(listeners.indexOf(listener), 1);
24
- };
25
- }
26
- };
27
- }
@@ -1,39 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = createWidgetsManager;
7
- var _utils = require("./utils");
8
- function createWidgetsManager(onWidgetsUpdate) {
9
- var widgets = [];
10
- // Is an update scheduled?
11
- var scheduled = false;
12
-
13
- // The state manager's updates need to be batched since more than one
14
- // component can register or unregister widgets during the same tick.
15
- function scheduleUpdate() {
16
- if (scheduled) {
17
- return;
18
- }
19
- scheduled = true;
20
- (0, _utils.defer)(function () {
21
- scheduled = false;
22
- onWidgetsUpdate();
23
- });
24
- }
25
- return {
26
- registerWidget: function registerWidget(widget) {
27
- widgets.push(widget);
28
- scheduleUpdate();
29
- return function unregisterWidget() {
30
- widgets.splice(widgets.indexOf(widget), 1);
31
- scheduleUpdate();
32
- };
33
- },
34
- update: scheduleUpdate,
35
- getWidgets: function getWidgets() {
36
- return widgets;
37
- }
38
- };
39
- }