@amplitude/plugin-autocapture-browser 1.0.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/autocapture/track-action-click.d.ts +1 -1
- package/lib/cjs/autocapture/track-action-click.d.ts.map +1 -1
- package/lib/cjs/autocapture/track-action-click.js +3 -5
- package/lib/cjs/autocapture/track-action-click.js.map +1 -1
- package/lib/cjs/autocapture/track-change.d.ts +1 -1
- package/lib/cjs/autocapture/track-change.d.ts.map +1 -1
- package/lib/cjs/autocapture/track-change.js +2 -2
- package/lib/cjs/autocapture/track-change.js.map +1 -1
- package/lib/cjs/autocapture/track-click.d.ts +1 -1
- package/lib/cjs/autocapture/track-click.d.ts.map +1 -1
- package/lib/cjs/autocapture/track-click.js +3 -5
- package/lib/cjs/autocapture/track-click.js.map +1 -1
- package/lib/cjs/autocapture-plugin.d.ts +1 -1
- package/lib/cjs/autocapture-plugin.d.ts.map +1 -1
- package/lib/cjs/autocapture-plugin.js +11 -11
- package/lib/cjs/autocapture-plugin.js.map +1 -1
- package/lib/cjs/constants.js +1 -0
- package/lib/cjs/constants.js.map +1 -1
- package/lib/cjs/helpers.d.ts +3 -3
- package/lib/cjs/helpers.d.ts.map +1 -1
- package/lib/cjs/helpers.js +3 -2
- package/lib/cjs/helpers.js.map +1 -1
- package/lib/cjs/hierarchy.d.ts.map +1 -1
- package/lib/cjs/hierarchy.js +6 -5
- package/lib/cjs/hierarchy.js.map +1 -1
- package/lib/cjs/index.js +1 -0
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/libs/finder.js +2 -2
- package/lib/cjs/libs/finder.js.map +1 -1
- package/lib/cjs/libs/messenger.d.ts +3 -3
- package/lib/cjs/libs/messenger.d.ts.map +1 -1
- package/lib/cjs/libs/messenger.js +1 -0
- package/lib/cjs/libs/messenger.js.map +1 -1
- package/lib/cjs/typings/autocapture.js +1 -0
- package/lib/cjs/version.d.ts +1 -1
- package/lib/cjs/version.js +2 -1
- package/lib/cjs/version.js.map +1 -1
- package/lib/esm/autocapture/track-action-click.d.ts +1 -1
- package/lib/esm/autocapture/track-action-click.d.ts.map +1 -1
- package/lib/esm/autocapture/track-action-click.js +1 -3
- package/lib/esm/autocapture/track-action-click.js.map +1 -1
- package/lib/esm/autocapture/track-change.d.ts +1 -1
- package/lib/esm/autocapture/track-change.d.ts.map +1 -1
- package/lib/esm/autocapture/track-change.js.map +1 -1
- package/lib/esm/autocapture/track-click.d.ts +1 -1
- package/lib/esm/autocapture/track-click.d.ts.map +1 -1
- package/lib/esm/autocapture/track-click.js +1 -3
- package/lib/esm/autocapture/track-click.js.map +1 -1
- package/lib/esm/autocapture-plugin.d.ts +1 -1
- package/lib/esm/autocapture-plugin.d.ts.map +1 -1
- package/lib/esm/autocapture-plugin.js +1 -1
- package/lib/esm/autocapture-plugin.js.map +1 -1
- package/lib/esm/helpers.d.ts +3 -3
- package/lib/esm/helpers.d.ts.map +1 -1
- package/lib/esm/helpers.js.map +1 -1
- package/lib/esm/hierarchy.d.ts.map +1 -1
- package/lib/esm/hierarchy.js.map +1 -1
- package/lib/esm/libs/finder.js.map +1 -1
- package/lib/esm/libs/messenger.d.ts +3 -3
- package/lib/esm/libs/messenger.d.ts.map +1 -1
- package/lib/esm/libs/messenger.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 +2 -1
- package/lib/scripts/amplitude-min.js.gz +0 -0
- package/lib/scripts/amplitude-min.js.map +1 -0
- package/lib/scripts/amplitude-min.umd.js +1 -1
- package/lib/scripts/amplitude-min.umd.js.gz +0 -0
- package/lib/scripts/autocapture/track-action-click.d.ts +1 -1
- package/lib/scripts/autocapture/track-action-click.d.ts.map +1 -1
- package/lib/scripts/autocapture/track-change.d.ts +1 -1
- package/lib/scripts/autocapture/track-change.d.ts.map +1 -1
- package/lib/scripts/autocapture/track-click.d.ts +1 -1
- package/lib/scripts/autocapture/track-click.d.ts.map +1 -1
- package/lib/scripts/autocapture-plugin.d.ts +1 -1
- package/lib/scripts/autocapture-plugin.d.ts.map +1 -1
- package/lib/scripts/helpers.d.ts +3 -3
- package/lib/scripts/helpers.d.ts.map +1 -1
- package/lib/scripts/libs/messenger.d.ts +3 -3
- package/lib/scripts/libs/messenger.d.ts.map +1 -1
- package/lib/scripts/version.d.ts +1 -1
- package/package.json +4 -4
package/lib/cjs/hierarchy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../src/hierarchy.ts"],"names":[],"mappings":"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","sourcesContent":["import { isNonSensitiveElement, JSONValue } from './helpers';\nimport { Hierarchy, HierarchyNode } from './typings/autocapture';\n\nconst BLOCKED_ATTRIBUTES = [\n // Already captured elsewhere in the hierarchy object\n 'id',\n 'class',\n\n // non-useful and potentially large attribute\n 'style',\n\n // sensitive as prefilled form data may populate this attribute\n 'value',\n\n // DOM events\n 'onclick',\n 'onchange',\n 'oninput',\n 'onblur',\n 'onsubmit',\n 'onfocus',\n 'onkeydown',\n 'onkeyup',\n 'onkeypress',\n\n // React specific\n 'data-reactid',\n 'data-react-checksum',\n 'data-reactroot',\n];\nconst SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST = ['type'];\n\nconst SVG_TAGS = ['svg', 'path', 'g'];\nconst HIGHLY_SENSITIVE_INPUT_TYPES = ['password', 'hidden'];\nconst MAX_ATTRIBUTE_LENGTH = 128;\nconst MAX_HIERARCHY_LENGTH = 1024;\n\nexport function getElementProperties(element: Element | null): HierarchyNode | null {\n if (element === null) {\n return null;\n }\n\n const tagName = String(element.tagName).toLowerCase();\n const properties: HierarchyNode = {\n tag: tagName,\n };\n\n const siblings = Array.from(element.parentElement?.children ?? []);\n if (siblings.length) {\n properties.index = siblings.indexOf(element);\n properties.indexOfType = siblings.filter((el) => el.tagName === element.tagName).indexOf(element);\n }\n\n const prevSiblingTag = element.previousElementSibling?.tagName?.toLowerCase();\n if (prevSiblingTag) {\n properties.prevSib = String(prevSiblingTag);\n }\n\n const id = element.getAttribute('id');\n if (id) {\n properties.id = String(id);\n }\n\n const classes = Array.from(element.classList);\n if (classes.length) {\n properties.classes = classes;\n }\n\n const attributes: Record<string, string> = {};\n const attributesArray = Array.from(element.attributes);\n const filteredAttributes = attributesArray.filter((attr) => !BLOCKED_ATTRIBUTES.includes(attr.name));\n const isSensitiveElement = !isNonSensitiveElement(element);\n\n // if input is hidden or password or for SVGs, skip attribute collection entirely\n if (!HIGHLY_SENSITIVE_INPUT_TYPES.includes(String(element.getAttribute('type'))) && !SVG_TAGS.includes(tagName)) {\n for (const attr of filteredAttributes) {\n // If sensitive element, only allow certain attributes\n if (isSensitiveElement && !SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST.includes(attr.name)) {\n continue;\n }\n\n // Finally cast attribute value to string and limit attribute value length\n attributes[attr.name] = String(attr.value).substring(0, MAX_ATTRIBUTE_LENGTH);\n }\n }\n\n if (Object.keys(attributes).length) {\n properties.attrs = attributes;\n }\n\n return properties;\n}\n\nexport function getAncestors(targetEl: Element | null): Element[] {\n const ancestors: Element[] = [];\n\n if (!targetEl) {\n return ancestors;\n }\n\n // Add self to the list of ancestors\n ancestors.push(targetEl);\n let current = targetEl.parentElement;\n while (current && current.tagName !== 'HTML') {\n ancestors.push(current);\n current = current.parentElement;\n }\n return ancestors;\n}\n\n// Get the DOM hierarchy of the element, starting from the target element to the root element.\nexport const 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 hierarchy = ensureListUnderLimit(\n ancestors.map((el) => getElementProperties(el)),\n MAX_HIERARCHY_LENGTH,\n ) as Hierarchy;\n\n return hierarchy;\n};\n\nexport function ensureListUnderLimit(list: Hierarchy | JSONValue[], bytesLimit: number): Hierarchy | JSONValue[] {\n let numChars = 0;\n for (let i = 0; i < list.length; i++) {\n const node = list[i];\n if (node === null) {\n // simulate 'None' in python\n numChars += 4;\n } else {\n const value = ensureUnicodePythonCompatible(node);\n // Using Array.from(string).length instead of string.length\n // to correctly count Unicode characters (including emojis)\n numChars += value ? Array.from(value).length : 4;\n }\n if (numChars > bytesLimit) {\n return list.slice(0, i);\n }\n }\n return list;\n}\n\n/**\n * Converts a JSON-compatible value to a Python-compatible string representation.\n * This function handles various data types and ensures proper escaping and formatting.\n *\n * @param value - The value to be converted (can be any JSON-compatible type)\n * @param nested - Indicates if the value is nested within another structure (default: false)\n * @returns A string representation of the value compatible with Python, or null if conversion fails\n */\nexport function ensureUnicodePythonCompatible(value: HierarchyNode | JSONValue | null, nested = false): string | null {\n try {\n if (value == null) {\n // Handle null values\n if (nested) {\n return 'None'; // Represent null as 'None' in Python when nested\n }\n return null; // Return null for top-level null values\n } else if (typeof value === 'string') {\n if (nested) {\n // Escape special characters in nested strings\n value = value.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\\t/g, '\\\\t').replace(/\\r/g, '\\\\r');\n\n // Handle quotes in the string\n if (value.includes('\"')) {\n return `'${value}'`; // Wrap in single quotes if it contains double quotes\n }\n if (value.includes(\"'\")) {\n return `\"${value.replace(/'/g, \"\\\\'\")}\"`; // Wrap in double quotes and escape single quotes\n }\n return `'${value}'`; // Default to wrapping in single quotes\n }\n return value; // Return non-nested strings as-is\n } else if (typeof value === 'boolean') {\n // Convert boolean to Python-style capitalized string\n return value ? 'True' : 'False';\n } else if (Array.isArray(value)) {\n // Handle arrays by recursively converting each element\n const elements = value.map((o) => ensureUnicodePythonCompatible(o, true));\n return `[${elements.join(', ')}]`;\n } else if (typeof value === 'object') {\n // Handle objects (dictionaries in Python)\n const entries = Object.entries(value)\n .filter(([key]) => key != null) // Filter out null keys\n .map(\n ([key, val]) =>\n `${String(ensureUnicodePythonCompatible(key, true))}: ${String(ensureUnicodePythonCompatible(val, true))}`,\n );\n let result = `{${entries.join(', ')}}`;\n\n // Handle single quotes in the resulting string\n if (result.includes(\"\\\\'\")) {\n result = result.replace(/'/g, \"'\").replace(/'/g, \"\\\\'\");\n }\n return result;\n }\n // For any other types, return their string representation;\n return value.toString();\n } catch (e) {\n // Return null if any error occurs during the conversion\n return null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../src/hierarchy.ts"],"names":[],"mappings":"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","sourcesContent":["import { isNonSensitiveElement, JSONValue } from './helpers';\nimport { Hierarchy, HierarchyNode } from './typings/autocapture';\n\nconst BLOCKED_ATTRIBUTES = [\n // Already captured elsewhere in the hierarchy object\n 'id',\n 'class',\n\n // non-useful and potentially large attribute\n 'style',\n\n // sensitive as prefilled form data may populate this attribute\n 'value',\n\n // DOM events\n 'onclick',\n 'onchange',\n 'oninput',\n 'onblur',\n 'onsubmit',\n 'onfocus',\n 'onkeydown',\n 'onkeyup',\n 'onkeypress',\n\n // React specific\n 'data-reactid',\n 'data-react-checksum',\n 'data-reactroot',\n];\nconst SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST = ['type'];\n\nconst SVG_TAGS = ['svg', 'path', 'g'];\nconst HIGHLY_SENSITIVE_INPUT_TYPES = ['password', 'hidden'];\nconst MAX_ATTRIBUTE_LENGTH = 128;\nconst MAX_HIERARCHY_LENGTH = 1024;\n\nexport function getElementProperties(element: Element | null): HierarchyNode | null {\n if (element === null) {\n return null;\n }\n\n const tagName = String(element.tagName).toLowerCase();\n const properties: HierarchyNode = {\n tag: tagName,\n };\n\n const siblings = Array.from(element.parentElement?.children ?? []);\n if (siblings.length) {\n properties.index = siblings.indexOf(element);\n properties.indexOfType = siblings.filter((el) => el.tagName === element.tagName).indexOf(element);\n }\n\n const prevSiblingTag = element.previousElementSibling?.tagName?.toLowerCase();\n if (prevSiblingTag) {\n properties.prevSib = String(prevSiblingTag);\n }\n\n const id = element.getAttribute('id');\n if (id) {\n properties.id = String(id);\n }\n\n const classes = Array.from(element.classList);\n if (classes.length) {\n properties.classes = classes;\n }\n\n const attributes: Record<string, string> = {};\n const attributesArray = Array.from(element.attributes);\n const filteredAttributes = attributesArray.filter((attr) => !BLOCKED_ATTRIBUTES.includes(attr.name));\n const isSensitiveElement = !isNonSensitiveElement(element);\n\n // if input is hidden or password or for SVGs, skip attribute collection entirely\n if (!HIGHLY_SENSITIVE_INPUT_TYPES.includes(String(element.getAttribute('type'))) && !SVG_TAGS.includes(tagName)) {\n for (const attr of filteredAttributes) {\n // If sensitive element, only allow certain attributes\n if (isSensitiveElement && !SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST.includes(attr.name)) {\n continue;\n }\n\n // Finally cast attribute value to string and limit attribute value length\n attributes[attr.name] = String(attr.value).substring(0, MAX_ATTRIBUTE_LENGTH);\n }\n }\n\n if (Object.keys(attributes).length) {\n properties.attrs = attributes;\n }\n\n return properties;\n}\n\nexport function getAncestors(targetEl: Element | null): Element[] {\n const ancestors: Element[] = [];\n\n if (!targetEl) {\n return ancestors;\n }\n\n // Add self to the list of ancestors\n ancestors.push(targetEl);\n let current = targetEl.parentElement;\n while (current && current.tagName !== 'HTML') {\n ancestors.push(current);\n current = current.parentElement;\n }\n return ancestors;\n}\n\n// Get the DOM hierarchy of the element, starting from the target element to the root element.\nexport const 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 hierarchy = ensureListUnderLimit(\n ancestors.map((el) => getElementProperties(el)),\n MAX_HIERARCHY_LENGTH,\n ) as Hierarchy;\n\n return hierarchy;\n};\n\nexport function ensureListUnderLimit(list: Hierarchy | JSONValue[], bytesLimit: number): Hierarchy | JSONValue[] {\n let numChars = 0;\n for (let i = 0; i < list.length; i++) {\n const node = list[i];\n if (node === null) {\n // simulate 'None' in python\n numChars += 4;\n } else {\n const value = ensureUnicodePythonCompatible(node);\n // Using Array.from(string).length instead of string.length\n // to correctly count Unicode characters (including emojis)\n numChars += value ? Array.from(value).length : 4;\n }\n if (numChars > bytesLimit) {\n return list.slice(0, i);\n }\n }\n return list;\n}\n\n/**\n * Converts a JSON-compatible value to a Python-compatible string representation.\n * This function handles various data types and ensures proper escaping and formatting.\n *\n * @param value - The value to be converted (can be any JSON-compatible type)\n * @param nested - Indicates if the value is nested within another structure (default: false)\n * @returns A string representation of the value compatible with Python, or null if conversion fails\n */\nexport function ensureUnicodePythonCompatible(value: HierarchyNode | JSONValue | null, nested = false): string | null {\n try {\n if (value == null) {\n // Handle null values\n if (nested) {\n return 'None'; // Represent null as 'None' in Python when nested\n }\n return null; // Return null for top-level null values\n } else if (typeof value === 'string') {\n if (nested) {\n // Escape special characters in nested strings\n value = value.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\\t/g, '\\\\t').replace(/\\r/g, '\\\\r');\n\n // Handle quotes in the string\n if (value.includes('\"')) {\n return `'${value}'`; // Wrap in single quotes if it contains double quotes\n }\n if (value.includes(\"'\")) {\n return `\"${value.replace(/'/g, \"\\\\'\")}\"`; // Wrap in double quotes and escape single quotes\n }\n return `'${value}'`; // Default to wrapping in single quotes\n }\n return value; // Return non-nested strings as-is\n } else if (typeof value === 'boolean') {\n // Convert boolean to Python-style capitalized string\n return value ? 'True' : 'False';\n } else if (Array.isArray(value)) {\n // Handle arrays by recursively converting each element\n const elements = value.map((o) => ensureUnicodePythonCompatible(o, true));\n return `[${elements.join(', ')}]`;\n } else if (typeof value === 'object') {\n // Handle objects (dictionaries in Python)\n const entries = Object.entries(value)\n .filter(([key]) => key != null) // Filter out null keys\n .map(\n ([key, val]) =>\n `${String(ensureUnicodePythonCompatible(key, true))}: ${String(ensureUnicodePythonCompatible(val, true))}`,\n );\n let result = `{${entries.join(', ')}}`;\n\n // Handle single quotes in the resulting string\n if (result.includes(\"\\\\'\")) {\n result = result.replace(/'/g, \"'\").replace(/'/g, \"\\\\'\");\n }\n return result;\n }\n // For any other types, return their string representation;\n return value.toString();\n } catch (e) {\n // Return null if any error occurs during the conversion\n return null;\n }\n}\n"]}
|
package/lib/cjs/index.js
CHANGED
package/lib/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,2DAAsF;AAA7E,4GAAA,iBAAiB,OAAU;AAAE,uHAAA,iBAAiB,OAAA;AACvD,8CAAgF;AAA1C,4GAAA,eAAe,OAAA","sourcesContent":["export { autocapturePlugin as plugin, autocapturePlugin } from './autocapture-plugin';\nexport { Action, ActionData, Message, WindowMessenger } from './libs/messenger';\n"]}
|
package/lib/cjs/libs/finder.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/* istanbul ignore file */
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.finder =
|
|
4
|
+
exports.finder = finder;
|
|
4
5
|
var tslib_1 = require("tslib");
|
|
5
6
|
var config;
|
|
6
7
|
var rootDocument;
|
|
@@ -38,7 +39,6 @@ function finder(input, options) {
|
|
|
38
39
|
throw new Error("Selector was not found.");
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
|
-
exports.finder = finder;
|
|
42
42
|
function findRootDocument(rootNode, defaults) {
|
|
43
43
|
if (rootNode.nodeType === Node.DOCUMENT_NODE) {
|
|
44
44
|
return rootNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finder.js","sourceRoot":"","sources":["../../../src/libs/finder.ts"],"names":[],"mappings":"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","sourcesContent":["/* istanbul ignore file */\n\n// License: MIT\n// Author: Anton Medvedev <anton@medv.io>\n// Source: https://github.com/antonmedv/finder\n\ntype Knot = {\n name: string;\n penalty: number;\n level?: number;\n};\n\ntype Path = Knot[];\n\nexport type Options = {\n root: Element;\n idName: (name: string) => boolean;\n className: (name: string) => boolean;\n tagName: (name: string) => boolean;\n attr: (name: string, value: string) => boolean;\n seedMinLength: number;\n optimizedMinLength: number;\n threshold: number;\n maxNumberOfTries: number;\n};\n\nlet config: Options;\nlet rootDocument: Document | Element;\n\nexport function finder(input: Element, options?: Partial<Options>) {\n if (input.nodeType !== Node.ELEMENT_NODE) {\n throw new Error(`Can't generate CSS selector for non-element node type.`);\n }\n if ('html' === input.tagName.toLowerCase()) {\n return 'html';\n }\n const defaults: Options = {\n root: document.body,\n idName: (_name: string) => true,\n className: (_name: string) => true,\n tagName: (_name: string) => true,\n attr: (_name: string, _value: string) => false,\n seedMinLength: 1,\n optimizedMinLength: 2,\n threshold: 1000,\n maxNumberOfTries: 10000,\n };\n\n config = { ...defaults, ...options };\n rootDocument = findRootDocument(config.root, defaults);\n\n let path = bottomUpSearch(input, 'all', () =>\n bottomUpSearch(input, 'two', () => bottomUpSearch(input, 'one', () => bottomUpSearch(input, 'none'))),\n );\n\n if (path) {\n const optimized = sort(optimize(path, input));\n if (optimized.length > 0) {\n path = optimized[0];\n }\n return selector(path);\n } else {\n throw new Error(`Selector was not found.`);\n }\n}\n\nfunction findRootDocument(rootNode: Element | Document, defaults: Options) {\n if (rootNode.nodeType === Node.DOCUMENT_NODE) {\n return rootNode;\n }\n if (rootNode === defaults.root) {\n return rootNode.ownerDocument;\n }\n return rootNode;\n}\n\nfunction bottomUpSearch(\n input: Element,\n limit: 'all' | 'two' | 'one' | 'none',\n fallback?: () => Path | null,\n): Path | null {\n let path: Path | null = null;\n const stack: Knot[][] = [];\n let current: Element | null = input;\n let i = 0;\n while (current) {\n let level: Knot[] = maybe(id(current)) ||\n maybe(...attr(current)) ||\n maybe(...classNames(current)) ||\n maybe(tagName(current)) || [any()];\n const nth = index(current);\n if (limit == 'all') {\n if (nth) {\n level = level.concat(level.filter(dispensableNth).map((node) => nthChild(node, nth)));\n }\n } else if (limit == 'two') {\n level = level.slice(0, 1);\n if (nth) {\n level = level.concat(level.filter(dispensableNth).map((node) => nthChild(node, nth)));\n }\n } else if (limit == 'one') {\n const [node] = (level = level.slice(0, 1));\n if (nth && dispensableNth(node)) {\n level = [nthChild(node, nth)];\n }\n } else if (limit == 'none') {\n level = [any()];\n if (nth) {\n level = [nthChild(level[0], nth)];\n }\n }\n for (const node of level) {\n node.level = i;\n }\n stack.push(level);\n if (stack.length >= config.seedMinLength) {\n path = findUniquePath(stack, fallback);\n if (path) {\n break;\n }\n }\n current = current.parentElement;\n i++;\n }\n if (!path) {\n path = findUniquePath(stack, fallback);\n }\n if (!path && fallback) {\n return fallback();\n }\n return path;\n}\n\nfunction findUniquePath(stack: Knot[][], fallback?: () => Path | null): Path | null {\n // Check first the total number of combinations first since generating the combinations can cause memory exhaustion\n const numCombinations = stack.reduce((acc, i) => acc * i.length, 1);\n if (numCombinations > config.threshold) {\n return fallback ? fallback() : null;\n }\n\n const paths = sort(combinations(stack));\n for (const candidate of paths) {\n if (unique(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction selector(path: Path): string {\n let node = path[0];\n let query = node.name;\n for (let i = 1; i < path.length; i++) {\n const level = path[i].level || 0;\n if (node.level === level - 1) {\n query = `${path[i].name} > ${query}`;\n } else {\n query = `${path[i].name} ${query}`;\n }\n node = path[i];\n }\n return query;\n}\n\nfunction penalty(path: Path): number {\n return path.map((node) => node.penalty).reduce((acc, i) => acc + i, 0);\n}\n\nfunction unique(path: Path) {\n const css = selector(path);\n switch (rootDocument.querySelectorAll(css).length) {\n case 0:\n throw new Error(`Can't select any node with this selector: ${css}`);\n case 1:\n return true;\n default:\n return false;\n }\n}\n\nfunction id(input: Element): Knot | null {\n const elementId = input.getAttribute('id');\n if (elementId && config.idName(elementId)) {\n return {\n name: '#' + CSS.escape(elementId),\n penalty: 0,\n };\n }\n return null;\n}\n\nfunction attr(input: Element): Knot[] {\n const attrs = Array.from(input.attributes).filter((attr) => config.attr(attr.name, attr.value));\n return attrs.map(\n (attr): Knot => ({\n name: `[${CSS.escape(attr.name)}=\"${CSS.escape(attr.value)}\"]`,\n penalty: 0.5,\n }),\n );\n}\n\nfunction classNames(input: Element): Knot[] {\n const names = Array.from(input.classList).filter(config.className);\n return names.map(\n (name): Knot => ({\n name: '.' + CSS.escape(name),\n penalty: 1,\n }),\n );\n}\n\nfunction tagName(input: Element): Knot | null {\n const name = input.tagName.toLowerCase();\n if (config.tagName(name)) {\n return {\n name,\n penalty: 2,\n };\n }\n return null;\n}\n\nfunction any(): Knot {\n return {\n name: '*',\n penalty: 3,\n };\n}\n\nfunction index(input: Element): number | null {\n const parent = input.parentNode;\n if (!parent) {\n return null;\n }\n let child = parent.firstChild;\n if (!child) {\n return null;\n }\n let i = 0;\n while (child) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n i++;\n }\n if (child === input) {\n break;\n }\n child = child.nextSibling;\n }\n return i;\n}\n\nfunction nthChild(node: Knot, i: number): Knot {\n return {\n name: node.name + `:nth-child(${i})`,\n penalty: node.penalty + 1,\n };\n}\n\nfunction dispensableNth(node: Knot) {\n return node.name !== 'html' && !node.name.startsWith('#');\n}\n\nfunction maybe(...level: (Knot | null)[]): Knot[] | null {\n const list = level.filter(notEmpty);\n if (list.length > 0) {\n return list;\n }\n return null;\n}\n\nfunction notEmpty<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\nfunction* combinations(stack: Knot[][], path: Knot[] = []): Generator<Knot[]> {\n if (stack.length > 0) {\n for (const node of stack[0]) {\n yield* combinations(stack.slice(1, stack.length), path.concat(node));\n }\n } else {\n yield path;\n }\n}\n\nfunction sort(paths: Iterable<Path>): Path[] {\n return [...paths].sort((a, b) => penalty(a) - penalty(b));\n}\n\ntype Scope = {\n counter: number;\n visited: Map<string, boolean>;\n};\n\nfunction* optimize(\n path: Path,\n input: Element,\n scope: Scope = {\n counter: 0,\n visited: new Map<string, boolean>(),\n },\n): Generator<Knot[]> {\n if (path.length > 2 && path.length > config.optimizedMinLength) {\n for (let i = 1; i < path.length - 1; i++) {\n if (scope.counter > config.maxNumberOfTries) {\n return; // Okay At least I tried!\n }\n scope.counter += 1;\n const newPath = [...path];\n newPath.splice(i, 1);\n const newPathKey = selector(newPath);\n if (scope.visited.has(newPathKey)) {\n return;\n }\n if (unique(newPath) && same(newPath, input)) {\n yield newPath;\n scope.visited.set(newPathKey, true);\n yield* optimize(newPath, input, scope);\n }\n }\n }\n}\n\nfunction same(path: Path, input: Element) {\n return rootDocument.querySelector(selector(path)) === input;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"finder.js","sourceRoot":"","sources":["../../../src/libs/finder.ts"],"names":[],"mappings":"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","sourcesContent":["/* istanbul ignore file */\n\n// License: MIT\n// Author: Anton Medvedev <anton@medv.io>\n// Source: https://github.com/antonmedv/finder\n\ntype Knot = {\n name: string;\n penalty: number;\n level?: number;\n};\n\ntype Path = Knot[];\n\nexport type Options = {\n root: Element;\n idName: (name: string) => boolean;\n className: (name: string) => boolean;\n tagName: (name: string) => boolean;\n attr: (name: string, value: string) => boolean;\n seedMinLength: number;\n optimizedMinLength: number;\n threshold: number;\n maxNumberOfTries: number;\n};\n\nlet config: Options;\nlet rootDocument: Document | Element;\n\nexport function finder(input: Element, options?: Partial<Options>) {\n if (input.nodeType !== Node.ELEMENT_NODE) {\n throw new Error(`Can't generate CSS selector for non-element node type.`);\n }\n if ('html' === input.tagName.toLowerCase()) {\n return 'html';\n }\n const defaults: Options = {\n root: document.body,\n idName: (_name: string) => true,\n className: (_name: string) => true,\n tagName: (_name: string) => true,\n attr: (_name: string, _value: string) => false,\n seedMinLength: 1,\n optimizedMinLength: 2,\n threshold: 1000,\n maxNumberOfTries: 10000,\n };\n\n config = { ...defaults, ...options };\n rootDocument = findRootDocument(config.root, defaults);\n\n let path = bottomUpSearch(input, 'all', () =>\n bottomUpSearch(input, 'two', () => bottomUpSearch(input, 'one', () => bottomUpSearch(input, 'none'))),\n );\n\n if (path) {\n const optimized = sort(optimize(path, input));\n if (optimized.length > 0) {\n path = optimized[0];\n }\n return selector(path);\n } else {\n throw new Error(`Selector was not found.`);\n }\n}\n\nfunction findRootDocument(rootNode: Element | Document, defaults: Options) {\n if (rootNode.nodeType === Node.DOCUMENT_NODE) {\n return rootNode;\n }\n if (rootNode === defaults.root) {\n return rootNode.ownerDocument;\n }\n return rootNode;\n}\n\nfunction bottomUpSearch(\n input: Element,\n limit: 'all' | 'two' | 'one' | 'none',\n fallback?: () => Path | null,\n): Path | null {\n let path: Path | null = null;\n const stack: Knot[][] = [];\n let current: Element | null = input;\n let i = 0;\n while (current) {\n let level: Knot[] = maybe(id(current)) ||\n maybe(...attr(current)) ||\n maybe(...classNames(current)) ||\n maybe(tagName(current)) || [any()];\n const nth = index(current);\n if (limit == 'all') {\n if (nth) {\n level = level.concat(level.filter(dispensableNth).map((node) => nthChild(node, nth)));\n }\n } else if (limit == 'two') {\n level = level.slice(0, 1);\n if (nth) {\n level = level.concat(level.filter(dispensableNth).map((node) => nthChild(node, nth)));\n }\n } else if (limit == 'one') {\n const [node] = (level = level.slice(0, 1));\n if (nth && dispensableNth(node)) {\n level = [nthChild(node, nth)];\n }\n } else if (limit == 'none') {\n level = [any()];\n if (nth) {\n level = [nthChild(level[0], nth)];\n }\n }\n for (const node of level) {\n node.level = i;\n }\n stack.push(level);\n if (stack.length >= config.seedMinLength) {\n path = findUniquePath(stack, fallback);\n if (path) {\n break;\n }\n }\n current = current.parentElement;\n i++;\n }\n if (!path) {\n path = findUniquePath(stack, fallback);\n }\n if (!path && fallback) {\n return fallback();\n }\n return path;\n}\n\nfunction findUniquePath(stack: Knot[][], fallback?: () => Path | null): Path | null {\n // Check first the total number of combinations first since generating the combinations can cause memory exhaustion\n const numCombinations = stack.reduce((acc, i) => acc * i.length, 1);\n if (numCombinations > config.threshold) {\n return fallback ? fallback() : null;\n }\n\n const paths = sort(combinations(stack));\n for (const candidate of paths) {\n if (unique(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction selector(path: Path): string {\n let node = path[0];\n let query = node.name;\n for (let i = 1; i < path.length; i++) {\n const level = path[i].level || 0;\n if (node.level === level - 1) {\n query = `${path[i].name} > ${query}`;\n } else {\n query = `${path[i].name} ${query}`;\n }\n node = path[i];\n }\n return query;\n}\n\nfunction penalty(path: Path): number {\n return path.map((node) => node.penalty).reduce((acc, i) => acc + i, 0);\n}\n\nfunction unique(path: Path) {\n const css = selector(path);\n switch (rootDocument.querySelectorAll(css).length) {\n case 0:\n throw new Error(`Can't select any node with this selector: ${css}`);\n case 1:\n return true;\n default:\n return false;\n }\n}\n\nfunction id(input: Element): Knot | null {\n const elementId = input.getAttribute('id');\n if (elementId && config.idName(elementId)) {\n return {\n name: '#' + CSS.escape(elementId),\n penalty: 0,\n };\n }\n return null;\n}\n\nfunction attr(input: Element): Knot[] {\n const attrs = Array.from(input.attributes).filter((attr) => config.attr(attr.name, attr.value));\n return attrs.map(\n (attr): Knot => ({\n name: `[${CSS.escape(attr.name)}=\"${CSS.escape(attr.value)}\"]`,\n penalty: 0.5,\n }),\n );\n}\n\nfunction classNames(input: Element): Knot[] {\n const names = Array.from(input.classList).filter(config.className);\n return names.map(\n (name): Knot => ({\n name: '.' + CSS.escape(name),\n penalty: 1,\n }),\n );\n}\n\nfunction tagName(input: Element): Knot | null {\n const name = input.tagName.toLowerCase();\n if (config.tagName(name)) {\n return {\n name,\n penalty: 2,\n };\n }\n return null;\n}\n\nfunction any(): Knot {\n return {\n name: '*',\n penalty: 3,\n };\n}\n\nfunction index(input: Element): number | null {\n const parent = input.parentNode;\n if (!parent) {\n return null;\n }\n let child = parent.firstChild;\n if (!child) {\n return null;\n }\n let i = 0;\n while (child) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n i++;\n }\n if (child === input) {\n break;\n }\n child = child.nextSibling;\n }\n return i;\n}\n\nfunction nthChild(node: Knot, i: number): Knot {\n return {\n name: node.name + `:nth-child(${i})`,\n penalty: node.penalty + 1,\n };\n}\n\nfunction dispensableNth(node: Knot) {\n return node.name !== 'html' && !node.name.startsWith('#');\n}\n\nfunction maybe(...level: (Knot | null)[]): Knot[] | null {\n const list = level.filter(notEmpty);\n if (list.length > 0) {\n return list;\n }\n return null;\n}\n\nfunction notEmpty<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\nfunction* combinations(stack: Knot[][], path: Knot[] = []): Generator<Knot[]> {\n if (stack.length > 0) {\n for (const node of stack[0]) {\n yield* combinations(stack.slice(1, stack.length), path.concat(node));\n }\n } else {\n yield path;\n }\n}\n\nfunction sort(paths: Iterable<Path>): Path[] {\n return [...paths].sort((a, b) => penalty(a) - penalty(b));\n}\n\ntype Scope = {\n counter: number;\n visited: Map<string, boolean>;\n};\n\nfunction* optimize(\n path: Path,\n input: Element,\n scope: Scope = {\n counter: 0,\n visited: new Map<string, boolean>(),\n },\n): Generator<Knot[]> {\n if (path.length > 2 && path.length > config.optimizedMinLength) {\n for (let i = 1; i < path.length - 1; i++) {\n if (scope.counter > config.maxNumberOfTries) {\n return; // Okay At least I tried!\n }\n scope.counter += 1;\n const newPath = [...path];\n newPath.splice(i, 1);\n const newPathKey = selector(newPath);\n if (scope.visited.has(newPathKey)) {\n return;\n }\n if (unique(newPath) && same(newPath, input)) {\n yield newPath;\n scope.visited.set(newPathKey, true);\n yield* optimize(newPath, input, scope);\n }\n }\n }\n}\n\nfunction same(path: Path, input: Element) {\n return rootDocument.querySelector(selector(path)) === input;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ILogger, Messenger, ActionType } from '@amplitude/analytics-core';
|
|
2
2
|
export type Action = 'ping' | 'pong' | 'page-loaded' | 'selector-loaded' | 'initialize-visual-tagging-selector' | 'close-visual-tagging-selector' | 'element-selected' | 'track-selector-mode-changed' | 'track-selector-moved';
|
|
3
3
|
interface InitializeVisualTaggingSelectorData {
|
|
4
4
|
actionType: ActionType;
|
|
@@ -36,7 +36,7 @@ export interface Message<A extends Action> {
|
|
|
36
36
|
}
|
|
37
37
|
export declare class WindowMessenger implements Messenger {
|
|
38
38
|
endpoint: string;
|
|
39
|
-
logger?:
|
|
39
|
+
logger?: ILogger;
|
|
40
40
|
requestCallbacks: {
|
|
41
41
|
[id: string]: {
|
|
42
42
|
resolve: (data: any) => void;
|
|
@@ -52,7 +52,7 @@ export declare class WindowMessenger implements Messenger {
|
|
|
52
52
|
}): Promise<any>;
|
|
53
53
|
private handleResponse;
|
|
54
54
|
setup({ logger, endpoint, isElementSelectable, cssSelectorAllowlist, actionClickAllowlist, }?: {
|
|
55
|
-
logger?:
|
|
55
|
+
logger?: ILogger;
|
|
56
56
|
endpoint?: string;
|
|
57
57
|
isElementSelectable?: (action: InitializeVisualTaggingSelectorData['actionType'], element: Element) => boolean;
|
|
58
58
|
cssSelectorAllowlist?: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messenger.d.ts","sourceRoot":"","sources":["../../../src/libs/messenger.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"messenger.d.ts","sourceRoot":"","sources":["../../../src/libs/messenger.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE3E,MAAM,MAAM,MAAM,GACd,MAAM,GACN,MAAM,GACN,aAAa,GACb,iBAAiB,GACjB,oCAAoC,GACpC,+BAA+B,GAC/B,kBAAkB,GAClB,6BAA6B,GAC7B,sBAAsB,CAAC;AAE3B,UAAU,mCAAmC;IAC3C,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,UAAU,mBAAmB;IAC3B,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iBAAiB,CAAC,EAAE,IAAI,CAAC;CAC1B;AAED,UAAU,4BAA4B;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,sBAAsB;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IACvB,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IACvB,aAAa,EAAE,IAAI,GAAG,SAAS,CAAC;IAChC,iBAAiB,EAAE,IAAI,GAAG,SAAS,CAAC;IACpC,oCAAoC,EAAE,mCAAmC,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7F,+BAA+B,EAAE,IAAI,GAAG,SAAS,CAAC;IAClD,kBAAkB,EAAE,mBAAmB,CAAC;IACxC,6BAA6B,EAAE,4BAA4B,CAAC;IAC5D,sBAAsB,EAAE,sBAAsB,CAAC;CAChD,CAAC;AAEF,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM;IACvC,MAAM,EAAE,CAAC,CAAC;IACV,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACtB;AAeD,qBAAa,eAAgB,YAAW,SAAS;IAC/C,QAAQ,SAAoB;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE;QAChB,CAAC,EAAE,EAAE,MAAM,GAAG;YACZ,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;YAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;SAC7B,CAAC;KACH,CAAM;gBAEK,EAAE,MAAyB,EAAE,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAInE,OAAO,CAAC,MAAM;IAMP,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO;;KAAsB,GAAG,OAAO,CAAC,GAAG,CAAC;IA6B1G,OAAO,CAAC,cAAc;IAUtB,KAAK,CAAC,EACJ,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,GAAE;QACD,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,mCAAmC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;QAC/G,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;QAChC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5B;IAsEN,OAAO,CAAC,QAAQ,CAEd;IAEF,OAAO,CAAC,OAAO,CAMb;CACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messenger.js","sourceRoot":"","sources":["../../../src/libs/messenger.ts"],"names":[],"mappings":"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","sourcesContent":["/* istanbul ignore file */\n/* eslint-disable no-restricted-globals */\nimport {\n AMPLITUDE_ORIGIN,\n AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL,\n AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n} from '../constants';\nimport { asyncLoadScript, generateUniqueId, getEventTagProps } from '../helpers';\nimport { Logger, Messenger, ActionType } from '@amplitude/analytics-types';\n\nexport type Action =\n | 'ping'\n | 'pong'\n | 'page-loaded'\n | 'selector-loaded'\n | 'initialize-visual-tagging-selector'\n | 'close-visual-tagging-selector'\n | 'element-selected'\n | 'track-selector-mode-changed'\n | 'track-selector-moved';\n\ninterface InitializeVisualTaggingSelectorData {\n actionType: ActionType;\n}\n\ninterface ElementSelectedData {\n '[Amplitude] Element Hierarchy'?: string;\n '[Amplitude] Element Tag'?: string;\n '[Amplitude] Element Text'?: string;\n '[Amplitude] Element Selector'?: string;\n '[Amplitude] Page URL'?: string;\n elementScreenshot?: Blob;\n}\n\ninterface TrackSelectorModeChangedData {\n newMode: string;\n pageUrl?: string;\n}\n\ninterface TrackSelectorMovedData {\n newEditorLocation: string;\n pageUrl?: string;\n}\n\nexport type ActionData = {\n ping: null | undefined;\n pong: null | undefined;\n 'page-loaded': null | undefined;\n 'selector-loaded': null | undefined;\n 'initialize-visual-tagging-selector': InitializeVisualTaggingSelectorData | null | undefined;\n 'close-visual-tagging-selector': null | undefined;\n 'element-selected': ElementSelectedData;\n 'track-selector-mode-changed': TrackSelectorModeChangedData;\n 'track-selector-moved': TrackSelectorMovedData;\n};\n\nexport interface Message<A extends Action> {\n action: A;\n data?: ActionData[A];\n}\n\ntype MessageRequest = {\n id: string;\n action: string;\n args: Record<string, any>;\n};\n\ntype MessageResponse = {\n id: string;\n action: string;\n responseData: any;\n};\n\n// TODO: use MessageChannel instead of window.postMessage\nexport class WindowMessenger implements Messenger {\n endpoint = AMPLITUDE_ORIGIN;\n logger?: Logger;\n requestCallbacks: {\n [id: string]: {\n resolve: (data: any) => void;\n reject: (data: any) => void;\n };\n } = {};\n\n constructor({ origin = AMPLITUDE_ORIGIN }: { origin?: string } = {}) {\n this.endpoint = origin;\n }\n\n private notify(message: Message<Action> | MessageRequest) {\n this.logger?.debug?.('Message sent: ', JSON.stringify(message));\n (window.opener as WindowProxy)?.postMessage?.(message, this.endpoint);\n }\n\n // Send an async request to the parent window\n public sendRequest(action: string, args: Record<string, any>, options = { timeout: 15_000 }): Promise<any> {\n // Create Request ID\n const id = generateUniqueId();\n const request = {\n id,\n action,\n args,\n };\n\n // Create a Promise that will be resolved when the response is received\n const promise = new Promise((resolve, reject) => {\n this.requestCallbacks[id] = { resolve, reject };\n\n // Send the request\n this.notify(request);\n\n // Handle request timeouts\n if (options?.timeout > 0) {\n setTimeout(() => {\n reject(new Error(`${action} timed out (id: ${id})`));\n delete this.requestCallbacks[id];\n }, options.timeout);\n }\n });\n\n return promise;\n }\n\n // Handle messages from the parent window\n private handleResponse(response: MessageResponse) {\n if (!this.requestCallbacks[response.id]) {\n this.logger?.warn(`No callback found for request id: ${response.id}`);\n return;\n }\n\n this.requestCallbacks[response.id].resolve(response.responseData);\n delete this.requestCallbacks[response.id];\n }\n\n setup({\n logger,\n endpoint,\n isElementSelectable,\n cssSelectorAllowlist,\n actionClickAllowlist,\n }: {\n logger?: Logger;\n endpoint?: string;\n isElementSelectable?: (action: InitializeVisualTaggingSelectorData['actionType'], element: Element) => boolean;\n cssSelectorAllowlist?: string[];\n actionClickAllowlist?: string[];\n } = {}) {\n this.logger = logger;\n // If endpoint is customized, don't override it.\n if (endpoint && this.endpoint === AMPLITUDE_ORIGIN) {\n this.endpoint = endpoint;\n }\n let amplitudeVisualTaggingSelectorInstance: any = null;\n\n // Attach Event Listener to listen for messages from the parent window\n window.addEventListener('message', (event) => {\n this.logger?.debug?.('Message received: ', JSON.stringify(event));\n\n // Only accept messages from the specified origin\n if (this.endpoint !== event.origin) {\n return;\n }\n\n const eventData = event?.data as Message<Action> | MessageResponse;\n const action = eventData?.action;\n\n // Ignore messages without action\n if (!action) {\n return;\n }\n\n // If id exists, handle responses to previous requests\n if ('id' in eventData) {\n this.logger?.debug?.('Received Response to previous request: ', JSON.stringify(event));\n this.handleResponse(eventData);\n\n // If action exists, handle the action using existing handlers\n } else {\n if (action === 'ping') {\n this.notify({ action: 'pong' });\n } else if (action === 'initialize-visual-tagging-selector') {\n const actionData = eventData?.data as InitializeVisualTaggingSelectorData;\n asyncLoadScript(AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL)\n .then(() => {\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance = (window as any)?.amplitudeVisualTaggingSelector?.({\n getEventTagProps,\n isElementSelectable: (element: Element) => {\n if (isElementSelectable) {\n return isElementSelectable(actionData?.actionType || 'click', element);\n }\n return true;\n },\n onTrack: this.onTrack,\n onSelect: this.onSelect,\n visualHighlightClass: AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n messenger: this,\n cssSelectorAllowlist,\n actionClickAllowlist,\n });\n this.notify({ action: 'selector-loaded' });\n })\n .catch(() => {\n this.logger?.warn('Failed to initialize visual tagging selector');\n });\n } else if (action === 'close-visual-tagging-selector') {\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance?.close?.();\n }\n }\n });\n\n // Notify the parent window that the page has loaded\n this.notify({ action: 'page-loaded' });\n }\n\n private onSelect = (data: ElementSelectedData) => {\n this.notify({ action: 'element-selected', data });\n };\n\n private onTrack = (type: string, properties: { [key: string]: string | null }) => {\n if (type === 'selector-mode-changed') {\n this.notify({ action: 'track-selector-mode-changed', data: properties });\n } else if (type === 'selector-moved') {\n this.notify({ action: 'track-selector-moved', data: properties });\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"messenger.js","sourceRoot":"","sources":["../../../src/libs/messenger.ts"],"names":[],"mappings":";;;AAAA,0BAA0B;AAC1B,0CAA0C;AAC1C,0CAIsB;AACtB,sCAAiF;AAkEjF,yDAAyD;AACzD;IAUE,yBAAY,EAAuD;YAAvD,qBAAqD,EAAE,KAAA,EAArD,cAAyB,EAAzB,MAAM,mBAAG,4BAAgB,KAAA;QAAvC,iBAEC;QAXD,aAAQ,GAAG,4BAAgB,CAAC;QAE5B,qBAAgB,GAKZ,EAAE,CAAC;QAqIC,aAAQ,GAAG,UAAC,IAAyB;YAC3C,KAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,MAAA,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC;QAEM,YAAO,GAAG,UAAC,IAAY,EAAE,UAA4C;YAC3E,IAAI,IAAI,KAAK,uBAAuB,EAAE,CAAC;gBACrC,KAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,6BAA6B,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC3E,CAAC;iBAAM,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACrC,KAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC,CAAC;QA5IA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;IACzB,CAAC;IAEO,gCAAM,GAAd,UAAe,OAAyC;;QACtD,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,KAAK,mDAAG,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAChE,MAAA,MAAC,MAAM,CAAC,MAAsB,0CAAE,WAAW,mDAAG,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,6CAA6C;IACtC,qCAAW,GAAlB,UAAmB,MAAc,EAAE,IAAyB,EAAE,OAA6B;QAA3F,iBA0BC;QA1B6D,wBAAA,EAAA,YAAY,OAAO,EAAE,KAAM,EAAE;QACzF,oBAAoB;QACpB,IAAM,EAAE,GAAG,IAAA,0BAAgB,GAAE,CAAC;QAC9B,IAAM,OAAO,GAAG;YACd,EAAE,IAAA;YACF,MAAM,QAAA;YACN,IAAI,MAAA;SACL,CAAC;QAEF,uEAAuE;QACvE,IAAM,OAAO,GAAG,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,MAAM;YAC1C,KAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,SAAA,EAAE,MAAM,QAAA,EAAE,CAAC;YAEhD,mBAAmB;YACnB,KAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAErB,0BAA0B;YAC1B,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,IAAG,CAAC,EAAE,CAAC;gBACzB,UAAU,CAAC;oBACT,MAAM,CAAC,IAAI,KAAK,CAAC,UAAG,MAAM,6BAAmB,EAAE,MAAG,CAAC,CAAC,CAAC;oBACrD,OAAO,KAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACnC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,yCAAyC;IACjC,wCAAc,GAAtB,UAAuB,QAAyB;;QAC9C,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,MAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,CAAC,4CAAqC,QAAQ,CAAC,EAAE,CAAE,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,+BAAK,GAAL,UAAM,EAYA;QAZN,iBAgFC;YAhFK,qBAYF,EAAE,KAAA,EAXJ,MAAM,YAAA,EACN,QAAQ,cAAA,EACR,mBAAmB,yBAAA,EACnB,oBAAoB,0BAAA,EACpB,oBAAoB,0BAAA;QAQpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,gDAAgD;QAChD,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,4BAAgB,EAAE,CAAC;YACnD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3B,CAAC;QACD,IAAI,sCAAsC,GAAQ,IAAI,CAAC;QAEvD,sEAAsE;QACtE,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAC,KAAK;;YACvC,MAAA,MAAA,KAAI,CAAC,MAAM,0CAAE,KAAK,mDAAG,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YAElE,iDAAiD;YACjD,IAAI,KAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBACnC,OAAO;YACT,CAAC;YAED,IAAM,SAAS,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAyC,CAAC;YACnE,IAAM,MAAM,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,CAAC;YAEjC,iCAAiC;YACjC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YAED,sDAAsD;YACtD,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;gBACtB,MAAA,MAAA,KAAI,CAAC,MAAM,0CAAE,KAAK,mDAAG,yCAAyC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBACvF,KAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBAE/B,8DAA8D;YAChE,CAAC;iBAAM,CAAC;gBACN,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,KAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBAClC,CAAC;qBAAM,IAAI,MAAM,KAAK,oCAAoC,EAAE,CAAC;oBAC3D,IAAM,YAAU,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAA2C,CAAC;oBAC1E,IAAA,yBAAe,EAAC,wDAA4C,CAAC;yBAC1D,IAAI,CAAC;;wBACJ,2BAA2B;wBAC3B,sCAAsC,GAAG,MAAC,MAAc,aAAd,MAAM,uBAAN,MAAM,CAAU,8BAA8B,uDAAG;4BACzF,gBAAgB,4BAAA;4BAChB,mBAAmB,EAAE,UAAC,OAAgB;gCACpC,IAAI,mBAAmB,EAAE,CAAC;oCACxB,OAAO,mBAAmB,CAAC,CAAA,YAAU,aAAV,YAAU,uBAAV,YAAU,CAAE,UAAU,KAAI,OAAO,EAAE,OAAO,CAAC,CAAC;gCACzE,CAAC;gCACD,OAAO,IAAI,CAAC;4BACd,CAAC;4BACD,OAAO,EAAE,KAAI,CAAC,OAAO;4BACrB,QAAQ,EAAE,KAAI,CAAC,QAAQ;4BACvB,oBAAoB,EAAE,oDAAwC;4BAC9D,SAAS,EAAE,KAAI;4BACf,oBAAoB,sBAAA;4BACpB,oBAAoB,sBAAA;yBACrB,CAAC,CAAC;wBACH,KAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;oBAC7C,CAAC,CAAC;yBACD,KAAK,CAAC;;wBACL,MAAA,KAAI,CAAC,MAAM,0CAAE,IAAI,CAAC,8CAA8C,CAAC,CAAC;oBACpE,CAAC,CAAC,CAAC;gBACP,CAAC;qBAAM,IAAI,MAAM,KAAK,+BAA+B,EAAE,CAAC;oBACtD,2BAA2B;oBAC3B,MAAA,sCAAsC,aAAtC,sCAAsC,uBAAtC,sCAAsC,CAAE,KAAK,sFAAI,CAAC;gBACpD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,oDAAoD;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IACzC,CAAC;IAaH,sBAAC;AAAD,CAAC,AAxJD,IAwJC;AAxJY,0CAAe","sourcesContent":["/* istanbul ignore file */\n/* eslint-disable no-restricted-globals */\nimport {\n AMPLITUDE_ORIGIN,\n AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL,\n AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n} from '../constants';\nimport { asyncLoadScript, generateUniqueId, getEventTagProps } from '../helpers';\nimport { ILogger, Messenger, ActionType } from '@amplitude/analytics-core';\n\nexport type Action =\n | 'ping'\n | 'pong'\n | 'page-loaded'\n | 'selector-loaded'\n | 'initialize-visual-tagging-selector'\n | 'close-visual-tagging-selector'\n | 'element-selected'\n | 'track-selector-mode-changed'\n | 'track-selector-moved';\n\ninterface InitializeVisualTaggingSelectorData {\n actionType: ActionType;\n}\n\ninterface ElementSelectedData {\n '[Amplitude] Element Hierarchy'?: string;\n '[Amplitude] Element Tag'?: string;\n '[Amplitude] Element Text'?: string;\n '[Amplitude] Element Selector'?: string;\n '[Amplitude] Page URL'?: string;\n elementScreenshot?: Blob;\n}\n\ninterface TrackSelectorModeChangedData {\n newMode: string;\n pageUrl?: string;\n}\n\ninterface TrackSelectorMovedData {\n newEditorLocation: string;\n pageUrl?: string;\n}\n\nexport type ActionData = {\n ping: null | undefined;\n pong: null | undefined;\n 'page-loaded': null | undefined;\n 'selector-loaded': null | undefined;\n 'initialize-visual-tagging-selector': InitializeVisualTaggingSelectorData | null | undefined;\n 'close-visual-tagging-selector': null | undefined;\n 'element-selected': ElementSelectedData;\n 'track-selector-mode-changed': TrackSelectorModeChangedData;\n 'track-selector-moved': TrackSelectorMovedData;\n};\n\nexport interface Message<A extends Action> {\n action: A;\n data?: ActionData[A];\n}\n\ntype MessageRequest = {\n id: string;\n action: string;\n args: Record<string, any>;\n};\n\ntype MessageResponse = {\n id: string;\n action: string;\n responseData: any;\n};\n\n// TODO: use MessageChannel instead of window.postMessage\nexport class WindowMessenger implements Messenger {\n endpoint = AMPLITUDE_ORIGIN;\n logger?: ILogger;\n requestCallbacks: {\n [id: string]: {\n resolve: (data: any) => void;\n reject: (data: any) => void;\n };\n } = {};\n\n constructor({ origin = AMPLITUDE_ORIGIN }: { origin?: string } = {}) {\n this.endpoint = origin;\n }\n\n private notify(message: Message<Action> | MessageRequest) {\n this.logger?.debug?.('Message sent: ', JSON.stringify(message));\n (window.opener as WindowProxy)?.postMessage?.(message, this.endpoint);\n }\n\n // Send an async request to the parent window\n public sendRequest(action: string, args: Record<string, any>, options = { timeout: 15_000 }): Promise<any> {\n // Create Request ID\n const id = generateUniqueId();\n const request = {\n id,\n action,\n args,\n };\n\n // Create a Promise that will be resolved when the response is received\n const promise = new Promise((resolve, reject) => {\n this.requestCallbacks[id] = { resolve, reject };\n\n // Send the request\n this.notify(request);\n\n // Handle request timeouts\n if (options?.timeout > 0) {\n setTimeout(() => {\n reject(new Error(`${action} timed out (id: ${id})`));\n delete this.requestCallbacks[id];\n }, options.timeout);\n }\n });\n\n return promise;\n }\n\n // Handle messages from the parent window\n private handleResponse(response: MessageResponse) {\n if (!this.requestCallbacks[response.id]) {\n this.logger?.warn(`No callback found for request id: ${response.id}`);\n return;\n }\n\n this.requestCallbacks[response.id].resolve(response.responseData);\n delete this.requestCallbacks[response.id];\n }\n\n setup({\n logger,\n endpoint,\n isElementSelectable,\n cssSelectorAllowlist,\n actionClickAllowlist,\n }: {\n logger?: ILogger;\n endpoint?: string;\n isElementSelectable?: (action: InitializeVisualTaggingSelectorData['actionType'], element: Element) => boolean;\n cssSelectorAllowlist?: string[];\n actionClickAllowlist?: string[];\n } = {}) {\n this.logger = logger;\n // If endpoint is customized, don't override it.\n if (endpoint && this.endpoint === AMPLITUDE_ORIGIN) {\n this.endpoint = endpoint;\n }\n let amplitudeVisualTaggingSelectorInstance: any = null;\n\n // Attach Event Listener to listen for messages from the parent window\n window.addEventListener('message', (event) => {\n this.logger?.debug?.('Message received: ', JSON.stringify(event));\n\n // Only accept messages from the specified origin\n if (this.endpoint !== event.origin) {\n return;\n }\n\n const eventData = event?.data as Message<Action> | MessageResponse;\n const action = eventData?.action;\n\n // Ignore messages without action\n if (!action) {\n return;\n }\n\n // If id exists, handle responses to previous requests\n if ('id' in eventData) {\n this.logger?.debug?.('Received Response to previous request: ', JSON.stringify(event));\n this.handleResponse(eventData);\n\n // If action exists, handle the action using existing handlers\n } else {\n if (action === 'ping') {\n this.notify({ action: 'pong' });\n } else if (action === 'initialize-visual-tagging-selector') {\n const actionData = eventData?.data as InitializeVisualTaggingSelectorData;\n asyncLoadScript(AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL)\n .then(() => {\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance = (window as any)?.amplitudeVisualTaggingSelector?.({\n getEventTagProps,\n isElementSelectable: (element: Element) => {\n if (isElementSelectable) {\n return isElementSelectable(actionData?.actionType || 'click', element);\n }\n return true;\n },\n onTrack: this.onTrack,\n onSelect: this.onSelect,\n visualHighlightClass: AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n messenger: this,\n cssSelectorAllowlist,\n actionClickAllowlist,\n });\n this.notify({ action: 'selector-loaded' });\n })\n .catch(() => {\n this.logger?.warn('Failed to initialize visual tagging selector');\n });\n } else if (action === 'close-visual-tagging-selector') {\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance?.close?.();\n }\n }\n });\n\n // Notify the parent window that the page has loaded\n this.notify({ action: 'page-loaded' });\n }\n\n private onSelect = (data: ElementSelectedData) => {\n this.notify({ action: 'element-selected', data });\n };\n\n private onTrack = (type: string, properties: { [key: string]: string | null }) => {\n if (type === 'selector-mode-changed') {\n this.notify({ action: 'track-selector-mode-changed', data: properties });\n } else if (type === 'selector-moved') {\n this.notify({ action: 'track-selector-moved', data: properties });\n }\n };\n}\n"]}
|
package/lib/cjs/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "1.0
|
|
1
|
+
export declare const VERSION = "1.1.0";
|
|
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":"
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,OAAO,CAAC","sourcesContent":["export const VERSION = '1.1.0';\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AllWindowObservables, AutoCaptureOptionsWithDefaults } from 'src/autocapture-plugin';
|
|
2
|
-
import { BrowserClient, ActionType } from '@amplitude/analytics-
|
|
2
|
+
import { BrowserClient, ActionType } from '@amplitude/analytics-core';
|
|
3
3
|
import { shouldTrackEvent } from '../helpers';
|
|
4
4
|
export declare function trackActionClick({ amplitude, allObservables, options, getEventProperties, shouldTrackEvent, shouldTrackActionClick, }: {
|
|
5
5
|
amplitude: BrowserClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-action-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-action-click.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,8BAA8B,EAG/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"track-action-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-action-click.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,8BAA8B,EAG/B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAkD,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9F,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,cAAc,EACd,OAAO,EACP,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,GACvB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,OAAO,EAAE,8BAA8B,CAAC;IACxC,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtF,sBAAsB,EAAE,gBAAgB,CAAC;IACzC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,+BAsDA"}
|
|
@@ -36,9 +36,7 @@ export function trackActionClick(_a) {
|
|
|
36
36
|
}));
|
|
37
37
|
return actionClicks.subscribe(function (actionClick) {
|
|
38
38
|
/* istanbul ignore next */
|
|
39
|
-
amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(AMPLITUDE_ELEMENT_CLICKED_EVENT, getEventProperties('click', actionClick.closestTrackedAncestor)
|
|
40
|
-
time: actionClick.timestamp,
|
|
41
|
-
});
|
|
39
|
+
amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(AMPLITUDE_ELEMENT_CLICKED_EVENT, getEventProperties('click', actionClick.closestTrackedAncestor));
|
|
42
40
|
});
|
|
43
41
|
}
|
|
44
42
|
//# sourceMappingURL=track-action-click.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-action-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-action-click.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE3E,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAoB,MAAM,YAAY,CAAC;AAC9F,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAE/D,MAAM,UAAU,gBAAgB,CAAC,EAchC;QAbC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,kBAAkB,wBAAA,EAClB,gBAAgB,sBAAA,EAChB,sBAAsB,4BAAA;IASd,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,UAAC,KAAK;QACX,oFAAoF;QACpF,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAClE,CAAC,CAAC,EACF,GAAG,CAAC,UAAC,KAAK;QACR,oGAAoG;QACpG,IAAM,oBAAoB,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,MAAiB,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC5G,KAAK,CAAC,sBAAsB,GAAG,oBAA+B,CAAC;QAE/D,wFAAwF;QACxF,IAAI,KAAK,CAAC,sBAAsB,KAAK,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"track-action-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-action-click.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE3E,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAoB,MAAM,YAAY,CAAC;AAC9F,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAE/D,MAAM,UAAU,gBAAgB,CAAC,EAchC;QAbC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,kBAAkB,wBAAA,EAClB,gBAAgB,sBAAA,EAChB,sBAAsB,4BAAA;IASd,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,UAAC,KAAK;QACX,oFAAoF;QACpF,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAClE,CAAC,CAAC,EACF,GAAG,CAAC,UAAC,KAAK;QACR,oGAAoG;QACpG,IAAM,oBAAoB,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,MAAiB,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC5G,KAAK,CAAC,sBAAsB,GAAG,oBAA+B,CAAC;QAE/D,wFAAwF;QACxF,IAAI,KAAK,CAAC,sBAAsB,KAAK,IAAI,EAAE,CAAC;YAC1C,KAAK,CAAC,uBAAuB,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,EACF,MAAM,CAAC,2BAA2B,CAAC,EACnC,MAAM,CAAC,UAAC,UAAU;QAChB,uDAAuD;QACvD,OAAO,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC5E,CAAC,CAAC,CACH,CAAC;IAEF,IAAM,iBAAiB,GAEnB,CAAC,kBAAkB,CAAC,CAAC;IACzB,0BAA0B;IAC1B,IAAI,kBAAkB,EAAE,CAAC;QACvB,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC7C,CAAC;IACD,IAAM,kBAAkB,GAAG,KAAK,wCAAI,iBAAiB,UAAC,CAAC;IAEvD,IAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI;IAC/C,+HAA+H;IAC/H,oEAAoE;IACpE,SAAS,CAAC,UAAC,KAAK;QACd,OAAA,kBAAkB,CAAC,IAAI,CACrB,IAAI,CAAC,CAAC,CAAC,EACP,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK,EAAE,CAAC,EAAE,2EAA2E;QACvH,GAAG,CAAC,cAAM,OAAA,KAAK,EAAL,CAAK,CAAC,CACjB;IAJD,CAIC,CACF,CACF,CAAC;IAEF,OAAO,YAAY,CAAC,SAAS,CAAC,UAAC,WAAW;QACxC,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CACd,+BAA+B,EAC/B,kBAAkB,CAAC,OAAO,EAAG,WAAwD,CAAC,sBAAsB,CAAC,CAC9G,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n AllWindowObservables,\n AutoCaptureOptionsWithDefaults,\n ElementBasedTimestampedEvent,\n ObservablesEnum,\n} from 'src/autocapture-plugin';\nimport { filter, map, merge, switchMap, take, timeout, EMPTY } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, getClosestElement, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nexport function trackActionClick({\n amplitude,\n allObservables,\n options,\n getEventProperties,\n shouldTrackEvent,\n shouldTrackActionClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n options: AutoCaptureOptionsWithDefaults;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackActionClick: shouldTrackEvent;\n shouldTrackEvent: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable } = allObservables;\n\n const filteredClickObservable = clickObservable.pipe(\n filter((click) => {\n // Filter out regularly tracked click events that are already handled in trackClicks\n return !shouldTrackEvent('click', click.closestTrackedAncestor);\n }),\n map((click) => {\n // overwrite the closestTrackedAncestor with the closest element that is on the actionClickAllowlist\n const closestActionClickEl = getClosestElement(click.event.target as Element, options.actionClickAllowlist);\n click.closestTrackedAncestor = closestActionClickEl as Element;\n\n // overwrite the targetElementProperties with the properties of the closestActionClickEl\n if (click.closestTrackedAncestor !== null) {\n click.targetElementProperties = getEventProperties(click.type, click.closestTrackedAncestor);\n }\n return click;\n }),\n filter(filterOutNonTrackableEvents),\n filter((clickEvent) => {\n // Only track change on elements that should be tracked\n return shouldTrackActionClick('click', clickEvent.closestTrackedAncestor);\n }),\n );\n\n const changeObservables: Array<\n AllWindowObservables[ObservablesEnum.MutationObservable] | AllWindowObservables[ObservablesEnum.NavigateObservable]\n > = [mutationObservable];\n /* istanbul ignore next */\n if (navigateObservable) {\n changeObservables.push(navigateObservable);\n }\n const mutationOrNavigate = merge(...changeObservables);\n\n const actionClicks = filteredClickObservable.pipe(\n // If a mutation occurs within 0.5 seconds of a click event (timeout({ first: 500 })), it emits the original first click event.\n // take 1 to only limit the action events in case there are multiple\n switchMap((click) =>\n mutationOrNavigate.pipe(\n take(1),\n timeout({ first: 500, with: () => EMPTY }), // in case of timeout, map to empty to prevent any click from being emitted\n map(() => click),\n ),\n ),\n );\n\n return actionClicks.subscribe((actionClick) => {\n /* istanbul ignore next */\n amplitude?.track(\n AMPLITUDE_ELEMENT_CLICKED_EVENT,\n getEventProperties('click', (actionClick as ElementBasedTimestampedEvent<MouseEvent>).closestTrackedAncestor),\n );\n });\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AllWindowObservables } from 'src/autocapture-plugin';
|
|
2
|
-
import { BrowserClient, ActionType } from '@amplitude/analytics-
|
|
2
|
+
import { BrowserClient, ActionType } from '@amplitude/analytics-core';
|
|
3
3
|
import { shouldTrackEvent } from '../helpers';
|
|
4
4
|
export declare function trackChange({ amplitude, allObservables, getEventProperties, shouldTrackEvent, }: {
|
|
5
5
|
amplitude: BrowserClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-change.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-change.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"track-change.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-change.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG3E,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,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,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,+BAeA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-change.js","sourceRoot":"","sources":["../../../src/autocapture/track-change.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,2BAA2B,EAAoB,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAE/D,MAAM,UAAU,WAAW,CAAC,EAU3B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,kBAAkB,wBAAA,EAClB,gBAAgB,sBAAA;IAOR,IAAA,gBAAgB,GAAK,cAAc,iBAAnB,CAAoB;IAE5C,IAAM,wBAAwB,GAAG,gBAAgB,CAAC,IAAI,CACpD,MAAM,CAAC,2BAA2B,CAAC,EACnC,MAAM,CAAC,UAAC,WAAW;QACjB,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC;IACxE,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,wBAAwB,CAAC,SAAS,CAAC,UAAC,WAAW;QACpD,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,+BAA+B,EAAE,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { AllWindowObservables } from 'src/autocapture-plugin';\nimport { filter } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-
|
|
1
|
+
{"version":3,"file":"track-change.js","sourceRoot":"","sources":["../../../src/autocapture/track-change.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,2BAA2B,EAAoB,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAE/D,MAAM,UAAU,WAAW,CAAC,EAU3B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,kBAAkB,wBAAA,EAClB,gBAAgB,sBAAA;IAOR,IAAA,gBAAgB,GAAK,cAAc,iBAAnB,CAAoB;IAE5C,IAAM,wBAAwB,GAAG,gBAAgB,CAAC,IAAI,CACpD,MAAM,CAAC,2BAA2B,CAAC,EACnC,MAAM,CAAC,UAAC,WAAW;QACjB,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC;IACxE,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,wBAAwB,CAAC,SAAS,CAAC,UAAC,WAAW;QACpD,0BAA0B;QAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,+BAA+B,EAAE,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { AllWindowObservables } from 'src/autocapture-plugin';\nimport { filter } from 'rxjs';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CHANGED_EVENT } from '../constants';\n\nexport function trackChange({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackEvent,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackEvent: shouldTrackEvent;\n}) {\n const { changeObservable } = allObservables;\n\n const filteredChangeObservable = changeObservable.pipe(\n filter(filterOutNonTrackableEvents),\n filter((changeEvent) => {\n // Only track change on elements that should be tracked,\n return shouldTrackEvent('change', changeEvent.closestTrackedAncestor);\n }),\n );\n\n return filteredChangeObservable.subscribe((changeEvent) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', changeEvent.closestTrackedAncestor));\n });\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AllWindowObservables, AutoCaptureOptionsWithDefaults } from 'src/autocapture-plugin';
|
|
2
|
-
import { BrowserClient } from '@amplitude/analytics-
|
|
2
|
+
import { BrowserClient } from '@amplitude/analytics-core';
|
|
3
3
|
import { shouldTrackEvent } from '../helpers';
|
|
4
4
|
export declare function trackClicks({ amplitude, allObservables, options, shouldTrackEvent, }: {
|
|
5
5
|
amplitude: BrowserClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAE9F,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"track-click.d.ts","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAE9F,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAA+B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK3E,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,OAAO,EACP,gBAAgB,GACjB,EAAE;IACD,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,OAAO,EAAE,8BAA8B,CAAC;IACxC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,+BA+CA"}
|
|
@@ -33,9 +33,7 @@ export function trackClicks(_a) {
|
|
|
33
33
|
for (var clicks_1 = __values(clicks), clicks_1_1 = clicks_1.next(); !clicks_1_1.done; clicks_1_1 = clicks_1.next()) {
|
|
34
34
|
var click = clicks_1_1.value;
|
|
35
35
|
/* istanbul ignore next */
|
|
36
|
-
amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(clickType, click.targetElementProperties
|
|
37
|
-
time: click.timestamp,
|
|
38
|
-
});
|
|
36
|
+
amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(clickType, click.targetElementProperties);
|
|
39
37
|
}
|
|
40
38
|
}
|
|
41
39
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAEjF,OAAO,EAAE,2BAA2B,EAAoB,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAE/D,IAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B,MAAM,UAAU,WAAW,CAAC,EAU3B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,gBAAgB,sBAAA;IAOR,IAAA,eAAe,GAAK,cAAc,gBAAnB,CAAoB;IAE3C,iFAAiF;IACjF,mGAAmG;IACnG,wFAAwF;IACxF,IAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAC5C,QAAQ,EAAE,EACV,MAAM,CAAC,UAAC,EAAe;YAAf,KAAA,aAAe,EAAd,IAAI,QAAA,EAAE,OAAO,QAAA;QACpB,IAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QACjE,0BAA0B;QAC1B,IAAM,OAAO,GACX,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;YAC1D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7D,OAAO,aAAa,IAAI,CAAC,OAAO,CAAC;IACnC,CAAC,CAAC,CACH,CAAC;IAEF,qDAAqD;IACrD,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,EAClC,GAAG,CAAC,cAAM,OAAA,SAAkB,EAAlB,CAAkB,CAAC,CAC9B,CAAC;IAEF,IAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAE1D,0EAA0E;IAC1E,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,MAAM,CAAC,2BAA2B,CAAC,EACnC,MAAM,CAAC,UAAC,KAAK;QACX,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,CACjB,CAAC;IAEF,OAAO,cAAc,CAAC,SAAS,CAAC,UAAC,MAAM;;QACrC,+CAA+C;QAC/C,IAAM,SAAS,GACb,MAAM,CAAC,MAAM,IAAI,oBAAoB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,+BAA+B,CAAC;;YAE5G,KAAoB,IAAA,WAAA,SAAA,MAAM,CAAA,8BAAA,kDAAE;
|
|
1
|
+
{"version":3,"file":"track-click.js","sourceRoot":"","sources":["../../../src/autocapture/track-click.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAEjF,OAAO,EAAE,2BAA2B,EAAoB,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAE/D,IAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B,MAAM,UAAU,WAAW,CAAC,EAU3B;QATC,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,gBAAgB,sBAAA;IAOR,IAAA,eAAe,GAAK,cAAc,gBAAnB,CAAoB;IAE3C,iFAAiF;IACjF,mGAAmG;IACnG,wFAAwF;IACxF,IAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAC5C,QAAQ,EAAE,EACV,MAAM,CAAC,UAAC,EAAe;YAAf,KAAA,aAAe,EAAd,IAAI,QAAA,EAAE,OAAO,QAAA;QACpB,IAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QACjE,0BAA0B;QAC1B,IAAM,OAAO,GACX,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;YAC1D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7D,OAAO,aAAa,IAAI,CAAC,OAAO,CAAC;IACnC,CAAC,CAAC,CACH,CAAC;IAEF,qDAAqD;IACrD,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,EAClC,GAAG,CAAC,cAAM,OAAA,SAAkB,EAAlB,CAAkB,CAAC,CAC9B,CAAC;IAEF,IAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAE1D,0EAA0E;IAC1E,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,MAAM,CAAC,2BAA2B,CAAC,EACnC,MAAM,CAAC,UAAC,KAAK;QACX,wDAAwD;QACxD,OAAO,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,CACjB,CAAC;IAEF,OAAO,cAAc,CAAC,SAAS,CAAC,UAAC,MAAM;;QACrC,+CAA+C;QAC/C,IAAM,SAAS,GACb,MAAM,CAAC,MAAM,IAAI,oBAAoB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,+BAA+B,CAAC;;YAE5G,KAAoB,IAAA,WAAA,SAAA,MAAM,CAAA,8BAAA,kDAAE,CAAC;gBAAxB,IAAM,KAAK,mBAAA;gBACd,0BAA0B;gBAC1B,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC7D,CAAC;;;;;;;;;IACH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { AllWindowObservables, AutoCaptureOptionsWithDefaults } from 'src/autocapture-plugin';\nimport { buffer, filter, map, debounceTime, merge, pairwise, delay } from 'rxjs';\nimport { BrowserClient } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nconst RAGE_CLICK_THRESHOLD = 5;\n\nexport function trackClicks({\n amplitude,\n allObservables,\n options,\n shouldTrackEvent,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n options: AutoCaptureOptionsWithDefaults;\n shouldTrackEvent: shouldTrackEvent;\n}) {\n const { clickObservable } = allObservables;\n\n // Trigger if the target of the click event has changed and position is different\n // Keeping track of position is important to avoid false positives when the user clicks on the same\n // element where certain frameworks could replace the element instance between rerenders\n const comparisonTrigger = clickObservable.pipe(\n pairwise(),\n filter(([prev, current]) => {\n const targetChanged = prev.event.target !== current.event.target;\n /* istanbul ignore next */\n const samePos =\n Math.abs(current.event.screenX - prev.event.screenX) <= 20 &&\n Math.abs(current.event.screenY - prev.event.screenY) <= 20;\n return targetChanged && !samePos;\n }),\n );\n\n // Trigger if there is no click event within 1 second\n const timeoutTrigger = clickObservable.pipe(\n debounceTime(options.debounceTime),\n map(() => 'timeout' as const),\n );\n\n const triggers = merge(comparisonTrigger, timeoutTrigger);\n\n // Get buffers of clicks, if the buffer length is over 5, it is rage click\n const bufferedClicks = clickObservable.pipe(\n delay(0),\n filter(filterOutNonTrackableEvents),\n filter((click) => {\n // Only track clicks on elements that should be tracked,\n return shouldTrackEvent('click', click.closestTrackedAncestor);\n }),\n buffer(triggers),\n );\n\n return bufferedClicks.subscribe((clicks) => {\n // TODO: update this when rage clicks are added\n const clickType =\n clicks.length >= RAGE_CLICK_THRESHOLD ? AMPLITUDE_ELEMENT_CLICKED_EVENT : AMPLITUDE_ELEMENT_CLICKED_EVENT;\n\n for (const click of clicks) {\n /* istanbul ignore next */\n amplitude?.track(clickType, click.targetElementProperties);\n }\n });\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BrowserClient, BrowserConfig, EnrichmentPlugin, ElementInteractionsOptions } from '@amplitude/analytics-
|
|
1
|
+
import { BrowserClient, BrowserConfig, EnrichmentPlugin, ElementInteractionsOptions } from '@amplitude/analytics-core';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
3
|
import { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';
|
|
4
4
|
declare global {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAEhB,0BAA0B,EAK3B,MAAM,
|
|
1
|
+
{"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -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_DATA_ATTRIBUTE_PREFIX, DEFAULT_ACTION_CLICK_ALLOWLIST, } from '@amplitude/analytics-
|
|
3
|
+
import { DEFAULT_CSS_SELECTOR_ALLOWLIST, DEFAULT_DATA_ATTRIBUTE_PREFIX, DEFAULT_ACTION_CLICK_ALLOWLIST, } from '@amplitude/analytics-core';
|
|
4
4
|
import * as constants from './constants';
|
|
5
5
|
import { fromEvent, map, Observable } from 'rxjs';
|
|
6
6
|
import { getText, getAttributesWithPrefix, removeEmptyProperties, getNearestLabel, getSelector, createShouldTrackEvent, getClosestElement, } from './helpers';
|
|
@@ -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 BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n Logger,\n ElementInteractionsOptions,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n ActionType,\n} from '@amplitude/analytics-types';\nimport * as constants from './constants';\nimport { fromEvent, map, Observable, Subscription } from 'rxjs';\nimport {\n getText,\n getAttributesWithPrefix,\n removeEmptyProperties,\n getNearestLabel,\n getSelector,\n createShouldTrackEvent,\n getClosestElement,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { getHierarchy } from './hierarchy';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';\n\ndeclare global {\n interface Window {\n navigation: HasEventTargetAddRemove<Event>;\n }\n}\n\ninterface NavigateEvent extends Event {\n readonly navigationType: 'reload' | 'push' | 'replace' | 'traverse';\n readonly destination: {\n readonly url: string;\n readonly key: string | null;\n readonly id: string | null;\n readonly index: number;\n readonly sameDocument: boolean;\n\n getState(): any;\n };\n readonly canIntercept: boolean;\n readonly userInitiated: boolean;\n readonly hashChange: boolean;\n readonly signal: AbortSignal;\n readonly formData: FormData | null;\n readonly downloadRequest: string | null;\n readonly info: any;\n readonly hasUAVisualTransition: boolean;\n /** @see https://github.com/WICG/navigation-api/pull/264 */\n readonly sourceElement: Element | null;\n\n scroll(): void;\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport enum ObservablesEnum {\n ClickObservable = 'clickObservable',\n ChangeObservable = 'changeObservable',\n // ErrorObservable = 'errorObservable',\n NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n}\n\n// Base TimestampedEvent type\ntype BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation';\n};\n\n// Specific types for events with targetElementProperties\nexport type ElementBasedEvent = MouseEvent | Event;\nexport type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {\n event: MouseEvent | Event;\n type: 'click' | 'change';\n closestTrackedAncestor: Element;\n targetElementProperties: Record<string, any>;\n};\n\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;\n // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;\n [ObservablesEnum.NavigateObservable]: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n}\n\n// Type predicate\nexport function isElementBasedEvent<T>(event: BaseTimestampedEvent<T>): event is ElementBasedTimestampedEvent<T> {\n return event.type === 'click' || event.type === 'change';\n}\n\nexport const autocapturePlugin = (options: ElementInteractionsOptions = {}): BrowserEnrichmentPlugin => {\n const {\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0; // TODO: update this when rage clicks are added to 1000ms\n\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Subscription[] = [];\n let logger: Logger | undefined = undefined;\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n // Create Observables from direct user events\n const clickObservable = fromEvent<MouseEvent>(document, 'click', { capture: true }).pipe(\n map((click) => addAdditionalEventProperties(click, 'click')),\n );\n const changeObservable = fromEvent<Event>(document, 'change', { capture: true }).pipe(\n map((change) => addAdditionalEventProperties(change, 'change')),\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;\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = fromEvent<NavigateEvent>(window.navigation, 'navigate').pipe(\n map((navigate) => addAdditionalEventProperties(navigate, 'navigate')),\n );\n }\n\n // Track DOM Mutations\n const mutationObservable = new Observable<MutationRecord[]>((observer) => {\n const mutationObserver = new MutationObserver((mutations) => {\n observer.next(mutations);\n });\n mutationObserver.observe(document.body, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n });\n return () => mutationObserver.disconnect();\n }).pipe(map((mutation) => addAdditionalEventProperties(mutation, 'mutation')));\n\n return {\n [ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,\n [ObservablesEnum.ChangeObservable]: changeObservable as Observable<ElementBasedTimestampedEvent<Event>>,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n [ObservablesEnum.NavigateObservable]: navigateObservable,\n [ObservablesEnum.MutationObservable]: mutationObservable,\n };\n };\n\n // Returns the Amplitude event properties for the given element.\n const getEventProperties = (actionType: ActionType, element: Element) => {\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 const ariaLabel = element.getAttribute('aria-label');\n const attributes = getAttributesWithPrefix(element, dataAttributePrefix);\n const nearestLabel = getNearestLabel(element);\n const selector = getSelector(element, logger);\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID]: element.getAttribute('id') || '',\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS]: element.getAttribute('class'),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: getHierarchy(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: 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_ARIA_LABEL]: ariaLabel,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR]: selector,\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]: (typeof document !== 'undefined' && document.title) || '',\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = element.href;\n }\n return removeEmptyProperties(properties);\n };\n\n const addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\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 // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(\n baseEvent.event.target as HTMLElement,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = getEventProperties(baseEvent.type, closestTrackedAncestor);\n }\n return baseEvent;\n }\n\n return baseEvent;\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n logger = config.loggerProvider;\n\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\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 options: options as AutoCaptureOptionsWithDefaults,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n });\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties,\n amplitude,\n shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n subscriptions.push(actionClickSubscription);\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"autocapture-plugin.js","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n ILogger,\n ElementInteractionsOptions,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n ActionType,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { fromEvent, map, Observable, Subscription } from 'rxjs';\nimport {\n getText,\n getAttributesWithPrefix,\n removeEmptyProperties,\n getNearestLabel,\n getSelector,\n createShouldTrackEvent,\n getClosestElement,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { getHierarchy } from './hierarchy';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';\n\ndeclare global {\n interface Window {\n navigation: HasEventTargetAddRemove<Event>;\n }\n}\n\ninterface NavigateEvent extends Event {\n readonly navigationType: 'reload' | 'push' | 'replace' | 'traverse';\n readonly destination: {\n readonly url: string;\n readonly key: string | null;\n readonly id: string | null;\n readonly index: number;\n readonly sameDocument: boolean;\n\n getState(): any;\n };\n readonly canIntercept: boolean;\n readonly userInitiated: boolean;\n readonly hashChange: boolean;\n readonly signal: AbortSignal;\n readonly formData: FormData | null;\n readonly downloadRequest: string | null;\n readonly info: any;\n readonly hasUAVisualTransition: boolean;\n /** @see https://github.com/WICG/navigation-api/pull/264 */\n readonly sourceElement: Element | null;\n\n scroll(): void;\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport enum ObservablesEnum {\n ClickObservable = 'clickObservable',\n ChangeObservable = 'changeObservable',\n // ErrorObservable = 'errorObservable',\n NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n}\n\n// Base TimestampedEvent type\ntype BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation';\n};\n\n// Specific types for events with targetElementProperties\nexport type ElementBasedEvent = MouseEvent | Event;\nexport type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {\n event: MouseEvent | Event;\n type: 'click' | 'change';\n closestTrackedAncestor: Element;\n targetElementProperties: Record<string, any>;\n};\n\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;\n // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;\n [ObservablesEnum.NavigateObservable]: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n}\n\n// Type predicate\nexport function isElementBasedEvent<T>(event: BaseTimestampedEvent<T>): event is ElementBasedTimestampedEvent<T> {\n return event.type === 'click' || event.type === 'change';\n}\n\nexport const autocapturePlugin = (options: ElementInteractionsOptions = {}): BrowserEnrichmentPlugin => {\n const {\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0; // TODO: update this when rage clicks are added to 1000ms\n\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Subscription[] = [];\n let logger: ILogger | undefined = undefined;\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n // Create Observables from direct user events\n const clickObservable = fromEvent<MouseEvent>(document, 'click', { capture: true }).pipe(\n map((click) => addAdditionalEventProperties(click, 'click')),\n );\n const changeObservable = fromEvent<Event>(document, 'change', { capture: true }).pipe(\n map((change) => addAdditionalEventProperties(change, 'change')),\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;\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = fromEvent<NavigateEvent>(window.navigation, 'navigate').pipe(\n map((navigate) => addAdditionalEventProperties(navigate, 'navigate')),\n );\n }\n\n // Track DOM Mutations\n const mutationObservable = new Observable<MutationRecord[]>((observer) => {\n const mutationObserver = new MutationObserver((mutations) => {\n observer.next(mutations);\n });\n mutationObserver.observe(document.body, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n });\n return () => mutationObserver.disconnect();\n }).pipe(map((mutation) => addAdditionalEventProperties(mutation, 'mutation')));\n\n return {\n [ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,\n [ObservablesEnum.ChangeObservable]: changeObservable as Observable<ElementBasedTimestampedEvent<Event>>,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n [ObservablesEnum.NavigateObservable]: navigateObservable,\n [ObservablesEnum.MutationObservable]: mutationObservable,\n };\n };\n\n // Returns the Amplitude event properties for the given element.\n const getEventProperties = (actionType: ActionType, element: Element) => {\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 const ariaLabel = element.getAttribute('aria-label');\n const attributes = getAttributesWithPrefix(element, dataAttributePrefix);\n const nearestLabel = getNearestLabel(element);\n const selector = getSelector(element, logger);\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID]: element.getAttribute('id') || '',\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS]: element.getAttribute('class'),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: getHierarchy(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: 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_ARIA_LABEL]: ariaLabel,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR]: selector,\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]: (typeof document !== 'undefined' && document.title) || '',\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = element.href;\n }\n return removeEmptyProperties(properties);\n };\n\n const addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\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 // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(\n baseEvent.event.target as HTMLElement,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = getEventProperties(baseEvent.type, closestTrackedAncestor);\n }\n return baseEvent;\n }\n\n return baseEvent;\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n logger = config.loggerProvider;\n\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\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 options: options as AutoCaptureOptionsWithDefaults,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n });\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties,\n amplitude,\n shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n subscriptions.push(actionClickSubscription);\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
|