@amplitude/plugin-autocapture-browser 1.3.0 → 1.4.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 (81) hide show
  1. package/lib/cjs/autocapture/track-dead-click.d.ts +11 -0
  2. package/lib/cjs/autocapture/track-dead-click.d.ts.map +1 -0
  3. package/lib/cjs/autocapture/track-dead-click.js +50 -0
  4. package/lib/cjs/autocapture/track-dead-click.js.map +1 -0
  5. package/lib/cjs/autocapture/track-rage-click.d.ts +10 -0
  6. package/lib/cjs/autocapture/track-rage-click.d.ts.map +1 -0
  7. package/lib/cjs/autocapture/track-rage-click.js +55 -0
  8. package/lib/cjs/autocapture/track-rage-click.js.map +1 -0
  9. package/lib/cjs/autocapture-plugin.d.ts +1 -23
  10. package/lib/cjs/autocapture-plugin.d.ts.map +1 -1
  11. package/lib/cjs/autocapture-plugin.js.map +1 -1
  12. package/lib/cjs/constants.d.ts +3 -0
  13. package/lib/cjs/constants.d.ts.map +1 -1
  14. package/lib/cjs/constants.js +4 -1
  15. package/lib/cjs/constants.js.map +1 -1
  16. package/lib/cjs/frustration-plugin.d.ts +5 -0
  17. package/lib/cjs/frustration-plugin.d.ts.map +1 -0
  18. package/lib/cjs/frustration-plugin.js +111 -0
  19. package/lib/cjs/frustration-plugin.js.map +1 -0
  20. package/lib/cjs/helpers.d.ts +25 -2
  21. package/lib/cjs/helpers.d.ts.map +1 -1
  22. package/lib/cjs/helpers.js +32 -6
  23. package/lib/cjs/helpers.js.map +1 -1
  24. package/lib/cjs/index.d.ts +1 -0
  25. package/lib/cjs/index.d.ts.map +1 -1
  26. package/lib/cjs/index.js +3 -1
  27. package/lib/cjs/index.js.map +1 -1
  28. package/lib/cjs/version.d.ts +1 -1
  29. package/lib/cjs/version.js +1 -1
  30. package/lib/cjs/version.js.map +1 -1
  31. package/lib/esm/autocapture/track-dead-click.d.ts +11 -0
  32. package/lib/esm/autocapture/track-dead-click.d.ts.map +1 -0
  33. package/lib/esm/autocapture/track-dead-click.js +45 -0
  34. package/lib/esm/autocapture/track-dead-click.js.map +1 -0
  35. package/lib/esm/autocapture/track-rage-click.d.ts +10 -0
  36. package/lib/esm/autocapture/track-rage-click.d.ts.map +1 -0
  37. package/lib/esm/autocapture/track-rage-click.js +50 -0
  38. package/lib/esm/autocapture/track-rage-click.js.map +1 -0
  39. package/lib/esm/autocapture-plugin.d.ts +1 -23
  40. package/lib/esm/autocapture-plugin.d.ts.map +1 -1
  41. package/lib/esm/autocapture-plugin.js.map +1 -1
  42. package/lib/esm/constants.d.ts +3 -0
  43. package/lib/esm/constants.d.ts.map +1 -1
  44. package/lib/esm/constants.js +3 -0
  45. package/lib/esm/constants.js.map +1 -1
  46. package/lib/esm/frustration-plugin.d.ts +5 -0
  47. package/lib/esm/frustration-plugin.d.ts.map +1 -0
  48. package/lib/esm/frustration-plugin.js +107 -0
  49. package/lib/esm/frustration-plugin.js.map +1 -0
  50. package/lib/esm/helpers.d.ts +25 -2
  51. package/lib/esm/helpers.d.ts.map +1 -1
  52. package/lib/esm/helpers.js +30 -5
  53. package/lib/esm/helpers.js.map +1 -1
  54. package/lib/esm/index.d.ts +1 -0
  55. package/lib/esm/index.d.ts.map +1 -1
  56. package/lib/esm/index.js +1 -0
  57. package/lib/esm/index.js.map +1 -1
  58. package/lib/esm/version.d.ts +1 -1
  59. package/lib/esm/version.js +1 -1
  60. package/lib/esm/version.js.map +1 -1
  61. package/lib/scripts/amplitude-min.js +1 -1
  62. package/lib/scripts/amplitude-min.js.gz +0 -0
  63. package/lib/scripts/amplitude-min.js.map +1 -1
  64. package/lib/scripts/amplitude-min.umd.js +1 -1
  65. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  66. package/lib/scripts/autocapture/track-dead-click.d.ts +11 -0
  67. package/lib/scripts/autocapture/track-dead-click.d.ts.map +1 -0
  68. package/lib/scripts/autocapture/track-rage-click.d.ts +10 -0
  69. package/lib/scripts/autocapture/track-rage-click.d.ts.map +1 -0
  70. package/lib/scripts/autocapture-plugin.d.ts +1 -23
  71. package/lib/scripts/autocapture-plugin.d.ts.map +1 -1
  72. package/lib/scripts/constants.d.ts +3 -0
  73. package/lib/scripts/constants.d.ts.map +1 -1
  74. package/lib/scripts/frustration-plugin.d.ts +5 -0
  75. package/lib/scripts/frustration-plugin.d.ts.map +1 -0
  76. package/lib/scripts/helpers.d.ts +25 -2
  77. package/lib/scripts/helpers.d.ts.map +1 -1
  78. package/lib/scripts/index.d.ts +1 -0
  79. package/lib/scripts/index.d.ts.map +1 -1
  80. package/lib/scripts/version.d.ts +1 -1
  81. package/package.json +3 -3
@@ -1,14 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isElementBasedEvent = exports.addAdditionalEventProperties = exports.getEventProperties = exports.filterOutNonTrackableEvents = exports.generateUniqueId = exports.asyncLoadScript = exports.getEventTagProps = exports.getClosestElement = exports.querySelectUniqueElements = exports.getNearestLabel = exports.removeEmptyProperties = exports.isEmpty = exports.getAttributesWithPrefix = exports.isPageUrlAllowed = exports.getText = exports.isNonSensitiveElement = exports.isTextNode = exports.isNonSensitiveString = exports.createShouldTrackEvent = void 0;
3
+ exports.isElementBasedEvent = exports.addAdditionalEventProperties = exports.getEventProperties = exports.filterOutNonTrackableEvents = exports.generateUniqueId = exports.asyncLoadScript = exports.getEventTagProps = exports.getClosestElement = exports.querySelectUniqueElements = exports.getNearestLabel = exports.removeEmptyProperties = exports.isEmpty = exports.getAttributesWithPrefix = exports.isPageUrlAllowed = exports.getText = exports.isNonSensitiveElement = exports.isTextNode = exports.isNonSensitiveString = exports.createShouldTrackEvent = exports.isElementPointerCursor = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  /* eslint-disable no-restricted-globals */
6
6
  var constants = tslib_1.__importStar(require("./constants"));
7
7
  var hierarchy_1 = require("./hierarchy");
8
8
  var SENSITIVE_TAGS = ['input', 'select', 'textarea'];
9
- var createShouldTrackEvent = function (autocaptureOptions, allowlist) {
9
+ var isElementPointerCursor = function (element, actionType) {
10
+ var _a;
11
+ /* istanbul ignore next */
12
+ var computedStyle = (_a = window === null || window === void 0 ? void 0 : window.getComputedStyle) === null || _a === void 0 ? void 0 : _a.call(window, element);
13
+ /* istanbul ignore next */
14
+ return (computedStyle === null || computedStyle === void 0 ? void 0 : computedStyle.getPropertyValue('cursor')) === 'pointer' && actionType === 'click';
15
+ };
16
+ exports.isElementPointerCursor = isElementPointerCursor;
17
+ var createShouldTrackEvent = function (autocaptureOptions, allowlist, // this can be any type of css selector allow list
18
+ isAlwaysCaptureCursorPointer) {
19
+ if (isAlwaysCaptureCursorPointer === void 0) { isAlwaysCaptureCursorPointer = false; }
10
20
  return function (actionType, element) {
11
- var _a, _b, _c;
21
+ var _a, _b;
12
22
  var pageUrlAllowlist = autocaptureOptions.pageUrlAllowlist, shouldTrackEventResolver = autocaptureOptions.shouldTrackEventResolver;
13
23
  /* istanbul ignore next */
14
24
  var tag = (_b = (_a = element === null || element === void 0 ? void 0 : element.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase) === null || _b === void 0 ? void 0 : _b.call(_a);
@@ -32,6 +42,10 @@ var createShouldTrackEvent = function (autocaptureOptions, allowlist) {
32
42
  return false;
33
43
  }
34
44
  }
45
+ var isCursorPointer = (0, exports.isElementPointerCursor)(element, actionType);
46
+ if (isAlwaysCaptureCursorPointer && isCursorPointer) {
47
+ return true;
48
+ }
35
49
  /* istanbul ignore if */
36
50
  if (allowlist) {
37
51
  var hasMatchAnyAllowedSelector = allowlist.some(function (selector) { var _a; return !!((_a = element === null || element === void 0 ? void 0 : element.matches) === null || _a === void 0 ? void 0 : _a.call(element, selector)); });
@@ -46,9 +60,8 @@ var createShouldTrackEvent = function (autocaptureOptions, allowlist) {
46
60
  return actionType === 'change' || actionType === 'click';
47
61
  default: {
48
62
  /* istanbul ignore next */
49
- var computedStyle = (_c = window === null || window === void 0 ? void 0 : window.getComputedStyle) === null || _c === void 0 ? void 0 : _c.call(window, element);
50
63
  /* istanbul ignore next */
51
- if (computedStyle && computedStyle.getPropertyValue('cursor') === 'pointer' && actionType === 'click') {
64
+ if (isCursorPointer) {
52
65
  return true;
53
66
  }
54
67
  return actionType === 'click';
@@ -295,13 +308,26 @@ var getEventProperties = function (actionType, element, dataAttributePrefix) {
295
308
  return (0, exports.removeEmptyProperties)(properties);
296
309
  };
297
310
  exports.getEventProperties = getEventProperties;
298
- var addAdditionalEventProperties = function (event, type, selectorAllowlist, dataAttributePrefix) {
311
+ var addAdditionalEventProperties = function (event, type, selectorAllowlist, dataAttributePrefix,
312
+ // capture the event if the cursor is a "pointer" when this element is clicked on
313
+ // reason: a "pointer" cursor indicates that an element should be interactable
314
+ // regardless of the element's tag name
315
+ isCapturingCursorPointer) {
316
+ if (isCapturingCursorPointer === void 0) { isCapturingCursorPointer = false; }
299
317
  var baseEvent = {
300
318
  event: event,
301
319
  timestamp: Date.now(),
302
320
  type: type,
303
321
  };
304
322
  if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {
323
+ if (isCapturingCursorPointer) {
324
+ var isCursorPointer = (0, exports.isElementPointerCursor)(baseEvent.event.target, baseEvent.type);
325
+ if (isCursorPointer) {
326
+ baseEvent.closestTrackedAncestor = baseEvent.event.target;
327
+ baseEvent.targetElementProperties = (0, exports.getEventProperties)(baseEvent.type, baseEvent.closestTrackedAncestor, dataAttributePrefix);
328
+ return baseEvent;
329
+ }
330
+ }
305
331
  // Retrieve additional event properties from the target element
306
332
  var closestTrackedAncestor = (0, exports.getClosestElement)(baseEvent.event.target, selectorAllowlist);
307
333
  if (closestTrackedAncestor) {
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":";;;;AAAA,0CAA0C;AAC1C,6DAAyC;AAEzC,yCAA2C;AAI3C,IAAM,cAAc,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAIhD,IAAM,sBAAsB,GAAG,UACpC,kBAA8C,EAC9C,SAAmB;IAEnB,OAAO,UAAC,UAAsB,EAAE,OAAgB;;QACtC,IAAA,gBAAgB,GAA+B,kBAAkB,iBAAjD,EAAE,wBAAwB,GAAK,kBAAkB,yBAAvB,CAAwB;QAE1E,0BAA0B;QAC1B,IAAM,GAAG,GAAG,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,0CAAE,WAAW,kDAAI,CAAC;QAC9C,+CAA+C;QAC/C,IAAI,CAAC,GAAG,EAAE;YACR,OAAO,KAAK,CAAC;SACd;QAED,IAAI,wBAAwB,EAAE;YAC5B,OAAO,wBAAwB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;SACtD;QAED,IAAI,CAAC,IAAA,wBAAgB,EAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE;YAC7D,OAAO,KAAK,CAAC;SACd;QAED,0BAA0B;QAC1B,IAAM,WAAW,GAAG,MAAM,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAChE,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;YACnC,QAAQ,WAAW,CAAC,WAAW,EAAE,EAAE;gBACjC,KAAK,QAAQ;oBACX,OAAO,KAAK,CAAC;gBACf,KAAK,UAAU;oBACb,OAAO,KAAK,CAAC;aAChB;SACF;QAED,wBAAwB;QACxB,IAAI,SAAS,EAAE;YACb,IAAM,0BAA0B,GAAG,SAAS,CAAC,IAAI,CAAC,UAAC,QAAQ,YAAK,OAAA,CAAC,CAAC,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,wDAAG,QAAQ,CAAC,CAAA,CAAA,EAAA,CAAC,CAAC;YAChG,IAAI,CAAC,0BAA0B,EAAE;gBAC/B,OAAO,KAAK,CAAC;aACd;SACF;QAED,QAAQ,GAAG,EAAE;YACX,KAAK,OAAO,CAAC;YACb,KAAK,QAAQ,CAAC;YACd,KAAK,UAAU;gBACb,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,OAAO,CAAC;YAC3D,OAAO,CAAC,CAAC;gBACP,0BAA0B;gBAC1B,IAAM,aAAa,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,uDAAG,OAAO,CAAC,CAAC;gBAC1D,0BAA0B;gBAC1B,IAAI,aAAa,IAAI,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAI,UAAU,KAAK,OAAO,EAAE;oBACrG,OAAO,IAAI,CAAC;iBACb;gBACD,OAAO,UAAU,KAAK,OAAO,CAAC;aAC/B;SACF;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAzDW,QAAA,sBAAsB,0BAyDjC;AAEK,IAAM,oBAAoB,GAAG,UAAC,IAAmB;IACtD,IAAI,IAAI,IAAI,IAAI,EAAE;QAChB,OAAO,KAAK,CAAC;KACd;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,IAAM,OAAO,GACX,uKAAuK,CAAC;QAC1K,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE;YACnD,OAAO,KAAK,CAAC;SACd;QACD,IAAM,QAAQ,GAAG,yBAAyB,CAAC;QAC3C,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACvB,OAAO,KAAK,CAAC;SACd;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAhBW,QAAA,oBAAoB,wBAgB/B;AAEK,IAAM,UAAU,GAAG,UAAC,IAAU;IACnC,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC;AACvC,CAAC,CAAC;AAFW,QAAA,UAAU,cAErB;AAEK,IAAM,qBAAqB,GAAG,UAAC,OAAgB;;IACpD,0BAA0B;IAC1B,IAAM,GAAG,GAAG,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,0CAAE,WAAW,kDAAI,CAAC;IAC9C,IAAM,iBAAiB,GACrB,OAAO,YAAY,WAAW,CAAC,CAAC,CAAC,CAAA,MAAA,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,0CAAE,WAAW,EAAE,MAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAE7G,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAC7D,CAAC,CAAC;AAPW,QAAA,qBAAqB,yBAOhC;AAEF,oHAAoH;AAC7G,IAAM,OAAO,GAAG,UAAC,OAAgB;IACtC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,IAAA,6BAAqB,EAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE;QACrF,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAC,KAAK;YAC/B,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,IAAA,kBAAU,EAAC,KAAK,CAAC,EAAE;gBACrB,IAAI,KAAK,CAAC,WAAW,EAAE;oBACrB,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC;iBAC/B;aACF;iBAAM;gBACL,SAAS,GAAG,IAAA,eAAO,EAAC,KAAgB,CAAC,CAAC;aACvC;YACD,IAAI,IAAI,SAAS;iBACd,KAAK,CAAC,OAAO,CAAC;iBACd,MAAM,CAAC,4BAAoB,CAAC;iBAC5B,IAAI,CAAC,EAAE,CAAC;iBACR,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;iBACvB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;iBACrB,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;KACJ;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAtBW,QAAA,OAAO,WAsBlB;AAEK,IAAM,gBAAgB,GAAG,UAAC,GAAW,EAAE,gBAAiD;IAC7F,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE;QACjD,OAAO,IAAI,CAAC;KACb;IACD,OAAO,gBAAgB,CAAC,IAAI,CAAC,UAAC,UAAU;QACtC,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YAClC,OAAO,GAAG,KAAK,UAAU,CAAC;SAC3B;QACD,OAAO,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAVW,QAAA,gBAAgB,oBAU3B;AAEK,IAAM,uBAAuB,GAAG,UAAC,OAAgB,EAAE,MAAc;IACtE,OAAO,OAAO,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,UAAC,UAAqC,EAAE,aAAa;QAC7F,IAAI,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YACpC,IAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvD,IAAM,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAC3D,IAAI,YAAY,EAAE;gBAChB,UAAU,CAAC,YAAY,CAAC,GAAG,cAAc,IAAI,EAAE,CAAC;aACjD;SACF;QACD,OAAO,UAAU,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAXW,QAAA,uBAAuB,2BAWlC;AAEK,IAAM,OAAO,GAAG,UAAC,KAAc;IACpC,OAAO,CACL,KAAK,KAAK,SAAS;QACnB,KAAK,KAAK,IAAI;QACd,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAC9D,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CACzD,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,OAAO,WAOlB;AAEK,IAAM,qBAAqB,GAAG,UAAC,UAAsC;IAC1E,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,UAAC,kBAA8C,EAAE,GAAG;QACxF,IAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAA,eAAO,EAAC,KAAK,CAAC,EAAE;YACnB,kBAAkB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;SACjC;QACD,OAAO,kBAAkB,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AARW,QAAA,qBAAqB,yBAQhC;AAEK,IAAM,eAAe,GAAG,UAAC,OAAgB;IAC9C,IAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IACrC,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,EAAE,CAAC;KACX;IACD,IAAI,YAAY,CAAC;IACjB,IAAI;QACF,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC;KACtE;IAAC,OAAO,KAAK,EAAE;QACd,0BAA0B;QAC1B,YAAY,GAAG,IAAI,CAAC;KACrB;IACD,IAAI,YAAY,EAAE;QAChB,0BAA0B;QAC1B,IAAM,SAAS,GAAG,YAAY,CAAC,WAAW,IAAI,EAAE,CAAC;QACjD,OAAO,IAAA,4BAAoB,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD;IACD,OAAO,IAAA,uBAAe,EAAC,MAAM,CAAC,CAAC;AACjC,CAAC,CAAC;AAlBW,QAAA,eAAe,mBAkB1B;AAEK,IAAM,yBAAyB,GAAG,UAAC,IAAwB,EAAE,SAAmB;IACrF,IAAI,IAAI,IAAI,kBAAkB,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,gBAAgB,KAAK,UAAU,EAAE;QACrF,IAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,UAAC,QAAsB,EAAE,QAAQ;YACnE,IAAI,QAAQ,EAAE;gBACZ,IAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACrE,gBAAgB,CAAC,OAAO,CAAC,UAAC,OAAO;oBAC/B,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC,CAAC,CAAC;aACJ;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC,EAAE,IAAI,GAAG,EAAW,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KAC/B;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAdW,QAAA,yBAAyB,6BAcpC;AAEF,gEAAgE;AACzD,IAAM,iBAAiB,GAAG,UAAC,OAAuB,EAAE,SAAmB;IAC5E,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,IAAI,CAAC;KACb;IACD,0BAA0B;IAC1B,IAAI,SAAS,CAAC,IAAI,CAAC,UAAC,QAAQ,YAAK,OAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,wDAAG,QAAQ,CAAC,CAAA,EAAA,CAAC,EAAE;QAC9D,OAAO,OAAO,CAAC;KAChB;IACD,0BAA0B;IAC1B,OAAO,IAAA,yBAAiB,EAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,EAAE,SAAS,CAAC,CAAC;AAC9D,CAAC,CAAC;AAVW,QAAA,iBAAiB,qBAU5B;AAEF,2EAA2E;AACpE,IAAM,gBAAgB,GAAG,UAAC,OAAgB;;;IAC/C,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,EAAE,CAAC;KACX;IACD,0BAA0B;IAC1B,IAAM,GAAG,GAAG,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,0CAAE,WAAW,kDAAI,CAAC;IAE9C,IAAM,UAAU;QACd,GAAC,SAAS,CAAC,gCAAgC,IAAG,GAAG;QACjD,GAAC,SAAS,CAAC,iCAAiC,IAAG,IAAA,eAAO,EAAC,OAAO,CAAC;QAC/D,GAAC,SAAS,CAAC,6BAA6B,IAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;WAC9E,CAAC;IACF,OAAO,IAAA,6BAAqB,EAAC,UAAU,CAAC,CAAC;AAC3C,CAAC,CAAC;AAbW,QAAA,gBAAgB,oBAa3B;AAEK,IAAM,eAAe,GAAG,UAAC,GAAW;IACzC,OAAO,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,MAAM;;QACjC,IAAI;YACF,IAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACvD,aAAa,CAAC,IAAI,GAAG,iBAAiB,CAAC;YACvC,aAAa,CAAC,KAAK,GAAG,IAAI,CAAC;YAC3B,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,aAAa,CAAC,gBAAgB,CAC5B,MAAM,EACN;gBACE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5B,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;YACF,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE;gBACtC,MAAM,CAAC;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,oCAA6B,GAAG,CAAE;iBAC5C,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,0BAA0B;YAC1B,MAAA,QAAQ,CAAC,IAAI,0CAAE,WAAW,CAAC,aAAa,CAAC,CAAC;SAC3C;QAAC,OAAO,KAAK,EAAE;YACd,0BAA0B;YAC1B,MAAM,CAAC,KAAK,CAAC,CAAC;SACf;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AA3BW,QAAA,eAAe,mBA2B1B;AAEF,SAAgB,gBAAgB;IAC9B,OAAO,UAAG,IAAI,CAAC,GAAG,EAAE,cAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC;AACpE,CAAC;AAFD,4CAEC;AAEM,IAAM,2BAA2B,GAAG,UAAC,KAAsD;IAChG,+CAA+C;IAC/C,sEAAsE;IACtE,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE;QAChE,OAAO,KAAK,CAAC;KACd;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AARW,QAAA,2BAA2B,+BAQtC;AAEF,gEAAgE;AACzD,IAAM,kBAAkB,GAAG,UAAC,UAAsB,EAAE,OAAgB,EAAE,mBAA2B;;;IACtG,0BAA0B;IAC1B,IAAM,GAAG,GAAG,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,0CAAE,WAAW,kDAAI,CAAC;IAC9C,0BAA0B;IAC1B,IAAM,IAAI,GACR,OAAO,OAAO,CAAC,qBAAqB,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACpH,IAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IACrD,IAAM,UAAU,GAAG,IAAA,+BAAuB,EAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IACzE,IAAM,YAAY,GAAG,IAAA,uBAAe,EAAC,OAAO,CAAC,CAAC;IAC9C,0BAA0B;IAC1B,IAAM,UAAU;QACd,GAAC,SAAS,CAAC,+BAA+B,IAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;QAC7E,GAAC,SAAS,CAAC,kCAAkC,IAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;QAC7E,GAAC,SAAS,CAAC,sCAAsC,IAAG,IAAA,wBAAY,EAAC,OAAO,CAAC;QACzE,GAAC,SAAS,CAAC,gCAAgC,IAAG,GAAG;QACjD,GAAC,SAAS,CAAC,iCAAiC,IAAG,IAAA,eAAO,EAAC,OAAO,CAAC;QAC/D,GAAC,SAAS,CAAC,0CAA0C,IAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACxG,GAAC,SAAS,CAAC,yCAAyC,IAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;QACrG,GAAC,SAAS,CAAC,uCAAuC,IAAG,SAAS;QAC9D,GAAC,SAAS,CAAC,uCAAuC,IAAG,UAAU;QAC/D,GAAC,SAAS,CAAC,yCAAyC,IAAG,YAAY;QACnE,GAAC,SAAS,CAAC,6BAA6B,IAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7E,GAAC,SAAS,CAAC,+BAA+B,IAAG,CAAC,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;QACtG,GAAC,SAAS,CAAC,oCAAoC,IAAG,MAAM,CAAC,WAAW;QACpE,GAAC,SAAS,CAAC,mCAAmC,IAAG,MAAM,CAAC,UAAU;WACnE,CAAC;IACF,IAAI,GAAG,KAAK,GAAG,IAAI,UAAU,KAAK,OAAO,IAAI,OAAO,YAAY,iBAAiB,EAAE;QACjF,UAAU,CAAC,SAAS,CAAC,iCAAiC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;KACxE;IACD,OAAO,IAAA,6BAAqB,EAAC,UAAU,CAAC,CAAC;AAC3C,CAAC,CAAC;AA9BW,QAAA,kBAAkB,sBA8B7B;AAOK,IAAM,4BAA4B,GAAG,UAC1C,KAAQ,EACR,IAAiC,EACjC,iBAA2B,EAC3B,mBAA2B;IAE3B,IAAM,SAAS,GAA8D;QAC3E,KAAK,OAAA;QACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,IAAI,MAAA;KACL,CAAC;IAEF,IAAI,mBAAmB,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE;QACrE,+DAA+D;QAC/D,IAAM,sBAAsB,GAAG,IAAA,yBAAiB,EAAC,SAAS,CAAC,KAAK,CAAC,MAAqB,EAAE,iBAAiB,CAAC,CAAC;QAC3G,IAAI,sBAAsB,EAAE;YAC1B,SAAS,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;YAC1D,SAAS,CAAC,uBAAuB,GAAG,IAAA,0BAAkB,EACpD,SAAS,CAAC,IAAI,EACd,sBAAsB,EACtB,mBAAmB,CACpB,CAAC;SACH;QACD,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AA3BW,QAAA,4BAA4B,gCA2BvC;AAyBF,iBAAiB;AACjB,SAAgB,mBAAmB,CAAI,KAA8B;IACnE,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC3D,CAAC;AAFD,kDAEC","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport * as constants from './constants';\nimport { ElementInteractionsOptions, ActionType } from '@amplitude/analytics-core';\nimport { getHierarchy } from './hierarchy';\n\nexport type JSONValue = string | number | boolean | null | { [x: string]: JSONValue } | Array<JSONValue>;\n\nconst SENSITIVE_TAGS = ['input', 'select', 'textarea'];\n\nexport type shouldTrackEvent = (actionType: ActionType, element: Element) => boolean;\n\nexport const createShouldTrackEvent = (\n autocaptureOptions: ElementInteractionsOptions,\n allowlist: string[], // this can be any type of css selector allow list\n): shouldTrackEvent => {\n return (actionType: ActionType, element: Element) => {\n const { pageUrlAllowlist, shouldTrackEventResolver } = autocaptureOptions;\n\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n // window, document, and Text nodes have no tag\n if (!tag) {\n return false;\n }\n\n if (shouldTrackEventResolver) {\n return shouldTrackEventResolver(actionType, element);\n }\n\n if (!isPageUrlAllowed(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n /* istanbul ignore next */\n const elementType = String(element?.getAttribute('type')) || '';\n if (typeof elementType === 'string') {\n switch (elementType.toLowerCase()) {\n case 'hidden':\n return false;\n case 'password':\n return false;\n }\n }\n\n /* istanbul ignore if */\n if (allowlist) {\n const hasMatchAnyAllowedSelector = allowlist.some((selector) => !!element?.matches?.(selector));\n if (!hasMatchAnyAllowedSelector) {\n return false;\n }\n }\n\n switch (tag) {\n case 'input':\n case 'select':\n case 'textarea':\n return actionType === 'change' || actionType === 'click';\n default: {\n /* istanbul ignore next */\n const computedStyle = window?.getComputedStyle?.(element);\n /* istanbul ignore next */\n if (computedStyle && computedStyle.getPropertyValue('cursor') === 'pointer' && actionType === 'click') {\n return true;\n }\n return actionType === 'click';\n }\n }\n };\n};\n\nexport const isNonSensitiveString = (text: string | null) => {\n if (text == null) {\n return false;\n }\n if (typeof text === 'string') {\n const ccRegex =\n /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/;\n if (ccRegex.test((text || '').replace(/[- ]/g, ''))) {\n return false;\n }\n const ssnRegex = /(^\\d{3}-?\\d{2}-?\\d{4}$)/;\n if (ssnRegex.test(text)) {\n return false;\n }\n }\n return true;\n};\n\nexport const isTextNode = (node: Node) => {\n return !!node && node.nodeType === 3;\n};\n\nexport const isNonSensitiveElement = (element: Element) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n const isContentEditable =\n element instanceof HTMLElement ? element.getAttribute('contenteditable')?.toLowerCase() === 'true' : false;\n\n return !SENSITIVE_TAGS.includes(tag) && !isContentEditable;\n};\n\n// Maybe this can be simplified with element.innerText, keep and manual concatenating for now, more research needed.\nexport const getText = (element: Element): string => {\n let text = '';\n if (isNonSensitiveElement(element) && element.childNodes && element.childNodes.length) {\n element.childNodes.forEach((child) => {\n let childText = '';\n if (isTextNode(child)) {\n if (child.textContent) {\n childText = child.textContent;\n }\n } else {\n childText = getText(child as Element);\n }\n text += childText\n .split(/(\\s+)/)\n .filter(isNonSensitiveString)\n .join('')\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n .substring(0, 255);\n });\n }\n return text;\n};\n\nexport const isPageUrlAllowed = (url: string, pageUrlAllowlist: (string | RegExp)[] | undefined) => {\n if (!pageUrlAllowlist || !pageUrlAllowlist.length) {\n return true;\n }\n return pageUrlAllowlist.some((allowedUrl) => {\n if (typeof allowedUrl === 'string') {\n return url === allowedUrl;\n }\n return url.match(allowedUrl);\n });\n};\n\nexport const getAttributesWithPrefix = (element: Element, prefix: string): { [key: string]: string } => {\n return element.getAttributeNames().reduce((attributes: { [key: string]: string }, attributeName) => {\n if (attributeName.startsWith(prefix)) {\n const attributeKey = attributeName.replace(prefix, '');\n const attributeValue = element.getAttribute(attributeName);\n if (attributeKey) {\n attributes[attributeKey] = attributeValue || '';\n }\n }\n return attributes;\n }, {});\n};\n\nexport const isEmpty = (value: unknown) => {\n return (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n (typeof value === 'string' && value.trim().length === 0)\n );\n};\n\nexport const removeEmptyProperties = (properties: { [key: string]: unknown }) => {\n return Object.keys(properties).reduce((filteredProperties: { [key: string]: unknown }, key) => {\n const value = properties[key];\n if (!isEmpty(value)) {\n filteredProperties[key] = value;\n }\n return filteredProperties;\n }, {});\n};\n\nexport const getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch (error) {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n const labelText = labelElement.textContent || '';\n return isNonSensitiveString(labelText) ? labelText : '';\n }\n return getNearestLabel(parent);\n};\n\nexport const querySelectUniqueElements = (root: Element | Document, selectors: string[]): Element[] => {\n if (root && 'querySelectorAll' in root && typeof root.querySelectorAll === 'function') {\n const elementSet = selectors.reduce((elements: Set<Element>, selector) => {\n if (selector) {\n const selectedElements = Array.from(root.querySelectorAll(selector));\n selectedElements.forEach((element) => {\n elements.add(element);\n });\n }\n return elements;\n }, new Set<Element>());\n return Array.from(elementSet);\n }\n return [];\n};\n\n// Similar as element.closest, but works with multiple selectors\nexport const getClosestElement = (element: Element | null, selectors: string[]): Element | null => {\n if (!element) {\n return null;\n }\n /* istanbul ignore next */\n if (selectors.some((selector) => element?.matches?.(selector))) {\n return element;\n }\n /* istanbul ignore next */\n return getClosestElement(element?.parentElement, selectors);\n};\n\n// Returns the element properties for the given element in Visual Labeling.\nexport const getEventTagProps = (element: Element) => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties: Record<string, JSONValue> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties);\n};\n\nexport const asyncLoadScript = (url: string) => {\n return new Promise((resolve, reject) => {\n try {\n const scriptElement = document.createElement('script');\n scriptElement.type = 'text/javascript';\n scriptElement.async = true;\n scriptElement.src = url;\n scriptElement.addEventListener(\n 'load',\n () => {\n resolve({ status: true });\n },\n { once: true },\n );\n scriptElement.addEventListener('error', () => {\n reject({\n status: false,\n message: `Failed to load the script ${url}`,\n });\n });\n /* istanbul ignore next */\n document.head?.appendChild(scriptElement);\n } catch (error) {\n /* istanbul ignore next */\n reject(error);\n }\n });\n};\n\nexport function generateUniqueId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\nexport const filterOutNonTrackableEvents = (event: ElementBasedTimestampedEvent<ElementBasedEvent>): boolean => {\n // Filter out changeEvent events with no target\n // This could happen when change events are triggered programmatically\n if (event.event.target === null || !event.closestTrackedAncestor) {\n return false;\n }\n\n return true;\n};\n\n// Returns the Amplitude event properties for the given element.\nexport const getEventProperties = (actionType: ActionType, element: Element, dataAttributePrefix: string) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n /* istanbul ignore next */\n const rect =\n typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n const ariaLabel = element.getAttribute('aria-label');\n const attributes = getAttributesWithPrefix(element, dataAttributePrefix);\n const nearestLabel = getNearestLabel(element);\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID]: element.getAttribute('id') || '',\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS]: element.getAttribute('class'),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: getHierarchy(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT]: rect.left == null ? null : Math.round(rect.left),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP]: rect.top == null ? null : Math.round(rect.top),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL]: ariaLabel,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]: (typeof document !== 'undefined' && document.title) || '',\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = element.href;\n }\n return removeEmptyProperties(properties);\n};\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport const addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\n): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(baseEvent.event.target as HTMLElement, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n};\n\n// Base TimestampedEvent type\nexport type BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation';\n};\n\n// Specific types for events with targetElementProperties\nexport type ElementBasedEvent = MouseEvent | Event;\nexport type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {\n event: MouseEvent | Event;\n type: 'click' | 'change';\n closestTrackedAncestor: Element;\n targetElementProperties: Record<string, any>;\n};\n\nexport type evaluateTriggersFn = <T extends ElementBasedEvent>(\n event: ElementBasedTimestampedEvent<T>,\n) => ElementBasedTimestampedEvent<T>;\n\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\n// Type predicate\nexport function isElementBasedEvent<T>(event: BaseTimestampedEvent<T>): event is ElementBasedTimestampedEvent<T> {\n return event.type === 'click' || event.type === 'change';\n}\n"]}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport * as constants from './constants';\nimport { ElementInteractionsOptions, ActionType } from '@amplitude/analytics-core';\nimport { getHierarchy } from './hierarchy';\n\nexport type JSONValue = string | number | boolean | null | { [x: string]: JSONValue } | Array<JSONValue>;\n\nconst SENSITIVE_TAGS = ['input', 'select', 'textarea'];\n\nexport type shouldTrackEvent = (actionType: ActionType, element: Element) => boolean;\n\nexport const isElementPointerCursor = (element: Element, actionType: ActionType): boolean => {\n /* istanbul ignore next */\n const computedStyle = window?.getComputedStyle?.(element);\n /* istanbul ignore next */\n return computedStyle?.getPropertyValue('cursor') === 'pointer' && actionType === 'click';\n};\n\nexport const createShouldTrackEvent = (\n autocaptureOptions: ElementInteractionsOptions,\n allowlist: string[], // this can be any type of css selector allow list\n isAlwaysCaptureCursorPointer = false,\n): shouldTrackEvent => {\n return (actionType: ActionType, element: Element) => {\n const { pageUrlAllowlist, shouldTrackEventResolver } = autocaptureOptions;\n\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n // window, document, and Text nodes have no tag\n if (!tag) {\n return false;\n }\n\n if (shouldTrackEventResolver) {\n return shouldTrackEventResolver(actionType, element);\n }\n\n if (!isPageUrlAllowed(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n /* istanbul ignore next */\n const elementType = String(element?.getAttribute('type')) || '';\n if (typeof elementType === 'string') {\n switch (elementType.toLowerCase()) {\n case 'hidden':\n return false;\n case 'password':\n return false;\n }\n }\n\n const isCursorPointer = isElementPointerCursor(element, actionType);\n\n if (isAlwaysCaptureCursorPointer && isCursorPointer) {\n return true;\n }\n\n /* istanbul ignore if */\n if (allowlist) {\n const hasMatchAnyAllowedSelector = allowlist.some((selector) => !!element?.matches?.(selector));\n if (!hasMatchAnyAllowedSelector) {\n return false;\n }\n }\n\n switch (tag) {\n case 'input':\n case 'select':\n case 'textarea':\n return actionType === 'change' || actionType === 'click';\n default: {\n /* istanbul ignore next */\n /* istanbul ignore next */\n if (isCursorPointer) {\n return true;\n }\n return actionType === 'click';\n }\n }\n };\n};\n\nexport const isNonSensitiveString = (text: string | null) => {\n if (text == null) {\n return false;\n }\n if (typeof text === 'string') {\n const ccRegex =\n /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/;\n if (ccRegex.test((text || '').replace(/[- ]/g, ''))) {\n return false;\n }\n const ssnRegex = /(^\\d{3}-?\\d{2}-?\\d{4}$)/;\n if (ssnRegex.test(text)) {\n return false;\n }\n }\n return true;\n};\n\nexport const isTextNode = (node: Node) => {\n return !!node && node.nodeType === 3;\n};\n\nexport const isNonSensitiveElement = (element: Element) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n const isContentEditable =\n element instanceof HTMLElement ? element.getAttribute('contenteditable')?.toLowerCase() === 'true' : false;\n\n return !SENSITIVE_TAGS.includes(tag) && !isContentEditable;\n};\n\n// Maybe this can be simplified with element.innerText, keep and manual concatenating for now, more research needed.\nexport const getText = (element: Element): string => {\n let text = '';\n if (isNonSensitiveElement(element) && element.childNodes && element.childNodes.length) {\n element.childNodes.forEach((child) => {\n let childText = '';\n if (isTextNode(child)) {\n if (child.textContent) {\n childText = child.textContent;\n }\n } else {\n childText = getText(child as Element);\n }\n text += childText\n .split(/(\\s+)/)\n .filter(isNonSensitiveString)\n .join('')\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n .substring(0, 255);\n });\n }\n return text;\n};\n\nexport const isPageUrlAllowed = (url: string, pageUrlAllowlist: (string | RegExp)[] | undefined) => {\n if (!pageUrlAllowlist || !pageUrlAllowlist.length) {\n return true;\n }\n return pageUrlAllowlist.some((allowedUrl) => {\n if (typeof allowedUrl === 'string') {\n return url === allowedUrl;\n }\n return url.match(allowedUrl);\n });\n};\n\nexport const getAttributesWithPrefix = (element: Element, prefix: string): { [key: string]: string } => {\n return element.getAttributeNames().reduce((attributes: { [key: string]: string }, attributeName) => {\n if (attributeName.startsWith(prefix)) {\n const attributeKey = attributeName.replace(prefix, '');\n const attributeValue = element.getAttribute(attributeName);\n if (attributeKey) {\n attributes[attributeKey] = attributeValue || '';\n }\n }\n return attributes;\n }, {});\n};\n\nexport const isEmpty = (value: unknown) => {\n return (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n (typeof value === 'string' && value.trim().length === 0)\n );\n};\n\nexport const removeEmptyProperties = (properties: { [key: string]: unknown }) => {\n return Object.keys(properties).reduce((filteredProperties: { [key: string]: unknown }, key) => {\n const value = properties[key];\n if (!isEmpty(value)) {\n filteredProperties[key] = value;\n }\n return filteredProperties;\n }, {});\n};\n\nexport const getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch (error) {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n const labelText = labelElement.textContent || '';\n return isNonSensitiveString(labelText) ? labelText : '';\n }\n return getNearestLabel(parent);\n};\n\nexport const querySelectUniqueElements = (root: Element | Document, selectors: string[]): Element[] => {\n if (root && 'querySelectorAll' in root && typeof root.querySelectorAll === 'function') {\n const elementSet = selectors.reduce((elements: Set<Element>, selector) => {\n if (selector) {\n const selectedElements = Array.from(root.querySelectorAll(selector));\n selectedElements.forEach((element) => {\n elements.add(element);\n });\n }\n return elements;\n }, new Set<Element>());\n return Array.from(elementSet);\n }\n return [];\n};\n\n// Similar as element.closest, but works with multiple selectors\nexport const getClosestElement = (element: Element | null, selectors: string[]): Element | null => {\n if (!element) {\n return null;\n }\n /* istanbul ignore next */\n if (selectors.some((selector) => element?.matches?.(selector))) {\n return element;\n }\n /* istanbul ignore next */\n return getClosestElement(element?.parentElement, selectors);\n};\n\n// Returns the element properties for the given element in Visual Labeling.\nexport const getEventTagProps = (element: Element) => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties: Record<string, JSONValue> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties);\n};\n\nexport const asyncLoadScript = (url: string) => {\n return new Promise((resolve, reject) => {\n try {\n const scriptElement = document.createElement('script');\n scriptElement.type = 'text/javascript';\n scriptElement.async = true;\n scriptElement.src = url;\n scriptElement.addEventListener(\n 'load',\n () => {\n resolve({ status: true });\n },\n { once: true },\n );\n scriptElement.addEventListener('error', () => {\n reject({\n status: false,\n message: `Failed to load the script ${url}`,\n });\n });\n /* istanbul ignore next */\n document.head?.appendChild(scriptElement);\n } catch (error) {\n /* istanbul ignore next */\n reject(error);\n }\n });\n};\n\nexport function generateUniqueId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\nexport const filterOutNonTrackableEvents = (event: ElementBasedTimestampedEvent<ElementBasedEvent>): boolean => {\n // Filter out changeEvent events with no target\n // This could happen when change events are triggered programmatically\n if (event.event.target === null || !event.closestTrackedAncestor) {\n return false;\n }\n\n return true;\n};\n\n// Returns the Amplitude event properties for the given element.\nexport const getEventProperties = (actionType: ActionType, element: Element, dataAttributePrefix: string) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n /* istanbul ignore next */\n const rect =\n typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n const ariaLabel = element.getAttribute('aria-label');\n const attributes = getAttributesWithPrefix(element, dataAttributePrefix);\n const nearestLabel = getNearestLabel(element);\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID]: element.getAttribute('id') || '',\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS]: element.getAttribute('class'),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: getHierarchy(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT]: rect.left == null ? null : Math.round(rect.left),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP]: rect.top == null ? null : Math.round(rect.top),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL]: ariaLabel,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]: (typeof document !== 'undefined' && document.title) || '',\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = element.href;\n }\n return removeEmptyProperties(properties);\n};\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport const addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\n\n // capture the event if the cursor is a \"pointer\" when this element is clicked on\n // reason: a \"pointer\" cursor indicates that an element should be interactable\n // regardless of the element's tag name\n isCapturingCursorPointer = false,\n): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n if (isCapturingCursorPointer) {\n const isCursorPointer = isElementPointerCursor(baseEvent.event.target as Element, baseEvent.type);\n if (isCursorPointer) {\n baseEvent.closestTrackedAncestor = baseEvent.event.target as HTMLElement;\n baseEvent.targetElementProperties = getEventProperties(\n baseEvent.type,\n baseEvent.closestTrackedAncestor,\n dataAttributePrefix,\n );\n return baseEvent;\n }\n }\n // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(baseEvent.event.target as HTMLElement, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n};\n\n// Base TimestampedEvent type\nexport type BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation';\n};\n\n// Specific types for events with targetElementProperties\nexport type ElementBasedEvent = MouseEvent | Event;\nexport type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {\n event: MouseEvent | Event;\n type: 'click' | 'change';\n closestTrackedAncestor: Element;\n targetElementProperties: Record<string, any>;\n};\n\nexport type evaluateTriggersFn = <T extends ElementBasedEvent>(\n event: ElementBasedTimestampedEvent<T>,\n) => ElementBasedTimestampedEvent<T>;\n\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\n// Type predicate\nexport function isElementBasedEvent<T>(event: BaseTimestampedEvent<T>): event is ElementBasedTimestampedEvent<T> {\n return event.type === 'click' || event.type === 'change';\n}\n\nexport interface NavigateEvent extends Event {\n readonly navigationType: 'reload' | 'push' | 'replace' | 'traverse';\n readonly destination: {\n readonly url: string;\n readonly key: string | null;\n readonly id: string | null;\n readonly index: number;\n readonly sameDocument: boolean;\n\n getState(): any;\n };\n readonly canIntercept: boolean;\n readonly userInitiated: boolean;\n readonly hashChange: boolean;\n readonly signal: AbortSignal;\n readonly formData: FormData | null;\n readonly downloadRequest: string | null;\n readonly info: any;\n readonly hasUAVisualTransition: boolean;\n /** @see https://github.com/WICG/navigation-api/pull/264 */\n readonly sourceElement: Element | null;\n\n scroll(): void;\n}\n"]}
@@ -1,3 +1,4 @@
1
1
  export { autocapturePlugin as plugin, autocapturePlugin } from './autocapture-plugin';
2
+ export { frustrationPlugin } from './frustration-plugin';
2
3
  export { Action, ActionData, Message, WindowMessenger } from './libs/messenger';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,MAAM,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,MAAM,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
package/lib/cjs/index.js CHANGED
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WindowMessenger = exports.autocapturePlugin = exports.plugin = void 0;
3
+ exports.WindowMessenger = exports.frustrationPlugin = exports.autocapturePlugin = exports.plugin = void 0;
4
4
  var autocapture_plugin_1 = require("./autocapture-plugin");
5
5
  Object.defineProperty(exports, "plugin", { enumerable: true, get: function () { return autocapture_plugin_1.autocapturePlugin; } });
6
6
  Object.defineProperty(exports, "autocapturePlugin", { enumerable: true, get: function () { return autocapture_plugin_1.autocapturePlugin; } });
7
+ var frustration_plugin_1 = require("./frustration-plugin");
8
+ Object.defineProperty(exports, "frustrationPlugin", { enumerable: true, get: function () { return frustration_plugin_1.frustrationPlugin; } });
7
9
  var messenger_1 = require("./libs/messenger");
8
10
  Object.defineProperty(exports, "WindowMessenger", { enumerable: true, get: function () { return messenger_1.WindowMessenger; } });
9
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,2DAAsF;AAA7E,4GAAA,iBAAiB,OAAU;AAAE,uHAAA,iBAAiB,OAAA;AACvD,8CAAgF;AAA1C,4GAAA,eAAe,OAAA","sourcesContent":["export { autocapturePlugin as plugin, autocapturePlugin } from './autocapture-plugin';\nexport { Action, ActionData, Message, WindowMessenger } from './libs/messenger';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,2DAAsF;AAA7E,4GAAA,iBAAiB,OAAU;AAAE,uHAAA,iBAAiB,OAAA;AACvD,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,8CAAgF;AAA1C,4GAAA,eAAe,OAAA","sourcesContent":["export { autocapturePlugin as plugin, autocapturePlugin } from './autocapture-plugin';\nexport { frustrationPlugin } from './frustration-plugin';\nexport { Action, ActionData, Message, WindowMessenger } from './libs/messenger';\n"]}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "1.3.0";
1
+ export declare const VERSION = "1.4.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = '1.3.0';
4
+ exports.VERSION = '1.4.0';
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,OAAO,CAAC","sourcesContent":["export const VERSION = '1.3.0';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,OAAO,CAAC","sourcesContent":["export const VERSION = '1.4.0';\n"]}
@@ -0,0 +1,11 @@
1
+ import { AllWindowObservables } from 'src/autocapture-plugin';
2
+ import { BrowserClient, ActionType } from '@amplitude/analytics-core';
3
+ import { shouldTrackEvent } from '../helpers';
4
+ export declare function _overrideDeadClickConfig(deadClickTimeout: number): void;
5
+ export declare function trackDeadClick({ amplitude, allObservables, getEventProperties, shouldTrackDeadClick, }: {
6
+ amplitude: BrowserClient;
7
+ allObservables: AllWindowObservables;
8
+ getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;
9
+ shouldTrackDeadClick: shouldTrackEvent;
10
+ }): import("rxjs").Subscription;
11
+ //# sourceMappingURL=track-dead-click.d.ts.map
@@ -0,0 +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,+BA2DA"}
@@ -0,0 +1,45 @@
1
+ import { __assign, __read, __spreadArray } from "tslib";
2
+ import { filter, map, merge, take, mergeMap, race, Observable, throttleTime } from 'rxjs';
3
+ import { filterOutNonTrackableEvents } from '../helpers';
4
+ import { AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT } from '../constants';
5
+ var DEAD_CLICK_TIMEOUT = 3000; // 3 seconds to wait for an activity to happen
6
+ // allow override of dead click config for testing only
7
+ export function _overrideDeadClickConfig(deadClickTimeout) {
8
+ DEAD_CLICK_TIMEOUT = deadClickTimeout;
9
+ }
10
+ export function trackDeadClick(_a) {
11
+ var amplitude = _a.amplitude, allObservables = _a.allObservables, getEventProperties = _a.getEventProperties, shouldTrackDeadClick = _a.shouldTrackDeadClick;
12
+ var clickObservable = allObservables.clickObservable, mutationObservable = allObservables.mutationObservable, navigateObservable = allObservables.navigateObservable;
13
+ var filteredClickObservable = clickObservable.pipe(filter(filterOutNonTrackableEvents), filter(function (clickEvent) {
14
+ // Only track change on elements that should be tracked
15
+ return shouldTrackDeadClick('click', clickEvent.closestTrackedAncestor);
16
+ }));
17
+ var changeObservables = [mutationObservable];
18
+ if (navigateObservable) {
19
+ changeObservables.push(navigateObservable);
20
+ }
21
+ var mutationOrNavigate = merge.apply(void 0, __spreadArray([], __read(changeObservables), false));
22
+ var actionClicks = filteredClickObservable.pipe(mergeMap(function (click) {
23
+ // Create a timer that emits after 500ms
24
+ var timeoutId;
25
+ var timer = new Observable(function (subscriber) {
26
+ timeoutId = setTimeout(function () { return subscriber.next(click); }, DEAD_CLICK_TIMEOUT);
27
+ return function () {
28
+ clearTimeout(timeoutId);
29
+ };
30
+ });
31
+ // Race between the timer and any mutations/navigation
32
+ // if the timer wins, the click is dead so we emit it
33
+ return race(timer, mutationOrNavigate.pipe(take(1), map(function () { return null; }))).pipe(filter(function (value) { return value !== null; }));
34
+ }),
35
+ // Only allow one dead click event every 3 seconds
36
+ throttleTime(DEAD_CLICK_TIMEOUT));
37
+ return actionClicks.subscribe(function (actionClick) {
38
+ var deadClickEvent = {
39
+ X: actionClick.event.clientX,
40
+ Y: actionClick.event.clientY,
41
+ };
42
+ amplitude.track(AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT, __assign(__assign({}, getEventProperties('click', actionClick.closestTrackedAncestor)), deadClickEvent), { time: actionClick.timestamp });
43
+ });
44
+ }
45
+ //# sourceMappingURL=track-dead-click.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-dead-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAc,YAAY,EAAE,MAAM,MAAM,CAAC;AAEtG,OAAO,EAAgC,2BAA2B,EAAoB,MAAM,YAAY,CAAC;AACzG,OAAO,EAAE,oCAAoC,EAAE,MAAM,cAAc,CAAC;AAEpE,IAAI,kBAAkB,GAAG,IAAI,CAAC,CAAC,8CAA8C;AAE7E,uDAAuD;AACvD,MAAM,UAAU,wBAAwB,CAAC,gBAAwB;IAC/D,kBAAkB,GAAG,gBAAgB,CAAC;AACxC,CAAC;AAOD,MAAM,UAAU,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,MAAM,CAAC,2BAA2B,CAAC,EACnC,MAAM,CAAC,UAAC,UAAU;QAChB,uDAAuD;QACvD,OAAO,oBAAoB,CAAC,OAAO,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC1E,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,KAAK,wCAAI,iBAAiB,UAAC,CAAC;IAEvD,IAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAC/C,QAAQ,CAAC,UAAC,KAAK;QACb,wCAAwC;QACxC,IAAI,SAAwC,CAAC;QAC7C,IAAM,KAAK,GAAG,IAAI,UAAU,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,IAAI,CACT,KAAK,EACL,kBAAkB,CAAC,IAAI,CACrB,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,cAAM,OAAA,IAAI,EAAJ,CAAI,CAAC,CAChB,CACF,CAAC,IAAI,CAAC,MAAM,CAAC,UAAC,KAAK,IAAwD,OAAA,KAAK,KAAK,IAAI,EAAd,CAAc,CAAC,CAAC,CAAC;IAC/F,CAAC,CAAC;IACF,kDAAkD;IAClD,YAAY,CAAC,kBAAkB,CAAC,CACjC,CAAC;IAEF,OAAO,YAAY,CAAC,SAAS,CAAC,UAAC,WAAW;QACxC,IAAM,cAAc,GAAmB;YACrC,CAAC,EAAG,WAAW,CAAC,KAAoB,CAAC,OAAO;YAC5C,CAAC,EAAG,WAAW,CAAC,KAAoB,CAAC,OAAO;SAC7C,CAAC;QACF,SAAS,CAAC,KAAK,CACb,oCAAoC,wBAE/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","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 X: number;\n 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 );\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 X: (actionClick.event as MouseEvent).clientX,\n 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"]}
@@ -0,0 +1,10 @@
1
+ import { AllWindowObservables } from 'src/autocapture-plugin';
2
+ import { BrowserClient } from '@amplitude/analytics-core';
3
+ import { shouldTrackEvent } from '../helpers';
4
+ export declare function _overrideRageClickConfig(rageClickThreshold: number, rageClickWindowMs: number): void;
5
+ export declare function trackRageClicks({ amplitude, allObservables, shouldTrackRageClick, }: {
6
+ amplitude: BrowserClient;
7
+ allObservables: AllWindowObservables;
8
+ shouldTrackRageClick: shouldTrackEvent;
9
+ }): import("rxjs").Subscription;
10
+ //# sourceMappingURL=track-rage-click.d.ts.map
@@ -0,0 +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,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQ3E,wBAAgB,wBAAwB,CAAC,kBAAkB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,QAG7F;AAgBD,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,+BAmDA"}
@@ -0,0 +1,50 @@
1
+ import { __assign } from "tslib";
2
+ import { filter, map, bufferTime } from 'rxjs';
3
+ import { filterOutNonTrackableEvents } from '../helpers';
4
+ import { AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT } from '../constants';
5
+ import { DEFAULT_RAGE_CLICK_THRESHOLD, DEFAULT_RAGE_CLICK_WINDOW_MS } from '@amplitude/analytics-core';
6
+ var RAGE_CLICK_THRESHOLD = DEFAULT_RAGE_CLICK_THRESHOLD;
7
+ var RAGE_CLICK_WINDOW_MS = DEFAULT_RAGE_CLICK_WINDOW_MS;
8
+ // allow override of rage click config for testing only
9
+ export function _overrideRageClickConfig(rageClickThreshold, rageClickWindowMs) {
10
+ RAGE_CLICK_THRESHOLD = rageClickThreshold;
11
+ RAGE_CLICK_WINDOW_MS = rageClickWindowMs;
12
+ }
13
+ export function trackRageClicks(_a) {
14
+ var amplitude = _a.amplitude, allObservables = _a.allObservables, shouldTrackRageClick = _a.shouldTrackRageClick;
15
+ var clickObservable = allObservables.clickObservable;
16
+ // Buffer clicks within a RAGE_CLICK_WINDOW_MS window and filter for rage clicks
17
+ var rageClickObservable = clickObservable.pipe(filter(filterOutNonTrackableEvents), filter(function (click) {
18
+ return shouldTrackRageClick('click', click.closestTrackedAncestor);
19
+ }), bufferTime(RAGE_CLICK_WINDOW_MS), filter(function (clicks) {
20
+ // filter if not enough clicks to be a rage click
21
+ if (clicks.length < RAGE_CLICK_THRESHOLD) {
22
+ return false;
23
+ }
24
+ // filter if the last RAGE_CLICK_THRESHOLD clicks were not all on the same element
25
+ var trailingIndex = clicks.length - 1;
26
+ var lastClickTarget = clicks[trailingIndex].event.target;
27
+ while (--trailingIndex >= clicks.length - RAGE_CLICK_THRESHOLD) {
28
+ if (clicks[trailingIndex].event.target !== lastClickTarget) {
29
+ return false;
30
+ }
31
+ }
32
+ // if we reach here that means the last RAGE_CLICK_THRESHOLD clicks were all on the same element
33
+ // and thus we have a rage click
34
+ return true;
35
+ }), map(function (clicks) {
36
+ var firstClick = clicks[0];
37
+ var lastClick = clicks[clicks.length - 1];
38
+ var rageClickEvent = __assign({ '[Amplitude] Begin Time': new Date(firstClick.timestamp).toISOString(), '[Amplitude] End Time': new Date(lastClick.timestamp).toISOString(), '[Amplitude] Duration': lastClick.timestamp - firstClick.timestamp, '[Amplitude] Clicks': clicks.map(function (click) { return ({
39
+ X: click.event.clientX,
40
+ Y: click.event.clientY,
41
+ Time: click.timestamp,
42
+ }); }), '[Amplitude] Click Count': clicks.length }, firstClick.targetElementProperties);
43
+ return { rageClickEvent: rageClickEvent, time: firstClick.timestamp };
44
+ }));
45
+ return rageClickObservable.subscribe(function (_a) {
46
+ var rageClickEvent = _a.rageClickEvent, time = _a.time;
47
+ amplitude.track(AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT, rageClickEvent, { time: time });
48
+ });
49
+ }
50
+ //# sourceMappingURL=track-rage-click.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-rage-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-rage-click.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllWindowObservables } from 'src/autocapture-plugin';\nimport { filter, map, bufferTime } from 'rxjs';\nimport { BrowserClient } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT } from '../constants';\nimport { DEFAULT_RAGE_CLICK_THRESHOLD, DEFAULT_RAGE_CLICK_WINDOW_MS } from '@amplitude/analytics-core';\n\nlet RAGE_CLICK_THRESHOLD = DEFAULT_RAGE_CLICK_THRESHOLD;\nlet RAGE_CLICK_WINDOW_MS = DEFAULT_RAGE_CLICK_WINDOW_MS;\n\n// allow override of rage click config for testing only\nexport function _overrideRageClickConfig(rageClickThreshold: number, rageClickWindowMs: number) {\n RAGE_CLICK_THRESHOLD = rageClickThreshold;\n RAGE_CLICK_WINDOW_MS = rageClickWindowMs;\n}\n\ntype Click = {\n X: number;\n Y: number;\n Time: number;\n};\n\ntype EventRageClick = {\n '[Amplitude] Begin Time': string; // ISO-8601\n '[Amplitude] End Time': string; // ISO-8601\n '[Amplitude] Duration': number;\n '[Amplitude] Clicks': Array<Click>;\n '[Amplitude] Click Count': number;\n};\n\nexport function trackRageClicks({\n amplitude,\n allObservables,\n shouldTrackRageClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n shouldTrackRageClick: shouldTrackEvent;\n}) {\n const { clickObservable } = allObservables;\n\n // Buffer clicks within a RAGE_CLICK_WINDOW_MS window and filter for rage clicks\n const rageClickObservable = clickObservable.pipe(\n filter(filterOutNonTrackableEvents),\n filter((click) => {\n return shouldTrackRageClick('click', click.closestTrackedAncestor);\n }),\n bufferTime(RAGE_CLICK_WINDOW_MS),\n filter((clicks) => {\n // filter if not enough clicks to be a rage click\n if (clicks.length < RAGE_CLICK_THRESHOLD) {\n return false;\n }\n\n // filter if the last RAGE_CLICK_THRESHOLD clicks were not all on the same element\n let trailingIndex = clicks.length - 1;\n const lastClickTarget = clicks[trailingIndex].event.target;\n while (--trailingIndex >= clicks.length - RAGE_CLICK_THRESHOLD) {\n if (clicks[trailingIndex].event.target !== lastClickTarget) {\n return false;\n }\n }\n\n // if we reach here that means the last RAGE_CLICK_THRESHOLD clicks were all on the same element\n // and thus we have a rage click\n return true;\n }),\n map((clicks) => {\n const firstClick = clicks[0];\n const lastClick = clicks[clicks.length - 1];\n const rageClickEvent: EventRageClick = {\n '[Amplitude] Begin Time': new Date(firstClick.timestamp).toISOString(),\n '[Amplitude] End Time': new Date(lastClick.timestamp).toISOString(),\n '[Amplitude] Duration': lastClick.timestamp - firstClick.timestamp,\n '[Amplitude] Clicks': clicks.map((click) => ({\n X: (click.event as MouseEvent).clientX,\n Y: (click.event as MouseEvent).clientY,\n Time: click.timestamp,\n })),\n '[Amplitude] Click Count': clicks.length,\n ...firstClick.targetElementProperties,\n };\n return { rageClickEvent, time: firstClick.timestamp };\n }),\n );\n\n return rageClickObservable.subscribe(({ rageClickEvent, time }) => {\n amplitude.track(AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT, rageClickEvent, { time });\n });\n}\n"]}
@@ -1,34 +1,12 @@
1
1
  import { BrowserClient, BrowserConfig, EnrichmentPlugin, ElementInteractionsOptions } from '@amplitude/analytics-core';
2
2
  import { Observable } from 'rxjs';
3
- import { ElementBasedTimestampedEvent, TimestampedEvent } from './helpers';
3
+ import { ElementBasedTimestampedEvent, TimestampedEvent, NavigateEvent } from './helpers';
4
4
  import { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';
5
5
  declare global {
6
6
  interface Window {
7
7
  navigation: HasEventTargetAddRemove<Event>;
8
8
  }
9
9
  }
10
- interface NavigateEvent extends Event {
11
- readonly navigationType: 'reload' | 'push' | 'replace' | 'traverse';
12
- readonly destination: {
13
- readonly url: string;
14
- readonly key: string | null;
15
- readonly id: string | null;
16
- readonly index: number;
17
- readonly sameDocument: boolean;
18
- getState(): any;
19
- };
20
- readonly canIntercept: boolean;
21
- readonly userInitiated: boolean;
22
- readonly hashChange: boolean;
23
- readonly signal: AbortSignal;
24
- readonly formData: FormData | null;
25
- readonly downloadRequest: string | null;
26
- readonly info: any;
27
- readonly hasUAVisualTransition: boolean;
28
- /** @see https://github.com/WICG/navigation-api/pull/264 */
29
- readonly sourceElement: Element | null;
30
- scroll(): void;
31
- }
32
10
  type BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;
33
11
  export type AutoCaptureOptionsWithDefaults = Required<Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>> & ElementInteractionsOptions;
34
12
  export declare enum ObservablesEnum {
@@ -1 +1 @@
1
- {"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,0BAA0B,EAI3B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAkB,UAAU,EAAuB,MAAM,MAAM,CAAC;AACvE,OAAO,EAIL,4BAA4B,EAC5B,gBAAgB,EAEjB,MAAM,WAAW,CAAC;AAKnB,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAW7E,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC;KAC5C;CACF;AAED,UAAU,aAAc,SAAQ,KAAK;IACnC,QAAQ,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;IACpE,QAAQ,CAAC,WAAW,EAAE;QACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;QAE/B,QAAQ,IAAI,GAAG,CAAC;KACjB,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;IACnB,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,2DAA2D;IAC3D,QAAQ,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAEvC,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,KAAK,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE9E,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CACnD,IAAI,CAAC,0BAA0B,EAAE,cAAc,GAAG,sBAAsB,GAAG,sBAAsB,CAAC,CACnG,GACC,0BAA0B,CAAC;AAE7B,oBAAY,eAAe;IACzB,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IAErC,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC;IACxF,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpF,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9F,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;CACtF;AAED,eAAO,MAAM,iBAAiB,aAAa,0BAA0B,KAAQ,uBAyM5E,CAAC"}
1
+ {"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,0BAA0B,EAI3B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAkB,UAAU,EAAuB,MAAM,MAAM,CAAC;AACvE,OAAO,EAIL,4BAA4B,EAC5B,gBAAgB,EAEhB,aAAa,EACd,MAAM,WAAW,CAAC;AAKnB,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAW7E,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC;KAC5C;CACF;AAED,KAAK,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE9E,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CACnD,IAAI,CAAC,0BAA0B,EAAE,cAAc,GAAG,sBAAsB,GAAG,sBAAsB,CAAC,CACnG,GACC,0BAA0B,CAAC;AAE7B,oBAAY,eAAe;IACzB,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IAErC,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC;IACxF,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpF,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9F,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;CACtF;AAED,eAAO,MAAM,iBAAiB,aAAa,0BAA0B,KAAQ,uBAyM5E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"autocapture-plugin.js","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n ElementInteractionsOptions,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { fromEvent, map, Observable, Subscription, share } from 'rxjs';\nimport {\n addAdditionalEventProperties,\n createShouldTrackEvent,\n getEventProperties,\n ElementBasedTimestampedEvent,\n TimestampedEvent,\n ElementBasedEvent,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';\nimport { createMutationObservable, createClickObservable } from './observables';\n\nimport {\n createLabeledEventToTriggerMap,\n groupLabeledEventIdsByEventType,\n matchEventToLabeledEvents,\n matchLabeledEventsToTriggers,\n} from './pageActions/triggers';\nimport { executeActions } from './pageActions/actions';\n\ndeclare global {\n interface Window {\n navigation: HasEventTargetAddRemove<Event>;\n }\n}\n\ninterface NavigateEvent extends Event {\n readonly navigationType: 'reload' | 'push' | 'replace' | 'traverse';\n readonly destination: {\n readonly url: string;\n readonly key: string | null;\n readonly id: string | null;\n readonly index: number;\n readonly sameDocument: boolean;\n\n getState(): any;\n };\n readonly canIntercept: boolean;\n readonly userInitiated: boolean;\n readonly hashChange: boolean;\n readonly signal: AbortSignal;\n readonly formData: FormData | null;\n readonly downloadRequest: string | null;\n readonly info: any;\n readonly hasUAVisualTransition: boolean;\n /** @see https://github.com/WICG/navigation-api/pull/264 */\n readonly sourceElement: Element | null;\n\n scroll(): void;\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport enum ObservablesEnum {\n ClickObservable = 'clickObservable',\n ChangeObservable = 'changeObservable',\n // ErrorObservable = 'errorObservable',\n NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n}\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;\n // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;\n [ObservablesEnum.NavigateObservable]: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n}\n\nexport const autocapturePlugin = (options: ElementInteractionsOptions = {}): BrowserEnrichmentPlugin => {\n const {\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0; // TODO: update this when rage clicks are added to 1000ms\n\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Subscription[] = [];\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n // Create Observables from direct user events\n const clickObservable = createClickObservable().pipe(\n map((click) =>\n addAdditionalEventProperties(\n click,\n 'click',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n const changeObservable = fromEvent<Event>(document, 'change', { capture: true }).pipe(\n map((change) =>\n addAdditionalEventProperties(\n change,\n 'change',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n\n // Create Observable from unhandled errors\n // const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(\n // map((error) => addAdditionalEventProperties(error, 'error')),\n // );\n\n // Create observable for URL changes\n let navigateObservable;\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = fromEvent<NavigateEvent>(window.navigation, 'navigate').pipe(\n map((navigate) =>\n addAdditionalEventProperties(\n navigate,\n 'navigate',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n }\n\n // Track DOM Mutations using shared observable\n const mutationObservable = createMutationObservable().pipe(\n map((mutation) =>\n addAdditionalEventProperties(\n mutation,\n 'mutation',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n\n return {\n [ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,\n [ObservablesEnum.ChangeObservable]: changeObservable as Observable<ElementBasedTimestampedEvent<Event>>,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n [ObservablesEnum.NavigateObservable]: navigateObservable,\n [ObservablesEnum.MutationObservable]: mutationObservable,\n };\n };\n\n // Group labeled events by event type (eg. click, change)\n const groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions?.labeledEvents ?? {}));\n\n const labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions?.triggers ?? []);\n\n // Evaluate triggers for the given event by running the actions associated with the matching triggers\n const evaluateTriggers = <T extends ElementBasedEvent>(\n event: ElementBasedTimestampedEvent<T>,\n ): ElementBasedTimestampedEvent<T> => {\n // If there is no pageActions, return the event as is\n const { pageActions } = options;\n if (!pageActions) {\n return event;\n }\n\n // Find matching labeled events\n const matchingLabeledEvents = matchEventToLabeledEvents(\n event,\n Array.from(groupedLabeledEvents[event.type]).map((id) => pageActions.labeledEvents[id]),\n );\n // Find matching conditions\n const matchingTriggers = matchLabeledEventsToTriggers(matchingLabeledEvents, labeledEventToTriggerMap);\n for (const trigger of matchingTriggers) {\n executeActions(trigger.actions, event);\n }\n\n return event;\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Create should track event functions the different allowlists\n const shouldTrackEvent = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n const shouldTrackActionClick = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist,\n );\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions\n const clickTrackingSubscription = trackClicks({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers,\n });\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties: (...args) => getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers,\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties: (...args) => getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n subscriptions.push(actionClickSubscription);\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
1
+ {"version":3,"file":"autocapture-plugin.js","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n ElementInteractionsOptions,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { fromEvent, map, Observable, Subscription, share } from 'rxjs';\nimport {\n addAdditionalEventProperties,\n createShouldTrackEvent,\n getEventProperties,\n ElementBasedTimestampedEvent,\n TimestampedEvent,\n ElementBasedEvent,\n NavigateEvent,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';\nimport { createMutationObservable, createClickObservable } from './observables';\n\nimport {\n createLabeledEventToTriggerMap,\n groupLabeledEventIdsByEventType,\n matchEventToLabeledEvents,\n matchLabeledEventsToTriggers,\n} from './pageActions/triggers';\nimport { executeActions } from './pageActions/actions';\n\ndeclare global {\n interface Window {\n navigation: HasEventTargetAddRemove<Event>;\n }\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport enum ObservablesEnum {\n ClickObservable = 'clickObservable',\n ChangeObservable = 'changeObservable',\n // ErrorObservable = 'errorObservable',\n NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n}\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;\n // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;\n [ObservablesEnum.NavigateObservable]: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n}\n\nexport const autocapturePlugin = (options: ElementInteractionsOptions = {}): BrowserEnrichmentPlugin => {\n const {\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0; // TODO: update this when rage clicks are added to 1000ms\n\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Subscription[] = [];\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n // Create Observables from direct user events\n const clickObservable = createClickObservable().pipe(\n map((click) =>\n addAdditionalEventProperties(\n click,\n 'click',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n const changeObservable = fromEvent<Event>(document, 'change', { capture: true }).pipe(\n map((change) =>\n addAdditionalEventProperties(\n change,\n 'change',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n\n // Create Observable from unhandled errors\n // const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(\n // map((error) => addAdditionalEventProperties(error, 'error')),\n // );\n\n // Create observable for URL changes\n let navigateObservable;\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = fromEvent<NavigateEvent>(window.navigation, 'navigate').pipe(\n map((navigate) =>\n addAdditionalEventProperties(\n navigate,\n 'navigate',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n }\n\n // Track DOM Mutations using shared observable\n const mutationObservable = createMutationObservable().pipe(\n map((mutation) =>\n addAdditionalEventProperties(\n mutation,\n 'mutation',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n share(),\n );\n\n return {\n [ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,\n [ObservablesEnum.ChangeObservable]: changeObservable as Observable<ElementBasedTimestampedEvent<Event>>,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n [ObservablesEnum.NavigateObservable]: navigateObservable,\n [ObservablesEnum.MutationObservable]: mutationObservable,\n };\n };\n\n // Group labeled events by event type (eg. click, change)\n const groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions?.labeledEvents ?? {}));\n\n const labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions?.triggers ?? []);\n\n // Evaluate triggers for the given event by running the actions associated with the matching triggers\n const evaluateTriggers = <T extends ElementBasedEvent>(\n event: ElementBasedTimestampedEvent<T>,\n ): ElementBasedTimestampedEvent<T> => {\n // If there is no pageActions, return the event as is\n const { pageActions } = options;\n if (!pageActions) {\n return event;\n }\n\n // Find matching labeled events\n const matchingLabeledEvents = matchEventToLabeledEvents(\n event,\n Array.from(groupedLabeledEvents[event.type]).map((id) => pageActions.labeledEvents[id]),\n );\n // Find matching conditions\n const matchingTriggers = matchLabeledEventsToTriggers(matchingLabeledEvents, labeledEventToTriggerMap);\n for (const trigger of matchingTriggers) {\n executeActions(trigger.actions, event);\n }\n\n return event;\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Create should track event functions the different allowlists\n const shouldTrackEvent = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n const shouldTrackActionClick = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist,\n );\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions\n const clickTrackingSubscription = trackClicks({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers,\n });\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties: (...args) => getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers,\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties: (...args) => getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n subscriptions.push(actionClickSubscription);\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
@@ -1,5 +1,8 @@
1
1
  export declare const PLUGIN_NAME = "@amplitude/plugin-autocapture-browser";
2
+ export declare const FRUSTRATION_PLUGIN_NAME = "@amplitude/plugin-frustration-browser";
2
3
  export declare const AMPLITUDE_ELEMENT_CLICKED_EVENT = "[Amplitude] Element Clicked";
4
+ export declare const AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = "[Amplitude] Dead Click";
5
+ export declare const AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = "[Amplitude] Rage Click";
3
6
  export declare const AMPLITUDE_ELEMENT_CHANGED_EVENT = "[Amplitude] Element Changed";
4
7
  export declare const AMPLITUDE_EVENT_PROP_ELEMENT_ID = "[Amplitude] Element ID";
5
8
  export declare const AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = "[Amplitude] Element Class";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,0CAA0C,CAAC;AAEnE,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAC7E,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAE7E,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,kCAAkC,8BAA8B,CAAC;AAC9E,eAAO,MAAM,gCAAgC,4BAA4B,CAAC;AAC1E,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAC5E,eAAO,MAAM,sCAAsC,kCAAkC,CAAC;AACtF,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAC5E,eAAO,MAAM,0CAA0C,sCAAsC,CAAC;AAC9F,eAAO,MAAM,yCAAyC,qCAAqC,CAAC;AAC5F,eAAO,MAAM,uCAAuC,mCAAmC,CAAC;AACxF,eAAO,MAAM,uCAAuC,mCAAmC,CAAC;AAExF,eAAO,MAAM,yCAAyC,qCAAqC,CAAC;AAC5F,eAAO,MAAM,6BAA6B,yBAAyB,CAAC;AACpE,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,oCAAoC,gCAAgC,CAAC;AAClF,eAAO,MAAM,mCAAmC,+BAA+B,CAAC;AAGhF,eAAO,MAAM,gBAAgB,8BAA8B,CAAC;AAC5D,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAClE,eAAO,MAAM,wBAAwB,qCAAqC,CAAC;AAC3E,eAAO,MAAM,qBAAqB;;;;CAIjC,CAAC;AAEF,eAAO,MAAM,4CAA4C,6EACmB,CAAC;AAG7E,eAAO,MAAM,wCAAwC,0CAA0C,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,0CAA0C,CAAC;AACnE,eAAO,MAAM,uBAAuB,0CAA0C,CAAC;AAE/E,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAC7E,eAAO,MAAM,oCAAoC,2BAA2B,CAAC;AAC7E,eAAO,MAAM,oCAAoC,2BAA2B,CAAC;AAC7E,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAE7E,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,kCAAkC,8BAA8B,CAAC;AAC9E,eAAO,MAAM,gCAAgC,4BAA4B,CAAC;AAC1E,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAC5E,eAAO,MAAM,sCAAsC,kCAAkC,CAAC;AACtF,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAC5E,eAAO,MAAM,0CAA0C,sCAAsC,CAAC;AAC9F,eAAO,MAAM,yCAAyC,qCAAqC,CAAC;AAC5F,eAAO,MAAM,uCAAuC,mCAAmC,CAAC;AACxF,eAAO,MAAM,uCAAuC,mCAAmC,CAAC;AAExF,eAAO,MAAM,yCAAyC,qCAAqC,CAAC;AAC5F,eAAO,MAAM,6BAA6B,yBAAyB,CAAC;AACpE,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,oCAAoC,gCAAgC,CAAC;AAClF,eAAO,MAAM,mCAAmC,+BAA+B,CAAC;AAGhF,eAAO,MAAM,gBAAgB,8BAA8B,CAAC;AAC5D,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAClE,eAAO,MAAM,wBAAwB,qCAAqC,CAAC;AAC3E,eAAO,MAAM,qBAAqB;;;;CAIjC,CAAC;AAEF,eAAO,MAAM,4CAA4C,6EACmB,CAAC;AAG7E,eAAO,MAAM,wCAAwC,0CAA0C,CAAC"}
@@ -1,5 +1,8 @@
1
1
  export var PLUGIN_NAME = '@amplitude/plugin-autocapture-browser';
2
+ export var FRUSTRATION_PLUGIN_NAME = '@amplitude/plugin-frustration-browser';
2
3
  export var AMPLITUDE_ELEMENT_CLICKED_EVENT = '[Amplitude] Element Clicked';
4
+ export var AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = '[Amplitude] Dead Click';
5
+ export var AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = '[Amplitude] Rage Click';
3
6
  export var AMPLITUDE_ELEMENT_CHANGED_EVENT = '[Amplitude] Element Changed';
4
7
  export var AMPLITUDE_EVENT_PROP_ELEMENT_ID = '[Amplitude] Element ID';
5
8
  export var AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = '[Amplitude] Element Class';
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,WAAW,GAAG,uCAAuC,CAAC;AAEnE,MAAM,CAAC,IAAM,+BAA+B,GAAG,6BAA6B,CAAC;AAC7E,MAAM,CAAC,IAAM,+BAA+B,GAAG,6BAA6B,CAAC;AAE7E,MAAM,CAAC,IAAM,+BAA+B,GAAG,wBAAwB,CAAC;AACxE,MAAM,CAAC,IAAM,kCAAkC,GAAG,2BAA2B,CAAC;AAC9E,MAAM,CAAC,IAAM,gCAAgC,GAAG,yBAAyB,CAAC;AAC1E,MAAM,CAAC,IAAM,iCAAiC,GAAG,0BAA0B,CAAC;AAC5E,MAAM,CAAC,IAAM,sCAAsC,GAAG,+BAA+B,CAAC;AACtF,MAAM,CAAC,IAAM,iCAAiC,GAAG,0BAA0B,CAAC;AAC5E,MAAM,CAAC,IAAM,0CAA0C,GAAG,mCAAmC,CAAC;AAC9F,MAAM,CAAC,IAAM,yCAAyC,GAAG,kCAAkC,CAAC;AAC5F,MAAM,CAAC,IAAM,uCAAuC,GAAG,gCAAgC,CAAC;AACxF,MAAM,CAAC,IAAM,uCAAuC,GAAG,gCAAgC,CAAC;AAExF,MAAM,CAAC,IAAM,yCAAyC,GAAG,kCAAkC,CAAC;AAC5F,MAAM,CAAC,IAAM,6BAA6B,GAAG,sBAAsB,CAAC;AACpE,MAAM,CAAC,IAAM,+BAA+B,GAAG,wBAAwB,CAAC;AACxE,MAAM,CAAC,IAAM,oCAAoC,GAAG,6BAA6B,CAAC;AAClF,MAAM,CAAC,IAAM,mCAAmC,GAAG,4BAA4B,CAAC;AAEhF,mCAAmC;AACnC,MAAM,CAAC,IAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAC5D,MAAM,CAAC,IAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAClE,MAAM,CAAC,IAAM,wBAAwB,GAAG,kCAAkC,CAAC;AAC3E,MAAM,CAAC,IAAM,qBAAqB,GAAG;IACnC,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,mBAAmB;IACvB,OAAO,EAAE,wBAAwB;CAClC,CAAC;AAEF,MAAM,CAAC,IAAM,4CAA4C,GACvD,0EAA0E,CAAC;AAC7E,gGAAgG;AAChG,6CAA6C;AAC7C,MAAM,CAAC,IAAM,wCAAwC,GAAG,uCAAuC,CAAC","sourcesContent":["export const PLUGIN_NAME = '@amplitude/plugin-autocapture-browser';\n\nexport const AMPLITUDE_ELEMENT_CLICKED_EVENT = '[Amplitude] Element Clicked';\nexport const AMPLITUDE_ELEMENT_CHANGED_EVENT = '[Amplitude] Element Changed';\n\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_ID = '[Amplitude] Element ID';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = '[Amplitude] Element Class';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_TAG = '[Amplitude] Element Tag';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_TEXT = '[Amplitude] Element Text';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY = '[Amplitude] Element Hierarchy';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_HREF = '[Amplitude] Element Href';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = '[Amplitude] Element Position Left';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = '[Amplitude] Element Position Top';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = '[Amplitude] Element Aria Label';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = '[Amplitude] Element Attributes';\n\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = '[Amplitude] Element Parent Label';\nexport const AMPLITUDE_EVENT_PROP_PAGE_URL = '[Amplitude] Page URL';\nexport const AMPLITUDE_EVENT_PROP_PAGE_TITLE = '[Amplitude] Page Title';\nexport const AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = '[Amplitude] Viewport Height';\nexport const AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = '[Amplitude] Viewport Width';\n\n// Visual Tagging related constants\nexport const AMPLITUDE_ORIGIN = 'https://app.amplitude.com';\nexport const AMPLITUDE_ORIGIN_EU = 'https://app.eu.amplitude.com';\nexport const AMPLITUDE_ORIGIN_STAGING = 'https://apps.stag2.amplitude.com';\nexport const AMPLITUDE_ORIGINS_MAP = {\n US: AMPLITUDE_ORIGIN,\n EU: AMPLITUDE_ORIGIN_EU,\n STAGING: AMPLITUDE_ORIGIN_STAGING,\n};\n\nexport const AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL =\n 'https://cdn.amplitude.com/libs/visual-tagging-selector-1.0.0-alpha.js.gz';\n// This is the class name used by the visual tagging selector to highlight the selected element.\n// Should not use this class in the selector.\nexport const AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = 'amp-visual-tagging-selector-highlight';\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,WAAW,GAAG,uCAAuC,CAAC;AACnE,MAAM,CAAC,IAAM,uBAAuB,GAAG,uCAAuC,CAAC;AAE/E,MAAM,CAAC,IAAM,+BAA+B,GAAG,6BAA6B,CAAC;AAC7E,MAAM,CAAC,IAAM,oCAAoC,GAAG,wBAAwB,CAAC;AAC7E,MAAM,CAAC,IAAM,oCAAoC,GAAG,wBAAwB,CAAC;AAC7E,MAAM,CAAC,IAAM,+BAA+B,GAAG,6BAA6B,CAAC;AAE7E,MAAM,CAAC,IAAM,+BAA+B,GAAG,wBAAwB,CAAC;AACxE,MAAM,CAAC,IAAM,kCAAkC,GAAG,2BAA2B,CAAC;AAC9E,MAAM,CAAC,IAAM,gCAAgC,GAAG,yBAAyB,CAAC;AAC1E,MAAM,CAAC,IAAM,iCAAiC,GAAG,0BAA0B,CAAC;AAC5E,MAAM,CAAC,IAAM,sCAAsC,GAAG,+BAA+B,CAAC;AACtF,MAAM,CAAC,IAAM,iCAAiC,GAAG,0BAA0B,CAAC;AAC5E,MAAM,CAAC,IAAM,0CAA0C,GAAG,mCAAmC,CAAC;AAC9F,MAAM,CAAC,IAAM,yCAAyC,GAAG,kCAAkC,CAAC;AAC5F,MAAM,CAAC,IAAM,uCAAuC,GAAG,gCAAgC,CAAC;AACxF,MAAM,CAAC,IAAM,uCAAuC,GAAG,gCAAgC,CAAC;AAExF,MAAM,CAAC,IAAM,yCAAyC,GAAG,kCAAkC,CAAC;AAC5F,MAAM,CAAC,IAAM,6BAA6B,GAAG,sBAAsB,CAAC;AACpE,MAAM,CAAC,IAAM,+BAA+B,GAAG,wBAAwB,CAAC;AACxE,MAAM,CAAC,IAAM,oCAAoC,GAAG,6BAA6B,CAAC;AAClF,MAAM,CAAC,IAAM,mCAAmC,GAAG,4BAA4B,CAAC;AAEhF,mCAAmC;AACnC,MAAM,CAAC,IAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAC5D,MAAM,CAAC,IAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAClE,MAAM,CAAC,IAAM,wBAAwB,GAAG,kCAAkC,CAAC;AAC3E,MAAM,CAAC,IAAM,qBAAqB,GAAG;IACnC,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,mBAAmB;IACvB,OAAO,EAAE,wBAAwB;CAClC,CAAC;AAEF,MAAM,CAAC,IAAM,4CAA4C,GACvD,0EAA0E,CAAC;AAC7E,gGAAgG;AAChG,6CAA6C;AAC7C,MAAM,CAAC,IAAM,wCAAwC,GAAG,uCAAuC,CAAC","sourcesContent":["export const PLUGIN_NAME = '@amplitude/plugin-autocapture-browser';\nexport const FRUSTRATION_PLUGIN_NAME = '@amplitude/plugin-frustration-browser';\n\nexport const AMPLITUDE_ELEMENT_CLICKED_EVENT = '[Amplitude] Element Clicked';\nexport const AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = '[Amplitude] Dead Click';\nexport const AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = '[Amplitude] Rage Click';\nexport const AMPLITUDE_ELEMENT_CHANGED_EVENT = '[Amplitude] Element Changed';\n\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_ID = '[Amplitude] Element ID';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = '[Amplitude] Element Class';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_TAG = '[Amplitude] Element Tag';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_TEXT = '[Amplitude] Element Text';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY = '[Amplitude] Element Hierarchy';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_HREF = '[Amplitude] Element Href';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = '[Amplitude] Element Position Left';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = '[Amplitude] Element Position Top';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = '[Amplitude] Element Aria Label';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = '[Amplitude] Element Attributes';\n\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = '[Amplitude] Element Parent Label';\nexport const AMPLITUDE_EVENT_PROP_PAGE_URL = '[Amplitude] Page URL';\nexport const AMPLITUDE_EVENT_PROP_PAGE_TITLE = '[Amplitude] Page Title';\nexport const AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = '[Amplitude] Viewport Height';\nexport const AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = '[Amplitude] Viewport Width';\n\n// Visual Tagging related constants\nexport const AMPLITUDE_ORIGIN = 'https://app.amplitude.com';\nexport const AMPLITUDE_ORIGIN_EU = 'https://app.eu.amplitude.com';\nexport const AMPLITUDE_ORIGIN_STAGING = 'https://apps.stag2.amplitude.com';\nexport const AMPLITUDE_ORIGINS_MAP = {\n US: AMPLITUDE_ORIGIN,\n EU: AMPLITUDE_ORIGIN_EU,\n STAGING: AMPLITUDE_ORIGIN_STAGING,\n};\n\nexport const AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL =\n 'https://cdn.amplitude.com/libs/visual-tagging-selector-1.0.0-alpha.js.gz';\n// This is the class name used by the visual tagging selector to highlight the selected element.\n// Should not use this class in the selector.\nexport const AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = 'amp-visual-tagging-selector-highlight';\n"]}
@@ -0,0 +1,5 @@
1
+ import { BrowserClient, BrowserConfig, EnrichmentPlugin, FrustrationInteractionsOptions } from '@amplitude/analytics-core';
2
+ type BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;
3
+ export declare const frustrationPlugin: (options: FrustrationInteractionsOptions) => BrowserEnrichmentPlugin;
4
+ export {};
5
+ //# sourceMappingURL=frustration-plugin.d.ts.map