@amplitude/plugin-autocapture-browser 0.9.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/LICENSE +21 -0
- package/README.md +83 -0
- package/lib/cjs/autocapture-plugin.d.ts +44 -0
- package/lib/cjs/autocapture-plugin.d.ts.map +1 -0
- package/lib/cjs/autocapture-plugin.js +232 -0
- package/lib/cjs/autocapture-plugin.js.map +1 -0
- package/lib/cjs/constants.d.ts +29 -0
- package/lib/cjs/constants.d.ts.map +1 -0
- package/lib/cjs/constants.js +34 -0
- package/lib/cjs/constants.js.map +1 -0
- package/lib/cjs/helpers.d.ts +24 -0
- package/lib/cjs/helpers.d.ts.map +1 -0
- package/lib/cjs/helpers.js +228 -0
- package/lib/cjs/helpers.js.map +1 -0
- package/lib/cjs/index.d.ts +3 -0
- package/lib/cjs/index.d.ts.map +1 -0
- package/lib/cjs/index.js +10 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/libs/finder.d.ts +13 -0
- package/lib/cjs/libs/finder.d.ts.map +1 -0
- package/lib/cjs/libs/finder.js +345 -0
- package/lib/cjs/libs/finder.js.map +1 -0
- package/lib/cjs/libs/messenger.d.ts +57 -0
- package/lib/cjs/libs/messenger.d.ts.map +1 -0
- package/lib/cjs/libs/messenger.js +88 -0
- package/lib/cjs/libs/messenger.js.map +1 -0
- package/lib/cjs/typings/autocapture.d.ts +2 -0
- package/lib/cjs/typings/autocapture.d.ts.map +1 -0
- package/lib/cjs/typings/autocapture.js +2 -0
- package/lib/cjs/typings/autocapture.js.map +1 -0
- package/lib/cjs/version.d.ts +2 -0
- package/lib/cjs/version.d.ts.map +1 -0
- package/lib/cjs/version.js +4 -0
- package/lib/cjs/version.js.map +1 -0
- package/lib/esm/autocapture-plugin.d.ts +44 -0
- package/lib/esm/autocapture-plugin.d.ts.map +1 -0
- package/lib/esm/autocapture-plugin.js +228 -0
- package/lib/esm/autocapture-plugin.js.map +1 -0
- package/lib/esm/constants.d.ts +29 -0
- package/lib/esm/constants.d.ts.map +1 -0
- package/lib/esm/constants.js +32 -0
- package/lib/esm/constants.js.map +1 -0
- package/lib/esm/helpers.d.ts +24 -0
- package/lib/esm/helpers.d.ts.map +1 -0
- package/lib/esm/helpers.js +211 -0
- package/lib/esm/helpers.js.map +1 -0
- package/lib/esm/index.d.ts +3 -0
- package/lib/esm/index.d.ts.map +1 -0
- package/lib/esm/index.js +3 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/libs/finder.d.ts +13 -0
- package/lib/esm/libs/finder.d.ts.map +1 -0
- package/lib/esm/libs/finder.js +342 -0
- package/lib/esm/libs/finder.js.map +1 -0
- package/lib/esm/libs/messenger.d.ts +57 -0
- package/lib/esm/libs/messenger.d.ts.map +1 -0
- package/lib/esm/libs/messenger.js +86 -0
- package/lib/esm/libs/messenger.js.map +1 -0
- package/lib/esm/typings/autocapture.d.ts +2 -0
- package/lib/esm/typings/autocapture.d.ts.map +1 -0
- package/lib/esm/typings/autocapture.js +2 -0
- package/lib/esm/typings/autocapture.js.map +1 -0
- package/lib/esm/version.d.ts +2 -0
- package/lib/esm/version.d.ts.map +1 -0
- package/lib/esm/version.js +2 -0
- package/lib/esm/version.js.map +1 -0
- package/lib/scripts/amplitude-min.js +1 -0
- package/lib/scripts/amplitude-min.js.gz +0 -0
- package/lib/scripts/amplitude-min.umd.js +1 -0
- package/lib/scripts/amplitude-min.umd.js.gz +0 -0
- package/lib/scripts/autocapture-plugin.d.ts +44 -0
- package/lib/scripts/autocapture-plugin.d.ts.map +1 -0
- package/lib/scripts/constants.d.ts +29 -0
- package/lib/scripts/constants.d.ts.map +1 -0
- package/lib/scripts/helpers.d.ts +24 -0
- package/lib/scripts/helpers.d.ts.map +1 -0
- package/lib/scripts/index.d.ts +3 -0
- package/lib/scripts/index.d.ts.map +1 -0
- package/lib/scripts/libs/finder.d.ts +13 -0
- package/lib/scripts/libs/finder.d.ts.map +1 -0
- package/lib/scripts/libs/messenger.d.ts +57 -0
- package/lib/scripts/libs/messenger.d.ts.map +1 -0
- package/lib/scripts/typings/autocapture.d.ts +2 -0
- package/lib/scripts/typings/autocapture.d.ts.map +1 -0
- package/lib/scripts/version.d.ts +2 -0
- package/lib/scripts/version.d.ts.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export var PLUGIN_NAME = '@amplitude/plugin-autocapture-browser';
|
|
2
|
+
export var AMPLITUDE_ELEMENT_CLICKED_EVENT = '[Amplitude] Element Clicked';
|
|
3
|
+
export var AMPLITUDE_ELEMENT_CHANGED_EVENT = '[Amplitude] Element Changed';
|
|
4
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_ID = '[Amplitude] Element ID';
|
|
5
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = '[Amplitude] Element Class';
|
|
6
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_TAG = '[Amplitude] Element Tag';
|
|
7
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_TEXT = '[Amplitude] Element Text';
|
|
8
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_HREF = '[Amplitude] Element Href';
|
|
9
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = '[Amplitude] Element Position Left';
|
|
10
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = '[Amplitude] Element Position Top';
|
|
11
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = '[Amplitude] Element Aria Label';
|
|
12
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = '[Amplitude] Element Attributes';
|
|
13
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR = '[Amplitude] Element Selector';
|
|
14
|
+
export var AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = '[Amplitude] Element Parent Label';
|
|
15
|
+
export var AMPLITUDE_EVENT_PROP_PAGE_URL = '[Amplitude] Page URL';
|
|
16
|
+
export var AMPLITUDE_EVENT_PROP_PAGE_TITLE = '[Amplitude] Page Title';
|
|
17
|
+
export var AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = '[Amplitude] Viewport Height';
|
|
18
|
+
export var AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = '[Amplitude] Viewport Width';
|
|
19
|
+
// Visual Tagging related constants
|
|
20
|
+
export var AMPLITUDE_ORIGIN = 'https://app.amplitude.com';
|
|
21
|
+
export var AMPLITUDE_ORIGIN_EU = 'https://app.eu.amplitude.com';
|
|
22
|
+
export var AMPLITUDE_ORIGIN_STAGING = 'https://apps.stag2.amplitude.com';
|
|
23
|
+
export var AMPLITUDE_ORIGINS_MAP = {
|
|
24
|
+
US: AMPLITUDE_ORIGIN,
|
|
25
|
+
EU: AMPLITUDE_ORIGIN_EU,
|
|
26
|
+
STAGING: AMPLITUDE_ORIGIN_STAGING,
|
|
27
|
+
};
|
|
28
|
+
export var AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL = 'https://cdn.amplitude.com/libs/visual-tagging-selector-0.2.2.js.gz';
|
|
29
|
+
// This is the class name used by the visual tagging selector to highlight the selected element.
|
|
30
|
+
// Should not use this class in the selector.
|
|
31
|
+
export var AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = 'amp-visual-tagging-selector-highlight';
|
|
32
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +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;AACpF,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_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';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR = '[Amplitude] Element Selector';\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"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Logger } from '@amplitude/analytics-types';
|
|
2
|
+
export declare const isNonSensitiveString: (text: string | null) => boolean;
|
|
3
|
+
export declare const isTextNode: (node: Node) => boolean;
|
|
4
|
+
export declare const isNonSensitiveElement: (element: Element) => boolean;
|
|
5
|
+
export declare const getText: (element: Element) => string;
|
|
6
|
+
export declare const getSelector: (element: Element, logger?: Logger) => string;
|
|
7
|
+
export declare const isPageUrlAllowed: (url: string, pageUrlAllowlist: (string | RegExp)[] | undefined) => boolean;
|
|
8
|
+
export declare const getAttributesWithPrefix: (element: Element, prefix: string) => {
|
|
9
|
+
[key: string]: string;
|
|
10
|
+
};
|
|
11
|
+
export declare const isEmpty: (value: unknown) => boolean;
|
|
12
|
+
export declare const removeEmptyProperties: (properties: {
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}) => {
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
};
|
|
17
|
+
export declare const getNearestLabel: (element: Element) => string;
|
|
18
|
+
export declare const querySelectUniqueElements: (root: Element | Document, selectors: string[]) => Element[];
|
|
19
|
+
export declare const getClosestElement: (element: Element | null, selectors: string[]) => Element | null;
|
|
20
|
+
export declare const getEventTagProps: (element: Element, logger?: Logger) => {
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
};
|
|
23
|
+
export declare const asyncLoadScript: (url: string) => Promise<unknown>;
|
|
24
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAIpD,eAAO,MAAM,oBAAoB,SAAU,MAAM,GAAG,IAAI,YAgBvD,CAAC;AAEF,eAAO,MAAM,UAAU,SAAU,IAAI,YAEpC,CAAC;AAEF,eAAO,MAAM,qBAAqB,YAAa,OAAO,YAIrD,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;AAEF,eAAO,MAAM,gBAAgB,YAAa,OAAO,WAAW,MAAM;;CAcjE,CAAC;AAEF,eAAO,MAAM,eAAe,QAAS,MAAM,qBA2B1C,CAAC"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-globals */
|
|
2
|
+
import { finder } from './libs/finder';
|
|
3
|
+
import * as constants from './constants';
|
|
4
|
+
var SENTITIVE_TAGS = ['input', 'select', 'textarea'];
|
|
5
|
+
export var isNonSensitiveString = function (text) {
|
|
6
|
+
if (text == null) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
if (typeof text === 'string') {
|
|
10
|
+
var ccRegex = /^(?:(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}))$/;
|
|
11
|
+
if (ccRegex.test((text || '').replace(/[- ]/g, ''))) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
var ssnRegex = /(^\d{3}-?\d{2}-?\d{4}$)/;
|
|
15
|
+
if (ssnRegex.test(text)) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
};
|
|
21
|
+
export var isTextNode = function (node) {
|
|
22
|
+
return !!node && node.nodeType === 3;
|
|
23
|
+
};
|
|
24
|
+
export var isNonSensitiveElement = function (element) {
|
|
25
|
+
var _a, _b;
|
|
26
|
+
/* istanbul ignore next */
|
|
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
|
+
return !SENTITIVE_TAGS.includes(tag);
|
|
29
|
+
};
|
|
30
|
+
// Maybe this can be simplified with element.innerText, keep and manual concatenating for now, more research needed.
|
|
31
|
+
export var getText = function (element) {
|
|
32
|
+
var text = '';
|
|
33
|
+
if (isNonSensitiveElement(element) && element.childNodes && element.childNodes.length) {
|
|
34
|
+
element.childNodes.forEach(function (child) {
|
|
35
|
+
var childText = '';
|
|
36
|
+
if (isTextNode(child)) {
|
|
37
|
+
if (child.textContent) {
|
|
38
|
+
childText = child.textContent;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
childText = getText(child);
|
|
43
|
+
}
|
|
44
|
+
text += childText
|
|
45
|
+
.split(/(\s+)/)
|
|
46
|
+
.filter(isNonSensitiveString)
|
|
47
|
+
.join('')
|
|
48
|
+
.replace(/[\r\n]/g, ' ')
|
|
49
|
+
.replace(/[ ]+/g, ' ')
|
|
50
|
+
.substring(0, 255);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return text;
|
|
54
|
+
};
|
|
55
|
+
export var getSelector = function (element, logger) {
|
|
56
|
+
var _a, _b;
|
|
57
|
+
var selector = '';
|
|
58
|
+
try {
|
|
59
|
+
selector = finder(element, {
|
|
60
|
+
className: function (name) { return name !== constants.AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS; },
|
|
61
|
+
});
|
|
62
|
+
return selector;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (logger) {
|
|
66
|
+
var typedError = error;
|
|
67
|
+
logger.warn("Failed to get selector with finder, use fallback strategy instead: ".concat(typedError.toString()));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Fall back to use tag, id, and class name, if finder fails.
|
|
71
|
+
/* istanbul ignore next */
|
|
72
|
+
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);
|
|
73
|
+
if (tag) {
|
|
74
|
+
selector = tag;
|
|
75
|
+
}
|
|
76
|
+
if (element.id) {
|
|
77
|
+
selector = "#".concat(element.id);
|
|
78
|
+
}
|
|
79
|
+
else if (element.className) {
|
|
80
|
+
var classes = element.className
|
|
81
|
+
.split(' ')
|
|
82
|
+
.filter(function (name) { return name !== constants.AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS; })
|
|
83
|
+
.join('.');
|
|
84
|
+
if (classes) {
|
|
85
|
+
selector = "".concat(selector, ".").concat(classes);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return selector;
|
|
89
|
+
};
|
|
90
|
+
export var isPageUrlAllowed = function (url, pageUrlAllowlist) {
|
|
91
|
+
if (!pageUrlAllowlist || !pageUrlAllowlist.length) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
return pageUrlAllowlist.some(function (allowedUrl) {
|
|
95
|
+
if (typeof allowedUrl === 'string') {
|
|
96
|
+
return url === allowedUrl;
|
|
97
|
+
}
|
|
98
|
+
return url.match(allowedUrl);
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
export var getAttributesWithPrefix = function (element, prefix) {
|
|
102
|
+
return element.getAttributeNames().reduce(function (attributes, attributeName) {
|
|
103
|
+
if (attributeName.startsWith(prefix)) {
|
|
104
|
+
var attributeKey = attributeName.replace(prefix, '');
|
|
105
|
+
var attributeValue = element.getAttribute(attributeName);
|
|
106
|
+
if (attributeKey) {
|
|
107
|
+
attributes[attributeKey] = attributeValue || '';
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return attributes;
|
|
111
|
+
}, {});
|
|
112
|
+
};
|
|
113
|
+
export var isEmpty = function (value) {
|
|
114
|
+
return (value === undefined ||
|
|
115
|
+
value === null ||
|
|
116
|
+
(typeof value === 'object' && Object.keys(value).length === 0) ||
|
|
117
|
+
(typeof value === 'string' && value.trim().length === 0));
|
|
118
|
+
};
|
|
119
|
+
export var removeEmptyProperties = function (properties) {
|
|
120
|
+
return Object.keys(properties).reduce(function (filteredProperties, key) {
|
|
121
|
+
var value = properties[key];
|
|
122
|
+
if (!isEmpty(value)) {
|
|
123
|
+
filteredProperties[key] = value;
|
|
124
|
+
}
|
|
125
|
+
return filteredProperties;
|
|
126
|
+
}, {});
|
|
127
|
+
};
|
|
128
|
+
export var getNearestLabel = function (element) {
|
|
129
|
+
var parent = element.parentElement;
|
|
130
|
+
if (!parent) {
|
|
131
|
+
return '';
|
|
132
|
+
}
|
|
133
|
+
var labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');
|
|
134
|
+
if (labelElement) {
|
|
135
|
+
/* istanbul ignore next */
|
|
136
|
+
var labelText = labelElement.textContent || '';
|
|
137
|
+
return isNonSensitiveString(labelText) ? labelText : '';
|
|
138
|
+
}
|
|
139
|
+
return getNearestLabel(parent);
|
|
140
|
+
};
|
|
141
|
+
export var querySelectUniqueElements = function (root, selectors) {
|
|
142
|
+
if (root && 'querySelectorAll' in root && typeof root.querySelectorAll === 'function') {
|
|
143
|
+
var elementSet = selectors.reduce(function (elements, selector) {
|
|
144
|
+
if (selector) {
|
|
145
|
+
var selectedElements = Array.from(root.querySelectorAll(selector));
|
|
146
|
+
selectedElements.forEach(function (element) {
|
|
147
|
+
elements.add(element);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return elements;
|
|
151
|
+
}, new Set());
|
|
152
|
+
return Array.from(elementSet);
|
|
153
|
+
}
|
|
154
|
+
return [];
|
|
155
|
+
};
|
|
156
|
+
// Similar as element.closest, but works with multiple selectors
|
|
157
|
+
export var getClosestElement = function (element, selectors) {
|
|
158
|
+
if (!element) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
/* istanbul ignore next */
|
|
162
|
+
if (selectors.some(function (selector) { var _a; return (_a = element === null || element === void 0 ? void 0 : element.matches) === null || _a === void 0 ? void 0 : _a.call(element, selector); })) {
|
|
163
|
+
return element;
|
|
164
|
+
}
|
|
165
|
+
/* istanbul ignore next */
|
|
166
|
+
return getClosestElement(element === null || element === void 0 ? void 0 : element.parentElement, selectors);
|
|
167
|
+
};
|
|
168
|
+
export var getEventTagProps = function (element, logger) {
|
|
169
|
+
var _a;
|
|
170
|
+
var _b, _c;
|
|
171
|
+
if (!element) {
|
|
172
|
+
return {};
|
|
173
|
+
}
|
|
174
|
+
/* istanbul ignore next */
|
|
175
|
+
var tag = (_c = (_b = element === null || element === void 0 ? void 0 : element.tagName) === null || _b === void 0 ? void 0 : _b.toLowerCase) === null || _c === void 0 ? void 0 : _c.call(_b);
|
|
176
|
+
var selector = getSelector(element, logger);
|
|
177
|
+
var properties = (_a = {},
|
|
178
|
+
_a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG] = tag,
|
|
179
|
+
_a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT] = getText(element),
|
|
180
|
+
_a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR] = selector,
|
|
181
|
+
_a[constants.AMPLITUDE_EVENT_PROP_PAGE_URL] = window.location.href.split('?')[0],
|
|
182
|
+
_a);
|
|
183
|
+
return removeEmptyProperties(properties);
|
|
184
|
+
};
|
|
185
|
+
export var asyncLoadScript = function (url) {
|
|
186
|
+
return new Promise(function (resolve, reject) {
|
|
187
|
+
var _a;
|
|
188
|
+
try {
|
|
189
|
+
var scriptElement = document.createElement('script');
|
|
190
|
+
scriptElement.type = 'text/javascript';
|
|
191
|
+
scriptElement.async = true;
|
|
192
|
+
scriptElement.src = url;
|
|
193
|
+
scriptElement.addEventListener('load', function () {
|
|
194
|
+
resolve({ status: true });
|
|
195
|
+
}, { once: true });
|
|
196
|
+
scriptElement.addEventListener('error', function () {
|
|
197
|
+
reject({
|
|
198
|
+
status: false,
|
|
199
|
+
message: "Failed to load the script ".concat(url),
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
/* istanbul ignore next */
|
|
203
|
+
(_a = document.head) === null || _a === void 0 ? void 0 : _a.appendChild(scriptElement);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
/* istanbul ignore next */
|
|
207
|
+
reject(error);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
};
|
|
211
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AAGzC,IAAM,cAAc,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAEvD,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAAC,IAAmB;IACtD,IAAI,IAAI,IAAI,IAAI,EAAE;QAChB,OAAO,KAAK,CAAC;KACd;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,IAAM,OAAO,GACX,uKAAuK,CAAC;QAC1K,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE;YACnD,OAAO,KAAK,CAAC;SACd;QACD,IAAM,QAAQ,GAAG,yBAAyB,CAAC;QAC3C,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACvB,OAAO,KAAK,CAAC;SACd;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,UAAU,GAAG,UAAC,IAAU;IACnC,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,qBAAqB,GAAG,UAAC,OAAgB;;IACpD,0BAA0B;IAC1B,IAAM,GAAG,GAAG,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,0CAAE,WAAW,kDAAI,CAAC;IAC9C,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,oHAAoH;AACpH,MAAM,CAAC,IAAM,OAAO,GAAG,UAAC,OAAgB;IACtC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,qBAAqB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE;QACrF,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAC,KAAK;YAC/B,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;gBACrB,IAAI,KAAK,CAAC,WAAW,EAAE;oBACrB,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC;iBAC/B;aACF;iBAAM;gBACL,SAAS,GAAG,OAAO,CAAC,KAAgB,CAAC,CAAC;aACvC;YACD,IAAI,IAAI,SAAS;iBACd,KAAK,CAAC,OAAO,CAAC;iBACd,MAAM,CAAC,oBAAoB,CAAC;iBAC5B,IAAI,CAAC,EAAE,CAAC;iBACR,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;iBACvB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;iBACrB,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;KACJ;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,WAAW,GAAG,UAAC,OAAgB,EAAE,MAAe;;IAC3D,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI;QACF,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE;YACzB,SAAS,EAAE,UAAC,IAAY,IAAK,OAAA,IAAI,KAAK,SAAS,CAAC,wCAAwC,EAA3D,CAA2D;SACzF,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;KACjB;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,MAAM,EAAE;YACV,IAAM,UAAU,GAAG,KAAc,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,6EAAsE,UAAU,CAAC,QAAQ,EAAE,CAAE,CAAC,CAAC;SAC5G;KACF;IACD,6DAA6D;IAC7D,0BAA0B;IAC1B,IAAM,GAAG,GAAG,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,0CAAE,WAAW,kDAAI,CAAC;IAC9C,IAAI,GAAG,EAAE;QACP,QAAQ,GAAG,GAAG,CAAC;KAChB;IACD,IAAI,OAAO,CAAC,EAAE,EAAE;QACd,QAAQ,GAAG,WAAI,OAAO,CAAC,EAAE,CAAE,CAAC;KAC7B;SAAM,IAAI,OAAO,CAAC,SAAS,EAAE;QAC5B,IAAM,OAAO,GAAG,OAAO,CAAC,SAAS;aAC9B,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,KAAK,SAAS,CAAC,wCAAwC,EAA3D,CAA2D,CAAC;aAC7E,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,IAAI,OAAO,EAAE;YACX,QAAQ,GAAG,UAAG,QAAQ,cAAI,OAAO,CAAE,CAAC;SACrC;KACF;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,gBAAgB,GAAG,UAAC,GAAW,EAAE,gBAAiD;IAC7F,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE;QACjD,OAAO,IAAI,CAAC;KACb;IACD,OAAO,gBAAgB,CAAC,IAAI,CAAC,UAAC,UAAU;QACtC,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YAClC,OAAO,GAAG,KAAK,UAAU,CAAC;SAC3B;QACD,OAAO,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,uBAAuB,GAAG,UAAC,OAAgB,EAAE,MAAc;IACtE,OAAO,OAAO,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,UAAC,UAAqC,EAAE,aAAa;QAC7F,IAAI,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YACpC,IAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvD,IAAM,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAC3D,IAAI,YAAY,EAAE;gBAChB,UAAU,CAAC,YAAY,CAAC,GAAG,cAAc,IAAI,EAAE,CAAC;aACjD;SACF;QACD,OAAO,UAAU,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,OAAO,GAAG,UAAC,KAAc;IACpC,OAAO,CACL,KAAK,KAAK,SAAS;QACnB,KAAK,KAAK,IAAI;QACd,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAC9D,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CACzD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,qBAAqB,GAAG,UAAC,UAAsC;IAC1E,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,UAAC,kBAA8C,EAAE,GAAG;QACxF,IAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACnB,kBAAkB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;SACjC;QACD,OAAO,kBAAkB,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,eAAe,GAAG,UAAC,OAAgB;IAC9C,IAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IACrC,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,EAAE,CAAC;KACX;IACD,IAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC;IAC3E,IAAI,YAAY,EAAE;QAChB,0BAA0B;QAC1B,IAAM,SAAS,GAAG,YAAY,CAAC,WAAW,IAAI,EAAE,CAAC;QACjD,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD;IACD,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,yBAAyB,GAAG,UAAC,IAAwB,EAAE,SAAmB;IACrF,IAAI,IAAI,IAAI,kBAAkB,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,gBAAgB,KAAK,UAAU,EAAE;QACrF,IAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,UAAC,QAAsB,EAAE,QAAQ;YACnE,IAAI,QAAQ,EAAE;gBACZ,IAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACrE,gBAAgB,CAAC,OAAO,CAAC,UAAC,OAAO;oBAC/B,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC,CAAC,CAAC;aACJ;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC,EAAE,IAAI,GAAG,EAAW,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KAC/B;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,IAAM,iBAAiB,GAAG,UAAC,OAAuB,EAAE,SAAmB;IAC5E,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,IAAI,CAAC;KACb;IACD,0BAA0B;IAC1B,IAAI,SAAS,CAAC,IAAI,CAAC,UAAC,QAAQ,YAAK,OAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,wDAAG,QAAQ,CAAC,CAAA,EAAA,CAAC,EAAE;QAC9D,OAAO,OAAO,CAAC;KAChB;IACD,0BAA0B;IAC1B,OAAO,iBAAiB,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,EAAE,SAAS,CAAC,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,gBAAgB,GAAG,UAAC,OAAgB,EAAE,MAAe;;;IAChE,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,EAAE,CAAC;KACX;IACD,0BAA0B;IAC1B,IAAM,GAAG,GAAG,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,0CAAE,WAAW,kDAAI,CAAC;IAC9C,IAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,IAAM,UAAU;QACd,GAAC,SAAS,CAAC,gCAAgC,IAAG,GAAG;QACjD,GAAC,SAAS,CAAC,iCAAiC,IAAG,OAAO,CAAC,OAAO,CAAC;QAC/D,GAAC,SAAS,CAAC,qCAAqC,IAAG,QAAQ;QAC3D,GAAC,SAAS,CAAC,6BAA6B,IAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;WAC9E,CAAC;IACF,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,eAAe,GAAG,UAAC,GAAW;IACzC,OAAO,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,MAAM;;QACjC,IAAI;YACF,IAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACvD,aAAa,CAAC,IAAI,GAAG,iBAAiB,CAAC;YACvC,aAAa,CAAC,KAAK,GAAG,IAAI,CAAC;YAC3B,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,aAAa,CAAC,gBAAgB,CAC5B,MAAM,EACN;gBACE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5B,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;YACF,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE;gBACtC,MAAM,CAAC;oBACL,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE,oCAA6B,GAAG,CAAE;iBAC5C,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,0BAA0B;YAC1B,MAAA,QAAQ,CAAC,IAAI,0CAAE,WAAW,CAAC,aAAa,CAAC,CAAC;SAC3C;QAAC,OAAO,KAAK,EAAE;YACd,0BAA0B;YAC1B,MAAM,CAAC,KAAK,CAAC,CAAC;SACf;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","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"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { autocapturePlugin as plugin, autocapturePlugin, DEFAULT_CSS_SELECTOR_ALLOWLIST, DEFAULT_DATA_ATTRIBUTE_PREFIX, } from './autocapture-plugin';
|
|
2
|
+
export { Messenger, Action, ActionData, Message, WindowMessenger } from './libs/messenger';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,IAAI,MAAM,EAC3B,iBAAiB,EACjB,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
package/lib/esm/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,IAAI,MAAM,EAC3B,iBAAiB,EACjB,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAA0C,eAAe,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export {\n autocapturePlugin as plugin,\n autocapturePlugin,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n} from './autocapture-plugin';\nexport { Messenger, Action, ActionData, Message, WindowMessenger } from './libs/messenger';\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type Options = {
|
|
2
|
+
root: Element;
|
|
3
|
+
idName: (name: string) => boolean;
|
|
4
|
+
className: (name: string) => boolean;
|
|
5
|
+
tagName: (name: string) => boolean;
|
|
6
|
+
attr: (name: string, value: string) => boolean;
|
|
7
|
+
seedMinLength: number;
|
|
8
|
+
optimizedMinLength: number;
|
|
9
|
+
threshold: number;
|
|
10
|
+
maxNumberOfTries: number;
|
|
11
|
+
};
|
|
12
|
+
export declare function finder(input: Element, options?: Partial<Options>): string;
|
|
13
|
+
//# sourceMappingURL=finder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finder.d.ts","sourceRoot":"","sources":["../../../src/libs/finder.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACrC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAKF,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,UAmChE"}
|