@amplitude/plugin-autocapture-browser 1.23.7 → 1.24.1
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.map +1 -1
- package/lib/cjs/autocapture/track-click.js.map +1 -1
- package/lib/cjs/autocapture/track-exposure.d.ts +12 -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-thrashed-cursor.js +1 -1
- package/lib/cjs/autocapture/track-thrashed-cursor.js.map +1 -1
- 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 +71 -0
- package/lib/cjs/autocapture/track-viewport-content-updated.js.map +1 -0
- package/lib/cjs/autocapture-plugin.d.ts +4 -0
- package/lib/cjs/autocapture-plugin.d.ts.map +1 -1
- package/lib/cjs/autocapture-plugin.js +109 -14
- 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 +19 -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 +70 -3
- package/lib/cjs/observables.js.map +1 -1
- package/lib/cjs/version.d.ts +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.map +1 -1
- package/lib/esm/autocapture/track-click.js.map +1 -1
- package/lib/esm/autocapture/track-exposure.d.ts +12 -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-thrashed-cursor.js +1 -1
- package/lib/esm/autocapture/track-thrashed-cursor.js.map +1 -1
- 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 +65 -0
- package/lib/esm/autocapture/track-viewport-content-updated.js.map +1 -0
- package/lib/esm/autocapture-plugin.d.ts +4 -0
- package/lib/esm/autocapture-plugin.d.ts.map +1 -1
- package/lib/esm/autocapture-plugin.js +111 -16
- 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 +20 -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 +67 -2
- package/lib/esm/observables.js.map +1 -1
- package/lib/esm/version.d.ts +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.map +1 -1
- package/lib/scripts/autocapture/track-exposure.d.ts +12 -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 +4 -0
- 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/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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-thrashed-cursor.js","sourceRoot":"","sources":["../../../src/autocapture/track-thrashed-cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAElG,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO1C,IAAK,SAGJ;AAHD,WAAK,SAAS;IACZ,sCAAyB,CAAA;IACzB,sCAAyB,CAAA;AAC3B,CAAC,EAHI,SAAS,KAAT,SAAS,QAGb;AAED,IAAK,IAGJ;AAHD,WAAK,IAAI;IACP,eAAO,CAAA;IACP,eAAO,CAAA;AACT,CAAC,EAHI,IAAI,KAAJ,IAAI,QAGR;AAED,MAAM,CAAC,IAAM,oCAAoC,GAAG,UAAC,EAIpD;QAHC,oBAAoB,0BAAA;IAIZ,IAAA,mBAAmB,GAAK,oBAAoB,oBAAzB,CAA0B;IACrD,OAAO,IAAI,UAAU,CAAO,UAAC,QAAQ;QACnC,IAAI,YAAY,GAAoB,IAAI,CAAC;QACzC,IAAI,UAAU,GAAqB,IAAI,CAAC;QACxC,IAAI,UAAU,GAAqB,IAAI,CAAC;QACxC,OAAO,mBAAmB,CAAC,SAAS,CAAC,UAAC,KAAK;YACzC,IAAM,eAAe,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;YAC/D,IAAI,YAAY,KAAK,IAAI,EAAE;gBACzB,YAAY,GAAG,eAAe,CAAC;gBAC/B,OAAO;aACR;YACD,IAAI,eAAe,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE;gBACtC,IAAI,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE;oBACvC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBACvB;gBACD,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;aACnC;iBAAM,IAAI,eAAe,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE;gBAC7C,IAAI,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE;oBACvC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBACvB;gBACD,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;aACnC;YAED,IAAI,eAAe,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE;gBACtC,IAAI,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE;oBACvC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBACvB;gBACD,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;aACnC;iBAAM,IAAI,eAAe,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE;gBAC7C,IAAI,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE;oBACvC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBACvB;gBACD,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;aACnC;YACD,YAAY,GAAG,eAAe,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAaF,SAAS,kBAAkB,CAAC,qBAA4C;IACtE,IAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAExB,qBAAqB,CAAC,SAAS,GAAG,qBAAqB,CAAC,SAAS,IAAI,GAAG,CAAC;IAEzE,qFAAqF;IAC7E,IAAA,OAAO,GAAuB,qBAAqB,QAA5C,EAAE,gBAAgB,GAAK,qBAAqB,iBAA1B,CAA2B;IAC5D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,CAAC,MAAM,GAAG,gBAAgB;QAAE,OAAO,CAAC,KAAK,EAAE,CAAC;AACzD,CAAC;AAED,yEAAyE;AACzE,4CAA4C;AAC5C,SAAS,gBAAgB,CAAC,gBAAuC;IACvD,IAAA,OAAO,GAAoC,gBAAgB,QAApD,EAAE,gBAAgB,GAAkB,gBAAgB,iBAAlC,EAAE,WAAW,GAAK,gBAAgB,YAArB,CAAsB;IACpE,IAAI,OAAO,CAAC,MAAM,GAAG,gBAAgB;QAAE,OAAO,KAAK,CAAC;IACpD,IAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,KAAK,GAAG,WAAW,CAAC;AAC7B,CAAC;AAED,SAAS,0BAA0B,CAAC,qBAA4C;IAC9E,qBAAqB,CAAC,OAAO,GAAG,EAAE,CAAC;IACnC,qBAAqB,CAAC,SAAS,GAAG,SAAS,CAAC;AAC9C,CAAC;AAED,2EAA2E;AAC3E,gEAAgE;AAChE,SAAS,YAAY,CAAC,gBAAuC;IACnD,IAAA,OAAO,GAAkB,gBAAgB,QAAlC,EAAE,WAAW,GAAK,gBAAgB,YAArB,CAAsB;IAElD,qDAAqD;IACrD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QAC1C,IAAM,KAAK,GAAG,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,WAAW,EAAE;YACvB,MAAM;SACP;KACF;IACD,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO;IAE1B,gBAAgB,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,wBAAwB,CAC/B,iBAAwC,EACxC,iBAAwC;IAExC,IAAI,SAAS,GAAG,SAAS,CAAC;IAC1B,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,EAAE;QACvC,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;KACzC;IACD,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,EAAE;QACvC,IAAM,UAAU,GAAG,iBAAiB,CAAC,SAAS,CAAC;QAC/C,IAAI,UAAU,IAAI,CAAC,CAAC,SAAS,IAAI,UAAU,GAAG,SAAS,CAAC,EAAE;YACxD,SAAS,GAAG,UAAU,CAAC;SACxB;KACF;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,IAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,IAAM,iBAAiB,GAAG,IAAK,CAAC;AAEhC,MAAM,CAAC,IAAM,8BAA8B,GAAG,UAAC,EAQ9C;QAPC,8BAA8B,oCAAA,EAC9B,wBAAoC,EAApC,gBAAgB,mBAAG,iBAAiB,KAAA,EACpC,mBAA+B,EAA/B,WAAW,mBAAG,iBAAiB,KAAA;IAM/B,OAAO,IAAI,UAAU,CAAS,UAAC,QAAQ;QACrC,IAAM,iBAAiB,GAA0B,EAAE,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,aAAA,EAAE,CAAC;QAClH,IAAM,iBAAiB,GAA0B,EAAE,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,aAAA,EAAE,CAAC;QAClH,IAAI,qBAAqB,GAAuB,SAAS,CAAC;QAC1D,IAAI,KAAK,GAAyC,IAAI,CAAC;QAEvD,SAAS,yBAAyB;YAChC,IAAI,qBAAqB,KAAK,SAAS,EAAE;gBACvC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACrC,qBAAqB,GAAG,SAAS,CAAC;gBAElC,eAAe;gBACf,IAAI,KAAK,KAAK,IAAI;oBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;gBACxC,0BAA0B,CAAC,iBAAiB,CAAC,CAAC;gBAC9C,0BAA0B,CAAC,iBAAiB,CAAC,CAAC;aAC/C;QACH,CAAC;QAED,OAAO,8BAA8B,CAAC,SAAS,CAAC,UAAC,IAAI;YACnD,IAAI,KAAK,KAAK,IAAI;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YACxC,kBAAkB,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;YAE5E,IAAM,yBAAyB,GAAG,wBAAwB,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;YACjG,IAAI,yBAAyB,EAAE;gBAC7B,+EAA+E;gBAC/E,6EAA6E;gBAC7E,0BAA0B;gBAC1B,qBAAqB,GAAG,qBAAqB,IAAI,yBAAyB,CAAC;gBAC3E,KAAK,GAAG,UAAU,CAAC;oBACjB,yBAAyB,EAAE,CAAC;oBAC5B,KAAK,GAAG,IAAI,CAAC;gBACf,CAAC,EAAE,WAAW,CAAC,CAAC;aACjB;iBAAM;gBACL,yBAAyB,EAAE,CAAC;aAC7B;YAED,YAAY,CAAC,iBAAiB,CAAC,CAAC;YAChC,YAAY,CAAC,iBAAiB,CAAC,CAAC;YAEhC,0BAA0B;YAC1B,OAAO;gBACL,wBAAwB;gBACxB,IAAI,KAAK,KAAK,IAAI,EAAE;oBAClB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,KAAK,GAAG,IAAI,CAAC;iBACd;YACH,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,mBAAmB,GAAG,UAAC,EAYnC;QAXC,SAAS,eAAA,EACT,OAAO,aAAA,EACP,cAAc,oBAAA,EACd,wBAAoC,EAApC,gBAAgB,mBAAG,iBAAiB,KAAA,EACpC,mBAA+B,EAA/B,WAAW,mBAAG,iBAAiB,KAAA;IAQ/B,IAAM,8BAA8B,GAAG,oCAAoC,CAAC,EAAE,oBAAoB,EAAE,cAAc,EAAE,CAAC,CAAC;IACtH,IAAM,wBAAwB,GAAG,8BAA8B,CAAC;QAC9D,8BAA8B,gCAAA;QAC9B,gBAAgB,kBAAA;QAChB,WAAW,aAAA;KACZ,CAAC,CAAC;IACH,OAAO,wBAAwB,CAAC,SAAS,CAAC,UAAC,IAAI;QAC7C,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;YAC1B,OAAO;SACR;QACD,SAAS,CAAC,KAAK,CAAC,+BAA+B,EAAE,SAAS,EAAE,EAAE,IAAI,MAAA,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { BrowserClient, ElementInteractionsOptions, Observable } from '@amplitude/analytics-core';\nimport { AllWindowObservables } from '../frustration-plugin';\nimport { AMPLITUDE_THRASHED_CURSOR_EVENT } from '../constants';\nimport { isUrlAllowed } from '../helpers';\n\ntype Position = {\n x: number;\n y: number;\n};\n\nenum Direction {\n INCREASING = 'increasing',\n DECREASING = 'decreasing',\n}\n\nenum Axis {\n X = 'x',\n Y = 'y',\n}\n\nexport const createMouseDirectionChangeObservable = ({\n allWindowObservables,\n}: {\n allWindowObservables: AllWindowObservables;\n}): Observable<Axis> => {\n const { mouseMoveObservable } = allWindowObservables;\n return new Observable<Axis>((observer) => {\n let lastPosition: Position | null = null;\n let xDirection: Direction | null = null;\n let yDirection: Direction | null = null;\n return mouseMoveObservable.subscribe((event) => {\n const currentPosition = { x: event.clientX, y: event.clientY };\n if (lastPosition === null) {\n lastPosition = currentPosition;\n return;\n }\n if (currentPosition.x > lastPosition.x) {\n if (xDirection === Direction.DECREASING) {\n observer.next(Axis.X);\n }\n xDirection = Direction.INCREASING;\n } else if (currentPosition.x < lastPosition.x) {\n if (xDirection === Direction.INCREASING) {\n observer.next(Axis.X);\n }\n xDirection = Direction.DECREASING;\n }\n\n if (currentPosition.y > lastPosition.y) {\n if (yDirection === Direction.DECREASING) {\n observer.next(Axis.Y);\n }\n yDirection = Direction.INCREASING;\n } else if (currentPosition.y < lastPosition.y) {\n if (yDirection === Direction.INCREASING) {\n observer.next(Axis.Y);\n }\n yDirection = Direction.DECREASING;\n }\n lastPosition = currentPosition;\n });\n });\n};\n\ntype DirectionChangeSeries = {\n // number of direction changes to be considered a thrashed cursor\n changesThreshold: number;\n // timestamps of direction changes (limited to \"changesThreshold\" to avoid memory leaks)\n changes: number[];\n // window duration in milliseconds\n thresholdMs: number;\n // when the series of direction changes started\n startTime?: number;\n};\n\nfunction addDirectionChange(directionChangeSeries: DirectionChangeSeries) {\n const now = +Date.now();\n\n directionChangeSeries.startTime = directionChangeSeries.startTime || now;\n\n // add this direction change to the series (fixed length array to avoid memory leaks)\n const { changes, changesThreshold } = directionChangeSeries;\n changes.push(now);\n if (changes.length > changesThreshold) changes.shift();\n}\n\n// checks if there are enough direction changes within window + threshold\n// for it to be considered a thrashed cursor\nfunction isThrashedCursor(directionChanges: DirectionChangeSeries): boolean {\n const { changes, changesThreshold, thresholdMs } = directionChanges;\n if (changes.length < changesThreshold) return false;\n const delta = changes[changes.length - 1] - changes[0];\n return delta < thresholdMs;\n}\n\nfunction resetDirectionChangeSeries(directionChangeSeries: DirectionChangeSeries) {\n directionChangeSeries.changes = [];\n directionChangeSeries.startTime = undefined;\n}\n\n// if the time between first and last change is greater than the threshold,\n// shift the window to the right until it is below the threshold\nfunction adjustWindow(directionChanges: DirectionChangeSeries) {\n const { changes, thresholdMs } = directionChanges;\n\n // find the first change that is within the threshold\n let leftPtr = 0;\n const lastChange = changes[changes.length - 1];\n for (; leftPtr < changes.length; leftPtr++) {\n const delta = lastChange - changes[leftPtr];\n if (delta < thresholdMs) {\n break;\n }\n }\n if (leftPtr === 0) return;\n\n directionChanges.startTime = changes[leftPtr];\n directionChanges.changes.splice(0, leftPtr);\n}\n\nfunction getPendingThrashedCursor(\n directionChangesX: DirectionChangeSeries,\n directionChangesY: DirectionChangeSeries,\n): number | undefined {\n let startTime = undefined;\n if (isThrashedCursor(directionChangesX)) {\n startTime = directionChangesX.startTime;\n }\n if (isThrashedCursor(directionChangesY)) {\n const startTimeY = directionChangesY.startTime;\n if (startTimeY && (!startTime || startTimeY < startTime)) {\n startTime = startTimeY;\n }\n }\n return startTime;\n}\n\nconst DEFAULT_THRESHOLD = 10;\nconst DEFAULT_WINDOW_MS = 2_000;\n\nexport const createThrashedCursorObservable = ({\n mouseDirectionChangeObservable,\n directionChanges = DEFAULT_THRESHOLD,\n thresholdMs = DEFAULT_WINDOW_MS,\n}: {\n mouseDirectionChangeObservable: Observable<Axis>;\n directionChanges?: number;\n thresholdMs?: number;\n}): Observable<number> => {\n return new Observable<number>((observer) => {\n const xDirectionChanges: DirectionChangeSeries = { changes: [], changesThreshold: directionChanges, thresholdMs };\n const yDirectionChanges: DirectionChangeSeries = { changes: [], changesThreshold: directionChanges, thresholdMs };\n let pendingThrashedCursor: number | undefined = undefined;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n function emitPendingThrashedCursor() {\n if (pendingThrashedCursor !== undefined) {\n observer.next(pendingThrashedCursor);\n pendingThrashedCursor = undefined;\n\n // reset window\n if (timer !== null) clearTimeout(timer);\n resetDirectionChangeSeries(xDirectionChanges);\n resetDirectionChangeSeries(yDirectionChanges);\n }\n }\n\n return mouseDirectionChangeObservable.subscribe((axis) => {\n if (timer !== null) clearTimeout(timer);\n addDirectionChange(axis === Axis.X ? xDirectionChanges : yDirectionChanges);\n\n const nextPendingThrashedCursor = getPendingThrashedCursor(xDirectionChanges, yDirectionChanges);\n if (nextPendingThrashedCursor) {\n // if we're in a thrashed cursor window, debounce it for \"thresholdMs\" duration\n // this is so that we do not restart the window if more direction changes are\n // detected in this series\n pendingThrashedCursor = pendingThrashedCursor || nextPendingThrashedCursor;\n timer = setTimeout(() => {\n emitPendingThrashedCursor();\n timer = null;\n }, thresholdMs);\n } else {\n emitPendingThrashedCursor();\n }\n\n adjustWindow(xDirectionChanges);\n adjustWindow(yDirectionChanges);\n\n /* istanbul ignore next */\n return () => {\n /* istanbul ignore if */\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n };\n });\n });\n};\n\nexport const trackThrashedCursor = ({\n amplitude,\n options,\n allObservables,\n directionChanges = DEFAULT_THRESHOLD,\n thresholdMs = DEFAULT_WINDOW_MS,\n}: {\n amplitude: BrowserClient;\n options: ElementInteractionsOptions;\n allObservables: AllWindowObservables;\n directionChanges?: number;\n thresholdMs?: number;\n}) => {\n const mouseDirectionChangeObservable = createMouseDirectionChangeObservable({ allWindowObservables: allObservables });\n const thrashedCursorObservable = createThrashedCursorObservable({\n mouseDirectionChangeObservable,\n directionChanges,\n thresholdMs,\n });\n return thrashedCursorObservable.subscribe((time) => {\n if (!isUrlAllowed(options)) {\n return;\n }\n amplitude.track(AMPLITUDE_THRASHED_CURSOR_EVENT, undefined, { time });\n });\n};\n"]}
|
|
1
|
+
{"version":3,"file":"track-thrashed-cursor.js","sourceRoot":"","sources":["../../../src/autocapture/track-thrashed-cursor.ts"],"names":[],"mappings":"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","sourcesContent":["import { BrowserClient, ElementInteractionsOptions, Observable } from '@amplitude/analytics-core';\nimport { AllWindowObservables } from '../frustration-plugin';\nimport { AMPLITUDE_THRASHED_CURSOR_EVENT } from '../constants';\nimport { isUrlAllowed } from '../helpers';\n\ntype Position = {\n x: number;\n y: number;\n};\n\nenum Direction {\n INCREASING = 'increasing',\n DECREASING = 'decreasing',\n}\n\nenum Axis {\n X = 'x',\n Y = 'y',\n}\n\nexport const createMouseDirectionChangeObservable = ({\n allWindowObservables,\n}: {\n allWindowObservables: AllWindowObservables;\n}): Observable<Axis> => {\n const { mouseMoveObservable } = allWindowObservables;\n return new Observable<Axis>((observer) => {\n let lastPosition: Position | null = null;\n let xDirection: Direction | null = null;\n let yDirection: Direction | null = null;\n return mouseMoveObservable.subscribe((event) => {\n const currentPosition = { x: event.clientX, y: event.clientY };\n if (lastPosition === null) {\n lastPosition = currentPosition;\n return;\n }\n if (currentPosition.x > lastPosition.x) {\n if (xDirection === Direction.DECREASING) {\n observer.next(Axis.X);\n }\n xDirection = Direction.INCREASING;\n } else if (currentPosition.x < lastPosition.x) {\n if (xDirection === Direction.INCREASING) {\n observer.next(Axis.X);\n }\n xDirection = Direction.DECREASING;\n }\n\n if (currentPosition.y > lastPosition.y) {\n if (yDirection === Direction.DECREASING) {\n observer.next(Axis.Y);\n }\n yDirection = Direction.INCREASING;\n } else if (currentPosition.y < lastPosition.y) {\n if (yDirection === Direction.INCREASING) {\n observer.next(Axis.Y);\n }\n yDirection = Direction.DECREASING;\n }\n lastPosition = currentPosition;\n });\n });\n};\n\ntype DirectionChangeSeries = {\n // number of direction changes to be considered a thrashed cursor\n changesThreshold: number;\n // timestamps of direction changes (limited to \"changesThreshold\" to avoid memory leaks)\n changes: number[];\n // window duration in milliseconds\n thresholdMs: number;\n // when the series of direction changes started\n startTime?: number;\n};\n\nfunction addDirectionChange(directionChangeSeries: DirectionChangeSeries) {\n const now = +Date.now();\n\n directionChangeSeries.startTime = directionChangeSeries.startTime || now;\n\n // add this direction change to the series (fixed length array to avoid memory leaks)\n const { changes, changesThreshold } = directionChangeSeries;\n changes.push(now);\n if (changes.length > changesThreshold) changes.shift();\n}\n\n// checks if there are enough direction changes within window + threshold\n// for it to be considered a thrashed cursor\nfunction isThrashedCursor(directionChanges: DirectionChangeSeries): boolean {\n const { changes, changesThreshold, thresholdMs } = directionChanges;\n if (changes.length < changesThreshold) return false;\n const delta = changes[changes.length - 1] - changes[0];\n return delta < thresholdMs;\n}\n\nfunction resetDirectionChangeSeries(directionChangeSeries: DirectionChangeSeries) {\n directionChangeSeries.changes = [];\n directionChangeSeries.startTime = undefined;\n}\n\n// if the time between first and last change is greater than the threshold,\n// shift the window to the right until it is below the threshold\nfunction adjustWindow(directionChanges: DirectionChangeSeries) {\n const { changes, thresholdMs } = directionChanges;\n\n // find the first change that is within the threshold\n let leftPtr = 0;\n const lastChange = changes[changes.length - 1];\n for (; leftPtr < changes.length; leftPtr++) {\n const delta = lastChange - changes[leftPtr];\n if (delta < thresholdMs) {\n break;\n }\n }\n if (leftPtr === 0) return;\n\n directionChanges.startTime = changes[leftPtr];\n directionChanges.changes.splice(0, leftPtr);\n}\n\nfunction getPendingThrashedCursor(\n directionChangesX: DirectionChangeSeries,\n directionChangesY: DirectionChangeSeries,\n): number | undefined {\n let startTime = undefined;\n if (isThrashedCursor(directionChangesX)) {\n startTime = directionChangesX.startTime;\n }\n if (isThrashedCursor(directionChangesY)) {\n const startTimeY = directionChangesY.startTime;\n if (startTimeY && (!startTime || startTimeY < startTime)) {\n startTime = startTimeY;\n }\n }\n return startTime;\n}\n\nconst DEFAULT_THRESHOLD = 20;\nconst DEFAULT_WINDOW_MS = 2_000;\n\nexport const createThrashedCursorObservable = ({\n mouseDirectionChangeObservable,\n directionChanges = DEFAULT_THRESHOLD,\n thresholdMs = DEFAULT_WINDOW_MS,\n}: {\n mouseDirectionChangeObservable: Observable<Axis>;\n directionChanges?: number;\n thresholdMs?: number;\n}): Observable<number> => {\n return new Observable<number>((observer) => {\n const xDirectionChanges: DirectionChangeSeries = { changes: [], changesThreshold: directionChanges, thresholdMs };\n const yDirectionChanges: DirectionChangeSeries = { changes: [], changesThreshold: directionChanges, thresholdMs };\n let pendingThrashedCursor: number | undefined = undefined;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n function emitPendingThrashedCursor() {\n if (pendingThrashedCursor !== undefined) {\n observer.next(pendingThrashedCursor);\n pendingThrashedCursor = undefined;\n\n // reset window\n if (timer !== null) clearTimeout(timer);\n resetDirectionChangeSeries(xDirectionChanges);\n resetDirectionChangeSeries(yDirectionChanges);\n }\n }\n\n return mouseDirectionChangeObservable.subscribe((axis) => {\n if (timer !== null) clearTimeout(timer);\n addDirectionChange(axis === Axis.X ? xDirectionChanges : yDirectionChanges);\n\n const nextPendingThrashedCursor = getPendingThrashedCursor(xDirectionChanges, yDirectionChanges);\n if (nextPendingThrashedCursor) {\n // if we're in a thrashed cursor window, debounce it for \"thresholdMs\" duration\n // this is so that we do not restart the window if more direction changes are\n // detected in this series\n pendingThrashedCursor = pendingThrashedCursor || nextPendingThrashedCursor;\n timer = setTimeout(() => {\n emitPendingThrashedCursor();\n timer = null;\n }, thresholdMs);\n } else {\n emitPendingThrashedCursor();\n }\n\n adjustWindow(xDirectionChanges);\n adjustWindow(yDirectionChanges);\n\n /* istanbul ignore next */\n return () => {\n /* istanbul ignore if */\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n };\n });\n });\n};\n\nexport const trackThrashedCursor = ({\n amplitude,\n options,\n allObservables,\n directionChanges = DEFAULT_THRESHOLD,\n thresholdMs = DEFAULT_WINDOW_MS,\n}: {\n amplitude: BrowserClient;\n options: ElementInteractionsOptions;\n allObservables: AllWindowObservables;\n directionChanges?: number;\n thresholdMs?: number;\n}) => {\n const mouseDirectionChangeObservable = createMouseDirectionChangeObservable({ allWindowObservables: allObservables });\n const thrashedCursorObservable = createThrashedCursorObservable({\n mouseDirectionChangeObservable,\n directionChanges,\n thresholdMs,\n });\n return thrashedCursorObservable.subscribe((time) => {\n if (!isUrlAllowed(options)) {\n return;\n }\n amplitude.track(AMPLITUDE_THRASHED_CURSOR_EVENT, undefined, { time });\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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { getGlobalScope } from '@amplitude/analytics-core';
|
|
2
|
+
import * as constants from '../constants';
|
|
3
|
+
import { getCurrentPageViewId } from '../helpers';
|
|
4
|
+
export function fireViewportContentUpdated(_a) {
|
|
5
|
+
var _b;
|
|
6
|
+
var _c, _d, _e;
|
|
7
|
+
var amplitude = _a.amplitude, scrollTracker = _a.scrollTracker, currentElementExposed = _a.currentElementExposed, elementExposedForPage = _a.elementExposedForPage, exposureTracker = _a.exposureTracker, isPageEnd = _a.isPageEnd, lastScroll = _a.lastScroll;
|
|
8
|
+
var pageScrollMaxState = scrollTracker.getState();
|
|
9
|
+
var globalScope = getGlobalScope();
|
|
10
|
+
/* istanbul ignore next */
|
|
11
|
+
var viewportWidth = (_c = globalScope === null || globalScope === void 0 ? void 0 : globalScope.innerWidth) !== null && _c !== void 0 ? _c : 0;
|
|
12
|
+
/* istanbul ignore next */
|
|
13
|
+
var viewportHeight = (_d = globalScope === null || globalScope === void 0 ? void 0 : globalScope.innerHeight) !== null && _d !== void 0 ? _d : 0;
|
|
14
|
+
var eventProperties = (_b = {},
|
|
15
|
+
_b[constants.AMPLITUDE_EVENT_PROP_PAGE_URL] =
|
|
16
|
+
/* istanbul ignore next */
|
|
17
|
+
(_e = globalScope === null || globalScope === void 0 ? void 0 : globalScope.location) === null || _e === void 0 ? void 0 : _e.href,
|
|
18
|
+
_b[constants.AMPLITUDE_EVENT_PROP_MAX_PAGE_X] = pageScrollMaxState.maxX + viewportWidth,
|
|
19
|
+
_b[constants.AMPLITUDE_EVENT_PROP_MAX_PAGE_Y] = pageScrollMaxState.maxY + viewportHeight,
|
|
20
|
+
_b[constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT] = viewportHeight,
|
|
21
|
+
_b[constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH] = viewportWidth,
|
|
22
|
+
_b['[Amplitude] Element Exposed'] = Array.from(currentElementExposed),
|
|
23
|
+
_b);
|
|
24
|
+
var pageViewId = getCurrentPageViewId();
|
|
25
|
+
if (pageViewId) {
|
|
26
|
+
eventProperties[constants.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID] = pageViewId;
|
|
27
|
+
}
|
|
28
|
+
// If elements exposed is empty and max scroll is same as last event, don't track
|
|
29
|
+
if (currentElementExposed.size === 0 &&
|
|
30
|
+
pageScrollMaxState.maxX === lastScroll.maxX &&
|
|
31
|
+
pageScrollMaxState.maxY === lastScroll.maxY) {
|
|
32
|
+
if (isPageEnd) {
|
|
33
|
+
scrollTracker.reset();
|
|
34
|
+
elementExposedForPage.clear();
|
|
35
|
+
exposureTracker === null || exposureTracker === void 0 ? void 0 : exposureTracker.reset();
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
/* istanbul ignore next */
|
|
40
|
+
amplitude === null || amplitude === void 0 ? void 0 : amplitude.track('[Amplitude] Viewport Content Updated', eventProperties);
|
|
41
|
+
lastScroll.maxX = pageScrollMaxState.maxX;
|
|
42
|
+
lastScroll.maxY = pageScrollMaxState.maxY;
|
|
43
|
+
// Clear current batch
|
|
44
|
+
currentElementExposed.clear();
|
|
45
|
+
if (isPageEnd) {
|
|
46
|
+
// Reset state for next page view
|
|
47
|
+
scrollTracker.reset();
|
|
48
|
+
elementExposedForPage.clear();
|
|
49
|
+
exposureTracker === null || exposureTracker === void 0 ? void 0 : exposureTracker.reset();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function onExposure(elementPath, elementExposedForPage, currentElementExposed, fireViewportContentUpdatedCallback) {
|
|
53
|
+
if (elementExposedForPage.has(elementPath)) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
elementExposedForPage.add(elementPath);
|
|
57
|
+
currentElementExposed.add(elementPath);
|
|
58
|
+
// Check if current set size exceeds 18k chars
|
|
59
|
+
var exposedArray = Array.from(currentElementExposed);
|
|
60
|
+
var exposedString = JSON.stringify(exposedArray);
|
|
61
|
+
if (exposedString.length >= constants.MAX_ELEMENT_EXPOSED_STR_LENGTH) {
|
|
62
|
+
fireViewportContentUpdatedCallback(false);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
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":"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","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 /* istanbul ignore next */\n const viewportWidth = globalScope?.innerWidth ?? 0;\n /* istanbul ignore next */\n const viewportHeight = globalScope?.innerHeight ?? 0;\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 + viewportWidth,\n [constants.AMPLITUDE_EVENT_PROP_MAX_PAGE_Y]: pageScrollMaxState.maxY + viewportHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: viewportHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: viewportWidth,\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 if (isPageEnd) {\n scrollTracker.reset();\n elementExposedForPage.clear();\n exposureTracker?.reset();\n }\n return;\n }\n\n /* istanbul ignore next */\n amplitude?.track('[Amplitude] Viewport Content Updated', eventProperties);\n lastScroll.maxX = pageScrollMaxState.maxX;\n lastScroll.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"]}
|
|
@@ -17,6 +17,8 @@ export declare enum ObservablesEnum {
|
|
|
17
17
|
ChangeObservable = "changeObservable",
|
|
18
18
|
NavigateObservable = "navigateObservable",
|
|
19
19
|
MutationObservable = "mutationObservable",
|
|
20
|
+
ScrollObservable = "scrollObservable",
|
|
21
|
+
ExposureObservable = "exposureObservable",
|
|
20
22
|
BrowserErrorObservable = "browserErrorObservable",
|
|
21
23
|
SelectionObservable = "selectionObservable",
|
|
22
24
|
MouseMoveObservable = "mouseMoveObservable"
|
|
@@ -26,6 +28,8 @@ export interface AllWindowObservables {
|
|
|
26
28
|
[ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;
|
|
27
29
|
[ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;
|
|
28
30
|
[ObservablesEnum.NavigateObservable]?: Observable<TimestampedEvent<NavigateEvent>>;
|
|
31
|
+
[ObservablesEnum.ScrollObservable]: Observable<Event>;
|
|
32
|
+
[ObservablesEnum.ExposureObservable]: Observable<Event>;
|
|
29
33
|
[ObservablesEnum.SelectionObservable]?: Observable<void>;
|
|
30
34
|
}
|
|
31
35
|
export declare const autocapturePlugin: (options?: ElementInteractionsOptions, context?: {
|
|
@@ -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,
|
|
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,EAK/B,kBAAkB,EAKnB,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;IACzC,sBAAsB,2BAA2B;IACjD,mBAAmB,wBAAwB;IAC3C,mBAAmB,wBAAwB;CAC5C;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;IACxD,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED,eAAO,MAAM,iBAAiB,aACnB,0BAA0B,YACzB;IAAE,iBAAiB,EAAE,kBAAkB,CAAA;CAAE,KAClD,uBA6XF,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __assign, __awaiter, __generator, __read, __spreadArray, __values } from "tslib";
|
|
2
2
|
/* eslint-disable no-restricted-globals */
|
|
3
|
-
import { DEFAULT_CSS_SELECTOR_ALLOWLIST, DEFAULT_ACTION_CLICK_ALLOWLIST, DEFAULT_DATA_ATTRIBUTE_PREFIX, getGlobalScope, getOrCreateWindowMessenger, enableBackgroundCapture, multicast, } from '@amplitude/analytics-core';
|
|
3
|
+
import { DEFAULT_EXPOSURE_DURATION, DEFAULT_CSS_SELECTOR_ALLOWLIST, DEFAULT_ACTION_CLICK_ALLOWLIST, DEFAULT_DATA_ATTRIBUTE_PREFIX, getGlobalScope, getOrCreateWindowMessenger, enableBackgroundCapture, multicast, } from '@amplitude/analytics-core';
|
|
4
4
|
import { VERSION } from './version';
|
|
5
5
|
import * as constants from './constants';
|
|
6
6
|
import { createShouldTrackEvent, } from './helpers';
|
|
@@ -8,34 +8,40 @@ import { enableVisualTagging } from './libs/messenger';
|
|
|
8
8
|
import { trackClicks } from './autocapture/track-click';
|
|
9
9
|
import { trackChange } from './autocapture/track-change';
|
|
10
10
|
import { trackActionClick } from './autocapture/track-action-click';
|
|
11
|
-
import {
|
|
11
|
+
import { trackScroll } from './autocapture/track-scroll';
|
|
12
|
+
import { createClickObservable, createScrollObservable, createExposureObservable, createMutationObservable, } from './observables';
|
|
12
13
|
import { createLabeledEventToTriggerMap, createTriggerEvaluator, groupLabeledEventIdsByEventType, } from './pageActions/triggers';
|
|
13
14
|
import { DataExtractor } from './data-extractor';
|
|
14
15
|
import { Observable } from '@amplitude/analytics-core';
|
|
16
|
+
import { trackExposure } from './autocapture/track-exposure';
|
|
17
|
+
import { fireViewportContentUpdated, onExposure } from './autocapture/track-viewport-content-updated';
|
|
15
18
|
export var ObservablesEnum;
|
|
16
19
|
(function (ObservablesEnum) {
|
|
17
20
|
ObservablesEnum["ClickObservable"] = "clickObservable";
|
|
18
21
|
ObservablesEnum["ChangeObservable"] = "changeObservable";
|
|
19
|
-
// ErrorObservable = 'errorObservable',
|
|
20
22
|
ObservablesEnum["NavigateObservable"] = "navigateObservable";
|
|
21
23
|
ObservablesEnum["MutationObservable"] = "mutationObservable";
|
|
24
|
+
ObservablesEnum["ScrollObservable"] = "scrollObservable";
|
|
25
|
+
ObservablesEnum["ExposureObservable"] = "exposureObservable";
|
|
22
26
|
ObservablesEnum["BrowserErrorObservable"] = "browserErrorObservable";
|
|
23
27
|
ObservablesEnum["SelectionObservable"] = "selectionObservable";
|
|
24
28
|
ObservablesEnum["MouseMoveObservable"] = "mouseMoveObservable";
|
|
25
29
|
})(ObservablesEnum || (ObservablesEnum = {}));
|
|
26
30
|
export var autocapturePlugin = function (options, context) {
|
|
27
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
31
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
28
32
|
if (options === void 0) { options = {}; }
|
|
29
33
|
// Set the plugin version tag
|
|
30
34
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
31
35
|
context === null || context === void 0 ? void 0 : context.diagnosticsClient.setTag('plugin.autocapture.version', VERSION);
|
|
32
|
-
var
|
|
36
|
+
var _m = options.dataAttributePrefix, dataAttributePrefix = _m === void 0 ? DEFAULT_DATA_ATTRIBUTE_PREFIX : _m, _o = options.visualTaggingOptions, visualTaggingOptions = _o === void 0 ? {
|
|
33
37
|
enabled: true,
|
|
34
|
-
} :
|
|
38
|
+
} : _o;
|
|
35
39
|
options.cssSelectorAllowlist = (_a = options.cssSelectorAllowlist) !== null && _a !== void 0 ? _a : DEFAULT_CSS_SELECTOR_ALLOWLIST;
|
|
36
40
|
options.actionClickAllowlist = (_b = options.actionClickAllowlist) !== null && _b !== void 0 ? _b : DEFAULT_ACTION_CLICK_ALLOWLIST;
|
|
37
41
|
options.debounceTime = (_c = options.debounceTime) !== null && _c !== void 0 ? _c : 0;
|
|
38
|
-
|
|
42
|
+
var resolvedExposureDuration = (_f = (_e = (_d = options.viewportContentUpdated) === null || _d === void 0 ? void 0 : _d.exposureDuration) !== null && _e !== void 0 ? _e : options.exposureDuration) !== null && _f !== void 0 ? _f : DEFAULT_EXPOSURE_DURATION;
|
|
43
|
+
options.viewportContentUpdated = __assign(__assign({}, options.viewportContentUpdated), { exposureDuration: resolvedExposureDuration });
|
|
44
|
+
options.pageUrlExcludelist = (_g = options.pageUrlExcludelist) === null || _g === void 0 ? void 0 : _g.reduce(function (acc, excludePattern) {
|
|
39
45
|
if (typeof excludePattern === 'string') {
|
|
40
46
|
acc.push(excludePattern);
|
|
41
47
|
}
|
|
@@ -56,9 +62,13 @@ export var autocapturePlugin = function (options, context) {
|
|
|
56
62
|
var name = constants.PLUGIN_NAME;
|
|
57
63
|
var type = 'enrichment';
|
|
58
64
|
var subscriptions = [];
|
|
59
|
-
// Create data extractor based on options
|
|
60
65
|
var dataExtractor = new DataExtractor(options, context);
|
|
61
|
-
//
|
|
66
|
+
// Page-level state shared across trackers, emitted in a single Page View End event on beforeunload
|
|
67
|
+
// elementExposedForPage holds the total set of elements seen during the entire page view lifetime
|
|
68
|
+
var elementExposedForPage = new Set();
|
|
69
|
+
// currentElementExposed only holds the set of elements that will be flushed during the next [Amplitude] Viewport Content Updated event
|
|
70
|
+
var currentElementExposed = new Set();
|
|
71
|
+
var beforeUnloadCleanup;
|
|
62
72
|
var createObservables = function () {
|
|
63
73
|
var _a;
|
|
64
74
|
var clickObservable = multicast(createClickObservable().map(function (click) {
|
|
@@ -75,10 +85,6 @@ export var autocapturePlugin = function (options, context) {
|
|
|
75
85
|
/* istanbul ignore next */
|
|
76
86
|
return function () { var _a; return (_a = getGlobalScope()) === null || _a === void 0 ? void 0 : _a.document.removeEventListener('change', handler); };
|
|
77
87
|
}));
|
|
78
|
-
// Create Observable from unhandled errors
|
|
79
|
-
// const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(
|
|
80
|
-
// map((error) => addAdditionalEventProperties(error, 'error')),
|
|
81
|
-
// );
|
|
82
88
|
// Create observable for URL changes
|
|
83
89
|
var navigateObservable;
|
|
84
90
|
/* istanbul ignore next */
|
|
@@ -97,17 +103,21 @@ export var autocapturePlugin = function (options, context) {
|
|
|
97
103
|
var mutationObservable = multicast(createMutationObservable().map(function (mutation) {
|
|
98
104
|
return dataExtractor.addAdditionalEventProperties(mutation, 'mutation', options.cssSelectorAllowlist, dataAttributePrefix);
|
|
99
105
|
}));
|
|
106
|
+
var scrollObservable = createScrollObservable();
|
|
107
|
+
var exposureObservable = createExposureObservable(mutationObservable, options.cssSelectorAllowlist);
|
|
100
108
|
return _a = {},
|
|
101
109
|
_a[ObservablesEnum.ChangeObservable] = changeObservable,
|
|
102
110
|
// [ObservablesEnum.ErrorObservable]: errorObservable,
|
|
103
111
|
_a[ObservablesEnum.ClickObservable] = clickObservable,
|
|
104
112
|
_a[ObservablesEnum.MutationObservable] = mutationObservable,
|
|
105
113
|
_a[ObservablesEnum.NavigateObservable] = navigateObservable,
|
|
114
|
+
_a[ObservablesEnum.ScrollObservable] = scrollObservable,
|
|
115
|
+
_a[ObservablesEnum.ExposureObservable] = exposureObservable,
|
|
106
116
|
_a;
|
|
107
117
|
};
|
|
108
118
|
// Group labeled events by event type (eg. click, change)
|
|
109
|
-
var groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values((
|
|
110
|
-
var labeledEventToTriggerMap = createLabeledEventToTriggerMap((
|
|
119
|
+
var groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values((_j = (_h = options.pageActions) === null || _h === void 0 ? void 0 : _h.labeledEvents) !== null && _j !== void 0 ? _j : {}));
|
|
120
|
+
var labeledEventToTriggerMap = createLabeledEventToTriggerMap((_l = (_k = options.pageActions) === null || _k === void 0 ? void 0 : _k.triggers) !== null && _l !== void 0 ? _l : []);
|
|
111
121
|
// Evaluate triggers for the given event by running the actions associated with the matching triggers
|
|
112
122
|
var evaluateTriggers = createTriggerEvaluator(groupedLabeledEvents, labeledEventToTriggerMap, dataExtractor, options);
|
|
113
123
|
// Function to recalculate internal variables when remote config is updated
|
|
@@ -124,13 +134,15 @@ export var autocapturePlugin = function (options, context) {
|
|
|
124
134
|
}
|
|
125
135
|
};
|
|
126
136
|
var setup = function (config, amplitude) { return __awaiter(void 0, void 0, void 0, function () {
|
|
127
|
-
var shouldTrackEvent, shouldTrackActionClick, allObservables, clickTrackingSubscription, changeSubscription, actionClickSubscription, allowlist, actionClickAllowlist, messenger;
|
|
137
|
+
var pageViewEndFired, lastScroll, shouldTrackEvent, shouldTrackActionClick, allObservables, clickTrackingSubscription, changeSubscription, actionClickSubscription, scrollTracker, trackers, globalScope, handleViewportContentUpdated, handleExposure, beforeUnloadHandler, navigateObservable, popstateHandler_1, originalPushState_1, allowlist, actionClickAllowlist, messenger;
|
|
128
138
|
var _a;
|
|
129
139
|
return __generator(this, function (_b) {
|
|
130
140
|
/* istanbul ignore if */
|
|
131
141
|
if (typeof document === 'undefined') {
|
|
132
142
|
return [2 /*return*/];
|
|
133
143
|
}
|
|
144
|
+
pageViewEndFired = false;
|
|
145
|
+
lastScroll = { maxX: undefined, maxY: undefined };
|
|
134
146
|
// Fetch remote config for pageActions in a non-blocking manner
|
|
135
147
|
if (config.fetchRemoteConfig) {
|
|
136
148
|
if (!config.remoteConfigClient) {
|
|
@@ -184,6 +196,89 @@ export var autocapturePlugin = function (options, context) {
|
|
|
184
196
|
if (actionClickSubscription) {
|
|
185
197
|
subscriptions.push(actionClickSubscription);
|
|
186
198
|
}
|
|
199
|
+
scrollTracker = trackScroll({
|
|
200
|
+
allObservables: allObservables,
|
|
201
|
+
amplitude: amplitude,
|
|
202
|
+
});
|
|
203
|
+
subscriptions.push(scrollTracker);
|
|
204
|
+
trackers = {};
|
|
205
|
+
globalScope = getGlobalScope();
|
|
206
|
+
handleViewportContentUpdated = function (isPageEnd) {
|
|
207
|
+
if (isPageEnd && pageViewEndFired) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
setTimeout(function () {
|
|
211
|
+
pageViewEndFired = false;
|
|
212
|
+
}, 100);
|
|
213
|
+
pageViewEndFired = true;
|
|
214
|
+
fireViewportContentUpdated({
|
|
215
|
+
amplitude: amplitude,
|
|
216
|
+
scrollTracker: scrollTracker,
|
|
217
|
+
currentElementExposed: currentElementExposed,
|
|
218
|
+
elementExposedForPage: elementExposedForPage,
|
|
219
|
+
exposureTracker: trackers.exposure,
|
|
220
|
+
isPageEnd: isPageEnd,
|
|
221
|
+
lastScroll: lastScroll,
|
|
222
|
+
});
|
|
223
|
+
};
|
|
224
|
+
handleExposure = function (elementPath) {
|
|
225
|
+
onExposure(elementPath, elementExposedForPage, currentElementExposed, handleViewportContentUpdated);
|
|
226
|
+
};
|
|
227
|
+
trackers.exposure = trackExposure({
|
|
228
|
+
allObservables: allObservables,
|
|
229
|
+
onExposure: handleExposure,
|
|
230
|
+
dataExtractor: dataExtractor,
|
|
231
|
+
exposureDuration: resolvedExposureDuration,
|
|
232
|
+
});
|
|
233
|
+
if (trackers.exposure) {
|
|
234
|
+
subscriptions.push(trackers.exposure);
|
|
235
|
+
}
|
|
236
|
+
beforeUnloadHandler = function () {
|
|
237
|
+
handleViewportContentUpdated(true);
|
|
238
|
+
};
|
|
239
|
+
/* istanbul ignore next */
|
|
240
|
+
globalScope === null || globalScope === void 0 ? void 0 : globalScope.addEventListener('beforeunload', beforeUnloadHandler);
|
|
241
|
+
beforeUnloadCleanup = function () {
|
|
242
|
+
/* istanbul ignore next */
|
|
243
|
+
globalScope === null || globalScope === void 0 ? void 0 : globalScope.removeEventListener('beforeunload', beforeUnloadHandler);
|
|
244
|
+
};
|
|
245
|
+
// Ensure cleanup on teardown as well
|
|
246
|
+
subscriptions.push({ unsubscribe: function () { return beforeUnloadCleanup(); } });
|
|
247
|
+
navigateObservable = allObservables[ObservablesEnum.NavigateObservable];
|
|
248
|
+
if (navigateObservable) {
|
|
249
|
+
subscriptions.push(navigateObservable.subscribe(function () {
|
|
250
|
+
handleViewportContentUpdated(true);
|
|
251
|
+
}));
|
|
252
|
+
}
|
|
253
|
+
else if (globalScope) {
|
|
254
|
+
popstateHandler_1 = function () {
|
|
255
|
+
handleViewportContentUpdated(true);
|
|
256
|
+
};
|
|
257
|
+
/* istanbul ignore next */
|
|
258
|
+
// Fallback for SPA tracking when Navigation API is not available
|
|
259
|
+
globalScope.addEventListener('popstate', popstateHandler_1);
|
|
260
|
+
originalPushState_1 = globalScope.history.pushState;
|
|
261
|
+
if (globalScope.history && originalPushState_1) {
|
|
262
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
263
|
+
globalScope.history.pushState = new Proxy(originalPushState_1, {
|
|
264
|
+
apply: function (target, thisArg, _a) {
|
|
265
|
+
var _b = __read(_a, 3), state = _b[0], unused = _b[1], url = _b[2];
|
|
266
|
+
target.apply(thisArg, [state, unused, url]);
|
|
267
|
+
handleViewportContentUpdated(true);
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
subscriptions.push({
|
|
272
|
+
unsubscribe: function () {
|
|
273
|
+
/* istanbul ignore next */
|
|
274
|
+
globalScope.removeEventListener('popstate', popstateHandler_1);
|
|
275
|
+
/* istanbul ignore next */
|
|
276
|
+
if (globalScope.history && originalPushState_1) {
|
|
277
|
+
globalScope.history.pushState = originalPushState_1;
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
}
|
|
187
282
|
/* istanbul ignore next */
|
|
188
283
|
(_a = config === null || config === void 0 ? void 0 : config.loggerProvider) === null || _a === void 0 ? void 0 : _a.log("".concat(name, " has been successfully added."));
|
|
189
284
|
// Setup visual tagging and background capture on the shared messenger singleton.
|
|
@@ -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 getOrCreateWindowMessenger,\n enableBackgroundCapture,\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 { enableVisualTagging } 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 BrowserErrorObservable = 'browserErrorObservable',\n SelectionObservable = 'selectionObservable',\n MouseMoveObservable = 'mouseMoveObservable',\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.SelectionObservable]?: Observable<void>;\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 },\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('configs.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 and background capture on the shared messenger singleton.\n // Using the singleton ensures a single message listener per page, even when\n // session-replay is also loaded.\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n const messenger = getOrCreateWindowMessenger();\n enableVisualTagging(messenger, {\n dataExtractor,\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist,\n });\n enableBackgroundCapture(messenger);\n /* istanbul ignore next */\n messenger.setup({\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\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_EXPOSURE_DURATION,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n IDiagnosticsClient,\n getGlobalScope,\n getOrCreateWindowMessenger,\n enableBackgroundCapture,\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 { enableVisualTagging } 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 BrowserErrorObservable = 'browserErrorObservable',\n SelectionObservable = 'selectionObservable',\n MouseMoveObservable = 'mouseMoveObservable',\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 [ObservablesEnum.SelectionObservable]?: Observable<void>;\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 },\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 const resolvedExposureDuration =\n options.viewportContentUpdated?.exposureDuration ?? options.exposureDuration ?? DEFAULT_EXPOSURE_DURATION;\n options.viewportContentUpdated = {\n ...options.viewportContentUpdated,\n exposureDuration: resolvedExposureDuration,\n };\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('configs.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 exposureDuration: resolvedExposureDuration,\n });\n if (trackers.exposure) {\n subscriptions.push(trackers.exposure);\n }\n\n const beforeUnloadHandler = () => {\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 handleViewportContentUpdated(true);\n }),\n );\n } else if (globalScope) {\n const popstateHandler = () => {\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 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 and background capture on the shared messenger singleton.\n // Using the singleton ensures a single message listener per page, even when\n // session-replay is also loaded.\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n const messenger = getOrCreateWindowMessenger();\n enableVisualTagging(messenger, {\n dataExtractor,\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist,\n });\n enableBackgroundCapture(messenger);\n /* istanbul ignore next */\n messenger.setup({\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\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"]}
|
package/lib/esm/constants.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare const AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = "[Amplitude] Dead Cl
|
|
|
5
5
|
export declare const AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = "[Amplitude] Rage Click";
|
|
6
6
|
export declare const AMPLITUDE_ELEMENT_ERROR_CLICKED_EVENT = "[Amplitude] Error Click";
|
|
7
7
|
export declare const AMPLITUDE_ELEMENT_CHANGED_EVENT = "[Amplitude] Element Changed";
|
|
8
|
+
export declare const AMPLITUDE_PAGE_SCROLLED_EVENT = "[Amplitude] Page Scrolled";
|
|
8
9
|
export declare const AMPLITUDE_THRASHED_CURSOR_EVENT = "[Amplitude] Thrashed Cursor";
|
|
9
10
|
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_ID = "[Amplitude] Element ID";
|
|
10
11
|
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = "[Amplitude] Element Class";
|
|
@@ -16,15 +17,21 @@ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = "[Amplitude] E
|
|
|
16
17
|
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = "[Amplitude] Element Position Top";
|
|
17
18
|
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = "[Amplitude] Element Aria Label";
|
|
18
19
|
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = "[Amplitude] Element Attributes";
|
|
20
|
+
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_PATH = "[Amplitude] Element Path";
|
|
19
21
|
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = "[Amplitude] Element Parent Label";
|
|
20
22
|
export declare const AMPLITUDE_EVENT_PROP_PAGE_URL = "[Amplitude] Page URL";
|
|
21
23
|
export declare const AMPLITUDE_EVENT_PROP_PAGE_TITLE = "[Amplitude] Page Title";
|
|
22
24
|
export declare const AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = "[Amplitude] Viewport Height";
|
|
23
25
|
export declare const AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = "[Amplitude] Viewport Width";
|
|
26
|
+
export declare const AMPLITUDE_EVENT_PROP_MAX_PAGE_X = "[Amplitude] Max Page X";
|
|
27
|
+
export declare const AMPLITUDE_EVENT_PROP_MAX_PAGE_Y = "[Amplitude] Max Page Y";
|
|
28
|
+
export declare const AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID = "[Amplitude] Page View ID";
|
|
24
29
|
export { AMPLITUDE_ORIGIN, AMPLITUDE_ORIGIN_EU, AMPLITUDE_ORIGIN_STAGING, AMPLITUDE_ORIGINS_MAP, AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL, } from '@amplitude/analytics-core';
|
|
25
30
|
export declare const AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL = "https://cdn.amplitude.com/libs/visual-tagging-selector-1.0.0-alpha.js.gz";
|
|
26
31
|
export declare const AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = "amp-visual-tagging-selector-highlight";
|
|
27
32
|
export declare const DATA_AMP_MASK_ATTRIBUTES = "data-amp-mask-attributes";
|
|
28
33
|
export declare const MAX_MASK_TEXT_PATTERNS = 25;
|
|
29
34
|
export declare const MAX_ATTRIBUTE_LENGTH = 128;
|
|
35
|
+
export declare const PAGE_VIEW_SESSION_STORAGE_KEY = "AMP_PAGE_VIEW";
|
|
36
|
+
export declare const MAX_ELEMENT_EXPOSED_STR_LENGTH = 18000;
|
|
30
37
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,0CAA0C,CAAC;AACnE,eAAO,MAAM,uBAAuB,0CAA0C,CAAC;AAE/E,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAC7E,eAAO,MAAM,oCAAoC,2BAA2B,CAAC;AAC7E,eAAO,MAAM,oCAAoC,2BAA2B,CAAC;AAC7E,eAAO,MAAM,qCAAqC,4BAA4B,CAAC;AAC/E,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAC7E,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAE7E,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,kCAAkC,8BAA8B,CAAC;AAC9E,eAAO,MAAM,gCAAgC,4BAA4B,CAAC;AAC1E,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAC5E,eAAO,MAAM,sCAAsC,kCAAkC,CAAC;AACtF,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAC5E,eAAO,MAAM,0CAA0C,sCAAsC,CAAC;AAC9F,eAAO,MAAM,yCAAyC,qCAAqC,CAAC;AAC5F,eAAO,MAAM,uCAAuC,mCAAmC,CAAC;AACxF,eAAO,MAAM,uCAAuC,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,0CAA0C,CAAC;AACnE,eAAO,MAAM,uBAAuB,0CAA0C,CAAC;AAE/E,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAC7E,eAAO,MAAM,oCAAoC,2BAA2B,CAAC;AAC7E,eAAO,MAAM,oCAAoC,2BAA2B,CAAC;AAC7E,eAAO,MAAM,qCAAqC,4BAA4B,CAAC;AAC/E,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAC7E,eAAO,MAAM,6BAA6B,8BAA8B,CAAC;AACzE,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAE7E,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,kCAAkC,8BAA8B,CAAC;AAC9E,eAAO,MAAM,gCAAgC,4BAA4B,CAAC;AAC1E,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAC5E,eAAO,MAAM,sCAAsC,kCAAkC,CAAC;AACtF,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAC5E,eAAO,MAAM,0CAA0C,sCAAsC,CAAC;AAC9F,eAAO,MAAM,yCAAyC,qCAAqC,CAAC;AAC5F,eAAO,MAAM,uCAAuC,mCAAmC,CAAC;AACxF,eAAO,MAAM,uCAAuC,mCAAmC,CAAC;AACxF,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAE5E,eAAO,MAAM,yCAAyC,qCAAqC,CAAC;AAC5F,eAAO,MAAM,6BAA6B,yBAAyB,CAAC;AACpE,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,oCAAoC,gCAAgC,CAAC;AAClF,eAAO,MAAM,mCAAmC,+BAA+B,CAAC;AAChF,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AAExE,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAG5E,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,uCAAuC,GACxC,MAAM,2BAA2B,CAAC;AAEnC,eAAO,MAAM,4CAA4C,6EACmB,CAAC;AAG7E,eAAO,MAAM,wCAAwC,0CAA0C,CAAC;AAGhG,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAEnE,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAGxC,eAAO,MAAM,6BAA6B,kBAAkB,CAAC;AAE7D,eAAO,MAAM,8BAA8B,QAAS,CAAC"}
|
package/lib/esm/constants.js
CHANGED
|
@@ -5,6 +5,7 @@ export var AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = '[Amplitude] Dead Click';
|
|
|
5
5
|
export var AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = '[Amplitude] Rage Click';
|
|
6
6
|
export var AMPLITUDE_ELEMENT_ERROR_CLICKED_EVENT = '[Amplitude] Error Click';
|
|
7
7
|
export var AMPLITUDE_ELEMENT_CHANGED_EVENT = '[Amplitude] Element Changed';
|
|
8
|
+
export var AMPLITUDE_PAGE_SCROLLED_EVENT = '[Amplitude] Page Scrolled';
|
|
8
9
|
export var AMPLITUDE_THRASHED_CURSOR_EVENT = '[Amplitude] Thrashed Cursor';
|
|
9
10
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_ID = '[Amplitude] Element ID';
|
|
10
11
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = '[Amplitude] Element Class';
|
|
@@ -16,11 +17,15 @@ export var AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = '[Amplitude] Element Pos
|
|
|
16
17
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = '[Amplitude] Element Position Top';
|
|
17
18
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = '[Amplitude] Element Aria Label';
|
|
18
19
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = '[Amplitude] Element Attributes';
|
|
20
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_PATH = '[Amplitude] Element Path';
|
|
19
21
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = '[Amplitude] Element Parent Label';
|
|
20
22
|
export var AMPLITUDE_EVENT_PROP_PAGE_URL = '[Amplitude] Page URL';
|
|
21
23
|
export var AMPLITUDE_EVENT_PROP_PAGE_TITLE = '[Amplitude] Page Title';
|
|
22
24
|
export var AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = '[Amplitude] Viewport Height';
|
|
23
25
|
export var AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = '[Amplitude] Viewport Width';
|
|
26
|
+
export var AMPLITUDE_EVENT_PROP_MAX_PAGE_X = '[Amplitude] Max Page X';
|
|
27
|
+
export var AMPLITUDE_EVENT_PROP_MAX_PAGE_Y = '[Amplitude] Max Page Y';
|
|
28
|
+
export var AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID = '[Amplitude] Page View ID';
|
|
24
29
|
// Origin constants are now shared via analytics-core; re-export for backwards compatibility
|
|
25
30
|
export { AMPLITUDE_ORIGIN, AMPLITUDE_ORIGIN_EU, AMPLITUDE_ORIGIN_STAGING, AMPLITUDE_ORIGINS_MAP, AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL, } from '@amplitude/analytics-core';
|
|
26
31
|
export var AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL = 'https://cdn.amplitude.com/libs/visual-tagging-selector-1.0.0-alpha.js.gz';
|
|
@@ -31,4 +36,7 @@ export var AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = 'amp-visual-tagging-select
|
|
|
31
36
|
export var DATA_AMP_MASK_ATTRIBUTES = 'data-amp-mask-attributes';
|
|
32
37
|
export var MAX_MASK_TEXT_PATTERNS = 25;
|
|
33
38
|
export var MAX_ATTRIBUTE_LENGTH = 128;
|
|
39
|
+
// The key for the page view object in sessionStorage
|
|
40
|
+
export var PAGE_VIEW_SESSION_STORAGE_KEY = 'AMP_PAGE_VIEW';
|
|
41
|
+
export var MAX_ELEMENT_EXPOSED_STR_LENGTH = 18000;
|
|
34
42
|
//# sourceMappingURL=constants.js.map
|