@amplitude/plugin-autocapture-browser 1.17.1 → 1.18.0-zen-observable-migration.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 (96) hide show
  1. package/lib/cjs/autocapture/track-action-click.d.ts +1 -1
  2. package/lib/cjs/autocapture/track-action-click.d.ts.map +1 -1
  3. package/lib/cjs/autocapture/track-action-click.js +51 -22
  4. package/lib/cjs/autocapture/track-action-click.js.map +1 -1
  5. package/lib/cjs/autocapture/track-change.d.ts +1 -1
  6. package/lib/cjs/autocapture/track-change.d.ts.map +1 -1
  7. package/lib/cjs/autocapture/track-change.js +5 -3
  8. package/lib/cjs/autocapture/track-change.js.map +1 -1
  9. package/lib/cjs/autocapture/track-click.d.ts +2 -3
  10. package/lib/cjs/autocapture/track-click.d.ts.map +1 -1
  11. package/lib/cjs/autocapture/track-click.js +6 -37
  12. package/lib/cjs/autocapture/track-click.js.map +1 -1
  13. package/lib/cjs/autocapture/track-dead-click.d.ts +2 -3
  14. package/lib/cjs/autocapture/track-dead-click.d.ts.map +1 -1
  15. package/lib/cjs/autocapture/track-dead-click.js +40 -35
  16. package/lib/cjs/autocapture/track-dead-click.js.map +1 -1
  17. package/lib/cjs/autocapture/track-rage-click.d.ts +3 -3
  18. package/lib/cjs/autocapture/track-rage-click.d.ts.map +1 -1
  19. package/lib/cjs/autocapture/track-rage-click.js +61 -48
  20. package/lib/cjs/autocapture/track-rage-click.js.map +1 -1
  21. package/lib/cjs/autocapture-plugin.d.ts +9 -3
  22. package/lib/cjs/autocapture-plugin.d.ts.map +1 -1
  23. package/lib/cjs/autocapture-plugin.js +40 -11
  24. package/lib/cjs/autocapture-plugin.js.map +1 -1
  25. package/lib/cjs/frustration-plugin.d.ts +8 -1
  26. package/lib/cjs/frustration-plugin.d.ts.map +1 -1
  27. package/lib/cjs/frustration-plugin.js +21 -16
  28. package/lib/cjs/frustration-plugin.js.map +1 -1
  29. package/lib/cjs/observables.d.ts +7 -3
  30. package/lib/cjs/observables.d.ts.map +1 -1
  31. package/lib/cjs/observables.js +37 -13
  32. package/lib/cjs/observables.js.map +1 -1
  33. package/lib/cjs/version.d.ts +1 -1
  34. package/lib/cjs/version.d.ts.map +1 -1
  35. package/lib/cjs/version.js +1 -1
  36. package/lib/cjs/version.js.map +1 -1
  37. package/lib/esm/autocapture/track-action-click.d.ts +1 -1
  38. package/lib/esm/autocapture/track-action-click.d.ts.map +1 -1
  39. package/lib/esm/autocapture/track-action-click.js +51 -22
  40. package/lib/esm/autocapture/track-action-click.js.map +1 -1
  41. package/lib/esm/autocapture/track-change.d.ts +1 -1
  42. package/lib/esm/autocapture/track-change.d.ts.map +1 -1
  43. package/lib/esm/autocapture/track-change.js +5 -3
  44. package/lib/esm/autocapture/track-change.js.map +1 -1
  45. package/lib/esm/autocapture/track-click.d.ts +2 -3
  46. package/lib/esm/autocapture/track-click.d.ts.map +1 -1
  47. package/lib/esm/autocapture/track-click.js +7 -38
  48. package/lib/esm/autocapture/track-click.js.map +1 -1
  49. package/lib/esm/autocapture/track-dead-click.d.ts +2 -3
  50. package/lib/esm/autocapture/track-dead-click.d.ts.map +1 -1
  51. package/lib/esm/autocapture/track-dead-click.js +40 -34
  52. package/lib/esm/autocapture/track-dead-click.js.map +1 -1
  53. package/lib/esm/autocapture/track-rage-click.d.ts +3 -3
  54. package/lib/esm/autocapture/track-rage-click.d.ts.map +1 -1
  55. package/lib/esm/autocapture/track-rage-click.js +62 -49
  56. package/lib/esm/autocapture/track-rage-click.js.map +1 -1
  57. package/lib/esm/autocapture-plugin.d.ts +9 -3
  58. package/lib/esm/autocapture-plugin.d.ts.map +1 -1
  59. package/lib/esm/autocapture-plugin.js +42 -13
  60. package/lib/esm/autocapture-plugin.js.map +1 -1
  61. package/lib/esm/frustration-plugin.d.ts +8 -1
  62. package/lib/esm/frustration-plugin.d.ts.map +1 -1
  63. package/lib/esm/frustration-plugin.js +24 -19
  64. package/lib/esm/frustration-plugin.js.map +1 -1
  65. package/lib/esm/observables.d.ts +7 -3
  66. package/lib/esm/observables.d.ts.map +1 -1
  67. package/lib/esm/observables.js +35 -12
  68. package/lib/esm/observables.js.map +1 -1
  69. package/lib/esm/version.d.ts +1 -1
  70. package/lib/esm/version.d.ts.map +1 -1
  71. package/lib/esm/version.js +1 -1
  72. package/lib/esm/version.js.map +1 -1
  73. package/lib/scripts/amplitude-min.js +1 -1
  74. package/lib/scripts/amplitude-min.js.gz +0 -0
  75. package/lib/scripts/amplitude-min.js.map +1 -1
  76. package/lib/scripts/amplitude-min.umd.js +1 -1
  77. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  78. package/lib/scripts/autocapture/track-action-click.d.ts +1 -1
  79. package/lib/scripts/autocapture/track-action-click.d.ts.map +1 -1
  80. package/lib/scripts/autocapture/track-change.d.ts +1 -1
  81. package/lib/scripts/autocapture/track-change.d.ts.map +1 -1
  82. package/lib/scripts/autocapture/track-click.d.ts +2 -3
  83. package/lib/scripts/autocapture/track-click.d.ts.map +1 -1
  84. package/lib/scripts/autocapture/track-dead-click.d.ts +2 -3
  85. package/lib/scripts/autocapture/track-dead-click.d.ts.map +1 -1
  86. package/lib/scripts/autocapture/track-rage-click.d.ts +3 -3
  87. package/lib/scripts/autocapture/track-rage-click.d.ts.map +1 -1
  88. package/lib/scripts/autocapture-plugin.d.ts +9 -3
  89. package/lib/scripts/autocapture-plugin.d.ts.map +1 -1
  90. package/lib/scripts/frustration-plugin.d.ts +8 -1
  91. package/lib/scripts/frustration-plugin.d.ts.map +1 -1
  92. package/lib/scripts/observables.d.ts +7 -3
  93. package/lib/scripts/observables.d.ts.map +1 -1
  94. package/lib/scripts/version.d.ts +1 -1
  95. package/lib/scripts/version.d.ts.map +1 -1
  96. package/package.json +3 -3
@@ -8,5 +8,5 @@ export declare function trackActionClick({ amplitude, allObservables, options, g
8
8
  getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;
9
9
  shouldTrackActionClick: shouldTrackEvent;
10
10
  shouldTrackEvent: shouldTrackEvent;
11
- }): import("rxjs").Subscription;
11
+ }): ZenObservable.Subscription | undefined;
12
12
  //# sourceMappingURL=track-action-click.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"track-action-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-action-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAmB,MAAM,wBAAwB,CAAC;AAE/G,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAIL,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAGpB,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,cAAc,EACd,OAAO,EACP,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,GACvB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,OAAO,EAAE,8BAA8B,CAAC;IACxC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,sBAAsB,EAAE,gBAAgB,CAAC;IACzC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,+BAsDA"}
1
+ {"version":3,"file":"track-action-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-action-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,UAAU,EAAmB,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAIL,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAGpB,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,cAAc,EACd,OAAO,EACP,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,GACvB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,OAAO,EAAE,8BAA8B,CAAC;IACxC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,sBAAsB,EAAE,gBAAgB,CAAC;IACzC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,0CA2EA"}
@@ -1,17 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.trackActionClick = void 0;
4
- var tslib_1 = require("tslib");
5
- var rxjs_1 = require("rxjs");
4
+ var analytics_core_1 = require("@amplitude/analytics-core");
6
5
  var helpers_1 = require("../helpers");
7
6
  var constants_1 = require("../constants");
8
7
  function trackActionClick(_a) {
9
8
  var amplitude = _a.amplitude, allObservables = _a.allObservables, options = _a.options, getEventProperties = _a.getEventProperties, shouldTrackEvent = _a.shouldTrackEvent, shouldTrackActionClick = _a.shouldTrackActionClick;
10
- var clickObservable = allObservables.clickObservable, mutationObservable = allObservables.mutationObservable, navigateObservable = allObservables.navigateObservable;
11
- var filteredClickObservable = clickObservable.pipe((0, rxjs_1.filter)(function (click) {
12
- // Filter out regularly tracked click events that are already handled in trackClicks
9
+ var clickObservableZen = allObservables.clickObservableZen, mutationObservableZen = allObservables.mutationObservableZen, navigateObservableZen = allObservables.navigateObservableZen;
10
+ // TODO: remove this once we're ready for ZenObservable and they become not optional
11
+ /* istanbul ignore if */
12
+ if (!clickObservableZen || !mutationObservableZen) {
13
+ return;
14
+ }
15
+ var filteredClickObservable = clickObservableZen
16
+ .filter(function (click) {
13
17
  return !shouldTrackEvent('click', click.closestTrackedAncestor);
14
- }), (0, rxjs_1.map)(function (click) {
18
+ })
19
+ .map(function (click) {
15
20
  // overwrite the closestTrackedAncestor with the closest element that is on the actionClickAllowlist
16
21
  var closestActionClickEl = (0, helpers_1.getClosestElement)(click.event.target, options.actionClickAllowlist);
17
22
  click.closestTrackedAncestor = closestActionClickEl;
@@ -20,24 +25,48 @@ function trackActionClick(_a) {
20
25
  click.targetElementProperties = getEventProperties(click.type, click.closestTrackedAncestor);
21
26
  }
22
27
  return click;
23
- }), (0, rxjs_1.filter)(helpers_1.filterOutNonTrackableEvents), (0, rxjs_1.filter)(function (clickEvent) {
28
+ })
29
+ .filter(helpers_1.filterOutNonTrackableEvents)
30
+ .filter(function (clickEvent) {
24
31
  // Only track change on elements that should be tracked
25
32
  return shouldTrackActionClick('click', clickEvent.closestTrackedAncestor);
26
- }));
27
- var changeObservables = [mutationObservable];
28
- /* istanbul ignore next */
29
- if (navigateObservable) {
30
- changeObservables.push(navigateObservable);
31
- }
32
- var mutationOrNavigate = rxjs_1.merge.apply(void 0, tslib_1.__spreadArray([], tslib_1.__read(changeObservables), false));
33
- var actionClicks = filteredClickObservable.pipe(
34
- // If a mutation occurs within 0.5 seconds of a click event (timeout({ first: 500 })), it emits the original first click event.
35
- // take 1 to only limit the action events in case there are multiple
36
- (0, rxjs_1.switchMap)(function (click) {
37
- return mutationOrNavigate.pipe((0, rxjs_1.take)(1), (0, rxjs_1.timeout)({ first: 500, with: function () { return rxjs_1.EMPTY; } }), // in case of timeout, map to empty to prevent any click from being emitted
38
- (0, rxjs_1.map)(function () { return click; }));
39
- }));
40
- return actionClicks.subscribe(function (actionClick) {
33
+ });
34
+ var mutationOrNavigate = navigateObservableZen
35
+ ? (0, analytics_core_1.merge)(mutationObservableZen, navigateObservableZen)
36
+ : mutationObservableZen;
37
+ var clickMutationNavigateObservable = (0, analytics_core_1.merge)(filteredClickObservable, mutationOrNavigate);
38
+ var actionClickTimer = null;
39
+ var lastClickEvent = null;
40
+ var actionClickObservable = (0, analytics_core_1.asyncMap)(clickMutationNavigateObservable, function (event) {
41
+ // clear any previous timer
42
+ if (actionClickTimer) {
43
+ clearTimeout(actionClickTimer);
44
+ actionClickTimer = null;
45
+ }
46
+ if (event.type === 'click') {
47
+ // mark the 'last click event'
48
+ lastClickEvent = event;
49
+ // set a timer to clear last click event if no mutation event between now and 500ms
50
+ actionClickTimer = setTimeout(function () {
51
+ actionClickTimer = null;
52
+ lastClickEvent = null;
53
+ return null;
54
+ }, 500);
55
+ return Promise.resolve(null);
56
+ }
57
+ else {
58
+ // if mutation/navigation + last click event, then it's an action click
59
+ if (lastClickEvent) {
60
+ var event_1 = lastClickEvent;
61
+ lastClickEvent = null;
62
+ return Promise.resolve(event_1);
63
+ }
64
+ }
65
+ return Promise.resolve(null);
66
+ });
67
+ return actionClickObservable.subscribe(function (actionClick) {
68
+ if (!actionClick)
69
+ return;
41
70
  /* istanbul ignore next */
42
71
  amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(constants_1.AMPLITUDE_ELEMENT_CLICKED_EVENT, getEventProperties('click', actionClick.closestTrackedAncestor));
43
72
  });
@@ -1 +1 @@
1
- {"version":3,"file":"track-action-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-action-click.ts"],"names":[],"mappings":";;;;AACA,6BAA2E;AAE3E,sCAKoB;AACpB,0CAA+D;AAE/D,SAAgB,gBAAgB,CAAC,EAchC;QAbC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,kBAAkB,wBAAA,EAClB,gBAAgB,sBAAA,EAChB,sBAAsB,4BAAA;IASd,IAAA,eAAe,GAA6C,cAAc,gBAA3D,EAAE,kBAAkB,GAAyB,cAAc,mBAAvC,EAAE,kBAAkB,GAAK,cAAc,mBAAnB,CAAoB;IAEnF,IAAM,uBAAuB,GAAG,eAAe,CAAC,IAAI,CAClD,IAAA,aAAM,EAAC,UAAC,KAAK;QACX,oFAAoF;QACpF,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAClE,CAAC,CAAC,EACF,IAAA,UAAG,EAAC,UAAC,KAAK;QACR,oGAAoG;QACpG,IAAM,oBAAoB,GAAG,IAAA,2BAAiB,EAAC,KAAK,CAAC,KAAK,CAAC,MAAiB,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC5G,KAAK,CAAC,sBAAsB,GAAG,oBAA+B,CAAC;QAE/D,wFAAwF;QACxF,IAAI,KAAK,CAAC,sBAAsB,KAAK,IAAI,EAAE;YACzC,KAAK,CAAC,uBAAuB,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;SAC9F;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,EACF,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,UAAU;QAChB,uDAAuD;QACvD,OAAO,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC5E,CAAC,CAAC,CACH,CAAC;IAEF,IAAM,iBAAiB,GAEnB,CAAC,kBAAkB,CAAC,CAAC;IACzB,0BAA0B;IAC1B,IAAI,kBAAkB,EAAE;QACtB,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;KAC5C;IACD,IAAM,kBAAkB,GAAG,YAAK,wDAAI,iBAAiB,UAAC,CAAC;IAEvD,IAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI;IAC/C,+HAA+H;IAC/H,oEAAoE;IACpE,IAAA,gBAAS,EAAC,UAAC,KAAK;QACd,OAAA,kBAAkB,CAAC,IAAI,CACrB,IAAA,WAAI,EAAC,CAAC,CAAC,EACP,IAAA,cAAO,EAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,cAAM,OAAA,YAAK,EAAL,CAAK,EAAE,CAAC,EAAE,2EAA2E;QACvH,IAAA,UAAG,EAAC,cAAM,OAAA,KAAK,EAAL,CAAK,CAAC,CACjB;IAJD,CAIC,CACF,CACF,CAAC;IAEF,OAAO,YAAY,CAAC,SAAS,CAAC,UAAC,WAAW;QACxC,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CACd,2CAA+B,EAC/B,kBAAkB,CAAC,OAAO,EAAG,WAAwD,CAAC,sBAAsB,CAAC,CAC9G,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AApED,4CAoEC","sourcesContent":["import { AllWindowObservables, AutoCaptureOptionsWithDefaults, ObservablesEnum } from 'src/autocapture-plugin';\nimport { filter, map, merge, switchMap, take, timeout, EMPTY } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport {\n ElementBasedTimestampedEvent,\n filterOutNonTrackableEvents,\n getClosestElement,\n shouldTrackEvent,\n} from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nexport function trackActionClick({\n amplitude,\n allObservables,\n options,\n getEventProperties,\n shouldTrackEvent,\n shouldTrackActionClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n options: AutoCaptureOptionsWithDefaults;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackActionClick: shouldTrackEvent;\n shouldTrackEvent: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable } = allObservables;\n\n const filteredClickObservable = clickObservable.pipe(\n filter((click) => {\n // Filter out regularly tracked click events that are already handled in trackClicks\n return !shouldTrackEvent('click', click.closestTrackedAncestor);\n }),\n map((click) => {\n // overwrite the closestTrackedAncestor with the closest element that is on the actionClickAllowlist\n const closestActionClickEl = getClosestElement(click.event.target as Element, options.actionClickAllowlist);\n click.closestTrackedAncestor = closestActionClickEl as Element;\n\n // overwrite the targetElementProperties with the properties of the closestActionClickEl\n if (click.closestTrackedAncestor !== null) {\n click.targetElementProperties = getEventProperties(click.type, click.closestTrackedAncestor);\n }\n return click;\n }),\n filter(filterOutNonTrackableEvents),\n filter((clickEvent) => {\n // Only track change on elements that should be tracked\n return shouldTrackActionClick('click', clickEvent.closestTrackedAncestor);\n }),\n );\n\n const changeObservables: Array<\n AllWindowObservables[ObservablesEnum.MutationObservable] | AllWindowObservables[ObservablesEnum.NavigateObservable]\n > = [mutationObservable];\n /* istanbul ignore next */\n if (navigateObservable) {\n changeObservables.push(navigateObservable);\n }\n const mutationOrNavigate = merge(...changeObservables);\n\n const actionClicks = filteredClickObservable.pipe(\n // If a mutation occurs within 0.5 seconds of a click event (timeout({ first: 500 })), it emits the original first click event.\n // take 1 to only limit the action events in case there are multiple\n switchMap((click) =>\n mutationOrNavigate.pipe(\n take(1),\n timeout({ first: 500, with: () => EMPTY }), // in case of timeout, map to empty to prevent any click from being emitted\n map(() => click),\n ),\n ),\n );\n\n return actionClicks.subscribe((actionClick) => {\n /* istanbul ignore next */\n amplitude?.track(\n AMPLITUDE_ELEMENT_CLICKED_EVENT,\n getEventProperties('click', (actionClick as ElementBasedTimestampedEvent<MouseEvent>).closestTrackedAncestor),\n );\n });\n}\n"]}
1
+ {"version":3,"file":"track-action-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-action-click.ts"],"names":[],"mappings":";;;AACA,4DAAuF;AACvF,sCAMoB;AACpB,0CAA+D;AAE/D,SAAgB,gBAAgB,CAAC,EAchC;QAbC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,kBAAkB,wBAAA,EAClB,gBAAgB,sBAAA,EAChB,sBAAsB,4BAAA;IASd,IAAA,kBAAkB,GAAmD,cAAc,mBAAjE,EAAE,qBAAqB,GAA4B,cAAc,sBAA1C,EAAE,qBAAqB,GAAK,cAAc,sBAAnB,CAAoB;IAE5F,oFAAoF;IACpF,wBAAwB;IACxB,IAAI,CAAC,kBAAkB,IAAI,CAAC,qBAAqB,EAAE;QACjD,OAAO;KACR;IAED,IAAM,uBAAuB,GAAG,kBAAkB;SAC/C,MAAM,CAAC,UAAC,KAAK;QACZ,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAClE,CAAC,CAAC;SACD,GAAG,CAAC,UAAC,KAAK;QACT,oGAAoG;QACpG,IAAM,oBAAoB,GAAG,IAAA,2BAAiB,EAAC,KAAK,CAAC,KAAK,CAAC,MAAiB,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC5G,KAAK,CAAC,sBAAsB,GAAG,oBAA+B,CAAC;QAE/D,wFAAwF;QACxF,IAAI,KAAK,CAAC,sBAAsB,KAAK,IAAI,EAAE;YACzC,KAAK,CAAC,uBAAuB,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;SAC9F;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;SACD,MAAM,CAAC,qCAA2B,CAAC;SACnC,MAAM,CAAC,UAAC,UAAU;QACjB,uDAAuD;QACvD,OAAO,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEL,IAAM,kBAAkB,GAAG,qBAAqB;QAC9C,CAAC,CAAC,IAAA,sBAAK,EAAC,qBAAqB,EAAE,qBAAqB,CAAC;QACrD,CAAC,CAAC,qBAAqB,CAAC;IAE1B,IAAM,+BAA+B,GAAG,IAAA,sBAAK,EAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;IAE3F,IAAI,gBAAgB,GAAyC,IAAI,CAAC;IAClE,IAAI,cAAc,GAAiC,IAAI,CAAC;IAExD,IAAM,qBAAqB,GAAG,IAAA,yBAAQ,EAAC,+BAA+B,EAAE,UAAC,KAAK;QAC5E,2BAA2B;QAC3B,IAAI,gBAAgB,EAAE;YACpB,YAAY,CAAC,gBAAgB,CAAC,CAAC;YAC/B,gBAAgB,GAAG,IAAI,CAAC;SACzB;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;YAC1B,8BAA8B;YAC9B,cAAc,GAAG,KAAK,CAAC;YAEvB,mFAAmF;YACnF,gBAAgB,GAAG,UAAU,CAAC;gBAC5B,gBAAgB,GAAG,IAAI,CAAC;gBACxB,cAAc,GAAG,IAAI,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC,EAAE,GAAG,CAAC,CAAC;YACR,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC9B;aAAM;YACL,uEAAuE;YACvE,IAAI,cAAc,EAAE;gBAClB,IAAM,OAAK,GAAG,cAAc,CAAC;gBAC7B,cAAc,GAAG,IAAI,CAAC;gBACtB,OAAO,OAAO,CAAC,OAAO,CAAC,OAAK,CAAC,CAAC;aAC/B;SACF;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,OAAO,qBAAqB,CAAC,SAAS,CAAC,UAAC,WAAW;QACjD,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CACd,2CAA+B,EAC/B,kBAAkB,CAAC,OAAO,EAAG,WAAwD,CAAC,sBAAsB,CAAC,CAC9G,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAzFD,4CAyFC","sourcesContent":["import { AllWindowObservables, AutoCaptureOptionsWithDefaults } from 'src/autocapture-plugin';\nimport { BrowserClient, ActionType, merge, asyncMap } from '@amplitude/analytics-core';\nimport {\n ElementBasedTimestampedEvent,\n filterOutNonTrackableEvents,\n getClosestElement,\n shouldTrackEvent,\n TimestampedEvent,\n} from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nexport function trackActionClick({\n amplitude,\n allObservables,\n options,\n getEventProperties,\n shouldTrackEvent,\n shouldTrackActionClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n options: AutoCaptureOptionsWithDefaults;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackActionClick: shouldTrackEvent;\n shouldTrackEvent: shouldTrackEvent;\n}) {\n const { clickObservableZen, mutationObservableZen, navigateObservableZen } = allObservables;\n\n // TODO: remove this once we're ready for ZenObservable and they become not optional\n /* istanbul ignore if */\n if (!clickObservableZen || !mutationObservableZen) {\n return;\n }\n\n const filteredClickObservable = clickObservableZen\n .filter((click) => {\n return !shouldTrackEvent('click', click.closestTrackedAncestor);\n })\n .map((click) => {\n // overwrite the closestTrackedAncestor with the closest element that is on the actionClickAllowlist\n const closestActionClickEl = getClosestElement(click.event.target as Element, options.actionClickAllowlist);\n click.closestTrackedAncestor = closestActionClickEl as Element;\n\n // overwrite the targetElementProperties with the properties of the closestActionClickEl\n if (click.closestTrackedAncestor !== null) {\n click.targetElementProperties = getEventProperties(click.type, click.closestTrackedAncestor);\n }\n return click;\n })\n .filter(filterOutNonTrackableEvents)\n .filter((clickEvent) => {\n // Only track change on elements that should be tracked\n return shouldTrackActionClick('click', clickEvent.closestTrackedAncestor);\n });\n\n const mutationOrNavigate = navigateObservableZen\n ? merge(mutationObservableZen, navigateObservableZen)\n : mutationObservableZen;\n\n const clickMutationNavigateObservable = merge(filteredClickObservable, mutationOrNavigate);\n\n let actionClickTimer: ReturnType<typeof setTimeout> | null = null;\n let lastClickEvent: TimestampedEvent<any> | null = null;\n\n const actionClickObservable = asyncMap(clickMutationNavigateObservable, (event) => {\n // clear any previous timer\n if (actionClickTimer) {\n clearTimeout(actionClickTimer);\n actionClickTimer = null;\n }\n if (event.type === 'click') {\n // mark the 'last click event'\n lastClickEvent = event;\n\n // set a timer to clear last click event if no mutation event between now and 500ms\n actionClickTimer = setTimeout(() => {\n actionClickTimer = null;\n lastClickEvent = null;\n return null;\n }, 500);\n return Promise.resolve(null);\n } else {\n // if mutation/navigation + last click event, then it's an action click\n if (lastClickEvent) {\n const event = lastClickEvent;\n lastClickEvent = null;\n return Promise.resolve(event);\n }\n }\n return Promise.resolve(null);\n });\n\n return actionClickObservable.subscribe((actionClick) => {\n if (!actionClick) return;\n /* istanbul ignore next */\n amplitude?.track(\n AMPLITUDE_ELEMENT_CLICKED_EVENT,\n getEventProperties('click', (actionClick as ElementBasedTimestampedEvent<MouseEvent>).closestTrackedAncestor),\n );\n });\n}\n"]}
@@ -8,5 +8,5 @@ export declare function trackChange({ amplitude, allObservables, getEventPropert
8
8
  getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;
9
9
  shouldTrackEvent: shouldTrackEvent;
10
10
  evaluateTriggers: evaluateTriggersFn;
11
- }): import("rxjs").Subscription;
11
+ }): ZenObservable.Subscription;
12
12
  //# sourceMappingURL=track-change.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"track-change.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-change.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG3E,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,kBAAkB,CAAC;CACtC,+BAgBA"}
1
+ {"version":3,"file":"track-change.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-change.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAgC,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG3E,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,kBAAkB,CAAC;CACtC,8BAeA"}
@@ -1,16 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.trackChange = void 0;
4
- var rxjs_1 = require("rxjs");
5
4
  var helpers_1 = require("../helpers");
6
5
  var constants_1 = require("../constants");
7
6
  function trackChange(_a) {
8
7
  var amplitude = _a.amplitude, allObservables = _a.allObservables, getEventProperties = _a.getEventProperties, shouldTrackEvent = _a.shouldTrackEvent, evaluateTriggers = _a.evaluateTriggers;
9
8
  var changeObservable = allObservables.changeObservable;
10
- var filteredChangeObservable = changeObservable.pipe((0, rxjs_1.filter)(helpers_1.filterOutNonTrackableEvents), (0, rxjs_1.filter)(function (changeEvent) {
9
+ var filteredChangeObservable = changeObservable
10
+ .filter(helpers_1.filterOutNonTrackableEvents)
11
+ .filter(function (changeEvent) {
11
12
  // Only track change on elements that should be tracked,
12
13
  return shouldTrackEvent('change', changeEvent.closestTrackedAncestor);
13
- }), (0, rxjs_1.map)(function (changeEvent) { return evaluateTriggers(changeEvent); }));
14
+ })
15
+ .map(function (changeEvent) { return evaluateTriggers(changeEvent); });
14
16
  return filteredChangeObservable.subscribe(function (changeEvent) {
15
17
  /* istanbul ignore next */
16
18
  amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(constants_1.AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', changeEvent.closestTrackedAncestor));
@@ -1 +1 @@
1
- {"version":3,"file":"track-change.js","sourceRoot":"","sources":["../../../src/autocapture/track-change.ts"],"names":[],"mappings":";;;AAEA,6BAAmC;AAEnC,sCAA2E;AAC3E,0CAA+D;AAE/D,SAAgB,WAAW,CAAC,EAY3B;QAXC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,kBAAkB,wBAAA,EAClB,gBAAgB,sBAAA,EAChB,gBAAgB,sBAAA;IAQR,IAAA,gBAAgB,GAAK,cAAc,iBAAnB,CAAoB;IAE5C,IAAM,wBAAwB,GAAG,gBAAgB,CAAC,IAAI,CACpD,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,WAAW;QACjB,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC;IACxE,CAAC,CAAC,EACF,IAAA,UAAG,EAAC,UAAC,WAAW,IAAK,OAAA,gBAAgB,CAAC,WAAW,CAAC,EAA7B,CAA6B,CAAC,CACpD,CAAC;IAEF,OAAO,wBAAwB,CAAC,SAAS,CAAC,UAAC,WAAW;QACpD,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,2CAA+B,EAAE,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;AACL,CAAC;AA5BD,kCA4BC","sourcesContent":["import { AllWindowObservables } from 'src/autocapture-plugin';\nimport { type evaluateTriggersFn } from 'src/helpers';\nimport { filter, map } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CHANGED_EVENT } from '../constants';\n\nexport function trackChange({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackEvent,\n evaluateTriggers,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackEvent: shouldTrackEvent;\n evaluateTriggers: evaluateTriggersFn;\n}) {\n const { changeObservable } = allObservables;\n\n const filteredChangeObservable = changeObservable.pipe(\n filter(filterOutNonTrackableEvents),\n filter((changeEvent) => {\n // Only track change on elements that should be tracked,\n return shouldTrackEvent('change', changeEvent.closestTrackedAncestor);\n }),\n map((changeEvent) => evaluateTriggers(changeEvent)),\n );\n\n return filteredChangeObservable.subscribe((changeEvent) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', changeEvent.closestTrackedAncestor));\n });\n}\n"]}
1
+ {"version":3,"file":"track-change.js","sourceRoot":"","sources":["../../../src/autocapture/track-change.ts"],"names":[],"mappings":";;;AAGA,sCAA2E;AAC3E,0CAA+D;AAE/D,SAAgB,WAAW,CAAC,EAY3B;QAXC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,kBAAkB,wBAAA,EAClB,gBAAgB,sBAAA,EAChB,gBAAgB,sBAAA;IAQR,IAAA,gBAAgB,GAAK,cAAc,iBAAnB,CAAoB;IAE5C,IAAM,wBAAwB,GAAG,gBAAgB;SAC9C,MAAM,CAAC,qCAA2B,CAAC;SACnC,MAAM,CAAC,UAAC,WAAgD;QACvD,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC;IACxE,CAAC,CAAC;SACD,GAAG,CAAC,UAAC,WAAW,IAAK,OAAA,gBAAgB,CAAC,WAAW,CAAC,EAA7B,CAA6B,CAAC,CAAC;IAEvD,OAAO,wBAAwB,CAAC,SAAS,CAAC,UAAC,WAAW;QACpD,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,2CAA+B,EAAE,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;AACL,CAAC;AA3BD,kCA2BC","sourcesContent":["import { AllWindowObservables } from 'src/autocapture-plugin';\nimport { ElementBasedTimestampedEvent, type evaluateTriggersFn } from 'src/helpers';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CHANGED_EVENT } from '../constants';\n\nexport function trackChange({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackEvent,\n evaluateTriggers,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackEvent: shouldTrackEvent;\n evaluateTriggers: evaluateTriggersFn;\n}) {\n const { changeObservable } = allObservables;\n\n const filteredChangeObservable = changeObservable\n .filter(filterOutNonTrackableEvents)\n .filter((changeEvent: ElementBasedTimestampedEvent<Event>) => {\n // Only track change on elements that should be tracked,\n return shouldTrackEvent('change', changeEvent.closestTrackedAncestor);\n })\n .map((changeEvent) => evaluateTriggers(changeEvent));\n\n return filteredChangeObservable.subscribe((changeEvent) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', changeEvent.closestTrackedAncestor));\n });\n}\n"]}
@@ -1,11 +1,10 @@
1
- import { AllWindowObservables, AutoCaptureOptionsWithDefaults } from 'src/autocapture-plugin';
1
+ import { AllWindowObservables } from 'src/autocapture-plugin';
2
2
  import { type evaluateTriggersFn } from 'src/helpers';
3
3
  import { BrowserClient } from '@amplitude/analytics-core';
4
4
  import { shouldTrackEvent } from '../helpers';
5
- export declare function trackClicks({ amplitude, allObservables, options, shouldTrackEvent, evaluateTriggers, }: {
5
+ export declare function trackClicks({ amplitude, allObservables, shouldTrackEvent, evaluateTriggers, }: {
6
6
  amplitude: BrowserClient;
7
7
  allObservables: AllWindowObservables;
8
- options: AutoCaptureOptionsWithDefaults;
9
8
  shouldTrackEvent: shouldTrackEvent;
10
9
  evaluateTriggers: evaluateTriggersFn;
11
10
  }): import("rxjs").Subscription;
@@ -1 +1 @@
1
- {"version":3,"file":"track-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK3E,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,OAAO,EACP,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,OAAO,EAAE,8BAA8B,CAAC;IACxC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,kBAAkB,CAAC;CACtC,+BAgDA"}
1
+ {"version":3,"file":"track-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG3E,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,kBAAkB,CAAC;CACtC,+BAiBA"}
@@ -1,51 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.trackClicks = void 0;
4
- var tslib_1 = require("tslib");
5
4
  var rxjs_1 = require("rxjs");
6
5
  var helpers_1 = require("../helpers");
7
6
  var constants_1 = require("../constants");
8
- var RAGE_CLICK_THRESHOLD = 5;
9
7
  function trackClicks(_a) {
10
- var amplitude = _a.amplitude, allObservables = _a.allObservables, options = _a.options, shouldTrackEvent = _a.shouldTrackEvent, evaluateTriggers = _a.evaluateTriggers;
8
+ var amplitude = _a.amplitude, allObservables = _a.allObservables, shouldTrackEvent = _a.shouldTrackEvent, evaluateTriggers = _a.evaluateTriggers;
11
9
  var clickObservable = allObservables.clickObservable;
12
- // Trigger if the target of the click event has changed and position is different
13
- // Keeping track of position is important to avoid false positives when the user clicks on the same
14
- // element where certain frameworks could replace the element instance between rerenders
15
- var comparisonTrigger = clickObservable.pipe((0, rxjs_1.pairwise)(), (0, rxjs_1.filter)(function (_a) {
16
- var _b = tslib_1.__read(_a, 2), prev = _b[0], current = _b[1];
17
- var targetChanged = prev.event.target !== current.event.target;
18
- /* istanbul ignore next */
19
- var samePos = Math.abs(current.event.screenX - prev.event.screenX) <= 20 &&
20
- Math.abs(current.event.screenY - prev.event.screenY) <= 20;
21
- return targetChanged && !samePos;
22
- }));
23
- // Trigger if there is no click event within 1 second
24
- var timeoutTrigger = clickObservable.pipe((0, rxjs_1.debounceTime)(options.debounceTime), (0, rxjs_1.map)(function () { return 'timeout'; }));
25
- var triggers = (0, rxjs_1.merge)(comparisonTrigger, timeoutTrigger);
26
10
  // Get buffers of clicks, if the buffer length is over 5, it is rage click
27
- var bufferedClicks = clickObservable.pipe((0, rxjs_1.delay)(0), (0, rxjs_1.filter)(helpers_1.filterOutNonTrackableEvents), (0, rxjs_1.filter)(function (click) {
11
+ var clicks = clickObservable.pipe((0, rxjs_1.filter)(helpers_1.filterOutNonTrackableEvents), (0, rxjs_1.filter)(function (click) {
28
12
  // Only track clicks on elements that should be tracked,
29
13
  return shouldTrackEvent('click', click.closestTrackedAncestor);
30
- }), (0, rxjs_1.map)(function (click) { return evaluateTriggers(click); }), (0, rxjs_1.buffer)(triggers));
31
- return bufferedClicks.subscribe(function (clicks) {
32
- var e_1, _a;
33
- // TODO: update this when rage clicks are added
34
- var clickType = clicks.length >= RAGE_CLICK_THRESHOLD ? constants_1.AMPLITUDE_ELEMENT_CLICKED_EVENT : constants_1.AMPLITUDE_ELEMENT_CLICKED_EVENT;
35
- try {
36
- for (var clicks_1 = tslib_1.__values(clicks), clicks_1_1 = clicks_1.next(); !clicks_1_1.done; clicks_1_1 = clicks_1.next()) {
37
- var click = clicks_1_1.value;
38
- /* istanbul ignore next */
39
- amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(clickType, click.targetElementProperties);
40
- }
41
- }
42
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
43
- finally {
44
- try {
45
- if (clicks_1_1 && !clicks_1_1.done && (_a = clicks_1.return)) _a.call(clicks_1);
46
- }
47
- finally { if (e_1) throw e_1.error; }
48
- }
14
+ }), (0, rxjs_1.map)(function (click) { return evaluateTriggers(click); }));
15
+ return clicks.subscribe(function (click) {
16
+ /* istanbul ignore next */
17
+ amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(constants_1.AMPLITUDE_ELEMENT_CLICKED_EVENT, click.targetElementProperties);
49
18
  });
50
19
  }
51
20
  exports.trackClicks = trackClicks;
@@ -1 +1 @@
1
- {"version":3,"file":"track-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":";;;;AAEA,6BAAiF;AAEjF,sCAA2E;AAC3E,0CAA+D;AAE/D,IAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B,SAAgB,WAAW,CAAC,EAY3B;QAXC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,gBAAgB,sBAAA,EAChB,gBAAgB,sBAAA;IAQR,IAAA,eAAe,GAAK,cAAc,gBAAnB,CAAoB;IAE3C,iFAAiF;IACjF,mGAAmG;IACnG,wFAAwF;IACxF,IAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAC5C,IAAA,eAAQ,GAAE,EACV,IAAA,aAAM,EAAC,UAAC,EAAe;YAAf,KAAA,qBAAe,EAAd,IAAI,QAAA,EAAE,OAAO,QAAA;QACpB,IAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QACjE,0BAA0B;QAC1B,IAAM,OAAO,GACX,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;YAC1D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7D,OAAO,aAAa,IAAI,CAAC,OAAO,CAAC;IACnC,CAAC,CAAC,CACH,CAAC;IAEF,qDAAqD;IACrD,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,IAAA,mBAAY,EAAC,OAAO,CAAC,YAAY,CAAC,EAClC,IAAA,UAAG,EAAC,cAAM,OAAA,SAAkB,EAAlB,CAAkB,CAAC,CAC9B,CAAC;IAEF,IAAM,QAAQ,GAAG,IAAA,YAAK,EAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAE1D,0EAA0E;IAC1E,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,IAAA,YAAK,EAAC,CAAC,CAAC,EACR,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,KAAK;QACX,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC,EACF,IAAA,UAAG,EAAC,UAAC,KAAK,IAAK,OAAA,gBAAgB,CAAC,KAAK,CAAC,EAAvB,CAAuB,CAAC,EACvC,IAAA,aAAM,EAAC,QAAQ,CAAC,CACjB,CAAC;IAEF,OAAO,cAAc,CAAC,SAAS,CAAC,UAAC,MAAM;;QACrC,+CAA+C;QAC/C,IAAM,SAAS,GACb,MAAM,CAAC,MAAM,IAAI,oBAAoB,CAAC,CAAC,CAAC,2CAA+B,CAAC,CAAC,CAAC,2CAA+B,CAAC;;YAE5G,KAAoB,IAAA,WAAA,iBAAA,MAAM,CAAA,8BAAA,kDAAE;gBAAvB,IAAM,KAAK,mBAAA;gBACd,0BAA0B;gBAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;aAC5D;;;;;;;;;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AA5DD,kCA4DC","sourcesContent":["import { AllWindowObservables, AutoCaptureOptionsWithDefaults } from 'src/autocapture-plugin';\nimport { type evaluateTriggersFn } from 'src/helpers';\nimport { buffer, filter, map, debounceTime, merge, pairwise, delay } from 'rxjs';\nimport { BrowserClient } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nconst RAGE_CLICK_THRESHOLD = 5;\n\nexport function trackClicks({\n amplitude,\n allObservables,\n options,\n shouldTrackEvent,\n evaluateTriggers,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n options: AutoCaptureOptionsWithDefaults;\n shouldTrackEvent: shouldTrackEvent;\n evaluateTriggers: evaluateTriggersFn;\n}) {\n const { clickObservable } = allObservables;\n\n // Trigger if the target of the click event has changed and position is different\n // Keeping track of position is important to avoid false positives when the user clicks on the same\n // element where certain frameworks could replace the element instance between rerenders\n const comparisonTrigger = clickObservable.pipe(\n pairwise(),\n filter(([prev, current]) => {\n const targetChanged = prev.event.target !== current.event.target;\n /* istanbul ignore next */\n const samePos =\n Math.abs(current.event.screenX - prev.event.screenX) <= 20 &&\n Math.abs(current.event.screenY - prev.event.screenY) <= 20;\n return targetChanged && !samePos;\n }),\n );\n\n // Trigger if there is no click event within 1 second\n const timeoutTrigger = clickObservable.pipe(\n debounceTime(options.debounceTime),\n map(() => 'timeout' as const),\n );\n\n const triggers = merge(comparisonTrigger, timeoutTrigger);\n\n // Get buffers of clicks, if the buffer length is over 5, it is rage click\n const bufferedClicks = clickObservable.pipe(\n delay(0),\n filter(filterOutNonTrackableEvents),\n filter((click) => {\n // Only track clicks on elements that should be tracked,\n return shouldTrackEvent('click', click.closestTrackedAncestor);\n }),\n map((click) => evaluateTriggers(click)),\n buffer(triggers),\n );\n\n return bufferedClicks.subscribe((clicks) => {\n // TODO: update this when rage clicks are added\n const clickType =\n clicks.length >= RAGE_CLICK_THRESHOLD ? AMPLITUDE_ELEMENT_CLICKED_EVENT : AMPLITUDE_ELEMENT_CLICKED_EVENT;\n\n for (const click of clicks) {\n /* istanbul ignore next */\n amplitude?.track(clickType, click.targetElementProperties);\n }\n });\n}\n"]}
1
+ {"version":3,"file":"track-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":";;;AAEA,6BAAmC;AAEnC,sCAA2E;AAC3E,0CAA+D;AAE/D,SAAgB,WAAW,CAAC,EAU3B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,gBAAgB,sBAAA,EAChB,gBAAgB,sBAAA;IAOR,IAAA,eAAe,GAAK,cAAc,gBAAnB,CAAoB;IAE3C,0EAA0E;IAC1E,IAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CACjC,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,KAAK;QACX,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC,EACF,IAAA,UAAG,EAAC,UAAC,KAAK,IAAK,OAAA,gBAAgB,CAAC,KAAK,CAAC,EAAvB,CAAuB,CAAC,CACxC,CAAC;IAEF,OAAO,MAAM,CAAC,SAAS,CAAC,UAAC,KAAK;QAC5B,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,2CAA+B,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC;AA3BD,kCA2BC","sourcesContent":["import { AllWindowObservables } from 'src/autocapture-plugin';\nimport { type evaluateTriggersFn } from 'src/helpers';\nimport { filter, map } from 'rxjs';\nimport { BrowserClient } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nexport function trackClicks({\n amplitude,\n allObservables,\n shouldTrackEvent,\n evaluateTriggers,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n shouldTrackEvent: shouldTrackEvent;\n evaluateTriggers: evaluateTriggersFn;\n}) {\n const { clickObservable } = allObservables;\n\n // Get buffers of clicks, if the buffer length is over 5, it is rage click\n const clicks = clickObservable.pipe(\n filter(filterOutNonTrackableEvents),\n filter((click) => {\n // Only track clicks on elements that should be tracked,\n return shouldTrackEvent('click', click.closestTrackedAncestor);\n }),\n map((click) => evaluateTriggers(click)),\n );\n\n return clicks.subscribe((click) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CLICKED_EVENT, click.targetElementProperties);\n });\n}\n"]}
@@ -1,11 +1,10 @@
1
- import { AllWindowObservables } from 'src/autocapture-plugin';
1
+ import { AllWindowObservables } from 'src/frustration-plugin';
2
2
  import { BrowserClient, ActionType } from '@amplitude/analytics-core';
3
3
  import { shouldTrackEvent } from '../helpers';
4
- export declare function _overrideDeadClickConfig(deadClickTimeout: number): void;
5
4
  export declare function trackDeadClick({ amplitude, allObservables, getEventProperties, shouldTrackDeadClick, }: {
6
5
  amplitude: BrowserClient;
7
6
  allObservables: AllWindowObservables;
8
7
  getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;
9
8
  shouldTrackDeadClick: shouldTrackEvent;
10
- }): import("rxjs").Subscription;
9
+ }): ZenObservable.Subscription;
11
10
  //# sourceMappingURL=track-dead-click.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"track-dead-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAA6D,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMzG,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,QAEhE;AAOD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,oBAAoB,EAAE,gBAAgB,CAAC;CACxC,+BA+DA"}
1
+ {"version":3,"file":"track-dead-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAmB,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAA6D,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAWzG,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,oBAAoB,EAAE,gBAAgB,CAAC;CACxC,8BA6DA"}
@@ -1,47 +1,52 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.trackDeadClick = exports._overrideDeadClickConfig = void 0;
3
+ exports.trackDeadClick = void 0;
4
4
  var tslib_1 = require("tslib");
5
- var rxjs_1 = require("rxjs");
5
+ var analytics_core_1 = require("@amplitude/analytics-core");
6
6
  var helpers_1 = require("../helpers");
7
7
  var constants_1 = require("../constants");
8
8
  var DEAD_CLICK_TIMEOUT = 3000; // 3 seconds to wait for an activity to happen
9
- // allow override of dead click config for testing only
10
- function _overrideDeadClickConfig(deadClickTimeout) {
11
- DEAD_CLICK_TIMEOUT = deadClickTimeout;
12
- }
13
- exports._overrideDeadClickConfig = _overrideDeadClickConfig;
9
+ var CHANGE_EVENTS = ['mutation', 'navigate'];
14
10
  function trackDeadClick(_a) {
15
11
  var amplitude = _a.amplitude, allObservables = _a.allObservables, getEventProperties = _a.getEventProperties, shouldTrackDeadClick = _a.shouldTrackDeadClick;
16
12
  var clickObservable = allObservables.clickObservable, mutationObservable = allObservables.mutationObservable, navigateObservable = allObservables.navigateObservable;
17
- var filteredClickObservable = clickObservable.pipe((0, rxjs_1.filter)(helpers_1.filterOutNonTrackableEvents), (0, rxjs_1.filter)(function (clickEvent) {
18
- // Only track change on elements that should be tracked
19
- return shouldTrackDeadClick('click', clickEvent.closestTrackedAncestor);
20
- }), (0, rxjs_1.filter)(function (clickEvent) {
21
- var target = clickEvent.event.target;
22
- return target.closest('a[target="_blank"]') === null;
23
- }));
24
- var changeObservables = [mutationObservable];
25
- if (navigateObservable) {
26
- changeObservables.push(navigateObservable);
27
- }
28
- var mutationOrNavigate = rxjs_1.merge.apply(void 0, tslib_1.__spreadArray([], tslib_1.__read(changeObservables), false));
29
- var actionClicks = filteredClickObservable.pipe((0, rxjs_1.mergeMap)(function (click) {
30
- // Create a timer that emits after 500ms
31
- var timeoutId;
32
- var timer = new rxjs_1.Observable(function (subscriber) {
33
- timeoutId = setTimeout(function () { return subscriber.next(click); }, DEAD_CLICK_TIMEOUT);
34
- return function () {
35
- clearTimeout(timeoutId);
36
- };
37
- });
38
- // Race between the timer and any mutations/navigation
39
- // if the timer wins, the click is dead so we emit it
40
- return (0, rxjs_1.race)(timer, mutationOrNavigate.pipe((0, rxjs_1.take)(1), (0, rxjs_1.map)(function () { return null; }))).pipe((0, rxjs_1.filter)(function (value) { return value !== null; }));
41
- }),
42
- // Only allow one dead click event every 3 seconds
43
- (0, rxjs_1.throttleTime)(DEAD_CLICK_TIMEOUT));
44
- return actionClicks.subscribe(function (actionClick) {
13
+ var filteredClickObservable = clickObservable.filter(function (click) {
14
+ return ((0, helpers_1.filterOutNonTrackableEvents)(click) &&
15
+ shouldTrackDeadClick('click', click.closestTrackedAncestor) &&
16
+ click.event.target instanceof Element &&
17
+ click.event.target.closest('a[target="_blank"]') === null);
18
+ });
19
+ /* istanbul ignore next */
20
+ var changeObservables = navigateObservable ? (0, analytics_core_1.merge)(mutationObservable, navigateObservable) : mutationObservable;
21
+ var clicksAndChangeObservable = (0, analytics_core_1.merge)(filteredClickObservable, changeObservables);
22
+ var deadClickTimer = null;
23
+ var deadClickObservable = (0, analytics_core_1.asyncMap)(clicksAndChangeObservable, function (event) {
24
+ if (deadClickTimer && CHANGE_EVENTS.includes(event.type)) {
25
+ // a mutation or navigation means it's not a dead click, so clear the timer
26
+ clearTimeout(deadClickTimer);
27
+ deadClickTimer = null;
28
+ return Promise.resolve(null);
29
+ }
30
+ else if (event.type === 'click') {
31
+ // if a dead click is already on-deck, return null.
32
+ // this throttles dead clicks events so no more than one dead click event
33
+ // is tracked per every DEAD_CLICK_TIMEOUT ms.
34
+ if (deadClickTimer) {
35
+ return Promise.resolve(null);
36
+ }
37
+ return new Promise(function (resolve) {
38
+ deadClickTimer = setTimeout(function () {
39
+ resolve(event);
40
+ deadClickTimer = null;
41
+ }, DEAD_CLICK_TIMEOUT);
42
+ });
43
+ }
44
+ // unreachable code, but needed to satisfy the type checker
45
+ return Promise.resolve(null);
46
+ });
47
+ return deadClickObservable.subscribe(function (actionClick) {
48
+ if (!actionClick)
49
+ return;
45
50
  var deadClickEvent = {
46
51
  '[Amplitude] X': actionClick.event.clientX,
47
52
  '[Amplitude] Y': actionClick.event.clientY,
@@ -1 +1 @@
1
- {"version":3,"file":"track-dead-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":";;;;AACA,6BAAsG;AAEtG,sCAAyG;AACzG,0CAAoE;AAEpE,IAAI,kBAAkB,GAAG,IAAI,CAAC,CAAC,8CAA8C;AAE7E,uDAAuD;AACvD,SAAgB,wBAAwB,CAAC,gBAAwB;IAC/D,kBAAkB,GAAG,gBAAgB,CAAC;AACxC,CAAC;AAFD,4DAEC;AAOD,SAAgB,cAAc,CAAC,EAU9B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,kBAAkB,wBAAA,EAClB,oBAAoB,0BAAA;IAOZ,IAAA,eAAe,GAA6C,cAAc,gBAA3D,EAAE,kBAAkB,GAAyB,cAAc,mBAAvC,EAAE,kBAAkB,GAAK,cAAc,mBAAnB,CAAoB;IAEnF,IAAM,uBAAuB,GAAG,eAAe,CAAC,IAAI,CAClD,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,UAAU;QAChB,uDAAuD;QACvD,OAAO,oBAAoB,CAAC,OAAO,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC1E,CAAC,CAAC,EACF,IAAA,aAAM,EAAC,UAAC,UAAU;QAChB,IAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAiB,CAAC;QAClD,OAAO,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACvD,CAAC,CAAC,CACH,CAAC;IAEF,IAAM,iBAAiB,GAEnB,CAAC,kBAAkB,CAAC,CAAC;IACzB,IAAI,kBAAkB,EAAE;QACtB,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;KAC5C;IACD,IAAM,kBAAkB,GAAG,YAAK,wDAAI,iBAAiB,UAAC,CAAC;IAEvD,IAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAC/C,IAAA,eAAQ,EAAC,UAAC,KAAK;QACb,wCAAwC;QACxC,IAAI,SAAwC,CAAC;QAC7C,IAAM,KAAK,GAAG,IAAI,iBAAU,CAAe,UAAC,UAAoC;YAC9E,SAAS,GAAG,UAAU,CAAC,cAAM,OAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAtB,CAAsB,EAAE,kBAAkB,CAAC,CAAC;YAEzE,OAAO;gBACL,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,sDAAsD;QACtD,qDAAqD;QACrD,OAAO,IAAA,WAAI,EACT,KAAK,EACL,kBAAkB,CAAC,IAAI,CACrB,IAAA,WAAI,EAAC,CAAC,CAAC,EACP,IAAA,UAAG,EAAC,cAAM,OAAA,IAAI,EAAJ,CAAI,CAAC,CAChB,CACF,CAAC,IAAI,CAAC,IAAA,aAAM,EAAC,UAAC,KAAK,IAAwD,OAAA,KAAK,KAAK,IAAI,EAAd,CAAc,CAAC,CAAC,CAAC;IAC/F,CAAC,CAAC;IACF,kDAAkD;IAClD,IAAA,mBAAY,EAAC,kBAAkB,CAAC,CACjC,CAAC;IAEF,OAAO,YAAY,CAAC,SAAS,CAAC,UAAC,WAAW;QACxC,IAAM,cAAc,GAAmB;YACrC,eAAe,EAAG,WAAW,CAAC,KAAoB,CAAC,OAAO;YAC1D,eAAe,EAAG,WAAW,CAAC,KAAoB,CAAC,OAAO;SAC3D,CAAC;QACF,SAAS,CAAC,KAAK,CACb,gDAAoC,wCAE/B,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,sBAAsB,CAAC,GAC/D,cAAc,GAEnB,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE,CAChC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAzED,wCAyEC","sourcesContent":["import { AllWindowObservables, ObservablesEnum } from 'src/autocapture-plugin';\nimport { filter, map, merge, take, mergeMap, race, Observable, Subscriber, throttleTime } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { ElementBasedTimestampedEvent, filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT } from '../constants';\n\nlet DEAD_CLICK_TIMEOUT = 3000; // 3 seconds to wait for an activity to happen\n\n// allow override of dead click config for testing only\nexport function _overrideDeadClickConfig(deadClickTimeout: number) {\n DEAD_CLICK_TIMEOUT = deadClickTimeout;\n}\n\ntype EventDeadClick = {\n '[Amplitude] X': number;\n '[Amplitude] Y': number;\n};\n\nexport function trackDeadClick({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackDeadClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackDeadClick: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable } = allObservables;\n\n const filteredClickObservable = clickObservable.pipe(\n filter(filterOutNonTrackableEvents),\n filter((clickEvent) => {\n // Only track change on elements that should be tracked\n return shouldTrackDeadClick('click', clickEvent.closestTrackedAncestor);\n }),\n filter((clickEvent) => {\n const target = clickEvent.event.target as Element;\n return target.closest('a[target=\"_blank\"]') === null;\n }),\n );\n\n const changeObservables: Array<\n AllWindowObservables[ObservablesEnum.MutationObservable] | AllWindowObservables[ObservablesEnum.NavigateObservable]\n > = [mutationObservable];\n if (navigateObservable) {\n changeObservables.push(navigateObservable);\n }\n const mutationOrNavigate = merge(...changeObservables);\n\n const actionClicks = filteredClickObservable.pipe(\n mergeMap((click) => {\n // Create a timer that emits after 500ms\n let timeoutId: ReturnType<typeof setTimeout>;\n const timer = new Observable<typeof click>((subscriber: Subscriber<typeof click>) => {\n timeoutId = setTimeout(() => subscriber.next(click), DEAD_CLICK_TIMEOUT);\n\n return () => {\n clearTimeout(timeoutId);\n };\n });\n\n // Race between the timer and any mutations/navigation\n // if the timer wins, the click is dead so we emit it\n return race(\n timer,\n mutationOrNavigate.pipe(\n take(1),\n map(() => null),\n ),\n ).pipe(filter((value): value is ElementBasedTimestampedEvent<MouseEvent> => value !== null));\n }),\n // Only allow one dead click event every 3 seconds\n throttleTime(DEAD_CLICK_TIMEOUT),\n );\n\n return actionClicks.subscribe((actionClick) => {\n const deadClickEvent: EventDeadClick = {\n '[Amplitude] X': (actionClick.event as MouseEvent).clientX,\n '[Amplitude] Y': (actionClick.event as MouseEvent).clientY,\n };\n amplitude.track(\n AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT,\n {\n ...getEventProperties('click', actionClick.closestTrackedAncestor),\n ...deadClickEvent,\n },\n { time: actionClick.timestamp },\n );\n });\n}\n"]}
1
+ {"version":3,"file":"track-dead-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":";;;;AACA,4DAAuF;AACvF,sCAAyG;AACzG,0CAAoE;AACpE,IAAM,kBAAkB,GAAG,IAAI,CAAC,CAAC,8CAA8C;AAO/E,IAAM,aAAa,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAE/C,SAAgB,cAAc,CAAC,EAU9B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,kBAAkB,wBAAA,EAClB,oBAAoB,0BAAA;IAOZ,IAAA,eAAe,GAAmE,cAAc,gBAAjF,EAAE,kBAAkB,GAA+C,cAAc,mBAA7D,EAAE,kBAAkB,GAA2B,cAAc,mBAAzC,CAA0C;IAEzG,IAAM,uBAAuB,GAAG,eAAe,CAAC,MAAM,CAAC,UAAC,KAAK;QAC3D,OAAO,CACL,IAAA,qCAA2B,EAAC,KAAK,CAAC;YAClC,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC;YAC3D,KAAK,CAAC,KAAK,CAAC,MAAM,YAAY,OAAO;YACrC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAC1D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,IAAM,iBAAiB,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAA,sBAAK,EAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAElH,IAAM,yBAAyB,GAAG,IAAA,sBAAK,EAAC,uBAAuB,EAAE,iBAAiB,CAAC,CAAC;IAEpF,IAAI,cAAc,GAAyC,IAAI,CAAC;IAEhE,IAAM,mBAAmB,GAAG,IAAA,yBAAQ,EAClC,yBAAyB,EACzB,UAAC,KAAK;QACJ,IAAI,cAAc,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACxD,2EAA2E;YAC3E,YAAY,CAAC,cAAc,CAAC,CAAC;YAC7B,cAAc,GAAG,IAAI,CAAC;YACtB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC9B;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;YACjC,mDAAmD;YACnD,yEAAyE;YACzE,8CAA8C;YAC9C,IAAI,cAAc,EAAE;gBAClB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAC9B;YACD,OAAO,IAAI,OAAO,CAAC,UAAC,OAAO;gBACzB,cAAc,GAAG,UAAU,CAAC;oBAC1B,OAAO,CAAC,KAAiD,CAAC,CAAC;oBAC3D,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC,EAAE,kBAAkB,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;SACJ;QACD,2DAA2D;QAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;IAEF,OAAO,mBAAmB,CAAC,SAAS,CAAC,UAAC,WAAW;QAC/C,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,IAAM,cAAc,GAAmB;YACrC,eAAe,EAAG,WAAW,CAAC,KAAoB,CAAC,OAAO;YAC1D,eAAe,EAAG,WAAW,CAAC,KAAoB,CAAC,OAAO;SAC3D,CAAC;QACF,SAAS,CAAC,KAAK,CACb,gDAAoC,wCAE/B,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,sBAAsB,CAAC,GAC/D,cAAc,GAEnB,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE,CAChC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAvED,wCAuEC","sourcesContent":["import { AllWindowObservables } from 'src/frustration-plugin';\nimport { BrowserClient, ActionType, merge, asyncMap } from '@amplitude/analytics-core';\nimport { ElementBasedTimestampedEvent, filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT } from '../constants';\nconst DEAD_CLICK_TIMEOUT = 3000; // 3 seconds to wait for an activity to happen\n\ntype EventDeadClick = {\n '[Amplitude] X': number;\n '[Amplitude] Y': number;\n};\n\nconst CHANGE_EVENTS = ['mutation', 'navigate'];\n\nexport function trackDeadClick({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackDeadClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackDeadClick: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable }: AllWindowObservables = allObservables;\n\n const filteredClickObservable = clickObservable.filter((click) => {\n return (\n filterOutNonTrackableEvents(click) &&\n shouldTrackDeadClick('click', click.closestTrackedAncestor) &&\n click.event.target instanceof Element &&\n click.event.target.closest('a[target=\"_blank\"]') === null\n );\n });\n\n /* istanbul ignore next */\n const changeObservables = navigateObservable ? merge(mutationObservable, navigateObservable) : mutationObservable;\n\n const clicksAndChangeObservable = merge(filteredClickObservable, changeObservables);\n\n let deadClickTimer: ReturnType<typeof setTimeout> | null = null;\n\n const deadClickObservable = asyncMap(\n clicksAndChangeObservable,\n (event): Promise<ElementBasedTimestampedEvent<MouseEvent> | null> => {\n if (deadClickTimer && CHANGE_EVENTS.includes(event.type)) {\n // a mutation or navigation means it's not a dead click, so clear the timer\n clearTimeout(deadClickTimer);\n deadClickTimer = null;\n return Promise.resolve(null);\n } else if (event.type === 'click') {\n // if a dead click is already on-deck, return null.\n // this throttles dead clicks events so no more than one dead click event\n // is tracked per every DEAD_CLICK_TIMEOUT ms.\n if (deadClickTimer) {\n return Promise.resolve(null);\n }\n return new Promise((resolve) => {\n deadClickTimer = setTimeout(() => {\n resolve(event as ElementBasedTimestampedEvent<MouseEvent>);\n deadClickTimer = null;\n }, DEAD_CLICK_TIMEOUT);\n });\n }\n // unreachable code, but needed to satisfy the type checker\n return Promise.resolve(null);\n },\n );\n\n return deadClickObservable.subscribe((actionClick) => {\n if (!actionClick) return;\n const deadClickEvent: EventDeadClick = {\n '[Amplitude] X': (actionClick.event as MouseEvent).clientX,\n '[Amplitude] Y': (actionClick.event as MouseEvent).clientY,\n };\n amplitude.track(\n AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT,\n {\n ...getEventProperties('click', actionClick.closestTrackedAncestor),\n ...deadClickEvent,\n },\n { time: actionClick.timestamp },\n );\n });\n}\n"]}
@@ -1,9 +1,9 @@
1
- import { AllWindowObservables } from 'src/autocapture-plugin';
2
- import { shouldTrackEvent } from '../helpers';
1
+ import { AllWindowObservables } from 'src/frustration-plugin';
3
2
  import { BrowserClient } from '@amplitude/analytics-core';
3
+ import { shouldTrackEvent } from '../helpers';
4
4
  export declare function trackRageClicks({ amplitude, allObservables, shouldTrackRageClick, }: {
5
5
  amplitude: BrowserClient;
6
6
  allObservables: AllWindowObservables;
7
7
  shouldTrackRageClick: shouldTrackEvent;
8
- }): import("rxjs").Subscription;
8
+ }): ZenObservable.Subscription | undefined;
9
9
  //# sourceMappingURL=track-rage-click.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"track-rage-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-rage-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3E,OAAO,EACL,aAAa,EAId,MAAM,2BAA2B,CAAC;AA+EnC,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,cAAc,EACd,oBAAoB,GACrB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,oBAAoB,EAAE,gBAAgB,CAAC;CACxC,+BAqFA"}
1
+ {"version":3,"file":"track-rage-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-rage-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACL,aAAa,EAKd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAyF9C,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,cAAc,EACd,oBAAoB,GACrB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,oBAAoB,EAAE,gBAAgB,CAAC;CACxC,0CA8FA"}