@amplitude/plugin-autocapture-browser 1.18.0 → 1.19.0-feat-zoning.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 (124) hide show
  1. package/lib/cjs/autocapture/track-click.d.ts +2 -2
  2. package/lib/cjs/autocapture/track-click.d.ts.map +1 -1
  3. package/lib/cjs/autocapture/track-click.js.map +1 -1
  4. package/lib/cjs/autocapture/track-exposure.d.ts +11 -0
  5. package/lib/cjs/autocapture/track-exposure.d.ts.map +1 -0
  6. package/lib/cjs/autocapture/track-exposure.js +56 -0
  7. package/lib/cjs/autocapture/track-exposure.js.map +1 -0
  8. package/lib/cjs/autocapture/track-scroll.d.ts +15 -0
  9. package/lib/cjs/autocapture/track-scroll.d.ts.map +1 -0
  10. package/lib/cjs/autocapture/track-scroll.js +34 -0
  11. package/lib/cjs/autocapture/track-scroll.js.map +1 -0
  12. package/lib/cjs/autocapture/track-viewport-content-updated.d.ts +25 -0
  13. package/lib/cjs/autocapture/track-viewport-content-updated.d.ts.map +1 -0
  14. package/lib/cjs/autocapture/track-viewport-content-updated.js +65 -0
  15. package/lib/cjs/autocapture/track-viewport-content-updated.js.map +1 -0
  16. package/lib/cjs/autocapture-plugin.d.ts +5 -1
  17. package/lib/cjs/autocapture-plugin.d.ts.map +1 -1
  18. package/lib/cjs/autocapture-plugin.js +104 -8
  19. package/lib/cjs/autocapture-plugin.js.map +1 -1
  20. package/lib/cjs/constants.d.ts +7 -0
  21. package/lib/cjs/constants.d.ts.map +1 -1
  22. package/lib/cjs/constants.js +9 -1
  23. package/lib/cjs/constants.js.map +1 -1
  24. package/lib/cjs/data-extractor.d.ts +1 -0
  25. package/lib/cjs/data-extractor.d.ts.map +1 -1
  26. package/lib/cjs/data-extractor.js +17 -0
  27. package/lib/cjs/data-extractor.js.map +1 -1
  28. package/lib/cjs/helpers.d.ts +1 -0
  29. package/lib/cjs/helpers.d.ts.map +1 -1
  30. package/lib/cjs/helpers.js +22 -1
  31. package/lib/cjs/helpers.js.map +1 -1
  32. package/lib/cjs/libs/element-path.d.ts +2 -0
  33. package/lib/cjs/libs/element-path.d.ts.map +1 -0
  34. package/lib/cjs/libs/element-path.js +177 -0
  35. package/lib/cjs/libs/element-path.js.map +1 -0
  36. package/lib/cjs/observables.d.ts +3 -0
  37. package/lib/cjs/observables.d.ts.map +1 -1
  38. package/lib/cjs/observables.js +56 -3
  39. package/lib/cjs/observables.js.map +1 -1
  40. package/lib/cjs/version.d.ts +1 -1
  41. package/lib/cjs/version.d.ts.map +1 -1
  42. package/lib/cjs/version.js +1 -1
  43. package/lib/cjs/version.js.map +1 -1
  44. package/lib/esm/autocapture/track-click.d.ts +2 -2
  45. package/lib/esm/autocapture/track-click.d.ts.map +1 -1
  46. package/lib/esm/autocapture/track-click.js.map +1 -1
  47. package/lib/esm/autocapture/track-exposure.d.ts +11 -0
  48. package/lib/esm/autocapture/track-exposure.d.ts.map +1 -0
  49. package/lib/esm/autocapture/track-exposure.js +52 -0
  50. package/lib/esm/autocapture/track-exposure.js.map +1 -0
  51. package/lib/esm/autocapture/track-scroll.d.ts +15 -0
  52. package/lib/esm/autocapture/track-scroll.d.ts.map +1 -0
  53. package/lib/esm/autocapture/track-scroll.js +30 -0
  54. package/lib/esm/autocapture/track-scroll.js.map +1 -0
  55. package/lib/esm/autocapture/track-viewport-content-updated.d.ts +25 -0
  56. package/lib/esm/autocapture/track-viewport-content-updated.d.ts.map +1 -0
  57. package/lib/esm/autocapture/track-viewport-content-updated.js +59 -0
  58. package/lib/esm/autocapture/track-viewport-content-updated.js.map +1 -0
  59. package/lib/esm/autocapture-plugin.d.ts +5 -1
  60. package/lib/esm/autocapture-plugin.d.ts.map +1 -1
  61. package/lib/esm/autocapture-plugin.js +105 -9
  62. package/lib/esm/autocapture-plugin.js.map +1 -1
  63. package/lib/esm/constants.d.ts +7 -0
  64. package/lib/esm/constants.d.ts.map +1 -1
  65. package/lib/esm/constants.js +8 -0
  66. package/lib/esm/constants.js.map +1 -1
  67. package/lib/esm/data-extractor.d.ts +1 -0
  68. package/lib/esm/data-extractor.d.ts.map +1 -1
  69. package/lib/esm/data-extractor.js +18 -1
  70. package/lib/esm/data-extractor.js.map +1 -1
  71. package/lib/esm/helpers.d.ts +1 -0
  72. package/lib/esm/helpers.d.ts.map +1 -1
  73. package/lib/esm/helpers.js +21 -1
  74. package/lib/esm/helpers.js.map +1 -1
  75. package/lib/esm/libs/element-path.d.ts +2 -0
  76. package/lib/esm/libs/element-path.d.ts.map +1 -0
  77. package/lib/esm/libs/element-path.js +173 -0
  78. package/lib/esm/libs/element-path.js.map +1 -0
  79. package/lib/esm/observables.d.ts +3 -0
  80. package/lib/esm/observables.d.ts.map +1 -1
  81. package/lib/esm/observables.js +53 -2
  82. package/lib/esm/observables.js.map +1 -1
  83. package/lib/esm/version.d.ts +1 -1
  84. package/lib/esm/version.d.ts.map +1 -1
  85. package/lib/esm/version.js +1 -1
  86. package/lib/esm/version.js.map +1 -1
  87. package/lib/scripts/amplitude-min.js +1 -1
  88. package/lib/scripts/amplitude-min.js.gz +0 -0
  89. package/lib/scripts/amplitude-min.js.map +1 -1
  90. package/lib/scripts/amplitude-min.umd.js +1 -1
  91. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  92. package/lib/scripts/autocapture/track-click.d.ts +2 -2
  93. package/lib/scripts/autocapture/track-click.d.ts.map +1 -1
  94. package/lib/scripts/autocapture/track-exposure.d.ts +11 -0
  95. package/lib/scripts/autocapture/track-exposure.d.ts.map +1 -0
  96. package/lib/scripts/autocapture/track-scroll.d.ts +15 -0
  97. package/lib/scripts/autocapture/track-scroll.d.ts.map +1 -0
  98. package/lib/scripts/autocapture/track-viewport-content-updated.d.ts +25 -0
  99. package/lib/scripts/autocapture/track-viewport-content-updated.d.ts.map +1 -0
  100. package/lib/scripts/autocapture-plugin.d.ts +5 -1
  101. package/lib/scripts/autocapture-plugin.d.ts.map +1 -1
  102. package/lib/scripts/constants.d.ts +7 -0
  103. package/lib/scripts/constants.d.ts.map +1 -1
  104. package/lib/scripts/data-extractor.d.ts +1 -0
  105. package/lib/scripts/data-extractor.d.ts.map +1 -1
  106. package/lib/scripts/helpers.d.ts +1 -0
  107. package/lib/scripts/helpers.d.ts.map +1 -1
  108. package/lib/scripts/libs/element-path.d.ts +2 -0
  109. package/lib/scripts/libs/element-path.d.ts.map +1 -0
  110. package/lib/scripts/observables.d.ts +3 -0
  111. package/lib/scripts/observables.d.ts.map +1 -1
  112. package/lib/scripts/version.d.ts +1 -1
  113. package/lib/scripts/version.d.ts.map +1 -1
  114. package/package.json +2 -2
  115. package/lib/cjs/libs/finder.d.ts +0 -13
  116. package/lib/cjs/libs/finder.d.ts.map +0 -1
  117. package/lib/cjs/libs/finder.js +0 -348
  118. package/lib/cjs/libs/finder.js.map +0 -1
  119. package/lib/esm/libs/finder.d.ts +0 -13
  120. package/lib/esm/libs/finder.d.ts.map +0 -1
  121. package/lib/esm/libs/finder.js +0 -344
  122. package/lib/esm/libs/finder.js.map +0 -1
  123. package/lib/scripts/libs/finder.d.ts +0 -13
  124. package/lib/scripts/libs/finder.d.ts.map +0 -1
@@ -4,6 +4,7 @@ export declare const AMPLITUDE_ELEMENT_CLICKED_EVENT = "[Amplitude] Element Clic
4
4
  export declare const AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = "[Amplitude] Dead Click";
5
5
  export declare const AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = "[Amplitude] Rage Click";
6
6
  export declare const AMPLITUDE_ELEMENT_CHANGED_EVENT = "[Amplitude] Element Changed";
7
+ export declare const AMPLITUDE_PAGE_SCROLLED_EVENT = "[Amplitude] Page Scrolled";
7
8
  export declare const AMPLITUDE_EVENT_PROP_ELEMENT_ID = "[Amplitude] Element ID";
8
9
  export declare const AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = "[Amplitude] Element Class";
9
10
  export declare const AMPLITUDE_EVENT_PROP_ELEMENT_TAG = "[Amplitude] Element Tag";
@@ -14,11 +15,15 @@ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = "[Amplitude] E
14
15
  export declare const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = "[Amplitude] Element Position Top";
15
16
  export declare const AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = "[Amplitude] Element Aria Label";
16
17
  export declare const AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = "[Amplitude] Element Attributes";
18
+ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_PATH = "[Amplitude] Element Path";
17
19
  export declare const AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = "[Amplitude] Element Parent Label";
18
20
  export declare const AMPLITUDE_EVENT_PROP_PAGE_URL = "[Amplitude] Page URL";
19
21
  export declare const AMPLITUDE_EVENT_PROP_PAGE_TITLE = "[Amplitude] Page Title";
20
22
  export declare const AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = "[Amplitude] Viewport Height";
21
23
  export declare const AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = "[Amplitude] Viewport Width";
24
+ export declare const AMPLITUDE_EVENT_PROP_MAX_PAGE_X = "[Amplitude] Max Page X";
25
+ export declare const AMPLITUDE_EVENT_PROP_MAX_PAGE_Y = "[Amplitude] Max Page Y";
26
+ export declare const AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID = "[Amplitude] Page View ID";
22
27
  export declare const AMPLITUDE_ORIGIN = "https://app.amplitude.com";
23
28
  export declare const AMPLITUDE_ORIGIN_EU = "https://app.eu.amplitude.com";
24
29
  export declare const AMPLITUDE_ORIGIN_STAGING = "https://apps.stag2.amplitude.com";
@@ -31,4 +36,6 @@ export declare const AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL = "https://cdn
31
36
  export declare const AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = "amp-visual-tagging-selector-highlight";
32
37
  export declare const DATA_AMP_MASK_ATTRIBUTES = "data-amp-mask-attributes";
33
38
  export declare const MAX_MASK_TEXT_PATTERNS = 25;
39
+ export declare const PAGE_VIEW_SESSION_STORAGE_KEY = "AMP_PAGE_VIEW";
40
+ export declare const MAX_ELEMENT_EXPOSED_STR_LENGTH = 18000;
34
41
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
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;AAGhG,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAEnE,eAAO,MAAM,sBAAsB,KAAK,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;AAC7E,eAAO,MAAM,6BAA6B,8BAA8B,CAAC;AAEzE,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;AACxF,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAE5E,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;AAChF,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AAExE,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAG5E,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;AAGhG,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAEnE,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAGzC,eAAO,MAAM,6BAA6B,kBAAkB,CAAC;AAE7D,eAAO,MAAM,8BAA8B,QAAS,CAAC"}
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MAX_MASK_TEXT_PATTERNS = exports.DATA_AMP_MASK_ATTRIBUTES = exports.AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = exports.AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL = exports.AMPLITUDE_ORIGINS_MAP = exports.AMPLITUDE_ORIGIN_STAGING = exports.AMPLITUDE_ORIGIN_EU = exports.AMPLITUDE_ORIGIN = exports.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = exports.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = exports.AMPLITUDE_EVENT_PROP_PAGE_TITLE = exports.AMPLITUDE_EVENT_PROP_PAGE_URL = exports.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = exports.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = exports.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = exports.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = exports.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = exports.AMPLITUDE_EVENT_PROP_ELEMENT_HREF = exports.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY = exports.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT = exports.AMPLITUDE_EVENT_PROP_ELEMENT_TAG = exports.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = exports.AMPLITUDE_EVENT_PROP_ELEMENT_ID = exports.AMPLITUDE_ELEMENT_CHANGED_EVENT = exports.AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = exports.AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = exports.AMPLITUDE_ELEMENT_CLICKED_EVENT = exports.FRUSTRATION_PLUGIN_NAME = exports.PLUGIN_NAME = void 0;
3
+ exports.MAX_ELEMENT_EXPOSED_STR_LENGTH = exports.PAGE_VIEW_SESSION_STORAGE_KEY = exports.MAX_MASK_TEXT_PATTERNS = exports.DATA_AMP_MASK_ATTRIBUTES = exports.AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = exports.AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL = exports.AMPLITUDE_ORIGINS_MAP = exports.AMPLITUDE_ORIGIN_STAGING = exports.AMPLITUDE_ORIGIN_EU = exports.AMPLITUDE_ORIGIN = exports.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID = exports.AMPLITUDE_EVENT_PROP_MAX_PAGE_Y = exports.AMPLITUDE_EVENT_PROP_MAX_PAGE_X = exports.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = exports.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = exports.AMPLITUDE_EVENT_PROP_PAGE_TITLE = exports.AMPLITUDE_EVENT_PROP_PAGE_URL = exports.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = exports.AMPLITUDE_EVENT_PROP_ELEMENT_PATH = exports.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = exports.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = exports.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = exports.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = exports.AMPLITUDE_EVENT_PROP_ELEMENT_HREF = exports.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY = exports.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT = exports.AMPLITUDE_EVENT_PROP_ELEMENT_TAG = exports.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = exports.AMPLITUDE_EVENT_PROP_ELEMENT_ID = exports.AMPLITUDE_PAGE_SCROLLED_EVENT = exports.AMPLITUDE_ELEMENT_CHANGED_EVENT = exports.AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = exports.AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = exports.AMPLITUDE_ELEMENT_CLICKED_EVENT = exports.FRUSTRATION_PLUGIN_NAME = exports.PLUGIN_NAME = void 0;
4
4
  exports.PLUGIN_NAME = '@amplitude/plugin-autocapture-browser';
5
5
  exports.FRUSTRATION_PLUGIN_NAME = '@amplitude/plugin-frustration-browser';
6
6
  exports.AMPLITUDE_ELEMENT_CLICKED_EVENT = '[Amplitude] Element Clicked';
7
7
  exports.AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = '[Amplitude] Dead Click';
8
8
  exports.AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = '[Amplitude] Rage Click';
9
9
  exports.AMPLITUDE_ELEMENT_CHANGED_EVENT = '[Amplitude] Element Changed';
10
+ exports.AMPLITUDE_PAGE_SCROLLED_EVENT = '[Amplitude] Page Scrolled';
10
11
  exports.AMPLITUDE_EVENT_PROP_ELEMENT_ID = '[Amplitude] Element ID';
11
12
  exports.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = '[Amplitude] Element Class';
12
13
  exports.AMPLITUDE_EVENT_PROP_ELEMENT_TAG = '[Amplitude] Element Tag';
@@ -17,11 +18,15 @@ exports.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = '[Amplitude] Element Positi
17
18
  exports.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = '[Amplitude] Element Position Top';
18
19
  exports.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = '[Amplitude] Element Aria Label';
19
20
  exports.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = '[Amplitude] Element Attributes';
21
+ exports.AMPLITUDE_EVENT_PROP_ELEMENT_PATH = '[Amplitude] Element Path';
20
22
  exports.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = '[Amplitude] Element Parent Label';
21
23
  exports.AMPLITUDE_EVENT_PROP_PAGE_URL = '[Amplitude] Page URL';
22
24
  exports.AMPLITUDE_EVENT_PROP_PAGE_TITLE = '[Amplitude] Page Title';
23
25
  exports.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = '[Amplitude] Viewport Height';
24
26
  exports.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = '[Amplitude] Viewport Width';
27
+ exports.AMPLITUDE_EVENT_PROP_MAX_PAGE_X = '[Amplitude] Max Page X';
28
+ exports.AMPLITUDE_EVENT_PROP_MAX_PAGE_Y = '[Amplitude] Max Page Y';
29
+ exports.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID = '[Amplitude] Page View ID';
25
30
  // Visual Tagging related constants
26
31
  exports.AMPLITUDE_ORIGIN = 'https://app.amplitude.com';
27
32
  exports.AMPLITUDE_ORIGIN_EU = 'https://app.eu.amplitude.com';
@@ -38,4 +43,7 @@ exports.AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = 'amp-visual-tagging-selector-
38
43
  // Data attribute for specifying which attributes should be redacted from autocapture
39
44
  exports.DATA_AMP_MASK_ATTRIBUTES = 'data-amp-mask-attributes';
40
45
  exports.MAX_MASK_TEXT_PATTERNS = 25;
46
+ // The key for the page view object in sessionStorage
47
+ exports.PAGE_VIEW_SESSION_STORAGE_KEY = 'AMP_PAGE_VIEW';
48
+ exports.MAX_ELEMENT_EXPOSED_STR_LENGTH = 18000;
41
49
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG,uCAAuC,CAAC;AACtD,QAAA,uBAAuB,GAAG,uCAAuC,CAAC;AAElE,QAAA,+BAA+B,GAAG,6BAA6B,CAAC;AAChE,QAAA,oCAAoC,GAAG,wBAAwB,CAAC;AAChE,QAAA,oCAAoC,GAAG,wBAAwB,CAAC;AAChE,QAAA,+BAA+B,GAAG,6BAA6B,CAAC;AAEhE,QAAA,+BAA+B,GAAG,wBAAwB,CAAC;AAC3D,QAAA,kCAAkC,GAAG,2BAA2B,CAAC;AACjE,QAAA,gCAAgC,GAAG,yBAAyB,CAAC;AAC7D,QAAA,iCAAiC,GAAG,0BAA0B,CAAC;AAC/D,QAAA,sCAAsC,GAAG,+BAA+B,CAAC;AACzE,QAAA,iCAAiC,GAAG,0BAA0B,CAAC;AAC/D,QAAA,0CAA0C,GAAG,mCAAmC,CAAC;AACjF,QAAA,yCAAyC,GAAG,kCAAkC,CAAC;AAC/E,QAAA,uCAAuC,GAAG,gCAAgC,CAAC;AAC3E,QAAA,uCAAuC,GAAG,gCAAgC,CAAC;AAE3E,QAAA,yCAAyC,GAAG,kCAAkC,CAAC;AAC/E,QAAA,6BAA6B,GAAG,sBAAsB,CAAC;AACvD,QAAA,+BAA+B,GAAG,wBAAwB,CAAC;AAC3D,QAAA,oCAAoC,GAAG,6BAA6B,CAAC;AACrE,QAAA,mCAAmC,GAAG,4BAA4B,CAAC;AAEhF,mCAAmC;AACtB,QAAA,gBAAgB,GAAG,2BAA2B,CAAC;AAC/C,QAAA,mBAAmB,GAAG,8BAA8B,CAAC;AACrD,QAAA,wBAAwB,GAAG,kCAAkC,CAAC;AAC9D,QAAA,qBAAqB,GAAG;IACnC,EAAE,EAAE,wBAAgB;IACpB,EAAE,EAAE,2BAAmB;IACvB,OAAO,EAAE,gCAAwB;CAClC,CAAC;AAEW,QAAA,4CAA4C,GACvD,0EAA0E,CAAC;AAC7E,gGAAgG;AAChG,6CAA6C;AAChC,QAAA,wCAAwC,GAAG,uCAAuC,CAAC;AAEhG,qFAAqF;AACxE,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AAEtD,QAAA,sBAAsB,GAAG,EAAE,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\n// Data attribute for specifying which attributes should be redacted from autocapture\nexport const DATA_AMP_MASK_ATTRIBUTES = 'data-amp-mask-attributes';\n\nexport const MAX_MASK_TEXT_PATTERNS = 25;\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG,uCAAuC,CAAC;AACtD,QAAA,uBAAuB,GAAG,uCAAuC,CAAC;AAElE,QAAA,+BAA+B,GAAG,6BAA6B,CAAC;AAChE,QAAA,oCAAoC,GAAG,wBAAwB,CAAC;AAChE,QAAA,oCAAoC,GAAG,wBAAwB,CAAC;AAChE,QAAA,+BAA+B,GAAG,6BAA6B,CAAC;AAChE,QAAA,6BAA6B,GAAG,2BAA2B,CAAC;AAE5D,QAAA,+BAA+B,GAAG,wBAAwB,CAAC;AAC3D,QAAA,kCAAkC,GAAG,2BAA2B,CAAC;AACjE,QAAA,gCAAgC,GAAG,yBAAyB,CAAC;AAC7D,QAAA,iCAAiC,GAAG,0BAA0B,CAAC;AAC/D,QAAA,sCAAsC,GAAG,+BAA+B,CAAC;AACzE,QAAA,iCAAiC,GAAG,0BAA0B,CAAC;AAC/D,QAAA,0CAA0C,GAAG,mCAAmC,CAAC;AACjF,QAAA,yCAAyC,GAAG,kCAAkC,CAAC;AAC/E,QAAA,uCAAuC,GAAG,gCAAgC,CAAC;AAC3E,QAAA,uCAAuC,GAAG,gCAAgC,CAAC;AAC3E,QAAA,iCAAiC,GAAG,0BAA0B,CAAC;AAE/D,QAAA,yCAAyC,GAAG,kCAAkC,CAAC;AAC/E,QAAA,6BAA6B,GAAG,sBAAsB,CAAC;AACvD,QAAA,+BAA+B,GAAG,wBAAwB,CAAC;AAC3D,QAAA,oCAAoC,GAAG,6BAA6B,CAAC;AACrE,QAAA,mCAAmC,GAAG,4BAA4B,CAAC;AACnE,QAAA,+BAA+B,GAAG,wBAAwB,CAAC;AAC3D,QAAA,+BAA+B,GAAG,wBAAwB,CAAC;AAE3D,QAAA,iCAAiC,GAAG,0BAA0B,CAAC;AAE5E,mCAAmC;AACtB,QAAA,gBAAgB,GAAG,2BAA2B,CAAC;AAC/C,QAAA,mBAAmB,GAAG,8BAA8B,CAAC;AACrD,QAAA,wBAAwB,GAAG,kCAAkC,CAAC;AAC9D,QAAA,qBAAqB,GAAG;IACnC,EAAE,EAAE,wBAAgB;IACpB,EAAE,EAAE,2BAAmB;IACvB,OAAO,EAAE,gCAAwB;CAClC,CAAC;AAEW,QAAA,4CAA4C,GACvD,0EAA0E,CAAC;AAC7E,gGAAgG;AAChG,6CAA6C;AAChC,QAAA,wCAAwC,GAAG,uCAAuC,CAAC;AAEhG,qFAAqF;AACxE,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AAEtD,QAAA,sBAAsB,GAAG,EAAE,CAAC;AAEzC,qDAAqD;AACxC,QAAA,6BAA6B,GAAG,eAAe,CAAC;AAEhD,QAAA,8BAA8B,GAAG,KAAM,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';\nexport const AMPLITUDE_PAGE_SCROLLED_EVENT = '[Amplitude] Page Scrolled';\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';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_PATH = '[Amplitude] Element Path';\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';\nexport const AMPLITUDE_EVENT_PROP_MAX_PAGE_X = '[Amplitude] Max Page X';\nexport const AMPLITUDE_EVENT_PROP_MAX_PAGE_Y = '[Amplitude] Max Page Y';\n\nexport const AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID = '[Amplitude] Page View ID';\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\n// Data attribute for specifying which attributes should be redacted from autocapture\nexport const DATA_AMP_MASK_ATTRIBUTES = 'data-amp-mask-attributes';\n\nexport const MAX_MASK_TEXT_PATTERNS = 25;\n\n// The key for the page view object in sessionStorage\nexport const PAGE_VIEW_SESSION_STORAGE_KEY = 'AMP_PAGE_VIEW';\n\nexport const MAX_ELEMENT_EXPOSED_STR_LENGTH = 18_000;\n"]}
@@ -16,6 +16,7 @@ export declare class DataExtractor {
16
16
  replaceSensitiveString: (text: string | null) => string;
17
17
  getHierarchy: (element: Element | null) => Hierarchy;
18
18
  getNearestLabel: (element: Element) => string;
19
+ getElementPath: (element: Element | null) => string;
19
20
  getEventProperties: (actionType: ActionType, element: Element, dataAttributePrefix: string) => {
20
21
  [key: string]: unknown;
21
22
  };
@@ -1 +1 @@
1
- {"version":3,"file":"data-extractor.d.ts","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,EAC1B,UAAU,EAEV,kBAAkB,EAKnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8DAA8D,CAAC;AAU/F,OAAO,KAAK,EAAwB,4BAA4B,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGjH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAW;IACtD,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;gBAE3B,OAAO,EAAE,0BAA0B,EAAE,OAAO,CAAC,EAAE;QAAE,iBAAiB,EAAE,kBAAkB,CAAA;KAAE;IAuBpG;;;;OAIG;IACH,sBAAsB,SAAU,MAAM,GAAG,IAAI,KAAG,MAAM,CAEpD;IAGF,YAAY,YAAa,OAAO,GAAG,IAAI,eA4CrC;IAEF,eAAe,YAAa,OAAO,KAAG,MAAM,CAiB1C;IAGF,kBAAkB,eAAgB,UAAU,WAAW,OAAO,uBAAuB,MAAM;;MA0CzF;IAEF,4BAA4B,0GAGP,MAAM,EAAE,uBACN,MAAM,6DAuC3B;IAEF,yBAAyB,eAAgB,UAAU,kBAAkB,WAAW,+BAkB9E;IAEF,OAAO,YAAa,OAAO,KAAG,MAAM,CAkBlC;IAGF,gBAAgB,YAAa,OAAO,KAAG,OAAO,MAAM,EAAE,SAAS,CAAC,CAa9D;CACH"}
1
+ {"version":3,"file":"data-extractor.d.ts","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,EAC1B,UAAU,EAEV,kBAAkB,EAKnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8DAA8D,CAAC;AAW/F,OAAO,KAAK,EAAwB,4BAA4B,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGjH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAW;IACtD,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;gBAE3B,OAAO,EAAE,0BAA0B,EAAE,OAAO,CAAC,EAAE;QAAE,iBAAiB,EAAE,kBAAkB,CAAA;KAAE;IAuBpG;;;;OAIG;IACH,sBAAsB,SAAU,MAAM,GAAG,IAAI,KAAG,MAAM,CAEpD;IAGF,YAAY,YAAa,OAAO,GAAG,IAAI,eA4CrC;IAEF,eAAe,YAAa,OAAO,KAAG,MAAM,CAiB1C;IAEF,cAAc,YAAa,OAAO,GAAG,IAAI,KAAG,MAAM,CAYhD;IAGF,kBAAkB,eAAgB,UAAU,WAAW,OAAO,uBAAuB,MAAM;;MAgDzF;IAEF,4BAA4B,0GAGP,MAAM,EAAE,uBACN,MAAM,6DAuC3B;IAEF,yBAAyB,eAAgB,UAAU,kBAAkB,WAAW,+BAkB9E;IAEF,OAAO,YAAa,OAAO,KAAG,MAAM,CAkBlC;IAGF,gBAAgB,YAAa,OAAO,KAAG,OAAO,MAAM,EAAE,SAAS,CAAC,CAa9D;CACH"}
@@ -8,6 +8,7 @@ var constants = tslib_1.__importStar(require("./constants"));
8
8
  var helpers_1 = require("./helpers");
9
9
  var hierarchy_1 = require("./hierarchy");
10
10
  var actions_1 = require("./pageActions/actions");
11
+ var element_path_1 = require("./libs/element-path");
11
12
  var DataExtractor = /** @class */ (function () {
12
13
  function DataExtractor(options, context) {
13
14
  var e_1, _a;
@@ -91,6 +92,17 @@ var DataExtractor = /** @class */ (function () {
91
92
  }
92
93
  return _this.getNearestLabel(parent);
93
94
  };
95
+ this.getElementPath = function (element) {
96
+ var _a;
97
+ if (!element) {
98
+ return '';
99
+ }
100
+ var startTime = performance.now();
101
+ var elementPath = (0, element_path_1.cssPath)(element);
102
+ var endTime = performance.now();
103
+ (_a = _this.diagnosticsClient) === null || _a === void 0 ? void 0 : _a.recordHistogram('autocapturePlugin.getElementPath', endTime - startTime);
104
+ return elementPath;
105
+ };
94
106
  // Returns the Amplitude event properties for the given element.
95
107
  this.getEventProperties = function (actionType, element, dataAttributePrefix) {
96
108
  var _a;
@@ -111,12 +123,17 @@ var DataExtractor = /** @class */ (function () {
111
123
  _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT] = rect.left == null ? null : Math.round(rect.left),
112
124
  _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP] = rect.top == null ? null : Math.round(rect.top),
113
125
  _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES] = attributes,
126
+ _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_PATH] = _this.getElementPath(element),
114
127
  _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL] = nearestLabel,
115
128
  _a[constants.AMPLITUDE_EVENT_PROP_PAGE_URL] = (0, analytics_core_1.getDecodeURI)(window.location.href.split('?')[0]),
116
129
  _a[constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE] = analytics_core_1.getPageTitle(_this.replaceSensitiveString),
117
130
  _a[constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT] = window.innerHeight,
118
131
  _a[constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH] = window.innerWidth,
119
132
  _a);
133
+ var pageViewId = (0, helpers_1.getCurrentPageViewId)();
134
+ if (pageViewId) {
135
+ properties[constants.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID] = pageViewId;
136
+ }
120
137
  // id is never masked, so always include it
121
138
  properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '';
122
139
  // class is never masked, so always include it
@@ -1 +1 @@
1
- {"version":3,"file":"data-extractor.js","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n ElementInteractionsOptions,\n ActionType,\n getDecodeURI,\n IDiagnosticsClient,\n MASKED_TEXT_VALUE,\n TEXT_MASK_ATTRIBUTE,\n getPageTitle,\n replaceSensitiveString,\n} from '@amplitude/analytics-core';\nimport type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport * as constants from './constants';\nimport {\n removeEmptyProperties,\n extractPrefixedAttributes,\n isElementPointerCursor,\n getClosestElement,\n isElementBasedEvent,\n parseAttributesToMask,\n} from './helpers';\nimport type { BaseTimestampedEvent, ElementBasedTimestampedEvent, TimestampedEvent, JSONValue } from './helpers';\nimport { getAncestors, getElementProperties } from './hierarchy';\nimport { getDataSource } from './pageActions/actions';\nimport { Hierarchy } from './typings/autocapture';\n\nexport class DataExtractor {\n private readonly additionalMaskTextPatterns: RegExp[];\n diagnosticsClient?: IDiagnosticsClient;\n\n constructor(options: ElementInteractionsOptions, context?: { diagnosticsClient: IDiagnosticsClient }) {\n this.diagnosticsClient = context?.diagnosticsClient;\n\n const rawPatterns = options.maskTextRegex ?? [];\n\n const compiled: RegExp[] = [];\n for (const entry of rawPatterns) {\n if (compiled.length >= constants.MAX_MASK_TEXT_PATTERNS) {\n break;\n }\n if (entry instanceof RegExp) {\n compiled.push(entry);\n } else if ('pattern' in entry && typeof entry.pattern === 'string') {\n try {\n compiled.push(new RegExp(entry.pattern, 'i'));\n } catch {\n // ignore invalid pattern strings\n }\n }\n }\n this.additionalMaskTextPatterns = compiled;\n }\n\n /**\n * Wrapper method to replace sensitive strings using the helper function\n * @param text - The text to search for sensitive data\n * @returns The text with sensitive data replaced by masked text\n */\n replaceSensitiveString = (text: string | null): string => {\n return replaceSensitiveString(text, this.additionalMaskTextPatterns);\n };\n\n // Get the DOM hierarchy of the element, starting from the target element to the root element.\n getHierarchy = (element: Element | null): Hierarchy => {\n const startTime = performance.now();\n\n let hierarchy: Hierarchy = [];\n if (!element) {\n return [];\n }\n\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n const ancestors = getAncestors(element);\n\n // Build attributes to mask map\n const elementToAttributesToMaskMap = new Map<Element, Set<string>>();\n\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const node = ancestors[i];\n if (node) {\n const attributesToMask = parseAttributesToMask(node.getAttribute(constants.DATA_AMP_MASK_ATTRIBUTES));\n const ancestorAttributesToMask =\n i === ancestors.length - 1 ? [] : elementToAttributesToMaskMap.get(ancestors[i + 1]) ?? new Set<string>();\n const combinedAttributesToMask = new Set([...ancestorAttributesToMask, ...attributesToMask]);\n elementToAttributesToMaskMap.set(node, combinedAttributesToMask);\n }\n }\n\n hierarchy = ancestors.map((el) =>\n getElementProperties(el, elementToAttributesToMaskMap.get(el) ?? new Set<string>()),\n );\n\n // Search for and mask any sensitive attribute values\n for (const hierarchyNode of hierarchy) {\n if (hierarchyNode?.attrs) {\n Object.entries(hierarchyNode.attrs).forEach(([key, value]) => {\n if (hierarchyNode.attrs) {\n hierarchyNode.attrs[key] = this.replaceSensitiveString(value);\n }\n });\n }\n }\n\n const endTime = performance.now();\n this.diagnosticsClient?.recordHistogram('autocapturePlugin.getHierarchy', endTime - startTime);\n\n return hierarchy;\n };\n\n getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement: Element | null;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n return this.getText(labelElement);\n }\n return this.getNearestLabel(parent);\n };\n\n // Returns the Amplitude event properties for the given element.\n 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\n const hierarchy = this.getHierarchy(element);\n const currentElementAttributes = hierarchy[0]?.attrs;\n const nearestLabel = this.getNearestLabel(element);\n const attributes = extractPrefixedAttributes(currentElementAttributes ?? {}, dataAttributePrefix);\n\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: hierarchy,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.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_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: getDecodeURI(window.location.href.split('?')[0]),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]: (\n getPageTitle as (parseTitleFunction: (title: string) => string) => string\n )(this.replaceSensitiveString),\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n\n // id is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '';\n\n // class is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.getAttribute('class');\n\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = currentElementAttributes?.['aria-label'];\n\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = this.replaceSensitiveString(element.href); // we don't use hierarchy here because we don't want href value to be changed\n }\n\n return removeEmptyProperties(properties);\n };\n\n addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\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 = this.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 = this.getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n };\n\n extractDataFromDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Extract from DOM Element\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n const sourceElement = getDataSource(dataSource, contextElement);\n if (!sourceElement) {\n return undefined;\n }\n\n if (dataSource.elementExtractType === 'TEXT') {\n return this.getText(sourceElement);\n } else if (dataSource.elementExtractType === 'ATTRIBUTE' && dataSource.attribute) {\n return sourceElement.getAttribute(dataSource.attribute);\n }\n return undefined;\n }\n\n // TODO: Extract from other source types\n return undefined;\n };\n\n getText = (element: Element): string => {\n // Check if element or any parent has data-amp-mask attribute\n const hasMaskAttribute = element.closest(`[${TEXT_MASK_ATTRIBUTE}]`) !== null;\n if (hasMaskAttribute) {\n return MASKED_TEXT_VALUE;\n }\n let output = '';\n if (!element.querySelector(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`)) {\n output = (element as HTMLElement).innerText || '';\n } else {\n const clonedTree = element.cloneNode(true) as HTMLElement;\n // replace all elements with TEXT_MASK_ATTRIBUTE attribute and contenteditable with the text MASKED_TEXT_VALUE\n clonedTree.querySelectorAll(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`).forEach((node) => {\n (node as HTMLElement).innerText = MASKED_TEXT_VALUE;\n });\n output = clonedTree.innerText || '';\n }\n return this.replaceSensitiveString(output.substring(0, 255)).replace(/\\s+/g, ' ').trim();\n };\n\n // Returns the element properties for the given element in Visual Labeling.\n getEventTagProps = (element: Element): Record<string, JSONValue> => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties) as Record<string, JSONValue>;\n };\n}\n"]}
1
+ {"version":3,"file":"data-extractor.js","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n ElementInteractionsOptions,\n ActionType,\n getDecodeURI,\n IDiagnosticsClient,\n MASKED_TEXT_VALUE,\n TEXT_MASK_ATTRIBUTE,\n getPageTitle,\n replaceSensitiveString,\n} from '@amplitude/analytics-core';\nimport type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport * as constants from './constants';\nimport {\n removeEmptyProperties,\n extractPrefixedAttributes,\n isElementPointerCursor,\n getClosestElement,\n isElementBasedEvent,\n parseAttributesToMask,\n getCurrentPageViewId,\n} from './helpers';\nimport type { BaseTimestampedEvent, ElementBasedTimestampedEvent, TimestampedEvent, JSONValue } from './helpers';\nimport { getAncestors, getElementProperties } from './hierarchy';\nimport { getDataSource } from './pageActions/actions';\nimport { Hierarchy } from './typings/autocapture';\nimport { cssPath } from './libs/element-path';\n\nexport class DataExtractor {\n private readonly additionalMaskTextPatterns: RegExp[];\n diagnosticsClient?: IDiagnosticsClient;\n\n constructor(options: ElementInteractionsOptions, context?: { diagnosticsClient: IDiagnosticsClient }) {\n this.diagnosticsClient = context?.diagnosticsClient;\n\n const rawPatterns = options.maskTextRegex ?? [];\n\n const compiled: RegExp[] = [];\n for (const entry of rawPatterns) {\n if (compiled.length >= constants.MAX_MASK_TEXT_PATTERNS) {\n break;\n }\n if (entry instanceof RegExp) {\n compiled.push(entry);\n } else if ('pattern' in entry && typeof entry.pattern === 'string') {\n try {\n compiled.push(new RegExp(entry.pattern, 'i'));\n } catch {\n // ignore invalid pattern strings\n }\n }\n }\n this.additionalMaskTextPatterns = compiled;\n }\n\n /**\n * Wrapper method to replace sensitive strings using the helper function\n * @param text - The text to search for sensitive data\n * @returns The text with sensitive data replaced by masked text\n */\n replaceSensitiveString = (text: string | null): string => {\n return replaceSensitiveString(text, this.additionalMaskTextPatterns);\n };\n\n // Get the DOM hierarchy of the element, starting from the target element to the root element.\n getHierarchy = (element: Element | null): Hierarchy => {\n const startTime = performance.now();\n\n let hierarchy: Hierarchy = [];\n if (!element) {\n return [];\n }\n\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n const ancestors = getAncestors(element);\n\n // Build attributes to mask map\n const elementToAttributesToMaskMap = new Map<Element, Set<string>>();\n\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const node = ancestors[i];\n if (node) {\n const attributesToMask = parseAttributesToMask(node.getAttribute(constants.DATA_AMP_MASK_ATTRIBUTES));\n const ancestorAttributesToMask =\n i === ancestors.length - 1 ? [] : elementToAttributesToMaskMap.get(ancestors[i + 1]) ?? new Set<string>();\n const combinedAttributesToMask = new Set([...ancestorAttributesToMask, ...attributesToMask]);\n elementToAttributesToMaskMap.set(node, combinedAttributesToMask);\n }\n }\n\n hierarchy = ancestors.map((el) =>\n getElementProperties(el, elementToAttributesToMaskMap.get(el) ?? new Set<string>()),\n );\n\n // Search for and mask any sensitive attribute values\n for (const hierarchyNode of hierarchy) {\n if (hierarchyNode?.attrs) {\n Object.entries(hierarchyNode.attrs).forEach(([key, value]) => {\n if (hierarchyNode.attrs) {\n hierarchyNode.attrs[key] = this.replaceSensitiveString(value);\n }\n });\n }\n }\n\n const endTime = performance.now();\n this.diagnosticsClient?.recordHistogram('autocapturePlugin.getHierarchy', endTime - startTime);\n\n return hierarchy;\n };\n\n getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement: Element | null;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n return this.getText(labelElement);\n }\n return this.getNearestLabel(parent);\n };\n\n getElementPath = (element: Element | null): string => {\n if (!element) {\n return '';\n }\n const startTime = performance.now();\n\n const elementPath = cssPath(element);\n\n const endTime = performance.now();\n this.diagnosticsClient?.recordHistogram('autocapturePlugin.getElementPath', endTime - startTime);\n\n return elementPath;\n };\n\n // Returns the Amplitude event properties for the given element.\n 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\n const hierarchy = this.getHierarchy(element);\n const currentElementAttributes = hierarchy[0]?.attrs;\n const nearestLabel = this.getNearestLabel(element);\n const attributes = extractPrefixedAttributes(currentElementAttributes ?? {}, dataAttributePrefix);\n\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: hierarchy,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.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_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PATH]: this.getElementPath(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: getDecodeURI(window.location.href.split('?')[0]),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]: (\n getPageTitle as (parseTitleFunction: (title: string) => string) => string\n )(this.replaceSensitiveString),\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n\n const pageViewId = getCurrentPageViewId();\n if (pageViewId) {\n properties[constants.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID] = pageViewId;\n }\n\n // id is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '';\n\n // class is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.getAttribute('class');\n\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = currentElementAttributes?.['aria-label'];\n\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = this.replaceSensitiveString(element.href); // we don't use hierarchy here because we don't want href value to be changed\n }\n\n return removeEmptyProperties(properties);\n };\n\n addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\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 = this.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 = this.getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n };\n\n extractDataFromDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Extract from DOM Element\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n const sourceElement = getDataSource(dataSource, contextElement);\n if (!sourceElement) {\n return undefined;\n }\n\n if (dataSource.elementExtractType === 'TEXT') {\n return this.getText(sourceElement);\n } else if (dataSource.elementExtractType === 'ATTRIBUTE' && dataSource.attribute) {\n return sourceElement.getAttribute(dataSource.attribute);\n }\n return undefined;\n }\n\n // TODO: Extract from other source types\n return undefined;\n };\n\n getText = (element: Element): string => {\n // Check if element or any parent has data-amp-mask attribute\n const hasMaskAttribute = element.closest(`[${TEXT_MASK_ATTRIBUTE}]`) !== null;\n if (hasMaskAttribute) {\n return MASKED_TEXT_VALUE;\n }\n let output = '';\n if (!element.querySelector(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`)) {\n output = (element as HTMLElement).innerText || '';\n } else {\n const clonedTree = element.cloneNode(true) as HTMLElement;\n // replace all elements with TEXT_MASK_ATTRIBUTE attribute and contenteditable with the text MASKED_TEXT_VALUE\n clonedTree.querySelectorAll(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`).forEach((node) => {\n (node as HTMLElement).innerText = MASKED_TEXT_VALUE;\n });\n output = clonedTree.innerText || '';\n }\n return this.replaceSensitiveString(output.substring(0, 255)).replace(/\\s+/g, ' ').trim();\n };\n\n // Returns the element properties for the given element in Visual Labeling.\n getEventTagProps = (element: Element): Record<string, JSONValue> => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties) as Record<string, JSONValue>;\n };\n}\n"]}
@@ -30,6 +30,7 @@ export declare const removeEmptyProperties: (properties: {
30
30
  }) => {
31
31
  [key: string]: unknown;
32
32
  };
33
+ export declare const getCurrentPageViewId: () => string | undefined;
33
34
  export declare const querySelectUniqueElements: (root: Element | Document, selectors: string[]) => Element[];
34
35
  export declare const getClosestElement: (element: Element | null, selectors: string[]) => Element | null;
35
36
  export declare const asyncLoadScript: (url: string) => Promise<unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isElementBasedEvent = exports.filterOutNonTrackableEvents = exports.generateUniqueId = exports.asyncLoadScript = exports.getClosestElement = exports.querySelectUniqueElements = exports.removeEmptyProperties = exports.isEmpty = exports.extractPrefixedAttributes = exports.parseAttributesToMask = exports.isNonSensitiveElement = exports.isTextNode = exports.createShouldTrackEvent = exports.isElementPointerCursor = void 0;
3
+ exports.isElementBasedEvent = exports.filterOutNonTrackableEvents = exports.generateUniqueId = exports.asyncLoadScript = exports.getClosestElement = exports.querySelectUniqueElements = exports.getCurrentPageViewId = exports.removeEmptyProperties = exports.isEmpty = exports.extractPrefixedAttributes = exports.parseAttributesToMask = exports.isNonSensitiveElement = exports.isTextNode = exports.createShouldTrackEvent = exports.isElementPointerCursor = 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");
7
+ var constants = tslib_1.__importStar(require("./constants"));
7
8
  var SENSITIVE_TAGS = ['input', 'select', 'textarea'];
8
9
  var isElementPointerCursor = function (element, actionType) {
9
10
  var _a;
@@ -138,6 +139,26 @@ var removeEmptyProperties = function (properties) {
138
139
  }, {});
139
140
  };
140
141
  exports.removeEmptyProperties = removeEmptyProperties;
142
+ var getCurrentPageViewId = function () {
143
+ var _a;
144
+ try {
145
+ var globalScope = (0, analytics_core_1.getGlobalScope)();
146
+ /* istanbul ignore next */
147
+ var raw = (_a = globalScope === null || globalScope === void 0 ? void 0 : globalScope.sessionStorage) === null || _a === void 0 ? void 0 : _a.getItem(constants.PAGE_VIEW_SESSION_STORAGE_KEY);
148
+ if (!raw) {
149
+ return undefined;
150
+ }
151
+ var parsed = JSON.parse(raw);
152
+ if (typeof parsed.pageViewId === 'string') {
153
+ return parsed.pageViewId;
154
+ }
155
+ }
156
+ catch (_b) {
157
+ // ignore storage access or JSON errors
158
+ }
159
+ return undefined;
160
+ };
161
+ exports.getCurrentPageViewId = getCurrentPageViewId;
141
162
  var querySelectUniqueElements = function (root, selectors) {
142
163
  if (root && 'querySelectorAll' in root && typeof root.querySelectorAll === 'function') {
143
164
  var elementSet = selectors.reduce(function (elements, selector) {
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { ElementInteractionsOptions, ActionType, isUrlMatchAllowlist } from '@amplitude/analytics-core';\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, pageUrlExcludelist, 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 // check if the URL is in the allow list\n if (!isUrlMatchAllowlist(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n // check if the URL is in the excludelist\n if (\n pageUrlExcludelist &&\n pageUrlExcludelist.length > 0 &&\n isUrlMatchAllowlist(window.location.href, pageUrlExcludelist as (string | RegExp)[])\n ) {\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 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/**\n * Collects redacted attribute names from element and ancestor elements with data-amp-mask-attributes\n * The 'id' and 'class' attributes cannot be redacted as they're critical for element identification\n * @param element - The target element to check for redaction attributes\n * @returns Set of attribute names that should be redacted\n */\n/**\n * Parses a comma-separated string of attribute names and filters out protected attributes\n * @param attributeString - Comma-separated string of attribute names\n * @returns Array of valid attribute names, excluding 'id' and 'class'\n */\nexport const parseAttributesToMask = (attributeString: string | null): string[] => {\n return attributeString\n ? attributeString\n .split(',')\n .map((attr) => attr.trim())\n .filter((attr) => attr.length > 0 && attr !== 'id' && attr !== 'class') // Prevent 'id' and 'class' from being redacted as they're critical for element identification\n : [];\n};\n\nexport const extractPrefixedAttributes = (\n attrs: { [key: string]: string },\n prefix: string,\n): { [key: string]: string } => {\n return Object.entries(attrs).reduce((attributes: { [key: string]: string }, [attributeName, attributeValue]) => {\n if (attributeName.startsWith(prefix)) {\n const attributeKey = attributeName.replace(prefix, '');\n\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 }): { [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 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\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\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\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 = (\n event: ElementBasedTimestampedEvent<ElementBasedEvent>,\n) => ElementBasedTimestampedEvent<ElementBasedEvent>;\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
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { ElementInteractionsOptions, ActionType, isUrlMatchAllowlist, getGlobalScope } from '@amplitude/analytics-core';\nimport * as constants from './constants';\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, pageUrlExcludelist, 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 // check if the URL is in the allow list\n if (!isUrlMatchAllowlist(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n // check if the URL is in the excludelist\n if (\n pageUrlExcludelist &&\n pageUrlExcludelist.length > 0 &&\n isUrlMatchAllowlist(window.location.href, pageUrlExcludelist as (string | RegExp)[])\n ) {\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 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/**\n * Collects redacted attribute names from element and ancestor elements with data-amp-mask-attributes\n * The 'id' and 'class' attributes cannot be redacted as they're critical for element identification\n * @param element - The target element to check for redaction attributes\n * @returns Set of attribute names that should be redacted\n */\n/**\n * Parses a comma-separated string of attribute names and filters out protected attributes\n * @param attributeString - Comma-separated string of attribute names\n * @returns Array of valid attribute names, excluding 'id' and 'class'\n */\nexport const parseAttributesToMask = (attributeString: string | null): string[] => {\n return attributeString\n ? attributeString\n .split(',')\n .map((attr) => attr.trim())\n .filter((attr) => attr.length > 0 && attr !== 'id' && attr !== 'class') // Prevent 'id' and 'class' from being redacted as they're critical for element identification\n : [];\n};\n\nexport const extractPrefixedAttributes = (\n attrs: { [key: string]: string },\n prefix: string,\n): { [key: string]: string } => {\n return Object.entries(attrs).reduce((attributes: { [key: string]: string }, [attributeName, attributeValue]) => {\n if (attributeName.startsWith(prefix)) {\n const attributeKey = attributeName.replace(prefix, '');\n\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 }): { [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 getCurrentPageViewId = (): string | undefined => {\n try {\n const globalScope = getGlobalScope();\n /* istanbul ignore next */\n const raw = globalScope?.sessionStorage?.getItem(constants.PAGE_VIEW_SESSION_STORAGE_KEY);\n if (!raw) {\n return undefined;\n }\n const parsed = JSON.parse(raw) as { pageViewId?: unknown };\n if (typeof parsed.pageViewId === 'string') {\n return parsed.pageViewId;\n }\n } catch {\n // ignore storage access or JSON errors\n }\n return undefined;\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\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\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\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 = (\n event: ElementBasedTimestampedEvent<ElementBasedEvent>,\n) => ElementBasedTimestampedEvent<ElementBasedEvent>;\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"]}
@@ -0,0 +1,2 @@
1
+ export declare const cssPath: (node: Element, optimized?: boolean) => string;
2
+ //# sourceMappingURL=element-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-path.d.ts","sourceRoot":"","sources":["../../../src/libs/element-path.ts"],"names":[],"mappings":"AAyCA,eAAO,MAAM,OAAO,SAAmB,OAAO,cAAc,OAAO,KAAG,MAuBrE,CAAC"}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ /* istanbul ignore file */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.cssPath = void 0;
5
+ var tslib_1 = require("tslib");
6
+ // Code is adapted from The Chromium Authors.
7
+ // Source: https://github.com/ChromeDevTools/devtools-frontend/blob/main/front_end/panels/elements/DOMPath.ts#L14
8
+ // License: BSD-style license
9
+ //
10
+ // Copyright 2014 The Chromium Authors
11
+ //
12
+ // Redistribution and use in source and binary forms, with or without
13
+ // modification, are permitted provided that the following conditions are
14
+ // met:
15
+ //
16
+ // * Redistributions of source code must retain the above copyright
17
+ // notice, this list of conditions and the following disclaimer.
18
+ // * Redistributions in binary form must reproduce the above
19
+ // copyright notice, this list of conditions and the following disclaimer
20
+ // in the documentation and/or other materials provided with the
21
+ // distribution.
22
+ // * Neither the name of Google Inc. nor the names of its
23
+ // contributors may be used to endorse or promote products derived from
24
+ // this software without specific prior written permission.
25
+ //
26
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
+ var Step = /** @class */ (function () {
38
+ function Step(value, optimized) {
39
+ this.value = value;
40
+ this.optimized = optimized;
41
+ }
42
+ Step.prototype.toString = function () {
43
+ return this.value;
44
+ };
45
+ return Step;
46
+ }());
47
+ var cssPath = function (node, optimized) {
48
+ // `node` is already an Element; this check is defensive.
49
+ if (node.nodeType !== Node.ELEMENT_NODE) {
50
+ return '';
51
+ }
52
+ var steps = [];
53
+ var contextNode = node;
54
+ while (contextNode) {
55
+ var step = cssPathStep(contextNode, Boolean(optimized), contextNode === node);
56
+ if (!step) {
57
+ break;
58
+ } // bail out early
59
+ steps.push(step);
60
+ if (step.optimized) {
61
+ break;
62
+ }
63
+ contextNode = contextNode.parentElement;
64
+ }
65
+ steps.reverse();
66
+ return steps.join(' > ');
67
+ };
68
+ exports.cssPath = cssPath;
69
+ var cssPathStep = function (node, optimized, isTargetNode) {
70
+ var e_1, _a;
71
+ if (node.nodeType !== Node.ELEMENT_NODE) {
72
+ return null;
73
+ }
74
+ var id = node.getAttribute('id');
75
+ if (optimized) {
76
+ if (id) {
77
+ return new Step(idSelector(id), true);
78
+ }
79
+ var nodeNameLower = node.tagName.toLowerCase();
80
+ if (nodeNameLower === 'body' || nodeNameLower === 'head' || nodeNameLower === 'html') {
81
+ return new Step(nodeNameLower, true);
82
+ }
83
+ }
84
+ var nodeName = node.tagName.toLowerCase();
85
+ if (id) {
86
+ return new Step(nodeName + idSelector(id), true);
87
+ }
88
+ var parent = node.parentNode;
89
+ if (!parent || parent.nodeType === Node.DOCUMENT_NODE) {
90
+ return new Step(nodeName, true);
91
+ }
92
+ function prefixedElementClassNames(el) {
93
+ var classAttribute = el.getAttribute('class');
94
+ if (!classAttribute) {
95
+ return [];
96
+ }
97
+ return classAttribute
98
+ .split(/\s+/g)
99
+ .filter(Boolean)
100
+ .map(function (name) {
101
+ // The prefix is required to store "__proto__" in a object-based map.
102
+ return '$' + name;
103
+ });
104
+ }
105
+ function idSelector(id) {
106
+ return '#' + CSS.escape(id);
107
+ }
108
+ var prefixedOwnClassNamesArray = prefixedElementClassNames(node);
109
+ var needsClassNames = false;
110
+ var needsNthChild = false;
111
+ var ownIndex = -1;
112
+ var elementIndex = -1;
113
+ var siblings = parent.children;
114
+ for (var i = 0; siblings && (ownIndex === -1 || !needsNthChild) && i < siblings.length; ++i) {
115
+ var sibling = siblings[i];
116
+ if (sibling.nodeType !== Node.ELEMENT_NODE) {
117
+ continue;
118
+ }
119
+ elementIndex += 1;
120
+ if (sibling === node) {
121
+ ownIndex = elementIndex;
122
+ continue;
123
+ }
124
+ if (needsNthChild) {
125
+ continue;
126
+ }
127
+ if (sibling.tagName.toLowerCase() !== nodeName) {
128
+ continue;
129
+ }
130
+ needsClassNames = true;
131
+ var ownClassNames = new Set(prefixedOwnClassNamesArray);
132
+ if (!ownClassNames.size) {
133
+ needsNthChild = true;
134
+ continue;
135
+ }
136
+ var siblingClassNamesArray = prefixedElementClassNames(sibling);
137
+ for (var j = 0; j < siblingClassNamesArray.length; ++j) {
138
+ var siblingClass = siblingClassNamesArray[j];
139
+ if (!ownClassNames.has(siblingClass)) {
140
+ continue;
141
+ }
142
+ ownClassNames.delete(siblingClass);
143
+ if (!ownClassNames.size) {
144
+ needsNthChild = true;
145
+ break;
146
+ }
147
+ }
148
+ }
149
+ var result = nodeName;
150
+ if (isTargetNode &&
151
+ nodeName.toLowerCase() === 'input' &&
152
+ node.getAttribute('type') &&
153
+ !node.getAttribute('id') &&
154
+ !node.getAttribute('class')) {
155
+ result += '[type=' + CSS.escape(node.getAttribute('type') || '') + ']';
156
+ }
157
+ if (needsNthChild) {
158
+ result += ':nth-child(' + String(ownIndex + 1) + ')';
159
+ }
160
+ else if (needsClassNames) {
161
+ try {
162
+ for (var prefixedOwnClassNamesArray_1 = tslib_1.__values(prefixedOwnClassNamesArray), prefixedOwnClassNamesArray_1_1 = prefixedOwnClassNamesArray_1.next(); !prefixedOwnClassNamesArray_1_1.done; prefixedOwnClassNamesArray_1_1 = prefixedOwnClassNamesArray_1.next()) {
163
+ var prefixedName = prefixedOwnClassNamesArray_1_1.value;
164
+ result += '.' + CSS.escape(prefixedName.slice(1));
165
+ }
166
+ }
167
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
168
+ finally {
169
+ try {
170
+ if (prefixedOwnClassNamesArray_1_1 && !prefixedOwnClassNamesArray_1_1.done && (_a = prefixedOwnClassNamesArray_1.return)) _a.call(prefixedOwnClassNamesArray_1);
171
+ }
172
+ finally { if (e_1) throw e_1.error; }
173
+ }
174
+ }
175
+ return new Step(result, false);
176
+ };
177
+ //# sourceMappingURL=element-path.js.map