@amplitude/plugin-autocapture-browser 1.12.0 → 1.12.2
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-dead-click.d.ts.map +1 -1
- package/lib/cjs/autocapture/track-dead-click.js +3 -0
- package/lib/cjs/autocapture/track-dead-click.js.map +1 -1
- package/lib/cjs/data-extractor.js +1 -1
- package/lib/cjs/data-extractor.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-dead-click.d.ts.map +1 -1
- package/lib/esm/autocapture/track-dead-click.js +3 -0
- package/lib/esm/autocapture/track-dead-click.js.map +1 -1
- package/lib/esm/data-extractor.js +1 -1
- package/lib/esm/data-extractor.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-dead-click.d.ts.map +1 -1
- package/lib/scripts/version.d.ts +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-dead-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAA6D,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMzG,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,QAEhE;AAOD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,oBAAoB,EAAE,gBAAgB,CAAC;CACxC,+
|
|
1
|
+
{"version":3,"file":"track-dead-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAA6D,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMzG,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,QAEhE;AAOD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,oBAAoB,EAAE,gBAAgB,CAAC;CACxC,+BA+DA"}
|
|
@@ -17,6 +17,9 @@ function trackDeadClick(_a) {
|
|
|
17
17
|
var filteredClickObservable = clickObservable.pipe((0, rxjs_1.filter)(helpers_1.filterOutNonTrackableEvents), (0, rxjs_1.filter)(function (clickEvent) {
|
|
18
18
|
// Only track change on elements that should be tracked
|
|
19
19
|
return shouldTrackDeadClick('click', clickEvent.closestTrackedAncestor);
|
|
20
|
+
}), (0, rxjs_1.filter)(function (clickEvent) {
|
|
21
|
+
var target = clickEvent.event.target;
|
|
22
|
+
return target.closest('a[target="_blank"]') === null;
|
|
20
23
|
}));
|
|
21
24
|
var changeObservables = [mutationObservable];
|
|
22
25
|
if (navigateObservable) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-dead-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":";;;;AACA,6BAAsG;AAEtG,sCAAyG;AACzG,0CAAoE;AAEpE,IAAI,kBAAkB,GAAG,IAAI,CAAC,CAAC,8CAA8C;AAE7E,uDAAuD;AACvD,SAAgB,wBAAwB,CAAC,gBAAwB;IAC/D,kBAAkB,GAAG,gBAAgB,CAAC;AACxC,CAAC;AAFD,4DAEC;AAOD,SAAgB,cAAc,CAAC,EAU9B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,kBAAkB,wBAAA,EAClB,oBAAoB,0BAAA;IAOZ,IAAA,eAAe,GAA6C,cAAc,gBAA3D,EAAE,kBAAkB,GAAyB,cAAc,mBAAvC,EAAE,kBAAkB,GAAK,cAAc,mBAAnB,CAAoB;IAEnF,IAAM,uBAAuB,GAAG,eAAe,CAAC,IAAI,CAClD,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,UAAU;QAChB,uDAAuD;QACvD,OAAO,oBAAoB,CAAC,OAAO,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC1E,CAAC,CAAC,CACH,CAAC;IAEF,IAAM,iBAAiB,GAEnB,CAAC,kBAAkB,CAAC,CAAC;IACzB,IAAI,kBAAkB,EAAE;QACtB,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;KAC5C;IACD,IAAM,kBAAkB,GAAG,YAAK,wDAAI,iBAAiB,UAAC,CAAC;IAEvD,IAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAC/C,IAAA,eAAQ,EAAC,UAAC,KAAK;QACb,wCAAwC;QACxC,IAAI,SAAwC,CAAC;QAC7C,IAAM,KAAK,GAAG,IAAI,iBAAU,CAAe,UAAC,UAAoC;YAC9E,SAAS,GAAG,UAAU,CAAC,cAAM,OAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAtB,CAAsB,EAAE,kBAAkB,CAAC,CAAC;YAEzE,OAAO;gBACL,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,sDAAsD;QACtD,qDAAqD;QACrD,OAAO,IAAA,WAAI,EACT,KAAK,EACL,kBAAkB,CAAC,IAAI,CACrB,IAAA,WAAI,EAAC,CAAC,CAAC,EACP,IAAA,UAAG,EAAC,cAAM,OAAA,IAAI,EAAJ,CAAI,CAAC,CAChB,CACF,CAAC,IAAI,CAAC,IAAA,aAAM,EAAC,UAAC,KAAK,IAAwD,OAAA,KAAK,KAAK,IAAI,EAAd,CAAc,CAAC,CAAC,CAAC;IAC/F,CAAC,CAAC;IACF,kDAAkD;IAClD,IAAA,mBAAY,EAAC,kBAAkB,CAAC,CACjC,CAAC;IAEF,OAAO,YAAY,CAAC,SAAS,CAAC,UAAC,WAAW;QACxC,IAAM,cAAc,GAAmB;YACrC,eAAe,EAAG,WAAW,CAAC,KAAoB,CAAC,OAAO;YAC1D,eAAe,EAAG,WAAW,CAAC,KAAoB,CAAC,OAAO;SAC3D,CAAC;QACF,SAAS,CAAC,KAAK,CACb,gDAAoC,wCAE/B,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,sBAAsB,CAAC,GAC/D,cAAc,GAEnB,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE,CAChC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;
|
|
1
|
+
{"version":3,"file":"track-dead-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":";;;;AACA,6BAAsG;AAEtG,sCAAyG;AACzG,0CAAoE;AAEpE,IAAI,kBAAkB,GAAG,IAAI,CAAC,CAAC,8CAA8C;AAE7E,uDAAuD;AACvD,SAAgB,wBAAwB,CAAC,gBAAwB;IAC/D,kBAAkB,GAAG,gBAAgB,CAAC;AACxC,CAAC;AAFD,4DAEC;AAOD,SAAgB,cAAc,CAAC,EAU9B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,kBAAkB,wBAAA,EAClB,oBAAoB,0BAAA;IAOZ,IAAA,eAAe,GAA6C,cAAc,gBAA3D,EAAE,kBAAkB,GAAyB,cAAc,mBAAvC,EAAE,kBAAkB,GAAK,cAAc,mBAAnB,CAAoB;IAEnF,IAAM,uBAAuB,GAAG,eAAe,CAAC,IAAI,CAClD,IAAA,aAAM,EAAC,qCAA2B,CAAC,EACnC,IAAA,aAAM,EAAC,UAAC,UAAU;QAChB,uDAAuD;QACvD,OAAO,oBAAoB,CAAC,OAAO,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC1E,CAAC,CAAC,EACF,IAAA,aAAM,EAAC,UAAC,UAAU;QAChB,IAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAiB,CAAC;QAClD,OAAO,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACvD,CAAC,CAAC,CACH,CAAC;IAEF,IAAM,iBAAiB,GAEnB,CAAC,kBAAkB,CAAC,CAAC;IACzB,IAAI,kBAAkB,EAAE;QACtB,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;KAC5C;IACD,IAAM,kBAAkB,GAAG,YAAK,wDAAI,iBAAiB,UAAC,CAAC;IAEvD,IAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAC/C,IAAA,eAAQ,EAAC,UAAC,KAAK;QACb,wCAAwC;QACxC,IAAI,SAAwC,CAAC;QAC7C,IAAM,KAAK,GAAG,IAAI,iBAAU,CAAe,UAAC,UAAoC;YAC9E,SAAS,GAAG,UAAU,CAAC,cAAM,OAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAtB,CAAsB,EAAE,kBAAkB,CAAC,CAAC;YAEzE,OAAO;gBACL,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,sDAAsD;QACtD,qDAAqD;QACrD,OAAO,IAAA,WAAI,EACT,KAAK,EACL,kBAAkB,CAAC,IAAI,CACrB,IAAA,WAAI,EAAC,CAAC,CAAC,EACP,IAAA,UAAG,EAAC,cAAM,OAAA,IAAI,EAAJ,CAAI,CAAC,CAChB,CACF,CAAC,IAAI,CAAC,IAAA,aAAM,EAAC,UAAC,KAAK,IAAwD,OAAA,KAAK,KAAK,IAAI,EAAd,CAAc,CAAC,CAAC,CAAC;IAC/F,CAAC,CAAC;IACF,kDAAkD;IAClD,IAAA,mBAAY,EAAC,kBAAkB,CAAC,CACjC,CAAC;IAEF,OAAO,YAAY,CAAC,SAAS,CAAC,UAAC,WAAW;QACxC,IAAM,cAAc,GAAmB;YACrC,eAAe,EAAG,WAAW,CAAC,KAAoB,CAAC,OAAO;YAC1D,eAAe,EAAG,WAAW,CAAC,KAAoB,CAAC,OAAO;SAC3D,CAAC;QACF,SAAS,CAAC,KAAK,CACb,gDAAoC,wCAE/B,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,sBAAsB,CAAC,GAC/D,cAAc,GAEnB,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE,CAChC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAzED,wCAyEC","sourcesContent":["import { AllWindowObservables, ObservablesEnum } from 'src/autocapture-plugin';\nimport { filter, map, merge, take, mergeMap, race, Observable, Subscriber, throttleTime } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { ElementBasedTimestampedEvent, filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT } from '../constants';\n\nlet DEAD_CLICK_TIMEOUT = 3000; // 3 seconds to wait for an activity to happen\n\n// allow override of dead click config for testing only\nexport function _overrideDeadClickConfig(deadClickTimeout: number) {\n DEAD_CLICK_TIMEOUT = deadClickTimeout;\n}\n\ntype EventDeadClick = {\n '[Amplitude] X': number;\n '[Amplitude] Y': number;\n};\n\nexport function trackDeadClick({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackDeadClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackDeadClick: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable } = allObservables;\n\n const filteredClickObservable = clickObservable.pipe(\n filter(filterOutNonTrackableEvents),\n filter((clickEvent) => {\n // Only track change on elements that should be tracked\n return shouldTrackDeadClick('click', clickEvent.closestTrackedAncestor);\n }),\n filter((clickEvent) => {\n const target = clickEvent.event.target as Element;\n return target.closest('a[target=\"_blank\"]') === null;\n }),\n );\n\n const changeObservables: Array<\n AllWindowObservables[ObservablesEnum.MutationObservable] | AllWindowObservables[ObservablesEnum.NavigateObservable]\n > = [mutationObservable];\n if (navigateObservable) {\n changeObservables.push(navigateObservable);\n }\n const mutationOrNavigate = merge(...changeObservables);\n\n const actionClicks = filteredClickObservable.pipe(\n mergeMap((click) => {\n // Create a timer that emits after 500ms\n let timeoutId: ReturnType<typeof setTimeout>;\n const timer = new Observable<typeof click>((subscriber: Subscriber<typeof click>) => {\n timeoutId = setTimeout(() => subscriber.next(click), DEAD_CLICK_TIMEOUT);\n\n return () => {\n clearTimeout(timeoutId);\n };\n });\n\n // Race between the timer and any mutations/navigation\n // if the timer wins, the click is dead so we emit it\n return race(\n timer,\n mutationOrNavigate.pipe(\n take(1),\n map(() => null),\n ),\n ).pipe(filter((value): value is ElementBasedTimestampedEvent<MouseEvent> => value !== null));\n }),\n // Only allow one dead click event every 3 seconds\n throttleTime(DEAD_CLICK_TIMEOUT),\n );\n\n return actionClicks.subscribe((actionClick) => {\n const deadClickEvent: EventDeadClick = {\n '[Amplitude] X': (actionClick.event as MouseEvent).clientX,\n '[Amplitude] Y': (actionClick.event as MouseEvent).clientY,\n };\n amplitude.track(\n AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT,\n {\n ...getEventProperties('click', actionClick.closestTrackedAncestor),\n ...deadClickEvent,\n },\n { time: actionClick.timestamp },\n );\n });\n}\n"]}
|
|
@@ -247,7 +247,7 @@ var DataExtractor = /** @class */ (function () {
|
|
|
247
247
|
}
|
|
248
248
|
else if ('pattern' in entry && typeof entry.pattern === 'string') {
|
|
249
249
|
try {
|
|
250
|
-
compiled.push(new RegExp(entry.pattern));
|
|
250
|
+
compiled.push(new RegExp(entry.pattern, 'i'));
|
|
251
251
|
}
|
|
252
252
|
catch (_c) {
|
|
253
253
|
// ignore invalid pattern strings
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-extractor.js","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport type { ElementInteractionsOptions, ActionType } from '@amplitude/analytics-core';\nimport type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport * as constants from './constants';\nimport {\n removeEmptyProperties,\n extractPrefixedAttributes,\n isElementPointerCursor,\n getClosestElement,\n isElementBasedEvent,\n parseAttributesToMask,\n} from './helpers';\nimport type { BaseTimestampedEvent, ElementBasedTimestampedEvent, TimestampedEvent } from './helpers';\nimport { getAncestors, getElementProperties } from './hierarchy';\nimport type { JSONValue } from './helpers';\nimport { getDataSource } from './pageActions/actions';\nimport { Hierarchy } from './typings/autocapture';\n\nconst CC_REGEX = /\\b(?:\\d[ -]*?){13,16}\\b/;\nconst SSN_REGEX = /(\\d{3}-?\\d{2}-?\\d{4})/g;\nconst EMAIL_REGEX = /[^\\s@]+@[^\\s@.]+\\.[^\\s@]+/g;\n\nexport class DataExtractor {\n private readonly additionalMaskTextPatterns: RegExp[];\n\n constructor(options: ElementInteractionsOptions) {\n const rawPatterns = options.maskTextRegex ?? [];\n\n const compiled: RegExp[] = [];\n for (const entry of rawPatterns) {\n if (compiled.length >= constants.MAX_MASK_TEXT_PATTERNS) {\n break;\n }\n if (entry instanceof RegExp) {\n compiled.push(entry);\n } else if ('pattern' in entry && typeof entry.pattern === 'string') {\n try {\n compiled.push(new RegExp(entry.pattern));\n } catch {\n // ignore invalid pattern strings\n }\n }\n }\n this.additionalMaskTextPatterns = compiled;\n }\n\n replaceSensitiveString = (text: string | null): string => {\n if (typeof text !== 'string') {\n return '';\n }\n\n let result = text;\n\n // Check for credit card number (with or without spaces/dashes)\n result = result.replace(CC_REGEX, constants.MASKED_TEXT_VALUE);\n\n // Check for social security number\n result = result.replace(SSN_REGEX, constants.MASKED_TEXT_VALUE);\n\n // Check for email\n result = result.replace(EMAIL_REGEX, constants.MASKED_TEXT_VALUE);\n\n // Check for additional mask text patterns\n for (const pattern of this.additionalMaskTextPatterns) {\n try {\n result = result.replace(pattern, constants.MASKED_TEXT_VALUE);\n } catch {\n // ignore invalid pattern\n }\n }\n\n return result;\n };\n\n // Get the DOM hierarchy of the element, starting from the target element to the root element.\n getHierarchy = (element: Element | null): Hierarchy => {\n let hierarchy: Hierarchy = [];\n if (!element) {\n return [];\n }\n\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n const ancestors = getAncestors(element);\n\n // Build attributes to mask map\n const elementToAttributesToMaskMap = new Map<Element, Set<string>>();\n\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const node = ancestors[i];\n if (node) {\n const attributesToMask = parseAttributesToMask(node.getAttribute(constants.DATA_AMP_MASK_ATTRIBUTES));\n const ancestorAttributesToMask =\n i === ancestors.length - 1 ? [] : elementToAttributesToMaskMap.get(ancestors[i + 1]) ?? new Set<string>();\n const combinedAttributesToMask = new Set([...ancestorAttributesToMask, ...attributesToMask]);\n elementToAttributesToMaskMap.set(node, combinedAttributesToMask);\n }\n }\n\n hierarchy = ancestors.map((el) =>\n getElementProperties(el, elementToAttributesToMaskMap.get(el) ?? new Set<string>()),\n );\n\n // Search for and mask any sensitive attribute values\n for (const hierarchyNode of hierarchy) {\n if (hierarchyNode?.attrs) {\n Object.entries(hierarchyNode.attrs).forEach(([key, value]) => {\n if (hierarchyNode.attrs) {\n hierarchyNode.attrs[key] = this.replaceSensitiveString(value);\n }\n });\n }\n }\n\n return hierarchy;\n };\n\n getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement: Element | null;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n return this.getText(labelElement);\n }\n return this.getNearestLabel(parent);\n };\n\n // Returns the Amplitude event properties for the given element.\n getEventProperties = (actionType: ActionType, element: Element, dataAttributePrefix: string) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n /* istanbul ignore next */\n const rect =\n typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n\n const hierarchy = this.getHierarchy(element);\n const currentElementAttributes = hierarchy[0]?.attrs;\n const nearestLabel = this.getNearestLabel(element);\n const attributes = extractPrefixedAttributes(currentElementAttributes ?? {}, dataAttributePrefix);\n\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: hierarchy,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT]: rect.left == null ? null : Math.round(rect.left),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP]: rect.top == null ? null : Math.round(rect.top),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]:\n (typeof document !== 'undefined' && this.replaceSensitiveString(document.title)) || '',\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n\n // id is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '';\n\n // class is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.getAttribute('class');\n\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = currentElementAttributes?.['aria-label'];\n\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = this.replaceSensitiveString(element.href); // we don't use hierarchy here because we don't want href value to be changed\n }\n\n return removeEmptyProperties(properties);\n };\n\n addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\n // capture the event if the cursor is a \"pointer\" when this element is clicked on\n // reason: a \"pointer\" cursor indicates that an element should be interactable\n // regardless of the element's tag name\n isCapturingCursorPointer = false,\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n if (isCapturingCursorPointer) {\n const isCursorPointer = isElementPointerCursor(baseEvent.event.target as Element, baseEvent.type);\n if (isCursorPointer) {\n baseEvent.closestTrackedAncestor = baseEvent.event.target as HTMLElement;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n baseEvent.closestTrackedAncestor,\n dataAttributePrefix,\n );\n return baseEvent;\n }\n }\n // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(baseEvent.event.target as HTMLElement, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n };\n\n extractDataFromDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Extract from DOM Element\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n const sourceElement = getDataSource(dataSource, contextElement);\n if (!sourceElement) {\n return undefined;\n }\n\n if (dataSource.elementExtractType === 'TEXT') {\n return this.getText(sourceElement);\n } else if (dataSource.elementExtractType === 'ATTRIBUTE' && dataSource.attribute) {\n return sourceElement.getAttribute(dataSource.attribute);\n }\n return undefined;\n }\n\n // TODO: Extract from other source types\n return undefined;\n };\n\n getText = (element: Element): string => {\n // Check if element or any parent has data-amp-mask attribute\n const hasMaskAttribute = element.closest(`[${constants.TEXT_MASK_ATTRIBUTE}]`) !== null;\n if (hasMaskAttribute) {\n return constants.MASKED_TEXT_VALUE;\n }\n let output = '';\n if (!element.querySelector(`[${constants.TEXT_MASK_ATTRIBUTE}], [contenteditable]`)) {\n output = (element as HTMLElement).innerText || '';\n } else {\n const clonedTree = element.cloneNode(true) as HTMLElement;\n // replace all elements with TEXT_MASK_ATTRIBUTE attribute and contenteditable with the text MASKED_TEXT_VALUE\n clonedTree.querySelectorAll(`[${constants.TEXT_MASK_ATTRIBUTE}], [contenteditable]`).forEach((node) => {\n (node as HTMLElement).innerText = constants.MASKED_TEXT_VALUE;\n });\n output = clonedTree.innerText || '';\n }\n return this.replaceSensitiveString(output.substring(0, 255)).replace(/\\s+/g, ' ').trim();\n };\n\n // Returns the element properties for the given element in Visual Labeling.\n getEventTagProps = (element: Element): Record<string, JSONValue> => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties) as Record<string, JSONValue>;\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"data-extractor.js","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport type { ElementInteractionsOptions, ActionType } from '@amplitude/analytics-core';\nimport type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport * as constants from './constants';\nimport {\n removeEmptyProperties,\n extractPrefixedAttributes,\n isElementPointerCursor,\n getClosestElement,\n isElementBasedEvent,\n parseAttributesToMask,\n} from './helpers';\nimport type { BaseTimestampedEvent, ElementBasedTimestampedEvent, TimestampedEvent } from './helpers';\nimport { getAncestors, getElementProperties } from './hierarchy';\nimport type { JSONValue } from './helpers';\nimport { getDataSource } from './pageActions/actions';\nimport { Hierarchy } from './typings/autocapture';\n\nconst CC_REGEX = /\\b(?:\\d[ -]*?){13,16}\\b/;\nconst SSN_REGEX = /(\\d{3}-?\\d{2}-?\\d{4})/g;\nconst EMAIL_REGEX = /[^\\s@]+@[^\\s@.]+\\.[^\\s@]+/g;\n\nexport class DataExtractor {\n private readonly additionalMaskTextPatterns: RegExp[];\n\n constructor(options: ElementInteractionsOptions) {\n const rawPatterns = options.maskTextRegex ?? [];\n\n const compiled: RegExp[] = [];\n for (const entry of rawPatterns) {\n if (compiled.length >= constants.MAX_MASK_TEXT_PATTERNS) {\n break;\n }\n if (entry instanceof RegExp) {\n compiled.push(entry);\n } else if ('pattern' in entry && typeof entry.pattern === 'string') {\n try {\n compiled.push(new RegExp(entry.pattern, 'i'));\n } catch {\n // ignore invalid pattern strings\n }\n }\n }\n this.additionalMaskTextPatterns = compiled;\n }\n\n replaceSensitiveString = (text: string | null): string => {\n if (typeof text !== 'string') {\n return '';\n }\n\n let result = text;\n\n // Check for credit card number (with or without spaces/dashes)\n result = result.replace(CC_REGEX, constants.MASKED_TEXT_VALUE);\n\n // Check for social security number\n result = result.replace(SSN_REGEX, constants.MASKED_TEXT_VALUE);\n\n // Check for email\n result = result.replace(EMAIL_REGEX, constants.MASKED_TEXT_VALUE);\n\n // Check for additional mask text patterns\n for (const pattern of this.additionalMaskTextPatterns) {\n try {\n result = result.replace(pattern, constants.MASKED_TEXT_VALUE);\n } catch {\n // ignore invalid pattern\n }\n }\n\n return result;\n };\n\n // Get the DOM hierarchy of the element, starting from the target element to the root element.\n getHierarchy = (element: Element | null): Hierarchy => {\n let hierarchy: Hierarchy = [];\n if (!element) {\n return [];\n }\n\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n const ancestors = getAncestors(element);\n\n // Build attributes to mask map\n const elementToAttributesToMaskMap = new Map<Element, Set<string>>();\n\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const node = ancestors[i];\n if (node) {\n const attributesToMask = parseAttributesToMask(node.getAttribute(constants.DATA_AMP_MASK_ATTRIBUTES));\n const ancestorAttributesToMask =\n i === ancestors.length - 1 ? [] : elementToAttributesToMaskMap.get(ancestors[i + 1]) ?? new Set<string>();\n const combinedAttributesToMask = new Set([...ancestorAttributesToMask, ...attributesToMask]);\n elementToAttributesToMaskMap.set(node, combinedAttributesToMask);\n }\n }\n\n hierarchy = ancestors.map((el) =>\n getElementProperties(el, elementToAttributesToMaskMap.get(el) ?? new Set<string>()),\n );\n\n // Search for and mask any sensitive attribute values\n for (const hierarchyNode of hierarchy) {\n if (hierarchyNode?.attrs) {\n Object.entries(hierarchyNode.attrs).forEach(([key, value]) => {\n if (hierarchyNode.attrs) {\n hierarchyNode.attrs[key] = this.replaceSensitiveString(value);\n }\n });\n }\n }\n\n return hierarchy;\n };\n\n getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement: Element | null;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n return this.getText(labelElement);\n }\n return this.getNearestLabel(parent);\n };\n\n // Returns the Amplitude event properties for the given element.\n getEventProperties = (actionType: ActionType, element: Element, dataAttributePrefix: string) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n /* istanbul ignore next */\n const rect =\n typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n\n const hierarchy = this.getHierarchy(element);\n const currentElementAttributes = hierarchy[0]?.attrs;\n const nearestLabel = this.getNearestLabel(element);\n const attributes = extractPrefixedAttributes(currentElementAttributes ?? {}, dataAttributePrefix);\n\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: hierarchy,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT]: rect.left == null ? null : Math.round(rect.left),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP]: rect.top == null ? null : Math.round(rect.top),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]:\n (typeof document !== 'undefined' && this.replaceSensitiveString(document.title)) || '',\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n\n // id is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '';\n\n // class is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.getAttribute('class');\n\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = currentElementAttributes?.['aria-label'];\n\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = this.replaceSensitiveString(element.href); // we don't use hierarchy here because we don't want href value to be changed\n }\n\n return removeEmptyProperties(properties);\n };\n\n addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\n // capture the event if the cursor is a \"pointer\" when this element is clicked on\n // reason: a \"pointer\" cursor indicates that an element should be interactable\n // regardless of the element's tag name\n isCapturingCursorPointer = false,\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n if (isCapturingCursorPointer) {\n const isCursorPointer = isElementPointerCursor(baseEvent.event.target as Element, baseEvent.type);\n if (isCursorPointer) {\n baseEvent.closestTrackedAncestor = baseEvent.event.target as HTMLElement;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n baseEvent.closestTrackedAncestor,\n dataAttributePrefix,\n );\n return baseEvent;\n }\n }\n // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(baseEvent.event.target as HTMLElement, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n };\n\n extractDataFromDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Extract from DOM Element\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n const sourceElement = getDataSource(dataSource, contextElement);\n if (!sourceElement) {\n return undefined;\n }\n\n if (dataSource.elementExtractType === 'TEXT') {\n return this.getText(sourceElement);\n } else if (dataSource.elementExtractType === 'ATTRIBUTE' && dataSource.attribute) {\n return sourceElement.getAttribute(dataSource.attribute);\n }\n return undefined;\n }\n\n // TODO: Extract from other source types\n return undefined;\n };\n\n getText = (element: Element): string => {\n // Check if element or any parent has data-amp-mask attribute\n const hasMaskAttribute = element.closest(`[${constants.TEXT_MASK_ATTRIBUTE}]`) !== null;\n if (hasMaskAttribute) {\n return constants.MASKED_TEXT_VALUE;\n }\n let output = '';\n if (!element.querySelector(`[${constants.TEXT_MASK_ATTRIBUTE}], [contenteditable]`)) {\n output = (element as HTMLElement).innerText || '';\n } else {\n const clonedTree = element.cloneNode(true) as HTMLElement;\n // replace all elements with TEXT_MASK_ATTRIBUTE attribute and contenteditable with the text MASKED_TEXT_VALUE\n clonedTree.querySelectorAll(`[${constants.TEXT_MASK_ATTRIBUTE}], [contenteditable]`).forEach((node) => {\n (node as HTMLElement).innerText = constants.MASKED_TEXT_VALUE;\n });\n output = clonedTree.innerText || '';\n }\n return this.replaceSensitiveString(output.substring(0, 255)).replace(/\\s+/g, ' ').trim();\n };\n\n // Returns the element properties for the given element in Visual Labeling.\n getEventTagProps = (element: Element): Record<string, JSONValue> => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties) as Record<string, JSONValue>;\n };\n}\n"]}
|
package/lib/cjs/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "1.12.
|
|
1
|
+
export declare const VERSION = "1.12.2";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/lib/cjs/version.js
CHANGED
package/lib/cjs/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '1.12.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '1.12.2';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-dead-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAA6D,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMzG,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,QAEhE;AAOD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,oBAAoB,EAAE,gBAAgB,CAAC;CACxC,+
|
|
1
|
+
{"version":3,"file":"track-dead-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAA6D,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAMzG,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,QAEhE;AAOD,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,oBAAoB,EAAE,gBAAgB,CAAC;CACxC,+BA+DA"}
|
|
@@ -13,6 +13,9 @@ export function trackDeadClick(_a) {
|
|
|
13
13
|
var filteredClickObservable = clickObservable.pipe(filter(filterOutNonTrackableEvents), filter(function (clickEvent) {
|
|
14
14
|
// Only track change on elements that should be tracked
|
|
15
15
|
return shouldTrackDeadClick('click', clickEvent.closestTrackedAncestor);
|
|
16
|
+
}), filter(function (clickEvent) {
|
|
17
|
+
var target = clickEvent.event.target;
|
|
18
|
+
return target.closest('a[target="_blank"]') === null;
|
|
16
19
|
}));
|
|
17
20
|
var changeObservables = [mutationObservable];
|
|
18
21
|
if (navigateObservable) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-dead-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAc,YAAY,EAAE,MAAM,MAAM,CAAC;AAEtG,OAAO,EAAgC,2BAA2B,EAAoB,MAAM,YAAY,CAAC;AACzG,OAAO,EAAE,oCAAoC,EAAE,MAAM,cAAc,CAAC;AAEpE,IAAI,kBAAkB,GAAG,IAAI,CAAC,CAAC,8CAA8C;AAE7E,uDAAuD;AACvD,MAAM,UAAU,wBAAwB,CAAC,gBAAwB;IAC/D,kBAAkB,GAAG,gBAAgB,CAAC;AACxC,CAAC;AAOD,MAAM,UAAU,cAAc,CAAC,EAU9B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,kBAAkB,wBAAA,EAClB,oBAAoB,0BAAA;IAOZ,IAAA,eAAe,GAA6C,cAAc,gBAA3D,EAAE,kBAAkB,GAAyB,cAAc,mBAAvC,EAAE,kBAAkB,GAAK,cAAc,mBAAnB,CAAoB;IAEnF,IAAM,uBAAuB,GAAG,eAAe,CAAC,IAAI,CAClD,MAAM,CAAC,2BAA2B,CAAC,EACnC,MAAM,CAAC,UAAC,UAAU;QAChB,uDAAuD;QACvD,OAAO,oBAAoB,CAAC,OAAO,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC1E,CAAC,CAAC,CACH,CAAC;IAEF,IAAM,iBAAiB,GAEnB,CAAC,kBAAkB,CAAC,CAAC;IACzB,IAAI,kBAAkB,EAAE;QACtB,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;KAC5C;IACD,IAAM,kBAAkB,GAAG,KAAK,wCAAI,iBAAiB,UAAC,CAAC;IAEvD,IAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAC/C,QAAQ,CAAC,UAAC,KAAK;QACb,wCAAwC;QACxC,IAAI,SAAwC,CAAC;QAC7C,IAAM,KAAK,GAAG,IAAI,UAAU,CAAe,UAAC,UAAoC;YAC9E,SAAS,GAAG,UAAU,CAAC,cAAM,OAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAtB,CAAsB,EAAE,kBAAkB,CAAC,CAAC;YAEzE,OAAO;gBACL,YAAY,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,sDAAsD;QACtD,qDAAqD;QACrD,OAAO,IAAI,CACT,KAAK,EACL,kBAAkB,CAAC,IAAI,CACrB,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,cAAM,OAAA,IAAI,EAAJ,CAAI,CAAC,CAChB,CACF,CAAC,IAAI,CAAC,MAAM,CAAC,UAAC,KAAK,IAAwD,OAAA,KAAK,KAAK,IAAI,EAAd,CAAc,CAAC,CAAC,CAAC;IAC/F,CAAC,CAAC;IACF,kDAAkD;IAClD,YAAY,CAAC,kBAAkB,CAAC,CACjC,CAAC;IAEF,OAAO,YAAY,CAAC,SAAS,CAAC,UAAC,WAAW;QACxC,IAAM,cAAc,GAAmB;YACrC,eAAe,EAAG,WAAW,CAAC,KAAoB,CAAC,OAAO;YAC1D,eAAe,EAAG,WAAW,CAAC,KAAoB,CAAC,OAAO;SAC3D,CAAC;QACF,SAAS,CAAC,KAAK,CACb,oCAAoC,wBAE/B,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,sBAAsB,CAAC,GAC/D,cAAc,GAEnB,EAAE,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE,CAChC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { AllWindowObservables, ObservablesEnum } from 'src/autocapture-plugin';\nimport { filter, map, merge, take, mergeMap, race, Observable, Subscriber, throttleTime } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { ElementBasedTimestampedEvent, filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT } from '../constants';\n\nlet DEAD_CLICK_TIMEOUT = 3000; // 3 seconds to wait for an activity to happen\n\n// allow override of dead click config for testing only\nexport function _overrideDeadClickConfig(deadClickTimeout: number) {\n DEAD_CLICK_TIMEOUT = deadClickTimeout;\n}\n\ntype EventDeadClick = {\n '[Amplitude] X': number;\n '[Amplitude] Y': number;\n};\n\nexport function trackDeadClick({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackDeadClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackDeadClick: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable } = allObservables;\n\n const filteredClickObservable = clickObservable.pipe(\n filter(filterOutNonTrackableEvents),\n filter((clickEvent) => {\n // Only track change on elements that should be tracked\n return shouldTrackDeadClick('click', clickEvent.closestTrackedAncestor);\n }),\n );\n\n const changeObservables: Array<\n AllWindowObservables[ObservablesEnum.MutationObservable] | AllWindowObservables[ObservablesEnum.NavigateObservable]\n > = [mutationObservable];\n if (navigateObservable) {\n changeObservables.push(navigateObservable);\n }\n const mutationOrNavigate = merge(...changeObservables);\n\n const actionClicks = filteredClickObservable.pipe(\n mergeMap((click) => {\n // Create a timer that emits after 500ms\n let timeoutId: ReturnType<typeof setTimeout>;\n const timer = new Observable<typeof click>((subscriber: Subscriber<typeof click>) => {\n timeoutId = setTimeout(() => subscriber.next(click), DEAD_CLICK_TIMEOUT);\n\n return () => {\n clearTimeout(timeoutId);\n };\n });\n\n // Race between the timer and any mutations/navigation\n // if the timer wins, the click is dead so we emit it\n return race(\n timer,\n mutationOrNavigate.pipe(\n take(1),\n map(() => null),\n ),\n ).pipe(filter((value): value is ElementBasedTimestampedEvent<MouseEvent> => value !== null));\n }),\n // Only allow one dead click event every 3 seconds\n throttleTime(DEAD_CLICK_TIMEOUT),\n );\n\n return actionClicks.subscribe((actionClick) => {\n const deadClickEvent: EventDeadClick = {\n '[Amplitude] X': (actionClick.event as MouseEvent).clientX,\n '[Amplitude] Y': (actionClick.event as MouseEvent).clientY,\n };\n amplitude.track(\n AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT,\n {\n ...getEventProperties('click', actionClick.closestTrackedAncestor),\n ...deadClickEvent,\n },\n { time: actionClick.timestamp },\n );\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"track-dead-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-dead-click.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllWindowObservables, ObservablesEnum } from 'src/autocapture-plugin';\nimport { filter, map, merge, take, mergeMap, race, Observable, Subscriber, throttleTime } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { ElementBasedTimestampedEvent, filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT } from '../constants';\n\nlet DEAD_CLICK_TIMEOUT = 3000; // 3 seconds to wait for an activity to happen\n\n// allow override of dead click config for testing only\nexport function _overrideDeadClickConfig(deadClickTimeout: number) {\n DEAD_CLICK_TIMEOUT = deadClickTimeout;\n}\n\ntype EventDeadClick = {\n '[Amplitude] X': number;\n '[Amplitude] Y': number;\n};\n\nexport function trackDeadClick({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackDeadClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackDeadClick: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable } = allObservables;\n\n const filteredClickObservable = clickObservable.pipe(\n filter(filterOutNonTrackableEvents),\n filter((clickEvent) => {\n // Only track change on elements that should be tracked\n return shouldTrackDeadClick('click', clickEvent.closestTrackedAncestor);\n }),\n filter((clickEvent) => {\n const target = clickEvent.event.target as Element;\n return target.closest('a[target=\"_blank\"]') === null;\n }),\n );\n\n const changeObservables: Array<\n AllWindowObservables[ObservablesEnum.MutationObservable] | AllWindowObservables[ObservablesEnum.NavigateObservable]\n > = [mutationObservable];\n if (navigateObservable) {\n changeObservables.push(navigateObservable);\n }\n const mutationOrNavigate = merge(...changeObservables);\n\n const actionClicks = filteredClickObservable.pipe(\n mergeMap((click) => {\n // Create a timer that emits after 500ms\n let timeoutId: ReturnType<typeof setTimeout>;\n const timer = new Observable<typeof click>((subscriber: Subscriber<typeof click>) => {\n timeoutId = setTimeout(() => subscriber.next(click), DEAD_CLICK_TIMEOUT);\n\n return () => {\n clearTimeout(timeoutId);\n };\n });\n\n // Race between the timer and any mutations/navigation\n // if the timer wins, the click is dead so we emit it\n return race(\n timer,\n mutationOrNavigate.pipe(\n take(1),\n map(() => null),\n ),\n ).pipe(filter((value): value is ElementBasedTimestampedEvent<MouseEvent> => value !== null));\n }),\n // Only allow one dead click event every 3 seconds\n throttleTime(DEAD_CLICK_TIMEOUT),\n );\n\n return actionClicks.subscribe((actionClick) => {\n const deadClickEvent: EventDeadClick = {\n '[Amplitude] X': (actionClick.event as MouseEvent).clientX,\n '[Amplitude] Y': (actionClick.event as MouseEvent).clientY,\n };\n amplitude.track(\n AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT,\n {\n ...getEventProperties('click', actionClick.closestTrackedAncestor),\n ...deadClickEvent,\n },\n { time: actionClick.timestamp },\n );\n });\n}\n"]}
|
|
@@ -244,7 +244,7 @@ var DataExtractor = /** @class */ (function () {
|
|
|
244
244
|
}
|
|
245
245
|
else if ('pattern' in entry && typeof entry.pattern === 'string') {
|
|
246
246
|
try {
|
|
247
|
-
compiled.push(new RegExp(entry.pattern));
|
|
247
|
+
compiled.push(new RegExp(entry.pattern, 'i'));
|
|
248
248
|
}
|
|
249
249
|
catch (_c) {
|
|
250
250
|
// ignore invalid pattern strings
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-extractor.js","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport type { ElementInteractionsOptions, ActionType } from '@amplitude/analytics-core';\nimport type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport * as constants from './constants';\nimport {\n removeEmptyProperties,\n extractPrefixedAttributes,\n isElementPointerCursor,\n getClosestElement,\n isElementBasedEvent,\n parseAttributesToMask,\n} from './helpers';\nimport type { BaseTimestampedEvent, ElementBasedTimestampedEvent, TimestampedEvent } from './helpers';\nimport { getAncestors, getElementProperties } from './hierarchy';\nimport type { JSONValue } from './helpers';\nimport { getDataSource } from './pageActions/actions';\nimport { Hierarchy } from './typings/autocapture';\n\nconst CC_REGEX = /\\b(?:\\d[ -]*?){13,16}\\b/;\nconst SSN_REGEX = /(\\d{3}-?\\d{2}-?\\d{4})/g;\nconst EMAIL_REGEX = /[^\\s@]+@[^\\s@.]+\\.[^\\s@]+/g;\n\nexport class DataExtractor {\n private readonly additionalMaskTextPatterns: RegExp[];\n\n constructor(options: ElementInteractionsOptions) {\n const rawPatterns = options.maskTextRegex ?? [];\n\n const compiled: RegExp[] = [];\n for (const entry of rawPatterns) {\n if (compiled.length >= constants.MAX_MASK_TEXT_PATTERNS) {\n break;\n }\n if (entry instanceof RegExp) {\n compiled.push(entry);\n } else if ('pattern' in entry && typeof entry.pattern === 'string') {\n try {\n compiled.push(new RegExp(entry.pattern));\n } catch {\n // ignore invalid pattern strings\n }\n }\n }\n this.additionalMaskTextPatterns = compiled;\n }\n\n replaceSensitiveString = (text: string | null): string => {\n if (typeof text !== 'string') {\n return '';\n }\n\n let result = text;\n\n // Check for credit card number (with or without spaces/dashes)\n result = result.replace(CC_REGEX, constants.MASKED_TEXT_VALUE);\n\n // Check for social security number\n result = result.replace(SSN_REGEX, constants.MASKED_TEXT_VALUE);\n\n // Check for email\n result = result.replace(EMAIL_REGEX, constants.MASKED_TEXT_VALUE);\n\n // Check for additional mask text patterns\n for (const pattern of this.additionalMaskTextPatterns) {\n try {\n result = result.replace(pattern, constants.MASKED_TEXT_VALUE);\n } catch {\n // ignore invalid pattern\n }\n }\n\n return result;\n };\n\n // Get the DOM hierarchy of the element, starting from the target element to the root element.\n getHierarchy = (element: Element | null): Hierarchy => {\n let hierarchy: Hierarchy = [];\n if (!element) {\n return [];\n }\n\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n const ancestors = getAncestors(element);\n\n // Build attributes to mask map\n const elementToAttributesToMaskMap = new Map<Element, Set<string>>();\n\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const node = ancestors[i];\n if (node) {\n const attributesToMask = parseAttributesToMask(node.getAttribute(constants.DATA_AMP_MASK_ATTRIBUTES));\n const ancestorAttributesToMask =\n i === ancestors.length - 1 ? [] : elementToAttributesToMaskMap.get(ancestors[i + 1]) ?? new Set<string>();\n const combinedAttributesToMask = new Set([...ancestorAttributesToMask, ...attributesToMask]);\n elementToAttributesToMaskMap.set(node, combinedAttributesToMask);\n }\n }\n\n hierarchy = ancestors.map((el) =>\n getElementProperties(el, elementToAttributesToMaskMap.get(el) ?? new Set<string>()),\n );\n\n // Search for and mask any sensitive attribute values\n for (const hierarchyNode of hierarchy) {\n if (hierarchyNode?.attrs) {\n Object.entries(hierarchyNode.attrs).forEach(([key, value]) => {\n if (hierarchyNode.attrs) {\n hierarchyNode.attrs[key] = this.replaceSensitiveString(value);\n }\n });\n }\n }\n\n return hierarchy;\n };\n\n getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement: Element | null;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n return this.getText(labelElement);\n }\n return this.getNearestLabel(parent);\n };\n\n // Returns the Amplitude event properties for the given element.\n getEventProperties = (actionType: ActionType, element: Element, dataAttributePrefix: string) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n /* istanbul ignore next */\n const rect =\n typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n\n const hierarchy = this.getHierarchy(element);\n const currentElementAttributes = hierarchy[0]?.attrs;\n const nearestLabel = this.getNearestLabel(element);\n const attributes = extractPrefixedAttributes(currentElementAttributes ?? {}, dataAttributePrefix);\n\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: hierarchy,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT]: rect.left == null ? null : Math.round(rect.left),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP]: rect.top == null ? null : Math.round(rect.top),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]:\n (typeof document !== 'undefined' && this.replaceSensitiveString(document.title)) || '',\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n\n // id is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '';\n\n // class is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.getAttribute('class');\n\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = currentElementAttributes?.['aria-label'];\n\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = this.replaceSensitiveString(element.href); // we don't use hierarchy here because we don't want href value to be changed\n }\n\n return removeEmptyProperties(properties);\n };\n\n addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\n // capture the event if the cursor is a \"pointer\" when this element is clicked on\n // reason: a \"pointer\" cursor indicates that an element should be interactable\n // regardless of the element's tag name\n isCapturingCursorPointer = false,\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n if (isCapturingCursorPointer) {\n const isCursorPointer = isElementPointerCursor(baseEvent.event.target as Element, baseEvent.type);\n if (isCursorPointer) {\n baseEvent.closestTrackedAncestor = baseEvent.event.target as HTMLElement;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n baseEvent.closestTrackedAncestor,\n dataAttributePrefix,\n );\n return baseEvent;\n }\n }\n // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(baseEvent.event.target as HTMLElement, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n };\n\n extractDataFromDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Extract from DOM Element\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n const sourceElement = getDataSource(dataSource, contextElement);\n if (!sourceElement) {\n return undefined;\n }\n\n if (dataSource.elementExtractType === 'TEXT') {\n return this.getText(sourceElement);\n } else if (dataSource.elementExtractType === 'ATTRIBUTE' && dataSource.attribute) {\n return sourceElement.getAttribute(dataSource.attribute);\n }\n return undefined;\n }\n\n // TODO: Extract from other source types\n return undefined;\n };\n\n getText = (element: Element): string => {\n // Check if element or any parent has data-amp-mask attribute\n const hasMaskAttribute = element.closest(`[${constants.TEXT_MASK_ATTRIBUTE}]`) !== null;\n if (hasMaskAttribute) {\n return constants.MASKED_TEXT_VALUE;\n }\n let output = '';\n if (!element.querySelector(`[${constants.TEXT_MASK_ATTRIBUTE}], [contenteditable]`)) {\n output = (element as HTMLElement).innerText || '';\n } else {\n const clonedTree = element.cloneNode(true) as HTMLElement;\n // replace all elements with TEXT_MASK_ATTRIBUTE attribute and contenteditable with the text MASKED_TEXT_VALUE\n clonedTree.querySelectorAll(`[${constants.TEXT_MASK_ATTRIBUTE}], [contenteditable]`).forEach((node) => {\n (node as HTMLElement).innerText = constants.MASKED_TEXT_VALUE;\n });\n output = clonedTree.innerText || '';\n }\n return this.replaceSensitiveString(output.substring(0, 255)).replace(/\\s+/g, ' ').trim();\n };\n\n // Returns the element properties for the given element in Visual Labeling.\n getEventTagProps = (element: Element): Record<string, JSONValue> => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties) as Record<string, JSONValue>;\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"data-extractor.js","sourceRoot":"","sources":["../../src/data-extractor.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport type { ElementInteractionsOptions, ActionType } from '@amplitude/analytics-core';\nimport type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport * as constants from './constants';\nimport {\n removeEmptyProperties,\n extractPrefixedAttributes,\n isElementPointerCursor,\n getClosestElement,\n isElementBasedEvent,\n parseAttributesToMask,\n} from './helpers';\nimport type { BaseTimestampedEvent, ElementBasedTimestampedEvent, TimestampedEvent } from './helpers';\nimport { getAncestors, getElementProperties } from './hierarchy';\nimport type { JSONValue } from './helpers';\nimport { getDataSource } from './pageActions/actions';\nimport { Hierarchy } from './typings/autocapture';\n\nconst CC_REGEX = /\\b(?:\\d[ -]*?){13,16}\\b/;\nconst SSN_REGEX = /(\\d{3}-?\\d{2}-?\\d{4})/g;\nconst EMAIL_REGEX = /[^\\s@]+@[^\\s@.]+\\.[^\\s@]+/g;\n\nexport class DataExtractor {\n private readonly additionalMaskTextPatterns: RegExp[];\n\n constructor(options: ElementInteractionsOptions) {\n const rawPatterns = options.maskTextRegex ?? [];\n\n const compiled: RegExp[] = [];\n for (const entry of rawPatterns) {\n if (compiled.length >= constants.MAX_MASK_TEXT_PATTERNS) {\n break;\n }\n if (entry instanceof RegExp) {\n compiled.push(entry);\n } else if ('pattern' in entry && typeof entry.pattern === 'string') {\n try {\n compiled.push(new RegExp(entry.pattern, 'i'));\n } catch {\n // ignore invalid pattern strings\n }\n }\n }\n this.additionalMaskTextPatterns = compiled;\n }\n\n replaceSensitiveString = (text: string | null): string => {\n if (typeof text !== 'string') {\n return '';\n }\n\n let result = text;\n\n // Check for credit card number (with or without spaces/dashes)\n result = result.replace(CC_REGEX, constants.MASKED_TEXT_VALUE);\n\n // Check for social security number\n result = result.replace(SSN_REGEX, constants.MASKED_TEXT_VALUE);\n\n // Check for email\n result = result.replace(EMAIL_REGEX, constants.MASKED_TEXT_VALUE);\n\n // Check for additional mask text patterns\n for (const pattern of this.additionalMaskTextPatterns) {\n try {\n result = result.replace(pattern, constants.MASKED_TEXT_VALUE);\n } catch {\n // ignore invalid pattern\n }\n }\n\n return result;\n };\n\n // Get the DOM hierarchy of the element, starting from the target element to the root element.\n getHierarchy = (element: Element | null): Hierarchy => {\n let hierarchy: Hierarchy = [];\n if (!element) {\n return [];\n }\n\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n const ancestors = getAncestors(element);\n\n // Build attributes to mask map\n const elementToAttributesToMaskMap = new Map<Element, Set<string>>();\n\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const node = ancestors[i];\n if (node) {\n const attributesToMask = parseAttributesToMask(node.getAttribute(constants.DATA_AMP_MASK_ATTRIBUTES));\n const ancestorAttributesToMask =\n i === ancestors.length - 1 ? [] : elementToAttributesToMaskMap.get(ancestors[i + 1]) ?? new Set<string>();\n const combinedAttributesToMask = new Set([...ancestorAttributesToMask, ...attributesToMask]);\n elementToAttributesToMaskMap.set(node, combinedAttributesToMask);\n }\n }\n\n hierarchy = ancestors.map((el) =>\n getElementProperties(el, elementToAttributesToMaskMap.get(el) ?? new Set<string>()),\n );\n\n // Search for and mask any sensitive attribute values\n for (const hierarchyNode of hierarchy) {\n if (hierarchyNode?.attrs) {\n Object.entries(hierarchyNode.attrs).forEach(([key, value]) => {\n if (hierarchyNode.attrs) {\n hierarchyNode.attrs[key] = this.replaceSensitiveString(value);\n }\n });\n }\n }\n\n return hierarchy;\n };\n\n getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement: Element | null;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n return this.getText(labelElement);\n }\n return this.getNearestLabel(parent);\n };\n\n // Returns the Amplitude event properties for the given element.\n getEventProperties = (actionType: ActionType, element: Element, dataAttributePrefix: string) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n /* istanbul ignore next */\n const rect =\n typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n\n const hierarchy = this.getHierarchy(element);\n const currentElementAttributes = hierarchy[0]?.attrs;\n const nearestLabel = this.getNearestLabel(element);\n const attributes = extractPrefixedAttributes(currentElementAttributes ?? {}, dataAttributePrefix);\n\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: hierarchy,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT]: rect.left == null ? null : Math.round(rect.left),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP]: rect.top == null ? null : Math.round(rect.top),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]:\n (typeof document !== 'undefined' && this.replaceSensitiveString(document.title)) || '',\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n\n // id is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '';\n\n // class is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.getAttribute('class');\n\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = currentElementAttributes?.['aria-label'];\n\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = this.replaceSensitiveString(element.href); // we don't use hierarchy here because we don't want href value to be changed\n }\n\n return removeEmptyProperties(properties);\n };\n\n addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\n // capture the event if the cursor is a \"pointer\" when this element is clicked on\n // reason: a \"pointer\" cursor indicates that an element should be interactable\n // regardless of the element's tag name\n isCapturingCursorPointer = false,\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n if (isCapturingCursorPointer) {\n const isCursorPointer = isElementPointerCursor(baseEvent.event.target as Element, baseEvent.type);\n if (isCursorPointer) {\n baseEvent.closestTrackedAncestor = baseEvent.event.target as HTMLElement;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n baseEvent.closestTrackedAncestor,\n dataAttributePrefix,\n );\n return baseEvent;\n }\n }\n // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(baseEvent.event.target as HTMLElement, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n };\n\n extractDataFromDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Extract from DOM Element\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n const sourceElement = getDataSource(dataSource, contextElement);\n if (!sourceElement) {\n return undefined;\n }\n\n if (dataSource.elementExtractType === 'TEXT') {\n return this.getText(sourceElement);\n } else if (dataSource.elementExtractType === 'ATTRIBUTE' && dataSource.attribute) {\n return sourceElement.getAttribute(dataSource.attribute);\n }\n return undefined;\n }\n\n // TODO: Extract from other source types\n return undefined;\n };\n\n getText = (element: Element): string => {\n // Check if element or any parent has data-amp-mask attribute\n const hasMaskAttribute = element.closest(`[${constants.TEXT_MASK_ATTRIBUTE}]`) !== null;\n if (hasMaskAttribute) {\n return constants.MASKED_TEXT_VALUE;\n }\n let output = '';\n if (!element.querySelector(`[${constants.TEXT_MASK_ATTRIBUTE}], [contenteditable]`)) {\n output = (element as HTMLElement).innerText || '';\n } else {\n const clonedTree = element.cloneNode(true) as HTMLElement;\n // replace all elements with TEXT_MASK_ATTRIBUTE attribute and contenteditable with the text MASKED_TEXT_VALUE\n clonedTree.querySelectorAll(`[${constants.TEXT_MASK_ATTRIBUTE}], [contenteditable]`).forEach((node) => {\n (node as HTMLElement).innerText = constants.MASKED_TEXT_VALUE;\n });\n output = clonedTree.innerText || '';\n }\n return this.replaceSensitiveString(output.substring(0, 255)).replace(/\\s+/g, ' ').trim();\n };\n\n // Returns the element properties for the given element in Visual Labeling.\n getEventTagProps = (element: Element): Record<string, JSONValue> => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties) as Record<string, JSONValue>;\n };\n}\n"]}
|
package/lib/esm/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "1.12.
|
|
1
|
+
export declare const VERSION = "1.12.2";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/lib/esm/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export var VERSION = '1.12.
|
|
1
|
+
export var VERSION = '1.12.2';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/lib/esm/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '1.12.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '1.12.2';\n"]}
|