@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.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/lib/cjs/autocapture-plugin.d.ts +44 -0
  4. package/lib/cjs/autocapture-plugin.d.ts.map +1 -0
  5. package/lib/cjs/autocapture-plugin.js +232 -0
  6. package/lib/cjs/autocapture-plugin.js.map +1 -0
  7. package/lib/cjs/constants.d.ts +29 -0
  8. package/lib/cjs/constants.d.ts.map +1 -0
  9. package/lib/cjs/constants.js +34 -0
  10. package/lib/cjs/constants.js.map +1 -0
  11. package/lib/cjs/helpers.d.ts +24 -0
  12. package/lib/cjs/helpers.d.ts.map +1 -0
  13. package/lib/cjs/helpers.js +228 -0
  14. package/lib/cjs/helpers.js.map +1 -0
  15. package/lib/cjs/index.d.ts +3 -0
  16. package/lib/cjs/index.d.ts.map +1 -0
  17. package/lib/cjs/index.js +10 -0
  18. package/lib/cjs/index.js.map +1 -0
  19. package/lib/cjs/libs/finder.d.ts +13 -0
  20. package/lib/cjs/libs/finder.d.ts.map +1 -0
  21. package/lib/cjs/libs/finder.js +345 -0
  22. package/lib/cjs/libs/finder.js.map +1 -0
  23. package/lib/cjs/libs/messenger.d.ts +57 -0
  24. package/lib/cjs/libs/messenger.d.ts.map +1 -0
  25. package/lib/cjs/libs/messenger.js +88 -0
  26. package/lib/cjs/libs/messenger.js.map +1 -0
  27. package/lib/cjs/typings/autocapture.d.ts +2 -0
  28. package/lib/cjs/typings/autocapture.d.ts.map +1 -0
  29. package/lib/cjs/typings/autocapture.js +2 -0
  30. package/lib/cjs/typings/autocapture.js.map +1 -0
  31. package/lib/cjs/version.d.ts +2 -0
  32. package/lib/cjs/version.d.ts.map +1 -0
  33. package/lib/cjs/version.js +4 -0
  34. package/lib/cjs/version.js.map +1 -0
  35. package/lib/esm/autocapture-plugin.d.ts +44 -0
  36. package/lib/esm/autocapture-plugin.d.ts.map +1 -0
  37. package/lib/esm/autocapture-plugin.js +228 -0
  38. package/lib/esm/autocapture-plugin.js.map +1 -0
  39. package/lib/esm/constants.d.ts +29 -0
  40. package/lib/esm/constants.d.ts.map +1 -0
  41. package/lib/esm/constants.js +32 -0
  42. package/lib/esm/constants.js.map +1 -0
  43. package/lib/esm/helpers.d.ts +24 -0
  44. package/lib/esm/helpers.d.ts.map +1 -0
  45. package/lib/esm/helpers.js +211 -0
  46. package/lib/esm/helpers.js.map +1 -0
  47. package/lib/esm/index.d.ts +3 -0
  48. package/lib/esm/index.d.ts.map +1 -0
  49. package/lib/esm/index.js +3 -0
  50. package/lib/esm/index.js.map +1 -0
  51. package/lib/esm/libs/finder.d.ts +13 -0
  52. package/lib/esm/libs/finder.d.ts.map +1 -0
  53. package/lib/esm/libs/finder.js +342 -0
  54. package/lib/esm/libs/finder.js.map +1 -0
  55. package/lib/esm/libs/messenger.d.ts +57 -0
  56. package/lib/esm/libs/messenger.d.ts.map +1 -0
  57. package/lib/esm/libs/messenger.js +86 -0
  58. package/lib/esm/libs/messenger.js.map +1 -0
  59. package/lib/esm/typings/autocapture.d.ts +2 -0
  60. package/lib/esm/typings/autocapture.d.ts.map +1 -0
  61. package/lib/esm/typings/autocapture.js +2 -0
  62. package/lib/esm/typings/autocapture.js.map +1 -0
  63. package/lib/esm/version.d.ts +2 -0
  64. package/lib/esm/version.d.ts.map +1 -0
  65. package/lib/esm/version.js +2 -0
  66. package/lib/esm/version.js.map +1 -0
  67. package/lib/scripts/amplitude-min.js +1 -0
  68. package/lib/scripts/amplitude-min.js.gz +0 -0
  69. package/lib/scripts/amplitude-min.umd.js +1 -0
  70. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  71. package/lib/scripts/autocapture-plugin.d.ts +44 -0
  72. package/lib/scripts/autocapture-plugin.d.ts.map +1 -0
  73. package/lib/scripts/constants.d.ts +29 -0
  74. package/lib/scripts/constants.d.ts.map +1 -0
  75. package/lib/scripts/helpers.d.ts +24 -0
  76. package/lib/scripts/helpers.d.ts.map +1 -0
  77. package/lib/scripts/index.d.ts +3 -0
  78. package/lib/scripts/index.d.ts.map +1 -0
  79. package/lib/scripts/libs/finder.d.ts +13 -0
  80. package/lib/scripts/libs/finder.d.ts.map +1 -0
  81. package/lib/scripts/libs/messenger.d.ts +57 -0
  82. package/lib/scripts/libs/messenger.d.ts.map +1 -0
  83. package/lib/scripts/typings/autocapture.d.ts +2 -0
  84. package/lib/scripts/typings/autocapture.d.ts.map +1 -0
  85. package/lib/scripts/version.d.ts +2 -0
  86. package/lib/scripts/version.d.ts.map +1 -0
  87. package/package.json +61 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Amplitude Analytics
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ <p align="center">
2
+ <a href="https://amplitude.com" target="_blank" align="center">
3
+ <img src="https://static.amplitude.com/lightning/46c85bfd91905de8047f1ee65c7c93d6fa9ee6ea/static/media/amplitude-logo-with-text.4fb9e463.svg" width="280">
4
+ </a>
5
+ <br />
6
+ </p>
7
+
8
+ # @amplitude/plugin-autocapture-browser (beta)
9
+ **This plugin is in beta at the moment, naming and interface might change in the future.**
10
+
11
+ Browser SDK plugin for autocapture.
12
+
13
+ ## Installation
14
+
15
+ This package is published on NPM registry and is available to be installed using npm and yarn.
16
+
17
+ ```sh
18
+ # npm
19
+ npm install @amplitude/plugin-autocapture-browser@beta
20
+
21
+ # yarn
22
+ yarn add @amplitude/plugin-autocapture-browser@beta
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ This plugin works on top of the Amplitude Browser SDK, generating auto-tracked events and sending to Amplitude.
28
+
29
+ To use this plugin, you need to install `@amplitude/analytics-browser` version `v1.9.1` or later.
30
+
31
+ ### 1. Import Amplitude packages
32
+
33
+ * `@amplitude/analytics-browser`
34
+ * `@amplitude/plugin-autocapture-browser`
35
+
36
+ ```typescript
37
+ import * as amplitude from '@amplitude/analytics-browser';
38
+ import { autocapturePlugin } from '@amplitude/plugin-autocapture-browser';
39
+ ```
40
+
41
+ ### 2. Instantiate the plugin
42
+
43
+ The plugin accepts 1 optional parameter, which is an `Object` to configure the allowed tracking options.
44
+
45
+ ```typescript
46
+ const plugin = autocapturePlugin({
47
+ cssSelectorAllowlist: [
48
+ '.amp-tracking',
49
+ '[amp-tracking]'
50
+ ],
51
+ pageUrlAllowlist: [
52
+ 'https://amplitude.com',
53
+ new RegExp('https://amplitude.com/blog/*')
54
+ ],
55
+ });
56
+ ```
57
+
58
+ Examples:
59
+ - The above `cssSelectorAllowlist` will only allow tracking elements like:
60
+ - `<button amp-tracking>Click</button>`
61
+ - `<a class="amp-tracking">Link</a>`
62
+ - The above `pageUrlAllowlist` will only allow the elements on URL "https://amplitude.com" or any URL matching the "https://amplitude.com/blog/*" to be tracked
63
+
64
+ #### Options
65
+
66
+ |Name|Type|Default|Description|
67
+ |-|-|-|-|
68
+ |`cssSelectorAllowlist`|`string[]`|`['a', 'button', 'input', 'select', 'textarea', 'label', '[data-amp-default-track]', '.amp-default-track']`| When provided, only allow elements matching any selector to be tracked. |
69
+ |`pageUrlAllowlist`|`(string\|RegExp)[]`|`undefined`| When provided, only allow elements matching URLs to be tracked. |
70
+ |`shouldTrackEventResolver`|`(actionType: ActionType, element: Element) => boolean`|`undefined`| When provided, overwrite all other allowlists and configurations. |
71
+ |`dataAttributePrefix`|`string`|`'data-amp-track-'`| Allow data attributes to be collected in event property. |
72
+
73
+ ### 3. Install plugin to Amplitude SDK
74
+
75
+ ```typescript
76
+ amplitude.add(plugin);
77
+ ```
78
+
79
+ ### 4. Initialize Amplitude SDK
80
+
81
+ ```typescript
82
+ amplitude.init('API_KEY');
83
+ ```
@@ -0,0 +1,44 @@
1
+ import { BrowserClient, BrowserConfig, EnrichmentPlugin } from '@amplitude/analytics-types';
2
+ import { Messenger } from './libs/messenger';
3
+ import { ActionType } from './typings/autocapture';
4
+ type BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;
5
+ export declare const DEFAULT_CSS_SELECTOR_ALLOWLIST: string[];
6
+ export declare const DEFAULT_DATA_ATTRIBUTE_PREFIX = "data-amp-track-";
7
+ interface Options {
8
+ /**
9
+ * List of CSS selectors to allow auto tracking on.
10
+ * When provided, allow elements matching any selector to be tracked.
11
+ * Default is ['a', 'button', 'input', 'select', 'textarea', 'label', '[data-amp-default-track]', '.amp-default-track'].
12
+ */
13
+ cssSelectorAllowlist?: string[];
14
+ /**
15
+ * List of page URLs to allow auto tracking on.
16
+ * When provided, only allow tracking on these URLs.
17
+ * Both full URLs and regex are supported.
18
+ */
19
+ pageUrlAllowlist?: (string | RegExp)[];
20
+ /**
21
+ * Function to determine whether an event should be tracked.
22
+ * When provided, this function overwrites all other allowlists and configurations.
23
+ * If the function returns true, the event will be tracked.
24
+ * If the function returns false, the event will not be tracked.
25
+ * @param actionType - The type of action that triggered the event.
26
+ * @param element - The element that triggered the event.
27
+ */
28
+ shouldTrackEventResolver?: (actionType: ActionType, element: Element) => boolean;
29
+ /**
30
+ * Prefix for data attributes to allow auto collecting.
31
+ * Default is 'data-amp-track-'.
32
+ */
33
+ dataAttributePrefix?: string;
34
+ /**
35
+ * Options for integrating visual tagging selector.
36
+ */
37
+ visualTaggingOptions?: {
38
+ enabled?: boolean;
39
+ messenger?: Messenger;
40
+ };
41
+ }
42
+ export declare const autocapturePlugin: (options?: Options) => BrowserEnrichmentPlugin;
43
+ export {};
44
+ //# sourceMappingURL=autocapture-plugin.d.ts.map
@@ -0,0 +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;AAEnD,KAAK,uBAAuB,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE9E,eAAO,MAAM,8BAA8B,UAS1C,CAAC;AACF,eAAO,MAAM,6BAA6B,oBAAoB,CAAC;AAQ/D,UAAU,OAAO;IACf;;;;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,OAAO,KAAQ,uBAyOzD,CAAC"}
@@ -0,0 +1,232 @@
1
+ var _this = this;
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.autocapturePlugin = exports.DEFAULT_DATA_ATTRIBUTE_PREFIX = exports.DEFAULT_CSS_SELECTOR_ALLOWLIST = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var constants = tslib_1.__importStar(require("./constants"));
6
+ var helpers_1 = require("./helpers");
7
+ var messenger_1 = require("./libs/messenger");
8
+ exports.DEFAULT_CSS_SELECTOR_ALLOWLIST = [
9
+ 'a',
10
+ 'button',
11
+ 'input',
12
+ 'select',
13
+ 'textarea',
14
+ 'label',
15
+ '[data-amp-default-track]',
16
+ '.amp-default-track',
17
+ ];
18
+ exports.DEFAULT_DATA_ATTRIBUTE_PREFIX = 'data-amp-track-';
19
+ var autocapturePlugin = function (options) {
20
+ if (options === void 0) { options = {}; }
21
+ var _a = options.cssSelectorAllowlist, cssSelectorAllowlist = _a === void 0 ? exports.DEFAULT_CSS_SELECTOR_ALLOWLIST : _a, pageUrlAllowlist = options.pageUrlAllowlist, shouldTrackEventResolver = options.shouldTrackEventResolver, _b = options.dataAttributePrefix, dataAttributePrefix = _b === void 0 ? exports.DEFAULT_DATA_ATTRIBUTE_PREFIX : _b, _c = options.visualTaggingOptions, visualTaggingOptions = _c === void 0 ? {
22
+ enabled: true,
23
+ messenger: new messenger_1.WindowMessenger(),
24
+ } : _c;
25
+ var name = constants.PLUGIN_NAME;
26
+ var type = 'enrichment';
27
+ var observer;
28
+ var eventListeners = [];
29
+ var logger = undefined;
30
+ var addEventListener = function (element, type, handler) {
31
+ element.addEventListener(type, handler);
32
+ eventListeners.push({
33
+ element: element,
34
+ type: type,
35
+ handler: handler,
36
+ });
37
+ };
38
+ var removeEventListeners = function () {
39
+ eventListeners.forEach(function (_ref) {
40
+ var element = _ref.element, type = _ref.type, handler = _ref.handler;
41
+ /* istanbul ignore next */
42
+ element === null || element === void 0 ? void 0 : element.removeEventListener(type, handler);
43
+ });
44
+ eventListeners = [];
45
+ };
46
+ var shouldTrackEvent = function (actionType, element) {
47
+ var _a, _b, _c;
48
+ /* istanbul ignore if */
49
+ if (!element) {
50
+ return false;
51
+ }
52
+ /* istanbul ignore next */
53
+ 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);
54
+ // Text nodes have no tag
55
+ if (!tag) {
56
+ return false;
57
+ }
58
+ if (shouldTrackEventResolver) {
59
+ return shouldTrackEventResolver(actionType, element);
60
+ }
61
+ if (!(0, helpers_1.isPageUrlAllowed)(window.location.href, pageUrlAllowlist)) {
62
+ return false;
63
+ }
64
+ /* istanbul ignore next */
65
+ var elementType = (element === null || element === void 0 ? void 0 : element.type) || '';
66
+ if (typeof elementType === 'string') {
67
+ switch (elementType.toLowerCase()) {
68
+ case 'hidden':
69
+ return false;
70
+ case 'password':
71
+ return false;
72
+ }
73
+ }
74
+ /* istanbul ignore if */
75
+ if (cssSelectorAllowlist) {
76
+ var hasMatchAnyAllowedSelector = cssSelectorAllowlist.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)); });
77
+ if (!hasMatchAnyAllowedSelector) {
78
+ return false;
79
+ }
80
+ }
81
+ switch (tag) {
82
+ case 'input':
83
+ case 'select':
84
+ case 'textarea':
85
+ return actionType === 'change' || actionType === 'click';
86
+ default: {
87
+ /* istanbul ignore next */
88
+ var computedStyle = (_c = window === null || window === void 0 ? void 0 : window.getComputedStyle) === null || _c === void 0 ? void 0 : _c.call(window, element);
89
+ /* istanbul ignore next */
90
+ if (computedStyle && computedStyle.getPropertyValue('cursor') === 'pointer' && actionType === 'click') {
91
+ return true;
92
+ }
93
+ return actionType === 'click';
94
+ }
95
+ }
96
+ };
97
+ var getEventProperties = function (actionType, element) {
98
+ var _a;
99
+ var _b, _c;
100
+ /* istanbul ignore next */
101
+ 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);
102
+ /* istanbul ignore next */
103
+ var rect = typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };
104
+ var ariaLabel = element.getAttribute('aria-label');
105
+ var attributes = (0, helpers_1.getAttributesWithPrefix)(element, dataAttributePrefix);
106
+ var nearestLabel = (0, helpers_1.getNearestLabel)(element);
107
+ var selector = (0, helpers_1.getSelector)(element, logger);
108
+ /* istanbul ignore next */
109
+ var properties = (_a = {},
110
+ _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.id,
111
+ _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.className,
112
+ _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG] = tag,
113
+ _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT] = (0, helpers_1.getText)(element),
114
+ _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT] = rect.left == null ? null : Math.round(rect.left),
115
+ _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP] = rect.top == null ? null : Math.round(rect.top),
116
+ _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = ariaLabel,
117
+ _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES] = attributes,
118
+ _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR] = selector,
119
+ _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL] = nearestLabel,
120
+ _a[constants.AMPLITUDE_EVENT_PROP_PAGE_URL] = window.location.href.split('?')[0],
121
+ _a[constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE] = (typeof document !== 'undefined' && document.title) || '',
122
+ _a[constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT] = window.innerHeight,
123
+ _a[constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH] = window.innerWidth,
124
+ _a);
125
+ if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {
126
+ properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = element.href;
127
+ }
128
+ return (0, helpers_1.removeEmptyProperties)(properties);
129
+ };
130
+ var setup = function (config, amplitude) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
131
+ var addListener, attachListeners;
132
+ var _a, _b, _c;
133
+ return tslib_1.__generator(this, function (_d) {
134
+ if (!amplitude) {
135
+ /* istanbul ignore next */
136
+ (_a = config === null || config === void 0 ? void 0 : config.loggerProvider) === null || _a === void 0 ? void 0 : _a.warn("".concat(name, " plugin requires a later version of @amplitude/analytics-browser. Events are not tracked."));
137
+ return [2 /*return*/];
138
+ }
139
+ logger = config.loggerProvider;
140
+ /* istanbul ignore if */
141
+ if (typeof document === 'undefined') {
142
+ return [2 /*return*/];
143
+ }
144
+ addListener = function (el) {
145
+ if (shouldTrackEvent('click', el)) {
146
+ addEventListener(el, 'click', function (event) {
147
+ // Limit to only the innermost element that matches the selectors, avoiding all propagated event after matching.
148
+ /* istanbul ignore next */
149
+ if ((event === null || event === void 0 ? void 0 : event.target) != (event === null || event === void 0 ? void 0 : event.currentTarget) &&
150
+ (0, helpers_1.getClosestElement)(event === null || event === void 0 ? void 0 : event.target, cssSelectorAllowlist) != (event === null || event === void 0 ? void 0 : event.currentTarget)) {
151
+ return;
152
+ }
153
+ /* istanbul ignore next */
154
+ amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(constants.AMPLITUDE_ELEMENT_CLICKED_EVENT, getEventProperties('click', el));
155
+ });
156
+ }
157
+ if (shouldTrackEvent('change', el)) {
158
+ addEventListener(el, 'change', function (event) {
159
+ // Limit to only the innermost element that matches the selectors, avoiding all propagated event after matching.
160
+ /* istanbul ignore next */
161
+ if ((event === null || event === void 0 ? void 0 : event.target) != (event === null || event === void 0 ? void 0 : event.currentTarget) &&
162
+ (0, helpers_1.getClosestElement)(event === null || event === void 0 ? void 0 : event.target, cssSelectorAllowlist) != (event === null || event === void 0 ? void 0 : event.currentTarget)) {
163
+ return;
164
+ }
165
+ /* istanbul ignore next */
166
+ amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(constants.AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', el));
167
+ });
168
+ }
169
+ };
170
+ if (typeof MutationObserver !== 'undefined') {
171
+ observer = new MutationObserver(function (mutations) {
172
+ mutations.forEach(function (mutation) {
173
+ mutation.addedNodes.forEach(function (node) {
174
+ addListener(node);
175
+ if ('querySelectorAll' in node && typeof node.querySelectorAll === 'function') {
176
+ (0, helpers_1.querySelectUniqueElements)(node, cssSelectorAllowlist).map(addListener);
177
+ }
178
+ });
179
+ });
180
+ });
181
+ }
182
+ attachListeners = function () {
183
+ var allElements = (0, helpers_1.querySelectUniqueElements)(document.body, cssSelectorAllowlist);
184
+ allElements.forEach(addListener);
185
+ /* istanbul ignore next */
186
+ observer === null || observer === void 0 ? void 0 : observer.observe(document.body, {
187
+ subtree: true,
188
+ childList: true,
189
+ });
190
+ };
191
+ if (document.body) {
192
+ attachListeners();
193
+ }
194
+ else {
195
+ // This is to handle the case where the plugin is loaded before the body is available.
196
+ // E.g., for non-reactive frameworks.
197
+ window.addEventListener('load', attachListeners);
198
+ }
199
+ /* istanbul ignore next */
200
+ (_b = config === null || config === void 0 ? void 0 : config.loggerProvider) === null || _b === void 0 ? void 0 : _b.log("".concat(name, " has been successfully added."));
201
+ // Setup visual tagging selector
202
+ if (window.opener && visualTaggingOptions.enabled) {
203
+ /* istanbul ignore next */
204
+ (_c = visualTaggingOptions.messenger) === null || _c === void 0 ? void 0 : _c.setup(tslib_1.__assign(tslib_1.__assign({ logger: config === null || config === void 0 ? void 0 : config.loggerProvider }, ((config === null || config === void 0 ? void 0 : config.serverZone) && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] })), { isElementSelectable: shouldTrackEvent }));
205
+ }
206
+ return [2 /*return*/];
207
+ });
208
+ }); };
209
+ var execute = function (event) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
210
+ return tslib_1.__generator(this, function (_a) {
211
+ return [2 /*return*/, event];
212
+ });
213
+ }); };
214
+ var teardown = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
215
+ return tslib_1.__generator(this, function (_a) {
216
+ if (observer) {
217
+ observer.disconnect();
218
+ }
219
+ removeEventListeners();
220
+ return [2 /*return*/];
221
+ });
222
+ }); };
223
+ return {
224
+ name: name,
225
+ type: type,
226
+ setup: setup,
227
+ execute: execute,
228
+ teardown: teardown,
229
+ };
230
+ };
231
+ exports.autocapturePlugin = autocapturePlugin;
232
+ //# sourceMappingURL=autocapture-plugin.js.map
@@ -0,0 +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\ninterface Options {\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: Options = {}): 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"]}
@@ -0,0 +1,29 @@
1
+ export declare const PLUGIN_NAME = "@amplitude/plugin-autocapture-browser";
2
+ export declare const AMPLITUDE_ELEMENT_CLICKED_EVENT = "[Amplitude] Element Clicked";
3
+ export declare const AMPLITUDE_ELEMENT_CHANGED_EVENT = "[Amplitude] Element Changed";
4
+ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_ID = "[Amplitude] Element ID";
5
+ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = "[Amplitude] Element Class";
6
+ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_TAG = "[Amplitude] Element Tag";
7
+ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_TEXT = "[Amplitude] Element Text";
8
+ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_HREF = "[Amplitude] Element Href";
9
+ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = "[Amplitude] Element Position Left";
10
+ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = "[Amplitude] Element Position Top";
11
+ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = "[Amplitude] Element Aria Label";
12
+ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = "[Amplitude] Element Attributes";
13
+ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR = "[Amplitude] Element Selector";
14
+ export declare const AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = "[Amplitude] Element Parent Label";
15
+ export declare const AMPLITUDE_EVENT_PROP_PAGE_URL = "[Amplitude] Page URL";
16
+ export declare const AMPLITUDE_EVENT_PROP_PAGE_TITLE = "[Amplitude] Page Title";
17
+ export declare const AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = "[Amplitude] Viewport Height";
18
+ export declare const AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = "[Amplitude] Viewport Width";
19
+ export declare const AMPLITUDE_ORIGIN = "https://app.amplitude.com";
20
+ export declare const AMPLITUDE_ORIGIN_EU = "https://app.eu.amplitude.com";
21
+ export declare const AMPLITUDE_ORIGIN_STAGING = "https://apps.stag2.amplitude.com";
22
+ export declare const AMPLITUDE_ORIGINS_MAP: {
23
+ US: string;
24
+ EU: string;
25
+ STAGING: string;
26
+ };
27
+ export declare const AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL = "https://cdn.amplitude.com/libs/visual-tagging-selector-0.2.2.js.gz";
28
+ export declare const AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = "amp-visual-tagging-selector-highlight";
29
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +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;AACxF,eAAO,MAAM,qCAAqC,iCAAiC,CAAC;AACpF,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"}
@@ -0,0 +1,34 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ exports.AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = exports.AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL = exports.AMPLITUDE_ORIGINS_MAP = exports.AMPLITUDE_ORIGIN_STAGING = exports.AMPLITUDE_ORIGIN_EU = exports.AMPLITUDE_ORIGIN = exports.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = exports.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = exports.AMPLITUDE_EVENT_PROP_PAGE_TITLE = exports.AMPLITUDE_EVENT_PROP_PAGE_URL = exports.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = exports.AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR = exports.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = exports.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = exports.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = exports.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = exports.AMPLITUDE_EVENT_PROP_ELEMENT_HREF = exports.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT = exports.AMPLITUDE_EVENT_PROP_ELEMENT_TAG = exports.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = exports.AMPLITUDE_EVENT_PROP_ELEMENT_ID = exports.AMPLITUDE_ELEMENT_CHANGED_EVENT = exports.AMPLITUDE_ELEMENT_CLICKED_EVENT = exports.PLUGIN_NAME = void 0;
3
+ exports.PLUGIN_NAME = '@amplitude/plugin-autocapture-browser';
4
+ exports.AMPLITUDE_ELEMENT_CLICKED_EVENT = '[Amplitude] Element Clicked';
5
+ exports.AMPLITUDE_ELEMENT_CHANGED_EVENT = '[Amplitude] Element Changed';
6
+ exports.AMPLITUDE_EVENT_PROP_ELEMENT_ID = '[Amplitude] Element ID';
7
+ exports.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = '[Amplitude] Element Class';
8
+ exports.AMPLITUDE_EVENT_PROP_ELEMENT_TAG = '[Amplitude] Element Tag';
9
+ exports.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT = '[Amplitude] Element Text';
10
+ exports.AMPLITUDE_EVENT_PROP_ELEMENT_HREF = '[Amplitude] Element Href';
11
+ exports.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = '[Amplitude] Element Position Left';
12
+ exports.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = '[Amplitude] Element Position Top';
13
+ exports.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = '[Amplitude] Element Aria Label';
14
+ exports.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = '[Amplitude] Element Attributes';
15
+ exports.AMPLITUDE_EVENT_PROP_ELEMENT_SELECTOR = '[Amplitude] Element Selector';
16
+ exports.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = '[Amplitude] Element Parent Label';
17
+ exports.AMPLITUDE_EVENT_PROP_PAGE_URL = '[Amplitude] Page URL';
18
+ exports.AMPLITUDE_EVENT_PROP_PAGE_TITLE = '[Amplitude] Page Title';
19
+ exports.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = '[Amplitude] Viewport Height';
20
+ exports.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = '[Amplitude] Viewport Width';
21
+ // Visual Tagging related constants
22
+ exports.AMPLITUDE_ORIGIN = 'https://app.amplitude.com';
23
+ exports.AMPLITUDE_ORIGIN_EU = 'https://app.eu.amplitude.com';
24
+ exports.AMPLITUDE_ORIGIN_STAGING = 'https://apps.stag2.amplitude.com';
25
+ exports.AMPLITUDE_ORIGINS_MAP = {
26
+ US: exports.AMPLITUDE_ORIGIN,
27
+ EU: exports.AMPLITUDE_ORIGIN_EU,
28
+ STAGING: exports.AMPLITUDE_ORIGIN_STAGING,
29
+ };
30
+ exports.AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL = 'https://cdn.amplitude.com/libs/visual-tagging-selector-0.2.2.js.gz';
31
+ // This is the class name used by the visual tagging selector to highlight the selected element.
32
+ // Should not use this class in the selector.
33
+ exports.AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = 'amp-visual-tagging-selector-highlight';
34
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;AAAa,QAAA,WAAW,GAAG,uCAAuC,CAAC;AAEtD,QAAA,+BAA+B,GAAG,6BAA6B,CAAC;AAChE,QAAA,+BAA+B,GAAG,6BAA6B,CAAC;AAEhE,QAAA,+BAA+B,GAAG,wBAAwB,CAAC;AAC3D,QAAA,kCAAkC,GAAG,2BAA2B,CAAC;AACjE,QAAA,gCAAgC,GAAG,yBAAyB,CAAC;AAC7D,QAAA,iCAAiC,GAAG,0BAA0B,CAAC;AAC/D,QAAA,iCAAiC,GAAG,0BAA0B,CAAC;AAC/D,QAAA,0CAA0C,GAAG,mCAAmC,CAAC;AACjF,QAAA,yCAAyC,GAAG,kCAAkC,CAAC;AAC/E,QAAA,uCAAuC,GAAG,gCAAgC,CAAC;AAC3E,QAAA,uCAAuC,GAAG,gCAAgC,CAAC;AAC3E,QAAA,qCAAqC,GAAG,8BAA8B,CAAC;AACvE,QAAA,yCAAyC,GAAG,kCAAkC,CAAC;AAC/E,QAAA,6BAA6B,GAAG,sBAAsB,CAAC;AACvD,QAAA,+BAA+B,GAAG,wBAAwB,CAAC;AAC3D,QAAA,oCAAoC,GAAG,6BAA6B,CAAC;AACrE,QAAA,mCAAmC,GAAG,4BAA4B,CAAC;AAEhF,mCAAmC;AACtB,QAAA,gBAAgB,GAAG,2BAA2B,CAAC;AAC/C,QAAA,mBAAmB,GAAG,8BAA8B,CAAC;AACrD,QAAA,wBAAwB,GAAG,kCAAkC,CAAC;AAC9D,QAAA,qBAAqB,GAAG;IACnC,EAAE,EAAE,wBAAgB;IACpB,EAAE,EAAE,2BAAmB;IACvB,OAAO,EAAE,gCAAwB;CAClC,CAAC;AAEW,QAAA,4CAA4C,GACvD,oEAAoE,CAAC;AACvE,gGAAgG;AAChG,6CAA6C;AAChC,QAAA,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"}