@amplitude/plugin-autocapture-browser 1.2.9 → 1.3.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 (99) hide show
  1. package/lib/cjs/autocapture/track-action-click.d.ts.map +1 -1
  2. package/lib/cjs/autocapture/track-action-click.js.map +1 -1
  3. package/lib/cjs/autocapture/track-change.d.ts +3 -1
  4. package/lib/cjs/autocapture/track-change.d.ts.map +1 -1
  5. package/lib/cjs/autocapture/track-change.js +2 -2
  6. package/lib/cjs/autocapture/track-change.js.map +1 -1
  7. package/lib/cjs/autocapture/track-click.d.ts +3 -1
  8. package/lib/cjs/autocapture/track-click.d.ts.map +1 -1
  9. package/lib/cjs/autocapture/track-click.js +2 -2
  10. package/lib/cjs/autocapture/track-click.js.map +1 -1
  11. package/lib/cjs/autocapture-plugin.d.ts +1 -14
  12. package/lib/cjs/autocapture-plugin.d.ts.map +1 -1
  13. package/lib/cjs/autocapture-plugin.js +65 -77
  14. package/lib/cjs/autocapture-plugin.js.map +1 -1
  15. package/lib/cjs/helpers.d.ts +20 -1
  16. package/lib/cjs/helpers.d.ts.map +1 -1
  17. package/lib/cjs/helpers.js +59 -1
  18. package/lib/cjs/helpers.js.map +1 -1
  19. package/lib/cjs/observables.d.ts +10 -0
  20. package/lib/cjs/observables.d.ts.map +1 -0
  21. package/lib/cjs/observables.js +30 -0
  22. package/lib/cjs/observables.js.map +1 -0
  23. package/lib/cjs/pageActions/actions.d.ts +12 -0
  24. package/lib/cjs/pageActions/actions.d.ts.map +1 -0
  25. package/lib/cjs/pageActions/actions.js +65 -0
  26. package/lib/cjs/pageActions/actions.js.map +1 -0
  27. package/lib/cjs/pageActions/matchEventToFilter.d.ts +10 -0
  28. package/lib/cjs/pageActions/matchEventToFilter.d.ts.map +1 -0
  29. package/lib/cjs/pageActions/matchEventToFilter.js +30 -0
  30. package/lib/cjs/pageActions/matchEventToFilter.js.map +1 -0
  31. package/lib/cjs/pageActions/triggers.d.ts +20 -0
  32. package/lib/cjs/pageActions/triggers.d.ts.map +1 -0
  33. package/lib/cjs/pageActions/triggers.js +133 -0
  34. package/lib/cjs/pageActions/triggers.js.map +1 -0
  35. package/lib/cjs/version.d.ts +1 -1
  36. package/lib/cjs/version.js +1 -1
  37. package/lib/cjs/version.js.map +1 -1
  38. package/lib/esm/autocapture/track-action-click.d.ts.map +1 -1
  39. package/lib/esm/autocapture/track-action-click.js +1 -1
  40. package/lib/esm/autocapture/track-action-click.js.map +1 -1
  41. package/lib/esm/autocapture/track-change.d.ts +3 -1
  42. package/lib/esm/autocapture/track-change.d.ts.map +1 -1
  43. package/lib/esm/autocapture/track-change.js +3 -3
  44. package/lib/esm/autocapture/track-change.js.map +1 -1
  45. package/lib/esm/autocapture/track-click.d.ts +3 -1
  46. package/lib/esm/autocapture/track-click.d.ts.map +1 -1
  47. package/lib/esm/autocapture/track-click.js +2 -2
  48. package/lib/esm/autocapture/track-click.js.map +1 -1
  49. package/lib/esm/autocapture-plugin.d.ts +1 -14
  50. package/lib/esm/autocapture-plugin.d.ts.map +1 -1
  51. package/lib/esm/autocapture-plugin.js +67 -78
  52. package/lib/esm/autocapture-plugin.js.map +1 -1
  53. package/lib/esm/helpers.d.ts +20 -1
  54. package/lib/esm/helpers.d.ts.map +1 -1
  55. package/lib/esm/helpers.js +55 -0
  56. package/lib/esm/helpers.js.map +1 -1
  57. package/lib/esm/observables.d.ts +10 -0
  58. package/lib/esm/observables.d.ts.map +1 -0
  59. package/lib/esm/observables.js +25 -0
  60. package/lib/esm/observables.js.map +1 -0
  61. package/lib/esm/pageActions/actions.d.ts +12 -0
  62. package/lib/esm/pageActions/actions.d.ts.map +1 -0
  63. package/lib/esm/pageActions/actions.js +59 -0
  64. package/lib/esm/pageActions/actions.js.map +1 -0
  65. package/lib/esm/pageActions/matchEventToFilter.d.ts +10 -0
  66. package/lib/esm/pageActions/matchEventToFilter.d.ts.map +1 -0
  67. package/lib/esm/pageActions/matchEventToFilter.js +26 -0
  68. package/lib/esm/pageActions/matchEventToFilter.js.map +1 -0
  69. package/lib/esm/pageActions/triggers.d.ts +20 -0
  70. package/lib/esm/pageActions/triggers.d.ts.map +1 -0
  71. package/lib/esm/pageActions/triggers.js +126 -0
  72. package/lib/esm/pageActions/triggers.js.map +1 -0
  73. package/lib/esm/version.d.ts +1 -1
  74. package/lib/esm/version.js +1 -1
  75. package/lib/esm/version.js.map +1 -1
  76. package/lib/scripts/amplitude-min.js +1 -1
  77. package/lib/scripts/amplitude-min.js.gz +0 -0
  78. package/lib/scripts/amplitude-min.js.map +1 -1
  79. package/lib/scripts/amplitude-min.umd.js +1 -1
  80. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  81. package/lib/scripts/autocapture/track-action-click.d.ts.map +1 -1
  82. package/lib/scripts/autocapture/track-change.d.ts +3 -1
  83. package/lib/scripts/autocapture/track-change.d.ts.map +1 -1
  84. package/lib/scripts/autocapture/track-click.d.ts +3 -1
  85. package/lib/scripts/autocapture/track-click.d.ts.map +1 -1
  86. package/lib/scripts/autocapture-plugin.d.ts +1 -14
  87. package/lib/scripts/autocapture-plugin.d.ts.map +1 -1
  88. package/lib/scripts/helpers.d.ts +20 -1
  89. package/lib/scripts/helpers.d.ts.map +1 -1
  90. package/lib/scripts/observables.d.ts +10 -0
  91. package/lib/scripts/observables.d.ts.map +1 -0
  92. package/lib/scripts/pageActions/actions.d.ts +12 -0
  93. package/lib/scripts/pageActions/actions.d.ts.map +1 -0
  94. package/lib/scripts/pageActions/matchEventToFilter.d.ts +10 -0
  95. package/lib/scripts/pageActions/matchEventToFilter.d.ts.map +1 -0
  96. package/lib/scripts/pageActions/triggers.d.ts +20 -0
  97. package/lib/scripts/pageActions/triggers.d.ts.map +1 -0
  98. package/lib/scripts/version.d.ts +1 -1
  99. package/package.json +4 -3
@@ -1 +1 @@
1
- {"version":3,"file":"track-action-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-action-click.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,8BAA8B,EAG/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAkD,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9F,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,cAAc,EACd,OAAO,EACP,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,GACvB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,OAAO,EAAE,8BAA8B,CAAC;IACxC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,sBAAsB,EAAE,gBAAgB,CAAC;IACzC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,+BAsDA"}
1
+ {"version":3,"file":"track-action-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-action-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAmB,MAAM,wBAAwB,CAAC;AAE/G,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAIL,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAGpB,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,cAAc,EACd,OAAO,EACP,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,GACvB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,OAAO,EAAE,8BAA8B,CAAC;IACxC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,sBAAsB,EAAE,gBAAgB,CAAC;IACzC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,+BAsDA"}
@@ -1 +1 @@
1
- {"version":3,"file":"track-action-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-action-click.ts"],"names":[],"mappings":";;;;AAMA,6BAA2E;AAE3E,sCAA8F;AAC9F,0CAA+D;AAE/D,SAAgB,gBAAgB,CAAC,EAchC;QAbC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,kBAAkB,wBAAA,EAClB,gBAAgB,sBAAA,EAChB,sBAAsB,4BAAA;IASd,IAAA,eAAe,GAA6C,cAAc,gBAA3D,EAAE,kBAAkB,GAAyB,cAAc,mBAAvC,EAAE,kBAAkB,GAAK,cAAc,mBAAnB,CAAoB;IAEnF,IAAM,uBAAuB,GAAG,eAAe,CAAC,IAAI,CAClD,IAAA,aAAM,EAAC,UAAC,KAAK;QACX,oFAAoF;QACpF,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAClE,CAAC,CAAC,EACF,IAAA,UAAG,EAAC,UAAC,KAAK;QACR,oGAAoG;QACpG,IAAM,oBAAoB,GAAG,IAAA,2BAAiB,EAAC,KAAK,CAAC,KAAK,CAAC,MAAiB,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC5G,KAAK,CAAC,sBAAsB,GAAG,oBAA+B,CAAC;QAE/D,wFAAwF;QACxF,IAAI,KAAK,CAAC,sBAAsB,KAAK,IAAI,EAAE;YACzC,KAAK,CAAC,uBAAuB,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;SAC9F;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,EACF,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,UAAU;QAChB,uDAAuD;QACvD,OAAO,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC5E,CAAC,CAAC,CACH,CAAC;IAEF,IAAM,iBAAiB,GAEnB,CAAC,kBAAkB,CAAC,CAAC;IACzB,0BAA0B;IAC1B,IAAI,kBAAkB,EAAE;QACtB,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;KAC5C;IACD,IAAM,kBAAkB,GAAG,YAAK,wDAAI,iBAAiB,UAAC,CAAC;IAEvD,IAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI;IAC/C,+HAA+H;IAC/H,oEAAoE;IACpE,IAAA,gBAAS,EAAC,UAAC,KAAK;QACd,OAAA,kBAAkB,CAAC,IAAI,CACrB,IAAA,WAAI,EAAC,CAAC,CAAC,EACP,IAAA,cAAO,EAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,cAAM,OAAA,YAAK,EAAL,CAAK,EAAE,CAAC,EAAE,2EAA2E;QACvH,IAAA,UAAG,EAAC,cAAM,OAAA,KAAK,EAAL,CAAK,CAAC,CACjB;IAJD,CAIC,CACF,CACF,CAAC;IAEF,OAAO,YAAY,CAAC,SAAS,CAAC,UAAC,WAAW;QACxC,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CACd,2CAA+B,EAC/B,kBAAkB,CAAC,OAAO,EAAG,WAAwD,CAAC,sBAAsB,CAAC,CAC9G,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AApED,4CAoEC","sourcesContent":["import {\n AllWindowObservables,\n AutoCaptureOptionsWithDefaults,\n ElementBasedTimestampedEvent,\n ObservablesEnum,\n} from 'src/autocapture-plugin';\nimport { filter, map, merge, switchMap, take, timeout, EMPTY } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, getClosestElement, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nexport function trackActionClick({\n amplitude,\n allObservables,\n options,\n getEventProperties,\n shouldTrackEvent,\n shouldTrackActionClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n options: AutoCaptureOptionsWithDefaults;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackActionClick: shouldTrackEvent;\n shouldTrackEvent: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable } = allObservables;\n\n const filteredClickObservable = clickObservable.pipe(\n filter((click) => {\n // Filter out regularly tracked click events that are already handled in trackClicks\n return !shouldTrackEvent('click', click.closestTrackedAncestor);\n }),\n map((click) => {\n // overwrite the closestTrackedAncestor with the closest element that is on the actionClickAllowlist\n const closestActionClickEl = getClosestElement(click.event.target as Element, options.actionClickAllowlist);\n click.closestTrackedAncestor = closestActionClickEl as Element;\n\n // overwrite the targetElementProperties with the properties of the closestActionClickEl\n if (click.closestTrackedAncestor !== null) {\n click.targetElementProperties = getEventProperties(click.type, click.closestTrackedAncestor);\n }\n return click;\n }),\n filter(filterOutNonTrackableEvents),\n filter((clickEvent) => {\n // Only track change on elements that should be tracked\n return shouldTrackActionClick('click', clickEvent.closestTrackedAncestor);\n }),\n );\n\n const changeObservables: Array<\n AllWindowObservables[ObservablesEnum.MutationObservable] | AllWindowObservables[ObservablesEnum.NavigateObservable]\n > = [mutationObservable];\n /* istanbul ignore next */\n if (navigateObservable) {\n changeObservables.push(navigateObservable);\n }\n const mutationOrNavigate = merge(...changeObservables);\n\n const actionClicks = filteredClickObservable.pipe(\n // If a mutation occurs within 0.5 seconds of a click event (timeout({ first: 500 })), it emits the original first click event.\n // take 1 to only limit the action events in case there are multiple\n switchMap((click) =>\n mutationOrNavigate.pipe(\n take(1),\n timeout({ first: 500, with: () => EMPTY }), // in case of timeout, map to empty to prevent any click from being emitted\n map(() => click),\n ),\n ),\n );\n\n return actionClicks.subscribe((actionClick) => {\n /* istanbul ignore next */\n amplitude?.track(\n AMPLITUDE_ELEMENT_CLICKED_EVENT,\n getEventProperties('click', (actionClick as ElementBasedTimestampedEvent<MouseEvent>).closestTrackedAncestor),\n );\n });\n}\n"]}
1
+ {"version":3,"file":"track-action-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-action-click.ts"],"names":[],"mappings":";;;;AACA,6BAA2E;AAE3E,sCAKoB;AACpB,0CAA+D;AAE/D,SAAgB,gBAAgB,CAAC,EAchC;QAbC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,kBAAkB,wBAAA,EAClB,gBAAgB,sBAAA,EAChB,sBAAsB,4BAAA;IASd,IAAA,eAAe,GAA6C,cAAc,gBAA3D,EAAE,kBAAkB,GAAyB,cAAc,mBAAvC,EAAE,kBAAkB,GAAK,cAAc,mBAAnB,CAAoB;IAEnF,IAAM,uBAAuB,GAAG,eAAe,CAAC,IAAI,CAClD,IAAA,aAAM,EAAC,UAAC,KAAK;QACX,oFAAoF;QACpF,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAClE,CAAC,CAAC,EACF,IAAA,UAAG,EAAC,UAAC,KAAK;QACR,oGAAoG;QACpG,IAAM,oBAAoB,GAAG,IAAA,2BAAiB,EAAC,KAAK,CAAC,KAAK,CAAC,MAAiB,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC5G,KAAK,CAAC,sBAAsB,GAAG,oBAA+B,CAAC;QAE/D,wFAAwF;QACxF,IAAI,KAAK,CAAC,sBAAsB,KAAK,IAAI,EAAE;YACzC,KAAK,CAAC,uBAAuB,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;SAC9F;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,EACF,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,UAAU;QAChB,uDAAuD;QACvD,OAAO,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC5E,CAAC,CAAC,CACH,CAAC;IAEF,IAAM,iBAAiB,GAEnB,CAAC,kBAAkB,CAAC,CAAC;IACzB,0BAA0B;IAC1B,IAAI,kBAAkB,EAAE;QACtB,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;KAC5C;IACD,IAAM,kBAAkB,GAAG,YAAK,wDAAI,iBAAiB,UAAC,CAAC;IAEvD,IAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI;IAC/C,+HAA+H;IAC/H,oEAAoE;IACpE,IAAA,gBAAS,EAAC,UAAC,KAAK;QACd,OAAA,kBAAkB,CAAC,IAAI,CACrB,IAAA,WAAI,EAAC,CAAC,CAAC,EACP,IAAA,cAAO,EAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,cAAM,OAAA,YAAK,EAAL,CAAK,EAAE,CAAC,EAAE,2EAA2E;QACvH,IAAA,UAAG,EAAC,cAAM,OAAA,KAAK,EAAL,CAAK,CAAC,CACjB;IAJD,CAIC,CACF,CACF,CAAC;IAEF,OAAO,YAAY,CAAC,SAAS,CAAC,UAAC,WAAW;QACxC,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CACd,2CAA+B,EAC/B,kBAAkB,CAAC,OAAO,EAAG,WAAwD,CAAC,sBAAsB,CAAC,CAC9G,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AApED,4CAoEC","sourcesContent":["import { AllWindowObservables, AutoCaptureOptionsWithDefaults, ObservablesEnum } from 'src/autocapture-plugin';\nimport { filter, map, merge, switchMap, take, timeout, EMPTY } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport {\n ElementBasedTimestampedEvent,\n filterOutNonTrackableEvents,\n getClosestElement,\n shouldTrackEvent,\n} from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nexport function trackActionClick({\n amplitude,\n allObservables,\n options,\n getEventProperties,\n shouldTrackEvent,\n shouldTrackActionClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n options: AutoCaptureOptionsWithDefaults;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackActionClick: shouldTrackEvent;\n shouldTrackEvent: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable } = allObservables;\n\n const filteredClickObservable = clickObservable.pipe(\n filter((click) => {\n // Filter out regularly tracked click events that are already handled in trackClicks\n return !shouldTrackEvent('click', click.closestTrackedAncestor);\n }),\n map((click) => {\n // overwrite the closestTrackedAncestor with the closest element that is on the actionClickAllowlist\n const closestActionClickEl = getClosestElement(click.event.target as Element, options.actionClickAllowlist);\n click.closestTrackedAncestor = closestActionClickEl as Element;\n\n // overwrite the targetElementProperties with the properties of the closestActionClickEl\n if (click.closestTrackedAncestor !== null) {\n click.targetElementProperties = getEventProperties(click.type, click.closestTrackedAncestor);\n }\n return click;\n }),\n filter(filterOutNonTrackableEvents),\n filter((clickEvent) => {\n // Only track change on elements that should be tracked\n return shouldTrackActionClick('click', clickEvent.closestTrackedAncestor);\n }),\n );\n\n const changeObservables: Array<\n AllWindowObservables[ObservablesEnum.MutationObservable] | AllWindowObservables[ObservablesEnum.NavigateObservable]\n > = [mutationObservable];\n /* istanbul ignore next */\n if (navigateObservable) {\n changeObservables.push(navigateObservable);\n }\n const mutationOrNavigate = merge(...changeObservables);\n\n const actionClicks = filteredClickObservable.pipe(\n // If a mutation occurs within 0.5 seconds of a click event (timeout({ first: 500 })), it emits the original first click event.\n // take 1 to only limit the action events in case there are multiple\n switchMap((click) =>\n mutationOrNavigate.pipe(\n take(1),\n timeout({ first: 500, with: () => EMPTY }), // in case of timeout, map to empty to prevent any click from being emitted\n map(() => click),\n ),\n ),\n );\n\n return actionClicks.subscribe((actionClick) => {\n /* istanbul ignore next */\n amplitude?.track(\n AMPLITUDE_ELEMENT_CLICKED_EVENT,\n getEventProperties('click', (actionClick as ElementBasedTimestampedEvent<MouseEvent>).closestTrackedAncestor),\n );\n });\n}\n"]}
@@ -1,10 +1,12 @@
1
1
  import { AllWindowObservables } from 'src/autocapture-plugin';
2
+ import { type evaluateTriggersFn } from 'src/helpers';
2
3
  import { BrowserClient, ActionType } from '@amplitude/analytics-core';
3
4
  import { shouldTrackEvent } from '../helpers';
4
- export declare function trackChange({ amplitude, allObservables, getEventProperties, shouldTrackEvent, }: {
5
+ export declare function trackChange({ amplitude, allObservables, getEventProperties, shouldTrackEvent, evaluateTriggers, }: {
5
6
  amplitude: BrowserClient;
6
7
  allObservables: AllWindowObservables;
7
8
  getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;
8
9
  shouldTrackEvent: shouldTrackEvent;
10
+ evaluateTriggers: evaluateTriggersFn;
9
11
  }): import("rxjs").Subscription;
10
12
  //# sourceMappingURL=track-change.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"track-change.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-change.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG3E,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,+BAeA"}
1
+ {"version":3,"file":"track-change.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-change.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG3E,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,kBAAkB,CAAC;CACtC,+BAgBA"}
@@ -5,12 +5,12 @@ var rxjs_1 = require("rxjs");
5
5
  var helpers_1 = require("../helpers");
6
6
  var constants_1 = require("../constants");
7
7
  function trackChange(_a) {
8
- var amplitude = _a.amplitude, allObservables = _a.allObservables, getEventProperties = _a.getEventProperties, shouldTrackEvent = _a.shouldTrackEvent;
8
+ var amplitude = _a.amplitude, allObservables = _a.allObservables, getEventProperties = _a.getEventProperties, shouldTrackEvent = _a.shouldTrackEvent, evaluateTriggers = _a.evaluateTriggers;
9
9
  var changeObservable = allObservables.changeObservable;
10
10
  var filteredChangeObservable = changeObservable.pipe((0, rxjs_1.filter)(helpers_1.filterOutNonTrackableEvents), (0, rxjs_1.filter)(function (changeEvent) {
11
11
  // Only track change on elements that should be tracked,
12
12
  return shouldTrackEvent('change', changeEvent.closestTrackedAncestor);
13
- }));
13
+ }), (0, rxjs_1.map)(function (changeEvent) { return evaluateTriggers(changeEvent); }));
14
14
  return filteredChangeObservable.subscribe(function (changeEvent) {
15
15
  /* istanbul ignore next */
16
16
  amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(constants_1.AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', changeEvent.closestTrackedAncestor));
@@ -1 +1 @@
1
- {"version":3,"file":"track-change.js","sourceRoot":"","sources":["../../../src/autocapture/track-change.ts"],"names":[],"mappings":";;;AACA,6BAA8B;AAE9B,sCAA2E;AAC3E,0CAA+D;AAE/D,SAAgB,WAAW,CAAC,EAU3B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,kBAAkB,wBAAA,EAClB,gBAAgB,sBAAA;IAOR,IAAA,gBAAgB,GAAK,cAAc,iBAAnB,CAAoB;IAE5C,IAAM,wBAAwB,GAAG,gBAAgB,CAAC,IAAI,CACpD,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,WAAW;QACjB,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC;IACxE,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,wBAAwB,CAAC,SAAS,CAAC,UAAC,WAAW;QACpD,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,2CAA+B,EAAE,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;AACL,CAAC;AAzBD,kCAyBC","sourcesContent":["import { AllWindowObservables } from 'src/autocapture-plugin';\nimport { filter } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CHANGED_EVENT } from '../constants';\n\nexport function trackChange({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackEvent,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackEvent: shouldTrackEvent;\n}) {\n const { changeObservable } = allObservables;\n\n const filteredChangeObservable = changeObservable.pipe(\n filter(filterOutNonTrackableEvents),\n filter((changeEvent) => {\n // Only track change on elements that should be tracked,\n return shouldTrackEvent('change', changeEvent.closestTrackedAncestor);\n }),\n );\n\n return filteredChangeObservable.subscribe((changeEvent) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', changeEvent.closestTrackedAncestor));\n });\n}\n"]}
1
+ {"version":3,"file":"track-change.js","sourceRoot":"","sources":["../../../src/autocapture/track-change.ts"],"names":[],"mappings":";;;AAEA,6BAAmC;AAEnC,sCAA2E;AAC3E,0CAA+D;AAE/D,SAAgB,WAAW,CAAC,EAY3B;QAXC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,kBAAkB,wBAAA,EAClB,gBAAgB,sBAAA,EAChB,gBAAgB,sBAAA;IAQR,IAAA,gBAAgB,GAAK,cAAc,iBAAnB,CAAoB;IAE5C,IAAM,wBAAwB,GAAG,gBAAgB,CAAC,IAAI,CACpD,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,WAAW;QACjB,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC;IACxE,CAAC,CAAC,EACF,IAAA,UAAG,EAAC,UAAC,WAAW,IAAK,OAAA,gBAAgB,CAAC,WAAW,CAAC,EAA7B,CAA6B,CAAC,CACpD,CAAC;IAEF,OAAO,wBAAwB,CAAC,SAAS,CAAC,UAAC,WAAW;QACpD,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,2CAA+B,EAAE,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;AACL,CAAC;AA5BD,kCA4BC","sourcesContent":["import { AllWindowObservables } from 'src/autocapture-plugin';\nimport { type evaluateTriggersFn } from 'src/helpers';\nimport { filter, map } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CHANGED_EVENT } from '../constants';\n\nexport function trackChange({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackEvent,\n evaluateTriggers,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackEvent: shouldTrackEvent;\n evaluateTriggers: evaluateTriggersFn;\n}) {\n const { changeObservable } = allObservables;\n\n const filteredChangeObservable = changeObservable.pipe(\n filter(filterOutNonTrackableEvents),\n filter((changeEvent) => {\n // Only track change on elements that should be tracked,\n return shouldTrackEvent('change', changeEvent.closestTrackedAncestor);\n }),\n map((changeEvent) => evaluateTriggers(changeEvent)),\n );\n\n return filteredChangeObservable.subscribe((changeEvent) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', changeEvent.closestTrackedAncestor));\n });\n}\n"]}
@@ -1,10 +1,12 @@
1
1
  import { AllWindowObservables, AutoCaptureOptionsWithDefaults } from 'src/autocapture-plugin';
2
+ import { type evaluateTriggersFn } from 'src/helpers';
2
3
  import { BrowserClient } from '@amplitude/analytics-core';
3
4
  import { shouldTrackEvent } from '../helpers';
4
- export declare function trackClicks({ amplitude, allObservables, options, shouldTrackEvent, }: {
5
+ export declare function trackClicks({ amplitude, allObservables, options, shouldTrackEvent, evaluateTriggers, }: {
5
6
  amplitude: BrowserClient;
6
7
  allObservables: AllWindowObservables;
7
8
  options: AutoCaptureOptionsWithDefaults;
8
9
  shouldTrackEvent: shouldTrackEvent;
10
+ evaluateTriggers: evaluateTriggersFn;
9
11
  }): import("rxjs").Subscription;
10
12
  //# sourceMappingURL=track-click.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"track-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAE9F,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK3E,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,OAAO,EACP,gBAAgB,GACjB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,OAAO,EAAE,8BAA8B,CAAC;IACxC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,+BA+CA"}
1
+ {"version":3,"file":"track-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK3E,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,OAAO,EACP,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,OAAO,EAAE,8BAA8B,CAAC;IACxC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,kBAAkB,CAAC;CACtC,+BAgDA"}
@@ -7,7 +7,7 @@ var helpers_1 = require("../helpers");
7
7
  var constants_1 = require("../constants");
8
8
  var RAGE_CLICK_THRESHOLD = 5;
9
9
  function trackClicks(_a) {
10
- var amplitude = _a.amplitude, allObservables = _a.allObservables, options = _a.options, shouldTrackEvent = _a.shouldTrackEvent;
10
+ var amplitude = _a.amplitude, allObservables = _a.allObservables, options = _a.options, shouldTrackEvent = _a.shouldTrackEvent, evaluateTriggers = _a.evaluateTriggers;
11
11
  var clickObservable = allObservables.clickObservable;
12
12
  // Trigger if the target of the click event has changed and position is different
13
13
  // Keeping track of position is important to avoid false positives when the user clicks on the same
@@ -27,7 +27,7 @@ function trackClicks(_a) {
27
27
  var bufferedClicks = clickObservable.pipe((0, rxjs_1.delay)(0), (0, rxjs_1.filter)(helpers_1.filterOutNonTrackableEvents), (0, rxjs_1.filter)(function (click) {
28
28
  // Only track clicks on elements that should be tracked,
29
29
  return shouldTrackEvent('click', click.closestTrackedAncestor);
30
- }), (0, rxjs_1.buffer)(triggers));
30
+ }), (0, rxjs_1.map)(function (click) { return evaluateTriggers(click); }), (0, rxjs_1.buffer)(triggers));
31
31
  return bufferedClicks.subscribe(function (clicks) {
32
32
  var e_1, _a;
33
33
  // TODO: update this when rage clicks are added
@@ -1 +1 @@
1
- {"version":3,"file":"track-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":";;;;AACA,6BAAiF;AAEjF,sCAA2E;AAC3E,0CAA+D;AAE/D,IAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B,SAAgB,WAAW,CAAC,EAU3B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,gBAAgB,sBAAA;IAOR,IAAA,eAAe,GAAK,cAAc,gBAAnB,CAAoB;IAE3C,iFAAiF;IACjF,mGAAmG;IACnG,wFAAwF;IACxF,IAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAC5C,IAAA,eAAQ,GAAE,EACV,IAAA,aAAM,EAAC,UAAC,EAAe;YAAf,KAAA,qBAAe,EAAd,IAAI,QAAA,EAAE,OAAO,QAAA;QACpB,IAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QACjE,0BAA0B;QAC1B,IAAM,OAAO,GACX,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;YAC1D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7D,OAAO,aAAa,IAAI,CAAC,OAAO,CAAC;IACnC,CAAC,CAAC,CACH,CAAC;IAEF,qDAAqD;IACrD,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,IAAA,mBAAY,EAAC,OAAO,CAAC,YAAY,CAAC,EAClC,IAAA,UAAG,EAAC,cAAM,OAAA,SAAkB,EAAlB,CAAkB,CAAC,CAC9B,CAAC;IAEF,IAAM,QAAQ,GAAG,IAAA,YAAK,EAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAE1D,0EAA0E;IAC1E,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,IAAA,YAAK,EAAC,CAAC,CAAC,EACR,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,KAAK;QACX,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC,EACF,IAAA,aAAM,EAAC,QAAQ,CAAC,CACjB,CAAC;IAEF,OAAO,cAAc,CAAC,SAAS,CAAC,UAAC,MAAM;;QACrC,+CAA+C;QAC/C,IAAM,SAAS,GACb,MAAM,CAAC,MAAM,IAAI,oBAAoB,CAAC,CAAC,CAAC,2CAA+B,CAAC,CAAC,CAAC,2CAA+B,CAAC;;YAE5G,KAAoB,IAAA,WAAA,iBAAA,MAAM,CAAA,8BAAA,kDAAE;gBAAvB,IAAM,KAAK,mBAAA;gBACd,0BAA0B;gBAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;aAC5D;;;;;;;;;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAzDD,kCAyDC","sourcesContent":["import { AllWindowObservables, AutoCaptureOptionsWithDefaults } from 'src/autocapture-plugin';\nimport { buffer, filter, map, debounceTime, merge, pairwise, delay } from 'rxjs';\nimport { BrowserClient } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nconst RAGE_CLICK_THRESHOLD = 5;\n\nexport function trackClicks({\n amplitude,\n allObservables,\n options,\n shouldTrackEvent,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n options: AutoCaptureOptionsWithDefaults;\n shouldTrackEvent: shouldTrackEvent;\n}) {\n const { clickObservable } = allObservables;\n\n // Trigger if the target of the click event has changed and position is different\n // Keeping track of position is important to avoid false positives when the user clicks on the same\n // element where certain frameworks could replace the element instance between rerenders\n const comparisonTrigger = clickObservable.pipe(\n pairwise(),\n filter(([prev, current]) => {\n const targetChanged = prev.event.target !== current.event.target;\n /* istanbul ignore next */\n const samePos =\n Math.abs(current.event.screenX - prev.event.screenX) <= 20 &&\n Math.abs(current.event.screenY - prev.event.screenY) <= 20;\n return targetChanged && !samePos;\n }),\n );\n\n // Trigger if there is no click event within 1 second\n const timeoutTrigger = clickObservable.pipe(\n debounceTime(options.debounceTime),\n map(() => 'timeout' as const),\n );\n\n const triggers = merge(comparisonTrigger, timeoutTrigger);\n\n // Get buffers of clicks, if the buffer length is over 5, it is rage click\n const bufferedClicks = clickObservable.pipe(\n delay(0),\n filter(filterOutNonTrackableEvents),\n filter((click) => {\n // Only track clicks on elements that should be tracked,\n return shouldTrackEvent('click', click.closestTrackedAncestor);\n }),\n buffer(triggers),\n );\n\n return bufferedClicks.subscribe((clicks) => {\n // TODO: update this when rage clicks are added\n const clickType =\n clicks.length >= RAGE_CLICK_THRESHOLD ? AMPLITUDE_ELEMENT_CLICKED_EVENT : AMPLITUDE_ELEMENT_CLICKED_EVENT;\n\n for (const click of clicks) {\n /* istanbul ignore next */\n amplitude?.track(clickType, click.targetElementProperties);\n }\n });\n}\n"]}
1
+ {"version":3,"file":"track-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":";;;;AAEA,6BAAiF;AAEjF,sCAA2E;AAC3E,0CAA+D;AAE/D,IAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B,SAAgB,WAAW,CAAC,EAY3B;QAXC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,gBAAgB,sBAAA,EAChB,gBAAgB,sBAAA;IAQR,IAAA,eAAe,GAAK,cAAc,gBAAnB,CAAoB;IAE3C,iFAAiF;IACjF,mGAAmG;IACnG,wFAAwF;IACxF,IAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAC5C,IAAA,eAAQ,GAAE,EACV,IAAA,aAAM,EAAC,UAAC,EAAe;YAAf,KAAA,qBAAe,EAAd,IAAI,QAAA,EAAE,OAAO,QAAA;QACpB,IAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QACjE,0BAA0B;QAC1B,IAAM,OAAO,GACX,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;YAC1D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7D,OAAO,aAAa,IAAI,CAAC,OAAO,CAAC;IACnC,CAAC,CAAC,CACH,CAAC;IAEF,qDAAqD;IACrD,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,IAAA,mBAAY,EAAC,OAAO,CAAC,YAAY,CAAC,EAClC,IAAA,UAAG,EAAC,cAAM,OAAA,SAAkB,EAAlB,CAAkB,CAAC,CAC9B,CAAC;IAEF,IAAM,QAAQ,GAAG,IAAA,YAAK,EAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAE1D,0EAA0E;IAC1E,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,IAAA,YAAK,EAAC,CAAC,CAAC,EACR,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,KAAK;QACX,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC,EACF,IAAA,UAAG,EAAC,UAAC,KAAK,IAAK,OAAA,gBAAgB,CAAC,KAAK,CAAC,EAAvB,CAAuB,CAAC,EACvC,IAAA,aAAM,EAAC,QAAQ,CAAC,CACjB,CAAC;IAEF,OAAO,cAAc,CAAC,SAAS,CAAC,UAAC,MAAM;;QACrC,+CAA+C;QAC/C,IAAM,SAAS,GACb,MAAM,CAAC,MAAM,IAAI,oBAAoB,CAAC,CAAC,CAAC,2CAA+B,CAAC,CAAC,CAAC,2CAA+B,CAAC;;YAE5G,KAAoB,IAAA,WAAA,iBAAA,MAAM,CAAA,8BAAA,kDAAE;gBAAvB,IAAM,KAAK,mBAAA;gBACd,0BAA0B;gBAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;aAC5D;;;;;;;;;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AA5DD,kCA4DC","sourcesContent":["import { AllWindowObservables, AutoCaptureOptionsWithDefaults } from 'src/autocapture-plugin';\nimport { type evaluateTriggersFn } from 'src/helpers';\nimport { buffer, filter, map, debounceTime, merge, pairwise, delay } from 'rxjs';\nimport { BrowserClient } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nconst RAGE_CLICK_THRESHOLD = 5;\n\nexport function trackClicks({\n amplitude,\n allObservables,\n options,\n shouldTrackEvent,\n evaluateTriggers,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n options: AutoCaptureOptionsWithDefaults;\n shouldTrackEvent: shouldTrackEvent;\n evaluateTriggers: evaluateTriggersFn;\n}) {\n const { clickObservable } = allObservables;\n\n // Trigger if the target of the click event has changed and position is different\n // Keeping track of position is important to avoid false positives when the user clicks on the same\n // element where certain frameworks could replace the element instance between rerenders\n const comparisonTrigger = clickObservable.pipe(\n pairwise(),\n filter(([prev, current]) => {\n const targetChanged = prev.event.target !== current.event.target;\n /* istanbul ignore next */\n const samePos =\n Math.abs(current.event.screenX - prev.event.screenX) <= 20 &&\n Math.abs(current.event.screenY - prev.event.screenY) <= 20;\n return targetChanged && !samePos;\n }),\n );\n\n // Trigger if there is no click event within 1 second\n const timeoutTrigger = clickObservable.pipe(\n debounceTime(options.debounceTime),\n map(() => 'timeout' as const),\n );\n\n const triggers = merge(comparisonTrigger, timeoutTrigger);\n\n // Get buffers of clicks, if the buffer length is over 5, it is rage click\n const bufferedClicks = clickObservable.pipe(\n delay(0),\n filter(filterOutNonTrackableEvents),\n filter((click) => {\n // Only track clicks on elements that should be tracked,\n return shouldTrackEvent('click', click.closestTrackedAncestor);\n }),\n map((click) => evaluateTriggers(click)),\n buffer(triggers),\n );\n\n return bufferedClicks.subscribe((clicks) => {\n // TODO: update this when rage clicks are added\n const clickType =\n clicks.length >= RAGE_CLICK_THRESHOLD ? AMPLITUDE_ELEMENT_CLICKED_EVENT : AMPLITUDE_ELEMENT_CLICKED_EVENT;\n\n for (const click of clicks) {\n /* istanbul ignore next */\n amplitude?.track(clickType, click.targetElementProperties);\n }\n });\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { BrowserClient, BrowserConfig, EnrichmentPlugin, ElementInteractionsOptions } from '@amplitude/analytics-core';
2
2
  import { Observable } from 'rxjs';
3
+ import { ElementBasedTimestampedEvent, TimestampedEvent } from './helpers';
3
4
  import { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';
4
5
  declare global {
5
6
  interface Window {
@@ -36,26 +37,12 @@ export declare enum ObservablesEnum {
36
37
  NavigateObservable = "navigateObservable",
37
38
  MutationObservable = "mutationObservable"
38
39
  }
39
- type BaseTimestampedEvent<T> = {
40
- event: T;
41
- timestamp: number;
42
- type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation';
43
- };
44
- export type ElementBasedEvent = MouseEvent | Event;
45
- export type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {
46
- event: MouseEvent | Event;
47
- type: 'click' | 'change';
48
- closestTrackedAncestor: Element;
49
- targetElementProperties: Record<string, any>;
50
- };
51
- export type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;
52
40
  export interface AllWindowObservables {
53
41
  [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;
54
42
  [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;
55
43
  [ObservablesEnum.NavigateObservable]: Observable<TimestampedEvent<NavigateEvent>> | undefined;
56
44
  [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;
57
45
  }
58
- export declare function isElementBasedEvent<T>(event: BaseTimestampedEvent<T>): event is ElementBasedTimestampedEvent<T>;
59
46
  export declare const autocapturePlugin: (options?: ElementInteractionsOptions) => BrowserEnrichmentPlugin;
60
47
  export {};
61
48
  //# sourceMappingURL=autocapture-plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"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"}
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,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.autocapturePlugin = exports.isElementBasedEvent = exports.ObservablesEnum = void 0;
3
+ exports.autocapturePlugin = exports.ObservablesEnum = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  /* eslint-disable no-restricted-globals */
6
6
  var analytics_core_1 = require("@amplitude/analytics-core");
@@ -8,10 +8,12 @@ var constants = tslib_1.__importStar(require("./constants"));
8
8
  var rxjs_1 = require("rxjs");
9
9
  var helpers_1 = require("./helpers");
10
10
  var messenger_1 = require("./libs/messenger");
11
- var hierarchy_1 = require("./hierarchy");
12
11
  var track_click_1 = require("./autocapture/track-click");
13
12
  var track_change_1 = require("./autocapture/track-change");
14
13
  var track_action_click_1 = require("./autocapture/track-action-click");
14
+ var observables_1 = require("./observables");
15
+ var triggers_1 = require("./pageActions/triggers");
16
+ var actions_1 = require("./pageActions/actions");
15
17
  var ObservablesEnum;
16
18
  (function (ObservablesEnum) {
17
19
  ObservablesEnum["ClickObservable"] = "clickObservable";
@@ -20,18 +22,13 @@ var ObservablesEnum;
20
22
  ObservablesEnum["NavigateObservable"] = "navigateObservable";
21
23
  ObservablesEnum["MutationObservable"] = "mutationObservable";
22
24
  })(ObservablesEnum = exports.ObservablesEnum || (exports.ObservablesEnum = {}));
23
- // Type predicate
24
- function isElementBasedEvent(event) {
25
- return event.type === 'click' || event.type === 'change';
26
- }
27
- exports.isElementBasedEvent = isElementBasedEvent;
28
25
  var autocapturePlugin = function (options) {
29
- var _a, _b, _c;
26
+ var _a, _b, _c, _d, _e, _f, _g;
30
27
  if (options === void 0) { options = {}; }
31
- var _d = options.dataAttributePrefix, dataAttributePrefix = _d === void 0 ? analytics_core_1.DEFAULT_DATA_ATTRIBUTE_PREFIX : _d, _e = options.visualTaggingOptions, visualTaggingOptions = _e === void 0 ? {
28
+ var _h = options.dataAttributePrefix, dataAttributePrefix = _h === void 0 ? analytics_core_1.DEFAULT_DATA_ATTRIBUTE_PREFIX : _h, _j = options.visualTaggingOptions, visualTaggingOptions = _j === void 0 ? {
32
29
  enabled: true,
33
30
  messenger: new messenger_1.WindowMessenger(),
34
- } : _e;
31
+ } : _j;
35
32
  options.cssSelectorAllowlist = (_a = options.cssSelectorAllowlist) !== null && _a !== void 0 ? _a : analytics_core_1.DEFAULT_CSS_SELECTOR_ALLOWLIST;
36
33
  options.actionClickAllowlist = (_b = options.actionClickAllowlist) !== null && _b !== void 0 ? _b : analytics_core_1.DEFAULT_ACTION_CLICK_ALLOWLIST;
37
34
  options.debounceTime = (_c = options.debounceTime) !== null && _c !== void 0 ? _c : 0; // TODO: update this when rage clicks are added to 1000ms
@@ -42,8 +39,12 @@ var autocapturePlugin = function (options) {
42
39
  var createObservables = function () {
43
40
  var _a;
44
41
  // Create Observables from direct user events
45
- var clickObservable = (0, rxjs_1.fromEvent)(document, 'click', { capture: true }).pipe((0, rxjs_1.map)(function (click) { return addAdditionalEventProperties(click, 'click'); }), (0, rxjs_1.share)());
46
- var changeObservable = (0, rxjs_1.fromEvent)(document, 'change', { capture: true }).pipe((0, rxjs_1.map)(function (change) { return addAdditionalEventProperties(change, 'change'); }), (0, rxjs_1.share)());
42
+ var clickObservable = (0, observables_1.createClickObservable)().pipe((0, rxjs_1.map)(function (click) {
43
+ return (0, helpers_1.addAdditionalEventProperties)(click, 'click', options.cssSelectorAllowlist, dataAttributePrefix);
44
+ }), (0, rxjs_1.share)());
45
+ var changeObservable = (0, rxjs_1.fromEvent)(document, 'change', { capture: true }).pipe((0, rxjs_1.map)(function (change) {
46
+ return (0, helpers_1.addAdditionalEventProperties)(change, 'change', options.cssSelectorAllowlist, dataAttributePrefix);
47
+ }), (0, rxjs_1.share)());
47
48
  // Create Observable from unhandled errors
48
49
  // const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(
49
50
  // map((error) => addAdditionalEventProperties(error, 'error')),
@@ -52,21 +53,14 @@ var autocapturePlugin = function (options) {
52
53
  var navigateObservable;
53
54
  /* istanbul ignore next */
54
55
  if (window.navigation) {
55
- navigateObservable = (0, rxjs_1.fromEvent)(window.navigation, 'navigate').pipe((0, rxjs_1.map)(function (navigate) { return addAdditionalEventProperties(navigate, 'navigate'); }), (0, rxjs_1.share)());
56
+ navigateObservable = (0, rxjs_1.fromEvent)(window.navigation, 'navigate').pipe((0, rxjs_1.map)(function (navigate) {
57
+ return (0, helpers_1.addAdditionalEventProperties)(navigate, 'navigate', options.cssSelectorAllowlist, dataAttributePrefix);
58
+ }), (0, rxjs_1.share)());
56
59
  }
57
- // Track DOM Mutations
58
- var mutationObservable = new rxjs_1.Observable(function (observer) {
59
- var mutationObserver = new MutationObserver(function (mutations) {
60
- observer.next(mutations);
61
- });
62
- mutationObserver.observe(document.body, {
63
- childList: true,
64
- attributes: true,
65
- characterData: true,
66
- subtree: true,
67
- });
68
- return function () { return mutationObserver.disconnect(); };
69
- }).pipe((0, rxjs_1.map)(function (mutation) { return addAdditionalEventProperties(mutation, 'mutation'); }), (0, rxjs_1.share)());
60
+ // Track DOM Mutations using shared observable
61
+ var mutationObservable = (0, observables_1.createMutationObservable)().pipe((0, rxjs_1.map)(function (mutation) {
62
+ return (0, helpers_1.addAdditionalEventProperties)(mutation, 'mutation', options.cssSelectorAllowlist, dataAttributePrefix);
63
+ }), (0, rxjs_1.share)());
70
64
  return _a = {},
71
65
  _a[ObservablesEnum.ClickObservable] = clickObservable,
72
66
  _a[ObservablesEnum.ChangeObservable] = changeObservable,
@@ -75,55 +69,35 @@ var autocapturePlugin = function (options) {
75
69
  _a[ObservablesEnum.MutationObservable] = mutationObservable,
76
70
  _a;
77
71
  };
78
- // Returns the Amplitude event properties for the given element.
79
- var getEventProperties = function (actionType, element) {
80
- var _a;
81
- var _b, _c;
82
- /* istanbul ignore next */
83
- var tag = (_c = (_b = element === null || element === void 0 ? void 0 : element.tagName) === null || _b === void 0 ? void 0 : _b.toLowerCase) === null || _c === void 0 ? void 0 : _c.call(_b);
84
- /* istanbul ignore next */
85
- var rect = typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };
86
- var ariaLabel = element.getAttribute('aria-label');
87
- var attributes = (0, helpers_1.getAttributesWithPrefix)(element, dataAttributePrefix);
88
- var nearestLabel = (0, helpers_1.getNearestLabel)(element);
89
- /* istanbul ignore next */
90
- var properties = (_a = {},
91
- _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '',
92
- _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.getAttribute('class'),
93
- _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY] = (0, hierarchy_1.getHierarchy)(element),
94
- _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG] = tag,
95
- _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT] = (0, helpers_1.getText)(element),
96
- _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT] = rect.left == null ? null : Math.round(rect.left),
97
- _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP] = rect.top == null ? null : Math.round(rect.top),
98
- _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = ariaLabel,
99
- _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES] = attributes,
100
- _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL] = nearestLabel,
101
- _a[constants.AMPLITUDE_EVENT_PROP_PAGE_URL] = window.location.href.split('?')[0],
102
- _a[constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE] = (typeof document !== 'undefined' && document.title) || '',
103
- _a[constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT] = window.innerHeight,
104
- _a[constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH] = window.innerWidth,
105
- _a);
106
- if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {
107
- properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = element.href;
72
+ // Group labeled events by event type (eg. click, change)
73
+ var groupedLabeledEvents = (0, triggers_1.groupLabeledEventIdsByEventType)(Object.values((_e = (_d = options.pageActions) === null || _d === void 0 ? void 0 : _d.labeledEvents) !== null && _e !== void 0 ? _e : {}));
74
+ var labeledEventToTriggerMap = (0, triggers_1.createLabeledEventToTriggerMap)((_g = (_f = options.pageActions) === null || _f === void 0 ? void 0 : _f.triggers) !== null && _g !== void 0 ? _g : []);
75
+ // Evaluate triggers for the given event by running the actions associated with the matching triggers
76
+ var evaluateTriggers = function (event) {
77
+ var e_1, _a;
78
+ // If there is no pageActions, return the event as is
79
+ var pageActions = options.pageActions;
80
+ if (!pageActions) {
81
+ return event;
108
82
  }
109
- return (0, helpers_1.removeEmptyProperties)(properties);
110
- };
111
- var addAdditionalEventProperties = function (event, type) {
112
- var baseEvent = {
113
- event: event,
114
- timestamp: Date.now(),
115
- type: type,
116
- };
117
- if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {
118
- // Retrieve additional event properties from the target element
119
- var closestTrackedAncestor = (0, helpers_1.getClosestElement)(baseEvent.event.target, options.cssSelectorAllowlist);
120
- if (closestTrackedAncestor) {
121
- baseEvent.closestTrackedAncestor = closestTrackedAncestor;
122
- baseEvent.targetElementProperties = getEventProperties(baseEvent.type, closestTrackedAncestor);
83
+ // Find matching labeled events
84
+ var matchingLabeledEvents = (0, triggers_1.matchEventToLabeledEvents)(event, Array.from(groupedLabeledEvents[event.type]).map(function (id) { return pageActions.labeledEvents[id]; }));
85
+ // Find matching conditions
86
+ var matchingTriggers = (0, triggers_1.matchLabeledEventsToTriggers)(matchingLabeledEvents, labeledEventToTriggerMap);
87
+ try {
88
+ for (var matchingTriggers_1 = tslib_1.__values(matchingTriggers), matchingTriggers_1_1 = matchingTriggers_1.next(); !matchingTriggers_1_1.done; matchingTriggers_1_1 = matchingTriggers_1.next()) {
89
+ var trigger = matchingTriggers_1_1.value;
90
+ (0, actions_1.executeActions)(trigger.actions, event);
91
+ }
92
+ }
93
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
94
+ finally {
95
+ try {
96
+ if (matchingTriggers_1_1 && !matchingTriggers_1_1.done && (_a = matchingTriggers_1.return)) _a.call(matchingTriggers_1);
123
97
  }
124
- return baseEvent;
98
+ finally { if (e_1) throw e_1.error; }
125
99
  }
126
- return baseEvent;
100
+ return event;
127
101
  };
128
102
  var setup = function (config, amplitude) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
129
103
  var shouldTrackEvent, shouldTrackActionClick, allObservables, clickTrackingSubscription, changeSubscription, actionClickSubscription, allowlist, actionClickAllowlist;
@@ -141,19 +115,33 @@ var autocapturePlugin = function (options) {
141
115
  options: options,
142
116
  amplitude: amplitude,
143
117
  shouldTrackEvent: shouldTrackEvent,
118
+ evaluateTriggers: evaluateTriggers,
144
119
  });
145
120
  subscriptions.push(clickTrackingSubscription);
146
121
  changeSubscription = (0, track_change_1.trackChange)({
147
122
  allObservables: allObservables,
148
- getEventProperties: getEventProperties,
123
+ getEventProperties: function () {
124
+ var args = [];
125
+ for (var _i = 0; _i < arguments.length; _i++) {
126
+ args[_i] = arguments[_i];
127
+ }
128
+ return helpers_1.getEventProperties.apply(void 0, tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(args), false), [dataAttributePrefix], false));
129
+ },
149
130
  amplitude: amplitude,
150
131
  shouldTrackEvent: shouldTrackEvent,
132
+ evaluateTriggers: evaluateTriggers,
151
133
  });
152
134
  subscriptions.push(changeSubscription);
153
135
  actionClickSubscription = (0, track_action_click_1.trackActionClick)({
154
136
  allObservables: allObservables,
155
137
  options: options,
156
- getEventProperties: getEventProperties,
138
+ getEventProperties: function () {
139
+ var args = [];
140
+ for (var _i = 0; _i < arguments.length; _i++) {
141
+ args[_i] = arguments[_i];
142
+ }
143
+ return helpers_1.getEventProperties.apply(void 0, tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(args), false), [dataAttributePrefix], false));
144
+ },
157
145
  amplitude: amplitude,
158
146
  shouldTrackEvent: shouldTrackEvent,
159
147
  shouldTrackActionClick: shouldTrackActionClick,
@@ -178,7 +166,7 @@ var autocapturePlugin = function (options) {
178
166
  }); };
179
167
  var teardown = function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
180
168
  var subscriptions_1, subscriptions_1_1, subscription;
181
- var e_1, _a;
169
+ var e_2, _a;
182
170
  return tslib_1.__generator(this, function (_b) {
183
171
  try {
184
172
  for (subscriptions_1 = tslib_1.__values(subscriptions), subscriptions_1_1 = subscriptions_1.next(); !subscriptions_1_1.done; subscriptions_1_1 = subscriptions_1.next()) {
@@ -186,12 +174,12 @@ var autocapturePlugin = function (options) {
186
174
  subscription.unsubscribe();
187
175
  }
188
176
  }
189
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
177
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
190
178
  finally {
191
179
  try {
192
180
  if (subscriptions_1_1 && !subscriptions_1_1.done && (_a = subscriptions_1.return)) _a.call(subscriptions_1);
193
181
  }
194
- finally { if (e_1) throw e_1.error; }
182
+ finally { if (e_2) throw e_2.error; }
195
183
  }
196
184
  return [2 /*return*/];
197
185
  });
@@ -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_DATA_ATTRIBUTE_PREFIX,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n ActionType,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { fromEvent, map, Observable, Subscription, share } from 'rxjs';\nimport {\n getText,\n getAttributesWithPrefix,\n removeEmptyProperties,\n getNearestLabel,\n createShouldTrackEvent,\n getClosestElement,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { getHierarchy } from './hierarchy';\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';\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\n// Base TimestampedEvent type\ntype 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\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\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\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 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 = fromEvent<MouseEvent>(document, 'click', { capture: true }).pipe(\n map((click) => addAdditionalEventProperties(click, 'click')),\n share(),\n );\n const changeObservable = fromEvent<Event>(document, 'change', { capture: true }).pipe(\n map((change) => addAdditionalEventProperties(change, 'change')),\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) => addAdditionalEventProperties(navigate, 'navigate')),\n share(),\n );\n }\n\n // Track DOM Mutations\n const mutationObservable = new Observable<MutationRecord[]>((observer) => {\n const mutationObserver = new MutationObserver((mutations) => {\n observer.next(mutations);\n });\n mutationObserver.observe(document.body, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n });\n return () => mutationObserver.disconnect();\n }).pipe(\n map((mutation) => addAdditionalEventProperties(mutation, 'mutation')),\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 // Returns the Amplitude event properties for the given element.\n const getEventProperties = (actionType: ActionType, element: Element) => {\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\n const addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\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(\n baseEvent.event.target as HTMLElement,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = getEventProperties(baseEvent.type, closestTrackedAncestor);\n }\n return baseEvent;\n }\n\n return baseEvent;\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 });\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties,\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":";;;;AAAA,0CAA0C;AAC1C,4DAQmC;AACnC,6DAAyC;AACzC,6BAAuE;AACvE,qCAOmB;AACnB,8CAAmD;AACnD,yDAAwD;AACxD,2DAAyD;AACzD,uEAAoE;AAEpE,6CAAgF;AAEhF,mDAKgC;AAChC,iDAAuD;AAwCvD,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,sDAAmC,CAAA;IACnC,wDAAqC,CAAA;IACrC,uCAAuC;IACvC,4DAAyC,CAAA;IACzC,4DAAyC,CAAA;AAC3C,CAAC,EANW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QAM1B;AAUM,IAAM,iBAAiB,GAAG,UAAC,OAAwC;;IAAxC,wBAAA,EAAA,YAAwC;IAEtE,IAAA,KAKE,OAAO,oBAL0C,EAAnD,mBAAmB,mBAAG,8CAA6B,KAAA,EACnD,KAIE,OAAO,qBADR,EAHD,oBAAoB,mBAAG;QACrB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI,2BAAe,EAAE;KACjC,KAAA,CACS;IAEZ,OAAO,CAAC,oBAAoB,GAAG,MAAA,OAAO,CAAC,oBAAoB,mCAAI,+CAA8B,CAAC;IAC9F,OAAO,CAAC,oBAAoB,GAAG,MAAA,OAAO,CAAC,oBAAoB,mCAAI,+CAA8B,CAAC;IAC9F,OAAO,CAAC,YAAY,GAAG,MAAA,OAAO,CAAC,YAAY,mCAAI,CAAC,CAAC,CAAC,yDAAyD;IAE3G,IAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC;IACnC,IAAM,IAAI,GAAG,YAAY,CAAC;IAE1B,IAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,6CAA6C;IAC7C,IAAM,iBAAiB,GAAG;;QACxB,6CAA6C;QAC7C,IAAM,eAAe,GAAG,IAAA,mCAAqB,GAAE,CAAC,IAAI,CAClD,IAAA,UAAG,EAAC,UAAC,KAAK;YACR,OAAA,IAAA,sCAA4B,EAC1B,KAAK,EACL,OAAO,EACN,OAA0C,CAAC,oBAAoB,EAChE,mBAAmB,CACpB;QALD,CAKC,CACF,EACD,IAAA,YAAK,GAAE,CACR,CAAC;QACF,IAAM,gBAAgB,GAAG,IAAA,gBAAS,EAAQ,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACnF,IAAA,UAAG,EAAC,UAAC,MAAM;YACT,OAAA,IAAA,sCAA4B,EAC1B,MAAM,EACN,QAAQ,EACP,OAA0C,CAAC,oBAAoB,EAChE,mBAAmB,CACpB;QALD,CAKC,CACF,EACD,IAAA,YAAK,GAAE,CACR,CAAC;QAEF,0CAA0C;QAC1C,uEAAuE;QACvE,kEAAkE;QAClE,KAAK;QAEL,oCAAoC;QACpC,IAAI,kBAAkB,CAAC;QACvB,0BAA0B;QAC1B,IAAI,MAAM,CAAC,UAAU,EAAE;YACrB,kBAAkB,GAAG,IAAA,gBAAS,EAAgB,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAC/E,IAAA,UAAG,EAAC,UAAC,QAAQ;gBACX,OAAA,IAAA,sCAA4B,EAC1B,QAAQ,EACR,UAAU,EACT,OAA0C,CAAC,oBAAoB,EAChE,mBAAmB,CACpB;YALD,CAKC,CACF,EACD,IAAA,YAAK,GAAE,CACR,CAAC;SACH;QAED,8CAA8C;QAC9C,IAAM,kBAAkB,GAAG,IAAA,sCAAwB,GAAE,CAAC,IAAI,CACxD,IAAA,UAAG,EAAC,UAAC,QAAQ;YACX,OAAA,IAAA,sCAA4B,EAC1B,QAAQ,EACR,UAAU,EACT,OAA0C,CAAC,oBAAoB,EAChE,mBAAmB,CACpB;QALD,CAKC,CACF,EACD,IAAA,YAAK,GAAE,CACR,CAAC;QAEF;YACE,GAAC,eAAe,CAAC,eAAe,IAAG,eAAuE;YAC1G,GAAC,eAAe,CAAC,gBAAgB,IAAG,gBAAmE;YACvG,sDAAsD;YACtD,GAAC,eAAe,CAAC,kBAAkB,IAAG,kBAAkB;YACxD,GAAC,eAAe,CAAC,kBAAkB,IAAG,kBAAkB;eACxD;IACJ,CAAC,CAAC;IAEF,yDAAyD;IACzD,IAAM,oBAAoB,GAAG,IAAA,0CAA+B,EAAC,MAAM,CAAC,MAAM,CAAC,MAAA,MAAA,OAAO,CAAC,WAAW,0CAAE,aAAa,mCAAI,EAAE,CAAC,CAAC,CAAC;IAEtH,IAAM,wBAAwB,GAAG,IAAA,yCAA8B,EAAC,MAAA,MAAA,OAAO,CAAC,WAAW,0CAAE,QAAQ,mCAAI,EAAE,CAAC,CAAC;IAErG,qGAAqG;IACrG,IAAM,gBAAgB,GAAG,UACvB,KAAsC;;QAEtC,qDAAqD;QAC7C,IAAA,WAAW,GAAK,OAAO,YAAZ,CAAa;QAChC,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO,KAAK,CAAC;SACd;QAED,+BAA+B;QAC/B,IAAM,qBAAqB,GAAG,IAAA,oCAAyB,EACrD,KAAK,EACL,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,UAAC,EAAE,IAAK,OAAA,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC,EAA7B,CAA6B,CAAC,CACxF,CAAC;QACF,2BAA2B;QAC3B,IAAM,gBAAgB,GAAG,IAAA,uCAA4B,EAAC,qBAAqB,EAAE,wBAAwB,CAAC,CAAC;;YACvG,KAAsB,IAAA,qBAAA,iBAAA,gBAAgB,CAAA,kDAAA,gFAAE;gBAAnC,IAAM,OAAO,6BAAA;gBAChB,IAAA,wBAAc,EAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;aACxC;;;;;;;;;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,IAAM,KAAK,GAAqC,UAAO,MAAM,EAAE,SAAS;;;;YACtE,wBAAwB;YACxB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;gBACnC,sBAAO;aACR;YAGK,gBAAgB,GAAG,IAAA,gCAAsB,EAC7C,OAAO,EACN,OAA0C,CAAC,oBAAoB,CACjE,CAAC;YACI,sBAAsB,GAAG,IAAA,gCAAsB,EACnD,OAAO,EACN,OAA0C,CAAC,oBAAoB,CACjE,CAAC;YAGI,cAAc,GAAG,iBAAiB,EAAE,CAAC;YAGrC,yBAAyB,GAAG,IAAA,yBAAW,EAAC;gBAC5C,cAAc,gBAAA;gBACd,OAAO,EAAE,OAAyC;gBAClD,SAAS,WAAA;gBACT,gBAAgB,EAAE,gBAAgB;gBAClC,gBAAgB,kBAAA;aACjB,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAExC,kBAAkB,GAAG,IAAA,0BAAW,EAAC;gBACrC,cAAc,gBAAA;gBACd,kBAAkB,EAAE;oBAAC,cAAO;yBAAP,UAAO,EAAP,qBAAO,EAAP,IAAO;wBAAP,yBAAO;;oBAAK,OAAA,4BAAkB,8EAAI,IAAI,YAAE,mBAAmB;gBAA/C,CAAgD;gBACjF,SAAS,WAAA;gBACT,gBAAgB,EAAE,gBAAgB;gBAClC,gBAAgB,kBAAA;aACjB,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAEjC,uBAAuB,GAAG,IAAA,qCAAgB,EAAC;gBAC/C,cAAc,gBAAA;gBACd,OAAO,EAAE,OAAyC;gBAClD,kBAAkB,EAAE;oBAAC,cAAO;yBAAP,UAAO,EAAP,qBAAO,EAAP,IAAO;wBAAP,yBAAO;;oBAAK,OAAA,4BAAkB,8EAAI,IAAI,YAAE,mBAAmB;gBAA/C,CAAgD;gBACjF,SAAS,WAAA;gBACT,gBAAgB,kBAAA;gBAChB,sBAAsB,EAAE,sBAAsB;aAC/C,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAE5C,0BAA0B;YAC1B,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,0CAAE,GAAG,CAAC,UAAG,IAAI,kCAA+B,CAAC,CAAC;YAEpE,gCAAgC;YAChC,IAAI,MAAM,CAAC,MAAM,IAAI,oBAAoB,CAAC,OAAO,EAAE;gBAC3C,SAAS,GAAI,OAA0C,CAAC,oBAAoB,CAAC;gBAC7E,oBAAoB,GAAI,OAA0C,CAAC,oBAAoB,CAAC;gBAE9F,0BAA0B;gBAC1B,MAAA,oBAAoB,CAAC,SAAS,0CAAE,KAAK,qCACnC,MAAM,EAAE,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,cAAc,IAC3B,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,KAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,KAC3F,mBAAmB,EAAE,IAAA,gCAAsB,EAAC,OAAO,iEAAM,SAAS,0BAAK,oBAAoB,UAAE,EAC7F,oBAAoB,EAAE,SAAS,EAC/B,oBAAoB,EAAE,oBAAoB,IAC1C,CAAC;aACJ;;;SACF,CAAC;IAEF,IAAM,OAAO,GAAuC,UAAO,KAAK;;YAC9D,sBAAO,KAAK,EAAC;;SACd,CAAC;IAEF,IAAM,QAAQ,GAAG;;;;;gBACf,KAA2B,kBAAA,iBAAA,aAAa,CAAA,mHAAE;oBAA/B,YAAY;oBACrB,YAAY,CAAC,WAAW,EAAE,CAAC;iBAC5B;;;;;;;;;;;SACF,CAAC;IAEF,OAAO;QACL,IAAI,MAAA;QACJ,IAAI,MAAA;QACJ,KAAK,OAAA;QACL,OAAO,SAAA;QACP,QAAQ,UAAA;KACT,CAAC;AACJ,CAAC,CAAC;AAzMW,QAAA,iBAAiB,qBAyM5B","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,5 +1,4 @@
1
1
  import { ElementInteractionsOptions, ActionType } from '@amplitude/analytics-core';
2
- import { ElementBasedEvent, ElementBasedTimestampedEvent } from './autocapture-plugin';
3
2
  export type JSONValue = string | number | boolean | null | {
4
3
  [x: string]: JSONValue;
5
4
  } | Array<JSONValue>;
@@ -28,4 +27,24 @@ export declare const getEventTagProps: (element: Element) => {
28
27
  export declare const asyncLoadScript: (url: string) => Promise<unknown>;
29
28
  export declare function generateUniqueId(): string;
30
29
  export declare const filterOutNonTrackableEvents: (event: ElementBasedTimestampedEvent<ElementBasedEvent>) => boolean;
30
+ export declare const getEventProperties: (actionType: ActionType, element: Element, dataAttributePrefix: string) => {
31
+ [key: string]: unknown;
32
+ };
33
+ export type AutoCaptureOptionsWithDefaults = Required<Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>> & ElementInteractionsOptions;
34
+ export declare const addAdditionalEventProperties: <T>(event: T, type: "error" | "navigate" | "change" | "click" | "rage" | "mutation", selectorAllowlist: string[], dataAttributePrefix: string) => TimestampedEvent<T>;
35
+ export type BaseTimestampedEvent<T> = {
36
+ event: T;
37
+ timestamp: number;
38
+ type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation';
39
+ };
40
+ export type ElementBasedEvent = MouseEvent | Event;
41
+ export type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {
42
+ event: MouseEvent | Event;
43
+ type: 'click' | 'change';
44
+ closestTrackedAncestor: Element;
45
+ targetElementProperties: Record<string, any>;
46
+ };
47
+ export type evaluateTriggersFn = <T extends ElementBasedEvent>(event: ElementBasedTimestampedEvent<T>) => ElementBasedTimestampedEvent<T>;
48
+ export type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;
49
+ export declare function isElementBasedEvent<T>(event: BaseTimestampedEvent<T>): event is ElementBasedTimestampedEvent<T>;
31
50
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAEvF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAIzG,MAAM,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;AAErF,eAAO,MAAM,sBAAsB,uBACb,0BAA0B,aACnC,MAAM,EAAE,KAClB,gBAsDF,CAAC;AAEF,eAAO,MAAM,oBAAoB,SAAU,MAAM,GAAG,IAAI,YAgBvD,CAAC;AAEF,eAAO,MAAM,UAAU,SAAU,IAAI,YAEpC,CAAC;AAEF,eAAO,MAAM,qBAAqB,YAAa,OAAO,YAOrD,CAAC;AAGF,eAAO,MAAM,OAAO,YAAa,OAAO,KAAG,MAsB1C,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAS,MAAM,oBAAoB,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,SAAS,YAU9F,CAAC;AAEF,eAAO,MAAM,uBAAuB,YAAa,OAAO,UAAU,MAAM;;CAWvE,CAAC;AAEF,eAAO,MAAM,OAAO,UAAW,OAAO,YAOrC,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;CAQjC,CAAC;AAEF,eAAO,MAAM,eAAe,YAAa,OAAO,KAAG,MAkBlD,CAAC;AAEF,eAAO,MAAM,yBAAyB,SAAU,OAAO,GAAG,QAAQ,aAAa,MAAM,EAAE,KAAG,OAAO,EAchG,CAAC;AAGF,eAAO,MAAM,iBAAiB,YAAa,OAAO,GAAG,IAAI,aAAa,MAAM,EAAE,KAAG,OAAO,GAAG,IAU1F,CAAC;AAGF,eAAO,MAAM,gBAAgB,YAAa,OAAO;;CAahD,CAAC;AAEF,eAAO,MAAM,eAAe,QAAS,MAAM,qBA2B1C,CAAC;AAEF,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,eAAO,MAAM,2BAA2B,UAAW,6BAA6B,iBAAiB,CAAC,KAAG,OAQpG,CAAC"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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"}