@amplitude/plugin-autocapture-browser 1.23.6 → 1.24.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 (118) hide show
  1. package/lib/cjs/autocapture/track-click.d.ts.map +1 -1
  2. package/lib/cjs/autocapture/track-click.js.map +1 -1
  3. package/lib/cjs/autocapture/track-exposure.d.ts +12 -0
  4. package/lib/cjs/autocapture/track-exposure.d.ts.map +1 -0
  5. package/lib/cjs/autocapture/track-exposure.js +56 -0
  6. package/lib/cjs/autocapture/track-exposure.js.map +1 -0
  7. package/lib/cjs/autocapture/track-scroll.d.ts +15 -0
  8. package/lib/cjs/autocapture/track-scroll.d.ts.map +1 -0
  9. package/lib/cjs/autocapture/track-scroll.js +34 -0
  10. package/lib/cjs/autocapture/track-scroll.js.map +1 -0
  11. package/lib/cjs/autocapture/track-viewport-content-updated.d.ts +25 -0
  12. package/lib/cjs/autocapture/track-viewport-content-updated.d.ts.map +1 -0
  13. package/lib/cjs/autocapture/track-viewport-content-updated.js +71 -0
  14. package/lib/cjs/autocapture/track-viewport-content-updated.js.map +1 -0
  15. package/lib/cjs/autocapture-plugin.d.ts +4 -0
  16. package/lib/cjs/autocapture-plugin.d.ts.map +1 -1
  17. package/lib/cjs/autocapture-plugin.js +109 -14
  18. package/lib/cjs/autocapture-plugin.js.map +1 -1
  19. package/lib/cjs/constants.d.ts +7 -0
  20. package/lib/cjs/constants.d.ts.map +1 -1
  21. package/lib/cjs/constants.js +9 -1
  22. package/lib/cjs/constants.js.map +1 -1
  23. package/lib/cjs/data-extractor.d.ts +1 -0
  24. package/lib/cjs/data-extractor.d.ts.map +1 -1
  25. package/lib/cjs/data-extractor.js +19 -0
  26. package/lib/cjs/data-extractor.js.map +1 -1
  27. package/lib/cjs/helpers.d.ts +1 -0
  28. package/lib/cjs/helpers.d.ts.map +1 -1
  29. package/lib/cjs/helpers.js +22 -1
  30. package/lib/cjs/helpers.js.map +1 -1
  31. package/lib/cjs/libs/element-path.d.ts +2 -0
  32. package/lib/cjs/libs/element-path.d.ts.map +1 -0
  33. package/lib/cjs/libs/element-path.js +177 -0
  34. package/lib/cjs/libs/element-path.js.map +1 -0
  35. package/lib/cjs/observables.d.ts +3 -0
  36. package/lib/cjs/observables.d.ts.map +1 -1
  37. package/lib/cjs/observables.js +70 -3
  38. package/lib/cjs/observables.js.map +1 -1
  39. package/lib/cjs/version.d.ts +1 -1
  40. package/lib/cjs/version.js +1 -1
  41. package/lib/cjs/version.js.map +1 -1
  42. package/lib/esm/autocapture/track-click.d.ts.map +1 -1
  43. package/lib/esm/autocapture/track-click.js.map +1 -1
  44. package/lib/esm/autocapture/track-exposure.d.ts +12 -0
  45. package/lib/esm/autocapture/track-exposure.d.ts.map +1 -0
  46. package/lib/esm/autocapture/track-exposure.js +52 -0
  47. package/lib/esm/autocapture/track-exposure.js.map +1 -0
  48. package/lib/esm/autocapture/track-scroll.d.ts +15 -0
  49. package/lib/esm/autocapture/track-scroll.d.ts.map +1 -0
  50. package/lib/esm/autocapture/track-scroll.js +30 -0
  51. package/lib/esm/autocapture/track-scroll.js.map +1 -0
  52. package/lib/esm/autocapture/track-viewport-content-updated.d.ts +25 -0
  53. package/lib/esm/autocapture/track-viewport-content-updated.d.ts.map +1 -0
  54. package/lib/esm/autocapture/track-viewport-content-updated.js +65 -0
  55. package/lib/esm/autocapture/track-viewport-content-updated.js.map +1 -0
  56. package/lib/esm/autocapture-plugin.d.ts +4 -0
  57. package/lib/esm/autocapture-plugin.d.ts.map +1 -1
  58. package/lib/esm/autocapture-plugin.js +111 -16
  59. package/lib/esm/autocapture-plugin.js.map +1 -1
  60. package/lib/esm/constants.d.ts +7 -0
  61. package/lib/esm/constants.d.ts.map +1 -1
  62. package/lib/esm/constants.js +8 -0
  63. package/lib/esm/constants.js.map +1 -1
  64. package/lib/esm/data-extractor.d.ts +1 -0
  65. package/lib/esm/data-extractor.d.ts.map +1 -1
  66. package/lib/esm/data-extractor.js +20 -1
  67. package/lib/esm/data-extractor.js.map +1 -1
  68. package/lib/esm/helpers.d.ts +1 -0
  69. package/lib/esm/helpers.d.ts.map +1 -1
  70. package/lib/esm/helpers.js +21 -1
  71. package/lib/esm/helpers.js.map +1 -1
  72. package/lib/esm/libs/element-path.d.ts +2 -0
  73. package/lib/esm/libs/element-path.d.ts.map +1 -0
  74. package/lib/esm/libs/element-path.js +173 -0
  75. package/lib/esm/libs/element-path.js.map +1 -0
  76. package/lib/esm/observables.d.ts +3 -0
  77. package/lib/esm/observables.d.ts.map +1 -1
  78. package/lib/esm/observables.js +67 -2
  79. package/lib/esm/observables.js.map +1 -1
  80. package/lib/esm/version.d.ts +1 -1
  81. package/lib/esm/version.js +1 -1
  82. package/lib/esm/version.js.map +1 -1
  83. package/lib/scripts/amplitude-min.js +1 -1
  84. package/lib/scripts/amplitude-min.js.gz +0 -0
  85. package/lib/scripts/amplitude-min.js.map +1 -1
  86. package/lib/scripts/amplitude-min.umd.js +1 -1
  87. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  88. package/lib/scripts/autocapture/track-click.d.ts.map +1 -1
  89. package/lib/scripts/autocapture/track-exposure.d.ts +12 -0
  90. package/lib/scripts/autocapture/track-exposure.d.ts.map +1 -0
  91. package/lib/scripts/autocapture/track-scroll.d.ts +15 -0
  92. package/lib/scripts/autocapture/track-scroll.d.ts.map +1 -0
  93. package/lib/scripts/autocapture/track-viewport-content-updated.d.ts +25 -0
  94. package/lib/scripts/autocapture/track-viewport-content-updated.d.ts.map +1 -0
  95. package/lib/scripts/autocapture-plugin.d.ts +4 -0
  96. package/lib/scripts/autocapture-plugin.d.ts.map +1 -1
  97. package/lib/scripts/constants.d.ts +7 -0
  98. package/lib/scripts/constants.d.ts.map +1 -1
  99. package/lib/scripts/data-extractor.d.ts +1 -0
  100. package/lib/scripts/data-extractor.d.ts.map +1 -1
  101. package/lib/scripts/helpers.d.ts +1 -0
  102. package/lib/scripts/helpers.d.ts.map +1 -1
  103. package/lib/scripts/libs/element-path.d.ts +2 -0
  104. package/lib/scripts/libs/element-path.d.ts.map +1 -0
  105. package/lib/scripts/observables.d.ts +3 -0
  106. package/lib/scripts/observables.d.ts.map +1 -1
  107. package/lib/scripts/version.d.ts +1 -1
  108. package/package.json +2 -2
  109. package/lib/cjs/libs/finder.d.ts +0 -13
  110. package/lib/cjs/libs/finder.d.ts.map +0 -1
  111. package/lib/cjs/libs/finder.js +0 -348
  112. package/lib/cjs/libs/finder.js.map +0 -1
  113. package/lib/esm/libs/finder.d.ts +0 -13
  114. package/lib/esm/libs/finder.d.ts.map +0 -1
  115. package/lib/esm/libs/finder.js +0 -344
  116. package/lib/esm/libs/finder.js.map +0 -1
  117. package/lib/scripts/libs/finder.d.ts +0 -13
  118. package/lib/scripts/libs/finder.d.ts.map +0 -1
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-path.js","sourceRoot":"","sources":["../../../src/libs/element-path.ts"],"names":[],"mappings":"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","sourcesContent":["/* istanbul ignore file */\n\n// Code is adapted from The Chromium Authors.\n// Source: https://github.com/ChromeDevTools/devtools-frontend/blob/main/front_end/panels/elements/DOMPath.ts#L14\n// License: BSD-style license\n//\n// Copyright 2014 The Chromium Authors\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nclass Step {\n constructor(public value: string, public optimized: boolean) {}\n toString() {\n return this.value;\n }\n}\n\nexport const cssPath = function (node: Element, optimized?: boolean): string {\n // `node` is already an Element; this check is defensive.\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return '';\n }\n\n const steps: Step[] = [];\n let contextNode: Element | null = node;\n\n while (contextNode) {\n const step = cssPathStep(contextNode, Boolean(optimized), contextNode === node);\n if (!step) {\n break;\n } // bail out early\n steps.push(step);\n if (step.optimized) {\n break;\n }\n contextNode = contextNode.parentElement;\n }\n\n steps.reverse();\n return steps.join(' > ');\n};\n\nconst cssPathStep = function (node: Element, optimized: boolean, isTargetNode: boolean): Step | null {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n\n const id = node.getAttribute('id');\n if (optimized) {\n if (id) {\n return new Step(idSelector(id), true);\n }\n\n const nodeNameLower = node.tagName.toLowerCase();\n if (nodeNameLower === 'body' || nodeNameLower === 'head' || nodeNameLower === 'html') {\n return new Step(nodeNameLower, true);\n }\n }\n\n const nodeName = node.tagName.toLowerCase();\n\n if (id) {\n return new Step(nodeName + idSelector(id), true);\n }\n\n const parent = node.parentNode;\n if (!parent || parent.nodeType === Node.DOCUMENT_NODE) {\n return new Step(nodeName, true);\n }\n\n function prefixedElementClassNames(el: Element): string[] {\n const classAttribute = el.getAttribute('class');\n if (!classAttribute) {\n return [];\n }\n return classAttribute\n .split(/\\s+/g)\n .filter(Boolean)\n .map(function (name) {\n // The prefix is required to store \"__proto__\" in a object-based map.\n return '$' + name;\n });\n }\n\n function idSelector(id: string): string {\n return '#' + CSS.escape(id);\n }\n\n const prefixedOwnClassNamesArray = prefixedElementClassNames(node);\n let needsClassNames = false;\n let needsNthChild = false;\n let ownIndex = -1;\n let elementIndex = -1;\n\n const siblings: HTMLCollectionOf<Element> = parent.children;\n\n for (let i = 0; siblings && (ownIndex === -1 || !needsNthChild) && i < siblings.length; ++i) {\n const sibling = siblings[i];\n if (sibling.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n\n elementIndex += 1;\n if (sibling === node) {\n ownIndex = elementIndex;\n continue;\n }\n if (needsNthChild) {\n continue;\n }\n\n if (sibling.tagName.toLowerCase() !== nodeName) {\n continue;\n }\n\n needsClassNames = true;\n const ownClassNames = new Set<string>(prefixedOwnClassNamesArray);\n if (!ownClassNames.size) {\n needsNthChild = true;\n continue;\n }\n\n const siblingClassNamesArray = prefixedElementClassNames(sibling);\n for (let j = 0; j < siblingClassNamesArray.length; ++j) {\n const siblingClass = siblingClassNamesArray[j];\n if (!ownClassNames.has(siblingClass)) {\n continue;\n }\n ownClassNames.delete(siblingClass);\n if (!ownClassNames.size) {\n needsNthChild = true;\n break;\n }\n }\n }\n\n let result = nodeName;\n if (\n isTargetNode &&\n nodeName.toLowerCase() === 'input' &&\n node.getAttribute('type') &&\n !node.getAttribute('id') &&\n !node.getAttribute('class')\n ) {\n result += '[type=' + CSS.escape(node.getAttribute('type') || '') + ']';\n }\n if (needsNthChild) {\n result += ':nth-child(' + String(ownIndex + 1) + ')';\n } else if (needsClassNames) {\n for (const prefixedName of prefixedOwnClassNamesArray) {\n result += '.' + CSS.escape(prefixedName.slice(1));\n }\n }\n\n return new Step(result, false);\n};\n"]}
@@ -1,3 +1,4 @@
1
+ import { TimestampedEvent } from './helpers';
1
2
  import { Observable } from '@amplitude/analytics-core';
2
3
  export declare const createMutationObservable: () => Observable<MutationRecord[]>;
3
4
  /**
@@ -5,6 +6,8 @@ export declare const createMutationObservable: () => Observable<MutationRecord[]
5
6
  * @param clickType - The type of click event to track (click or pointerdown)
6
7
  */
7
8
  export declare const createClickObservable: (clickType?: 'click' | 'pointerdown') => Observable<MouseEvent | PointerEvent>;
9
+ export declare const createScrollObservable: () => Observable<Event>;
10
+ export declare const createExposureObservable: (mutationObservable: Observable<TimestampedEvent<MutationRecord[]>>, selectorAllowlist: string[]) => Observable<Event>;
8
11
  export type BrowserErrorEvent = {
9
12
  kind: 'error' | 'unhandledrejection' | 'console';
10
13
  message?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"observables.d.ts","sourceRoot":"","sources":["../../src/observables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA0C,MAAM,2BAA2B,CAAC;AAK/F,eAAO,MAAM,wBAAwB,QAAO,WAAW,cAAc,EAAE,CAetE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,eACrB,OAAO,GAAG,aAAa,KACjC,WAAW,UAAU,GAAG,YAAY,CAUtC,CAAC;AAwEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,OAAO,GAAG,oBAAoB,GAAG,SAAS,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAO,WAAW,iBAAiB,CAGpE,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAO,WAAW,UAAU,CAWjE,CAAC"}
1
+ {"version":3,"file":"observables.d.ts","sourceRoot":"","sources":["../../src/observables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAA0C,MAAM,2BAA2B,CAAC;AAK/F,eAAO,MAAM,wBAAwB,QAAO,WAAW,cAAc,EAAE,CAetE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,eACrB,OAAO,GAAG,aAAa,KACjC,WAAW,UAAU,GAAG,YAAY,CAWtC,CAAC;AAEF,eAAO,MAAM,sBAAsB,QAAO,WAAW,KAAK,CAWzD,CAAC;AAoBF,eAAO,MAAM,wBAAwB,uBACf,WAAW,iBAAiB,cAAc,EAAE,CAAC,CAAC,qBAC/C,MAAM,EAAE,KAC1B,WAAW,KAAK,CAqDlB,CAAC;AAsDF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,OAAO,GAAG,oBAAoB,GAAG,SAAS,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAO,WAAW,iBAAiB,CAGpE,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAO,WAAW,UAAU,CAWjE,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createMouseMoveObservable = exports.createErrorObservable = exports.createClickObservable = exports.createMutationObservable = void 0;
3
+ exports.createMouseMoveObservable = exports.createErrorObservable = exports.createExposureObservable = exports.createScrollObservable = exports.createClickObservable = exports.createMutationObservable = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var analytics_core_1 = require("@amplitude/analytics-core");
6
6
  /* eslint-disable-next-line no-restricted-globals */
@@ -29,16 +29,32 @@ exports.createMutationObservable = createMutationObservable;
29
29
  var createClickObservable = function (clickType) {
30
30
  if (clickType === void 0) { clickType = 'click'; }
31
31
  return new analytics_core_1.Observable(function (observer) {
32
+ var _a;
32
33
  var handler = function (event) {
33
34
  observer.next(event);
34
35
  };
35
- globalScope.document.addEventListener(clickType, handler, { capture: true });
36
+ (_a = (0, analytics_core_1.getGlobalScope)()) === null || _a === void 0 ? void 0 : _a.document.addEventListener(clickType, handler, { capture: true });
36
37
  return function () {
37
- globalScope.document.removeEventListener(clickType, handler, { capture: true });
38
+ var _a;
39
+ (_a = (0, analytics_core_1.getGlobalScope)()) === null || _a === void 0 ? void 0 : _a.document.removeEventListener(clickType, handler, { capture: true });
38
40
  };
39
41
  });
40
42
  };
41
43
  exports.createClickObservable = createClickObservable;
44
+ var createScrollObservable = function () {
45
+ return new analytics_core_1.Observable(function (observer) {
46
+ var _a;
47
+ var handler = function (event) {
48
+ observer.next(event);
49
+ };
50
+ (_a = (0, analytics_core_1.getGlobalScope)()) === null || _a === void 0 ? void 0 : _a.addEventListener('scroll', handler);
51
+ return function () {
52
+ var _a;
53
+ (_a = (0, analytics_core_1.getGlobalScope)()) === null || _a === void 0 ? void 0 : _a.removeEventListener('scroll', handler);
54
+ };
55
+ });
56
+ };
57
+ exports.createScrollObservable = createScrollObservable;
42
58
  var createConsoleErrorObservable = function () {
43
59
  return new analytics_core_1.Observable(function (observer) {
44
60
  var handler = function (_) {
@@ -59,6 +75,57 @@ var createConsoleErrorObservable = function () {
59
75
  };
60
76
  });
61
77
  };
78
+ // Tracks when a trackedelement is exposed to the viewport
79
+ var createExposureObservable = function (mutationObservable, selectorAllowlist) {
80
+ return new analytics_core_1.Observable(function (observer) {
81
+ var _a;
82
+ var globalScope = (0, analytics_core_1.getGlobalScope)();
83
+ if (!(globalScope === null || globalScope === void 0 ? void 0 : globalScope.IntersectionObserver)) {
84
+ return function () {
85
+ return;
86
+ };
87
+ }
88
+ var intersectionObserver = new IntersectionObserver(function (entries) {
89
+ entries.forEach(function (entry) {
90
+ observer.next(entry);
91
+ });
92
+ }, {
93
+ root: null,
94
+ rootMargin: '0px',
95
+ threshold: 1.0, // trigger when 100% of the element is visible
96
+ });
97
+ // Observe initial elements
98
+ var selectorString = selectorAllowlist.join(',');
99
+ /* istanbul ignore next */
100
+ var initialElements = (_a = globalScope === null || globalScope === void 0 ? void 0 : globalScope.document.querySelectorAll(selectorString)) !== null && _a !== void 0 ? _a : [];
101
+ initialElements.forEach(function (element) {
102
+ intersectionObserver.observe(element);
103
+ });
104
+ // Use mutation observable to observe new elements that match the allowlist
105
+ var mutationSubscription = mutationObservable.subscribe(function (_a) {
106
+ var event = _a.event;
107
+ return event.forEach(function (_a) {
108
+ var addedNodes = _a.addedNodes;
109
+ return addedNodes.forEach(function (node) {
110
+ if (!(node instanceof Element)) {
111
+ return;
112
+ }
113
+ if (node.matches(selectorString)) {
114
+ intersectionObserver.observe(node);
115
+ }
116
+ node.querySelectorAll(selectorString).forEach(function (child) {
117
+ intersectionObserver.observe(child);
118
+ });
119
+ });
120
+ });
121
+ });
122
+ return function () {
123
+ mutationSubscription.unsubscribe();
124
+ intersectionObserver.disconnect();
125
+ };
126
+ });
127
+ };
128
+ exports.createExposureObservable = createExposureObservable;
62
129
  var createUnhandledErrorObservable = function () {
63
130
  return new analytics_core_1.Observable(function (observer) {
64
131
  var handler = function (event) {
@@ -1 +1 @@
1
- {"version":3,"file":"observables.js","sourceRoot":"","sources":["../../src/observables.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable, consoleObserver, getGlobalScope, merge } from '@amplitude/analytics-core';\n\n/* eslint-disable-next-line no-restricted-globals */\nconst globalScope = getGlobalScope() as typeof window;\n\nexport const createMutationObservable = (): Observable<MutationRecord[]> => {\n return new Observable<MutationRecord[]>((observer) => {\n const mutationObserver = new MutationObserver((mutations) => {\n observer.next(mutations);\n });\n if (document.body) {\n mutationObserver.observe(document.body, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n });\n }\n return () => mutationObserver.disconnect();\n });\n};\n\n/**\n * Creates an observable that tracks click events on the document.\n * @param clickType - The type of click event to track (click or pointerdown)\n */\nexport const createClickObservable = (\n clickType: 'click' | 'pointerdown' = 'click',\n): Observable<MouseEvent | PointerEvent> => {\n return new Observable<MouseEvent | PointerEvent>((observer) => {\n const handler = (event: MouseEvent | PointerEvent) => {\n observer.next(event);\n };\n globalScope.document.addEventListener(clickType, handler, { capture: true });\n return () => {\n globalScope.document.removeEventListener(clickType, handler, { capture: true });\n };\n });\n};\n\nconst createConsoleErrorObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (_: string, ...args: any[]) => {\n /* istanbul ignore next */\n let message: string | undefined = undefined;\n if (Array.isArray(args[0]) && typeof args[0][0] === 'string') {\n message = args[0][0];\n }\n observer.next({ kind: 'console', message });\n };\n consoleObserver.addListener('error', handler);\n return () => {\n consoleObserver.removeListener(handler);\n };\n });\n};\n\nconst createUnhandledErrorObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (event: Event) => {\n if (!(event instanceof ErrorEvent)) {\n return;\n }\n let output: BrowserErrorEvent = {\n kind: 'error',\n };\n\n if (event.error instanceof Error || event.error instanceof DOMException) {\n output = {\n ...output,\n message: event.error.message,\n stack: event.error.stack,\n filename: event.filename,\n lineNumber: event.lineno,\n columnNumber: event.colno,\n };\n } else if (typeof event.error === 'string') {\n output.message = event.error;\n }\n observer.next(output);\n };\n\n globalScope.addEventListener('error', handler);\n return () => {\n globalScope.removeEventListener('error', handler);\n };\n });\n};\n\nconst createUnhandledRejectionObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (event: PromiseRejectionEvent) => {\n const output: BrowserErrorEvent = {\n kind: 'unhandledrejection',\n };\n if (event.reason instanceof Error || event.reason instanceof DOMException) {\n output.message = event.reason.message;\n output.stack = event.reason.stack;\n } else if (typeof event.reason === 'string') {\n output.message = event.reason;\n }\n observer.next(output);\n };\n globalScope.addEventListener('unhandledrejection', handler);\n return () => {\n globalScope.removeEventListener('unhandledrejection', handler);\n };\n });\n};\n\nexport type BrowserErrorEvent = {\n kind: 'error' | 'unhandledrejection' | 'console';\n message?: string;\n filename?: string;\n lineNumber?: number;\n columnNumber?: number;\n stack?: string;\n};\n\nexport const createErrorObservable = (): Observable<BrowserErrorEvent> => {\n const unhandledErrorObservable = merge(createUnhandledErrorObservable(), createUnhandledRejectionObservable());\n return merge(unhandledErrorObservable, createConsoleErrorObservable());\n};\n\nexport const createMouseMoveObservable = (): Observable<MouseEvent> => {\n return new Observable<MouseEvent>((observer) => {\n const handler = (event: MouseEvent) => {\n observer.next(event);\n };\n const args: AddEventListenerOptions = { capture: true };\n globalScope.document.addEventListener('mousemove', handler, args);\n return () => {\n globalScope.document.removeEventListener('mousemove', handler, args);\n };\n });\n};\n"]}
1
+ {"version":3,"file":"observables.js","sourceRoot":"","sources":["../../src/observables.ts"],"names":[],"mappings":"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","sourcesContent":["import { TimestampedEvent } from './helpers';\nimport { Observable, consoleObserver, getGlobalScope, merge } from '@amplitude/analytics-core';\n\n/* eslint-disable-next-line no-restricted-globals */\nconst globalScope = getGlobalScope() as typeof window;\n\nexport const createMutationObservable = (): Observable<MutationRecord[]> => {\n return new Observable<MutationRecord[]>((observer) => {\n const mutationObserver = new MutationObserver((mutations) => {\n observer.next(mutations);\n });\n if (document.body) {\n mutationObserver.observe(document.body, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n });\n }\n return () => mutationObserver.disconnect();\n });\n};\n\n/**\n * Creates an observable that tracks click events on the document.\n * @param clickType - The type of click event to track (click or pointerdown)\n */\nexport const createClickObservable = (\n clickType: 'click' | 'pointerdown' = 'click',\n): Observable<MouseEvent | PointerEvent> => {\n return new Observable<MouseEvent | PointerEvent>((observer) => {\n const handler = (event: MouseEvent | PointerEvent) => {\n observer.next(event);\n };\n\n getGlobalScope()?.document.addEventListener(clickType, handler, { capture: true });\n return () => {\n getGlobalScope()?.document.removeEventListener(clickType, handler, { capture: true });\n };\n });\n};\n\nexport const createScrollObservable = (): Observable<Event> => {\n return new Observable<Event>((observer) => {\n const handler = (event: Event) => {\n observer.next(event);\n };\n\n getGlobalScope()?.addEventListener('scroll', handler);\n return () => {\n getGlobalScope()?.removeEventListener('scroll', handler);\n };\n });\n};\n\nconst createConsoleErrorObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (_: string, ...args: any[]) => {\n /* istanbul ignore next */\n let message: string | undefined = undefined;\n if (Array.isArray(args[0]) && typeof args[0][0] === 'string') {\n message = args[0][0];\n }\n observer.next({ kind: 'console', message });\n };\n consoleObserver.addListener('error', handler);\n return () => {\n consoleObserver.removeListener(handler);\n };\n });\n};\n\n// Tracks when a trackedelement is exposed to the viewport\nexport const createExposureObservable = (\n mutationObservable: Observable<TimestampedEvent<MutationRecord[]>>,\n selectorAllowlist: string[],\n): Observable<Event> => {\n return new Observable<Event>((observer) => {\n const globalScope = getGlobalScope();\n\n if (!globalScope?.IntersectionObserver) {\n return () => {\n return;\n };\n }\n\n const intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n observer.next(entry as unknown as Event);\n });\n },\n {\n root: null, // viewport\n rootMargin: '0px', // start exactly at the viewport edge\n threshold: 1.0, // trigger when 100% of the element is visible\n },\n );\n\n // Observe initial elements\n const selectorString = selectorAllowlist.join(',');\n /* istanbul ignore next */\n const initialElements = globalScope?.document.querySelectorAll(selectorString) ?? [];\n initialElements.forEach((element) => {\n intersectionObserver.observe(element);\n });\n\n // Use mutation observable to observe new elements that match the allowlist\n const mutationSubscription = mutationObservable.subscribe(({ event }) =>\n event.forEach(({ addedNodes }) =>\n addedNodes.forEach((node) => {\n if (!(node instanceof Element)) {\n return;\n }\n if (node.matches(selectorString)) {\n intersectionObserver.observe(node);\n }\n node.querySelectorAll(selectorString).forEach((child) => {\n intersectionObserver.observe(child);\n });\n }),\n ),\n );\n\n return () => {\n mutationSubscription.unsubscribe();\n intersectionObserver.disconnect();\n };\n });\n};\nconst createUnhandledErrorObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (event: Event) => {\n if (!(event instanceof ErrorEvent)) {\n return;\n }\n let output: BrowserErrorEvent = {\n kind: 'error',\n };\n\n if (event.error instanceof Error || event.error instanceof DOMException) {\n output = {\n ...output,\n message: event.error.message,\n stack: event.error.stack,\n filename: event.filename,\n lineNumber: event.lineno,\n columnNumber: event.colno,\n };\n } else if (typeof event.error === 'string') {\n output.message = event.error;\n }\n observer.next(output);\n };\n\n globalScope.addEventListener('error', handler);\n return () => {\n globalScope.removeEventListener('error', handler);\n };\n });\n};\n\nconst createUnhandledRejectionObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (event: PromiseRejectionEvent) => {\n const output: BrowserErrorEvent = {\n kind: 'unhandledrejection',\n };\n if (event.reason instanceof Error || event.reason instanceof DOMException) {\n output.message = event.reason.message;\n output.stack = event.reason.stack;\n } else if (typeof event.reason === 'string') {\n output.message = event.reason;\n }\n observer.next(output);\n };\n globalScope.addEventListener('unhandledrejection', handler);\n return () => {\n globalScope.removeEventListener('unhandledrejection', handler);\n };\n });\n};\n\nexport type BrowserErrorEvent = {\n kind: 'error' | 'unhandledrejection' | 'console';\n message?: string;\n filename?: string;\n lineNumber?: number;\n columnNumber?: number;\n stack?: string;\n};\n\nexport const createErrorObservable = (): Observable<BrowserErrorEvent> => {\n const unhandledErrorObservable = merge(createUnhandledErrorObservable(), createUnhandledRejectionObservable());\n return merge(unhandledErrorObservable, createConsoleErrorObservable());\n};\n\nexport const createMouseMoveObservable = (): Observable<MouseEvent> => {\n return new Observable<MouseEvent>((observer) => {\n const handler = (event: MouseEvent) => {\n observer.next(event);\n };\n const args: AddEventListenerOptions = { capture: true };\n globalScope.document.addEventListener('mousemove', handler, args);\n return () => {\n globalScope.document.removeEventListener('mousemove', handler, args);\n };\n });\n};\n"]}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "1.23.6";
1
+ export declare const VERSION = "1.24.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = '1.23.6';
4
+ exports.VERSION = '1.24.0';
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '1.23.6';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '1.24.0';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"track-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAmD,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACtG,OAAO,EAAc,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG3E,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,kBAAkB,CAAC;CACtC,8BAkBA"}
1
+ {"version":3,"file":"track-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAwD,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC3G,OAAO,EAAc,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG3E,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,kBAAkB,CAAC;CACtC,8BAkBA"}
@@ -1 +1 @@
1
- {"version":3,"file":"track-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,2BAA2B,EAAoB,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAE/D,MAAM,UAAU,WAAW,CAAC,EAU3B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,gBAAgB,sBAAA,EAChB,gBAAgB,sBAAA;IAOR,IAAA,eAAe,GAAK,cAAc,gBAAnB,CAAoB;IAE3C,IAAM,uBAAuB,GAAG,eAAe;SAC5C,MAAM,CAAC,2BAA2B,CAAC;SACnC,MAAM,CAAC,UAAC,KAAK;QACZ,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC;SACD,GAAG,CAAC,UAAC,KAAK,IAAK,OAAA,gBAAgB,CAAC,KAAK,CAAC,EAAvB,CAAuB,CAAC,CAAC;IAE3C,IAAM,MAAM,GACV,uBAAuB,CAAC;IAE1B,OAAO,MAAM,CAAC,SAAS,CAAC,UAAC,KAAsD;QAC7E,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { AllWindowObservables } from '../autocapture-plugin';\nimport { ElementBasedEvent, ElementBasedTimestampedEvent, type evaluateTriggersFn } from '../helpers';\nimport { Observable, BrowserClient } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nexport function trackClicks({\n amplitude,\n allObservables,\n shouldTrackEvent,\n evaluateTriggers,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n shouldTrackEvent: shouldTrackEvent;\n evaluateTriggers: evaluateTriggersFn;\n}) {\n const { clickObservable } = allObservables;\n\n const clickObservableFiltered = clickObservable\n .filter(filterOutNonTrackableEvents)\n .filter((click) => {\n // Only track clicks on elements that should be tracked,\n return shouldTrackEvent('click', click.closestTrackedAncestor);\n })\n .map((click) => evaluateTriggers(click));\n\n const clicks: Observable<typeof clickObservableFiltered extends Observable<infer U> ? U : never> =\n clickObservableFiltered;\n\n return clicks.subscribe((click: ElementBasedTimestampedEvent<ElementBasedEvent>) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CLICKED_EVENT, click.targetElementProperties);\n });\n}\n"]}
1
+ {"version":3,"file":"track-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,2BAA2B,EAAoB,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAE/D,MAAM,UAAU,WAAW,CAAC,EAU3B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,gBAAgB,sBAAA,EAChB,gBAAgB,sBAAA;IAOR,IAAA,eAAe,GAAK,cAAc,gBAAnB,CAAoB;IAE3C,IAAM,uBAAuB,GAAG,eAAe;SAC5C,MAAM,CAAC,2BAA2B,CAAC;SACnC,MAAM,CAAC,UAAC,KAA+C;QACtD,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC;SACD,GAAG,CAAC,UAAC,KAA+C,IAAK,OAAA,gBAAgB,CAAC,KAAK,CAAC,EAAvB,CAAuB,CAAC,CAAC;IAErF,IAAM,MAAM,GACV,uBAAuB,CAAC;IAE1B,OAAO,MAAM,CAAC,SAAS,CAAC,UAAC,KAAsD;QAC7E,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { AllWindowObservables } from '../autocapture-plugin';\nimport { ElementBasedEvent, type ElementBasedTimestampedEvent, type evaluateTriggersFn } from '../helpers';\nimport { Observable, BrowserClient } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nexport function trackClicks({\n amplitude,\n allObservables,\n shouldTrackEvent,\n evaluateTriggers,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n shouldTrackEvent: shouldTrackEvent;\n evaluateTriggers: evaluateTriggersFn;\n}) {\n const { clickObservable } = allObservables;\n\n const clickObservableFiltered = clickObservable\n .filter(filterOutNonTrackableEvents)\n .filter((click: ElementBasedTimestampedEvent<MouseEvent>) => {\n // Only track clicks on elements that should be tracked,\n return shouldTrackEvent('click', click.closestTrackedAncestor);\n })\n .map((click: ElementBasedTimestampedEvent<MouseEvent>) => evaluateTriggers(click));\n\n const clicks: Observable<typeof clickObservableFiltered extends Observable<infer U> ? U : never> =\n clickObservableFiltered;\n\n return clicks.subscribe((click: ElementBasedTimestampedEvent<ElementBasedEvent>) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CLICKED_EVENT, click.targetElementProperties);\n });\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { AllWindowObservables } from '../autocapture-plugin';
2
+ import { DataExtractor } from '../data-extractor';
3
+ export declare function trackExposure({ allObservables, onExposure, dataExtractor, exposureDuration, }: {
4
+ allObservables: AllWindowObservables;
5
+ onExposure: (elementPath: string) => void;
6
+ dataExtractor: DataExtractor;
7
+ exposureDuration?: number;
8
+ }): {
9
+ unsubscribe: () => void;
10
+ reset: () => void;
11
+ };
12
+ //# sourceMappingURL=track-exposure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-exposure.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-exposure.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,wBAAgB,aAAa,CAAC,EAC5B,cAAc,EACd,UAAU,EACV,aAAa,EACb,gBAA4C,GAC7C,EAAE;IACD,cAAc,EAAE,oBAAoB,CAAC;IACrC,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;;;EAsDA"}
@@ -0,0 +1,52 @@
1
+ /* eslint-disable no-restricted-globals */
2
+ import { DEFAULT_EXPOSURE_DURATION } from '@amplitude/analytics-core';
3
+ export function trackExposure(_a) {
4
+ var allObservables = _a.allObservables, onExposure = _a.onExposure, dataExtractor = _a.dataExtractor, _b = _a.exposureDuration, exposureDuration = _b === void 0 ? DEFAULT_EXPOSURE_DURATION : _b;
5
+ // Track which elements have been marked as exposed (per-element state)
6
+ var exposureMap = new Map();
7
+ // Track active timers for elements that are currently visible but not yet exposed
8
+ var exposureTimerMap = new Map();
9
+ var exposureObservable = allObservables.exposureObservable;
10
+ var exposureSubscription = exposureObservable.subscribe(function (event) {
11
+ var entry = event;
12
+ var element = entry.target;
13
+ if (entry.isIntersecting) {
14
+ // Element became visible - start exposure timer if not already exposed
15
+ if (!exposureMap.get(element)) {
16
+ var timer = setTimeout(function () {
17
+ // Element has been visible for exposureDuration - mark as exposed
18
+ exposureMap.set(element, true);
19
+ // Record the CSS selector path in the shared exposure state
20
+ var elementPath = dataExtractor.getElementPath(element);
21
+ onExposure(elementPath);
22
+ // Clear the timer reference
23
+ exposureTimerMap.set(element, null);
24
+ }, exposureDuration);
25
+ exposureTimerMap.set(element, timer);
26
+ }
27
+ }
28
+ else if (!entry.isIntersecting && entry.intersectionRatio < 1.0) {
29
+ // Element left viewport - cancel exposure timer if one exists
30
+ var timer = exposureTimerMap.get(element);
31
+ if (timer) {
32
+ clearTimeout(timer);
33
+ exposureTimerMap.set(element, null);
34
+ }
35
+ }
36
+ });
37
+ return {
38
+ unsubscribe: function () {
39
+ exposureSubscription.unsubscribe();
40
+ },
41
+ reset: function () {
42
+ exposureTimerMap.forEach(function (timer) {
43
+ if (timer) {
44
+ clearTimeout(timer);
45
+ }
46
+ });
47
+ exposureTimerMap.clear();
48
+ exposureMap.clear();
49
+ },
50
+ };
51
+ }
52
+ //# sourceMappingURL=track-exposure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-exposure.js","sourceRoot":"","sources":["../../../src/autocapture/track-exposure.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAItE,MAAM,UAAU,aAAa,CAAC,EAU7B;QATC,cAAc,oBAAA,EACd,UAAU,gBAAA,EACV,aAAa,mBAAA,EACb,wBAA4C,EAA5C,gBAAgB,mBAAG,yBAAyB,KAAA;IAO5C,uEAAuE;IACvE,IAAM,WAAW,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEhD,kFAAkF;IAClF,IAAM,gBAAgB,GAAG,IAAI,GAAG,EAA6D,CAAC;IAEtF,IAAA,kBAAkB,GAAK,cAAc,mBAAnB,CAAoB;IAE9C,IAAM,oBAAoB,GAAG,kBAAkB,CAAC,SAAS,CAAC,UAAC,KAAK;QAC9D,IAAM,KAAK,GAAG,KAA6C,CAAC;QAC5D,IAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;QAE7B,IAAI,KAAK,CAAC,cAAc,EAAE;YACxB,uEAAuE;YACvE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;gBAC7B,IAAM,KAAK,GAAG,UAAU,CAAC;oBACvB,kEAAkE;oBAClE,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBAE/B,4DAA4D;oBAC5D,IAAM,WAAW,GAAG,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;oBAC1D,UAAU,CAAC,WAAW,CAAC,CAAC;oBAExB,4BAA4B;oBAC5B,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACtC,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBAErB,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;aACtC;SACF;aAAM,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,iBAAiB,GAAG,GAAG,EAAE;YACjE,8DAA8D;YAC9D,IAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAI,KAAK,EAAE;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;aACrC;SACF;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,WAAW,EAAE;YACX,oBAAoB,CAAC,WAAW,EAAE,CAAC;QACrC,CAAC;QACD,KAAK,EAAE;YACL,gBAAgB,CAAC,OAAO,CAAC,UAAC,KAAK;gBAC7B,IAAI,KAAK,EAAE;oBACT,YAAY,CAAC,KAAK,CAAC,CAAC;iBACrB;YACH,CAAC,CAAC,CAAC;YACH,gBAAgB,CAAC,KAAK,EAAE,CAAC;YACzB,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { DEFAULT_EXPOSURE_DURATION } from '@amplitude/analytics-core';\nimport { AllWindowObservables } from '../autocapture-plugin';\nimport { DataExtractor } from '../data-extractor';\n\nexport function trackExposure({\n allObservables,\n onExposure,\n dataExtractor,\n exposureDuration = DEFAULT_EXPOSURE_DURATION,\n}: {\n allObservables: AllWindowObservables;\n onExposure: (elementPath: string) => void;\n dataExtractor: DataExtractor;\n exposureDuration?: number;\n}) {\n // Track which elements have been marked as exposed (per-element state)\n const exposureMap = new Map<Element, boolean>();\n\n // Track active timers for elements that are currently visible but not yet exposed\n const exposureTimerMap = new Map<Element, ReturnType<typeof setTimeout> | null | undefined>();\n\n const { exposureObservable } = allObservables;\n\n const exposureSubscription = exposureObservable.subscribe((event) => {\n const entry = event as unknown as IntersectionObserverEntry;\n const element = entry.target;\n\n if (entry.isIntersecting) {\n // Element became visible - start exposure timer if not already exposed\n if (!exposureMap.get(element)) {\n const timer = setTimeout(() => {\n // Element has been visible for exposureDuration - mark as exposed\n exposureMap.set(element, true);\n\n // Record the CSS selector path in the shared exposure state\n const elementPath = dataExtractor.getElementPath(element);\n onExposure(elementPath);\n\n // Clear the timer reference\n exposureTimerMap.set(element, null);\n }, exposureDuration);\n\n exposureTimerMap.set(element, timer);\n }\n } else if (!entry.isIntersecting && entry.intersectionRatio < 1.0) {\n // Element left viewport - cancel exposure timer if one exists\n const timer = exposureTimerMap.get(element);\n if (timer) {\n clearTimeout(timer);\n exposureTimerMap.set(element, null);\n }\n }\n });\n\n return {\n unsubscribe: () => {\n exposureSubscription.unsubscribe();\n },\n reset: () => {\n exposureTimerMap.forEach((timer) => {\n if (timer) {\n clearTimeout(timer);\n }\n });\n exposureTimerMap.clear();\n exposureMap.clear();\n },\n };\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { AllWindowObservables } from '../autocapture-plugin';
2
+ import { BrowserClient } from '@amplitude/analytics-core';
3
+ export interface ScrollState {
4
+ maxX: number;
5
+ maxY: number;
6
+ }
7
+ export declare function trackScroll({ amplitude, allObservables, }: {
8
+ amplitude: BrowserClient;
9
+ allObservables: AllWindowObservables;
10
+ }): {
11
+ unsubscribe: () => void;
12
+ getState: () => ScrollState;
13
+ reset: () => void;
14
+ };
15
+ //# sourceMappingURL=track-scroll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-scroll.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAkB,MAAM,2BAA2B,CAAC;AAE1E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,GACf,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;CACtC;;;;EA6BA"}
@@ -0,0 +1,30 @@
1
+ import { getGlobalScope } from '@amplitude/analytics-core';
2
+ export function trackScroll(_a) {
3
+ var amplitude = _a.amplitude, allObservables = _a.allObservables;
4
+ // amplitude is reserved for future periodic scroll event tracking
5
+ void amplitude;
6
+ var scrollObservable = allObservables.scrollObservable;
7
+ var state = { maxX: 0, maxY: 0 };
8
+ var scrollSubscription = scrollObservable.subscribe(function () {
9
+ var _a, _b, _c, _d;
10
+ var globalScope = getGlobalScope();
11
+ /* istanbul ignore next */
12
+ var currentX = Math.floor((_b = (_a = globalScope === null || globalScope === void 0 ? void 0 : globalScope.scrollX) !== null && _a !== void 0 ? _a : globalScope === null || globalScope === void 0 ? void 0 : globalScope.pageXOffset) !== null && _b !== void 0 ? _b : 0);
13
+ /* istanbul ignore next */
14
+ var currentY = Math.floor((_d = (_c = globalScope === null || globalScope === void 0 ? void 0 : globalScope.scrollY) !== null && _c !== void 0 ? _c : globalScope === null || globalScope === void 0 ? void 0 : globalScope.pageYOffset) !== null && _d !== void 0 ? _d : 0);
15
+ // Update page-level max positions for Page View End event (never resets during page lifetime)
16
+ state.maxX = Math.max(state.maxX, currentX);
17
+ state.maxY = Math.max(state.maxY, currentY);
18
+ });
19
+ return {
20
+ unsubscribe: function () {
21
+ scrollSubscription.unsubscribe();
22
+ },
23
+ getState: function () { return state; },
24
+ reset: function () {
25
+ state.maxX = 0;
26
+ state.maxY = 0;
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=track-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-scroll.js","sourceRoot":"","sources":["../../../src/autocapture/track-scroll.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAO1E,MAAM,UAAU,WAAW,CAAC,EAM3B;QALC,SAAS,eAAA,EACT,cAAc,oBAAA;IAKd,kEAAkE;IAClE,KAAK,SAAS,CAAC;IAEP,IAAA,gBAAgB,GAAK,cAAc,iBAAnB,CAAoB;IAC5C,IAAM,KAAK,GAAgB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAEhD,IAAM,kBAAkB,GAAG,gBAAgB,CAAC,SAAS,CAAC;;QACpD,IAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QACrC,0BAA0B;QAC1B,IAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAA,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,mCAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,WAAW,mCAAI,CAAC,CAAC,CAAC;QACnF,0BAA0B;QAC1B,IAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAA,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,mCAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,WAAW,mCAAI,CAAC,CAAC,CAAC;QAEnF,8FAA8F;QAC9F,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,WAAW,EAAE;YACX,kBAAkB,CAAC,WAAW,EAAE,CAAC;QACnC,CAAC;QACD,QAAQ,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;QACrB,KAAK,EAAE;YACL,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { AllWindowObservables } from '../autocapture-plugin';\nimport { BrowserClient, getGlobalScope } from '@amplitude/analytics-core';\n\nexport interface ScrollState {\n maxX: number;\n maxY: number;\n}\n\nexport function trackScroll({\n amplitude,\n allObservables,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n}) {\n // amplitude is reserved for future periodic scroll event tracking\n void amplitude;\n\n const { scrollObservable } = allObservables;\n const state: ScrollState = { maxX: 0, maxY: 0 };\n\n const scrollSubscription = scrollObservable.subscribe(() => {\n const globalScope = getGlobalScope();\n /* istanbul ignore next */\n const currentX = Math.floor(globalScope?.scrollX ?? globalScope?.pageXOffset ?? 0);\n /* istanbul ignore next */\n const currentY = Math.floor(globalScope?.scrollY ?? globalScope?.pageYOffset ?? 0);\n\n // Update page-level max positions for Page View End event (never resets during page lifetime)\n state.maxX = Math.max(state.maxX, currentX);\n state.maxY = Math.max(state.maxY, currentY);\n });\n\n return {\n unsubscribe: () => {\n scrollSubscription.unsubscribe();\n },\n getState: () => state,\n reset: () => {\n state.maxX = 0;\n state.maxY = 0;\n },\n };\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { BrowserClient } from '@amplitude/analytics-core';
2
+ export interface ScrollTracker {
3
+ getState: () => {
4
+ maxX: number;
5
+ maxY: number;
6
+ };
7
+ reset: () => void;
8
+ }
9
+ export interface ExposureTracker {
10
+ reset: () => void;
11
+ }
12
+ export declare function fireViewportContentUpdated({ amplitude, scrollTracker, currentElementExposed, elementExposedForPage, exposureTracker, isPageEnd, lastScroll, }: {
13
+ amplitude: BrowserClient;
14
+ scrollTracker: ScrollTracker;
15
+ currentElementExposed: Set<string>;
16
+ elementExposedForPage: Set<string>;
17
+ exposureTracker: ExposureTracker | undefined;
18
+ isPageEnd: boolean;
19
+ lastScroll: {
20
+ maxX: undefined | number;
21
+ maxY: undefined | number;
22
+ };
23
+ }): void;
24
+ export declare function onExposure(elementPath: string, elementExposedForPage: Set<string>, currentElementExposed: Set<string>, fireViewportContentUpdatedCallback: (isPageEnd: boolean) => void): void;
25
+ //# sourceMappingURL=track-viewport-content-updated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-viewport-content-updated.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-viewport-content-updated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,MAAM,2BAA2B,CAAC;AAI1E,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,0BAA0B,CAAC,EACzC,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,SAAS,EACT,UAAU,GACX,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,qBAAqB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,qBAAqB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE;QAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAA;KAAE,CAAC;CACpE,GAAG,IAAI,CAqDP;AAED,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,qBAAqB,EAAE,GAAG,CAAC,MAAM,CAAC,EAClC,qBAAqB,EAAE,GAAG,CAAC,MAAM,CAAC,EAClC,kCAAkC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,QAejE"}