instantsearch.js 4.54.1 → 4.55.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 (73) hide show
  1. package/cjs/components/Hits/Hits.js +16 -7
  2. package/cjs/components/InfiniteHits/InfiniteHits.js +13 -2
  3. package/cjs/connectors/autocomplete/connectAutocomplete.js +1 -1
  4. package/cjs/connectors/geo-search/connectGeoSearch.js +1 -1
  5. package/cjs/connectors/hierarchical-menu/connectHierarchicalMenu.js +1 -1
  6. package/cjs/connectors/hits/connectHits.js +1 -1
  7. package/cjs/connectors/infinite-hits/connectInfiniteHits.js +39 -31
  8. package/cjs/connectors/menu/connectMenu.js +1 -1
  9. package/cjs/connectors/numeric-menu/connectNumericMenu.js +1 -1
  10. package/cjs/connectors/rating-menu/connectRatingMenu.js +7 -3
  11. package/cjs/connectors/refinement-list/connectRefinementList.js +1 -1
  12. package/cjs/connectors/toggle-refinement/connectToggleRefinement.js +14 -4
  13. package/cjs/helpers/insights.js +3 -4
  14. package/cjs/lib/InstantSearch.js +18 -2
  15. package/cjs/lib/insights/listener.js +43 -36
  16. package/cjs/lib/routers/history.js +1 -0
  17. package/cjs/lib/stateMappings/simple.js +1 -0
  18. package/cjs/lib/stateMappings/singleIndex.js +1 -0
  19. package/cjs/lib/utils/createSendEventForFacet.js +12 -2
  20. package/cjs/lib/utils/createSendEventForHits.js +34 -11
  21. package/cjs/lib/version.js +1 -1
  22. package/cjs/middlewares/createInsightsMiddleware.js +135 -33
  23. package/cjs/middlewares/createMetadataMiddleware.js +17 -5
  24. package/cjs/middlewares/createRouterMiddleware.js +5 -1
  25. package/cjs/widgets/hits/hits.js +1 -2
  26. package/cjs/widgets/infinite-hits/infinite-hits.js +1 -2
  27. package/dist/instantsearch.development.d.ts +67 -8
  28. package/dist/instantsearch.development.js +433 -251
  29. package/dist/instantsearch.development.js.map +1 -1
  30. package/dist/instantsearch.production.d.ts +67 -8
  31. package/dist/instantsearch.production.min.d.ts +67 -8
  32. package/dist/instantsearch.production.min.js +2 -2
  33. package/dist/instantsearch.production.min.js.map +1 -1
  34. package/es/components/Hits/Hits.d.ts +5 -5
  35. package/es/components/Hits/Hits.js +15 -5
  36. package/es/components/InfiniteHits/InfiniteHits.d.ts +3 -2
  37. package/es/components/InfiniteHits/InfiniteHits.js +13 -2
  38. package/es/connectors/autocomplete/connectAutocomplete.js +1 -1
  39. package/es/connectors/geo-search/connectGeoSearch.js +1 -1
  40. package/es/connectors/hierarchical-menu/connectHierarchicalMenu.js +1 -1
  41. package/es/connectors/hits/connectHits.js +1 -1
  42. package/es/connectors/infinite-hits/connectInfiniteHits.js +39 -31
  43. package/es/connectors/menu/connectMenu.js +1 -1
  44. package/es/connectors/numeric-menu/connectNumericMenu.js +1 -1
  45. package/es/connectors/rating-menu/connectRatingMenu.js +7 -3
  46. package/es/connectors/refinement-list/connectRefinementList.js +1 -1
  47. package/es/connectors/toggle-refinement/connectToggleRefinement.js +13 -3
  48. package/es/helpers/insights.d.ts +2 -1
  49. package/es/helpers/insights.js +3 -3
  50. package/es/lib/InstantSearch.d.ts +11 -1
  51. package/es/lib/InstantSearch.js +18 -2
  52. package/es/lib/insights/listener.d.ts +10 -6
  53. package/es/lib/insights/listener.js +42 -36
  54. package/es/lib/routers/history.d.ts +1 -0
  55. package/es/lib/routers/history.js +1 -0
  56. package/es/lib/stateMappings/simple.js +1 -0
  57. package/es/lib/stateMappings/singleIndex.js +1 -0
  58. package/es/lib/utils/createSendEventForFacet.js +12 -2
  59. package/es/lib/utils/createSendEventForHits.d.ts +8 -0
  60. package/es/lib/utils/createSendEventForHits.js +33 -11
  61. package/es/lib/version.d.ts +1 -1
  62. package/es/lib/version.js +1 -1
  63. package/es/middlewares/createInsightsMiddleware.d.ts +12 -12
  64. package/es/middlewares/createInsightsMiddleware.js +136 -34
  65. package/es/middlewares/createMetadataMiddleware.d.ts +3 -1
  66. package/es/middlewares/createMetadataMiddleware.js +17 -5
  67. package/es/middlewares/createRouterMiddleware.js +5 -1
  68. package/es/types/insights.d.ts +19 -1
  69. package/es/types/middleware.d.ts +16 -0
  70. package/es/types/router.d.ts +8 -0
  71. package/es/widgets/hits/hits.js +2 -3
  72. package/es/widgets/infinite-hits/infinite-hits.js +2 -3
  73. package/package.json +6 -6
@@ -4,9 +4,10 @@ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" =
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.default = void 0;
7
+ exports.default = Hits;
8
8
  var _uiComponentsShared = require("@algolia/ui-components-shared");
9
9
  var _preact = require("preact");
10
+ var _listener = require("../../lib/insights/listener");
10
11
  var _utils = require("../../lib/utils");
11
12
  var _Template = _interopRequireDefault(require("../Template/Template"));
12
13
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -16,18 +17,24 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key i
16
17
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
17
18
  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); }
18
19
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
19
- var Hits = function Hits(_ref) {
20
+ function Hits(_ref) {
20
21
  var results = _ref.results,
21
22
  hits = _ref.hits,
23
+ insights = _ref.insights,
22
24
  bindEvent = _ref.bindEvent,
23
25
  sendEvent = _ref.sendEvent,
24
26
  cssClasses = _ref.cssClasses,
25
27
  templateProps = _ref.templateProps;
28
+ var handleInsightsClick = (0, _listener.createInsightsEventHandler)({
29
+ insights: insights,
30
+ sendEvent: sendEvent
31
+ });
26
32
  if (results.hits.length === 0) {
27
33
  return (0, _preact.h)(_Template.default, _extends({}, templateProps, {
28
34
  templateKey: "empty",
29
35
  rootProps: {
30
- className: (0, _uiComponentsShared.cx)(cssClasses.root, cssClasses.emptyRoot)
36
+ className: (0, _uiComponentsShared.cx)(cssClasses.root, cssClasses.emptyRoot),
37
+ onClick: handleInsightsClick
31
38
  },
32
39
  data: results
33
40
  }));
@@ -41,7 +48,11 @@ var Hits = function Hits(_ref) {
41
48
  templateKey: "item",
42
49
  rootTagName: "li",
43
50
  rootProps: {
44
- className: cssClasses.item
51
+ className: cssClasses.item,
52
+ onClick: function onClick(event) {
53
+ handleInsightsClick(event);
54
+ sendEvent('click:internal', hit, 'Hit Clicked');
55
+ }
45
56
  },
46
57
  key: hit.objectID,
47
58
  data: _objectSpread(_objectSpread({}, hit), {}, {
@@ -54,6 +65,4 @@ var Hits = function Hits(_ref) {
54
65
  sendEvent: sendEvent
55
66
  }));
56
67
  })));
57
- };
58
- var _default = Hits;
59
- exports.default = _default;
68
+ }
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = void 0;
8
8
  var _uiComponentsShared = require("@algolia/ui-components-shared");
9
9
  var _preact = require("preact");
10
+ var _listener = require("../../lib/insights/listener");
10
11
  var _utils = require("../../lib/utils");
11
12
  var _Template = _interopRequireDefault(require("../Template/Template"));
12
13
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -19,6 +20,7 @@ function _extends() { _extends = Object.assign ? Object.assign.bind() : function
19
20
  var InfiniteHits = function InfiniteHits(_ref) {
20
21
  var results = _ref.results,
21
22
  hits = _ref.hits,
23
+ insights = _ref.insights,
22
24
  bindEvent = _ref.bindEvent,
23
25
  sendEvent = _ref.sendEvent,
24
26
  hasShowPrevious = _ref.hasShowPrevious,
@@ -28,11 +30,16 @@ var InfiniteHits = function InfiniteHits(_ref) {
28
30
  isLastPage = _ref.isLastPage,
29
31
  cssClasses = _ref.cssClasses,
30
32
  templateProps = _ref.templateProps;
33
+ var handleInsightsClick = (0, _listener.createInsightsEventHandler)({
34
+ insights: insights,
35
+ sendEvent: sendEvent
36
+ });
31
37
  if (results.hits.length === 0) {
32
38
  return (0, _preact.h)(_Template.default, _extends({}, templateProps, {
33
39
  templateKey: "empty",
34
40
  rootProps: {
35
- className: (0, _uiComponentsShared.cx)(cssClasses.root, cssClasses.emptyRoot)
41
+ className: (0, _uiComponentsShared.cx)(cssClasses.root, cssClasses.emptyRoot),
42
+ onClick: handleInsightsClick
36
43
  },
37
44
  data: results
38
45
  }));
@@ -54,7 +61,11 @@ var InfiniteHits = function InfiniteHits(_ref) {
54
61
  templateKey: "item",
55
62
  rootTagName: "li",
56
63
  rootProps: {
57
- className: cssClasses.item
64
+ className: cssClasses.item,
65
+ onClick: function onClick(event) {
66
+ handleInsightsClick(event);
67
+ sendEvent('click:internal', hit, 'Hit Clicked');
68
+ }
58
69
  },
59
70
  key: hit.objectID,
60
71
  data: _objectSpread(_objectSpread({}, hit), {}, {
@@ -41,7 +41,7 @@ var connectAutocomplete = function connectAutocomplete(renderFn) {
41
41
  renderState.indices.forEach(function (_ref3) {
42
42
  var sendEvent = _ref3.sendEvent,
43
43
  hits = _ref3.hits;
44
- sendEvent('view', hits);
44
+ sendEvent('view:internal', hits);
45
45
  });
46
46
  renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
47
47
  instantSearchInstance: instantSearchInstance
@@ -137,7 +137,7 @@ var connectGeoSearch = function connectGeoSearch(renderFn) {
137
137
  widgetState.internalToggleRefineOnMapMove = createInternalToggleRefinementOnMapMove(renderArgs, this.render.bind(this));
138
138
  widgetState.internalSetMapMoveSinceLastRefine = createInternalSetMapMoveSinceLastRefine(renderArgs, this.render.bind(this));
139
139
  var widgetRenderState = this.getWidgetRenderState(renderArgs);
140
- sendEvent('view', widgetRenderState.items);
140
+ sendEvent('view:internal', widgetRenderState.items);
141
141
  renderFn(_objectSpread(_objectSpread({}, widgetRenderState), {}, {
142
142
  instantSearchInstance: instantSearchInstance
143
143
  }), isFirstRendering);
@@ -161,7 +161,7 @@ var connectHierarchicalMenu = function connectHierarchicalMenu(renderFn) {
161
161
  }
162
162
  if (!_refine) {
163
163
  _refine = function _refine(facetValue) {
164
- sendEvent('click', facetValue);
164
+ sendEvent('click:internal', facetValue);
165
165
  helper.toggleFacetRefinement(hierarchicalFacetName, facetValue).search();
166
166
  };
167
167
  }
@@ -40,7 +40,7 @@ var connectHits = function connectHits(renderFn) {
40
40
  renderFn(_objectSpread(_objectSpread({}, renderState), {}, {
41
41
  instantSearchInstance: renderOptions.instantSearchInstance
42
42
  }), false);
43
- renderState.sendEvent('view', renderState.hits);
43
+ renderState.sendEvent('view:internal', renderState.hits);
44
44
  },
45
45
  getRenderState: function getRenderState(renderState, renderOptions) {
46
46
  return _objectSpread(_objectSpread({}, renderState), {}, {
@@ -6,7 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _utils = require("../../lib/utils");
9
- var _excluded = ["page"];
9
+ var _excluded = ["page"],
10
+ _excluded2 = ["clickAnalytics", "userToken"];
10
11
  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; }
11
12
  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; }
12
13
  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; }
@@ -30,17 +31,24 @@ function getStateWithoutPage(state) {
30
31
  rest = _objectWithoutProperties(_ref, _excluded);
31
32
  return rest;
32
33
  }
34
+ function normalizeState(state) {
35
+ var _ref2 = state || {},
36
+ clickAnalytics = _ref2.clickAnalytics,
37
+ userToken = _ref2.userToken,
38
+ rest = _objectWithoutProperties(_ref2, _excluded2);
39
+ return rest;
40
+ }
33
41
  function getInMemoryCache() {
34
42
  var cachedHits = null;
35
43
  var cachedState = null;
36
44
  return {
37
- read: function read(_ref2) {
38
- var state = _ref2.state;
45
+ read: function read(_ref3) {
46
+ var state = _ref3.state;
39
47
  return (0, _utils.isEqual)(cachedState, getStateWithoutPage(state)) ? cachedHits : null;
40
48
  },
41
- write: function write(_ref3) {
42
- var state = _ref3.state,
43
- hits = _ref3.hits;
49
+ write: function write(_ref4) {
50
+ var state = _ref4.state,
51
+ hits = _ref4.hits;
44
52
  cachedState = getStateWithoutPage(state);
45
53
  cachedHits = hits;
46
54
  }
@@ -60,15 +68,15 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
60
68
  // @TODO: this should be a generic, but a Connector can not yet be generic itself
61
69
 
62
70
  return function (widgetParams) {
63
- var _ref4 = widgetParams || {},
64
- _ref4$escapeHTML = _ref4.escapeHTML,
65
- escapeHTML = _ref4$escapeHTML === void 0 ? true : _ref4$escapeHTML,
66
- _ref4$transformItems = _ref4.transformItems,
67
- transformItems = _ref4$transformItems === void 0 ? function (items) {
71
+ var _ref5 = widgetParams || {},
72
+ _ref5$escapeHTML = _ref5.escapeHTML,
73
+ escapeHTML = _ref5$escapeHTML === void 0 ? true : _ref5$escapeHTML,
74
+ _ref5$transformItems = _ref5.transformItems,
75
+ transformItems = _ref5$transformItems === void 0 ? function (items) {
68
76
  return items;
69
- } : _ref4$transformItems,
70
- _ref4$cache = _ref4.cache,
71
- cache = _ref4$cache === void 0 ? getInMemoryCache() : _ref4$cache;
77
+ } : _ref5$transformItems,
78
+ _ref5$cache = _ref5.cache,
79
+ cache = _ref5$cache === void 0 ? getInMemoryCache() : _ref5$cache;
72
80
  var showPrevious;
73
81
  var showMore;
74
82
  var sendEvent;
@@ -99,7 +107,7 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
99
107
  // avoid updating the browser URL when the user displays the previous page.
100
108
  helper.overrideStateWithoutTriggeringChangeEvent(_objectSpread(_objectSpread({}, helper.state), {}, {
101
109
  page: getFirstReceivedPage(helper.state, cache.read({
102
- state: helper.state
110
+ state: normalizeState(helper.state)
103
111
  }) || {}) - 1
104
112
  })).searchWithoutTriggeringOnStateChange();
105
113
  };
@@ -107,7 +115,7 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
107
115
  var getShowMore = function getShowMore(helper) {
108
116
  return function () {
109
117
  helper.setPage(getLastReceivedPage(helper.state, cache.read({
110
- state: helper.state
118
+ state: normalizeState(helper.state)
111
119
  }) || {}) + 1).search();
112
120
  };
113
121
  };
@@ -124,19 +132,19 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
124
132
  renderFn(_objectSpread(_objectSpread({}, widgetRenderState), {}, {
125
133
  instantSearchInstance: instantSearchInstance
126
134
  }), false);
127
- sendEvent('view', widgetRenderState.currentPageHits);
135
+ sendEvent('view:internal', widgetRenderState.currentPageHits);
128
136
  },
129
137
  getRenderState: function getRenderState(renderState, renderOptions) {
130
138
  return _objectSpread(_objectSpread({}, renderState), {}, {
131
139
  infiniteHits: this.getWidgetRenderState(renderOptions)
132
140
  });
133
141
  },
134
- getWidgetRenderState: function getWidgetRenderState(_ref5) {
135
- var results = _ref5.results,
136
- helper = _ref5.helper,
137
- parent = _ref5.parent,
138
- existingState = _ref5.state,
139
- instantSearchInstance = _ref5.instantSearchInstance;
142
+ getWidgetRenderState: function getWidgetRenderState(_ref6) {
143
+ var results = _ref6.results,
144
+ helper = _ref6.helper,
145
+ parent = _ref6.parent,
146
+ existingState = _ref6.state,
147
+ instantSearchInstance = _ref6.instantSearchInstance;
140
148
  var isFirstPage;
141
149
  var currentPageHits = [];
142
150
  /**
@@ -146,7 +154,7 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
146
154
  */
147
155
  var state = parent.getPreviousState() || existingState;
148
156
  var cachedHits = cache.read({
149
- state: state
157
+ state: normalizeState(state)
150
158
  }) || {};
151
159
  if (!results) {
152
160
  showPrevious = getShowPrevious(helper);
@@ -176,7 +184,7 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
176
184
  if (cachedHits[_page] === undefined && !results.__isArtificial && instantSearchInstance.status === 'idle') {
177
185
  cachedHits[_page] = transformedHits;
178
186
  cache.write({
179
- state: state,
187
+ state: normalizeState(state),
180
188
  hits: cachedHits
181
189
  });
182
190
  }
@@ -198,8 +206,8 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
198
206
  widgetParams: widgetParams
199
207
  };
200
208
  },
201
- dispose: function dispose(_ref6) {
202
- var state = _ref6.state;
209
+ dispose: function dispose(_ref7) {
210
+ var state = _ref7.state;
203
211
  unmountFn();
204
212
  var stateWithoutPage = state.setQueryParameter('page', undefined);
205
213
  if (!escapeHTML) {
@@ -209,8 +217,8 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
209
217
  return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, key, undefined));
210
218
  }, {}));
211
219
  },
212
- getWidgetUiState: function getWidgetUiState(uiState, _ref7) {
213
- var searchParameters = _ref7.searchParameters;
220
+ getWidgetUiState: function getWidgetUiState(uiState, _ref8) {
221
+ var searchParameters = _ref8.searchParameters;
214
222
  var page = searchParameters.page || 0;
215
223
  if (!page) {
216
224
  // return without adding `page` to uiState
@@ -223,8 +231,8 @@ var connectInfiniteHits = function connectInfiniteHits(renderFn) {
223
231
  page: page + 1
224
232
  });
225
233
  },
226
- getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref8) {
227
- var uiState = _ref8.uiState;
234
+ getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref9) {
235
+ var uiState = _ref9.uiState;
228
236
  var widgetSearchParameters = searchParameters;
229
237
  if (escapeHTML) {
230
238
  widgetSearchParameters = searchParameters.setQueryParameters(_utils.TAG_PLACEHOLDER);
@@ -127,7 +127,7 @@ var connectMenu = function connectMenu(renderFn) {
127
127
  var _helper$getHierarchic = helper.getHierarchicalFacetBreadcrumb(attribute),
128
128
  _helper$getHierarchic2 = _slicedToArray(_helper$getHierarchic, 1),
129
129
  refinedItem = _helper$getHierarchic2[0];
130
- sendEvent('click', facetValue ? facetValue : refinedItem);
130
+ sendEvent('click:internal', facetValue ? facetValue : refinedItem);
131
131
  helper.toggleFacetRefinement(attribute, facetValue ? facetValue : refinedItem).search();
132
132
  };
133
133
  }
@@ -143,7 +143,7 @@ var connectNumericMenu = function connectNumericMenu(renderFn) {
143
143
  if (!connectorState.refine) {
144
144
  connectorState.refine = function (facetValue) {
145
145
  var refinedState = getRefinedState(helper.state, attribute, facetValue);
146
- connectorState.sendEvent('click', facetValue);
146
+ connectorState.sendEvent('click:internal', facetValue);
147
147
  helper.setState(refinedState).search();
148
148
  };
149
149
  }
@@ -41,10 +41,13 @@ var createSendEvent = function createSendEvent(_ref) {
41
41
  instantSearchInstance.sendEventToInsights(args[0]);
42
42
  return;
43
43
  }
44
- var eventType = args[0],
45
- facetValue = args[1],
44
+ var facetValue = args[1],
46
45
  _args$ = args[2],
47
46
  eventName = _args$ === void 0 ? 'Filter Applied' : _args$;
47
+ var _args$0$split = args[0].split(':'),
48
+ _args$0$split2 = _slicedToArray(_args$0$split, 2),
49
+ eventType = _args$0$split2[0],
50
+ eventModifier = _args$0$split2[1];
48
51
  if (eventType !== 'click') {
49
52
  return;
50
53
  }
@@ -54,6 +57,7 @@ var createSendEvent = function createSendEvent(_ref) {
54
57
  insightsMethod: 'clickedFilters',
55
58
  widgetType: $$type,
56
59
  eventType: eventType,
60
+ eventModifier: eventModifier,
57
61
  payload: {
58
62
  eventName: eventName,
59
63
  index: helper.getIndex(),
@@ -129,7 +133,7 @@ var connectRatingMenu = function connectRatingMenu(renderFn) {
129
133
  return emptyState;
130
134
  }
131
135
  var toggleRefinement = function toggleRefinement(helper, facetValue) {
132
- sendEvent('click', facetValue);
136
+ sendEvent('click:internal', facetValue);
133
137
  helper.setState(getRefinedState(helper.state, facetValue)).search();
134
138
  };
135
139
  var connectorState = {
@@ -178,7 +178,7 @@ var connectRefinementList = function connectRefinementList(renderFn) {
178
178
  widgetType: this.$$type
179
179
  });
180
180
  triggerRefine = function triggerRefine(facetValue) {
181
- sendEvent('click', facetValue);
181
+ sendEvent('click:internal', facetValue);
182
182
  helper.toggleFacetRefinement(attribute, facetValue).search();
183
183
  };
184
184
  searchForFacetValues = createSearchForFacetValues(helper, this);
@@ -1,16 +1,22 @@
1
1
  "use strict";
2
2
 
3
+ 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); }
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.default = void 0;
7
8
  var _utils = require("../../lib/utils");
8
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
9
9
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
10
10
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
11
11
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
12
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
13
13
  function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
14
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
15
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
16
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
17
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
18
+ function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
19
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
20
  var withUsage = (0, _utils.createDocumentationMessageGenerator)({
15
21
  name: 'toggle-refinement',
16
22
  connector: true
@@ -29,10 +35,13 @@ var createSendEvent = function createSendEvent(_ref) {
29
35
  instantSearchInstance.sendEventToInsights(args[0]);
30
36
  return;
31
37
  }
32
- var eventType = args[0],
33
- isRefined = args[1],
38
+ var isRefined = args[1],
34
39
  _args$ = args[2],
35
40
  eventName = _args$ === void 0 ? 'Filter Applied' : _args$;
41
+ var _args$0$split = args[0].split(':'),
42
+ _args$0$split2 = _slicedToArray(_args$0$split, 2),
43
+ eventType = _args$0$split2[0],
44
+ eventModifier = _args$0$split2[1];
36
45
  if (eventType !== 'click' || on === undefined) {
37
46
  return;
38
47
  }
@@ -44,6 +53,7 @@ var createSendEvent = function createSendEvent(_ref) {
44
53
  insightsMethod: 'clickedFilters',
45
54
  widgetType: $$type,
46
55
  eventType: eventType,
56
+ eventModifier: eventModifier,
47
57
  payload: {
48
58
  eventName: eventName,
49
59
  index: helper.getIndex(),
@@ -90,7 +100,7 @@ var connectToggleRefinement = function connectToggleRefinement(renderFn) {
90
100
  },
91
101
  isRefined = _ref3.isRefined;
92
102
  if (!isRefined) {
93
- sendEvent('click', isRefined);
103
+ sendEvent('click:internal', isRefined);
94
104
  if (hasAnOffValue) {
95
105
  off.forEach(function (v) {
96
106
  return helper.removeDisjunctiveFacetRefinement(attribute, v);
@@ -4,11 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = insights;
7
- exports.hasDataAttributes = hasDataAttributes;
8
7
  exports.readDataAttributes = readDataAttributes;
9
8
  exports.writeDataAttributes = writeDataAttributes;
10
9
  var _utils = require("../lib/utils");
11
10
  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); }
11
+ /** @deprecated use bindEvent instead */
12
12
  function readDataAttributes(domElement) {
13
13
  var method = domElement.getAttribute('data-insights-method');
14
14
  var serializedPayload = domElement.getAttribute('data-insights-payload');
@@ -25,9 +25,8 @@ function readDataAttributes(domElement) {
25
25
  throw new Error('The insights helper was unable to parse `data-insights-payload`.');
26
26
  }
27
27
  }
28
- function hasDataAttributes(domElement) {
29
- return domElement.hasAttribute('data-insights-method');
30
- }
28
+
29
+ /** @deprecated use bindEvent instead */
31
30
  function writeDataAttributes(_ref) {
32
31
  var method = _ref.method,
33
32
  payload = _ref.payload;
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _events = _interopRequireDefault(require("@algolia/events"));
8
8
  var _algoliasearchHelper = _interopRequireDefault(require("algoliasearch-helper"));
9
+ var _createInsightsMiddleware = require("../middlewares/createInsightsMiddleware");
9
10
  var _createMetadataMiddleware = require("../middlewares/createMetadataMiddleware");
10
11
  var _createRouterMiddleware = require("../middlewares/createRouterMiddleware");
11
12
  var _index = _interopRequireDefault(require("../widgets/index/index"));
@@ -112,6 +113,8 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
112
113
  initialUiState = _options$initialUiSta === void 0 ? {} : _options$initialUiSta,
113
114
  _options$routing = options.routing,
114
115
  routing = _options$routing === void 0 ? null : _options$routing,
116
+ _options$insights = options.insights,
117
+ insights = _options$insights === void 0 ? false : _options$insights,
115
118
  searchFunction = options.searchFunction,
116
119
  _options$stalledSearc = options.stalledSearchDelay,
117
120
  stalledSearchDelay = _options$stalledSearc === void 0 ? 200 : _options$stalledSearc,
@@ -167,11 +170,22 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
167
170
  }
168
171
  _this.sendEventToInsights = _utils.noop;
169
172
  if (routing) {
170
- var routerOptions = typeof routing === 'boolean' ? undefined : routing;
173
+ var routerOptions = typeof routing === 'boolean' ? {} : routing;
174
+ routerOptions.$$internal = true;
171
175
  _this.use((0, _createRouterMiddleware.createRouterMiddleware)(routerOptions));
172
176
  }
177
+
178
+ // This is the default middleware,
179
+ // any user-provided middleware will be added later and override this one.
180
+ if (insights) {
181
+ var insightsOptions = typeof insights === 'boolean' ? {} : insights;
182
+ insightsOptions.$$internal = true;
183
+ _this.use((0, _createInsightsMiddleware.createInsightsMiddleware)(insightsOptions));
184
+ }
173
185
  if ((0, _createMetadataMiddleware.isMetadataEnabled)()) {
174
- _this.use((0, _createMetadataMiddleware.createMetadataMiddleware)());
186
+ _this.use((0, _createMetadataMiddleware.createMetadataMiddleware)({
187
+ $$internal: true
188
+ }));
175
189
  }
176
190
  return _this;
177
191
  }
@@ -207,6 +221,8 @@ var InstantSearch = /*#__PURE__*/function (_EventEmitter) {
207
221
  }
208
222
  var newMiddlewareList = middleware.map(function (fn) {
209
223
  var newMiddleware = _objectSpread({
224
+ $$type: '__unknown__',
225
+ $$internal: false,
210
226
  subscribe: _utils.noop,
211
227
  started: _utils.noop,
212
228
  unsubscribe: _utils.noop,
@@ -3,11 +3,40 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
6
+ exports.createInsightsEventHandler = void 0;
7
+ exports.default = withInsightsListener;
7
8
  var _preact = require("preact");
8
9
  var _insights = require("../../helpers/insights");
9
10
  var _utils = require("../utils");
10
- var findInsightsTarget = function findInsightsTarget(startElement, endElement, validator) {
11
+ var createInsightsEventHandler = function createInsightsEventHandler(_ref) {
12
+ var insights = _ref.insights,
13
+ sendEvent = _ref.sendEvent;
14
+ return function (event) {
15
+ // new way, e.g. bindEvent("click", hit, "Hit clicked")
16
+ var insightsThroughSendEvent = findInsightsTarget(event.target, event.currentTarget, function (element) {
17
+ return element.hasAttribute('data-insights-event');
18
+ });
19
+ if (insightsThroughSendEvent) {
20
+ var payload = parseInsightsEvent(insightsThroughSendEvent);
21
+ payload.forEach(function (single) {
22
+ return sendEvent(single);
23
+ });
24
+ }
25
+
26
+ // old way, e.g. instantsearch.insights("clickedObjectIDsAfterSearch", { .. })
27
+ var insightsThroughFunction = findInsightsTarget(event.target, event.currentTarget, function (element) {
28
+ return element.hasAttribute('data-insights-method') && element.hasAttribute('data-insights-payload');
29
+ });
30
+ if (insightsThroughFunction) {
31
+ var _readDataAttributes = (0, _insights.readDataAttributes)(insightsThroughFunction),
32
+ method = _readDataAttributes.method,
33
+ _payload = _readDataAttributes.payload;
34
+ insights(method, _payload);
35
+ }
36
+ };
37
+ };
38
+ exports.createInsightsEventHandler = createInsightsEventHandler;
39
+ function findInsightsTarget(startElement, endElement, validator) {
11
40
  var element = startElement;
12
41
  while (element && !validator(element)) {
13
42
  if (element === endElement) {
@@ -16,8 +45,8 @@ var findInsightsTarget = function findInsightsTarget(startElement, endElement, v
16
45
  element = element.parentElement;
17
46
  }
18
47
  return element;
19
- };
20
- var parseInsightsEvent = function parseInsightsEvent(element) {
48
+ }
49
+ function parseInsightsEvent(element) {
21
50
  var serializedPayload = element.getAttribute('data-insights-event');
22
51
  if (typeof serializedPayload !== 'string') {
23
52
  throw new Error('The insights middleware expects `data-insights-event` to be a base64-encoded JSON string.');
@@ -27,39 +56,17 @@ var parseInsightsEvent = function parseInsightsEvent(element) {
27
56
  } catch (error) {
28
57
  throw new Error('The insights middleware was unable to parse `data-insights-event`.');
29
58
  }
30
- };
31
- var insightsListener = function insightsListener(BaseComponent) {
32
- function WithInsightsListener(props) {
33
- var handleClick = function handleClick(event) {
34
- if (props.sendEvent) {
35
- // new way with insights middleware
36
- var targetWithEvent = findInsightsTarget(event.target, event.currentTarget, function (element) {
37
- return element.hasAttribute('data-insights-event');
38
- });
39
- if (targetWithEvent) {
40
- var payload = parseInsightsEvent(targetWithEvent);
41
- payload.forEach(function (single) {
42
- return props.sendEvent(single);
43
- });
44
- }
45
- }
59
+ }
46
60
 
47
- // old way, e.g. instantsearch.insights("clickedObjectIDsAfterSearch", { .. })
48
- var insightsTarget = findInsightsTarget(event.target, event.currentTarget, function (element) {
49
- return (0, _insights.hasDataAttributes)(element);
50
- });
51
- if (insightsTarget) {
52
- var _readDataAttributes = (0, _insights.readDataAttributes)(insightsTarget),
53
- method = _readDataAttributes.method,
54
- _payload = _readDataAttributes.payload;
55
- props.insights(method, _payload);
56
- }
57
- };
61
+ /**
62
+ * @deprecated use `sendEvent` directly instead
63
+ */
64
+ function withInsightsListener(BaseComponent) {
65
+ process.env.NODE_ENV === 'development' ? (0, _utils.warning)(false, 'The `withInsightsListener` function is deprecated and will be removed in the next major version. Please use `sendEvent` directly instead.') : void 0;
66
+ return function WithInsightsListener(props) {
67
+ var handleClick = createInsightsEventHandler(props);
58
68
  return (0, _preact.h)("div", {
59
69
  onClick: handleClick
60
70
  }, (0, _preact.h)(BaseComponent, props));
61
- }
62
- return WithInsightsListener;
63
- };
64
- var _default = insightsListener;
65
- exports.default = _default;
71
+ };
72
+ }
@@ -38,6 +38,7 @@ var BrowserHistory = /*#__PURE__*/function () {
38
38
  dispose = _ref.dispose,
39
39
  push = _ref.push;
40
40
  _classCallCheck(this, BrowserHistory);
41
+ _defineProperty(this, "$$type", 'ais.browser');
41
42
  _defineProperty(this, "windowTitle", void 0);
42
43
  _defineProperty(this, "writeDelay", void 0);
43
44
  _defineProperty(this, "_createURL", void 0);
@@ -24,6 +24,7 @@ function getIndexStateWithoutConfigure(uiState) {
24
24
  // which excludes "configure" as this function does.
25
25
  function simpleStateMapping() {
26
26
  return {
27
+ $$type: 'ais.simple',
27
28
  stateToRoute: function stateToRoute(uiState) {
28
29
  return Object.keys(uiState).reduce(function (state, indexId) {
29
30
  return _objectSpread(_objectSpread({}, state), {}, _defineProperty({}, indexId, getIndexStateWithoutConfigure(uiState[indexId])));
@@ -18,6 +18,7 @@ function getIndexStateWithoutConfigure(uiState) {
18
18
  }
19
19
  function singleIndexStateMapping(indexName) {
20
20
  return {
21
+ $$type: 'ais.singleIndex',
21
22
  stateToRoute: function stateToRoute(uiState) {
22
23
  return getIndexStateWithoutConfigure(uiState[indexName] || {});
23
24
  },