@amplitude/plugin-autocapture-browser 0.9.2 → 0.11.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-plugin.d.ts.map +1 -1
- package/lib/cjs/autocapture-plugin.js +3 -0
- package/lib/cjs/autocapture-plugin.js.map +1 -1
- package/lib/cjs/constants.d.ts +1 -0
- package/lib/cjs/constants.d.ts.map +1 -1
- package/lib/cjs/constants.js +3 -1
- package/lib/cjs/constants.js.map +1 -1
- package/lib/cjs/helpers.d.ts +4 -0
- package/lib/cjs/helpers.d.ts.map +1 -1
- package/lib/cjs/helpers.js +9 -3
- package/lib/cjs/helpers.js.map +1 -1
- package/lib/cjs/hierarchy.d.ts +5 -0
- package/lib/cjs/hierarchy.d.ts.map +1 -0
- package/lib/cjs/hierarchy.js +129 -0
- package/lib/cjs/hierarchy.js.map +1 -0
- package/lib/cjs/libs/messenger.d.ts +11 -0
- package/lib/cjs/libs/messenger.d.ts.map +1 -1
- package/lib/cjs/libs/messenger.js +81 -30
- package/lib/cjs/libs/messenger.js.map +1 -1
- package/lib/cjs/typings/autocapture.d.ts +12 -0
- package/lib/cjs/typings/autocapture.d.ts.map +1 -1
- package/lib/cjs/typings/autocapture.js.map +1 -1
- package/lib/cjs/version.d.ts +1 -1
- package/lib/cjs/version.d.ts.map +1 -1
- package/lib/cjs/version.js +1 -1
- package/lib/cjs/version.js.map +1 -1
- package/lib/esm/autocapture-plugin.d.ts.map +1 -1
- package/lib/esm/autocapture-plugin.js +3 -0
- package/lib/esm/autocapture-plugin.js.map +1 -1
- package/lib/esm/constants.d.ts +1 -0
- package/lib/esm/constants.d.ts.map +1 -1
- package/lib/esm/constants.js +2 -0
- package/lib/esm/constants.js.map +1 -1
- package/lib/esm/helpers.d.ts +4 -0
- package/lib/esm/helpers.d.ts.map +1 -1
- package/lib/esm/helpers.js +7 -2
- package/lib/esm/helpers.js.map +1 -1
- package/lib/esm/hierarchy.d.ts +5 -0
- package/lib/esm/hierarchy.d.ts.map +1 -0
- package/lib/esm/hierarchy.js +124 -0
- package/lib/esm/hierarchy.js.map +1 -0
- package/lib/esm/libs/messenger.d.ts +11 -0
- package/lib/esm/libs/messenger.d.ts.map +1 -1
- package/lib/esm/libs/messenger.js +82 -31
- package/lib/esm/libs/messenger.js.map +1 -1
- package/lib/esm/typings/autocapture.d.ts +12 -0
- package/lib/esm/typings/autocapture.d.ts.map +1 -1
- package/lib/esm/typings/autocapture.js.map +1 -1
- package/lib/esm/version.d.ts +1 -1
- package/lib/esm/version.d.ts.map +1 -1
- package/lib/esm/version.js +1 -1
- package/lib/esm/version.js.map +1 -1
- package/lib/scripts/amplitude-min.js +1 -1
- package/lib/scripts/amplitude-min.js.gz +0 -0
- package/lib/scripts/amplitude-min.umd.js +1 -1
- package/lib/scripts/amplitude-min.umd.js.gz +0 -0
- package/lib/scripts/autocapture-plugin.d.ts.map +1 -1
- package/lib/scripts/constants.d.ts +1 -0
- package/lib/scripts/constants.d.ts.map +1 -1
- package/lib/scripts/helpers.d.ts +4 -0
- package/lib/scripts/helpers.d.ts.map +1 -1
- package/lib/scripts/hierarchy.d.ts +5 -0
- package/lib/scripts/hierarchy.d.ts.map +1 -0
- package/lib/scripts/libs/messenger.d.ts +11 -0
- package/lib/scripts/libs/messenger.d.ts.map +1 -1
- package/lib/scripts/typings/autocapture.d.ts +12 -0
- package/lib/scripts/typings/autocapture.d.ts.map +1 -1
- package/lib/scripts/version.d.ts +1 -1
- package/lib/scripts/version.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -4,11 +4,13 @@ exports.WindowMessenger = void 0;
|
|
|
4
4
|
/* eslint-disable no-restricted-globals */
|
|
5
5
|
var constants_1 = require("../constants");
|
|
6
6
|
var helpers_1 = require("../helpers");
|
|
7
|
+
// TODO: use MessageChannel instead of window.postMessage
|
|
7
8
|
var WindowMessenger = /** @class */ (function () {
|
|
8
9
|
function WindowMessenger(_a) {
|
|
9
10
|
var _b = _a === void 0 ? {} : _a, _c = _b.origin, origin = _c === void 0 ? constants_1.AMPLITUDE_ORIGIN : _c;
|
|
10
11
|
var _this = this;
|
|
11
12
|
this.endpoint = constants_1.AMPLITUDE_ORIGIN;
|
|
13
|
+
this.requestCallbacks = {};
|
|
12
14
|
this.onSelect = function (data) {
|
|
13
15
|
_this.notify({ action: 'element-selected', data: data });
|
|
14
16
|
};
|
|
@@ -27,6 +29,42 @@ var WindowMessenger = /** @class */ (function () {
|
|
|
27
29
|
(_b = (_a = this.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, 'Message sent: ', JSON.stringify(message));
|
|
28
30
|
(_d = (_c = window.opener) === null || _c === void 0 ? void 0 : _c.postMessage) === null || _d === void 0 ? void 0 : _d.call(_c, message, this.endpoint);
|
|
29
31
|
};
|
|
32
|
+
// Send an async request to the parent window
|
|
33
|
+
WindowMessenger.prototype.sendRequest = function (action, args, options) {
|
|
34
|
+
var _this = this;
|
|
35
|
+
if (options === void 0) { options = { timeout: 15000 }; }
|
|
36
|
+
// Create Request ID
|
|
37
|
+
var id = (0, helpers_1.generateUniqueId)();
|
|
38
|
+
var request = {
|
|
39
|
+
id: id,
|
|
40
|
+
action: action,
|
|
41
|
+
args: args,
|
|
42
|
+
};
|
|
43
|
+
// Create a Promise that will be resolved when the response is received
|
|
44
|
+
var promise = new Promise(function (resolve, reject) {
|
|
45
|
+
_this.requestCallbacks[id] = { resolve: resolve, reject: reject };
|
|
46
|
+
// Send the request
|
|
47
|
+
_this.notify(request);
|
|
48
|
+
// Handle request timeouts
|
|
49
|
+
if ((options === null || options === void 0 ? void 0 : options.timeout) > 0) {
|
|
50
|
+
setTimeout(function () {
|
|
51
|
+
reject(new Error("".concat(action, " timed out (id: ").concat(id, ")")));
|
|
52
|
+
delete _this.requestCallbacks[id];
|
|
53
|
+
}, options.timeout);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
return promise;
|
|
57
|
+
};
|
|
58
|
+
// Handle messages from the parent window
|
|
59
|
+
WindowMessenger.prototype.handleResponse = function (response) {
|
|
60
|
+
var _a;
|
|
61
|
+
if (!this.requestCallbacks[response.id]) {
|
|
62
|
+
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.warn("No callback found for request id: ".concat(response.id));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.requestCallbacks[response.id].resolve(response.responseData);
|
|
66
|
+
delete this.requestCallbacks[response.id];
|
|
67
|
+
};
|
|
30
68
|
WindowMessenger.prototype.setup = function (_a) {
|
|
31
69
|
var _this = this;
|
|
32
70
|
var _b = _a === void 0 ? {} : _a, logger = _b.logger, endpoint = _b.endpoint, isElementSelectable = _b.isElementSelectable;
|
|
@@ -36,50 +74,63 @@ var WindowMessenger = /** @class */ (function () {
|
|
|
36
74
|
this.endpoint = endpoint;
|
|
37
75
|
}
|
|
38
76
|
var amplitudeVisualTaggingSelectorInstance = null;
|
|
77
|
+
// Attach Event Listener to listen for messages from the parent window
|
|
39
78
|
window.addEventListener('message', function (event) {
|
|
40
|
-
var _a, _b, _c;
|
|
79
|
+
var _a, _b, _c, _d, _e;
|
|
41
80
|
(_b = (_a = _this.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, 'Message received: ', JSON.stringify(event));
|
|
81
|
+
// Only accept messages from the specified origin
|
|
42
82
|
if (_this.endpoint !== event.origin) {
|
|
43
83
|
return;
|
|
44
84
|
}
|
|
45
85
|
var eventData = event === null || event === void 0 ? void 0 : event.data;
|
|
46
86
|
var action = eventData === null || eventData === void 0 ? void 0 : eventData.action;
|
|
87
|
+
// Ignore messages without action
|
|
47
88
|
if (!action) {
|
|
48
89
|
return;
|
|
49
90
|
}
|
|
50
|
-
|
|
51
|
-
|
|
91
|
+
// If id exists, handle responses to previous requests
|
|
92
|
+
if ('id' in eventData) {
|
|
93
|
+
(_d = (_c = _this.logger) === null || _c === void 0 ? void 0 : _c.debug) === null || _d === void 0 ? void 0 : _d.call(_c, 'Received Response to previous request: ', JSON.stringify(event));
|
|
94
|
+
_this.handleResponse(eventData);
|
|
95
|
+
// If action exists, handle the action using existing handlers
|
|
52
96
|
}
|
|
53
|
-
else
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
97
|
+
else {
|
|
98
|
+
if (action === 'ping') {
|
|
99
|
+
_this.notify({ action: 'pong' });
|
|
100
|
+
}
|
|
101
|
+
else if (action === 'initialize-visual-tagging-selector') {
|
|
102
|
+
var actionData_1 = eventData === null || eventData === void 0 ? void 0 : eventData.data;
|
|
103
|
+
(0, helpers_1.asyncLoadScript)(constants_1.AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL)
|
|
104
|
+
.then(function () {
|
|
105
|
+
var _a;
|
|
106
|
+
// eslint-disable-next-line
|
|
107
|
+
amplitudeVisualTaggingSelectorInstance = (_a = window === null || window === void 0 ? void 0 : window.amplitudeVisualTaggingSelector) === null || _a === void 0 ? void 0 : _a.call(window, {
|
|
108
|
+
getEventTagProps: helpers_1.getEventTagProps,
|
|
109
|
+
isElementSelectable: function (element) {
|
|
110
|
+
if (isElementSelectable) {
|
|
111
|
+
return isElementSelectable((actionData_1 === null || actionData_1 === void 0 ? void 0 : actionData_1.actionType) || 'click', element);
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
},
|
|
115
|
+
onTrack: _this.onTrack,
|
|
116
|
+
onSelect: _this.onSelect,
|
|
117
|
+
visualHighlightClass: constants_1.AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,
|
|
118
|
+
messenger: _this,
|
|
119
|
+
});
|
|
120
|
+
_this.notify({ action: 'selector-loaded' });
|
|
121
|
+
})
|
|
122
|
+
.catch(function () {
|
|
123
|
+
var _a;
|
|
124
|
+
(_a = _this.logger) === null || _a === void 0 ? void 0 : _a.warn('Failed to initialize visual tagging selector');
|
|
70
125
|
});
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
else if (action === 'close-visual-tagging-selector') {
|
|
79
|
-
// eslint-disable-next-line
|
|
80
|
-
(_c = amplitudeVisualTaggingSelectorInstance === null || amplitudeVisualTaggingSelectorInstance === void 0 ? void 0 : amplitudeVisualTaggingSelectorInstance.close) === null || _c === void 0 ? void 0 : _c.call(amplitudeVisualTaggingSelectorInstance);
|
|
126
|
+
}
|
|
127
|
+
else if (action === 'close-visual-tagging-selector') {
|
|
128
|
+
// eslint-disable-next-line
|
|
129
|
+
(_e = amplitudeVisualTaggingSelectorInstance === null || amplitudeVisualTaggingSelectorInstance === void 0 ? void 0 : amplitudeVisualTaggingSelectorInstance.close) === null || _e === void 0 ? void 0 : _e.call(amplitudeVisualTaggingSelectorInstance);
|
|
130
|
+
}
|
|
81
131
|
}
|
|
82
132
|
});
|
|
133
|
+
// Notify the parent window that the page has loaded
|
|
83
134
|
this.notify({ action: 'page-loaded' });
|
|
84
135
|
};
|
|
85
136
|
return WindowMessenger;
|
|
@@ -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, getEventTagProps } from '../helpers';\nimport { Logger } from '@amplitude/analytics-types';\nimport { ActionType } from '../typings/autocapture';\n\nexport interface Messenger {\n logger?: Logger;\n setup: () => void;\n}\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 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\nexport class WindowMessenger implements Messenger {\n endpoint = AMPLITUDE_ORIGIN;\n logger?: Logger;\n\n constructor({ origin = AMPLITUDE_ORIGIN }: { origin?: string } = {}) {\n this.endpoint = origin;\n }\n\n private notify(message: Message<Action>) {\n this.logger?.debug?.('Message sent: ', JSON.stringify(message));\n (window.opener as WindowProxy)?.postMessage?.(message, this.endpoint);\n }\n\n setup({\n logger,\n endpoint,\n isElementSelectable,\n }: {\n logger?: Logger;\n endpoint?: string;\n isElementSelectable?: (action: InitializeVisualTaggingSelectorData['actionType'], element: Element) => boolean;\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 window.addEventListener('message', (event) => {\n this.logger?.debug?.('Message received: ', JSON.stringify(event));\n if (this.endpoint !== event.origin) {\n return;\n }\n const eventData = event?.data as Message<Action>;\n const action = eventData?.action;\n if (!action) {\n return;\n }\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 onSelect: this.onSelect,\n onTrack: this.onTrack,\n visualHighlightClass: AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\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 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":"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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 } from '@amplitude/analytics-types';\nimport { ActionType } from '../typings/autocapture';\n\nexport interface Messenger {\n logger?: Logger;\n setup: () => void;\n}\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 }: {\n logger?: Logger;\n endpoint?: string;\n isElementSelectable?: (action: InitializeVisualTaggingSelectorData['actionType'], element: Element) => boolean;\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 });\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,2 +1,14 @@
|
|
|
1
1
|
export type ActionType = 'click' | 'change';
|
|
2
|
+
export type HierarchyNode = {
|
|
3
|
+
tag: string;
|
|
4
|
+
id?: string;
|
|
5
|
+
classes?: string[];
|
|
6
|
+
attrs?: {
|
|
7
|
+
[key: string]: string;
|
|
8
|
+
};
|
|
9
|
+
index?: number;
|
|
10
|
+
indexOfType?: number;
|
|
11
|
+
prevSib?: string;
|
|
12
|
+
};
|
|
13
|
+
export type Hierarchy = (HierarchyNode | null)[];
|
|
2
14
|
//# sourceMappingURL=autocapture.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocapture.d.ts","sourceRoot":"","sources":["../../../src/typings/autocapture.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"autocapture.d.ts","sourceRoot":"","sources":["../../../src/typings/autocapture.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocapture.js","sourceRoot":"","sources":["../../../src/typings/autocapture.ts"],"names":[],"mappings":"","sourcesContent":["export type ActionType = 'click' | 'change';\n"]}
|
|
1
|
+
{"version":3,"file":"autocapture.js","sourceRoot":"","sources":["../../../src/typings/autocapture.ts"],"names":[],"mappings":"","sourcesContent":["export type ActionType = 'click' | 'change';\n\nexport type HierarchyNode = {\n tag: string;\n id?: string;\n classes?: string[];\n attrs?: { [key: string]: string };\n index?: number;\n indexOfType?: number;\n prevSib?: string;\n};\n\nexport type Hierarchy = (HierarchyNode | null)[];\n"]}
|
package/lib/cjs/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.10.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/lib/cjs/version.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAC"}
|
package/lib/cjs/version.js
CHANGED
package/lib/cjs/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;AAAa,QAAA,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;AAAa,QAAA,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["export const VERSION = '0.10.0';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAU,MAAM,4BAA4B,CAAC;AAYpG,OAAO,EAAE,SAAS,EAAmB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"autocapture-plugin.d.ts","sourceRoot":"","sources":["../../src/autocapture-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAU,MAAM,4BAA4B,CAAC;AAYpG,OAAO,EAAE,SAAS,EAAmB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGnD,KAAK,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE9E,eAAO,MAAM,8BAA8B,UAS1C,CAAC;AACF,eAAO,MAAM,6BAA6B,oBAAoB,CAAC;AAQ/D,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAEvC;;;;;;;OAOG;IACH,wBAAwB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;IAEjF;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,oBAAoB,CAAC,EAAE;QACrB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,SAAS,CAAC;KACvB,CAAC;CACH;AAED,eAAO,MAAM,iBAAiB,aAAa,kBAAkB,KAAQ,uBA2OpE,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { __assign, __awaiter, __generator } from "tslib";
|
|
|
2
2
|
import * as constants from './constants';
|
|
3
3
|
import { getText, isPageUrlAllowed, getAttributesWithPrefix, removeEmptyProperties, getNearestLabel, querySelectUniqueElements, getClosestElement, getSelector, } from './helpers';
|
|
4
4
|
import { WindowMessenger } from './libs/messenger';
|
|
5
|
+
import { getHierarchy } from './hierarchy';
|
|
5
6
|
export var DEFAULT_CSS_SELECTOR_ALLOWLIST = [
|
|
6
7
|
'a',
|
|
7
8
|
'button',
|
|
@@ -91,6 +92,7 @@ export var autocapturePlugin = function (options) {
|
|
|
91
92
|
}
|
|
92
93
|
}
|
|
93
94
|
};
|
|
95
|
+
// Returns the Amplitude event properties for the given element.
|
|
94
96
|
var getEventProperties = function (actionType, element) {
|
|
95
97
|
var _a;
|
|
96
98
|
var _b, _c;
|
|
@@ -106,6 +108,7 @@ export var autocapturePlugin = function (options) {
|
|
|
106
108
|
var properties = (_a = {},
|
|
107
109
|
_a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.id,
|
|
108
110
|
_a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.className,
|
|
111
|
+
_a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY] = getHierarchy(element),
|
|
109
112
|
_a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG] = tag,
|
|
110
113
|
_a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT] = getText(element),
|
|
111
114
|
_a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT] = rect.left == null ? null : Math.round(rect.left),
|
|
@@ -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 { BrowserClient, BrowserConfig, EnrichmentPlugin, Logger } from '@amplitude/analytics-types';\nimport * as constants from './constants';\nimport {\n getText,\n isPageUrlAllowed,\n getAttributesWithPrefix,\n removeEmptyProperties,\n getNearestLabel,\n querySelectUniqueElements,\n getClosestElement,\n getSelector,\n} from './helpers';\nimport { Messenger, WindowMessenger } from './libs/messenger';\nimport { ActionType } from './typings/autocapture';\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport const DEFAULT_CSS_SELECTOR_ALLOWLIST = [\n 'a',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'label',\n '[data-amp-default-track]',\n '.amp-default-track',\n];\nexport const DEFAULT_DATA_ATTRIBUTE_PREFIX = 'data-amp-track-';\n\ninterface EventListener {\n element: Element;\n type: ActionType;\n handler: (event: Event) => void;\n}\n\nexport interface AutocaptureOptions {\n /**\n * List of CSS selectors to allow auto tracking on.\n * When provided, allow elements matching any selector to be tracked.\n * Default is ['a', 'button', 'input', 'select', 'textarea', 'label', '[data-amp-default-track]', '.amp-default-track'].\n */\n cssSelectorAllowlist?: string[];\n\n /**\n * List of page URLs to allow auto tracking on.\n * When provided, only allow tracking on these URLs.\n * Both full URLs and regex are supported.\n */\n pageUrlAllowlist?: (string | RegExp)[];\n\n /**\n * Function to determine whether an event should be tracked.\n * When provided, this function overwrites all other allowlists and configurations.\n * If the function returns true, the event will be tracked.\n * If the function returns false, the event will not be tracked.\n * @param actionType - The type of action that triggered the event.\n * @param element - The element that triggered the event.\n */\n shouldTrackEventResolver?: (actionType: ActionType, element: Element) => boolean;\n\n /**\n * Prefix for data attributes to allow auto collecting.\n * Default is 'data-amp-track-'.\n */\n dataAttributePrefix?: string;\n\n /**\n * Options for integrating visual tagging selector.\n */\n visualTaggingOptions?: {\n enabled?: boolean;\n messenger?: Messenger;\n };\n}\n\nexport const autocapturePlugin = (options: AutocaptureOptions = {}): BrowserEnrichmentPlugin => {\n const {\n cssSelectorAllowlist = DEFAULT_CSS_SELECTOR_ALLOWLIST,\n pageUrlAllowlist,\n shouldTrackEventResolver,\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n let observer: MutationObserver | undefined;\n let eventListeners: EventListener[] = [];\n let logger: Logger | undefined = undefined;\n\n const addEventListener = (element: Element, type: ActionType, handler: (event: Event) => void) => {\n element.addEventListener(type, handler);\n eventListeners.push({\n element: element,\n type: type,\n handler: handler,\n });\n };\n\n const removeEventListeners = () => {\n eventListeners.forEach((_ref) => {\n const element = _ref.element,\n type = _ref.type,\n handler = _ref.handler;\n /* istanbul ignore next */\n element?.removeEventListener(type, handler);\n });\n eventListeners = [];\n };\n\n const shouldTrackEvent = (actionType: ActionType, element: Element) => {\n /* istanbul ignore if */\n if (!element) {\n return false;\n }\n\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n // Text nodes have no tag\n if (!tag) {\n return false;\n }\n\n if (shouldTrackEventResolver) {\n return shouldTrackEventResolver(actionType, element);\n }\n\n if (!isPageUrlAllowed(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n /* istanbul ignore next */\n const elementType = (element as HTMLInputElement)?.type || '';\n if (typeof elementType === 'string') {\n switch (elementType.toLowerCase()) {\n case 'hidden':\n return false;\n case 'password':\n return false;\n }\n }\n\n /* istanbul ignore if */\n if (cssSelectorAllowlist) {\n const hasMatchAnyAllowedSelector = cssSelectorAllowlist.some((selector) => !!element?.matches?.(selector));\n if (!hasMatchAnyAllowedSelector) {\n return false;\n }\n }\n\n switch (tag) {\n case 'input':\n case 'select':\n case 'textarea':\n return actionType === 'change' || actionType === 'click';\n default: {\n /* istanbul ignore next */\n const computedStyle = window?.getComputedStyle?.(element);\n /* istanbul ignore next */\n if (computedStyle && computedStyle.getPropertyValue('cursor') === 'pointer' && actionType === 'click') {\n return true;\n }\n return actionType === 'click';\n }\n }\n };\n\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.id,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS]: element.className,\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 setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n if (!amplitude) {\n /* istanbul ignore next */\n config?.loggerProvider?.warn(\n `${name} plugin requires a later version of @amplitude/analytics-browser. Events are not tracked.`,\n );\n return;\n }\n logger = config.loggerProvider;\n\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n const addListener = (el: Element) => {\n if (shouldTrackEvent('click', el)) {\n addEventListener(el, 'click', (event: Event) => {\n // Limit to only the innermost element that matches the selectors, avoiding all propagated event after matching.\n /* istanbul ignore next */\n if (\n event?.target != event?.currentTarget &&\n getClosestElement(event?.target as HTMLElement, cssSelectorAllowlist) != event?.currentTarget\n ) {\n return;\n }\n /* istanbul ignore next */\n amplitude?.track(constants.AMPLITUDE_ELEMENT_CLICKED_EVENT, getEventProperties('click', el));\n });\n }\n if (shouldTrackEvent('change', el)) {\n addEventListener(el, 'change', (event: Event) => {\n // Limit to only the innermost element that matches the selectors, avoiding all propagated event after matching.\n /* istanbul ignore next */\n if (\n event?.target != event?.currentTarget &&\n getClosestElement(event?.target as HTMLElement, cssSelectorAllowlist) != event?.currentTarget\n ) {\n return;\n }\n /* istanbul ignore next */\n amplitude?.track(constants.AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', el));\n });\n }\n };\n\n if (typeof MutationObserver !== 'undefined') {\n observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node: Node) => {\n addListener(node as Element);\n if ('querySelectorAll' in node && typeof node.querySelectorAll === 'function') {\n querySelectUniqueElements(node as Element, cssSelectorAllowlist).map(addListener);\n }\n });\n });\n });\n }\n const attachListeners = () => {\n const allElements = querySelectUniqueElements(document.body, cssSelectorAllowlist);\n allElements.forEach(addListener);\n /* istanbul ignore next */\n observer?.observe(document.body, {\n subtree: true,\n childList: true,\n });\n };\n if (document.body) {\n attachListeners();\n } else {\n // This is to handle the case where the plugin is loaded before the body is available.\n // E.g., for non-reactive frameworks.\n window.addEventListener('load', attachListeners);\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 /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: shouldTrackEvent,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n if (observer) {\n observer.disconnect();\n }\n removeEventListeners();\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 { BrowserClient, BrowserConfig, EnrichmentPlugin, Logger } from '@amplitude/analytics-types';\nimport * as constants from './constants';\nimport {\n getText,\n isPageUrlAllowed,\n getAttributesWithPrefix,\n removeEmptyProperties,\n getNearestLabel,\n querySelectUniqueElements,\n getClosestElement,\n getSelector,\n} from './helpers';\nimport { Messenger, WindowMessenger } from './libs/messenger';\nimport { ActionType } from './typings/autocapture';\nimport { getHierarchy } from './hierarchy';\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport const DEFAULT_CSS_SELECTOR_ALLOWLIST = [\n 'a',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'label',\n '[data-amp-default-track]',\n '.amp-default-track',\n];\nexport const DEFAULT_DATA_ATTRIBUTE_PREFIX = 'data-amp-track-';\n\ninterface EventListener {\n element: Element;\n type: ActionType;\n handler: (event: Event) => void;\n}\n\nexport interface AutocaptureOptions {\n /**\n * List of CSS selectors to allow auto tracking on.\n * When provided, allow elements matching any selector to be tracked.\n * Default is ['a', 'button', 'input', 'select', 'textarea', 'label', '[data-amp-default-track]', '.amp-default-track'].\n */\n cssSelectorAllowlist?: string[];\n\n /**\n * List of page URLs to allow auto tracking on.\n * When provided, only allow tracking on these URLs.\n * Both full URLs and regex are supported.\n */\n pageUrlAllowlist?: (string | RegExp)[];\n\n /**\n * Function to determine whether an event should be tracked.\n * When provided, this function overwrites all other allowlists and configurations.\n * If the function returns true, the event will be tracked.\n * If the function returns false, the event will not be tracked.\n * @param actionType - The type of action that triggered the event.\n * @param element - The element that triggered the event.\n */\n shouldTrackEventResolver?: (actionType: ActionType, element: Element) => boolean;\n\n /**\n * Prefix for data attributes to allow auto collecting.\n * Default is 'data-amp-track-'.\n */\n dataAttributePrefix?: string;\n\n /**\n * Options for integrating visual tagging selector.\n */\n visualTaggingOptions?: {\n enabled?: boolean;\n messenger?: Messenger;\n };\n}\n\nexport const autocapturePlugin = (options: AutocaptureOptions = {}): BrowserEnrichmentPlugin => {\n const {\n cssSelectorAllowlist = DEFAULT_CSS_SELECTOR_ALLOWLIST,\n pageUrlAllowlist,\n shouldTrackEventResolver,\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n let observer: MutationObserver | undefined;\n let eventListeners: EventListener[] = [];\n let logger: Logger | undefined = undefined;\n\n const addEventListener = (element: Element, type: ActionType, handler: (event: Event) => void) => {\n element.addEventListener(type, handler);\n eventListeners.push({\n element: element,\n type: type,\n handler: handler,\n });\n };\n\n const removeEventListeners = () => {\n eventListeners.forEach((_ref) => {\n const element = _ref.element,\n type = _ref.type,\n handler = _ref.handler;\n /* istanbul ignore next */\n element?.removeEventListener(type, handler);\n });\n eventListeners = [];\n };\n\n const shouldTrackEvent = (actionType: ActionType, element: Element) => {\n /* istanbul ignore if */\n if (!element) {\n return false;\n }\n\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n // Text nodes have no tag\n if (!tag) {\n return false;\n }\n\n if (shouldTrackEventResolver) {\n return shouldTrackEventResolver(actionType, element);\n }\n\n if (!isPageUrlAllowed(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n /* istanbul ignore next */\n const elementType = (element as HTMLInputElement)?.type || '';\n if (typeof elementType === 'string') {\n switch (elementType.toLowerCase()) {\n case 'hidden':\n return false;\n case 'password':\n return false;\n }\n }\n\n /* istanbul ignore if */\n if (cssSelectorAllowlist) {\n const hasMatchAnyAllowedSelector = cssSelectorAllowlist.some((selector) => !!element?.matches?.(selector));\n if (!hasMatchAnyAllowedSelector) {\n return false;\n }\n }\n\n switch (tag) {\n case 'input':\n case 'select':\n case 'textarea':\n return actionType === 'change' || actionType === 'click';\n default: {\n /* istanbul ignore next */\n const computedStyle = window?.getComputedStyle?.(element);\n /* istanbul ignore next */\n if (computedStyle && computedStyle.getPropertyValue('cursor') === 'pointer' && actionType === 'click') {\n return true;\n }\n return actionType === 'click';\n }\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.id,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS]: element.className,\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 setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n if (!amplitude) {\n /* istanbul ignore next */\n config?.loggerProvider?.warn(\n `${name} plugin requires a later version of @amplitude/analytics-browser. Events are not tracked.`,\n );\n return;\n }\n logger = config.loggerProvider;\n\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n const addListener = (el: Element) => {\n if (shouldTrackEvent('click', el)) {\n addEventListener(el, 'click', (event: Event) => {\n // Limit to only the innermost element that matches the selectors, avoiding all propagated event after matching.\n /* istanbul ignore next */\n if (\n event?.target != event?.currentTarget &&\n getClosestElement(event?.target as HTMLElement, cssSelectorAllowlist) != event?.currentTarget\n ) {\n return;\n }\n /* istanbul ignore next */\n amplitude?.track(constants.AMPLITUDE_ELEMENT_CLICKED_EVENT, getEventProperties('click', el));\n });\n }\n if (shouldTrackEvent('change', el)) {\n addEventListener(el, 'change', (event: Event) => {\n // Limit to only the innermost element that matches the selectors, avoiding all propagated event after matching.\n /* istanbul ignore next */\n if (\n event?.target != event?.currentTarget &&\n getClosestElement(event?.target as HTMLElement, cssSelectorAllowlist) != event?.currentTarget\n ) {\n return;\n }\n /* istanbul ignore next */\n amplitude?.track(constants.AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', el));\n });\n }\n };\n\n if (typeof MutationObserver !== 'undefined') {\n observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node: Node) => {\n addListener(node as Element);\n if ('querySelectorAll' in node && typeof node.querySelectorAll === 'function') {\n querySelectUniqueElements(node as Element, cssSelectorAllowlist).map(addListener);\n }\n });\n });\n });\n }\n const attachListeners = () => {\n const allElements = querySelectUniqueElements(document.body, cssSelectorAllowlist);\n allElements.forEach(addListener);\n /* istanbul ignore next */\n observer?.observe(document.body, {\n subtree: true,\n childList: true,\n });\n };\n if (document.body) {\n attachListeners();\n } else {\n // This is to handle the case where the plugin is loaded before the body is available.\n // E.g., for non-reactive frameworks.\n window.addEventListener('load', attachListeners);\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 /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: shouldTrackEvent,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n if (observer) {\n observer.disconnect();\n }\n removeEventListeners();\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"]}
|
package/lib/esm/constants.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_ID = "[Amplitude] Element ID";
|
|
|
5
5
|
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = "[Amplitude] Element Class";
|
|
6
6
|
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_TAG = "[Amplitude] Element Tag";
|
|
7
7
|
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_TEXT = "[Amplitude] Element Text";
|
|
8
|
+
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY = "[Amplitude] Element Hierarchy";
|
|
8
9
|
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_HREF = "[Amplitude] Element Href";
|
|
9
10
|
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = "[Amplitude] Element Position Left";
|
|
10
11
|
export declare const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = "[Amplitude] Element Position Top";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,0CAA0C,CAAC;AAEnE,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAC7E,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAE7E,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,kCAAkC,8BAA8B,CAAC;AAC9E,eAAO,MAAM,gCAAgC,4BAA4B,CAAC;AAC1E,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAC5E,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAC5E,eAAO,MAAM,0CAA0C,sCAAsC,CAAC;AAC9F,eAAO,MAAM,yCAAyC,qCAAqC,CAAC;AAC5F,eAAO,MAAM,uCAAuC,mCAAmC,CAAC;AACxF,eAAO,MAAM,uCAAuC,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,0CAA0C,CAAC;AAEnE,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAC7E,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAE7E,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,kCAAkC,8BAA8B,CAAC;AAC9E,eAAO,MAAM,gCAAgC,4BAA4B,CAAC;AAC1E,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAC5E,eAAO,MAAM,sCAAsC,kCAAkC,CAAC;AACtF,eAAO,MAAM,iCAAiC,6BAA6B,CAAC;AAC5E,eAAO,MAAM,0CAA0C,sCAAsC,CAAC;AAC9F,eAAO,MAAM,yCAAyC,qCAAqC,CAAC;AAC5F,eAAO,MAAM,uCAAuC,mCAAmC,CAAC;AACxF,eAAO,MAAM,uCAAuC,mCAAmC,CAAC;AAExF,eAAO,MAAM,qCAAqC,iCAAiC,CAAC;AAEpF,eAAO,MAAM,yCAAyC,qCAAqC,CAAC;AAC5F,eAAO,MAAM,6BAA6B,yBAAyB,CAAC;AACpE,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,oCAAoC,gCAAgC,CAAC;AAClF,eAAO,MAAM,mCAAmC,+BAA+B,CAAC;AAGhF,eAAO,MAAM,gBAAgB,8BAA8B,CAAC;AAC5D,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAClE,eAAO,MAAM,wBAAwB,qCAAqC,CAAC;AAC3E,eAAO,MAAM,qBAAqB;;;;CAIjC,CAAC;AAEF,eAAO,MAAM,4CAA4C,uEACa,CAAC;AAGvE,eAAO,MAAM,wCAAwC,0CAA0C,CAAC"}
|
package/lib/esm/constants.js
CHANGED
|
@@ -5,11 +5,13 @@ export var AMPLITUDE_EVENT_PROP_ELEMENT_ID = '[Amplitude] Element ID';
|
|
|
5
5
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = '[Amplitude] Element Class';
|
|
6
6
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_TAG = '[Amplitude] Element Tag';
|
|
7
7
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_TEXT = '[Amplitude] Element Text';
|
|
8
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY = '[Amplitude] Element Hierarchy';
|
|
8
9
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_HREF = '[Amplitude] Element Href';
|
|
9
10
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = '[Amplitude] Element Position Left';
|
|
10
11
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = '[Amplitude] Element Position Top';
|
|
11
12
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = '[Amplitude] Element Aria Label';
|
|
12
13
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = '[Amplitude] Element Attributes';
|
|
14
|
+
// Deprecated in favor of AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY. Keeping for backwards compatibility.
|
|
13
15
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR = '[Amplitude] Element Selector';
|
|
14
16
|
export var AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = '[Amplitude] Element Parent Label';
|
|
15
17
|
export var AMPLITUDE_EVENT_PROP_PAGE_URL = '[Amplitude] Page URL';
|
package/lib/esm/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,WAAW,GAAG,uCAAuC,CAAC;AAEnE,MAAM,CAAC,IAAM,+BAA+B,GAAG,6BAA6B,CAAC;AAC7E,MAAM,CAAC,IAAM,+BAA+B,GAAG,6BAA6B,CAAC;AAE7E,MAAM,CAAC,IAAM,+BAA+B,GAAG,wBAAwB,CAAC;AACxE,MAAM,CAAC,IAAM,kCAAkC,GAAG,2BAA2B,CAAC;AAC9E,MAAM,CAAC,IAAM,gCAAgC,GAAG,yBAAyB,CAAC;AAC1E,MAAM,CAAC,IAAM,iCAAiC,GAAG,0BAA0B,CAAC;AAC5E,MAAM,CAAC,IAAM,iCAAiC,GAAG,0BAA0B,CAAC;AAC5E,MAAM,CAAC,IAAM,0CAA0C,GAAG,mCAAmC,CAAC;AAC9F,MAAM,CAAC,IAAM,yCAAyC,GAAG,kCAAkC,CAAC;AAC5F,MAAM,CAAC,IAAM,uCAAuC,GAAG,gCAAgC,CAAC;AACxF,MAAM,CAAC,IAAM,uCAAuC,GAAG,gCAAgC,CAAC;AACxF,MAAM,CAAC,IAAM,qCAAqC,GAAG,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,WAAW,GAAG,uCAAuC,CAAC;AAEnE,MAAM,CAAC,IAAM,+BAA+B,GAAG,6BAA6B,CAAC;AAC7E,MAAM,CAAC,IAAM,+BAA+B,GAAG,6BAA6B,CAAC;AAE7E,MAAM,CAAC,IAAM,+BAA+B,GAAG,wBAAwB,CAAC;AACxE,MAAM,CAAC,IAAM,kCAAkC,GAAG,2BAA2B,CAAC;AAC9E,MAAM,CAAC,IAAM,gCAAgC,GAAG,yBAAyB,CAAC;AAC1E,MAAM,CAAC,IAAM,iCAAiC,GAAG,0BAA0B,CAAC;AAC5E,MAAM,CAAC,IAAM,sCAAsC,GAAG,+BAA+B,CAAC;AACtF,MAAM,CAAC,IAAM,iCAAiC,GAAG,0BAA0B,CAAC;AAC5E,MAAM,CAAC,IAAM,0CAA0C,GAAG,mCAAmC,CAAC;AAC9F,MAAM,CAAC,IAAM,yCAAyC,GAAG,kCAAkC,CAAC;AAC5F,MAAM,CAAC,IAAM,uCAAuC,GAAG,gCAAgC,CAAC;AACxF,MAAM,CAAC,IAAM,uCAAuC,GAAG,gCAAgC,CAAC;AACxF,sGAAsG;AACtG,MAAM,CAAC,IAAM,qCAAqC,GAAG,8BAA8B,CAAC;AAEpF,MAAM,CAAC,IAAM,yCAAyC,GAAG,kCAAkC,CAAC;AAC5F,MAAM,CAAC,IAAM,6BAA6B,GAAG,sBAAsB,CAAC;AACpE,MAAM,CAAC,IAAM,+BAA+B,GAAG,wBAAwB,CAAC;AACxE,MAAM,CAAC,IAAM,oCAAoC,GAAG,6BAA6B,CAAC;AAClF,MAAM,CAAC,IAAM,mCAAmC,GAAG,4BAA4B,CAAC;AAEhF,mCAAmC;AACnC,MAAM,CAAC,IAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAC5D,MAAM,CAAC,IAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAClE,MAAM,CAAC,IAAM,wBAAwB,GAAG,kCAAkC,CAAC;AAC3E,MAAM,CAAC,IAAM,qBAAqB,GAAG;IACnC,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,mBAAmB;IACvB,OAAO,EAAE,wBAAwB;CAClC,CAAC;AAEF,MAAM,CAAC,IAAM,4CAA4C,GACvD,oEAAoE,CAAC;AACvE,gGAAgG;AAChG,6CAA6C;AAC7C,MAAM,CAAC,IAAM,wCAAwC,GAAG,uCAAuC,CAAC","sourcesContent":["export const PLUGIN_NAME = '@amplitude/plugin-autocapture-browser';\n\nexport const AMPLITUDE_ELEMENT_CLICKED_EVENT = '[Amplitude] Element Clicked';\nexport const AMPLITUDE_ELEMENT_CHANGED_EVENT = '[Amplitude] Element Changed';\n\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_ID = '[Amplitude] Element ID';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = '[Amplitude] Element Class';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_TAG = '[Amplitude] Element Tag';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_TEXT = '[Amplitude] Element Text';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY = '[Amplitude] Element Hierarchy';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_HREF = '[Amplitude] Element Href';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = '[Amplitude] Element Position Left';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = '[Amplitude] Element Position Top';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = '[Amplitude] Element Aria Label';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = '[Amplitude] Element Attributes';\n// Deprecated in favor of AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY. Keeping for backwards compatibility.\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR = '[Amplitude] Element Selector';\n\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = '[Amplitude] Element Parent Label';\nexport const AMPLITUDE_EVENT_PROP_PAGE_URL = '[Amplitude] Page URL';\nexport const AMPLITUDE_EVENT_PROP_PAGE_TITLE = '[Amplitude] Page Title';\nexport const AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = '[Amplitude] Viewport Height';\nexport const AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = '[Amplitude] Viewport Width';\n\n// Visual Tagging related constants\nexport const AMPLITUDE_ORIGIN = 'https://app.amplitude.com';\nexport const AMPLITUDE_ORIGIN_EU = 'https://app.eu.amplitude.com';\nexport const AMPLITUDE_ORIGIN_STAGING = 'https://apps.stag2.amplitude.com';\nexport const AMPLITUDE_ORIGINS_MAP = {\n US: AMPLITUDE_ORIGIN,\n EU: AMPLITUDE_ORIGIN_EU,\n STAGING: AMPLITUDE_ORIGIN_STAGING,\n};\n\nexport const AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL =\n 'https://cdn.amplitude.com/libs/visual-tagging-selector-0.2.2.js.gz';\n// This is the class name used by the visual tagging selector to highlight the selected element.\n// Should not use this class in the selector.\nexport const AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = 'amp-visual-tagging-selector-highlight';\n"]}
|
package/lib/esm/helpers.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { Logger } from '@amplitude/analytics-types';
|
|
2
|
+
export type JSONValue = string | number | boolean | {
|
|
3
|
+
[x: string]: JSONValue;
|
|
4
|
+
} | Array<JSONValue>;
|
|
2
5
|
export declare const isNonSensitiveString: (text: string | null) => boolean;
|
|
3
6
|
export declare const isTextNode: (node: Node) => boolean;
|
|
4
7
|
export declare const isNonSensitiveElement: (element: Element) => boolean;
|
|
@@ -21,4 +24,5 @@ export declare const getEventTagProps: (element: Element, logger?: Logger) => {
|
|
|
21
24
|
[key: string]: unknown;
|
|
22
25
|
};
|
|
23
26
|
export declare const asyncLoadScript: (url: string) => Promise<unknown>;
|
|
27
|
+
export declare function generateUniqueId(): string;
|
|
24
28
|
//# sourceMappingURL=helpers.d.ts.map
|
package/lib/esm/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAIlG,eAAO,MAAM,oBAAoB,SAAU,MAAM,GAAG,IAAI,YAgBvD,CAAC;AAEF,eAAO,MAAM,UAAU,SAAU,IAAI,YAEpC,CAAC;AAEF,eAAO,MAAM,qBAAqB,YAAa,OAAO,YAKrD,CAAC;AAGF,eAAO,MAAM,OAAO,YAAa,OAAO,KAAG,MAsB1C,CAAC;AAEF,eAAO,MAAM,WAAW,YAAa,OAAO,WAAW,MAAM,KAAG,MA+B/D,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAS,MAAM,oBAAoB,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,SAAS,YAU9F,CAAC;AAEF,eAAO,MAAM,uBAAuB,YAAa,OAAO,UAAU,MAAM;;CAWvE,CAAC;AAEF,eAAO,MAAM,OAAO,UAAW,OAAO,YAOrC,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;CAQjC,CAAC;AAEF,eAAO,MAAM,eAAe,YAAa,OAAO,KAAG,MAYlD,CAAC;AAEF,eAAO,MAAM,yBAAyB,SAAU,OAAO,GAAG,QAAQ,aAAa,MAAM,EAAE,KAAG,OAAO,EAchG,CAAC;AAGF,eAAO,MAAM,iBAAiB,YAAa,OAAO,GAAG,IAAI,aAAa,MAAM,EAAE,KAAG,OAAO,GAAG,IAU1F,CAAC;AAGF,eAAO,MAAM,gBAAgB,YAAa,OAAO,WAAW,MAAM;;CAejE,CAAC;AAEF,eAAO,MAAM,eAAe,QAAS,MAAM,qBA2B1C,CAAC;AAEF,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
|
package/lib/esm/helpers.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-restricted-globals */
|
|
2
2
|
import { finder } from './libs/finder';
|
|
3
3
|
import * as constants from './constants';
|
|
4
|
-
var
|
|
4
|
+
var SENSITIVE_TAGS = ['input', 'select', 'textarea'];
|
|
5
5
|
export var isNonSensitiveString = function (text) {
|
|
6
6
|
if (text == null) {
|
|
7
7
|
return false;
|
|
@@ -25,7 +25,8 @@ export var isNonSensitiveElement = function (element) {
|
|
|
25
25
|
var _a, _b;
|
|
26
26
|
/* istanbul ignore next */
|
|
27
27
|
var tag = (_b = (_a = element === null || element === void 0 ? void 0 : element.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
28
|
-
|
|
28
|
+
var isContentEditable = element.getAttribute('contenteditable') === 'true';
|
|
29
|
+
return !SENSITIVE_TAGS.includes(tag) && !isContentEditable;
|
|
29
30
|
};
|
|
30
31
|
// Maybe this can be simplified with element.innerText, keep and manual concatenating for now, more research needed.
|
|
31
32
|
export var getText = function (element) {
|
|
@@ -165,6 +166,7 @@ export var getClosestElement = function (element, selectors) {
|
|
|
165
166
|
/* istanbul ignore next */
|
|
166
167
|
return getClosestElement(element === null || element === void 0 ? void 0 : element.parentElement, selectors);
|
|
167
168
|
};
|
|
169
|
+
// Returns the element properties for the given element in Visual Labeling.
|
|
168
170
|
export var getEventTagProps = function (element, logger) {
|
|
169
171
|
var _a;
|
|
170
172
|
var _b, _c;
|
|
@@ -208,4 +210,7 @@ export var asyncLoadScript = function (url) {
|
|
|
208
210
|
}
|
|
209
211
|
});
|
|
210
212
|
};
|
|
213
|
+
export function generateUniqueId() {
|
|
214
|
+
return "".concat(Date.now(), "-").concat(Math.random().toString(36).substr(2, 9));
|
|
215
|
+
}
|
|
211
216
|
//# sourceMappingURL=helpers.js.map
|
package/lib/esm/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { finder } from './libs/finder';\nimport * as constants from './constants';\nimport { Logger } from '@amplitude/analytics-types';\n\nconst SENTITIVE_TAGS = ['input', 'select', 'textarea'];\n\nexport const isNonSensitiveString = (text: string | null) => {\n if (text == null) {\n return false;\n }\n if (typeof text === 'string') {\n const ccRegex =\n /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/;\n if (ccRegex.test((text || '').replace(/[- ]/g, ''))) {\n return false;\n }\n const ssnRegex = /(^\\d{3}-?\\d{2}-?\\d{4}$)/;\n if (ssnRegex.test(text)) {\n return false;\n }\n }\n return true;\n};\n\nexport const isTextNode = (node: Node) => {\n return !!node && node.nodeType === 3;\n};\n\nexport const isNonSensitiveElement = (element: Element) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n return !SENTITIVE_TAGS.includes(tag);\n};\n\n// Maybe this can be simplified with element.innerText, keep and manual concatenating for now, more research needed.\nexport const getText = (element: Element): string => {\n let text = '';\n if (isNonSensitiveElement(element) && element.childNodes && element.childNodes.length) {\n element.childNodes.forEach((child) => {\n let childText = '';\n if (isTextNode(child)) {\n if (child.textContent) {\n childText = child.textContent;\n }\n } else {\n childText = getText(child as Element);\n }\n text += childText\n .split(/(\\s+)/)\n .filter(isNonSensitiveString)\n .join('')\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n .substring(0, 255);\n });\n }\n return text;\n};\n\nexport const getSelector = (element: Element, logger?: Logger): string => {\n let selector = '';\n try {\n selector = finder(element, {\n className: (name: string) => name !== constants.AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n });\n return selector;\n } catch (error) {\n if (logger) {\n const typedError = error as Error;\n logger.warn(`Failed to get selector with finder, use fallback strategy instead: ${typedError.toString()}`);\n }\n }\n // Fall back to use tag, id, and class name, if finder fails.\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n if (tag) {\n selector = tag;\n }\n if (element.id) {\n selector = `#${element.id}`;\n } else if (element.className) {\n const classes = element.className\n .split(' ')\n .filter((name) => name !== constants.AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS)\n .join('.');\n if (classes) {\n selector = `${selector}.${classes}`;\n }\n }\n return selector;\n};\n\nexport const isPageUrlAllowed = (url: string, pageUrlAllowlist: (string | RegExp)[] | undefined) => {\n if (!pageUrlAllowlist || !pageUrlAllowlist.length) {\n return true;\n }\n return pageUrlAllowlist.some((allowedUrl) => {\n if (typeof allowedUrl === 'string') {\n return url === allowedUrl;\n }\n return url.match(allowedUrl);\n });\n};\n\nexport const getAttributesWithPrefix = (element: Element, prefix: string): { [key: string]: string } => {\n return element.getAttributeNames().reduce((attributes: { [key: string]: string }, attributeName) => {\n if (attributeName.startsWith(prefix)) {\n const attributeKey = attributeName.replace(prefix, '');\n const attributeValue = element.getAttribute(attributeName);\n if (attributeKey) {\n attributes[attributeKey] = attributeValue || '';\n }\n }\n return attributes;\n }, {});\n};\n\nexport const isEmpty = (value: unknown) => {\n return (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n (typeof value === 'string' && value.trim().length === 0)\n );\n};\n\nexport const removeEmptyProperties = (properties: { [key: string]: unknown }) => {\n return Object.keys(properties).reduce((filteredProperties: { [key: string]: unknown }, key) => {\n const value = properties[key];\n if (!isEmpty(value)) {\n filteredProperties[key] = value;\n }\n return filteredProperties;\n }, {});\n};\n\nexport const getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n const labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n if (labelElement) {\n /* istanbul ignore next */\n const labelText = labelElement.textContent || '';\n return isNonSensitiveString(labelText) ? labelText : '';\n }\n return getNearestLabel(parent);\n};\n\nexport const querySelectUniqueElements = (root: Element | Document, selectors: string[]): Element[] => {\n if (root && 'querySelectorAll' in root && typeof root.querySelectorAll === 'function') {\n const elementSet = selectors.reduce((elements: Set<Element>, selector) => {\n if (selector) {\n const selectedElements = Array.from(root.querySelectorAll(selector));\n selectedElements.forEach((element) => {\n elements.add(element);\n });\n }\n return elements;\n }, new Set<Element>());\n return Array.from(elementSet);\n }\n return [];\n};\n\n// Similar as element.closest, but works with multiple selectors\nexport const getClosestElement = (element: Element | null, selectors: string[]): Element | null => {\n if (!element) {\n return null;\n }\n /* istanbul ignore next */\n if (selectors.some((selector) => element?.matches?.(selector))) {\n return element;\n }\n /* istanbul ignore next */\n return getClosestElement(element?.parentElement, selectors);\n};\n\nexport const getEventTagProps = (element: Element, logger?: Logger) => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n const selector = getSelector(element, logger);\n const properties: Record<string, string> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR]: selector,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties);\n};\n\nexport const asyncLoadScript = (url: string) => {\n return new Promise((resolve, reject) => {\n try {\n const scriptElement = document.createElement('script');\n scriptElement.type = 'text/javascript';\n scriptElement.async = true;\n scriptElement.src = url;\n scriptElement.addEventListener(\n 'load',\n () => {\n resolve({ status: true });\n },\n { once: true },\n );\n scriptElement.addEventListener('error', () => {\n reject({\n status: false,\n message: `Failed to load the script ${url}`,\n });\n });\n /* istanbul ignore next */\n document.head?.appendChild(scriptElement);\n } catch (error) {\n /* istanbul ignore next */\n reject(error);\n }\n });\n};\n"]}
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { finder } from './libs/finder';\nimport * as constants from './constants';\nimport { Logger } from '@amplitude/analytics-types';\n\nexport type JSONValue = string | number | boolean | { [x: string]: JSONValue } | Array<JSONValue>;\n\nconst SENSITIVE_TAGS = ['input', 'select', 'textarea'];\n\nexport const isNonSensitiveString = (text: string | null) => {\n if (text == null) {\n return false;\n }\n if (typeof text === 'string') {\n const ccRegex =\n /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/;\n if (ccRegex.test((text || '').replace(/[- ]/g, ''))) {\n return false;\n }\n const ssnRegex = /(^\\d{3}-?\\d{2}-?\\d{4}$)/;\n if (ssnRegex.test(text)) {\n return false;\n }\n }\n return true;\n};\n\nexport const isTextNode = (node: Node) => {\n return !!node && node.nodeType === 3;\n};\n\nexport const isNonSensitiveElement = (element: Element) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n const isContentEditable = element.getAttribute('contenteditable') === 'true';\n return !SENSITIVE_TAGS.includes(tag) && !isContentEditable;\n};\n\n// Maybe this can be simplified with element.innerText, keep and manual concatenating for now, more research needed.\nexport const getText = (element: Element): string => {\n let text = '';\n if (isNonSensitiveElement(element) && element.childNodes && element.childNodes.length) {\n element.childNodes.forEach((child) => {\n let childText = '';\n if (isTextNode(child)) {\n if (child.textContent) {\n childText = child.textContent;\n }\n } else {\n childText = getText(child as Element);\n }\n text += childText\n .split(/(\\s+)/)\n .filter(isNonSensitiveString)\n .join('')\n .replace(/[\\r\\n]/g, ' ')\n .replace(/[ ]+/g, ' ')\n .substring(0, 255);\n });\n }\n return text;\n};\n\nexport const getSelector = (element: Element, logger?: Logger): string => {\n let selector = '';\n try {\n selector = finder(element, {\n className: (name: string) => name !== constants.AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n });\n return selector;\n } catch (error) {\n if (logger) {\n const typedError = error as Error;\n logger.warn(`Failed to get selector with finder, use fallback strategy instead: ${typedError.toString()}`);\n }\n }\n // Fall back to use tag, id, and class name, if finder fails.\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n if (tag) {\n selector = tag;\n }\n if (element.id) {\n selector = `#${element.id}`;\n } else if (element.className) {\n const classes = element.className\n .split(' ')\n .filter((name) => name !== constants.AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS)\n .join('.');\n if (classes) {\n selector = `${selector}.${classes}`;\n }\n }\n return selector;\n};\n\nexport const isPageUrlAllowed = (url: string, pageUrlAllowlist: (string | RegExp)[] | undefined) => {\n if (!pageUrlAllowlist || !pageUrlAllowlist.length) {\n return true;\n }\n return pageUrlAllowlist.some((allowedUrl) => {\n if (typeof allowedUrl === 'string') {\n return url === allowedUrl;\n }\n return url.match(allowedUrl);\n });\n};\n\nexport const getAttributesWithPrefix = (element: Element, prefix: string): { [key: string]: string } => {\n return element.getAttributeNames().reduce((attributes: { [key: string]: string }, attributeName) => {\n if (attributeName.startsWith(prefix)) {\n const attributeKey = attributeName.replace(prefix, '');\n const attributeValue = element.getAttribute(attributeName);\n if (attributeKey) {\n attributes[attributeKey] = attributeValue || '';\n }\n }\n return attributes;\n }, {});\n};\n\nexport const isEmpty = (value: unknown) => {\n return (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n (typeof value === 'string' && value.trim().length === 0)\n );\n};\n\nexport const removeEmptyProperties = (properties: { [key: string]: unknown }) => {\n return Object.keys(properties).reduce((filteredProperties: { [key: string]: unknown }, key) => {\n const value = properties[key];\n if (!isEmpty(value)) {\n filteredProperties[key] = value;\n }\n return filteredProperties;\n }, {});\n};\n\nexport const getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n const labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n if (labelElement) {\n /* istanbul ignore next */\n const labelText = labelElement.textContent || '';\n return isNonSensitiveString(labelText) ? labelText : '';\n }\n return getNearestLabel(parent);\n};\n\nexport const querySelectUniqueElements = (root: Element | Document, selectors: string[]): Element[] => {\n if (root && 'querySelectorAll' in root && typeof root.querySelectorAll === 'function') {\n const elementSet = selectors.reduce((elements: Set<Element>, selector) => {\n if (selector) {\n const selectedElements = Array.from(root.querySelectorAll(selector));\n selectedElements.forEach((element) => {\n elements.add(element);\n });\n }\n return elements;\n }, new Set<Element>());\n return Array.from(elementSet);\n }\n return [];\n};\n\n// Similar as element.closest, but works with multiple selectors\nexport const getClosestElement = (element: Element | null, selectors: string[]): Element | null => {\n if (!element) {\n return null;\n }\n /* istanbul ignore next */\n if (selectors.some((selector) => element?.matches?.(selector))) {\n return element;\n }\n /* istanbul ignore next */\n return getClosestElement(element?.parentElement, selectors);\n};\n\n// Returns the element properties for the given element in Visual Labeling.\nexport const getEventTagProps = (element: Element, logger?: Logger) => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n const selector = getSelector(element, logger);\n\n const properties: Record<string, JSONValue> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR]: selector,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties);\n};\n\nexport const asyncLoadScript = (url: string) => {\n return new Promise((resolve, reject) => {\n try {\n const scriptElement = document.createElement('script');\n scriptElement.type = 'text/javascript';\n scriptElement.async = true;\n scriptElement.src = url;\n scriptElement.addEventListener(\n 'load',\n () => {\n resolve({ status: true });\n },\n { once: true },\n );\n scriptElement.addEventListener('error', () => {\n reject({\n status: false,\n message: `Failed to load the script ${url}`,\n });\n });\n /* istanbul ignore next */\n document.head?.appendChild(scriptElement);\n } catch (error) {\n /* istanbul ignore next */\n reject(error);\n }\n });\n};\n\nexport function generateUniqueId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Hierarchy, HierarchyNode } from './typings/autocapture';
|
|
2
|
+
export declare function getElementProperties(element: Element | null): HierarchyNode | null;
|
|
3
|
+
export declare function getAncestors(targetEl: Element | null): Element[];
|
|
4
|
+
export declare const getHierarchy: (element: Element | null) => Hierarchy;
|
|
5
|
+
//# sourceMappingURL=hierarchy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchy.d.ts","sourceRoot":"","sources":["../../src/hierarchy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAoCjE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,aAAa,GAAG,IAAI,CAsDlF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,EAAE,CAehE;AAGD,eAAO,MAAM,YAAY,YAAa,OAAO,GAAG,IAAI,cAuBnD,CAAC"}
|