@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.
- package/lib/cjs/autocapture/track-click.d.ts +2 -2
- package/lib/cjs/autocapture/track-click.d.ts.map +1 -1
- package/lib/cjs/autocapture/track-click.js.map +1 -1
- package/lib/cjs/autocapture/track-exposure.d.ts +11 -0
- package/lib/cjs/autocapture/track-exposure.d.ts.map +1 -0
- package/lib/cjs/autocapture/track-exposure.js +56 -0
- package/lib/cjs/autocapture/track-exposure.js.map +1 -0
- package/lib/cjs/autocapture/track-scroll.d.ts +15 -0
- package/lib/cjs/autocapture/track-scroll.d.ts.map +1 -0
- package/lib/cjs/autocapture/track-scroll.js +34 -0
- package/lib/cjs/autocapture/track-scroll.js.map +1 -0
- package/lib/cjs/autocapture/track-viewport-content-updated.d.ts +25 -0
- package/lib/cjs/autocapture/track-viewport-content-updated.d.ts.map +1 -0
- package/lib/cjs/autocapture/track-viewport-content-updated.js +65 -0
- package/lib/cjs/autocapture/track-viewport-content-updated.js.map +1 -0
- package/lib/cjs/autocapture-plugin.d.ts +5 -1
- package/lib/cjs/autocapture-plugin.d.ts.map +1 -1
- package/lib/cjs/autocapture-plugin.js +104 -8
- package/lib/cjs/autocapture-plugin.js.map +1 -1
- package/lib/cjs/constants.d.ts +7 -0
- package/lib/cjs/constants.d.ts.map +1 -1
- package/lib/cjs/constants.js +9 -1
- package/lib/cjs/constants.js.map +1 -1
- package/lib/cjs/data-extractor.d.ts +1 -0
- package/lib/cjs/data-extractor.d.ts.map +1 -1
- package/lib/cjs/data-extractor.js +17 -0
- package/lib/cjs/data-extractor.js.map +1 -1
- package/lib/cjs/helpers.d.ts +1 -0
- package/lib/cjs/helpers.d.ts.map +1 -1
- package/lib/cjs/helpers.js +22 -1
- package/lib/cjs/helpers.js.map +1 -1
- package/lib/cjs/libs/element-path.d.ts +2 -0
- package/lib/cjs/libs/element-path.d.ts.map +1 -0
- package/lib/cjs/libs/element-path.js +177 -0
- package/lib/cjs/libs/element-path.js.map +1 -0
- package/lib/cjs/observables.d.ts +3 -0
- package/lib/cjs/observables.d.ts.map +1 -1
- package/lib/cjs/observables.js +56 -3
- package/lib/cjs/observables.js.map +1 -1
- package/lib/cjs/version.d.ts +1 -1
- package/lib/cjs/version.d.ts.map +1 -1
- package/lib/cjs/version.js +1 -1
- package/lib/cjs/version.js.map +1 -1
- package/lib/esm/autocapture/track-click.d.ts +2 -2
- package/lib/esm/autocapture/track-click.d.ts.map +1 -1
- package/lib/esm/autocapture/track-click.js.map +1 -1
- package/lib/esm/autocapture/track-exposure.d.ts +11 -0
- package/lib/esm/autocapture/track-exposure.d.ts.map +1 -0
- package/lib/esm/autocapture/track-exposure.js +52 -0
- package/lib/esm/autocapture/track-exposure.js.map +1 -0
- package/lib/esm/autocapture/track-scroll.d.ts +15 -0
- package/lib/esm/autocapture/track-scroll.d.ts.map +1 -0
- package/lib/esm/autocapture/track-scroll.js +30 -0
- package/lib/esm/autocapture/track-scroll.js.map +1 -0
- package/lib/esm/autocapture/track-viewport-content-updated.d.ts +25 -0
- package/lib/esm/autocapture/track-viewport-content-updated.d.ts.map +1 -0
- package/lib/esm/autocapture/track-viewport-content-updated.js +59 -0
- package/lib/esm/autocapture/track-viewport-content-updated.js.map +1 -0
- package/lib/esm/autocapture-plugin.d.ts +5 -1
- package/lib/esm/autocapture-plugin.d.ts.map +1 -1
- package/lib/esm/autocapture-plugin.js +105 -9
- package/lib/esm/autocapture-plugin.js.map +1 -1
- package/lib/esm/constants.d.ts +7 -0
- package/lib/esm/constants.d.ts.map +1 -1
- package/lib/esm/constants.js +8 -0
- package/lib/esm/constants.js.map +1 -1
- package/lib/esm/data-extractor.d.ts +1 -0
- package/lib/esm/data-extractor.d.ts.map +1 -1
- package/lib/esm/data-extractor.js +18 -1
- package/lib/esm/data-extractor.js.map +1 -1
- package/lib/esm/helpers.d.ts +1 -0
- package/lib/esm/helpers.d.ts.map +1 -1
- package/lib/esm/helpers.js +21 -1
- package/lib/esm/helpers.js.map +1 -1
- package/lib/esm/libs/element-path.d.ts +2 -0
- package/lib/esm/libs/element-path.d.ts.map +1 -0
- package/lib/esm/libs/element-path.js +173 -0
- package/lib/esm/libs/element-path.js.map +1 -0
- package/lib/esm/observables.d.ts +3 -0
- package/lib/esm/observables.d.ts.map +1 -1
- package/lib/esm/observables.js +53 -2
- package/lib/esm/observables.js.map +1 -1
- package/lib/esm/version.d.ts +1 -1
- package/lib/esm/version.d.ts.map +1 -1
- package/lib/esm/version.js +1 -1
- package/lib/esm/version.js.map +1 -1
- package/lib/scripts/amplitude-min.js +1 -1
- package/lib/scripts/amplitude-min.js.gz +0 -0
- package/lib/scripts/amplitude-min.js.map +1 -1
- package/lib/scripts/amplitude-min.umd.js +1 -1
- package/lib/scripts/amplitude-min.umd.js.gz +0 -0
- package/lib/scripts/autocapture/track-click.d.ts +2 -2
- package/lib/scripts/autocapture/track-click.d.ts.map +1 -1
- package/lib/scripts/autocapture/track-exposure.d.ts +11 -0
- package/lib/scripts/autocapture/track-exposure.d.ts.map +1 -0
- package/lib/scripts/autocapture/track-scroll.d.ts +15 -0
- package/lib/scripts/autocapture/track-scroll.d.ts.map +1 -0
- package/lib/scripts/autocapture/track-viewport-content-updated.d.ts +25 -0
- package/lib/scripts/autocapture/track-viewport-content-updated.d.ts.map +1 -0
- package/lib/scripts/autocapture-plugin.d.ts +5 -1
- package/lib/scripts/autocapture-plugin.d.ts.map +1 -1
- package/lib/scripts/constants.d.ts +7 -0
- package/lib/scripts/constants.d.ts.map +1 -1
- package/lib/scripts/data-extractor.d.ts +1 -0
- package/lib/scripts/data-extractor.d.ts.map +1 -1
- package/lib/scripts/helpers.d.ts +1 -0
- package/lib/scripts/helpers.d.ts.map +1 -1
- package/lib/scripts/libs/element-path.d.ts +2 -0
- package/lib/scripts/libs/element-path.d.ts.map +1 -0
- package/lib/scripts/observables.d.ts +3 -0
- package/lib/scripts/observables.d.ts.map +1 -1
- package/lib/scripts/version.d.ts +1 -1
- package/lib/scripts/version.d.ts.map +1 -1
- package/package.json +2 -2
- package/lib/cjs/libs/finder.d.ts +0 -13
- package/lib/cjs/libs/finder.d.ts.map +0 -1
- package/lib/cjs/libs/finder.js +0 -348
- package/lib/cjs/libs/finder.js.map +0 -1
- package/lib/esm/libs/finder.d.ts +0 -13
- package/lib/esm/libs/finder.d.ts.map +0 -1
- package/lib/esm/libs/finder.js +0 -344
- package/lib/esm/libs/finder.js.map +0 -1
- package/lib/scripts/libs/finder.d.ts +0 -13
- package/lib/scripts/libs/finder.d.ts.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AllWindowObservables } from '
|
|
2
|
-
import { type evaluateTriggersFn } from '
|
|
1
|
+
import { AllWindowObservables } from '../autocapture-plugin';
|
|
2
|
+
import { type evaluateTriggersFn } from '../helpers';
|
|
3
3
|
import { BrowserClient } from '@amplitude/analytics-core';
|
|
4
4
|
import { shouldTrackEvent } from '../helpers';
|
|
5
5
|
export declare function trackClicks({ amplitude, allObservables, shouldTrackEvent, evaluateTriggers, }: {
|
|
@@ -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,
|
|
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,EAAE,KAAK,kBAAkB,EAAqC,MAAM,YAAY,CAAC;AACxF,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,sCAA2E;AAC3E,0CAA+D;AAE/D,SAAgB,WAAW,CAAC,EAU3B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,gBAAgB,sBAAA,EAChB,gBAAgB,sBAAA;IAOR,IAAA,eAAe,GAAK,cAAc,gBAAnB,CAAoB;IAE3C,IAAM,uBAAuB,GAAG,eAAe;SAC5C,MAAM,CAAC,qCAA2B,CAAC;SACnC,MAAM,CAAC,UAAC,
|
|
1
|
+
{"version":3,"file":"track-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":";;;AAGA,sCAA2E;AAC3E,0CAA+D;AAE/D,SAAgB,WAAW,CAAC,EAU3B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,gBAAgB,sBAAA,EAChB,gBAAgB,sBAAA;IAOR,IAAA,eAAe,GAAK,cAAc,gBAAnB,CAAoB;IAE3C,IAAM,uBAAuB,GAAG,eAAe;SAC5C,MAAM,CAAC,qCAA2B,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,KAAK;QAC5B,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,2CAA+B,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC;AA5BD,kCA4BC","sourcesContent":["import { AllWindowObservables } from '../autocapture-plugin';\nimport { type evaluateTriggersFn, type ElementBasedTimestampedEvent } 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) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CLICKED_EVENT, click.targetElementProperties);\n });\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AllWindowObservables } from '../autocapture-plugin';
|
|
2
|
+
import { DataExtractor } from '../data-extractor';
|
|
3
|
+
export declare function trackExposure({ allObservables, onExposure, dataExtractor, }: {
|
|
4
|
+
allObservables: AllWindowObservables;
|
|
5
|
+
onExposure: (elementPath: string) => void;
|
|
6
|
+
dataExtractor: DataExtractor;
|
|
7
|
+
}): {
|
|
8
|
+
unsubscribe: () => void;
|
|
9
|
+
reset: () => void;
|
|
10
|
+
};
|
|
11
|
+
//# 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":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKlD,wBAAgB,aAAa,CAAC,EAC5B,cAAc,EACd,UAAU,EACV,aAAa,GACd,EAAE;IACD,cAAc,EAAE,oBAAoB,CAAC;IACrC,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,aAAa,EAAE,aAAa,CAAC;CAC9B;;;EAsDA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.trackExposure = void 0;
|
|
4
|
+
// Element must be visible for 2 seconds to count as "exposed"
|
|
5
|
+
var EXPOSURE_TIMEOUT = 2000;
|
|
6
|
+
function trackExposure(_a) {
|
|
7
|
+
var allObservables = _a.allObservables, onExposure = _a.onExposure, dataExtractor = _a.dataExtractor;
|
|
8
|
+
// Track which elements have been marked as exposed (per-element state)
|
|
9
|
+
var exposureMap = new Map();
|
|
10
|
+
// Track active timers for elements that are currently visible but not yet exposed
|
|
11
|
+
var exposureTimerMap = new Map();
|
|
12
|
+
var exposureObservable = allObservables.exposureObservable;
|
|
13
|
+
var exposureSubscription = exposureObservable.subscribe(function (event) {
|
|
14
|
+
var entry = event;
|
|
15
|
+
var element = entry.target;
|
|
16
|
+
if (entry.isIntersecting) {
|
|
17
|
+
// Element became visible - start exposure timer if not already exposed
|
|
18
|
+
if (!exposureMap.get(element)) {
|
|
19
|
+
var timer = setTimeout(function () {
|
|
20
|
+
// Element has been visible for EXPOSURE_TIMEOUT - mark as exposed
|
|
21
|
+
exposureMap.set(element, true);
|
|
22
|
+
// Record the CSS selector path in the shared exposure state
|
|
23
|
+
var elementPath = dataExtractor.getElementPath(element);
|
|
24
|
+
onExposure(elementPath);
|
|
25
|
+
// Clear the timer reference
|
|
26
|
+
exposureTimerMap.set(element, null);
|
|
27
|
+
}, EXPOSURE_TIMEOUT);
|
|
28
|
+
exposureTimerMap.set(element, timer);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (!entry.isIntersecting && entry.intersectionRatio < 1.0) {
|
|
32
|
+
// Element left viewport - cancel exposure timer if one exists
|
|
33
|
+
var timer = exposureTimerMap.get(element);
|
|
34
|
+
if (timer) {
|
|
35
|
+
clearTimeout(timer);
|
|
36
|
+
exposureTimerMap.set(element, null);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
unsubscribe: function () {
|
|
42
|
+
exposureSubscription.unsubscribe();
|
|
43
|
+
},
|
|
44
|
+
reset: function () {
|
|
45
|
+
exposureTimerMap.forEach(function (timer) {
|
|
46
|
+
if (timer) {
|
|
47
|
+
clearTimeout(timer);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
exposureTimerMap.clear();
|
|
51
|
+
exposureMap.clear();
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
exports.trackExposure = trackExposure;
|
|
56
|
+
//# sourceMappingURL=track-exposure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-exposure.js","sourceRoot":"","sources":["../../../src/autocapture/track-exposure.ts"],"names":[],"mappings":";;;AAIA,8DAA8D;AAC9D,IAAM,gBAAgB,GAAG,IAAK,CAAC;AAE/B,SAAgB,aAAa,CAAC,EAQ7B;QAPC,cAAc,oBAAA,EACd,UAAU,gBAAA,EACV,aAAa,mBAAA;IAMb,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;AA9DD,sCA8DC","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { AllWindowObservables } from '../autocapture-plugin';\nimport { DataExtractor } from '../data-extractor';\n\n// Element must be visible for 2 seconds to count as \"exposed\"\nconst EXPOSURE_TIMEOUT = 2_000;\n\nexport function trackExposure({\n allObservables,\n onExposure,\n dataExtractor,\n}: {\n allObservables: AllWindowObservables;\n onExposure: (elementPath: string) => void;\n dataExtractor: DataExtractor;\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 EXPOSURE_TIMEOUT - 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 }, EXPOSURE_TIMEOUT);\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,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.trackScroll = void 0;
|
|
4
|
+
var analytics_core_1 = require("@amplitude/analytics-core");
|
|
5
|
+
function trackScroll(_a) {
|
|
6
|
+
var amplitude = _a.amplitude, allObservables = _a.allObservables;
|
|
7
|
+
// amplitude is reserved for future periodic scroll event tracking
|
|
8
|
+
void amplitude;
|
|
9
|
+
var scrollObservable = allObservables.scrollObservable;
|
|
10
|
+
var state = { maxX: 0, maxY: 0 };
|
|
11
|
+
var scrollSubscription = scrollObservable.subscribe(function () {
|
|
12
|
+
var _a, _b, _c, _d;
|
|
13
|
+
var globalScope = (0, analytics_core_1.getGlobalScope)();
|
|
14
|
+
/* istanbul ignore next */
|
|
15
|
+
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);
|
|
16
|
+
/* istanbul ignore next */
|
|
17
|
+
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);
|
|
18
|
+
// Update page-level max positions for Page View End event (never resets during page lifetime)
|
|
19
|
+
state.maxX = Math.max(state.maxX, currentX);
|
|
20
|
+
state.maxY = Math.max(state.maxY, currentY);
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
unsubscribe: function () {
|
|
24
|
+
scrollSubscription.unsubscribe();
|
|
25
|
+
},
|
|
26
|
+
getState: function () { return state; },
|
|
27
|
+
reset: function () {
|
|
28
|
+
state.maxX = 0;
|
|
29
|
+
state.maxY = 0;
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
exports.trackScroll = trackScroll;
|
|
34
|
+
//# 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,4DAA0E;AAO1E,SAAgB,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,IAAA,+BAAc,GAAE,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;AAnCD,kCAmCC","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,CA8CP;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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.onExposure = exports.fireViewportContentUpdated = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var analytics_core_1 = require("@amplitude/analytics-core");
|
|
6
|
+
var constants = tslib_1.__importStar(require("../constants"));
|
|
7
|
+
var helpers_1 = require("../helpers");
|
|
8
|
+
function fireViewportContentUpdated(_a) {
|
|
9
|
+
var _b;
|
|
10
|
+
var _c;
|
|
11
|
+
var amplitude = _a.amplitude, scrollTracker = _a.scrollTracker, currentElementExposed = _a.currentElementExposed, elementExposedForPage = _a.elementExposedForPage, exposureTracker = _a.exposureTracker, isPageEnd = _a.isPageEnd, lastScroll = _a.lastScroll;
|
|
12
|
+
var pageScrollMaxState = scrollTracker.getState();
|
|
13
|
+
var globalScope = (0, analytics_core_1.getGlobalScope)();
|
|
14
|
+
var eventProperties = (_b = {},
|
|
15
|
+
_b[constants.AMPLITUDE_EVENT_PROP_PAGE_URL] =
|
|
16
|
+
/* istanbul ignore next */
|
|
17
|
+
(_c = globalScope === null || globalScope === void 0 ? void 0 : globalScope.location) === null || _c === void 0 ? void 0 : _c.href,
|
|
18
|
+
_b[constants.AMPLITUDE_EVENT_PROP_MAX_PAGE_X] = pageScrollMaxState.maxX,
|
|
19
|
+
_b[constants.AMPLITUDE_EVENT_PROP_MAX_PAGE_Y] = pageScrollMaxState.maxY,
|
|
20
|
+
_b[constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT] =
|
|
21
|
+
/* istanbul ignore next */
|
|
22
|
+
globalScope === null || globalScope === void 0 ? void 0 : globalScope.innerHeight,
|
|
23
|
+
_b[constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH] =
|
|
24
|
+
/* istanbul ignore next */
|
|
25
|
+
globalScope === null || globalScope === void 0 ? void 0 : globalScope.innerWidth,
|
|
26
|
+
_b['[Amplitude] Element Exposed'] = Array.from(currentElementExposed),
|
|
27
|
+
_b);
|
|
28
|
+
var pageViewId = (0, helpers_1.getCurrentPageViewId)();
|
|
29
|
+
if (pageViewId) {
|
|
30
|
+
eventProperties[constants.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID] = pageViewId;
|
|
31
|
+
}
|
|
32
|
+
// If elements exposed is empty and max scroll is same as last event, don't track
|
|
33
|
+
if (currentElementExposed.size === 0 &&
|
|
34
|
+
pageScrollMaxState.maxX === lastScroll.maxX &&
|
|
35
|
+
pageScrollMaxState.maxY === lastScroll.maxY) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
/* istanbul ignore next */
|
|
39
|
+
amplitude === null || amplitude === void 0 ? void 0 : amplitude.track('[Amplitude] Viewport Content Updated', eventProperties);
|
|
40
|
+
lastScroll = { maxX: pageScrollMaxState.maxX, maxY: pageScrollMaxState.maxY };
|
|
41
|
+
// Clear current batch
|
|
42
|
+
currentElementExposed.clear();
|
|
43
|
+
if (isPageEnd) {
|
|
44
|
+
// Reset state for next page view
|
|
45
|
+
scrollTracker.reset();
|
|
46
|
+
elementExposedForPage.clear();
|
|
47
|
+
exposureTracker === null || exposureTracker === void 0 ? void 0 : exposureTracker.reset();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.fireViewportContentUpdated = fireViewportContentUpdated;
|
|
51
|
+
function onExposure(elementPath, elementExposedForPage, currentElementExposed, fireViewportContentUpdatedCallback) {
|
|
52
|
+
if (elementExposedForPage.has(elementPath)) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
elementExposedForPage.add(elementPath);
|
|
56
|
+
currentElementExposed.add(elementPath);
|
|
57
|
+
// Check if current set size exceeds 18k chars
|
|
58
|
+
var exposedArray = Array.from(currentElementExposed);
|
|
59
|
+
var exposedString = JSON.stringify(exposedArray);
|
|
60
|
+
if (exposedString.length >= constants.MAX_ELEMENT_EXPOSED_STR_LENGTH) {
|
|
61
|
+
fireViewportContentUpdatedCallback(false);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.onExposure = onExposure;
|
|
65
|
+
//# sourceMappingURL=track-viewport-content-updated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-viewport-content-updated.js","sourceRoot":"","sources":["../../../src/autocapture/track-viewport-content-updated.ts"],"names":[],"mappings":";;;;AAAA,4DAA0E;AAC1E,8DAA0C;AAC1C,sCAAkD;AAWlD,SAAgB,0BAA0B,CAAC,EAgB1C;;;QAfC,SAAS,eAAA,EACT,aAAa,mBAAA,EACb,qBAAqB,2BAAA,EACrB,qBAAqB,2BAAA,EACrB,eAAe,qBAAA,EACf,SAAS,eAAA,EACT,UAAU,gBAAA;IAUV,IAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;IACpD,IAAM,WAAW,GAAG,IAAA,+BAAc,GAAE,CAAC;IAErC,IAAM,eAAe;QACnB,GAAC,SAAS,CAAC,6BAA6B;QACtC,0BAA0B;QAC1B,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,QAAQ,0CAAE,IAAI;QAC7B,GAAC,SAAS,CAAC,+BAA+B,IAAG,kBAAkB,CAAC,IAAI;QACpE,GAAC,SAAS,CAAC,+BAA+B,IAAG,kBAAkB,CAAC,IAAI;QACpE,GAAC,SAAS,CAAC,oCAAoC;QAC7C,0BAA0B;QAC1B,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,WAAW;QAC1B,GAAC,SAAS,CAAC,mCAAmC;QAC5C,0BAA0B;QAC1B,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,UAAU;QACzB,iCAA6B,GAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC;WACjE,CAAC;IAEF,IAAM,UAAU,GAAG,IAAA,8BAAoB,GAAE,CAAC;IAC1C,IAAI,UAAU,EAAE;QACd,eAAe,CAAC,SAAS,CAAC,iCAAiC,CAAC,GAAG,UAAU,CAAC;KAC3E;IAED,iFAAiF;IACjF,IACE,qBAAqB,CAAC,IAAI,KAAK,CAAC;QAChC,kBAAkB,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI;QAC3C,kBAAkB,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,EAC3C;QACA,OAAO;KACR;IAED,0BAA0B;IAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,sCAAsC,EAAE,eAAe,CAAC,CAAC;IAC1E,UAAU,GAAG,EAAE,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC;IAE9E,sBAAsB;IACtB,qBAAqB,CAAC,KAAK,EAAE,CAAC;IAE9B,IAAI,SAAS,EAAE;QACb,iCAAiC;QACjC,aAAa,CAAC,KAAK,EAAE,CAAC;QACtB,qBAAqB,CAAC,KAAK,EAAE,CAAC;QAC9B,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,KAAK,EAAE,CAAC;KAC1B;AACH,CAAC;AA9DD,gEA8DC;AAED,SAAgB,UAAU,CACxB,WAAmB,EACnB,qBAAkC,EAClC,qBAAkC,EAClC,kCAAgE;IAEhE,IAAI,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;QAC1C,OAAO;KACR;IACD,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvC,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAEvC,8CAA8C;IAC9C,IAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACvD,IAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAEnD,IAAI,aAAa,CAAC,MAAM,IAAI,SAAS,CAAC,8BAA8B,EAAE;QACpE,kCAAkC,CAAC,KAAK,CAAC,CAAC;KAC3C;AACH,CAAC;AAnBD,gCAmBC","sourcesContent":["import { BrowserClient, getGlobalScope } from '@amplitude/analytics-core';\nimport * as constants from '../constants';\nimport { getCurrentPageViewId } from '../helpers';\n\nexport interface ScrollTracker {\n getState: () => { maxX: number; maxY: number };\n reset: () => void;\n}\n\nexport interface ExposureTracker {\n reset: () => void;\n}\n\nexport function fireViewportContentUpdated({\n amplitude,\n scrollTracker,\n currentElementExposed,\n elementExposedForPage,\n exposureTracker,\n isPageEnd,\n lastScroll,\n}: {\n amplitude: BrowserClient;\n scrollTracker: ScrollTracker;\n currentElementExposed: Set<string>;\n elementExposedForPage: Set<string>;\n exposureTracker: ExposureTracker | undefined;\n isPageEnd: boolean;\n lastScroll: { maxX: undefined | number; maxY: undefined | number };\n}): void {\n const pageScrollMaxState = scrollTracker.getState();\n const globalScope = getGlobalScope();\n\n const eventProperties: Record<string, unknown> = {\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]:\n /* istanbul ignore next */\n globalScope?.location?.href,\n [constants.AMPLITUDE_EVENT_PROP_MAX_PAGE_X]: pageScrollMaxState.maxX,\n [constants.AMPLITUDE_EVENT_PROP_MAX_PAGE_Y]: pageScrollMaxState.maxY,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]:\n /* istanbul ignore next */\n globalScope?.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]:\n /* istanbul ignore next */\n globalScope?.innerWidth,\n '[Amplitude] Element Exposed': Array.from(currentElementExposed),\n };\n\n const pageViewId = getCurrentPageViewId();\n if (pageViewId) {\n eventProperties[constants.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID] = pageViewId;\n }\n\n // If elements exposed is empty and max scroll is same as last event, don't track\n if (\n currentElementExposed.size === 0 &&\n pageScrollMaxState.maxX === lastScroll.maxX &&\n pageScrollMaxState.maxY === lastScroll.maxY\n ) {\n return;\n }\n\n /* istanbul ignore next */\n amplitude?.track('[Amplitude] Viewport Content Updated', eventProperties);\n lastScroll = { maxX: pageScrollMaxState.maxX, maxY: pageScrollMaxState.maxY };\n\n // Clear current batch\n currentElementExposed.clear();\n\n if (isPageEnd) {\n // Reset state for next page view\n scrollTracker.reset();\n elementExposedForPage.clear();\n exposureTracker?.reset();\n }\n}\n\nexport function onExposure(\n elementPath: string,\n elementExposedForPage: Set<string>,\n currentElementExposed: Set<string>,\n fireViewportContentUpdatedCallback: (isPageEnd: boolean) => void,\n) {\n if (elementExposedForPage.has(elementPath)) {\n return;\n }\n elementExposedForPage.add(elementPath);\n currentElementExposed.add(elementPath);\n\n // Check if current set size exceeds 18k chars\n const exposedArray = Array.from(currentElementExposed);\n const exposedString = JSON.stringify(exposedArray);\n\n if (exposedString.length >= constants.MAX_ELEMENT_EXPOSED_STR_LENGTH) {\n fireViewportContentUpdatedCallback(false);\n }\n}\n"]}
|
|
@@ -16,13 +16,17 @@ export declare enum ObservablesEnum {
|
|
|
16
16
|
ClickObservable = "clickObservable",
|
|
17
17
|
ChangeObservable = "changeObservable",
|
|
18
18
|
NavigateObservable = "navigateObservable",
|
|
19
|
-
MutationObservable = "mutationObservable"
|
|
19
|
+
MutationObservable = "mutationObservable",
|
|
20
|
+
ScrollObservable = "scrollObservable",
|
|
21
|
+
ExposureObservable = "exposureObservable"
|
|
20
22
|
}
|
|
21
23
|
export interface AllWindowObservables {
|
|
22
24
|
[ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;
|
|
23
25
|
[ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;
|
|
24
26
|
[ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;
|
|
25
27
|
[ObservablesEnum.NavigateObservable]?: Observable<TimestampedEvent<NavigateEvent>>;
|
|
28
|
+
[ObservablesEnum.ScrollObservable]: Observable<Event>;
|
|
29
|
+
[ObservablesEnum.ExposureObservable]: Observable<Event>;
|
|
26
30
|
}
|
|
27
31
|
export declare const autocapturePlugin: (options?: ElementInteractionsOptions, context?: {
|
|
28
32
|
diagnosticsClient: IDiagnosticsClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAI/B,kBAAkB,EAGnB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAEL,KAAK,4BAA4B,EACjC,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,0BAA0B,EAI/B,kBAAkB,EAGnB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAEL,KAAK,4BAA4B,EACjC,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;AAoBnB,OAAO,EAAE,UAAU,EAAkB,MAAM,2BAA2B,CAAC;AAIvE,KAAK,cAAc,GAAG;IACpB,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kCAAkC,KAAK,IAAI,CAAC;IACvF,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kCAAkC,KAAK,IAAI,CAAC;CAC3F,CAAC;AAEF,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,UAAU,EAAE,cAAc,CAAC;KAC5B;CACF;AAED,KAAK,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE9E,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CACnD,IAAI,CAAC,0BAA0B,EAAE,cAAc,GAAG,sBAAsB,GAAG,sBAAsB,CAAC,CACnG,GACC,0BAA0B,CAAC;AAE7B,oBAAY,eAAe;IACzB,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IACrC,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;IACzC,gBAAgB,qBAAqB;IACrC,kBAAkB,uBAAuB;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpF,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC;IACxF,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;IACnF,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;CACzD;AAED,eAAO,MAAM,iBAAiB,aACnB,0BAA0B,YACzB;IAAE,iBAAiB,EAAE,kBAAkB,CAAA;CAAE,KAClD,uBAqXF,CAAC"}
|
|
@@ -11,17 +11,21 @@ var messenger_1 = require("./libs/messenger");
|
|
|
11
11
|
var track_click_1 = require("./autocapture/track-click");
|
|
12
12
|
var track_change_1 = require("./autocapture/track-change");
|
|
13
13
|
var track_action_click_1 = require("./autocapture/track-action-click");
|
|
14
|
+
var track_scroll_1 = require("./autocapture/track-scroll");
|
|
14
15
|
var observables_1 = require("./observables");
|
|
15
16
|
var triggers_1 = require("./pageActions/triggers");
|
|
16
17
|
var data_extractor_1 = require("./data-extractor");
|
|
17
18
|
var analytics_core_2 = require("@amplitude/analytics-core");
|
|
19
|
+
var track_exposure_1 = require("./autocapture/track-exposure");
|
|
20
|
+
var track_viewport_content_updated_1 = require("./autocapture/track-viewport-content-updated");
|
|
18
21
|
var ObservablesEnum;
|
|
19
22
|
(function (ObservablesEnum) {
|
|
20
23
|
ObservablesEnum["ClickObservable"] = "clickObservable";
|
|
21
24
|
ObservablesEnum["ChangeObservable"] = "changeObservable";
|
|
22
|
-
// ErrorObservable = 'errorObservable',
|
|
23
25
|
ObservablesEnum["NavigateObservable"] = "navigateObservable";
|
|
24
26
|
ObservablesEnum["MutationObservable"] = "mutationObservable";
|
|
27
|
+
ObservablesEnum["ScrollObservable"] = "scrollObservable";
|
|
28
|
+
ObservablesEnum["ExposureObservable"] = "exposureObservable";
|
|
25
29
|
})(ObservablesEnum = exports.ObservablesEnum || (exports.ObservablesEnum = {}));
|
|
26
30
|
var autocapturePlugin = function (options, context) {
|
|
27
31
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
@@ -57,9 +61,13 @@ var autocapturePlugin = function (options, context) {
|
|
|
57
61
|
var name = constants.PLUGIN_NAME;
|
|
58
62
|
var type = 'enrichment';
|
|
59
63
|
var subscriptions = [];
|
|
60
|
-
// Create data extractor based on options
|
|
61
64
|
var dataExtractor = new data_extractor_1.DataExtractor(options, context);
|
|
62
|
-
//
|
|
65
|
+
// Page-level state shared across trackers, emitted in a single Page View End event on beforeunload
|
|
66
|
+
// elementExposedForPage holds the total set of elements seen during the entire page view lifetime
|
|
67
|
+
var elementExposedForPage = new Set();
|
|
68
|
+
// currentElementExposed only holds the set of elements that will be flushed during the next [Amplitude] Viewport Content Updated event
|
|
69
|
+
var currentElementExposed = new Set();
|
|
70
|
+
var beforeUnloadCleanup;
|
|
63
71
|
var createObservables = function () {
|
|
64
72
|
var _a;
|
|
65
73
|
var clickObservable = (0, analytics_core_1.multicast)((0, observables_1.createClickObservable)().map(function (click) {
|
|
@@ -76,10 +84,6 @@ var autocapturePlugin = function (options, context) {
|
|
|
76
84
|
/* istanbul ignore next */
|
|
77
85
|
return function () { var _a; return (_a = (0, analytics_core_1.getGlobalScope)()) === null || _a === void 0 ? void 0 : _a.document.removeEventListener('change', handler); };
|
|
78
86
|
}));
|
|
79
|
-
// Create Observable from unhandled errors
|
|
80
|
-
// const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(
|
|
81
|
-
// map((error) => addAdditionalEventProperties(error, 'error')),
|
|
82
|
-
// );
|
|
83
87
|
// Create observable for URL changes
|
|
84
88
|
var navigateObservable;
|
|
85
89
|
/* istanbul ignore next */
|
|
@@ -98,12 +102,16 @@ var autocapturePlugin = function (options, context) {
|
|
|
98
102
|
var mutationObservable = (0, analytics_core_1.multicast)((0, observables_1.createMutationObservable)().map(function (mutation) {
|
|
99
103
|
return dataExtractor.addAdditionalEventProperties(mutation, 'mutation', options.cssSelectorAllowlist, dataAttributePrefix);
|
|
100
104
|
}));
|
|
105
|
+
var scrollObservable = (0, observables_1.createScrollObservable)();
|
|
106
|
+
var exposureObservable = (0, observables_1.createExposureObservable)(mutationObservable, options.cssSelectorAllowlist);
|
|
101
107
|
return _a = {},
|
|
102
108
|
_a[ObservablesEnum.ChangeObservable] = changeObservable,
|
|
103
109
|
// [ObservablesEnum.ErrorObservable]: errorObservable,
|
|
104
110
|
_a[ObservablesEnum.ClickObservable] = clickObservable,
|
|
105
111
|
_a[ObservablesEnum.MutationObservable] = mutationObservable,
|
|
106
112
|
_a[ObservablesEnum.NavigateObservable] = navigateObservable,
|
|
113
|
+
_a[ObservablesEnum.ScrollObservable] = scrollObservable,
|
|
114
|
+
_a[ObservablesEnum.ExposureObservable] = exposureObservable,
|
|
107
115
|
_a;
|
|
108
116
|
};
|
|
109
117
|
// Group labeled events by event type (eg. click, change)
|
|
@@ -125,13 +133,15 @@ var autocapturePlugin = function (options, context) {
|
|
|
125
133
|
}
|
|
126
134
|
};
|
|
127
135
|
var setup = function (config, amplitude) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
128
|
-
var shouldTrackEvent, shouldTrackActionClick, allObservables, clickTrackingSubscription, changeSubscription, actionClickSubscription, allowlist, actionClickAllowlist;
|
|
136
|
+
var pageViewEndFired, lastScroll, shouldTrackEvent, shouldTrackActionClick, allObservables, clickTrackingSubscription, changeSubscription, actionClickSubscription, scrollTracker, trackers, globalScope, handleViewportContentUpdated, handleExposure, beforeUnloadHandler, navigateObservable, popstateHandler_1, originalPushState_1, allowlist, actionClickAllowlist;
|
|
129
137
|
var _a, _b;
|
|
130
138
|
return tslib_1.__generator(this, function (_c) {
|
|
131
139
|
/* istanbul ignore if */
|
|
132
140
|
if (typeof document === 'undefined') {
|
|
133
141
|
return [2 /*return*/];
|
|
134
142
|
}
|
|
143
|
+
pageViewEndFired = false;
|
|
144
|
+
lastScroll = { maxX: undefined, maxY: undefined };
|
|
135
145
|
// Fetch remote config for pageActions in a non-blocking manner
|
|
136
146
|
if (config.fetchRemoteConfig) {
|
|
137
147
|
if (!config.remoteConfigClient) {
|
|
@@ -185,6 +195,92 @@ var autocapturePlugin = function (options, context) {
|
|
|
185
195
|
if (actionClickSubscription) {
|
|
186
196
|
subscriptions.push(actionClickSubscription);
|
|
187
197
|
}
|
|
198
|
+
scrollTracker = (0, track_scroll_1.trackScroll)({
|
|
199
|
+
allObservables: allObservables,
|
|
200
|
+
amplitude: amplitude,
|
|
201
|
+
});
|
|
202
|
+
subscriptions.push(scrollTracker);
|
|
203
|
+
trackers = {};
|
|
204
|
+
globalScope = (0, analytics_core_1.getGlobalScope)();
|
|
205
|
+
handleViewportContentUpdated = function (isPageEnd) {
|
|
206
|
+
if (isPageEnd && pageViewEndFired) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
setTimeout(function () {
|
|
210
|
+
pageViewEndFired = false;
|
|
211
|
+
}, 100);
|
|
212
|
+
pageViewEndFired = true;
|
|
213
|
+
(0, track_viewport_content_updated_1.fireViewportContentUpdated)({
|
|
214
|
+
amplitude: amplitude,
|
|
215
|
+
scrollTracker: scrollTracker,
|
|
216
|
+
currentElementExposed: currentElementExposed,
|
|
217
|
+
elementExposedForPage: elementExposedForPage,
|
|
218
|
+
exposureTracker: trackers.exposure,
|
|
219
|
+
isPageEnd: isPageEnd,
|
|
220
|
+
lastScroll: lastScroll,
|
|
221
|
+
});
|
|
222
|
+
};
|
|
223
|
+
handleExposure = function (elementPath) {
|
|
224
|
+
(0, track_viewport_content_updated_1.onExposure)(elementPath, elementExposedForPage, currentElementExposed, handleViewportContentUpdated);
|
|
225
|
+
};
|
|
226
|
+
trackers.exposure = (0, track_exposure_1.trackExposure)({
|
|
227
|
+
allObservables: allObservables,
|
|
228
|
+
onExposure: handleExposure,
|
|
229
|
+
dataExtractor: dataExtractor,
|
|
230
|
+
});
|
|
231
|
+
if (trackers.exposure) {
|
|
232
|
+
subscriptions.push(trackers.exposure);
|
|
233
|
+
}
|
|
234
|
+
beforeUnloadHandler = function () {
|
|
235
|
+
console.log('amp: beforeUnload');
|
|
236
|
+
handleViewportContentUpdated(true);
|
|
237
|
+
};
|
|
238
|
+
/* istanbul ignore next */
|
|
239
|
+
globalScope === null || globalScope === void 0 ? void 0 : globalScope.addEventListener('beforeunload', beforeUnloadHandler);
|
|
240
|
+
beforeUnloadCleanup = function () {
|
|
241
|
+
/* istanbul ignore next */
|
|
242
|
+
globalScope === null || globalScope === void 0 ? void 0 : globalScope.removeEventListener('beforeunload', beforeUnloadHandler);
|
|
243
|
+
};
|
|
244
|
+
// Ensure cleanup on teardown as well
|
|
245
|
+
subscriptions.push({ unsubscribe: function () { return beforeUnloadCleanup(); } });
|
|
246
|
+
navigateObservable = allObservables[ObservablesEnum.NavigateObservable];
|
|
247
|
+
if (navigateObservable) {
|
|
248
|
+
subscriptions.push(navigateObservable.subscribe(function () {
|
|
249
|
+
console.log('amp: navigate');
|
|
250
|
+
handleViewportContentUpdated(true);
|
|
251
|
+
}));
|
|
252
|
+
}
|
|
253
|
+
else if (globalScope) {
|
|
254
|
+
popstateHandler_1 = function () {
|
|
255
|
+
console.log('amp: popstate');
|
|
256
|
+
handleViewportContentUpdated(true);
|
|
257
|
+
};
|
|
258
|
+
/* istanbul ignore next */
|
|
259
|
+
// Fallback for SPA tracking when Navigation API is not available
|
|
260
|
+
globalScope.addEventListener('popstate', popstateHandler_1);
|
|
261
|
+
originalPushState_1 = globalScope.history.pushState;
|
|
262
|
+
if (globalScope.history && originalPushState_1) {
|
|
263
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
264
|
+
globalScope.history.pushState = new Proxy(originalPushState_1, {
|
|
265
|
+
apply: function (target, thisArg, _a) {
|
|
266
|
+
var _b = tslib_1.__read(_a, 3), state = _b[0], unused = _b[1], url = _b[2];
|
|
267
|
+
console.log('amp: pushState');
|
|
268
|
+
target.apply(thisArg, [state, unused, url]);
|
|
269
|
+
handleViewportContentUpdated(true);
|
|
270
|
+
},
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
subscriptions.push({
|
|
274
|
+
unsubscribe: function () {
|
|
275
|
+
/* istanbul ignore next */
|
|
276
|
+
globalScope.removeEventListener('popstate', popstateHandler_1);
|
|
277
|
+
/* istanbul ignore next */
|
|
278
|
+
if (globalScope.history && originalPushState_1) {
|
|
279
|
+
globalScope.history.pushState = originalPushState_1;
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
}
|
|
188
284
|
/* istanbul ignore next */
|
|
189
285
|
(_a = config === null || config === void 0 ? void 0 : config.loggerProvider) === null || _a === void 0 ? void 0 : _a.log("".concat(name, " has been successfully added."));
|
|
190
286
|
// Setup visual tagging selector
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocapture-plugin.js","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n type BrowserClient,\n type BrowserConfig,\n type EnrichmentPlugin,\n type ElementInteractionsOptions,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n IDiagnosticsClient,\n getGlobalScope,\n multicast,\n} from '@amplitude/analytics-core';\nimport { VERSION } from './version';\nimport * as constants from './constants';\nimport {\n createShouldTrackEvent,\n type ElementBasedTimestampedEvent,\n type TimestampedEvent,\n type NavigateEvent,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport { createClickObservable, createMutationObservable } from './observables';\n\nimport {\n createLabeledEventToTriggerMap,\n createTriggerEvaluator,\n groupLabeledEventIdsByEventType,\n} from './pageActions/triggers';\nimport { DataExtractor } from './data-extractor';\nimport { Observable, Unsubscribable } from '@amplitude/analytics-core';\n\ntype NavigationType = {\n addEventListener: (type: string, listener: EventListenerOrEventListenerObject) => void;\n removeEventListener: (type: string, listener: EventListenerOrEventListenerObject) => void;\n};\n\ndeclare global {\n interface Window {\n navigation: NavigationType;\n }\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport enum ObservablesEnum {\n ClickObservable = 'clickObservable',\n ChangeObservable = 'changeObservable',\n // ErrorObservable = 'errorObservable',\n NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n}\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;\n // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n [ObservablesEnum.NavigateObservable]?: Observable<TimestampedEvent<NavigateEvent>>;\n}\n\nexport const autocapturePlugin = (\n options: ElementInteractionsOptions = {},\n context?: { diagnosticsClient: IDiagnosticsClient },\n): BrowserEnrichmentPlugin => {\n // Set the plugin version tag\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n context?.diagnosticsClient.setTag('plugin.autocapture.version', VERSION);\n\n const {\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0;\n\n options.pageUrlExcludelist = options.pageUrlExcludelist?.reduce(\n (acc: (string | RegExp | { pattern: string })[], excludePattern) => {\n if (typeof excludePattern === 'string') {\n acc.push(excludePattern);\n }\n if (excludePattern instanceof RegExp) {\n acc.push(excludePattern);\n }\n if (typeof excludePattern === 'object' && excludePattern !== null && 'pattern' in excludePattern) {\n try {\n acc.push(new RegExp(excludePattern.pattern));\n } catch (regexError) {\n console.warn(`Invalid regex pattern: ${excludePattern.pattern}`, regexError);\n return acc;\n }\n }\n return acc;\n },\n [],\n );\n\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Unsubscribable[] = [];\n\n // Create data extractor based on options\n const dataExtractor = new DataExtractor(options, context);\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n const clickObservable = multicast(\n createClickObservable().map(\n (click) =>\n dataExtractor.addAdditionalEventProperties(\n click,\n 'click',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ) as ElementBasedTimestampedEvent<MouseEvent>,\n ),\n );\n\n const changeObservable = multicast(\n new Observable<ElementBasedTimestampedEvent<Event>>((observer) => {\n const handler = (changeEvent: Event) => {\n const enrichedChangeEvent = dataExtractor.addAdditionalEventProperties(\n changeEvent,\n 'change',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ) as ElementBasedTimestampedEvent<Event>;\n observer.next(enrichedChangeEvent);\n };\n /* istanbul ignore next */\n getGlobalScope()?.document.addEventListener('change', handler, { capture: true });\n /* istanbul ignore next */\n return () => getGlobalScope()?.document.removeEventListener('change', handler);\n }),\n );\n\n // Create Observable from unhandled errors\n // const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(\n // map((error) => addAdditionalEventProperties(error, 'error')),\n // );\n\n // Create observable for URL changes\n let navigateObservable: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = multicast(\n new Observable<TimestampedEvent<NavigateEvent>>((observer) => {\n const handler = (navigateEvent: NavigateEvent) => {\n const enrichedNavigateEvent = dataExtractor.addAdditionalEventProperties(\n navigateEvent,\n 'navigate',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n );\n observer.next(enrichedNavigateEvent);\n };\n window.navigation.addEventListener('navigate', handler as EventListener);\n return () => {\n window.navigation.removeEventListener('navigate', handler as EventListener);\n };\n }),\n );\n }\n\n const mutationObservable = multicast(\n createMutationObservable().map((mutation) =>\n dataExtractor.addAdditionalEventProperties(\n mutation,\n 'mutation',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n );\n\n return {\n [ObservablesEnum.ChangeObservable]: changeObservable,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n [ObservablesEnum.ClickObservable]: clickObservable,\n [ObservablesEnum.MutationObservable]: mutationObservable,\n [ObservablesEnum.NavigateObservable]: navigateObservable,\n };\n };\n\n // Group labeled events by event type (eg. click, change)\n let groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions?.labeledEvents ?? {}));\n\n let labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions?.triggers ?? []);\n\n // Evaluate triggers for the given event by running the actions associated with the matching triggers\n const evaluateTriggers = createTriggerEvaluator(\n groupedLabeledEvents,\n labeledEventToTriggerMap,\n dataExtractor,\n options,\n );\n\n // Function to recalculate internal variables when remote config is updated\n const recomputePageActionsData = (remotePageActions: ElementInteractionsOptions['pageActions']) => {\n if (remotePageActions) {\n // Merge remote config with local options\n options.pageActions = {\n ...options.pageActions,\n ...remotePageActions,\n };\n\n // Recalculate internal variables\n groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions.labeledEvents ?? {}));\n labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions.triggers ?? []);\n\n // Update evaluateTriggers function\n evaluateTriggers.update(groupedLabeledEvents, labeledEventToTriggerMap, options);\n }\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Fetch remote config for pageActions in a non-blocking manner\n if (config.fetchRemoteConfig) {\n if (!config.remoteConfigClient) {\n // TODO(xinyi): Diagnostics.recordEvent\n config.loggerProvider.debug('Remote config client is not provided, skipping remote config fetch');\n } else {\n config.remoteConfigClient.subscribe('analyticsSDK.pageActions', 'all', (remoteConfig) => {\n recomputePageActionsData(remoteConfig as ElementInteractionsOptions['pageActions']);\n });\n }\n }\n\n // Create should track event functions the different allowlists\n const shouldTrackEvent = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n const shouldTrackActionClick = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist,\n );\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions\n const clickTrackingSubscription = trackClicks({\n allObservables,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n if (actionClickSubscription) {\n subscriptions.push(actionClickSubscription);\n }\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n dataExtractor: dataExtractor,\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"autocapture-plugin.js","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n type BrowserClient,\n type BrowserConfig,\n type EnrichmentPlugin,\n type ElementInteractionsOptions,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n IDiagnosticsClient,\n getGlobalScope,\n multicast,\n} from '@amplitude/analytics-core';\nimport { VERSION } from './version';\nimport * as constants from './constants';\nimport {\n createShouldTrackEvent,\n type ElementBasedTimestampedEvent,\n type TimestampedEvent,\n type NavigateEvent,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport { trackScroll } from './autocapture/track-scroll';\n\nimport {\n createClickObservable,\n createScrollObservable,\n createExposureObservable,\n createMutationObservable,\n} from './observables';\n\nimport {\n createLabeledEventToTriggerMap,\n createTriggerEvaluator,\n groupLabeledEventIdsByEventType,\n} from './pageActions/triggers';\nimport { DataExtractor } from './data-extractor';\nimport { Observable, Unsubscribable } from '@amplitude/analytics-core';\nimport { trackExposure } from './autocapture/track-exposure';\nimport { fireViewportContentUpdated, onExposure, ExposureTracker } from './autocapture/track-viewport-content-updated';\n\ntype NavigationType = {\n addEventListener: (type: string, listener: EventListenerOrEventListenerObject) => void;\n removeEventListener: (type: string, listener: EventListenerOrEventListenerObject) => void;\n};\n\ndeclare global {\n interface Window {\n navigation: NavigationType;\n }\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport enum ObservablesEnum {\n ClickObservable = 'clickObservable',\n ChangeObservable = 'changeObservable',\n NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n ScrollObservable = 'scrollObservable',\n ExposureObservable = 'exposureObservable',\n}\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;\n // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n [ObservablesEnum.NavigateObservable]?: Observable<TimestampedEvent<NavigateEvent>>;\n [ObservablesEnum.ScrollObservable]: Observable<Event>; // TODO: add type for scroll event\n [ObservablesEnum.ExposureObservable]: Observable<Event>;\n}\n\nexport const autocapturePlugin = (\n options: ElementInteractionsOptions = {},\n context?: { diagnosticsClient: IDiagnosticsClient },\n): BrowserEnrichmentPlugin => {\n // Set the plugin version tag\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n context?.diagnosticsClient.setTag('plugin.autocapture.version', VERSION);\n\n const {\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0;\n\n options.pageUrlExcludelist = options.pageUrlExcludelist?.reduce(\n (acc: (string | RegExp | { pattern: string })[], excludePattern) => {\n if (typeof excludePattern === 'string') {\n acc.push(excludePattern);\n }\n if (excludePattern instanceof RegExp) {\n acc.push(excludePattern);\n }\n if (typeof excludePattern === 'object' && excludePattern !== null && 'pattern' in excludePattern) {\n try {\n acc.push(new RegExp(excludePattern.pattern));\n } catch (regexError) {\n console.warn(`Invalid regex pattern: ${excludePattern.pattern}`, regexError);\n return acc;\n }\n }\n return acc;\n },\n [],\n );\n\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Unsubscribable[] = [];\n\n const dataExtractor = new DataExtractor(options, context);\n\n // Page-level state shared across trackers, emitted in a single Page View End event on beforeunload\n // elementExposedForPage holds the total set of elements seen during the entire page view lifetime\n const elementExposedForPage = new Set<string>();\n // currentElementExposed only holds the set of elements that will be flushed during the next [Amplitude] Viewport Content Updated event\n const currentElementExposed = new Set<string>();\n\n let beforeUnloadCleanup: () => void;\n\n const createObservables = (): AllWindowObservables => {\n const clickObservable = multicast(\n createClickObservable().map(\n (click) =>\n dataExtractor.addAdditionalEventProperties(\n click,\n 'click',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ) as ElementBasedTimestampedEvent<MouseEvent>,\n ),\n );\n\n const changeObservable = multicast(\n new Observable<ElementBasedTimestampedEvent<Event>>((observer) => {\n const handler = (changeEvent: Event) => {\n const enrichedChangeEvent = dataExtractor.addAdditionalEventProperties(\n changeEvent,\n 'change',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ) as ElementBasedTimestampedEvent<Event>;\n observer.next(enrichedChangeEvent);\n };\n /* istanbul ignore next */\n getGlobalScope()?.document.addEventListener('change', handler, { capture: true });\n /* istanbul ignore next */\n return () => getGlobalScope()?.document.removeEventListener('change', handler);\n }),\n );\n\n // Create observable for URL changes\n let navigateObservable: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = multicast(\n new Observable<TimestampedEvent<NavigateEvent>>((observer) => {\n const handler = (navigateEvent: NavigateEvent) => {\n const enrichedNavigateEvent = dataExtractor.addAdditionalEventProperties(\n navigateEvent,\n 'navigate',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n );\n observer.next(enrichedNavigateEvent);\n };\n window.navigation.addEventListener('navigate', handler as EventListener);\n return () => {\n window.navigation.removeEventListener('navigate', handler as EventListener);\n };\n }),\n );\n }\n\n const mutationObservable = multicast(\n createMutationObservable().map((mutation) =>\n dataExtractor.addAdditionalEventProperties(\n mutation,\n 'mutation',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n );\n\n const scrollObservable = createScrollObservable();\n\n const exposureObservable = createExposureObservable(\n mutationObservable,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n\n return {\n [ObservablesEnum.ChangeObservable]: changeObservable,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n [ObservablesEnum.ClickObservable]: clickObservable,\n [ObservablesEnum.MutationObservable]: mutationObservable,\n [ObservablesEnum.NavigateObservable]: navigateObservable,\n [ObservablesEnum.ScrollObservable]: scrollObservable,\n [ObservablesEnum.ExposureObservable]: exposureObservable,\n };\n };\n\n // Group labeled events by event type (eg. click, change)\n let groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions?.labeledEvents ?? {}));\n\n let labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions?.triggers ?? []);\n\n // Evaluate triggers for the given event by running the actions associated with the matching triggers\n const evaluateTriggers = createTriggerEvaluator(\n groupedLabeledEvents,\n labeledEventToTriggerMap,\n dataExtractor,\n options,\n );\n\n // Function to recalculate internal variables when remote config is updated\n const recomputePageActionsData = (remotePageActions: ElementInteractionsOptions['pageActions']) => {\n if (remotePageActions) {\n // Merge remote config with local options\n options.pageActions = {\n ...options.pageActions,\n ...remotePageActions,\n };\n\n // Recalculate internal variables\n groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions.labeledEvents ?? {}));\n labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions.triggers ?? []);\n\n // Update evaluateTriggers function\n evaluateTriggers.update(groupedLabeledEvents, labeledEventToTriggerMap, options);\n }\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n let pageViewEndFired = false;\n const lastScroll: { maxX: undefined | number; maxY: undefined | number } = { maxX: undefined, maxY: undefined };\n\n // Fetch remote config for pageActions in a non-blocking manner\n if (config.fetchRemoteConfig) {\n if (!config.remoteConfigClient) {\n // TODO(xinyi): Diagnostics.recordEvent\n config.loggerProvider.debug('Remote config client is not provided, skipping remote config fetch');\n } else {\n config.remoteConfigClient.subscribe('analyticsSDK.pageActions', 'all', (remoteConfig) => {\n recomputePageActionsData(remoteConfig as ElementInteractionsOptions['pageActions']);\n });\n }\n }\n\n // Create should track event functions the different allowlists\n const shouldTrackEvent = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n const shouldTrackActionClick = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist,\n );\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions\n const clickTrackingSubscription = trackClicks({\n allObservables,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n if (actionClickSubscription) {\n subscriptions.push(actionClickSubscription);\n }\n\n const scrollTracker = trackScroll({\n allObservables,\n amplitude,\n });\n subscriptions.push(scrollTracker);\n\n const trackers: { exposure?: ExposureTracker & Unsubscribable } = {};\n\n const globalScope = getGlobalScope();\n\n const handleViewportContentUpdated = (isPageEnd: boolean) => {\n if (isPageEnd && pageViewEndFired) {\n return;\n }\n setTimeout(() => {\n pageViewEndFired = false;\n }, 100);\n\n pageViewEndFired = true;\n fireViewportContentUpdated({\n amplitude,\n scrollTracker,\n currentElementExposed,\n elementExposedForPage,\n exposureTracker: trackers.exposure,\n isPageEnd,\n lastScroll,\n });\n };\n\n const handleExposure = (elementPath: string) => {\n onExposure(elementPath, elementExposedForPage, currentElementExposed, handleViewportContentUpdated);\n };\n\n trackers.exposure = trackExposure({\n allObservables,\n onExposure: handleExposure,\n dataExtractor,\n });\n if (trackers.exposure) {\n subscriptions.push(trackers.exposure);\n }\n\n const beforeUnloadHandler = () => {\n console.log('amp: beforeUnload');\n handleViewportContentUpdated(true);\n };\n /* istanbul ignore next */\n globalScope?.addEventListener('beforeunload', beforeUnloadHandler);\n beforeUnloadCleanup = () => {\n /* istanbul ignore next */\n globalScope?.removeEventListener('beforeunload', beforeUnloadHandler);\n };\n // Ensure cleanup on teardown as well\n subscriptions.push({ unsubscribe: () => beforeUnloadCleanup() });\n\n // Also track on navigation (SPA)\n const navigateObservable = allObservables[ObservablesEnum.NavigateObservable];\n if (navigateObservable) {\n subscriptions.push(\n navigateObservable.subscribe(() => {\n console.log('amp: navigate');\n handleViewportContentUpdated(true);\n }),\n );\n } else if (globalScope) {\n const popstateHandler = () => {\n console.log('amp: popstate');\n handleViewportContentUpdated(true);\n };\n /* istanbul ignore next */\n // Fallback for SPA tracking when Navigation API is not available\n globalScope.addEventListener('popstate', popstateHandler);\n\n /* istanbul ignore next */\n // There is no global browser listener for changes to history, so we have\n // to modify pushState directly.\n // https://stackoverflow.com/a/64927639\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalPushState = globalScope.history.pushState;\n if (globalScope.history && originalPushState) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n globalScope.history.pushState = new Proxy(originalPushState, {\n apply: (target, thisArg, [state, unused, url]) => {\n console.log('amp: pushState');\n target.apply(thisArg, [state, unused, url]);\n handleViewportContentUpdated(true);\n },\n });\n }\n\n subscriptions.push({\n unsubscribe: () => {\n /* istanbul ignore next */\n globalScope.removeEventListener('popstate', popstateHandler);\n /* istanbul ignore next */\n if (globalScope.history && originalPushState) {\n globalScope.history.pushState = originalPushState;\n }\n },\n });\n }\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n dataExtractor: dataExtractor,\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
|