@amplitude/plugin-autocapture-browser 1.18.2 → 1.18.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"amplitude-min.js","sources":["../../../../node_modules/tslib/tslib.es6.js","../../../analytics-core/lib/esm/global-scope.js","../../../analytics-core/lib/esm/utils/url-utils.js","../../../analytics-core/lib/esm/types/element-interactions.js","../../../analytics-core/lib/esm/types/frustration-interactions.js","../../../analytics-core/lib/esm/plugins/helpers.js","../../../../node_modules/zen-observable-ts/module.js","../../../analytics-core/lib/esm/utils/observable.js","../../../src/version.ts","../../../src/constants.ts","../../../src/helpers.ts","../../../src/hierarchy.ts","../../../src/pageActions/actions.ts","../../../src/data-extractor.ts","../../../src/libs/messenger.ts","../../../src/observables.ts","../../../src/autocapture-plugin.ts","../../../src/pageActions/triggers.ts","../../../src/pageActions/matchEventToFilter.ts","../../../src/autocapture/track-click.ts","../../../src/autocapture/track-change.ts","../../../src/autocapture/track-action-click.ts","../../../src/autocapture/track-dead-click.ts","../../../src/autocapture/track-rage-click.ts","../../../src/frustration-plugin.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/* eslint-disable no-restricted-globals */\n/* Only file allowed to access to globalThis, window, self */\nexport var getGlobalScope = function () {\n // This should only be used for integrations with Amplitude that are not running in a browser environment\n // We need to specify the name of the global variable as a string to prevent it from being minified\n var ampIntegrationContextName = 'ampIntegrationContext';\n if (typeof globalThis !== 'undefined' && typeof globalThis[ampIntegrationContextName] !== 'undefined') {\n return globalThis[ampIntegrationContextName];\n }\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n return undefined;\n};\n//# sourceMappingURL=global-scope.js.map","/**\n * Checks if a given URL matches any pattern in an allowlist of URLs or regex patterns.\n * @param url - The URL to check\n * @param allowlist - Array of allowed URLs (strings) or regex patterns\n * @returns true if the URL matches any pattern in the allowlist, false otherwise\n */\nexport var isUrlMatchAllowlist = function (url, allowlist) {\n if (!allowlist || !allowlist.length) {\n return true;\n }\n return allowlist.some(function (allowedUrl) {\n if (typeof allowedUrl === 'string') {\n return url === allowedUrl;\n }\n return url.match(allowedUrl);\n });\n};\nexport var getDecodeURI = function (locationStr, loggerProvider) {\n var decodedLocationStr = locationStr;\n try {\n decodedLocationStr = decodeURI(locationStr);\n }\n catch (e) {\n /* istanbul ignore next */\n loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.error('Malformed URI sequence: ', e);\n }\n return decodedLocationStr;\n};\n//# sourceMappingURL=url-utils.js.map","/**\n * Default CSS selectors to define which elements on the page to track.\n * Extend this list to include additional elements to track. For example:\n * ```\n * autocapturePlugin({\n * cssSelectorAllowlist: [...DEFAULT_CSS_SELECTOR_ALLOWLIST, \".my-class\"],\n * })\n * ```\n */\nexport var DEFAULT_CSS_SELECTOR_ALLOWLIST = [\n 'a',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'label',\n 'video',\n 'audio',\n '[contenteditable=\"true\" i]',\n '[data-amp-default-track]',\n '.amp-default-track',\n];\n/**\n * Default prefix to allow the plugin to capture data attributes as an event property.\n */\nexport var DEFAULT_DATA_ATTRIBUTE_PREFIX = 'data-amp-track-';\n/**\n * Default list of elements on the page should be tracked when the page changes.\n */\nexport var DEFAULT_ACTION_CLICK_ALLOWLIST = ['div', 'span', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n//# sourceMappingURL=element-interactions.js.map","import { __read, __spreadArray } from \"tslib\";\nvar CLICKABLE_ELEMENT_SELECTORS = [\n 'a',\n 'button',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"menuitem\"]',\n '[role=\"menuitemcheckbox\"]',\n '[role=\"menuitemradio\"]',\n '[role=\"option\"]',\n '[role=\"tab\"]',\n '[role=\"treeitem\"]',\n '[contenteditable=\"true\" i]',\n];\n/**\n * Default CSS selectors for dead clicks tracking\n */\nexport var DEFAULT_DEAD_CLICK_ALLOWLIST = __spreadArray([\n 'input[type=\"button\"]',\n 'input[type=\"submit\"]',\n 'input[type=\"reset\"]',\n 'input[type=\"image\"]',\n 'input[type=\"file\"]'\n], __read(CLICKABLE_ELEMENT_SELECTORS), false);\n/**\n * Default CSS selectors for rage clicks tracking\n */\nexport var DEFAULT_RAGE_CLICK_ALLOWLIST = ['*'];\n/**\n * Default time window for dead clicks (3 seconds)\n */\nexport var DEFAULT_DEAD_CLICK_WINDOW_MS = 3000;\n/**\n * Default time window for rage clicks (1 second)\n */\nexport var DEFAULT_RAGE_CLICK_WINDOW_MS = 1000;\n/**\n * Default threshold for rage clicks (4 clicks)\n */\nexport var DEFAULT_RAGE_CLICK_THRESHOLD = 4;\n/**\n * Default threshold for rage clicks to be considered out of bounds (50 pixels)\n */\nexport var DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD = 50; // pixels\n//# sourceMappingURL=frustration-interactions.js.map","import { __values } from \"tslib\";\nexport var TEXT_MASK_ATTRIBUTE = 'data-amp-mask';\nexport var MASKED_TEXT_VALUE = '*****';\n// Regex patterns for sensitive data\nexport var CC_REGEX = /\\b(?:\\d[ -]*?){13,16}\\b/;\nexport var SSN_REGEX = /(\\d{3}-?\\d{2}-?\\d{4})/g;\nexport var EMAIL_REGEX = /[^\\s@]+@[^\\s@.]+\\.[^\\s@]+/g;\n/**\n * Replaces sensitive strings (credit cards, SSNs, emails) and custom patterns with masked text\n * @param text - The text to search for sensitive data\n * @param additionalMaskTextPatterns - Optional array of additional regex patterns to mask\n * @returns The text with sensitive data replaced by masked text\n */\nexport var replaceSensitiveString = function (text, additionalMaskTextPatterns) {\n var e_1, _a;\n if (additionalMaskTextPatterns === void 0) { additionalMaskTextPatterns = []; }\n if (typeof text !== 'string') {\n return '';\n }\n var result = text;\n // Check for credit card number (with or without spaces/dashes)\n result = result.replace(CC_REGEX, MASKED_TEXT_VALUE);\n // Check for social security number\n result = result.replace(SSN_REGEX, MASKED_TEXT_VALUE);\n // Check for email\n result = result.replace(EMAIL_REGEX, MASKED_TEXT_VALUE);\n try {\n // Check for additional mask text patterns\n for (var additionalMaskTextPatterns_1 = __values(additionalMaskTextPatterns), additionalMaskTextPatterns_1_1 = additionalMaskTextPatterns_1.next(); !additionalMaskTextPatterns_1_1.done; additionalMaskTextPatterns_1_1 = additionalMaskTextPatterns_1.next()) {\n var pattern = additionalMaskTextPatterns_1_1.value;\n try {\n result = result.replace(pattern, MASKED_TEXT_VALUE);\n }\n catch (_b) {\n // ignore invalid pattern\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (additionalMaskTextPatterns_1_1 && !additionalMaskTextPatterns_1_1.done && (_a = additionalMaskTextPatterns_1.return)) _a.call(additionalMaskTextPatterns_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return result;\n};\n/**\n * Gets the page title, checking if the title element has data-amp-mask attribute\n * @returns The page title, masked if the title element has data-amp-mask attribute\n */\nexport var getPageTitle = function (parseTitleFunction) {\n if (typeof document === 'undefined' || !document.title) {\n return '';\n }\n var titleElement = document.querySelector('title');\n if (titleElement && titleElement.hasAttribute(TEXT_MASK_ATTRIBUTE)) {\n return MASKED_TEXT_VALUE;\n }\n return parseTitleFunction ? parseTitleFunction(document.title) : document.title; // document.title is always synced to the first title element\n};\n//# sourceMappingURL=helpers.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n// === Symbol Support ===\nvar hasSymbols = function () {\n return typeof Symbol === 'function';\n};\n\nvar hasSymbol = function (name) {\n return hasSymbols() && Boolean(Symbol[name]);\n};\n\nvar getSymbol = function (name) {\n return hasSymbol(name) ? Symbol[name] : '@@' + name;\n};\n\nif (hasSymbols() && !hasSymbol('observable')) {\n Symbol.observable = Symbol('observable');\n}\n\nvar SymbolIterator = getSymbol('iterator');\nvar SymbolObservable = getSymbol('observable');\nvar SymbolSpecies = getSymbol('species'); // === Abstract Operations ===\n\nfunction getMethod(obj, key) {\n var value = obj[key];\n if (value == null) return undefined;\n if (typeof value !== 'function') throw new TypeError(value + ' is not a function');\n return value;\n}\n\nfunction getSpecies(obj) {\n var ctor = obj.constructor;\n\n if (ctor !== undefined) {\n ctor = ctor[SymbolSpecies];\n\n if (ctor === null) {\n ctor = undefined;\n }\n }\n\n return ctor !== undefined ? ctor : Observable;\n}\n\nfunction isObservable(x) {\n return x instanceof Observable; // SPEC: Brand check\n}\n\nfunction hostReportError(e) {\n if (hostReportError.log) {\n hostReportError.log(e);\n } else {\n setTimeout(function () {\n throw e;\n });\n }\n}\n\nfunction enqueue(fn) {\n Promise.resolve().then(function () {\n try {\n fn();\n } catch (e) {\n hostReportError(e);\n }\n });\n}\n\nfunction cleanupSubscription(subscription) {\n var cleanup = subscription._cleanup;\n if (cleanup === undefined) return;\n subscription._cleanup = undefined;\n\n if (!cleanup) {\n return;\n }\n\n try {\n if (typeof cleanup === 'function') {\n cleanup();\n } else {\n var unsubscribe = getMethod(cleanup, 'unsubscribe');\n\n if (unsubscribe) {\n unsubscribe.call(cleanup);\n }\n }\n } catch (e) {\n hostReportError(e);\n }\n}\n\nfunction closeSubscription(subscription) {\n subscription._observer = undefined;\n subscription._queue = undefined;\n subscription._state = 'closed';\n}\n\nfunction flushSubscription(subscription) {\n var queue = subscription._queue;\n\n if (!queue) {\n return;\n }\n\n subscription._queue = undefined;\n subscription._state = 'ready';\n\n for (var i = 0; i < queue.length; ++i) {\n notifySubscription(subscription, queue[i].type, queue[i].value);\n if (subscription._state === 'closed') break;\n }\n}\n\nfunction notifySubscription(subscription, type, value) {\n subscription._state = 'running';\n var observer = subscription._observer;\n\n try {\n var m = getMethod(observer, type);\n\n switch (type) {\n case 'next':\n if (m) m.call(observer, value);\n break;\n\n case 'error':\n closeSubscription(subscription);\n if (m) m.call(observer, value);else throw value;\n break;\n\n case 'complete':\n closeSubscription(subscription);\n if (m) m.call(observer);\n break;\n }\n } catch (e) {\n hostReportError(e);\n }\n\n if (subscription._state === 'closed') cleanupSubscription(subscription);else if (subscription._state === 'running') subscription._state = 'ready';\n}\n\nfunction onNotify(subscription, type, value) {\n if (subscription._state === 'closed') return;\n\n if (subscription._state === 'buffering') {\n subscription._queue.push({\n type: type,\n value: value\n });\n\n return;\n }\n\n if (subscription._state !== 'ready') {\n subscription._state = 'buffering';\n subscription._queue = [{\n type: type,\n value: value\n }];\n enqueue(function () {\n return flushSubscription(subscription);\n });\n return;\n }\n\n notifySubscription(subscription, type, value);\n}\n\nvar Subscription = /*#__PURE__*/function () {\n function Subscription(observer, subscriber) {\n // ASSERT: observer is an object\n // ASSERT: subscriber is callable\n this._cleanup = undefined;\n this._observer = observer;\n this._queue = undefined;\n this._state = 'initializing';\n var subscriptionObserver = new SubscriptionObserver(this);\n\n try {\n this._cleanup = subscriber.call(undefined, subscriptionObserver);\n } catch (e) {\n subscriptionObserver.error(e);\n }\n\n if (this._state === 'initializing') this._state = 'ready';\n }\n\n var _proto = Subscription.prototype;\n\n _proto.unsubscribe = function unsubscribe() {\n if (this._state !== 'closed') {\n closeSubscription(this);\n cleanupSubscription(this);\n }\n };\n\n _createClass(Subscription, [{\n key: \"closed\",\n get: function () {\n return this._state === 'closed';\n }\n }]);\n\n return Subscription;\n}();\n\nvar SubscriptionObserver = /*#__PURE__*/function () {\n function SubscriptionObserver(subscription) {\n this._subscription = subscription;\n }\n\n var _proto2 = SubscriptionObserver.prototype;\n\n _proto2.next = function next(value) {\n onNotify(this._subscription, 'next', value);\n };\n\n _proto2.error = function error(value) {\n onNotify(this._subscription, 'error', value);\n };\n\n _proto2.complete = function complete() {\n onNotify(this._subscription, 'complete');\n };\n\n _createClass(SubscriptionObserver, [{\n key: \"closed\",\n get: function () {\n return this._subscription._state === 'closed';\n }\n }]);\n\n return SubscriptionObserver;\n}();\n\nvar Observable = /*#__PURE__*/function () {\n function Observable(subscriber) {\n if (!(this instanceof Observable)) throw new TypeError('Observable cannot be called as a function');\n if (typeof subscriber !== 'function') throw new TypeError('Observable initializer must be a function');\n this._subscriber = subscriber;\n }\n\n var _proto3 = Observable.prototype;\n\n _proto3.subscribe = function subscribe(observer) {\n if (typeof observer !== 'object' || observer === null) {\n observer = {\n next: observer,\n error: arguments[1],\n complete: arguments[2]\n };\n }\n\n return new Subscription(observer, this._subscriber);\n };\n\n _proto3.forEach = function forEach(fn) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (typeof fn !== 'function') {\n reject(new TypeError(fn + ' is not a function'));\n return;\n }\n\n function done() {\n subscription.unsubscribe();\n resolve();\n }\n\n var subscription = _this.subscribe({\n next: function (value) {\n try {\n fn(value, done);\n } catch (e) {\n reject(e);\n subscription.unsubscribe();\n }\n },\n error: reject,\n complete: resolve\n });\n });\n };\n\n _proto3.map = function map(fn) {\n var _this2 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n return new C(function (observer) {\n return _this2.subscribe({\n next: function (value) {\n try {\n value = fn(value);\n } catch (e) {\n return observer.error(e);\n }\n\n observer.next(value);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n observer.complete();\n }\n });\n });\n };\n\n _proto3.filter = function filter(fn) {\n var _this3 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n return new C(function (observer) {\n return _this3.subscribe({\n next: function (value) {\n try {\n if (!fn(value)) return;\n } catch (e) {\n return observer.error(e);\n }\n\n observer.next(value);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n observer.complete();\n }\n });\n });\n };\n\n _proto3.reduce = function reduce(fn) {\n var _this4 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n var hasSeed = arguments.length > 1;\n var hasValue = false;\n var seed = arguments[1];\n var acc = seed;\n return new C(function (observer) {\n return _this4.subscribe({\n next: function (value) {\n var first = !hasValue;\n hasValue = true;\n\n if (!first || hasSeed) {\n try {\n acc = fn(acc, value);\n } catch (e) {\n return observer.error(e);\n }\n } else {\n acc = value;\n }\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n if (!hasValue && !hasSeed) return observer.error(new TypeError('Cannot reduce an empty sequence'));\n observer.next(acc);\n observer.complete();\n }\n });\n });\n };\n\n _proto3.concat = function concat() {\n var _this5 = this;\n\n for (var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++) {\n sources[_key] = arguments[_key];\n }\n\n var C = getSpecies(this);\n return new C(function (observer) {\n var subscription;\n var index = 0;\n\n function startNext(next) {\n subscription = next.subscribe({\n next: function (v) {\n observer.next(v);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n if (index === sources.length) {\n subscription = undefined;\n observer.complete();\n } else {\n startNext(C.from(sources[index++]));\n }\n }\n });\n }\n\n startNext(_this5);\n return function () {\n if (subscription) {\n subscription.unsubscribe();\n subscription = undefined;\n }\n };\n });\n };\n\n _proto3.flatMap = function flatMap(fn) {\n var _this6 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n return new C(function (observer) {\n var subscriptions = [];\n\n var outer = _this6.subscribe({\n next: function (value) {\n if (fn) {\n try {\n value = fn(value);\n } catch (e) {\n return observer.error(e);\n }\n }\n\n var inner = C.from(value).subscribe({\n next: function (value) {\n observer.next(value);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n var i = subscriptions.indexOf(inner);\n if (i >= 0) subscriptions.splice(i, 1);\n completeIfDone();\n }\n });\n subscriptions.push(inner);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n completeIfDone();\n }\n });\n\n function completeIfDone() {\n if (outer.closed && subscriptions.length === 0) observer.complete();\n }\n\n return function () {\n subscriptions.forEach(function (s) {\n return s.unsubscribe();\n });\n outer.unsubscribe();\n };\n });\n };\n\n _proto3[SymbolObservable] = function () {\n return this;\n };\n\n Observable.from = function from(x) {\n var C = typeof this === 'function' ? this : Observable;\n if (x == null) throw new TypeError(x + ' is not an object');\n var method = getMethod(x, SymbolObservable);\n\n if (method) {\n var observable = method.call(x);\n if (Object(observable) !== observable) throw new TypeError(observable + ' is not an object');\n if (isObservable(observable) && observable.constructor === C) return observable;\n return new C(function (observer) {\n return observable.subscribe(observer);\n });\n }\n\n if (hasSymbol('iterator')) {\n method = getMethod(x, SymbolIterator);\n\n if (method) {\n return new C(function (observer) {\n enqueue(function () {\n if (observer.closed) return;\n\n for (var _iterator = _createForOfIteratorHelperLoose(method.call(x)), _step; !(_step = _iterator()).done;) {\n var item = _step.value;\n observer.next(item);\n if (observer.closed) return;\n }\n\n observer.complete();\n });\n });\n }\n }\n\n if (Array.isArray(x)) {\n return new C(function (observer) {\n enqueue(function () {\n if (observer.closed) return;\n\n for (var i = 0; i < x.length; ++i) {\n observer.next(x[i]);\n if (observer.closed) return;\n }\n\n observer.complete();\n });\n });\n }\n\n throw new TypeError(x + ' is not observable');\n };\n\n Observable.of = function of() {\n for (var _len2 = arguments.length, items = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n items[_key2] = arguments[_key2];\n }\n\n var C = typeof this === 'function' ? this : Observable;\n return new C(function (observer) {\n enqueue(function () {\n if (observer.closed) return;\n\n for (var i = 0; i < items.length; ++i) {\n observer.next(items[i]);\n if (observer.closed) return;\n }\n\n observer.complete();\n });\n });\n };\n\n _createClass(Observable, null, [{\n key: SymbolSpecies,\n get: function () {\n return this;\n }\n }]);\n\n return Observable;\n}();\n\nif (hasSymbols()) {\n Object.defineProperty(Observable, Symbol('extensions'), {\n value: {\n symbol: SymbolObservable,\n hostReportError: hostReportError\n },\n configurable: true\n });\n}\n\nexport { Observable };\n","import { __values } from \"tslib\";\nexport { Observable } from 'zen-observable-ts';\nimport { Observable as ZenObservable } from 'zen-observable-ts';\n/**\n * asyncMap operator for Zen Observable\n *\n * Maps each value emitted by the source Observable using an async function,\n * emitting the resolved values in the same order they arrive.\n */\nfunction asyncMap(observable, fn) {\n return new ZenObservable(function (observer) {\n observable.subscribe({\n next: function (value) {\n fn(value)\n .then(function (result) {\n return observer.next(result);\n })\n .catch(function (error) { return observer.error(error); });\n },\n error: function (error) {\n observer.error(error);\n },\n complete: function () {\n observer.complete();\n },\n });\n });\n}\n/**\n * merge operator for Zen Observable\n *\n * Merges two observables into a single observable, emitting values from both sources in the order they arrive.\n * @param sourceA Observable to merge\n * @param sourceB Observable to merge\n * @returns Unsubscribable cleanup function\n */\nfunction merge(sourceA, sourceB) {\n return new ZenObservable(function (observer) {\n var closed = false;\n var subscriptions = new Set();\n var cleanup = function () {\n var e_1, _a;\n closed = true;\n try {\n for (var subscriptions_1 = __values(subscriptions), subscriptions_1_1 = subscriptions_1.next(); !subscriptions_1_1.done; subscriptions_1_1 = subscriptions_1.next()) {\n var sub = subscriptions_1_1.value;\n try {\n sub.unsubscribe();\n }\n catch (_b) {\n /* do nothing */\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (subscriptions_1_1 && !subscriptions_1_1.done && (_a = subscriptions_1.return)) _a.call(subscriptions_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n subscriptions.clear();\n };\n var subscribeTo = function (source) {\n var sub = source.subscribe({\n next: function (value) {\n if (!closed)\n observer.next(value);\n },\n error: function (err) {\n if (!closed) {\n closed = true;\n observer.error(err);\n cleanup();\n }\n },\n complete: function () {\n subscriptions.delete(sub);\n if (!closed && subscriptions.size === 0) {\n observer.complete();\n cleanup();\n closed = true;\n }\n },\n });\n subscriptions.add(sub);\n };\n subscribeTo(sourceA);\n subscribeTo(sourceB);\n return cleanup;\n });\n}\n// function share() {\nfunction multicast(source) {\n var observers = new Set();\n var subscription = null;\n function cleanup() {\n /* istanbul ignore next */\n subscription === null || subscription === void 0 ? void 0 : subscription.unsubscribe();\n subscription = null;\n observers.clear();\n }\n return new ZenObservable(function (observer) {\n observers.add(observer);\n if (subscription === null) {\n subscription = source.subscribe({\n next: function (value) {\n var e_2, _a;\n var _b;\n try {\n for (var observers_1 = __values(observers), observers_1_1 = observers_1.next(); !observers_1_1.done; observers_1_1 = observers_1.next()) {\n var obs = observers_1_1.value;\n /* istanbul ignore next */\n (_b = obs.next) === null || _b === void 0 ? void 0 : _b.call(obs, value);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (observers_1_1 && !observers_1_1.done && (_a = observers_1.return)) _a.call(observers_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n },\n error: function (err) {\n var e_3, _a;\n var _b;\n try {\n for (var observers_2 = __values(observers), observers_2_1 = observers_2.next(); !observers_2_1.done; observers_2_1 = observers_2.next()) {\n var obs = observers_2_1.value;\n /* istanbul ignore next */\n (_b = obs.error) === null || _b === void 0 ? void 0 : _b.call(obs, err);\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (observers_2_1 && !observers_2_1.done && (_a = observers_2.return)) _a.call(observers_2);\n }\n finally { if (e_3) throw e_3.error; }\n }\n cleanup();\n },\n complete: function () {\n var e_4, _a;\n var _b;\n try {\n for (var observers_3 = __values(observers), observers_3_1 = observers_3.next(); !observers_3_1.done; observers_3_1 = observers_3.next()) {\n var obs = observers_3_1.value;\n /* istanbul ignore next */\n (_b = obs.complete) === null || _b === void 0 ? void 0 : _b.call(obs);\n }\n }\n catch (e_4_1) { e_4 = { error: e_4_1 }; }\n finally {\n try {\n if (observers_3_1 && !observers_3_1.done && (_a = observers_3.return)) _a.call(observers_3);\n }\n finally { if (e_4) throw e_4.error; }\n }\n cleanup();\n },\n });\n }\n // Return unsubscribe function for this observer\n return function () {\n observers.delete(observer);\n // If no observers left, unsubscribe from the source\n if (observers.size === 0 && subscription) {\n subscription.unsubscribe();\n subscription = null;\n }\n };\n });\n}\nexport { asyncMap, multicast, merge };\n//# sourceMappingURL=observable.js.map","export const VERSION = '1.18.2';\n","export const PLUGIN_NAME = '@amplitude/plugin-autocapture-browser';\nexport const FRUSTRATION_PLUGIN_NAME = '@amplitude/plugin-frustration-browser';\n\nexport const AMPLITUDE_ELEMENT_CLICKED_EVENT = '[Amplitude] Element Clicked';\nexport const AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = '[Amplitude] Dead Click';\nexport const AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = '[Amplitude] Rage Click';\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\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-1.0.0-alpha.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\n// Data attribute for specifying which attributes should be redacted from autocapture\nexport const DATA_AMP_MASK_ATTRIBUTES = 'data-amp-mask-attributes';\n\nexport const MAX_MASK_TEXT_PATTERNS = 25;\nexport const MAX_ATTRIBUTE_LENGTH = 128;\n","/* eslint-disable no-restricted-globals */\nimport { ElementInteractionsOptions, ActionType, isUrlMatchAllowlist } from '@amplitude/analytics-core';\n\nexport type JSONValue = string | number | boolean | null | { [x: string]: JSONValue } | Array<JSONValue>;\n\nconst SENSITIVE_TAGS = ['input', 'select', 'textarea'];\n\nexport type shouldTrackEvent = (actionType: ActionType, element: Element) => boolean;\n\nexport const isElementPointerCursor = (element: Element, actionType: ActionType): boolean => {\n /* istanbul ignore next */\n const computedStyle = window?.getComputedStyle?.(element);\n /* istanbul ignore next */\n return computedStyle?.getPropertyValue('cursor') === 'pointer' && actionType === 'click';\n};\n\nexport const createShouldTrackEvent = (\n autocaptureOptions: ElementInteractionsOptions,\n allowlist: string[], // this can be any type of css selector allow list\n isAlwaysCaptureCursorPointer = false,\n): shouldTrackEvent => {\n return (actionType: ActionType, element: Element) => {\n const { pageUrlAllowlist, pageUrlExcludelist, shouldTrackEventResolver } = autocaptureOptions;\n\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n // window, document, and Text nodes have no tag\n if (!tag) {\n return false;\n }\n\n if (shouldTrackEventResolver) {\n return shouldTrackEventResolver(actionType, element);\n }\n\n // check if the URL is in the allow list\n if (!isUrlMatchAllowlist(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n // check if the URL is in the excludelist\n if (\n pageUrlExcludelist &&\n pageUrlExcludelist.length > 0 &&\n isUrlMatchAllowlist(window.location.href, pageUrlExcludelist as (string | RegExp)[])\n ) {\n return false;\n }\n\n /* istanbul ignore next */\n const elementType = String(element?.getAttribute('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 const isCursorPointer = isElementPointerCursor(element, actionType);\n\n if (isAlwaysCaptureCursorPointer && isCursorPointer) {\n return true;\n }\n\n /* istanbul ignore if */\n if (allowlist) {\n const hasMatchAnyAllowedSelector = allowlist.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 /* istanbul ignore next */\n if (isCursorPointer) {\n return true;\n }\n return actionType === 'click';\n }\n }\n };\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 =\n element instanceof HTMLElement ? element.getAttribute('contenteditable')?.toLowerCase() === 'true' : false;\n\n return !SENSITIVE_TAGS.includes(tag) && !isContentEditable;\n};\n\n/**\n * Collects redacted attribute names from element and ancestor elements with data-amp-mask-attributes\n * The 'id' and 'class' attributes cannot be redacted as they're critical for element identification\n * @param element - The target element to check for redaction attributes\n * @returns Set of attribute names that should be redacted\n */\n/**\n * Parses a comma-separated string of attribute names and filters out protected attributes\n * @param attributeString - Comma-separated string of attribute names\n * @returns Array of valid attribute names, excluding 'id' and 'class'\n */\nexport const parseAttributesToMask = (attributeString: string | null): string[] => {\n return attributeString\n ? attributeString\n .split(',')\n .map((attr) => attr.trim())\n .filter((attr) => attr.length > 0 && attr !== 'id' && attr !== 'class') // Prevent 'id' and 'class' from being redacted as they're critical for element identification\n : [];\n};\n\nexport const extractPrefixedAttributes = (\n attrs: { [key: string]: string },\n prefix: string,\n): { [key: string]: string } => {\n return Object.entries(attrs).reduce((attributes: { [key: string]: string }, [attributeName, attributeValue]) => {\n if (attributeName.startsWith(prefix)) {\n const attributeKey = attributeName.replace(prefix, '');\n\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 }): { [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 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 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\nexport const filterOutNonTrackableEvents = (event: ElementBasedTimestampedEvent<ElementBasedEvent>): boolean => {\n // Filter out changeEvent events with no target\n // This could happen when change events are triggered programmatically\n if (event.event.target === null || !event.closestTrackedAncestor) {\n return false;\n }\n\n return true;\n};\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\n// Base TimestampedEvent type\nexport type BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation';\n};\n\n// Specific types for events with targetElementProperties\nexport type ElementBasedEvent = MouseEvent | Event;\nexport type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {\n event: MouseEvent | Event;\n type: 'click' | 'change';\n closestTrackedAncestor: Element;\n targetElementProperties: Record<string, any>;\n};\n\nexport type evaluateTriggersFn = (\n event: ElementBasedTimestampedEvent<ElementBasedEvent>,\n) => ElementBasedTimestampedEvent<ElementBasedEvent>;\n\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\n// Type predicate\nexport function isElementBasedEvent<T>(event: BaseTimestampedEvent<T>): event is ElementBasedTimestampedEvent<T> {\n return event.type === 'click' || event.type === 'change';\n}\n\nexport interface NavigateEvent extends Event {\n readonly navigationType: 'reload' | 'push' | 'replace' | 'traverse';\n readonly destination: {\n readonly url: string;\n readonly key: string | null;\n readonly id: string | null;\n readonly index: number;\n readonly sameDocument: boolean;\n\n getState(): any;\n };\n readonly canIntercept: boolean;\n readonly userInitiated: boolean;\n readonly hashChange: boolean;\n readonly signal: AbortSignal;\n readonly formData: FormData | null;\n readonly downloadRequest: string | null;\n readonly info: any;\n readonly hasUAVisualTransition: boolean;\n /** @see https://github.com/WICG/navigation-api/pull/264 */\n readonly sourceElement: Element | null;\n\n scroll(): void;\n}\n","import { isNonSensitiveElement } from './helpers';\nimport { DATA_AMP_MASK_ATTRIBUTES } from './constants';\nimport type { HierarchyNode } from './typings/autocapture';\nimport * as constants from './constants';\nimport { MASKED_TEXT_VALUE, TEXT_MASK_ATTRIBUTE } from '@amplitude/analytics-core';\n\nconst BLOCKED_ATTRIBUTES = new Set([\n // Already captured elsewhere in the hierarchy object\n 'id',\n 'class',\n\n // non-useful and potentially large attribute\n 'style',\n\n // sensitive as prefilled form data may populate this attribute\n 'value',\n\n // DOM events\n 'onclick',\n 'onchange',\n 'oninput',\n 'onblur',\n 'onsubmit',\n 'onfocus',\n 'onkeydown',\n 'onkeyup',\n 'onkeypress',\n\n // React specific\n 'data-reactid',\n 'data-react-checksum',\n 'data-reactroot',\n\n // Amplitude specific - used for redaction but should not be included in getElementProperties\n DATA_AMP_MASK_ATTRIBUTES,\n TEXT_MASK_ATTRIBUTE,\n]);\nconst SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST = ['type'];\n\nconst SVG_TAGS = ['svg', 'path', 'g'];\nconst HIGHLY_SENSITIVE_INPUT_TYPES = ['password', 'hidden'];\nexport const MAX_HIERARCHY_LENGTH = 1024;\n\nexport function getElementProperties(\n element: Element | null,\n userMaskedAttributeNames: Set<string>,\n): HierarchyNode | null {\n if (element === null) {\n return null;\n }\n\n const tagName = String(element.tagName).toLowerCase();\n const properties: HierarchyNode = {\n tag: tagName,\n };\n\n const siblings = Array.from(element.parentElement?.children ?? []);\n if (siblings.length) {\n properties.index = siblings.indexOf(element);\n properties.indexOfType = siblings.filter((el) => el.tagName === element.tagName).indexOf(element);\n }\n\n const prevSiblingTag = element.previousElementSibling?.tagName?.toLowerCase();\n if (prevSiblingTag) {\n properties.prevSib = String(prevSiblingTag);\n }\n\n const id = element.getAttribute('id');\n if (id) {\n properties.id = String(id);\n }\n\n const classes = Array.from(element.classList);\n if (classes.length) {\n properties.classes = classes;\n }\n\n const attributes: Record<string, string> = {};\n const attributesArray = Array.from(element.attributes);\n const filteredAttributes = attributesArray.filter((attr) => !BLOCKED_ATTRIBUTES.has(attr.name));\n const isSensitiveElement = !isNonSensitiveElement(element);\n\n // if input is hidden or password or for SVGs, skip attribute collection entirely\n if (!HIGHLY_SENSITIVE_INPUT_TYPES.includes(String(element.getAttribute('type'))) && !SVG_TAGS.includes(tagName)) {\n for (const attr of filteredAttributes) {\n // If sensitive element, only allow certain attributes\n if (isSensitiveElement && !SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST.includes(attr.name)) {\n continue;\n }\n\n if (userMaskedAttributeNames.has(attr.name)) {\n attributes[attr.name] = MASKED_TEXT_VALUE;\n continue;\n }\n\n // Finally cast attribute value to string and limit attribute value length\n attributes[attr.name] = String(attr.value).substring(0, constants.MAX_ATTRIBUTE_LENGTH);\n }\n }\n\n if (Object.keys(attributes).length) {\n properties.attrs = attributes;\n }\n\n return properties;\n}\n\nexport function getAncestors(targetEl: Element | null): Element[] {\n const ancestors: Element[] = [];\n\n if (!targetEl) {\n return ancestors;\n }\n\n // Add self to the list of ancestors\n ancestors.push(targetEl);\n let current = targetEl.parentElement;\n while (current && current.tagName !== 'HTML') {\n ancestors.push(current);\n current = current.parentElement;\n }\n return ancestors;\n}\n","import type { DataSource, PageAction } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport type { DataExtractor } from '../data-extractor';\nimport type { ElementBasedTimestampedEvent, ElementBasedEvent } from '../helpers';\n\n// Get DataSource\n/**\n * Gets the DOM element specified by the data source configuration\n * @param dataSource - Configuration for finding the target element\n * @param contextElement - The element to start searching from\n * @returns The matching DOM element or undefined if not found\n */\nexport const getDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Only process DOM_ELEMENT type data sources\n try {\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n // If scope is specified, find the closest ancestor matching the scope rather than using documentElement (html) as the scope\n let scopingElement: HTMLElement | null = document.documentElement;\n if (dataSource.scope && contextElement) {\n scopingElement = contextElement.closest(dataSource.scope);\n }\n\n // If we have both a scope and selector, find the matching element\n if (scopingElement && dataSource.selector) {\n return scopingElement.querySelector(dataSource.selector);\n }\n\n // Return scopingElement if no selector was specified\n return scopingElement;\n }\n } catch (error) {\n return undefined;\n }\n\n // Return undefined for non-DOM_ELEMENT data sources\n return undefined;\n};\n\n// Execute actions for a condition and attach event properties to the event if needed\nexport const executeActions = (\n actions: (string | PageAction)[],\n ev: ElementBasedTimestampedEvent<ElementBasedEvent>,\n dataExtractor: DataExtractor,\n) => {\n actions.forEach((action) => {\n // Skip if actions is string until action set is implemented\n if (typeof action === 'string') {\n return;\n }\n\n if (action.actionType === 'ATTACH_EVENT_PROPERTY') {\n const data = dataExtractor.extractDataFromDataSource(action.dataSource, ev.closestTrackedAncestor as HTMLElement);\n\n // Attach data to event\n ev.targetElementProperties[action.destinationKey] = data;\n }\n });\n};\n","/* eslint-disable no-restricted-globals */\nimport {\n ElementInteractionsOptions,\n ActionType,\n getDecodeURI,\n IDiagnosticsClient,\n MASKED_TEXT_VALUE,\n TEXT_MASK_ATTRIBUTE,\n getPageTitle,\n replaceSensitiveString,\n} from '@amplitude/analytics-core';\nimport type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport * as constants from './constants';\nimport {\n removeEmptyProperties,\n extractPrefixedAttributes,\n isElementPointerCursor,\n getClosestElement,\n isElementBasedEvent,\n parseAttributesToMask,\n} from './helpers';\nimport type { BaseTimestampedEvent, ElementBasedTimestampedEvent, TimestampedEvent, JSONValue } from './helpers';\nimport { getAncestors, getElementProperties } from './hierarchy';\nimport { getDataSource } from './pageActions/actions';\nimport { Hierarchy } from './typings/autocapture';\n\nexport class DataExtractor {\n private readonly additionalMaskTextPatterns: RegExp[];\n diagnosticsClient?: IDiagnosticsClient;\n\n constructor(options: ElementInteractionsOptions, context?: { diagnosticsClient: IDiagnosticsClient }) {\n this.diagnosticsClient = context?.diagnosticsClient;\n\n const rawPatterns = options.maskTextRegex ?? [];\n\n const compiled: RegExp[] = [];\n for (const entry of rawPatterns) {\n if (compiled.length >= constants.MAX_MASK_TEXT_PATTERNS) {\n break;\n }\n if (entry instanceof RegExp) {\n compiled.push(entry);\n } else if ('pattern' in entry && typeof entry.pattern === 'string') {\n try {\n compiled.push(new RegExp(entry.pattern, 'i'));\n } catch {\n // ignore invalid pattern strings\n }\n }\n }\n this.additionalMaskTextPatterns = compiled;\n }\n\n /**\n * Wrapper method to replace sensitive strings using the helper function\n * @param text - The text to search for sensitive data\n * @returns The text with sensitive data replaced by masked text\n */\n replaceSensitiveString = (text: string | null): string => {\n return replaceSensitiveString(text, this.additionalMaskTextPatterns);\n };\n\n // Get the DOM hierarchy of the element, starting from the target element to the root element.\n getHierarchy = (element: Element | null): Hierarchy => {\n const startTime = performance.now();\n\n let hierarchy: Hierarchy = [];\n if (!element) {\n return [];\n }\n\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n const ancestors = getAncestors(element);\n\n // Build attributes to mask map\n const elementToAttributesToMaskMap = new Map<Element, Set<string>>();\n\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const node = ancestors[i];\n if (node) {\n const attributesToMask = parseAttributesToMask(node.getAttribute(constants.DATA_AMP_MASK_ATTRIBUTES));\n const ancestorAttributesToMask =\n i === ancestors.length - 1 ? [] : elementToAttributesToMaskMap.get(ancestors[i + 1]) ?? new Set<string>();\n const combinedAttributesToMask = new Set([...ancestorAttributesToMask, ...attributesToMask]);\n elementToAttributesToMaskMap.set(node, combinedAttributesToMask);\n }\n }\n\n hierarchy = ancestors.map((el) =>\n getElementProperties(el, elementToAttributesToMaskMap.get(el) ?? new Set<string>()),\n );\n\n // Search for and mask any sensitive attribute values\n for (const hierarchyNode of hierarchy) {\n if (hierarchyNode?.attrs) {\n Object.entries(hierarchyNode.attrs).forEach(([key, value]) => {\n if (hierarchyNode.attrs) {\n hierarchyNode.attrs[key] = this.replaceSensitiveString(value);\n }\n });\n }\n }\n\n const endTime = performance.now();\n this.diagnosticsClient?.recordHistogram('autocapturePlugin.getHierarchy', endTime - startTime);\n\n return hierarchy;\n };\n\n getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement: Element | null;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n return this.getText(labelElement);\n }\n return this.getNearestLabel(parent);\n };\n\n // Returns the Amplitude event properties for the given element.\n getEventProperties = (actionType: ActionType, element: Element, dataAttributePrefix: string) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n /* istanbul ignore next */\n const rect =\n typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n\n const hierarchy = this.getHierarchy(element);\n const currentElementAttributes = hierarchy[0]?.attrs;\n const nearestLabel = this.getNearestLabel(element);\n const attributes = extractPrefixedAttributes(currentElementAttributes ?? {}, dataAttributePrefix);\n\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: hierarchy,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT]: rect.left == null ? null : Math.round(rect.left),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP]: rect.top == null ? null : Math.round(rect.top),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: getDecodeURI(window.location.href.split('?')[0]),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]: (\n getPageTitle as (parseTitleFunction: (title: string) => string) => string\n )(this.replaceSensitiveString),\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n\n // id is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '';\n\n // class is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.getAttribute('class');\n\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = currentElementAttributes?.['aria-label'];\n\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n const href = element.href.substring(0, constants.MAX_ATTRIBUTE_LENGTH);\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = this.replaceSensitiveString(href); // we don't use hierarchy here because we don't want href value to be changed\n }\n\n return removeEmptyProperties(properties);\n };\n\n addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\n // capture the event if the cursor is a \"pointer\" when this element is clicked on\n // reason: a \"pointer\" cursor indicates that an element should be interactable\n // regardless of the element's tag name\n isCapturingCursorPointer = false,\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n if (isCapturingCursorPointer) {\n const isCursorPointer = isElementPointerCursor(baseEvent.event.target as Element, baseEvent.type);\n if (isCursorPointer) {\n baseEvent.closestTrackedAncestor = baseEvent.event.target as HTMLElement;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n baseEvent.closestTrackedAncestor,\n dataAttributePrefix,\n );\n return baseEvent;\n }\n }\n // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(baseEvent.event.target as HTMLElement, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n };\n\n extractDataFromDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Extract from DOM Element\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n const sourceElement = getDataSource(dataSource, contextElement);\n if (!sourceElement) {\n return undefined;\n }\n\n if (dataSource.elementExtractType === 'TEXT') {\n return this.getText(sourceElement);\n } else if (dataSource.elementExtractType === 'ATTRIBUTE' && dataSource.attribute) {\n return sourceElement.getAttribute(dataSource.attribute);\n }\n return undefined;\n }\n\n // TODO: Extract from other source types\n return undefined;\n };\n\n getText = (element: Element): string => {\n // Check if element or any parent has data-amp-mask attribute\n const hasMaskAttribute = element.closest(`[${TEXT_MASK_ATTRIBUTE}]`) !== null;\n if (hasMaskAttribute) {\n return MASKED_TEXT_VALUE;\n }\n let output = '';\n if (!element.querySelector(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`)) {\n output = (element as HTMLElement).innerText || '';\n } else {\n const clonedTree = element.cloneNode(true) as HTMLElement;\n // replace all elements with TEXT_MASK_ATTRIBUTE attribute and contenteditable with the text MASKED_TEXT_VALUE\n clonedTree.querySelectorAll(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`).forEach((node) => {\n (node as HTMLElement).innerText = MASKED_TEXT_VALUE;\n });\n output = clonedTree.innerText || '';\n }\n return this.replaceSensitiveString(output.substring(0, 255)).replace(/\\s+/g, ' ').trim();\n };\n\n // Returns the element properties for the given element in Visual Labeling.\n getEventTagProps = (element: Element): Record<string, JSONValue> => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties) as Record<string, JSONValue>;\n };\n}\n","/* 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 } from '../helpers';\nimport { ILogger, Messenger, ActionType } from '@amplitude/analytics-core';\nimport { VERSION } from '../version';\nimport { DataExtractor } from '../data-extractor';\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] Page URL'?: string;\n elementScreenshot?: Blob;\n}\n\ninterface TrackSelectorModeChangedData {\n newMode: string;\n pageUrl?: string;\n}\n\ninterface TrackSelectorMovedData {\n newEditorLocation: string;\n pageUrl?: string;\n}\n\nexport type ActionData = {\n ping: null | undefined;\n pong: null | undefined;\n 'page-loaded': null | undefined;\n 'selector-loaded': null | undefined;\n 'initialize-visual-tagging-selector': InitializeVisualTaggingSelectorData | null | undefined;\n 'close-visual-tagging-selector': null | undefined;\n 'element-selected': ElementSelectedData;\n 'track-selector-mode-changed': TrackSelectorModeChangedData;\n 'track-selector-moved': TrackSelectorMovedData;\n};\n\nexport interface Message<A extends Action> {\n action: A;\n data?: ActionData[A];\n}\n\ntype MessageRequest = {\n id: string;\n action: string;\n args: Record<string, any>;\n};\n\ntype MessageResponse = {\n id: string;\n action: string;\n responseData: any;\n};\n\n// TODO: use MessageChannel instead of window.postMessage\nexport class WindowMessenger implements Messenger {\n endpoint = AMPLITUDE_ORIGIN;\n logger?: ILogger;\n requestCallbacks: {\n [id: string]: {\n resolve: (data: any) => void;\n reject: (data: any) => void;\n };\n } = {};\n\n constructor({ origin = AMPLITUDE_ORIGIN }: { origin?: string } = {}) {\n this.endpoint = origin;\n }\n\n private notify(message: Message<Action> | MessageRequest) {\n this.logger?.debug?.('Message sent: ', JSON.stringify(message));\n (window.opener as WindowProxy)?.postMessage?.(message, this.endpoint);\n }\n\n // Send an async request to the parent window\n public sendRequest(action: string, args: Record<string, any>, options = { timeout: 15_000 }): Promise<any> {\n // Create Request ID\n const id = generateUniqueId();\n const request = {\n id,\n action,\n args,\n };\n\n // Create a Promise that will be resolved when the response is received\n const promise = new Promise((resolve, reject) => {\n this.requestCallbacks[id] = { resolve, reject };\n\n // Send the request\n this.notify(request);\n\n // Handle request timeouts\n if (options?.timeout > 0) {\n setTimeout(() => {\n reject(new Error(`${action} timed out (id: ${id})`));\n delete this.requestCallbacks[id];\n }, options.timeout);\n }\n });\n\n return promise;\n }\n\n // Handle messages from the parent window\n private handleResponse(response: MessageResponse) {\n if (!this.requestCallbacks[response.id]) {\n this.logger?.warn(`No callback found for request id: ${response.id}`);\n return;\n }\n\n this.requestCallbacks[response.id].resolve(response.responseData);\n delete this.requestCallbacks[response.id];\n }\n\n setup(\n {\n logger,\n endpoint,\n isElementSelectable,\n cssSelectorAllowlist,\n actionClickAllowlist,\n dataExtractor,\n }: {\n logger?: ILogger;\n endpoint?: string;\n isElementSelectable?: (action: InitializeVisualTaggingSelectorData['actionType'], element: Element) => boolean;\n cssSelectorAllowlist?: string[];\n actionClickAllowlist?: string[];\n dataExtractor: DataExtractor;\n } = { dataExtractor: new DataExtractor({}) },\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: dataExtractor.getEventTagProps,\n isElementSelectable: (element: Element) => {\n if (isElementSelectable) {\n return isElementSelectable(actionData?.actionType || 'click', element);\n }\n return true;\n },\n onTrack: this.onTrack,\n onSelect: this.onSelect,\n visualHighlightClass: AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n messenger: this,\n cssSelectorAllowlist,\n actionClickAllowlist,\n extractDataFromDataSource: dataExtractor.extractDataFromDataSource,\n dataExtractor,\n diagnostics: {\n autocapture: {\n version: VERSION,\n },\n },\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","import { Observable, getGlobalScope } from '@amplitude/analytics-core';\n\nexport const createMutationObservable = (): Observable<MutationRecord[]> => {\n return new Observable<MutationRecord[]>((observer) => {\n const mutationObserver = new MutationObserver((mutations) => {\n observer.next(mutations);\n });\n if (document.body) {\n mutationObserver.observe(document.body, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n });\n }\n return () => mutationObserver.disconnect();\n });\n};\n\n/**\n * Creates an observable that tracks click events on the document.\n * @param clickType - The type of click event to track (click or pointerdown)\n */\nexport const createClickObservable = (\n clickType: 'click' | 'pointerdown' = 'click',\n): Observable<MouseEvent | PointerEvent> => {\n return new Observable<MouseEvent | PointerEvent>((observer) => {\n const handler = (event: MouseEvent | PointerEvent) => {\n observer.next(event);\n };\n /* istanbul ignore next */\n getGlobalScope()?.document.addEventListener(clickType, handler, { capture: true });\n return () => {\n /* istanbul ignore next */\n getGlobalScope()?.document.removeEventListener(clickType, handler, { capture: true });\n };\n });\n};\n","/* eslint-disable no-restricted-globals */\nimport {\n type BrowserClient,\n type BrowserConfig,\n type EnrichmentPlugin,\n type ElementInteractionsOptions,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n IDiagnosticsClient,\n getGlobalScope,\n multicast,\n} from '@amplitude/analytics-core';\nimport { VERSION } from './version';\nimport * as constants from './constants';\nimport {\n createShouldTrackEvent,\n type ElementBasedTimestampedEvent,\n type TimestampedEvent,\n type NavigateEvent,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport { createClickObservable, createMutationObservable } from './observables';\n\nimport {\n createLabeledEventToTriggerMap,\n createTriggerEvaluator,\n groupLabeledEventIdsByEventType,\n} from './pageActions/triggers';\nimport { DataExtractor } from './data-extractor';\nimport { Observable, Unsubscribable } from '@amplitude/analytics-core';\n\ntype NavigationType = {\n addEventListener: (type: string, listener: EventListenerOrEventListenerObject) => void;\n removeEventListener: (type: string, listener: EventListenerOrEventListenerObject) => void;\n};\n\ndeclare global {\n interface Window {\n navigation: NavigationType;\n }\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport enum ObservablesEnum {\n ClickObservable = 'clickObservable',\n ChangeObservable = 'changeObservable',\n // ErrorObservable = 'errorObservable',\n NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n}\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;\n // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n [ObservablesEnum.NavigateObservable]?: Observable<TimestampedEvent<NavigateEvent>>;\n}\n\nexport const autocapturePlugin = (\n options: ElementInteractionsOptions = {},\n context?: { diagnosticsClient: IDiagnosticsClient },\n): BrowserEnrichmentPlugin => {\n // Set the plugin version tag\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n context?.diagnosticsClient.setTag('plugin.autocapture.version', VERSION);\n\n const {\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0;\n\n options.pageUrlExcludelist = options.pageUrlExcludelist?.reduce(\n (acc: (string | RegExp | { pattern: string })[], excludePattern) => {\n if (typeof excludePattern === 'string') {\n acc.push(excludePattern);\n }\n if (excludePattern instanceof RegExp) {\n acc.push(excludePattern);\n }\n if (typeof excludePattern === 'object' && excludePattern !== null && 'pattern' in excludePattern) {\n try {\n acc.push(new RegExp(excludePattern.pattern));\n } catch (regexError) {\n console.warn(`Invalid regex pattern: ${excludePattern.pattern}`, regexError);\n return acc;\n }\n }\n return acc;\n },\n [],\n );\n\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Unsubscribable[] = [];\n\n // Create data extractor based on options\n const dataExtractor = new DataExtractor(options, context);\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n const clickObservable = multicast(\n createClickObservable().map(\n (click) =>\n dataExtractor.addAdditionalEventProperties(\n click,\n 'click',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ) as ElementBasedTimestampedEvent<MouseEvent>,\n ),\n );\n\n const changeObservable = multicast(\n new Observable<ElementBasedTimestampedEvent<Event>>((observer) => {\n const handler = (changeEvent: Event) => {\n const enrichedChangeEvent = dataExtractor.addAdditionalEventProperties(\n changeEvent,\n 'change',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ) as ElementBasedTimestampedEvent<Event>;\n observer.next(enrichedChangeEvent);\n };\n /* istanbul ignore next */\n getGlobalScope()?.document.addEventListener('change', handler, { capture: true });\n /* istanbul ignore next */\n return () => getGlobalScope()?.document.removeEventListener('change', handler);\n }),\n );\n\n // Create Observable from unhandled errors\n // const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(\n // map((error) => addAdditionalEventProperties(error, 'error')),\n // );\n\n // Create observable for URL changes\n let navigateObservable: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = multicast(\n new Observable<TimestampedEvent<NavigateEvent>>((observer) => {\n const handler = (navigateEvent: NavigateEvent) => {\n const enrichedNavigateEvent = dataExtractor.addAdditionalEventProperties(\n navigateEvent,\n 'navigate',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n );\n observer.next(enrichedNavigateEvent);\n };\n window.navigation.addEventListener('navigate', handler as EventListener);\n return () => {\n window.navigation.removeEventListener('navigate', handler as EventListener);\n };\n }),\n );\n }\n\n const mutationObservable = multicast(\n createMutationObservable().map((mutation) =>\n dataExtractor.addAdditionalEventProperties(\n mutation,\n 'mutation',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n );\n\n return {\n [ObservablesEnum.ChangeObservable]: changeObservable,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n [ObservablesEnum.ClickObservable]: clickObservable,\n [ObservablesEnum.MutationObservable]: mutationObservable,\n [ObservablesEnum.NavigateObservable]: navigateObservable,\n };\n };\n\n // Group labeled events by event type (eg. click, change)\n let groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions?.labeledEvents ?? {}));\n\n let labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions?.triggers ?? []);\n\n // Evaluate triggers for the given event by running the actions associated with the matching triggers\n const evaluateTriggers = createTriggerEvaluator(\n groupedLabeledEvents,\n labeledEventToTriggerMap,\n dataExtractor,\n options,\n );\n\n // Function to recalculate internal variables when remote config is updated\n const recomputePageActionsData = (remotePageActions: ElementInteractionsOptions['pageActions']) => {\n if (remotePageActions) {\n // Merge remote config with local options\n options.pageActions = {\n ...options.pageActions,\n ...remotePageActions,\n };\n\n // Recalculate internal variables\n groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions.labeledEvents ?? {}));\n labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions.triggers ?? []);\n\n // Update evaluateTriggers function\n evaluateTriggers.update(groupedLabeledEvents, labeledEventToTriggerMap, options);\n }\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Fetch remote config for pageActions in a non-blocking manner\n if (config.fetchRemoteConfig) {\n if (!config.remoteConfigClient) {\n // TODO(xinyi): Diagnostics.recordEvent\n config.loggerProvider.debug('Remote config client is not provided, skipping remote config fetch');\n } else {\n config.remoteConfigClient.subscribe('analyticsSDK.pageActions', 'all', (remoteConfig) => {\n recomputePageActionsData(remoteConfig as ElementInteractionsOptions['pageActions']);\n });\n }\n }\n\n // Create should track event functions the different allowlists\n const shouldTrackEvent = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n const shouldTrackActionClick = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist,\n );\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions\n const clickTrackingSubscription = trackClicks({\n allObservables,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n if (actionClickSubscription) {\n subscriptions.push(actionClickSubscription);\n }\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n dataExtractor: dataExtractor,\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n","import type { ElementInteractionsOptions, LabeledEvent, Trigger } from '@amplitude/analytics-core';\nimport type { ElementBasedTimestampedEvent, ElementBasedEvent } from 'src/helpers';\nimport { matchEventToFilter } from './matchEventToFilter';\nimport { executeActions } from './actions';\nimport type { DataExtractor } from '../data-extractor';\n\nconst eventTypeToBrowserEventMap = {\n '[Amplitude] Element Clicked': 'click',\n '[Amplitude] Element Changed': 'change',\n} as const;\n// groups labeled events by event type\n// skips any labeled events with malformed definitions or unexpected event_type\nexport const groupLabeledEventIdsByEventType = (labeledEvents: LabeledEvent[] | null | undefined) => {\n // Initialize all event types with empty sets\n const groupedLabeledEvents = Object.values(eventTypeToBrowserEventMap).reduce((acc, browserEvent) => {\n acc[browserEvent] = new Set<string>();\n return acc;\n }, {} as Record<string, Set<string>>);\n\n // If there are no labeled events, return the initialized groupedLabeledEvents\n if (!labeledEvents) {\n return groupedLabeledEvents;\n }\n\n // Group labeled events by event type\n for (const le of labeledEvents) {\n try {\n for (const def of le.definition) {\n const browserEvent = eventTypeToBrowserEventMap[def.event_type];\n if (browserEvent) {\n groupedLabeledEvents[browserEvent].add(le.id);\n }\n }\n } catch (e) {\n // Skip this labeled event if there is an error\n console.warn('Skipping Labeled Event due to malformed definition', le?.id, e);\n }\n }\n return groupedLabeledEvents;\n};\n\n// TODO: add tests\nexport const createLabeledEventToTriggerMap = (triggers: Trigger[]) => {\n const labeledEventToTriggerMap = new Map<string, Trigger[]>();\n for (const trigger of triggers) {\n for (const condition of trigger.conditions) {\n if (condition.type === 'LABELED_EVENT') {\n const eventId = condition.match.eventId;\n // Get existing triggers for this event ID or initialize empty array\n let existingTriggers = labeledEventToTriggerMap.get(eventId);\n if (!existingTriggers) {\n existingTriggers = [];\n labeledEventToTriggerMap.set(eventId, existingTriggers);\n }\n // Add current trigger to the list of triggers for this event ID\n existingTriggers.push(trigger);\n }\n }\n }\n return labeledEventToTriggerMap;\n};\n\n/**\n * Matches an event to labeled events based on the event's properties.\n * The logic matches exactly what is supported by the query backend.\n * TODO: later pre-filter the labeled events based on URL first\n *\n * @param event - The event to match against labeled events\n * @param labeledEvents - Array of labeled events to match against\n * @returns Array of matching labeled events\n */\nexport const matchEventToLabeledEvents = (\n event: ElementBasedTimestampedEvent<ElementBasedEvent>,\n labeledEvents: LabeledEvent[],\n) => {\n return labeledEvents.filter((le) => {\n return le.definition.some((def) => {\n return (\n eventTypeToBrowserEventMap[def.event_type] === event.type &&\n def.filters.every((filter) => matchEventToFilter(event, filter))\n );\n });\n });\n};\n\nexport const matchLabeledEventsToTriggers = (labeledEvents: LabeledEvent[], leToTriggerMap: Map<string, Trigger[]>) => {\n const matchingTriggers = new Set<Trigger>();\n for (const le of labeledEvents) {\n const triggers = leToTriggerMap.get(le.id);\n if (triggers) {\n for (const trigger of triggers) {\n matchingTriggers.add(trigger);\n }\n }\n }\n return Array.from(matchingTriggers);\n};\n\nexport class TriggerEvaluator {\n constructor(\n private groupedLabeledEvents: ReturnType<typeof groupLabeledEventIdsByEventType>,\n private labeledEventToTriggerMap: ReturnType<typeof createLabeledEventToTriggerMap>,\n private dataExtractor: DataExtractor,\n private options: ElementInteractionsOptions,\n ) {}\n\n evaluate(event: ElementBasedTimestampedEvent<ElementBasedEvent>) {\n // If there is no pageActions, return the event as is\n const { pageActions } = this.options;\n if (!pageActions) {\n return event;\n }\n\n // Find matching labeled events\n const matchingLabeledEvents = matchEventToLabeledEvents(\n event,\n Array.from(this.groupedLabeledEvents[event.type]).map((id) => pageActions.labeledEvents[id]),\n );\n // Find matching conditions\n const matchingTriggers = matchLabeledEventsToTriggers(matchingLabeledEvents, this.labeledEventToTriggerMap);\n for (const trigger of matchingTriggers) {\n executeActions(trigger.actions, event, this.dataExtractor);\n }\n\n return event;\n }\n\n update(\n groupedLabeledEvents: ReturnType<typeof groupLabeledEventIdsByEventType>,\n labeledEventToTriggerMap: ReturnType<typeof createLabeledEventToTriggerMap>,\n options: ElementInteractionsOptions,\n ) {\n this.groupedLabeledEvents = groupedLabeledEvents;\n this.labeledEventToTriggerMap = labeledEventToTriggerMap;\n this.options = options;\n }\n}\n\nexport const createTriggerEvaluator = (\n groupedLabeledEvents: ReturnType<typeof groupLabeledEventIdsByEventType>,\n labeledEventToTriggerMap: ReturnType<typeof createLabeledEventToTriggerMap>,\n dataExtractor: DataExtractor,\n options: ElementInteractionsOptions,\n) => {\n return new TriggerEvaluator(groupedLabeledEvents, labeledEventToTriggerMap, dataExtractor, options);\n};\n","import type { Filter } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport { ElementBasedTimestampedEvent, ElementBasedEvent } from 'src/helpers';\n\n/**\n * Matches an event to a single filter\n * @param event - The event to match\n * @param filter - The filter to match against\n * @returns boolean indicating if the event matches the filter\n */\nexport const matchEventToFilter = (event: ElementBasedTimestampedEvent<ElementBasedEvent>, filter: Filter) => {\n try {\n if (filter.subprop_key === '[Amplitude] Element Text') {\n // TODO: add support for the other operators\n return (\n filter.subprop_op === 'is' &&\n filter.subprop_value.includes(event.targetElementProperties['[Amplitude] Element Text'] as string)\n );\n } else if (filter.subprop_key === '[Amplitude] Element Hierarchy') {\n // Check if the element ancestory matches the CSS selector, always check this last since it is the most expensive\n return (\n filter.subprop_op === 'autotrack css match' &&\n !!event.closestTrackedAncestor.closest(filter.subprop_value.toString())\n );\n }\n } catch (error) {\n console.error('Error matching event to filter', error);\n return false;\n }\n return false;\n};\n","import { AllWindowObservables } from 'src/autocapture-plugin';\nimport { type evaluateTriggersFn } from 'src/helpers';\nimport { Observable, BrowserClient } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nexport function trackClicks({\n amplitude,\n allObservables,\n shouldTrackEvent,\n evaluateTriggers,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n shouldTrackEvent: shouldTrackEvent;\n evaluateTriggers: evaluateTriggersFn;\n}) {\n const { clickObservable } = allObservables;\n\n const clickObservableFiltered = clickObservable\n .filter(filterOutNonTrackableEvents)\n .filter((click) => {\n // Only track clicks on elements that should be tracked,\n return shouldTrackEvent('click', click.closestTrackedAncestor);\n })\n .map((click) => evaluateTriggers(click));\n\n const clicks: Observable<typeof clickObservableFiltered extends Observable<infer U> ? U : never> =\n clickObservableFiltered;\n\n return clicks.subscribe((click) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CLICKED_EVENT, click.targetElementProperties);\n });\n}\n","import { AllWindowObservables } from 'src/autocapture-plugin';\nimport { ElementBasedTimestampedEvent, type evaluateTriggersFn } from 'src/helpers';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CHANGED_EVENT } from '../constants';\n\nexport function trackChange({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackEvent,\n evaluateTriggers,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackEvent: shouldTrackEvent;\n evaluateTriggers: evaluateTriggersFn;\n}) {\n const { changeObservable } = allObservables;\n\n const filteredChangeObservable = changeObservable\n .filter(filterOutNonTrackableEvents)\n .filter((changeEvent: ElementBasedTimestampedEvent<Event>) => {\n // Only track change on elements that should be tracked,\n return shouldTrackEvent('change', changeEvent.closestTrackedAncestor);\n })\n .map((changeEvent) => evaluateTriggers(changeEvent));\n\n return filteredChangeObservable.subscribe((changeEvent) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', changeEvent.closestTrackedAncestor));\n });\n}\n","import { AllWindowObservables, AutoCaptureOptionsWithDefaults } from 'src/autocapture-plugin';\nimport { BrowserClient, ActionType, merge, asyncMap } from '@amplitude/analytics-core';\nimport {\n ElementBasedTimestampedEvent,\n filterOutNonTrackableEvents,\n getClosestElement,\n shouldTrackEvent,\n TimestampedEvent,\n} from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nexport function trackActionClick({\n amplitude,\n allObservables,\n options,\n getEventProperties,\n shouldTrackEvent,\n shouldTrackActionClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n options: AutoCaptureOptionsWithDefaults;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackActionClick: shouldTrackEvent;\n shouldTrackEvent: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable } = allObservables;\n\n const filteredClickObservable = clickObservable\n .filter((click) => {\n return !shouldTrackEvent('click', click.closestTrackedAncestor);\n })\n .map((click) => {\n // overwrite the closestTrackedAncestor with the closest element that is on the actionClickAllowlist\n const closestActionClickEl = getClosestElement(click.event.target as Element, options.actionClickAllowlist);\n click.closestTrackedAncestor = closestActionClickEl as Element;\n\n // overwrite the targetElementProperties with the properties of the closestActionClickEl\n if (click.closestTrackedAncestor !== null) {\n click.targetElementProperties = getEventProperties(click.type, click.closestTrackedAncestor);\n }\n return click;\n })\n .filter(filterOutNonTrackableEvents)\n .filter((clickEvent) => {\n // Only track change on elements that should be tracked\n return shouldTrackActionClick('click', clickEvent.closestTrackedAncestor);\n });\n\n const mutationOrNavigate = navigateObservable ? merge(mutationObservable, navigateObservable) : mutationObservable;\n\n const clickMutationNavigateObservable = merge(filteredClickObservable, mutationOrNavigate);\n\n let actionClickTimer: ReturnType<typeof setTimeout> | null = null;\n let lastClickEvent: TimestampedEvent<any> | null = null;\n\n const actionClickObservable = asyncMap(clickMutationNavigateObservable, (event) => {\n // clear any previous timer\n if (actionClickTimer) {\n clearTimeout(actionClickTimer);\n actionClickTimer = null;\n }\n if (event.type === 'click') {\n // mark the 'last click event'\n lastClickEvent = event;\n\n // set a timer to clear last click event if no mutation event between now and 500ms\n actionClickTimer = setTimeout(() => {\n actionClickTimer = null;\n lastClickEvent = null;\n }, 500);\n return Promise.resolve(null);\n } else {\n // if mutation/navigation + last click event, then it's an action click\n if (lastClickEvent) {\n const event = lastClickEvent;\n lastClickEvent = null;\n return Promise.resolve(event);\n }\n }\n return Promise.resolve(null);\n });\n\n return actionClickObservable.subscribe((actionClick) => {\n if (!actionClick) return;\n /* istanbul ignore next */\n amplitude?.track(\n AMPLITUDE_ELEMENT_CLICKED_EVENT,\n getEventProperties('click', (actionClick as ElementBasedTimestampedEvent<MouseEvent>).closestTrackedAncestor),\n );\n });\n}\n","import { AllWindowObservables } from 'src/frustration-plugin';\nimport { BrowserClient, ActionType, merge, asyncMap } from '@amplitude/analytics-core';\nimport { ElementBasedTimestampedEvent, filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT } from '../constants';\nconst DEAD_CLICK_TIMEOUT = 3000; // 3 seconds to wait for an activity to happen\n\ntype EventDeadClick = {\n '[Amplitude] X': number;\n '[Amplitude] Y': number;\n};\n\nconst CHANGE_EVENTS = ['mutation', 'navigate'];\n\nexport function trackDeadClick({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackDeadClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackDeadClick: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable }: AllWindowObservables = allObservables;\n\n const filteredClickObservable = clickObservable.filter((click) => {\n return (\n filterOutNonTrackableEvents(click) &&\n shouldTrackDeadClick('click', click.closestTrackedAncestor) &&\n click.event.target instanceof Element &&\n click.event.target.closest('a[target=\"_blank\"]') === null\n );\n });\n\n /* istanbul ignore next */\n const changeObservables = navigateObservable ? merge(mutationObservable, navigateObservable) : mutationObservable;\n\n const clicksAndChangeObservable = merge(filteredClickObservable, changeObservables);\n\n let deadClickTimer: ReturnType<typeof setTimeout> | null = null;\n\n const deadClickObservable = asyncMap(\n clicksAndChangeObservable,\n (event): Promise<ElementBasedTimestampedEvent<MouseEvent> | null> => {\n if (deadClickTimer && CHANGE_EVENTS.includes(event.type)) {\n // a mutation or navigation means it's not a dead click, so clear the timer\n clearTimeout(deadClickTimer);\n deadClickTimer = null;\n return Promise.resolve(null);\n } else if (event.type === 'click') {\n // if a dead click is already on-deck, return null.\n // this throttles dead clicks events so no more than one dead click event\n // is tracked per every DEAD_CLICK_TIMEOUT ms.\n if (deadClickTimer) {\n return Promise.resolve(null);\n }\n return new Promise((resolve) => {\n deadClickTimer = setTimeout(() => {\n resolve(event as ElementBasedTimestampedEvent<MouseEvent>);\n deadClickTimer = null;\n }, DEAD_CLICK_TIMEOUT);\n });\n }\n // unreachable code, but needed to satisfy the type checker\n return Promise.resolve(null);\n },\n );\n\n return deadClickObservable.subscribe((actionClick) => {\n if (!actionClick) return;\n const deadClickEvent: EventDeadClick = {\n '[Amplitude] X': (actionClick.event as MouseEvent).clientX,\n '[Amplitude] Y': (actionClick.event as MouseEvent).clientY,\n };\n amplitude.track(\n AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT,\n {\n ...getEventProperties('click', actionClick.closestTrackedAncestor),\n ...deadClickEvent,\n },\n { time: actionClick.timestamp },\n );\n });\n}\n","import { AllWindowObservables } from 'src/frustration-plugin';\nimport {\n BrowserClient,\n asyncMap,\n DEFAULT_RAGE_CLICK_THRESHOLD,\n DEFAULT_RAGE_CLICK_WINDOW_MS,\n DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD,\n} from '@amplitude/analytics-core';\nimport { shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT } from '../constants';\n\nconst RAGE_CLICK_THRESHOLD = DEFAULT_RAGE_CLICK_THRESHOLD;\nconst RAGE_CLICK_WINDOW_MS = DEFAULT_RAGE_CLICK_WINDOW_MS;\nconst RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD = DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD;\n\ntype Click = {\n X: number;\n Y: number;\n Time: number;\n};\n\ntype EventRageClick = {\n '[Amplitude] Begin Time': string; // ISO-8601\n '[Amplitude] End Time': string; // ISO-8601\n '[Amplitude] Duration': number;\n '[Amplitude] Clicks': Array<Click>;\n '[Amplitude] Click Count': number;\n};\n\ntype ClickEvent = {\n event: MouseEvent | Event;\n timestamp: number;\n targetElementProperties: Record<string, any>;\n closestTrackedAncestor: Element | null;\n};\n\ntype ClickRegionBoundingBox = {\n yMin?: number;\n yMax?: number;\n xMin?: number;\n xMax?: number;\n isOutOfBounds?: boolean;\n};\n\ntype RageClickEvent = {\n rageClickEvent: EventRageClick;\n time: number;\n};\n\nfunction addCoordinates(regionBox: ClickRegionBoundingBox, click: ClickEvent) {\n const { clientX, clientY } = click.event as MouseEvent;\n regionBox.yMin = Math.min(regionBox.yMin ?? clientY, clientY);\n regionBox.yMax = Math.max(regionBox.yMax ?? clientY, clientY);\n regionBox.xMin = Math.min(regionBox.xMin ?? clientX, clientX);\n regionBox.xMax = Math.max(regionBox.xMax ?? clientX, clientX);\n regionBox.isOutOfBounds =\n regionBox.yMax - regionBox.yMin > RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD ||\n regionBox.xMax - regionBox.xMin > RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD;\n}\n\nfunction getRageClickAnalyticsEvent(clickWindow: ClickEvent[]) {\n /* istanbul ignore if */\n if (clickWindow.length === 0) {\n return null;\n }\n const firstClick = clickWindow[0];\n const lastClick = clickWindow[clickWindow.length - 1];\n\n const rageClickEvent: EventRageClick = {\n '[Amplitude] Begin Time': new Date(firstClick.timestamp).toISOString(),\n '[Amplitude] End Time': new Date(lastClick.timestamp).toISOString(),\n '[Amplitude] Duration': lastClick.timestamp - firstClick.timestamp,\n '[Amplitude] Clicks': clickWindow.map((click) => ({\n X: (click.event as MouseEvent).clientX,\n Y: (click.event as MouseEvent).clientY,\n Time: click.timestamp,\n })),\n '[Amplitude] Click Count': clickWindow.length,\n ...firstClick.targetElementProperties,\n };\n\n return { rageClickEvent, time: firstClick.timestamp };\n}\n\nfunction isClickOutsideRageClickWindow(clickWindow: ClickEvent[], click: ClickEvent) {\n const firstIndex = Math.max(0, clickWindow.length - RAGE_CLICK_THRESHOLD + 1);\n const firstClick = clickWindow[firstIndex];\n return click.timestamp - firstClick.timestamp >= RAGE_CLICK_WINDOW_MS;\n}\n\nfunction isNewElement(clickWindow: ClickEvent[], click: ClickEvent) {\n return (\n clickWindow.length > 0 &&\n clickWindow[clickWindow.length - 1].closestTrackedAncestor !== click.closestTrackedAncestor\n );\n}\n\nexport function trackRageClicks({\n amplitude,\n allObservables,\n shouldTrackRageClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n shouldTrackRageClick: shouldTrackEvent;\n}) {\n const { clickObservable }: AllWindowObservables = allObservables;\n\n // Keep track of all clicks within the sliding window\n let clickWindow: ClickEvent[] = [];\n\n // Keep track of the region box for all clicks, to determine when a rage click is out of bounds\n let clickBoundingBox: ClickRegionBoundingBox = {};\n\n let pendingRageClick: {\n resolve: (rageClickEvent: RageClickEvent | null) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n timerId: any;\n } | null = null;\n\n // helper function to reset the click window and region box\n function resetClickWindow(click?: ClickEvent) {\n clickWindow = [];\n clickBoundingBox = {};\n if (click) {\n addCoordinates(clickBoundingBox, click);\n clickWindow.push(click);\n }\n }\n\n const rageClickObservable = asyncMap(\n clickObservable.filter((click) => shouldTrackRageClick('click', click.closestTrackedAncestor)),\n async (click: ClickEvent): Promise<RageClickEvent | null> => {\n // add this click's coordinates to the bounding box\n addCoordinates(clickBoundingBox, click);\n\n let resolutionValue: RageClickEvent | null = null;\n\n // if current click is:\n // 1. first click in the window\n // 2. on a new element\n // 3. outside the rage click time window\n // 4. out of bounds\n // then start a new click window\n if (\n clickWindow.length === 0 ||\n isNewElement(clickWindow, click) ||\n isClickOutsideRageClickWindow(clickWindow, click) ||\n clickBoundingBox.isOutOfBounds\n ) {\n // if there was a previous Rage Click Event on deck, then send it\n if (pendingRageClick) {\n resolutionValue = getRageClickAnalyticsEvent(clickWindow);\n }\n\n resetClickWindow(click);\n } else {\n clickWindow.push(click);\n }\n\n // if there was a previous Rage Click Event on deck, then resolve it\n if (pendingRageClick) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n clearTimeout(pendingRageClick.timerId);\n pendingRageClick.resolve(resolutionValue);\n pendingRageClick = null;\n }\n\n // if we have enough clicks to be a rage click, set a timout to trigger the rage\n // click event after the time threshold is reached.\n // This will be cancelled if a new click is tracked within the time threshold.\n if (clickWindow.length >= RAGE_CLICK_THRESHOLD) {\n return new Promise((resolve) => {\n pendingRageClick = {\n resolve,\n timerId: setTimeout(() => {\n resolve(getRageClickAnalyticsEvent(clickWindow));\n }, RAGE_CLICK_WINDOW_MS),\n };\n });\n }\n\n return null;\n },\n );\n\n return rageClickObservable.subscribe((data: RageClickEvent | null) => {\n /* istanbul ignore if */\n if (data === null) {\n return;\n }\n amplitude.track(AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT, data.rageClickEvent, { time: data.time });\n });\n}\n","/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n FrustrationInteractionsOptions,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n DEFAULT_RAGE_CLICK_ALLOWLIST,\n DEFAULT_DEAD_CLICK_ALLOWLIST,\n multicast,\n Observable,\n Unsubscribable,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { createShouldTrackEvent, ElementBasedTimestampedEvent, NavigateEvent, TimestampedEvent } from './helpers';\nimport { trackDeadClick } from './autocapture/track-dead-click';\nimport { trackRageClicks } from './autocapture/track-rage-click';\nimport { ObservablesEnum } from './autocapture-plugin';\nimport { createClickObservable, createMutationObservable } from './observables';\nimport { DataExtractor } from './data-extractor';\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n [ObservablesEnum.NavigateObservable]?: Observable<TimestampedEvent<NavigateEvent>>;\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport const frustrationPlugin = (options: FrustrationInteractionsOptions = {}): BrowserEnrichmentPlugin => {\n const name = constants.FRUSTRATION_PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Unsubscribable[] = [];\n\n const rageCssSelectors = options.rageClicks?.cssSelectorAllowlist ?? DEFAULT_RAGE_CLICK_ALLOWLIST;\n const deadCssSelectors = options.deadClicks?.cssSelectorAllowlist ?? DEFAULT_DEAD_CLICK_ALLOWLIST;\n\n const dataAttributePrefix = options.dataAttributePrefix ?? DEFAULT_DATA_ATTRIBUTE_PREFIX;\n\n const dataExtractor = new DataExtractor(options);\n\n // combine the two selector lists to determine which clicked elements should be filtered\n const combinedCssSelectors = [...new Set([...rageCssSelectors, ...deadCssSelectors])];\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n const clickObservable = multicast(\n createClickObservable('pointerdown').map((click) => {\n return dataExtractor.addAdditionalEventProperties(\n click,\n 'click',\n combinedCssSelectors,\n dataAttributePrefix,\n true, // capture when cursor is pointer\n );\n }),\n );\n\n const enrichedMutationObservable = multicast<TimestampedEvent<MutationRecord[]>>(\n createMutationObservable().map((mutation) =>\n dataExtractor.addAdditionalEventProperties(mutation, 'mutation', combinedCssSelectors, dataAttributePrefix),\n ),\n );\n\n let enrichedNavigateObservable: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n\n if (window.navigation) {\n const navigateObservable = new Observable<Event>((observer) => {\n const handler = (event: Event): void => {\n observer.next({\n ...event,\n type: 'navigate',\n });\n };\n window.navigation.addEventListener('navigate', handler);\n return () => {\n window.navigation.removeEventListener('navigate', handler);\n };\n });\n enrichedNavigateObservable = multicast<TimestampedEvent<NavigateEvent>>(\n navigateObservable.map<TimestampedEvent<NavigateEvent>>(\n (navigate) =>\n dataExtractor.addAdditionalEventProperties(\n navigate,\n 'navigate',\n combinedCssSelectors,\n dataAttributePrefix,\n ) as TimestampedEvent<NavigateEvent>,\n ),\n );\n }\n\n return {\n [ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,\n [ObservablesEnum.MutationObservable]: enrichedMutationObservable,\n [ObservablesEnum.NavigateObservable]: enrichedNavigateObservable,\n };\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Create should track event functions for the different allowlists\n const shouldTrackRageClick = createShouldTrackEvent(options, rageCssSelectors);\n const shouldTrackDeadClick = createShouldTrackEvent(options, deadCssSelectors);\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions\n const rageClickSubscription = trackRageClicks({\n allObservables,\n amplitude,\n shouldTrackRageClick,\n });\n subscriptions.push(rageClickSubscription);\n\n const deadClickSubscription = trackDeadClick({\n amplitude,\n allObservables,\n getEventProperties: (actionType, element) =>\n dataExtractor.getEventProperties(actionType, element, dataAttributePrefix),\n shouldTrackDeadClick,\n });\n subscriptions.push(deadClickSubscription);\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","v","op","TypeError","pop","push","__values","o","m","__read","r","ar","error","__spreadArray","to","from","pack","l","Array","slice","concat","SuppressedError","getGlobalScope","ampIntegrationContextName","globalThis","window","self","global","isUrlMatchAllowlist","url","allowlist","some","allowedUrl","match","DEFAULT_CSS_SELECTOR_ALLOWLIST","DEFAULT_DATA_ATTRIBUTE_PREFIX","DEFAULT_ACTION_CLICK_ALLOWLIST","DEFAULT_DEAD_CLICK_ALLOWLIST","DEFAULT_RAGE_CLICK_ALLOWLIST","TEXT_MASK_ATTRIBUTE","MASKED_TEXT_VALUE","CC_REGEX","SSN_REGEX","EMAIL_REGEX","_createForOfIteratorHelperLoose","allowArrayLike","it","bind","isArray","minLen","_arrayLikeToArray","toString","constructor","name","test","_unsupportedIterableToArray","arr","len","arr2","_defineProperties","target","props","descriptor","enumerable","configurable","writable","defineProperty","key","_createClass","Constructor","protoProps","staticProps","hasSymbols","hasSymbol","Boolean","getSymbol","observable","SymbolIterator","SymbolObservable","SymbolSpecies","getMethod","obj","getSpecies","ctor","undefined","Observable","isObservable","x","hostReportError","log","setTimeout","enqueue","fn","cleanupSubscription","subscription","cleanup","_cleanup","unsubscribe","closeSubscription","_observer","_queue","_state","notifySubscription","type","observer","onNotify","queue","flushSubscription","Subscription","subscriber","subscriptionObserver","SubscriptionObserver","get","_subscription","_proto2","complete","_subscriber","_proto3","subscribe","forEach","_this","map","_this2","filter","_this3","reduce","_this4","C","hasSeed","hasValue","acc","first","_this5","_len","sources","_key","index","startNext","flatMap","_this6","subscriptions","outer","inner","indexOf","splice","completeIfDone","closed","method","_step","_iterator","item","of","_len2","items","_key2","asyncMap","ZenObservable","catch","merge","sourceA","sourceB","Set","e_1","_a","subscriptions_1","subscriptions_1_1","sub","_b","e_1_1","return","clear","subscribeTo","source","err","delete","size","add","multicast","observers","e_2","observers_1","observers_1_1","obs","e_2_1","e_3","observers_2","observers_2_1","e_3_1","e_4","observers_3","observers_3_1","e_4_1","symbol","VERSION","AMPLITUDE_ELEMENT_CLICKED_EVENT","AMPLITUDE_EVENT_PROP_ELEMENT_TAG","AMPLITUDE_EVENT_PROP_ELEMENT_TEXT","AMPLITUDE_EVENT_PROP_PAGE_URL","AMPLITUDE_ORIGIN","AMPLITUDE_ORIGINS_MAP","US","EU","STAGING","DATA_AMP_MASK_ATTRIBUTES","SENSITIVE_TAGS","isElementPointerCursor","element","actionType","computedStyle","getComputedStyle","getPropertyValue","createShouldTrackEvent","autocaptureOptions","isAlwaysCaptureCursorPointer","pageUrlAllowlist","pageUrlExcludelist","shouldTrackEventResolver","tag","tagName","toLowerCase","location","href","elementType","String","getAttribute","isCursorPointer","hasMatchAnyAllowedSelector","selector","matches","parseAttributesToMask","attributeString","split","attr","trim","removeEmptyProperties","properties","keys","filteredProperties","isEmpty","getClosestElement","selectors","parentElement","filterOutNonTrackableEvents","event","closestTrackedAncestor","BLOCKED_ATTRIBUTES","SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST","SVG_TAGS","HIGHLY_SENSITIVE_INPUT_TYPES","getElementProperties","userMaskedAttributeNames","siblings","_c","children","indexOfType","el","prevSiblingTag","_e","_d","previousElementSibling","prevSib","id","classes","classList","attributes","filteredAttributes","has","isSensitiveElement","isContentEditable","HTMLElement","includes","isNonSensitiveElement","filteredAttributes_1","filteredAttributes_1_1","substring","attrs","executeActions","actions","ev","dataExtractor","action","data","extractDataFromDataSource","dataSource","targetElementProperties","destinationKey","DataExtractor","options","context","replaceSensitiveString","text","additionalMaskTextPatterns","replace","additionalMaskTextPatterns_1","additionalMaskTextPatterns_1_1","pattern","getHierarchy","hierarchy","startTime","performance","now","ancestors","targetEl","current","getAncestors","elementToAttributesToMaskMap","Map","node","attributesToMask","constants.DATA_AMP_MASK_ATTRIBUTES","ancestorAttributesToMask","combinedAttributesToMask","set","hierarchyNode","entries","hierarchy_1","hierarchy_1_1","endTime","diagnosticsClient","recordHistogram","getNearestLabel","labelElement","parent","querySelector","getText","getEventProperties","dataAttributePrefix","prefix","rect","getBoundingClientRect","left","top","currentElementAttributes","nearestLabel","attributeName","attributeValue","startsWith","attributeKey","constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG","constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT","Math","round","constants.AMPLITUDE_EVENT_PROP_PAGE_URL","locationStr","loggerProvider","decodedLocationStr","decodeURI","getDecodeURI","parseTitleFunction","document","title","titleElement","hasAttribute","getPageTitle","innerHeight","innerWidth","HTMLAnchorElement","addAdditionalEventProperties","selectorAllowlist","isCapturingCursorPointer","baseEvent","timestamp","Date","isElementBasedEvent","contextElement","sourceType","sourceElement","scopingElement","documentElement","scope","closest","getDataSource","elementExtractType","attribute","output","clonedTree","cloneNode","querySelectorAll","innerText","getEventTagProps","rawPatterns","maskTextRegex","compiled","rawPatterns_1","rawPatterns_1_1","entry","RegExp","WindowMessenger","origin","endpoint","requestCallbacks","onSelect","notify","onTrack","message","logger","debug","JSON","stringify","opener","postMessage","sendRequest","args","timeout","random","substr","request","Error","handleResponse","response","responseData","warn","setup","isElementSelectable","cssSelectorAllowlist","actionClickAllowlist","amplitudeVisualTaggingSelectorInstance","addEventListener","eventData","actionData_1","scriptElement","createElement","async","src","status","once","head","appendChild","amplitudeVisualTaggingSelector","visualHighlightClass","messenger","diagnostics","autocapture","version","close","ObservablesEnum","createMutationObservable","mutationObserver","MutationObserver","mutations","observe","childList","characterData","subtree","disconnect","createClickObservable","clickType","handler","capture","removeEventListener","eventTypeToBrowserEventMap","groupLabeledEventIdsByEventType","labeledEvents","groupedLabeledEvents","values","browserEvent","labeledEvents_1","labeledEvents_1_1","le","definition","def","event_type","console","createLabeledEventToTriggerMap","triggers","labeledEventToTriggerMap","triggers_1","triggers_1_1","trigger","conditions","condition","eventId","existingTriggers","matchEventToLabeledEvents","filters","every","subprop_key","subprop_op","subprop_value","matchEventToFilter","TriggerEvaluator","evaluate","pageActions","matchingTriggers","leToTriggerMap","labeledEvents_2","labeledEvents_2_1","triggers_2","e_6","triggers_2_1","matchLabeledEventsToTriggers","matchingTriggers_1","matchingTriggers_1_1","update","autocapturePlugin","setTag","_j","_k","visualTaggingOptions","enabled","debounceTime","excludePattern","regexError","_f","_g","_h","evaluateTriggers","createTriggerEvaluator","config","amplitude","fetchRemoteConfig","remoteConfigClient","remoteConfig","remotePageActions","recomputePageActionsData","shouldTrackEvent","shouldTrackActionClick","allObservables","navigateObservable","clickObservable","click","changeObservable","changeEvent","enrichedChangeEvent","navigation","navigateEvent","enrichedNavigateEvent","mutationObservable","mutation","ChangeObservable","ClickObservable","MutationObservable","NavigateObservable","createObservables","clickTrackingSubscription","track","trackClicks","changeSubscription","trackChange","_i","actionClickSubscription","filteredClickObservable","closestActionClickEl","clickEvent","mutationOrNavigate","clickMutationNavigateObservable","actionClickTimer","lastClickEvent","clearTimeout","event_1","actionClick","trackActionClick","serverZone","constants.AMPLITUDE_ORIGINS_MAP","execute","teardown","CHANGE_EVENTS","addCoordinates","regionBox","clientX","clientY","yMin","min","yMax","max","xMin","xMax","isOutOfBounds","getRageClickAnalyticsEvent","clickWindow","firstClick","lastClick","rageClickEvent","toISOString","X","Y","Time","time","trackRageClicks","shouldTrackRageClick","clickBoundingBox","pendingRageClick","resolutionValue","isNewElement","isClickOutsideRageClickWindow","resetClickWindow","timerId","rageCssSelectors","rageClicks","deadCssSelectors","deadClicks","combinedCssSelectors","shouldTrackDeadClick","enrichedNavigateObservable","enrichedMutationObservable","navigate","rageClickSubscription","deadClickSubscription","Element","changeObservables","clicksAndChangeObservable","deadClickTimer","deadClickEvent","trackDeadClick"],"mappings":"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"}
1
+ {"version":3,"file":"amplitude-min.js","sources":["../../../../node_modules/tslib/tslib.es6.js","../../../analytics-core/lib/esm/global-scope.js","../../../analytics-core/lib/esm/utils/url-utils.js","../../../analytics-core/lib/esm/types/element-interactions.js","../../../analytics-core/lib/esm/types/frustration-interactions.js","../../../analytics-core/lib/esm/plugins/helpers.js","../../../../node_modules/zen-observable-ts/module.js","../../../analytics-core/lib/esm/utils/observable.js","../../../src/version.ts","../../../src/constants.ts","../../../src/helpers.ts","../../../src/hierarchy.ts","../../../src/pageActions/actions.ts","../../../src/data-extractor.ts","../../../src/libs/messenger.ts","../../../src/observables.ts","../../../src/autocapture-plugin.ts","../../../src/pageActions/triggers.ts","../../../src/pageActions/matchEventToFilter.ts","../../../src/autocapture/track-click.ts","../../../src/autocapture/track-change.ts","../../../src/autocapture/track-action-click.ts","../../../src/autocapture/track-dead-click.ts","../../../src/autocapture/track-rage-click.ts","../../../src/frustration-plugin.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/* eslint-disable no-restricted-globals */\n/* Only file allowed to access to globalThis, window, self */\nexport var getGlobalScope = function () {\n // This should only be used for integrations with Amplitude that are not running in a browser environment\n // We need to specify the name of the global variable as a string to prevent it from being minified\n var ampIntegrationContextName = 'ampIntegrationContext';\n if (typeof globalThis !== 'undefined' && typeof globalThis[ampIntegrationContextName] !== 'undefined') {\n return globalThis[ampIntegrationContextName];\n }\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n return undefined;\n};\n//# sourceMappingURL=global-scope.js.map","/**\n * Checks if a given URL matches any pattern in an allowlist of URLs or regex patterns.\n * @param url - The URL to check\n * @param allowlist - Array of allowed URLs (strings) or regex patterns\n * @returns true if the URL matches any pattern in the allowlist, false otherwise\n */\nexport var isUrlMatchAllowlist = function (url, allowlist) {\n if (!allowlist || !allowlist.length) {\n return true;\n }\n return allowlist.some(function (allowedUrl) {\n if (typeof allowedUrl === 'string') {\n return url === allowedUrl;\n }\n return url.match(allowedUrl);\n });\n};\nexport var getDecodeURI = function (locationStr, loggerProvider) {\n var decodedLocationStr = locationStr;\n try {\n decodedLocationStr = decodeURI(locationStr);\n }\n catch (e) {\n /* istanbul ignore next */\n loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.error('Malformed URI sequence: ', e);\n }\n return decodedLocationStr;\n};\n//# sourceMappingURL=url-utils.js.map","/**\n * Default CSS selectors to define which elements on the page to track.\n * Extend this list to include additional elements to track. For example:\n * ```\n * autocapturePlugin({\n * cssSelectorAllowlist: [...DEFAULT_CSS_SELECTOR_ALLOWLIST, \".my-class\"],\n * })\n * ```\n */\nexport var DEFAULT_CSS_SELECTOR_ALLOWLIST = [\n 'a',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'label',\n 'video',\n 'audio',\n '[contenteditable=\"true\" i]',\n '[data-amp-default-track]',\n '.amp-default-track',\n];\n/**\n * Default prefix to allow the plugin to capture data attributes as an event property.\n */\nexport var DEFAULT_DATA_ATTRIBUTE_PREFIX = 'data-amp-track-';\n/**\n * Default list of elements on the page should be tracked when the page changes.\n */\nexport var DEFAULT_ACTION_CLICK_ALLOWLIST = ['div', 'span', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n//# sourceMappingURL=element-interactions.js.map","import { __read, __spreadArray } from \"tslib\";\nvar CLICKABLE_ELEMENT_SELECTORS = [\n 'a',\n 'button',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"menuitem\"]',\n '[role=\"menuitemcheckbox\"]',\n '[role=\"menuitemradio\"]',\n '[role=\"option\"]',\n '[role=\"tab\"]',\n '[role=\"treeitem\"]',\n '[contenteditable=\"true\" i]',\n];\n/**\n * Default CSS selectors for dead clicks tracking\n */\nexport var DEFAULT_DEAD_CLICK_ALLOWLIST = __spreadArray([\n 'input[type=\"button\"]',\n 'input[type=\"submit\"]',\n 'input[type=\"reset\"]',\n 'input[type=\"image\"]',\n 'input[type=\"file\"]'\n], __read(CLICKABLE_ELEMENT_SELECTORS), false);\n/**\n * Default CSS selectors for rage clicks tracking\n */\nexport var DEFAULT_RAGE_CLICK_ALLOWLIST = ['*'];\n/**\n * Default time window for dead clicks (3 seconds)\n */\nexport var DEFAULT_DEAD_CLICK_WINDOW_MS = 3000;\n/**\n * Default time window for rage clicks (1 second)\n */\nexport var DEFAULT_RAGE_CLICK_WINDOW_MS = 1000;\n/**\n * Default threshold for rage clicks (4 clicks)\n */\nexport var DEFAULT_RAGE_CLICK_THRESHOLD = 4;\n/**\n * Default threshold for rage clicks to be considered out of bounds (50 pixels)\n */\nexport var DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD = 50; // pixels\n//# sourceMappingURL=frustration-interactions.js.map","import { __values } from \"tslib\";\nexport var TEXT_MASK_ATTRIBUTE = 'data-amp-mask';\nexport var MASKED_TEXT_VALUE = '*****';\n// Regex patterns for sensitive data\nexport var CC_REGEX = /\\b(?:\\d[ -]*?){13,16}\\b/;\nexport var SSN_REGEX = /(\\d{3}-?\\d{2}-?\\d{4})/g;\nexport var EMAIL_REGEX = /[^\\s@]+@[^\\s@.]+\\.[^\\s@]+/g;\n/**\n * Replaces sensitive strings (credit cards, SSNs, emails) and custom patterns with masked text\n * @param text - The text to search for sensitive data\n * @param additionalMaskTextPatterns - Optional array of additional regex patterns to mask\n * @returns The text with sensitive data replaced by masked text\n */\nexport var replaceSensitiveString = function (text, additionalMaskTextPatterns) {\n var e_1, _a;\n if (additionalMaskTextPatterns === void 0) { additionalMaskTextPatterns = []; }\n if (typeof text !== 'string') {\n return '';\n }\n var result = text;\n // Check for credit card number (with or without spaces/dashes)\n result = result.replace(CC_REGEX, MASKED_TEXT_VALUE);\n // Check for social security number\n result = result.replace(SSN_REGEX, MASKED_TEXT_VALUE);\n // Check for email\n result = result.replace(EMAIL_REGEX, MASKED_TEXT_VALUE);\n try {\n // Check for additional mask text patterns\n for (var additionalMaskTextPatterns_1 = __values(additionalMaskTextPatterns), additionalMaskTextPatterns_1_1 = additionalMaskTextPatterns_1.next(); !additionalMaskTextPatterns_1_1.done; additionalMaskTextPatterns_1_1 = additionalMaskTextPatterns_1.next()) {\n var pattern = additionalMaskTextPatterns_1_1.value;\n try {\n result = result.replace(pattern, MASKED_TEXT_VALUE);\n }\n catch (_b) {\n // ignore invalid pattern\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (additionalMaskTextPatterns_1_1 && !additionalMaskTextPatterns_1_1.done && (_a = additionalMaskTextPatterns_1.return)) _a.call(additionalMaskTextPatterns_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return result;\n};\n/**\n * Gets the page title, checking if the title element has data-amp-mask attribute\n * @returns The page title, masked if the title element has data-amp-mask attribute\n */\nexport var getPageTitle = function (parseTitleFunction) {\n if (typeof document === 'undefined' || !document.title) {\n return '';\n }\n var titleElement = document.querySelector('title');\n if (titleElement && titleElement.hasAttribute(TEXT_MASK_ATTRIBUTE)) {\n return MASKED_TEXT_VALUE;\n }\n return parseTitleFunction ? parseTitleFunction(document.title) : document.title; // document.title is always synced to the first title element\n};\n//# sourceMappingURL=helpers.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n// === Symbol Support ===\nvar hasSymbols = function () {\n return typeof Symbol === 'function';\n};\n\nvar hasSymbol = function (name) {\n return hasSymbols() && Boolean(Symbol[name]);\n};\n\nvar getSymbol = function (name) {\n return hasSymbol(name) ? Symbol[name] : '@@' + name;\n};\n\nif (hasSymbols() && !hasSymbol('observable')) {\n Symbol.observable = Symbol('observable');\n}\n\nvar SymbolIterator = getSymbol('iterator');\nvar SymbolObservable = getSymbol('observable');\nvar SymbolSpecies = getSymbol('species'); // === Abstract Operations ===\n\nfunction getMethod(obj, key) {\n var value = obj[key];\n if (value == null) return undefined;\n if (typeof value !== 'function') throw new TypeError(value + ' is not a function');\n return value;\n}\n\nfunction getSpecies(obj) {\n var ctor = obj.constructor;\n\n if (ctor !== undefined) {\n ctor = ctor[SymbolSpecies];\n\n if (ctor === null) {\n ctor = undefined;\n }\n }\n\n return ctor !== undefined ? ctor : Observable;\n}\n\nfunction isObservable(x) {\n return x instanceof Observable; // SPEC: Brand check\n}\n\nfunction hostReportError(e) {\n if (hostReportError.log) {\n hostReportError.log(e);\n } else {\n setTimeout(function () {\n throw e;\n });\n }\n}\n\nfunction enqueue(fn) {\n Promise.resolve().then(function () {\n try {\n fn();\n } catch (e) {\n hostReportError(e);\n }\n });\n}\n\nfunction cleanupSubscription(subscription) {\n var cleanup = subscription._cleanup;\n if (cleanup === undefined) return;\n subscription._cleanup = undefined;\n\n if (!cleanup) {\n return;\n }\n\n try {\n if (typeof cleanup === 'function') {\n cleanup();\n } else {\n var unsubscribe = getMethod(cleanup, 'unsubscribe');\n\n if (unsubscribe) {\n unsubscribe.call(cleanup);\n }\n }\n } catch (e) {\n hostReportError(e);\n }\n}\n\nfunction closeSubscription(subscription) {\n subscription._observer = undefined;\n subscription._queue = undefined;\n subscription._state = 'closed';\n}\n\nfunction flushSubscription(subscription) {\n var queue = subscription._queue;\n\n if (!queue) {\n return;\n }\n\n subscription._queue = undefined;\n subscription._state = 'ready';\n\n for (var i = 0; i < queue.length; ++i) {\n notifySubscription(subscription, queue[i].type, queue[i].value);\n if (subscription._state === 'closed') break;\n }\n}\n\nfunction notifySubscription(subscription, type, value) {\n subscription._state = 'running';\n var observer = subscription._observer;\n\n try {\n var m = getMethod(observer, type);\n\n switch (type) {\n case 'next':\n if (m) m.call(observer, value);\n break;\n\n case 'error':\n closeSubscription(subscription);\n if (m) m.call(observer, value);else throw value;\n break;\n\n case 'complete':\n closeSubscription(subscription);\n if (m) m.call(observer);\n break;\n }\n } catch (e) {\n hostReportError(e);\n }\n\n if (subscription._state === 'closed') cleanupSubscription(subscription);else if (subscription._state === 'running') subscription._state = 'ready';\n}\n\nfunction onNotify(subscription, type, value) {\n if (subscription._state === 'closed') return;\n\n if (subscription._state === 'buffering') {\n subscription._queue.push({\n type: type,\n value: value\n });\n\n return;\n }\n\n if (subscription._state !== 'ready') {\n subscription._state = 'buffering';\n subscription._queue = [{\n type: type,\n value: value\n }];\n enqueue(function () {\n return flushSubscription(subscription);\n });\n return;\n }\n\n notifySubscription(subscription, type, value);\n}\n\nvar Subscription = /*#__PURE__*/function () {\n function Subscription(observer, subscriber) {\n // ASSERT: observer is an object\n // ASSERT: subscriber is callable\n this._cleanup = undefined;\n this._observer = observer;\n this._queue = undefined;\n this._state = 'initializing';\n var subscriptionObserver = new SubscriptionObserver(this);\n\n try {\n this._cleanup = subscriber.call(undefined, subscriptionObserver);\n } catch (e) {\n subscriptionObserver.error(e);\n }\n\n if (this._state === 'initializing') this._state = 'ready';\n }\n\n var _proto = Subscription.prototype;\n\n _proto.unsubscribe = function unsubscribe() {\n if (this._state !== 'closed') {\n closeSubscription(this);\n cleanupSubscription(this);\n }\n };\n\n _createClass(Subscription, [{\n key: \"closed\",\n get: function () {\n return this._state === 'closed';\n }\n }]);\n\n return Subscription;\n}();\n\nvar SubscriptionObserver = /*#__PURE__*/function () {\n function SubscriptionObserver(subscription) {\n this._subscription = subscription;\n }\n\n var _proto2 = SubscriptionObserver.prototype;\n\n _proto2.next = function next(value) {\n onNotify(this._subscription, 'next', value);\n };\n\n _proto2.error = function error(value) {\n onNotify(this._subscription, 'error', value);\n };\n\n _proto2.complete = function complete() {\n onNotify(this._subscription, 'complete');\n };\n\n _createClass(SubscriptionObserver, [{\n key: \"closed\",\n get: function () {\n return this._subscription._state === 'closed';\n }\n }]);\n\n return SubscriptionObserver;\n}();\n\nvar Observable = /*#__PURE__*/function () {\n function Observable(subscriber) {\n if (!(this instanceof Observable)) throw new TypeError('Observable cannot be called as a function');\n if (typeof subscriber !== 'function') throw new TypeError('Observable initializer must be a function');\n this._subscriber = subscriber;\n }\n\n var _proto3 = Observable.prototype;\n\n _proto3.subscribe = function subscribe(observer) {\n if (typeof observer !== 'object' || observer === null) {\n observer = {\n next: observer,\n error: arguments[1],\n complete: arguments[2]\n };\n }\n\n return new Subscription(observer, this._subscriber);\n };\n\n _proto3.forEach = function forEach(fn) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (typeof fn !== 'function') {\n reject(new TypeError(fn + ' is not a function'));\n return;\n }\n\n function done() {\n subscription.unsubscribe();\n resolve();\n }\n\n var subscription = _this.subscribe({\n next: function (value) {\n try {\n fn(value, done);\n } catch (e) {\n reject(e);\n subscription.unsubscribe();\n }\n },\n error: reject,\n complete: resolve\n });\n });\n };\n\n _proto3.map = function map(fn) {\n var _this2 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n return new C(function (observer) {\n return _this2.subscribe({\n next: function (value) {\n try {\n value = fn(value);\n } catch (e) {\n return observer.error(e);\n }\n\n observer.next(value);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n observer.complete();\n }\n });\n });\n };\n\n _proto3.filter = function filter(fn) {\n var _this3 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n return new C(function (observer) {\n return _this3.subscribe({\n next: function (value) {\n try {\n if (!fn(value)) return;\n } catch (e) {\n return observer.error(e);\n }\n\n observer.next(value);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n observer.complete();\n }\n });\n });\n };\n\n _proto3.reduce = function reduce(fn) {\n var _this4 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n var hasSeed = arguments.length > 1;\n var hasValue = false;\n var seed = arguments[1];\n var acc = seed;\n return new C(function (observer) {\n return _this4.subscribe({\n next: function (value) {\n var first = !hasValue;\n hasValue = true;\n\n if (!first || hasSeed) {\n try {\n acc = fn(acc, value);\n } catch (e) {\n return observer.error(e);\n }\n } else {\n acc = value;\n }\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n if (!hasValue && !hasSeed) return observer.error(new TypeError('Cannot reduce an empty sequence'));\n observer.next(acc);\n observer.complete();\n }\n });\n });\n };\n\n _proto3.concat = function concat() {\n var _this5 = this;\n\n for (var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++) {\n sources[_key] = arguments[_key];\n }\n\n var C = getSpecies(this);\n return new C(function (observer) {\n var subscription;\n var index = 0;\n\n function startNext(next) {\n subscription = next.subscribe({\n next: function (v) {\n observer.next(v);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n if (index === sources.length) {\n subscription = undefined;\n observer.complete();\n } else {\n startNext(C.from(sources[index++]));\n }\n }\n });\n }\n\n startNext(_this5);\n return function () {\n if (subscription) {\n subscription.unsubscribe();\n subscription = undefined;\n }\n };\n });\n };\n\n _proto3.flatMap = function flatMap(fn) {\n var _this6 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n return new C(function (observer) {\n var subscriptions = [];\n\n var outer = _this6.subscribe({\n next: function (value) {\n if (fn) {\n try {\n value = fn(value);\n } catch (e) {\n return observer.error(e);\n }\n }\n\n var inner = C.from(value).subscribe({\n next: function (value) {\n observer.next(value);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n var i = subscriptions.indexOf(inner);\n if (i >= 0) subscriptions.splice(i, 1);\n completeIfDone();\n }\n });\n subscriptions.push(inner);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n completeIfDone();\n }\n });\n\n function completeIfDone() {\n if (outer.closed && subscriptions.length === 0) observer.complete();\n }\n\n return function () {\n subscriptions.forEach(function (s) {\n return s.unsubscribe();\n });\n outer.unsubscribe();\n };\n });\n };\n\n _proto3[SymbolObservable] = function () {\n return this;\n };\n\n Observable.from = function from(x) {\n var C = typeof this === 'function' ? this : Observable;\n if (x == null) throw new TypeError(x + ' is not an object');\n var method = getMethod(x, SymbolObservable);\n\n if (method) {\n var observable = method.call(x);\n if (Object(observable) !== observable) throw new TypeError(observable + ' is not an object');\n if (isObservable(observable) && observable.constructor === C) return observable;\n return new C(function (observer) {\n return observable.subscribe(observer);\n });\n }\n\n if (hasSymbol('iterator')) {\n method = getMethod(x, SymbolIterator);\n\n if (method) {\n return new C(function (observer) {\n enqueue(function () {\n if (observer.closed) return;\n\n for (var _iterator = _createForOfIteratorHelperLoose(method.call(x)), _step; !(_step = _iterator()).done;) {\n var item = _step.value;\n observer.next(item);\n if (observer.closed) return;\n }\n\n observer.complete();\n });\n });\n }\n }\n\n if (Array.isArray(x)) {\n return new C(function (observer) {\n enqueue(function () {\n if (observer.closed) return;\n\n for (var i = 0; i < x.length; ++i) {\n observer.next(x[i]);\n if (observer.closed) return;\n }\n\n observer.complete();\n });\n });\n }\n\n throw new TypeError(x + ' is not observable');\n };\n\n Observable.of = function of() {\n for (var _len2 = arguments.length, items = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n items[_key2] = arguments[_key2];\n }\n\n var C = typeof this === 'function' ? this : Observable;\n return new C(function (observer) {\n enqueue(function () {\n if (observer.closed) return;\n\n for (var i = 0; i < items.length; ++i) {\n observer.next(items[i]);\n if (observer.closed) return;\n }\n\n observer.complete();\n });\n });\n };\n\n _createClass(Observable, null, [{\n key: SymbolSpecies,\n get: function () {\n return this;\n }\n }]);\n\n return Observable;\n}();\n\nif (hasSymbols()) {\n Object.defineProperty(Observable, Symbol('extensions'), {\n value: {\n symbol: SymbolObservable,\n hostReportError: hostReportError\n },\n configurable: true\n });\n}\n\nexport { Observable };\n","import { __values } from \"tslib\";\nexport { Observable } from 'zen-observable-ts';\nimport { Observable as ZenObservable } from 'zen-observable-ts';\n/**\n * asyncMap operator for Zen Observable\n *\n * Maps each value emitted by the source Observable using an async function,\n * emitting the resolved values in the same order they arrive.\n */\nfunction asyncMap(observable, fn) {\n return new ZenObservable(function (observer) {\n observable.subscribe({\n next: function (value) {\n fn(value)\n .then(function (result) {\n return observer.next(result);\n })\n .catch(function (error) { return observer.error(error); });\n },\n error: function (error) {\n observer.error(error);\n },\n complete: function () {\n observer.complete();\n },\n });\n });\n}\n/**\n * merge operator for Zen Observable\n *\n * Merges two observables into a single observable, emitting values from both sources in the order they arrive.\n * @param sourceA Observable to merge\n * @param sourceB Observable to merge\n * @returns Unsubscribable cleanup function\n */\nfunction merge(sourceA, sourceB) {\n return new ZenObservable(function (observer) {\n var closed = false;\n var subscriptions = new Set();\n var cleanup = function () {\n var e_1, _a;\n closed = true;\n try {\n for (var subscriptions_1 = __values(subscriptions), subscriptions_1_1 = subscriptions_1.next(); !subscriptions_1_1.done; subscriptions_1_1 = subscriptions_1.next()) {\n var sub = subscriptions_1_1.value;\n try {\n sub.unsubscribe();\n }\n catch (_b) {\n /* do nothing */\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (subscriptions_1_1 && !subscriptions_1_1.done && (_a = subscriptions_1.return)) _a.call(subscriptions_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n subscriptions.clear();\n };\n var subscribeTo = function (source) {\n var sub = source.subscribe({\n next: function (value) {\n if (!closed)\n observer.next(value);\n },\n error: function (err) {\n if (!closed) {\n closed = true;\n observer.error(err);\n cleanup();\n }\n },\n complete: function () {\n subscriptions.delete(sub);\n if (!closed && subscriptions.size === 0) {\n observer.complete();\n cleanup();\n closed = true;\n }\n },\n });\n subscriptions.add(sub);\n };\n subscribeTo(sourceA);\n subscribeTo(sourceB);\n return cleanup;\n });\n}\n// function share() {\nfunction multicast(source) {\n var observers = new Set();\n var subscription = null;\n function cleanup() {\n /* istanbul ignore next */\n subscription === null || subscription === void 0 ? void 0 : subscription.unsubscribe();\n subscription = null;\n observers.clear();\n }\n return new ZenObservable(function (observer) {\n observers.add(observer);\n if (subscription === null) {\n subscription = source.subscribe({\n next: function (value) {\n var e_2, _a;\n var _b;\n try {\n for (var observers_1 = __values(observers), observers_1_1 = observers_1.next(); !observers_1_1.done; observers_1_1 = observers_1.next()) {\n var obs = observers_1_1.value;\n /* istanbul ignore next */\n (_b = obs.next) === null || _b === void 0 ? void 0 : _b.call(obs, value);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (observers_1_1 && !observers_1_1.done && (_a = observers_1.return)) _a.call(observers_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n },\n error: function (err) {\n var e_3, _a;\n var _b;\n try {\n for (var observers_2 = __values(observers), observers_2_1 = observers_2.next(); !observers_2_1.done; observers_2_1 = observers_2.next()) {\n var obs = observers_2_1.value;\n /* istanbul ignore next */\n (_b = obs.error) === null || _b === void 0 ? void 0 : _b.call(obs, err);\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (observers_2_1 && !observers_2_1.done && (_a = observers_2.return)) _a.call(observers_2);\n }\n finally { if (e_3) throw e_3.error; }\n }\n cleanup();\n },\n complete: function () {\n var e_4, _a;\n var _b;\n try {\n for (var observers_3 = __values(observers), observers_3_1 = observers_3.next(); !observers_3_1.done; observers_3_1 = observers_3.next()) {\n var obs = observers_3_1.value;\n /* istanbul ignore next */\n (_b = obs.complete) === null || _b === void 0 ? void 0 : _b.call(obs);\n }\n }\n catch (e_4_1) { e_4 = { error: e_4_1 }; }\n finally {\n try {\n if (observers_3_1 && !observers_3_1.done && (_a = observers_3.return)) _a.call(observers_3);\n }\n finally { if (e_4) throw e_4.error; }\n }\n cleanup();\n },\n });\n }\n // Return unsubscribe function for this observer\n return function () {\n observers.delete(observer);\n // If no observers left, unsubscribe from the source\n if (observers.size === 0 && subscription) {\n subscription.unsubscribe();\n subscription = null;\n }\n };\n });\n}\nexport { asyncMap, multicast, merge };\n//# sourceMappingURL=observable.js.map","export const VERSION = '1.18.3';\n","export const PLUGIN_NAME = '@amplitude/plugin-autocapture-browser';\nexport const FRUSTRATION_PLUGIN_NAME = '@amplitude/plugin-frustration-browser';\n\nexport const AMPLITUDE_ELEMENT_CLICKED_EVENT = '[Amplitude] Element Clicked';\nexport const AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = '[Amplitude] Dead Click';\nexport const AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = '[Amplitude] Rage Click';\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\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-1.0.0-alpha.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\n// Data attribute for specifying which attributes should be redacted from autocapture\nexport const DATA_AMP_MASK_ATTRIBUTES = 'data-amp-mask-attributes';\n\nexport const MAX_MASK_TEXT_PATTERNS = 25;\nexport const MAX_ATTRIBUTE_LENGTH = 128;\n","/* eslint-disable no-restricted-globals */\nimport { ElementInteractionsOptions, ActionType, isUrlMatchAllowlist } from '@amplitude/analytics-core';\n\nexport type JSONValue = string | number | boolean | null | { [x: string]: JSONValue } | Array<JSONValue>;\n\nconst SENSITIVE_TAGS = ['input', 'select', 'textarea'];\n\nexport type shouldTrackEvent = (actionType: ActionType, element: Element) => boolean;\n\nexport const isElementPointerCursor = (element: Element, actionType: ActionType): boolean => {\n /* istanbul ignore next */\n const computedStyle = window?.getComputedStyle?.(element);\n /* istanbul ignore next */\n return computedStyle?.getPropertyValue('cursor') === 'pointer' && actionType === 'click';\n};\n\nexport const createShouldTrackEvent = (\n autocaptureOptions: ElementInteractionsOptions,\n allowlist: string[], // this can be any type of css selector allow list\n isAlwaysCaptureCursorPointer = false,\n): shouldTrackEvent => {\n return (actionType: ActionType, element: Element) => {\n const { pageUrlAllowlist, pageUrlExcludelist, shouldTrackEventResolver } = autocaptureOptions;\n\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n // window, document, and Text nodes have no tag\n if (!tag) {\n return false;\n }\n\n if (shouldTrackEventResolver) {\n return shouldTrackEventResolver(actionType, element);\n }\n\n // check if the URL is in the allow list\n if (!isUrlMatchAllowlist(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n // check if the URL is in the excludelist\n if (\n pageUrlExcludelist &&\n pageUrlExcludelist.length > 0 &&\n isUrlMatchAllowlist(window.location.href, pageUrlExcludelist as (string | RegExp)[])\n ) {\n return false;\n }\n\n /* istanbul ignore next */\n const elementType = String(element?.getAttribute('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 const isCursorPointer = isElementPointerCursor(element, actionType);\n\n if (isAlwaysCaptureCursorPointer && isCursorPointer) {\n return true;\n }\n\n /* istanbul ignore if */\n if (allowlist) {\n const hasMatchAnyAllowedSelector = allowlist.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 /* istanbul ignore next */\n if (isCursorPointer) {\n return true;\n }\n return actionType === 'click';\n }\n }\n };\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 =\n element instanceof HTMLElement ? element.getAttribute('contenteditable')?.toLowerCase() === 'true' : false;\n\n return !SENSITIVE_TAGS.includes(tag) && !isContentEditable;\n};\n\n/**\n * Collects redacted attribute names from element and ancestor elements with data-amp-mask-attributes\n * The 'id' and 'class' attributes cannot be redacted as they're critical for element identification\n * @param element - The target element to check for redaction attributes\n * @returns Set of attribute names that should be redacted\n */\n/**\n * Parses a comma-separated string of attribute names and filters out protected attributes\n * @param attributeString - Comma-separated string of attribute names\n * @returns Array of valid attribute names, excluding 'id' and 'class'\n */\nexport const parseAttributesToMask = (attributeString: string | null): string[] => {\n return attributeString\n ? attributeString\n .split(',')\n .map((attr) => attr.trim())\n .filter((attr) => attr.length > 0 && attr !== 'id' && attr !== 'class') // Prevent 'id' and 'class' from being redacted as they're critical for element identification\n : [];\n};\n\nexport const extractPrefixedAttributes = (\n attrs: { [key: string]: string },\n prefix: string,\n): { [key: string]: string } => {\n return Object.entries(attrs).reduce((attributes: { [key: string]: string }, [attributeName, attributeValue]) => {\n if (attributeName.startsWith(prefix)) {\n const attributeKey = attributeName.replace(prefix, '');\n\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 }): { [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 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 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\nexport const filterOutNonTrackableEvents = (event: ElementBasedTimestampedEvent<ElementBasedEvent>): boolean => {\n // Filter out changeEvent events with no target\n // This could happen when change events are triggered programmatically\n if (event.event.target === null || !event.closestTrackedAncestor) {\n return false;\n }\n\n return true;\n};\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\n// Base TimestampedEvent type\nexport type BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation';\n};\n\n// Specific types for events with targetElementProperties\nexport type ElementBasedEvent = MouseEvent | Event;\nexport type ElementBasedTimestampedEvent<T> = BaseTimestampedEvent<T> & {\n event: MouseEvent | Event;\n type: 'click' | 'change';\n closestTrackedAncestor: Element;\n targetElementProperties: Record<string, any>;\n};\n\nexport type evaluateTriggersFn = (\n event: ElementBasedTimestampedEvent<ElementBasedEvent>,\n) => ElementBasedTimestampedEvent<ElementBasedEvent>;\n\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\n// Type predicate\nexport function isElementBasedEvent<T>(event: BaseTimestampedEvent<T>): event is ElementBasedTimestampedEvent<T> {\n return event.type === 'click' || event.type === 'change';\n}\n\nexport interface NavigateEvent extends Event {\n readonly navigationType: 'reload' | 'push' | 'replace' | 'traverse';\n readonly destination: {\n readonly url: string;\n readonly key: string | null;\n readonly id: string | null;\n readonly index: number;\n readonly sameDocument: boolean;\n\n getState(): any;\n };\n readonly canIntercept: boolean;\n readonly userInitiated: boolean;\n readonly hashChange: boolean;\n readonly signal: AbortSignal;\n readonly formData: FormData | null;\n readonly downloadRequest: string | null;\n readonly info: any;\n readonly hasUAVisualTransition: boolean;\n /** @see https://github.com/WICG/navigation-api/pull/264 */\n readonly sourceElement: Element | null;\n\n scroll(): void;\n}\n","import { isNonSensitiveElement } from './helpers';\nimport { DATA_AMP_MASK_ATTRIBUTES } from './constants';\nimport type { HierarchyNode } from './typings/autocapture';\nimport * as constants from './constants';\nimport { MASKED_TEXT_VALUE, TEXT_MASK_ATTRIBUTE } from '@amplitude/analytics-core';\n\nconst BLOCKED_ATTRIBUTES = new Set([\n // Already captured elsewhere in the hierarchy object\n 'id',\n 'class',\n\n // non-useful and potentially large attribute\n 'style',\n\n // sensitive as prefilled form data may populate this attribute\n 'value',\n\n // DOM events\n 'onclick',\n 'onchange',\n 'oninput',\n 'onblur',\n 'onsubmit',\n 'onfocus',\n 'onkeydown',\n 'onkeyup',\n 'onkeypress',\n\n // React specific\n 'data-reactid',\n 'data-react-checksum',\n 'data-reactroot',\n\n // Amplitude specific - used for redaction but should not be included in getElementProperties\n DATA_AMP_MASK_ATTRIBUTES,\n TEXT_MASK_ATTRIBUTE,\n]);\nconst SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST = ['type'];\n\nconst SVG_TAGS = ['svg', 'path', 'g'];\nconst HIGHLY_SENSITIVE_INPUT_TYPES = ['password', 'hidden'];\nexport const MAX_HIERARCHY_LENGTH = 1024;\n\nexport function getElementProperties(\n element: Element | null,\n userMaskedAttributeNames: Set<string>,\n): HierarchyNode | null {\n if (element === null) {\n return null;\n }\n\n const tagName = String(element.tagName).toLowerCase();\n const properties: HierarchyNode = {\n tag: tagName,\n };\n\n const siblings = Array.from(element.parentElement?.children ?? []);\n if (siblings.length) {\n properties.index = siblings.indexOf(element);\n properties.indexOfType = siblings.filter((el) => el.tagName === element.tagName).indexOf(element);\n }\n\n const prevSiblingTag = element.previousElementSibling?.tagName?.toLowerCase();\n if (prevSiblingTag) {\n properties.prevSib = String(prevSiblingTag);\n }\n\n const id = element.getAttribute('id');\n if (id) {\n properties.id = String(id);\n }\n\n const classes = Array.from(element.classList);\n if (classes.length) {\n properties.classes = classes;\n }\n\n const attributes: Record<string, string> = {};\n const attributesArray = Array.from(element.attributes);\n const filteredAttributes = attributesArray.filter((attr) => !BLOCKED_ATTRIBUTES.has(attr.name));\n const isSensitiveElement = !isNonSensitiveElement(element);\n\n // if input is hidden or password or for SVGs, skip attribute collection entirely\n if (!HIGHLY_SENSITIVE_INPUT_TYPES.includes(String(element.getAttribute('type'))) && !SVG_TAGS.includes(tagName)) {\n for (const attr of filteredAttributes) {\n // If sensitive element, only allow certain attributes\n if (isSensitiveElement && !SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST.includes(attr.name)) {\n continue;\n }\n\n if (userMaskedAttributeNames.has(attr.name)) {\n attributes[attr.name] = MASKED_TEXT_VALUE;\n continue;\n }\n\n // Finally cast attribute value to string and limit attribute value length\n attributes[attr.name] = String(attr.value).substring(0, constants.MAX_ATTRIBUTE_LENGTH);\n }\n }\n\n if (Object.keys(attributes).length) {\n properties.attrs = attributes;\n }\n\n return properties;\n}\n\nexport function getAncestors(targetEl: Element | null): Element[] {\n const ancestors: Element[] = [];\n\n if (!targetEl) {\n return ancestors;\n }\n\n // Add self to the list of ancestors\n ancestors.push(targetEl);\n let current = targetEl.parentElement;\n while (current && current.tagName !== 'HTML') {\n ancestors.push(current);\n current = current.parentElement;\n }\n return ancestors;\n}\n","import type { DataSource, PageAction } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport type { DataExtractor } from '../data-extractor';\nimport type { ElementBasedTimestampedEvent, ElementBasedEvent } from '../helpers';\n\n// Get DataSource\n/**\n * Gets the DOM element specified by the data source configuration\n * @param dataSource - Configuration for finding the target element\n * @param contextElement - The element to start searching from\n * @returns The matching DOM element or undefined if not found\n */\nexport const getDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Only process DOM_ELEMENT type data sources\n try {\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n // If scope is specified, find the closest ancestor matching the scope rather than using documentElement (html) as the scope\n let scopingElement: HTMLElement | null = document.documentElement;\n if (dataSource.scope && contextElement) {\n scopingElement = contextElement.closest(dataSource.scope);\n }\n\n // If we have both a scope and selector, find the matching element\n if (scopingElement && dataSource.selector) {\n return scopingElement.querySelector(dataSource.selector);\n }\n\n // Return scopingElement if no selector was specified\n return scopingElement;\n }\n } catch (error) {\n return undefined;\n }\n\n // Return undefined for non-DOM_ELEMENT data sources\n return undefined;\n};\n\n// Execute actions for a condition and attach event properties to the event if needed\nexport const executeActions = (\n actions: (string | PageAction)[],\n ev: ElementBasedTimestampedEvent<ElementBasedEvent>,\n dataExtractor: DataExtractor,\n) => {\n actions.forEach((action) => {\n // Skip if actions is string until action set is implemented\n if (typeof action === 'string') {\n return;\n }\n\n if (action.actionType === 'ATTACH_EVENT_PROPERTY') {\n const data = dataExtractor.extractDataFromDataSource(action.dataSource, ev.closestTrackedAncestor as HTMLElement);\n\n // Attach data to event\n ev.targetElementProperties[action.destinationKey] = data;\n }\n });\n};\n","/* eslint-disable no-restricted-globals */\nimport {\n ElementInteractionsOptions,\n ActionType,\n getDecodeURI,\n IDiagnosticsClient,\n MASKED_TEXT_VALUE,\n TEXT_MASK_ATTRIBUTE,\n getPageTitle,\n replaceSensitiveString,\n} from '@amplitude/analytics-core';\nimport type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport * as constants from './constants';\nimport {\n removeEmptyProperties,\n extractPrefixedAttributes,\n isElementPointerCursor,\n getClosestElement,\n isElementBasedEvent,\n parseAttributesToMask,\n} from './helpers';\nimport type { BaseTimestampedEvent, ElementBasedTimestampedEvent, TimestampedEvent, JSONValue } from './helpers';\nimport { getAncestors, getElementProperties } from './hierarchy';\nimport { getDataSource } from './pageActions/actions';\nimport { Hierarchy } from './typings/autocapture';\n\nexport class DataExtractor {\n private readonly additionalMaskTextPatterns: RegExp[];\n diagnosticsClient?: IDiagnosticsClient;\n\n constructor(options: ElementInteractionsOptions, context?: { diagnosticsClient: IDiagnosticsClient }) {\n this.diagnosticsClient = context?.diagnosticsClient;\n\n const rawPatterns = options.maskTextRegex ?? [];\n\n const compiled: RegExp[] = [];\n for (const entry of rawPatterns) {\n if (compiled.length >= constants.MAX_MASK_TEXT_PATTERNS) {\n break;\n }\n if (entry instanceof RegExp) {\n compiled.push(entry);\n } else if ('pattern' in entry && typeof entry.pattern === 'string') {\n try {\n compiled.push(new RegExp(entry.pattern, 'i'));\n } catch {\n // ignore invalid pattern strings\n }\n }\n }\n this.additionalMaskTextPatterns = compiled;\n }\n\n /**\n * Wrapper method to replace sensitive strings using the helper function\n * @param text - The text to search for sensitive data\n * @returns The text with sensitive data replaced by masked text\n */\n replaceSensitiveString = (text: string | null): string => {\n return replaceSensitiveString(text, this.additionalMaskTextPatterns);\n };\n\n // Get the DOM hierarchy of the element, starting from the target element to the root element.\n getHierarchy = (element: Element | null): Hierarchy => {\n const startTime = performance.now();\n\n let hierarchy: Hierarchy = [];\n if (!element) {\n return [];\n }\n\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n const ancestors = getAncestors(element);\n\n // Build attributes to mask map\n const elementToAttributesToMaskMap = new Map<Element, Set<string>>();\n\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const node = ancestors[i];\n if (node) {\n const attributesToMask = parseAttributesToMask(node.getAttribute(constants.DATA_AMP_MASK_ATTRIBUTES));\n const ancestorAttributesToMask =\n i === ancestors.length - 1 ? [] : elementToAttributesToMaskMap.get(ancestors[i + 1]) ?? new Set<string>();\n const combinedAttributesToMask = new Set([...ancestorAttributesToMask, ...attributesToMask]);\n elementToAttributesToMaskMap.set(node, combinedAttributesToMask);\n }\n }\n\n hierarchy = ancestors.map((el) =>\n getElementProperties(el, elementToAttributesToMaskMap.get(el) ?? new Set<string>()),\n );\n\n // Search for and mask any sensitive attribute values\n for (const hierarchyNode of hierarchy) {\n if (hierarchyNode?.attrs) {\n Object.entries(hierarchyNode.attrs).forEach(([key, value]) => {\n if (hierarchyNode.attrs) {\n hierarchyNode.attrs[key] = this.replaceSensitiveString(value);\n }\n });\n }\n }\n\n const endTime = performance.now();\n this.diagnosticsClient?.recordHistogram('autocapturePlugin.getHierarchy', endTime - startTime);\n\n return hierarchy;\n };\n\n getNearestLabel = (element: Element): string => {\n const parent = element.parentElement;\n if (!parent) {\n return '';\n }\n let labelElement: Element | null;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n } catch {\n /* istanbul ignore next */\n labelElement = null;\n }\n if (labelElement) {\n /* istanbul ignore next */\n return this.getText(labelElement);\n }\n return this.getNearestLabel(parent);\n };\n\n // Returns the Amplitude event properties for the given element.\n getEventProperties = (actionType: ActionType, element: Element, dataAttributePrefix: string) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n /* istanbul ignore next */\n const rect =\n typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n\n const hierarchy = this.getHierarchy(element);\n const currentElementAttributes = hierarchy[0]?.attrs;\n const nearestLabel = this.getNearestLabel(element);\n const attributes = extractPrefixedAttributes(currentElementAttributes ?? {}, dataAttributePrefix);\n\n /* istanbul ignore next */\n const properties: Record<string, any> = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY]: hierarchy,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT]: rect.left == null ? null : Math.round(rect.left),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP]: rect.top == null ? null : Math.round(rect.top),\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES]: attributes,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL]: nearestLabel,\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: getDecodeURI(window.location.href.split('?')[0]),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE]: (\n getPageTitle as (parseTitleFunction: (title: string) => string) => string\n )(this.replaceSensitiveString),\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: window.innerHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: window.innerWidth,\n };\n\n // id is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '';\n\n // class is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.getAttribute('class');\n\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = currentElementAttributes?.['aria-label'];\n\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n const href = element.href.substring(0, constants.MAX_ATTRIBUTE_LENGTH);\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HREF] = this.replaceSensitiveString(href); // we don't use hierarchy here because we don't want href value to be changed\n }\n\n return removeEmptyProperties(properties);\n };\n\n addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n selectorAllowlist: string[],\n dataAttributePrefix: string,\n // capture the event if the cursor is a \"pointer\" when this element is clicked on\n // reason: a \"pointer\" cursor indicates that an element should be interactable\n // regardless of the element's tag name\n isCapturingCursorPointer = false,\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n if (isCapturingCursorPointer) {\n const isCursorPointer = isElementPointerCursor(baseEvent.event.target as Element, baseEvent.type);\n if (isCursorPointer) {\n baseEvent.closestTrackedAncestor = baseEvent.event.target as HTMLElement;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n baseEvent.closestTrackedAncestor,\n dataAttributePrefix,\n );\n return baseEvent;\n }\n }\n // Retrieve additional event properties from the target element\n const closestTrackedAncestor = getClosestElement(baseEvent.event.target as HTMLElement, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = this.getEventProperties(\n baseEvent.type,\n closestTrackedAncestor,\n dataAttributePrefix,\n );\n }\n return baseEvent;\n }\n\n return baseEvent;\n };\n\n extractDataFromDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Extract from DOM Element\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n const sourceElement = getDataSource(dataSource, contextElement);\n if (!sourceElement) {\n return undefined;\n }\n\n if (dataSource.elementExtractType === 'TEXT') {\n return this.getText(sourceElement);\n } else if (dataSource.elementExtractType === 'ATTRIBUTE' && dataSource.attribute) {\n return sourceElement.getAttribute(dataSource.attribute);\n }\n return undefined;\n }\n\n // TODO: Extract from other source types\n return undefined;\n };\n\n getText = (element: Element): string => {\n // Check if element or any parent has data-amp-mask attribute\n const hasMaskAttribute = element.closest(`[${TEXT_MASK_ATTRIBUTE}]`) !== null;\n if (hasMaskAttribute) {\n return MASKED_TEXT_VALUE;\n }\n let output = '';\n if (!element.querySelector(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`)) {\n output = (element as HTMLElement).innerText || '';\n } else {\n const clonedTree = element.cloneNode(true) as HTMLElement;\n // replace all elements with TEXT_MASK_ATTRIBUTE attribute and contenteditable with the text MASKED_TEXT_VALUE\n clonedTree.querySelectorAll(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`).forEach((node) => {\n (node as HTMLElement).innerText = MASKED_TEXT_VALUE;\n });\n output = clonedTree.innerText || '';\n }\n return this.replaceSensitiveString(output.substring(0, 255)).replace(/\\s+/g, ' ').trim();\n };\n\n // Returns the element properties for the given element in Visual Labeling.\n getEventTagProps = (element: Element): Record<string, JSONValue> => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties) as Record<string, JSONValue>;\n };\n}\n","/* 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 } from '../helpers';\nimport { ILogger, Messenger, ActionType } from '@amplitude/analytics-core';\nimport { VERSION } from '../version';\nimport { DataExtractor } from '../data-extractor';\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] Page URL'?: string;\n elementScreenshot?: Blob;\n}\n\ninterface TrackSelectorModeChangedData {\n newMode: string;\n pageUrl?: string;\n}\n\ninterface TrackSelectorMovedData {\n newEditorLocation: string;\n pageUrl?: string;\n}\n\nexport type ActionData = {\n ping: null | undefined;\n pong: null | undefined;\n 'page-loaded': null | undefined;\n 'selector-loaded': null | undefined;\n 'initialize-visual-tagging-selector': InitializeVisualTaggingSelectorData | null | undefined;\n 'close-visual-tagging-selector': null | undefined;\n 'element-selected': ElementSelectedData;\n 'track-selector-mode-changed': TrackSelectorModeChangedData;\n 'track-selector-moved': TrackSelectorMovedData;\n};\n\nexport interface Message<A extends Action> {\n action: A;\n data?: ActionData[A];\n}\n\ntype MessageRequest = {\n id: string;\n action: string;\n args: Record<string, any>;\n};\n\ntype MessageResponse = {\n id: string;\n action: string;\n responseData: any;\n};\n\n// TODO: use MessageChannel instead of window.postMessage\nexport class WindowMessenger implements Messenger {\n endpoint = AMPLITUDE_ORIGIN;\n logger?: ILogger;\n requestCallbacks: {\n [id: string]: {\n resolve: (data: any) => void;\n reject: (data: any) => void;\n };\n } = {};\n\n constructor({ origin = AMPLITUDE_ORIGIN }: { origin?: string } = {}) {\n this.endpoint = origin;\n }\n\n private notify(message: Message<Action> | MessageRequest) {\n this.logger?.debug?.('Message sent: ', JSON.stringify(message));\n (window.opener as WindowProxy)?.postMessage?.(message, this.endpoint);\n }\n\n // Send an async request to the parent window\n public sendRequest(action: string, args: Record<string, any>, options = { timeout: 15_000 }): Promise<any> {\n // Create Request ID\n const id = generateUniqueId();\n const request = {\n id,\n action,\n args,\n };\n\n // Create a Promise that will be resolved when the response is received\n const promise = new Promise((resolve, reject) => {\n this.requestCallbacks[id] = { resolve, reject };\n\n // Send the request\n this.notify(request);\n\n // Handle request timeouts\n if (options?.timeout > 0) {\n setTimeout(() => {\n reject(new Error(`${action} timed out (id: ${id})`));\n delete this.requestCallbacks[id];\n }, options.timeout);\n }\n });\n\n return promise;\n }\n\n // Handle messages from the parent window\n private handleResponse(response: MessageResponse) {\n if (!this.requestCallbacks[response.id]) {\n this.logger?.warn(`No callback found for request id: ${response.id}`);\n return;\n }\n\n this.requestCallbacks[response.id].resolve(response.responseData);\n delete this.requestCallbacks[response.id];\n }\n\n setup(\n {\n logger,\n endpoint,\n isElementSelectable,\n cssSelectorAllowlist,\n actionClickAllowlist,\n dataExtractor,\n }: {\n logger?: ILogger;\n endpoint?: string;\n isElementSelectable?: (action: InitializeVisualTaggingSelectorData['actionType'], element: Element) => boolean;\n cssSelectorAllowlist?: string[];\n actionClickAllowlist?: string[];\n dataExtractor: DataExtractor;\n } = { dataExtractor: new DataExtractor({}) },\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: dataExtractor.getEventTagProps,\n isElementSelectable: (element: Element) => {\n if (isElementSelectable) {\n return isElementSelectable(actionData?.actionType || 'click', element);\n }\n return true;\n },\n onTrack: this.onTrack,\n onSelect: this.onSelect,\n visualHighlightClass: AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n messenger: this,\n cssSelectorAllowlist,\n actionClickAllowlist,\n extractDataFromDataSource: dataExtractor.extractDataFromDataSource,\n dataExtractor,\n diagnostics: {\n autocapture: {\n version: VERSION,\n },\n },\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","import { Observable, getGlobalScope } from '@amplitude/analytics-core';\n\nexport const createMutationObservable = (): Observable<MutationRecord[]> => {\n return new Observable<MutationRecord[]>((observer) => {\n const mutationObserver = new MutationObserver((mutations) => {\n observer.next(mutations);\n });\n if (document.body) {\n mutationObserver.observe(document.body, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n });\n }\n return () => mutationObserver.disconnect();\n });\n};\n\n/**\n * Creates an observable that tracks click events on the document.\n * @param clickType - The type of click event to track (click or pointerdown)\n */\nexport const createClickObservable = (\n clickType: 'click' | 'pointerdown' = 'click',\n): Observable<MouseEvent | PointerEvent> => {\n return new Observable<MouseEvent | PointerEvent>((observer) => {\n const handler = (event: MouseEvent | PointerEvent) => {\n observer.next(event);\n };\n /* istanbul ignore next */\n getGlobalScope()?.document.addEventListener(clickType, handler, { capture: true });\n return () => {\n /* istanbul ignore next */\n getGlobalScope()?.document.removeEventListener(clickType, handler, { capture: true });\n };\n });\n};\n","/* eslint-disable no-restricted-globals */\nimport {\n type BrowserClient,\n type BrowserConfig,\n type EnrichmentPlugin,\n type ElementInteractionsOptions,\n DEFAULT_CSS_SELECTOR_ALLOWLIST,\n DEFAULT_ACTION_CLICK_ALLOWLIST,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n IDiagnosticsClient,\n getGlobalScope,\n multicast,\n} from '@amplitude/analytics-core';\nimport { VERSION } from './version';\nimport * as constants from './constants';\nimport {\n createShouldTrackEvent,\n type ElementBasedTimestampedEvent,\n type TimestampedEvent,\n type NavigateEvent,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport { createClickObservable, createMutationObservable } from './observables';\n\nimport {\n createLabeledEventToTriggerMap,\n createTriggerEvaluator,\n groupLabeledEventIdsByEventType,\n} from './pageActions/triggers';\nimport { DataExtractor } from './data-extractor';\nimport { Observable, Unsubscribable } from '@amplitude/analytics-core';\n\ntype NavigationType = {\n addEventListener: (type: string, listener: EventListenerOrEventListenerObject) => void;\n removeEventListener: (type: string, listener: EventListenerOrEventListenerObject) => void;\n};\n\ndeclare global {\n interface Window {\n navigation: NavigationType;\n }\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport type AutoCaptureOptionsWithDefaults = Required<\n Pick<ElementInteractionsOptions, 'debounceTime' | 'cssSelectorAllowlist' | 'actionClickAllowlist'>\n> &\n ElementInteractionsOptions;\n\nexport enum ObservablesEnum {\n ClickObservable = 'clickObservable',\n ChangeObservable = 'changeObservable',\n // ErrorObservable = 'errorObservable',\n NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n}\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;\n // [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n [ObservablesEnum.NavigateObservable]?: Observable<TimestampedEvent<NavigateEvent>>;\n}\n\nexport const autocapturePlugin = (\n options: ElementInteractionsOptions = {},\n context?: { diagnosticsClient: IDiagnosticsClient },\n): BrowserEnrichmentPlugin => {\n // Set the plugin version tag\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n context?.diagnosticsClient.setTag('plugin.autocapture.version', VERSION);\n\n const {\n dataAttributePrefix = DEFAULT_DATA_ATTRIBUTE_PREFIX,\n visualTaggingOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0;\n\n options.pageUrlExcludelist = options.pageUrlExcludelist?.reduce(\n (acc: (string | RegExp | { pattern: string })[], excludePattern) => {\n if (typeof excludePattern === 'string') {\n acc.push(excludePattern);\n }\n if (excludePattern instanceof RegExp) {\n acc.push(excludePattern);\n }\n if (typeof excludePattern === 'object' && excludePattern !== null && 'pattern' in excludePattern) {\n try {\n acc.push(new RegExp(excludePattern.pattern));\n } catch (regexError) {\n console.warn(`Invalid regex pattern: ${excludePattern.pattern}`, regexError);\n return acc;\n }\n }\n return acc;\n },\n [],\n );\n\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Unsubscribable[] = [];\n\n // Create data extractor based on options\n const dataExtractor = new DataExtractor(options, context);\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n const clickObservable = multicast(\n createClickObservable().map(\n (click) =>\n dataExtractor.addAdditionalEventProperties(\n click,\n 'click',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ) as ElementBasedTimestampedEvent<MouseEvent>,\n ),\n );\n\n const changeObservable = multicast(\n new Observable<ElementBasedTimestampedEvent<Event>>((observer) => {\n const handler = (changeEvent: Event) => {\n const enrichedChangeEvent = dataExtractor.addAdditionalEventProperties(\n changeEvent,\n 'change',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ) as ElementBasedTimestampedEvent<Event>;\n observer.next(enrichedChangeEvent);\n };\n /* istanbul ignore next */\n getGlobalScope()?.document.addEventListener('change', handler, { capture: true });\n /* istanbul ignore next */\n return () => getGlobalScope()?.document.removeEventListener('change', handler);\n }),\n );\n\n // Create Observable from unhandled errors\n // const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(\n // map((error) => addAdditionalEventProperties(error, 'error')),\n // );\n\n // Create observable for URL changes\n let navigateObservable: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = multicast(\n new Observable<TimestampedEvent<NavigateEvent>>((observer) => {\n const handler = (navigateEvent: NavigateEvent) => {\n const enrichedNavigateEvent = dataExtractor.addAdditionalEventProperties(\n navigateEvent,\n 'navigate',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n );\n observer.next(enrichedNavigateEvent);\n };\n window.navigation.addEventListener('navigate', handler as EventListener);\n return () => {\n window.navigation.removeEventListener('navigate', handler as EventListener);\n };\n }),\n );\n }\n\n const mutationObservable = multicast(\n createMutationObservable().map((mutation) =>\n dataExtractor.addAdditionalEventProperties(\n mutation,\n 'mutation',\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n dataAttributePrefix,\n ),\n ),\n );\n\n return {\n [ObservablesEnum.ChangeObservable]: changeObservable,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n [ObservablesEnum.ClickObservable]: clickObservable,\n [ObservablesEnum.MutationObservable]: mutationObservable,\n [ObservablesEnum.NavigateObservable]: navigateObservable,\n };\n };\n\n // Group labeled events by event type (eg. click, change)\n let groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions?.labeledEvents ?? {}));\n\n let labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions?.triggers ?? []);\n\n // Evaluate triggers for the given event by running the actions associated with the matching triggers\n const evaluateTriggers = createTriggerEvaluator(\n groupedLabeledEvents,\n labeledEventToTriggerMap,\n dataExtractor,\n options,\n );\n\n // Function to recalculate internal variables when remote config is updated\n const recomputePageActionsData = (remotePageActions: ElementInteractionsOptions['pageActions']) => {\n if (remotePageActions) {\n // Merge remote config with local options\n options.pageActions = {\n ...options.pageActions,\n ...remotePageActions,\n };\n\n // Recalculate internal variables\n groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values(options.pageActions.labeledEvents ?? {}));\n labeledEventToTriggerMap = createLabeledEventToTriggerMap(options.pageActions.triggers ?? []);\n\n // Update evaluateTriggers function\n evaluateTriggers.update(groupedLabeledEvents, labeledEventToTriggerMap, options);\n }\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Fetch remote config for pageActions in a non-blocking manner\n if (config.fetchRemoteConfig) {\n if (!config.remoteConfigClient) {\n // TODO(xinyi): Diagnostics.recordEvent\n config.loggerProvider.debug('Remote config client is not provided, skipping remote config fetch');\n } else {\n config.remoteConfigClient.subscribe('analyticsSDK.pageActions', 'all', (remoteConfig) => {\n recomputePageActionsData(remoteConfig as ElementInteractionsOptions['pageActions']);\n });\n }\n }\n\n // Create should track event functions the different allowlists\n const shouldTrackEvent = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\n );\n const shouldTrackActionClick = createShouldTrackEvent(\n options,\n (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist,\n );\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions\n const clickTrackingSubscription = trackClicks({\n allObservables,\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n\n subscriptions.push(clickTrackingSubscription);\n\n const changeSubscription = trackChange({\n allObservables,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(changeSubscription);\n\n const actionClickSubscription = trackActionClick({\n allObservables,\n options: options as AutoCaptureOptionsWithDefaults,\n getEventProperties: (...args) => dataExtractor.getEventProperties(...args, dataAttributePrefix),\n amplitude,\n shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n if (actionClickSubscription) {\n subscriptions.push(actionClickSubscription);\n }\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n dataExtractor: dataExtractor,\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n","import type { ElementInteractionsOptions, LabeledEvent, Trigger } from '@amplitude/analytics-core';\nimport type { ElementBasedTimestampedEvent, ElementBasedEvent } from 'src/helpers';\nimport { matchEventToFilter } from './matchEventToFilter';\nimport { executeActions } from './actions';\nimport type { DataExtractor } from '../data-extractor';\n\nconst eventTypeToBrowserEventMap = {\n '[Amplitude] Element Clicked': 'click',\n '[Amplitude] Element Changed': 'change',\n} as const;\n// groups labeled events by event type\n// skips any labeled events with malformed definitions or unexpected event_type\nexport const groupLabeledEventIdsByEventType = (labeledEvents: LabeledEvent[] | null | undefined) => {\n // Initialize all event types with empty sets\n const groupedLabeledEvents = Object.values(eventTypeToBrowserEventMap).reduce((acc, browserEvent) => {\n acc[browserEvent] = new Set<string>();\n return acc;\n }, {} as Record<string, Set<string>>);\n\n // If there are no labeled events, return the initialized groupedLabeledEvents\n if (!labeledEvents) {\n return groupedLabeledEvents;\n }\n\n // Group labeled events by event type\n for (const le of labeledEvents) {\n try {\n for (const def of le.definition) {\n const browserEvent = eventTypeToBrowserEventMap[def.event_type];\n if (browserEvent) {\n groupedLabeledEvents[browserEvent].add(le.id);\n }\n }\n } catch (e) {\n // Skip this labeled event if there is an error\n console.warn('Skipping Labeled Event due to malformed definition', le?.id, e);\n }\n }\n return groupedLabeledEvents;\n};\n\n// TODO: add tests\nexport const createLabeledEventToTriggerMap = (triggers: Trigger[]) => {\n const labeledEventToTriggerMap = new Map<string, Trigger[]>();\n for (const trigger of triggers) {\n for (const condition of trigger.conditions) {\n if (condition.type === 'LABELED_EVENT') {\n const eventId = condition.match.eventId;\n // Get existing triggers for this event ID or initialize empty array\n let existingTriggers = labeledEventToTriggerMap.get(eventId);\n if (!existingTriggers) {\n existingTriggers = [];\n labeledEventToTriggerMap.set(eventId, existingTriggers);\n }\n // Add current trigger to the list of triggers for this event ID\n existingTriggers.push(trigger);\n }\n }\n }\n return labeledEventToTriggerMap;\n};\n\n/**\n * Matches an event to labeled events based on the event's properties.\n * The logic matches exactly what is supported by the query backend.\n * TODO: later pre-filter the labeled events based on URL first\n *\n * @param event - The event to match against labeled events\n * @param labeledEvents - Array of labeled events to match against\n * @returns Array of matching labeled events\n */\nexport const matchEventToLabeledEvents = (\n event: ElementBasedTimestampedEvent<ElementBasedEvent>,\n labeledEvents: LabeledEvent[],\n) => {\n return labeledEvents.filter((le) => {\n return le.definition.some((def) => {\n return (\n eventTypeToBrowserEventMap[def.event_type] === event.type &&\n def.filters.every((filter) => matchEventToFilter(event, filter))\n );\n });\n });\n};\n\nexport const matchLabeledEventsToTriggers = (labeledEvents: LabeledEvent[], leToTriggerMap: Map<string, Trigger[]>) => {\n const matchingTriggers = new Set<Trigger>();\n for (const le of labeledEvents) {\n const triggers = leToTriggerMap.get(le.id);\n if (triggers) {\n for (const trigger of triggers) {\n matchingTriggers.add(trigger);\n }\n }\n }\n return Array.from(matchingTriggers);\n};\n\nexport class TriggerEvaluator {\n constructor(\n private groupedLabeledEvents: ReturnType<typeof groupLabeledEventIdsByEventType>,\n private labeledEventToTriggerMap: ReturnType<typeof createLabeledEventToTriggerMap>,\n private dataExtractor: DataExtractor,\n private options: ElementInteractionsOptions,\n ) {}\n\n evaluate(event: ElementBasedTimestampedEvent<ElementBasedEvent>) {\n // If there is no pageActions, return the event as is\n const { pageActions } = this.options;\n if (!pageActions) {\n return event;\n }\n\n // Find matching labeled events\n const matchingLabeledEvents = matchEventToLabeledEvents(\n event,\n Array.from(this.groupedLabeledEvents[event.type]).map((id) => pageActions.labeledEvents[id]),\n );\n // Find matching conditions\n const matchingTriggers = matchLabeledEventsToTriggers(matchingLabeledEvents, this.labeledEventToTriggerMap);\n for (const trigger of matchingTriggers) {\n executeActions(trigger.actions, event, this.dataExtractor);\n }\n\n return event;\n }\n\n update(\n groupedLabeledEvents: ReturnType<typeof groupLabeledEventIdsByEventType>,\n labeledEventToTriggerMap: ReturnType<typeof createLabeledEventToTriggerMap>,\n options: ElementInteractionsOptions,\n ) {\n this.groupedLabeledEvents = groupedLabeledEvents;\n this.labeledEventToTriggerMap = labeledEventToTriggerMap;\n this.options = options;\n }\n}\n\nexport const createTriggerEvaluator = (\n groupedLabeledEvents: ReturnType<typeof groupLabeledEventIdsByEventType>,\n labeledEventToTriggerMap: ReturnType<typeof createLabeledEventToTriggerMap>,\n dataExtractor: DataExtractor,\n options: ElementInteractionsOptions,\n) => {\n return new TriggerEvaluator(groupedLabeledEvents, labeledEventToTriggerMap, dataExtractor, options);\n};\n","import type { Filter } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport { ElementBasedTimestampedEvent, ElementBasedEvent } from 'src/helpers';\n\n/**\n * Matches an event to a single filter\n * @param event - The event to match\n * @param filter - The filter to match against\n * @returns boolean indicating if the event matches the filter\n */\nexport const matchEventToFilter = (event: ElementBasedTimestampedEvent<ElementBasedEvent>, filter: Filter) => {\n try {\n if (filter.subprop_key === '[Amplitude] Element Text') {\n // TODO: add support for the other operators\n return (\n filter.subprop_op === 'is' &&\n filter.subprop_value.includes(event.targetElementProperties['[Amplitude] Element Text'] as string)\n );\n } else if (filter.subprop_key === '[Amplitude] Element Hierarchy') {\n // Check if the element ancestory matches the CSS selector, always check this last since it is the most expensive\n return (\n filter.subprop_op === 'autotrack css match' &&\n !!event.closestTrackedAncestor.closest(filter.subprop_value.toString())\n );\n }\n } catch (error) {\n console.error('Error matching event to filter', error);\n return false;\n }\n return false;\n};\n","import { AllWindowObservables } from 'src/autocapture-plugin';\nimport { type evaluateTriggersFn } from 'src/helpers';\nimport { Observable, BrowserClient } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nexport function trackClicks({\n amplitude,\n allObservables,\n shouldTrackEvent,\n evaluateTriggers,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n shouldTrackEvent: shouldTrackEvent;\n evaluateTriggers: evaluateTriggersFn;\n}) {\n const { clickObservable } = allObservables;\n\n const clickObservableFiltered = clickObservable\n .filter(filterOutNonTrackableEvents)\n .filter((click) => {\n // Only track clicks on elements that should be tracked,\n return shouldTrackEvent('click', click.closestTrackedAncestor);\n })\n .map((click) => evaluateTriggers(click));\n\n const clicks: Observable<typeof clickObservableFiltered extends Observable<infer U> ? U : never> =\n clickObservableFiltered;\n\n return clicks.subscribe((click) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CLICKED_EVENT, click.targetElementProperties);\n });\n}\n","import { AllWindowObservables } from 'src/autocapture-plugin';\nimport { ElementBasedTimestampedEvent, type evaluateTriggersFn } from 'src/helpers';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CHANGED_EVENT } from '../constants';\n\nexport function trackChange({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackEvent,\n evaluateTriggers,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackEvent: shouldTrackEvent;\n evaluateTriggers: evaluateTriggersFn;\n}) {\n const { changeObservable } = allObservables;\n\n const filteredChangeObservable = changeObservable\n .filter(filterOutNonTrackableEvents)\n .filter((changeEvent: ElementBasedTimestampedEvent<Event>) => {\n // Only track change on elements that should be tracked,\n return shouldTrackEvent('change', changeEvent.closestTrackedAncestor);\n })\n .map((changeEvent) => evaluateTriggers(changeEvent));\n\n return filteredChangeObservable.subscribe((changeEvent) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', changeEvent.closestTrackedAncestor));\n });\n}\n","import { AllWindowObservables, AutoCaptureOptionsWithDefaults } from 'src/autocapture-plugin';\nimport { BrowserClient, ActionType, merge, asyncMap } from '@amplitude/analytics-core';\nimport {\n ElementBasedTimestampedEvent,\n filterOutNonTrackableEvents,\n getClosestElement,\n shouldTrackEvent,\n TimestampedEvent,\n} from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\n\nexport function trackActionClick({\n amplitude,\n allObservables,\n options,\n getEventProperties,\n shouldTrackEvent,\n shouldTrackActionClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n options: AutoCaptureOptionsWithDefaults;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackActionClick: shouldTrackEvent;\n shouldTrackEvent: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable } = allObservables;\n\n const filteredClickObservable = clickObservable\n .filter((click) => {\n return !shouldTrackEvent('click', click.closestTrackedAncestor);\n })\n .map((click) => {\n // overwrite the closestTrackedAncestor with the closest element that is on the actionClickAllowlist\n const closestActionClickEl = getClosestElement(click.event.target as Element, options.actionClickAllowlist);\n click.closestTrackedAncestor = closestActionClickEl as Element;\n\n // overwrite the targetElementProperties with the properties of the closestActionClickEl\n if (click.closestTrackedAncestor !== null) {\n click.targetElementProperties = getEventProperties(click.type, click.closestTrackedAncestor);\n }\n return click;\n })\n .filter(filterOutNonTrackableEvents)\n .filter((clickEvent) => {\n // Only track change on elements that should be tracked\n return shouldTrackActionClick('click', clickEvent.closestTrackedAncestor);\n });\n\n const mutationOrNavigate = navigateObservable ? merge(mutationObservable, navigateObservable) : mutationObservable;\n\n const clickMutationNavigateObservable = merge(filteredClickObservable, mutationOrNavigate);\n\n let actionClickTimer: ReturnType<typeof setTimeout> | null = null;\n let lastClickEvent: TimestampedEvent<any> | null = null;\n\n const actionClickObservable = asyncMap(clickMutationNavigateObservable, (event) => {\n // clear any previous timer\n if (actionClickTimer) {\n clearTimeout(actionClickTimer);\n actionClickTimer = null;\n }\n if (event.type === 'click') {\n // mark the 'last click event'\n lastClickEvent = event;\n\n // set a timer to clear last click event if no mutation event between now and 500ms\n actionClickTimer = setTimeout(() => {\n actionClickTimer = null;\n lastClickEvent = null;\n }, 500);\n return Promise.resolve(null);\n } else {\n // if mutation/navigation + last click event, then it's an action click\n if (lastClickEvent) {\n const event = lastClickEvent;\n lastClickEvent = null;\n return Promise.resolve(event);\n }\n }\n return Promise.resolve(null);\n });\n\n return actionClickObservable.subscribe((actionClick) => {\n if (!actionClick) return;\n /* istanbul ignore next */\n amplitude?.track(\n AMPLITUDE_ELEMENT_CLICKED_EVENT,\n getEventProperties('click', (actionClick as ElementBasedTimestampedEvent<MouseEvent>).closestTrackedAncestor),\n );\n });\n}\n","import { AllWindowObservables } from 'src/frustration-plugin';\nimport { BrowserClient, ActionType, merge, asyncMap } from '@amplitude/analytics-core';\nimport { ElementBasedTimestampedEvent, filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT } from '../constants';\nconst DEAD_CLICK_TIMEOUT = 3000; // 3 seconds to wait for an activity to happen\n\ntype EventDeadClick = {\n '[Amplitude] X': number;\n '[Amplitude] Y': number;\n};\n\nconst CHANGE_EVENTS = ['mutation', 'navigate'];\n\nexport function trackDeadClick({\n amplitude,\n allObservables,\n getEventProperties,\n shouldTrackDeadClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n getEventProperties: (actionType: ActionType, element: Element) => Record<string, any>;\n shouldTrackDeadClick: shouldTrackEvent;\n}) {\n const { clickObservable, mutationObservable, navigateObservable }: AllWindowObservables = allObservables;\n\n const filteredClickObservable = clickObservable.filter((click) => {\n return (\n filterOutNonTrackableEvents(click) &&\n shouldTrackDeadClick('click', click.closestTrackedAncestor) &&\n click.event.target instanceof Element &&\n click.event.target.closest('a[target=\"_blank\"]') === null\n );\n });\n\n /* istanbul ignore next */\n const changeObservables = navigateObservable ? merge(mutationObservable, navigateObservable) : mutationObservable;\n\n const clicksAndChangeObservable = merge(filteredClickObservable, changeObservables);\n\n let deadClickTimer: ReturnType<typeof setTimeout> | null = null;\n\n const deadClickObservable = asyncMap(\n clicksAndChangeObservable,\n (event): Promise<ElementBasedTimestampedEvent<MouseEvent> | null> => {\n if (deadClickTimer && CHANGE_EVENTS.includes(event.type)) {\n // a mutation or navigation means it's not a dead click, so clear the timer\n clearTimeout(deadClickTimer);\n deadClickTimer = null;\n return Promise.resolve(null);\n } else if (event.type === 'click') {\n // if a dead click is already on-deck, return null.\n // this throttles dead clicks events so no more than one dead click event\n // is tracked per every DEAD_CLICK_TIMEOUT ms.\n if (deadClickTimer) {\n return Promise.resolve(null);\n }\n return new Promise((resolve) => {\n deadClickTimer = setTimeout(() => {\n resolve(event as ElementBasedTimestampedEvent<MouseEvent>);\n deadClickTimer = null;\n }, DEAD_CLICK_TIMEOUT);\n });\n }\n // unreachable code, but needed to satisfy the type checker\n return Promise.resolve(null);\n },\n );\n\n return deadClickObservable.subscribe((actionClick) => {\n if (!actionClick) return;\n const deadClickEvent: EventDeadClick = {\n '[Amplitude] X': (actionClick.event as MouseEvent).clientX,\n '[Amplitude] Y': (actionClick.event as MouseEvent).clientY,\n };\n amplitude.track(\n AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT,\n {\n ...getEventProperties('click', actionClick.closestTrackedAncestor),\n ...deadClickEvent,\n },\n { time: actionClick.timestamp },\n );\n });\n}\n","import { AllWindowObservables } from 'src/frustration-plugin';\nimport {\n BrowserClient,\n asyncMap,\n DEFAULT_RAGE_CLICK_THRESHOLD,\n DEFAULT_RAGE_CLICK_WINDOW_MS,\n DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD,\n} from '@amplitude/analytics-core';\nimport { shouldTrackEvent } from '../helpers';\nimport { AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT } from '../constants';\n\nconst RAGE_CLICK_THRESHOLD = DEFAULT_RAGE_CLICK_THRESHOLD;\nconst RAGE_CLICK_WINDOW_MS = DEFAULT_RAGE_CLICK_WINDOW_MS;\nconst RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD = DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD;\n\ntype Click = {\n X: number;\n Y: number;\n Time: number;\n};\n\ntype EventRageClick = {\n '[Amplitude] Begin Time': string; // ISO-8601\n '[Amplitude] End Time': string; // ISO-8601\n '[Amplitude] Duration': number;\n '[Amplitude] Clicks': Array<Click>;\n '[Amplitude] Click Count': number;\n};\n\ntype ClickEvent = {\n event: MouseEvent | Event;\n timestamp: number;\n targetElementProperties: Record<string, any>;\n closestTrackedAncestor: Element | null;\n};\n\ntype ClickRegionBoundingBox = {\n yMin?: number;\n yMax?: number;\n xMin?: number;\n xMax?: number;\n isOutOfBounds?: boolean;\n};\n\ntype RageClickEvent = {\n rageClickEvent: EventRageClick;\n time: number;\n};\n\nfunction addCoordinates(regionBox: ClickRegionBoundingBox, click: ClickEvent) {\n const { clientX, clientY } = click.event as MouseEvent;\n regionBox.yMin = Math.min(regionBox.yMin ?? clientY, clientY);\n regionBox.yMax = Math.max(regionBox.yMax ?? clientY, clientY);\n regionBox.xMin = Math.min(regionBox.xMin ?? clientX, clientX);\n regionBox.xMax = Math.max(regionBox.xMax ?? clientX, clientX);\n regionBox.isOutOfBounds =\n regionBox.yMax - regionBox.yMin > RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD ||\n regionBox.xMax - regionBox.xMin > RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD;\n}\n\nfunction getRageClickAnalyticsEvent(clickWindow: ClickEvent[]) {\n /* istanbul ignore if */\n if (clickWindow.length === 0) {\n return null;\n }\n const firstClick = clickWindow[0];\n const lastClick = clickWindow[clickWindow.length - 1];\n\n const rageClickEvent: EventRageClick = {\n '[Amplitude] Begin Time': new Date(firstClick.timestamp).toISOString(),\n '[Amplitude] End Time': new Date(lastClick.timestamp).toISOString(),\n '[Amplitude] Duration': lastClick.timestamp - firstClick.timestamp,\n '[Amplitude] Clicks': clickWindow.map((click) => ({\n X: (click.event as MouseEvent).clientX,\n Y: (click.event as MouseEvent).clientY,\n Time: click.timestamp,\n })),\n '[Amplitude] Click Count': clickWindow.length,\n ...firstClick.targetElementProperties,\n };\n\n return { rageClickEvent, time: firstClick.timestamp };\n}\n\nfunction isClickOutsideRageClickWindow(clickWindow: ClickEvent[], click: ClickEvent) {\n const firstIndex = Math.max(0, clickWindow.length - RAGE_CLICK_THRESHOLD + 1);\n const firstClick = clickWindow[firstIndex];\n return click.timestamp - firstClick.timestamp >= RAGE_CLICK_WINDOW_MS;\n}\n\nfunction isNewElement(clickWindow: ClickEvent[], click: ClickEvent) {\n return (\n clickWindow.length > 0 &&\n clickWindow[clickWindow.length - 1].closestTrackedAncestor !== click.closestTrackedAncestor\n );\n}\n\nexport function trackRageClicks({\n amplitude,\n allObservables,\n shouldTrackRageClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n shouldTrackRageClick: shouldTrackEvent;\n}) {\n const { clickObservable }: AllWindowObservables = allObservables;\n\n // Keep track of all clicks within the sliding window\n let clickWindow: ClickEvent[] = [];\n\n // Keep track of the region box for all clicks, to determine when a rage click is out of bounds\n let clickBoundingBox: ClickRegionBoundingBox = {};\n\n let pendingRageClick: {\n resolve: (rageClickEvent: RageClickEvent | null) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n timerId: any;\n } | null = null;\n\n // helper function to reset the click window and region box\n function resetClickWindow(click?: ClickEvent) {\n clickWindow = [];\n clickBoundingBox = {};\n if (click) {\n addCoordinates(clickBoundingBox, click);\n clickWindow.push(click);\n }\n }\n\n const rageClickObservable = asyncMap(\n clickObservable.filter((click) => shouldTrackRageClick('click', click.closestTrackedAncestor)),\n async (click: ClickEvent): Promise<RageClickEvent | null> => {\n // add this click's coordinates to the bounding box\n addCoordinates(clickBoundingBox, click);\n\n let resolutionValue: RageClickEvent | null = null;\n\n // if current click is:\n // 1. first click in the window\n // 2. on a new element\n // 3. outside the rage click time window\n // 4. out of bounds\n // then start a new click window\n if (\n clickWindow.length === 0 ||\n isNewElement(clickWindow, click) ||\n isClickOutsideRageClickWindow(clickWindow, click) ||\n clickBoundingBox.isOutOfBounds\n ) {\n // if there was a previous Rage Click Event on deck, then send it\n if (pendingRageClick) {\n resolutionValue = getRageClickAnalyticsEvent(clickWindow);\n }\n\n resetClickWindow(click);\n } else {\n clickWindow.push(click);\n }\n\n // if there was a previous Rage Click Event on deck, then resolve it\n if (pendingRageClick) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n clearTimeout(pendingRageClick.timerId);\n pendingRageClick.resolve(resolutionValue);\n pendingRageClick = null;\n }\n\n // if we have enough clicks to be a rage click, set a timout to trigger the rage\n // click event after the time threshold is reached.\n // This will be cancelled if a new click is tracked within the time threshold.\n if (clickWindow.length >= RAGE_CLICK_THRESHOLD) {\n return new Promise((resolve) => {\n pendingRageClick = {\n resolve,\n timerId: setTimeout(() => {\n resolve(getRageClickAnalyticsEvent(clickWindow));\n }, RAGE_CLICK_WINDOW_MS),\n };\n });\n }\n\n return null;\n },\n );\n\n return rageClickObservable.subscribe((data: RageClickEvent | null) => {\n /* istanbul ignore if */\n if (data === null) {\n return;\n }\n amplitude.track(AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT, data.rageClickEvent, { time: data.time });\n });\n}\n","/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n FrustrationInteractionsOptions,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n DEFAULT_RAGE_CLICK_ALLOWLIST,\n DEFAULT_DEAD_CLICK_ALLOWLIST,\n multicast,\n Observable,\n Unsubscribable,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { createShouldTrackEvent, ElementBasedTimestampedEvent, NavigateEvent, TimestampedEvent } from './helpers';\nimport { trackDeadClick } from './autocapture/track-dead-click';\nimport { trackRageClicks } from './autocapture/track-rage-click';\nimport { ObservablesEnum } from './autocapture-plugin';\nimport { createClickObservable, createMutationObservable } from './observables';\nimport { DataExtractor } from './data-extractor';\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n [ObservablesEnum.NavigateObservable]?: Observable<TimestampedEvent<NavigateEvent>>;\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport const frustrationPlugin = (options: FrustrationInteractionsOptions = {}): BrowserEnrichmentPlugin => {\n const name = constants.FRUSTRATION_PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Unsubscribable[] = [];\n\n const rageCssSelectors = options.rageClicks?.cssSelectorAllowlist ?? DEFAULT_RAGE_CLICK_ALLOWLIST;\n const deadCssSelectors = options.deadClicks?.cssSelectorAllowlist ?? DEFAULT_DEAD_CLICK_ALLOWLIST;\n\n const dataAttributePrefix = options.dataAttributePrefix ?? DEFAULT_DATA_ATTRIBUTE_PREFIX;\n\n const dataExtractor = new DataExtractor(options);\n\n // combine the two selector lists to determine which clicked elements should be filtered\n const combinedCssSelectors = [...new Set([...rageCssSelectors, ...deadCssSelectors])];\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n const clickObservable = multicast(\n createClickObservable('pointerdown').map((click) => {\n return dataExtractor.addAdditionalEventProperties(\n click,\n 'click',\n combinedCssSelectors,\n dataAttributePrefix,\n true, // capture when cursor is pointer\n );\n }),\n );\n\n const enrichedMutationObservable = multicast<TimestampedEvent<MutationRecord[]>>(\n createMutationObservable().map((mutation) =>\n dataExtractor.addAdditionalEventProperties(mutation, 'mutation', combinedCssSelectors, dataAttributePrefix),\n ),\n );\n\n let enrichedNavigateObservable: Observable<TimestampedEvent<NavigateEvent>> | undefined;\n\n if (window.navigation) {\n const navigateObservable = new Observable<Event>((observer) => {\n const handler = (event: Event): void => {\n observer.next({\n ...event,\n type: 'navigate',\n });\n };\n window.navigation.addEventListener('navigate', handler);\n return () => {\n window.navigation.removeEventListener('navigate', handler);\n };\n });\n enrichedNavigateObservable = multicast<TimestampedEvent<NavigateEvent>>(\n navigateObservable.map<TimestampedEvent<NavigateEvent>>(\n (navigate) =>\n dataExtractor.addAdditionalEventProperties(\n navigate,\n 'navigate',\n combinedCssSelectors,\n dataAttributePrefix,\n ) as TimestampedEvent<NavigateEvent>,\n ),\n );\n }\n\n return {\n [ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,\n [ObservablesEnum.MutationObservable]: enrichedMutationObservable,\n [ObservablesEnum.NavigateObservable]: enrichedNavigateObservable,\n };\n };\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n // Create should track event functions for the different allowlists\n const shouldTrackRageClick = createShouldTrackEvent(options, rageCssSelectors);\n const shouldTrackDeadClick = createShouldTrackEvent(options, deadCssSelectors);\n\n // Create observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions\n const rageClickSubscription = trackRageClicks({\n allObservables,\n amplitude,\n shouldTrackRageClick,\n });\n subscriptions.push(rageClickSubscription);\n\n const deadClickSubscription = trackDeadClick({\n amplitude,\n allObservables,\n getEventProperties: (actionType, element) =>\n dataExtractor.getEventProperties(actionType, element, dataAttributePrefix),\n shouldTrackDeadClick,\n });\n subscriptions.push(deadClickSubscription);\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","v","op","TypeError","pop","push","__values","o","m","__read","r","ar","error","__spreadArray","to","from","pack","l","Array","slice","concat","SuppressedError","getGlobalScope","ampIntegrationContextName","globalThis","window","self","global","isUrlMatchAllowlist","url","allowlist","some","allowedUrl","match","DEFAULT_CSS_SELECTOR_ALLOWLIST","DEFAULT_DATA_ATTRIBUTE_PREFIX","DEFAULT_ACTION_CLICK_ALLOWLIST","DEFAULT_DEAD_CLICK_ALLOWLIST","DEFAULT_RAGE_CLICK_ALLOWLIST","TEXT_MASK_ATTRIBUTE","MASKED_TEXT_VALUE","CC_REGEX","SSN_REGEX","EMAIL_REGEX","_createForOfIteratorHelperLoose","allowArrayLike","it","bind","isArray","minLen","_arrayLikeToArray","toString","constructor","name","test","_unsupportedIterableToArray","arr","len","arr2","_defineProperties","target","props","descriptor","enumerable","configurable","writable","defineProperty","key","_createClass","Constructor","protoProps","staticProps","hasSymbols","hasSymbol","Boolean","getSymbol","observable","SymbolIterator","SymbolObservable","SymbolSpecies","getMethod","obj","getSpecies","ctor","undefined","Observable","isObservable","x","hostReportError","log","setTimeout","enqueue","fn","cleanupSubscription","subscription","cleanup","_cleanup","unsubscribe","closeSubscription","_observer","_queue","_state","notifySubscription","type","observer","onNotify","queue","flushSubscription","Subscription","subscriber","subscriptionObserver","SubscriptionObserver","get","_subscription","_proto2","complete","_subscriber","_proto3","subscribe","forEach","_this","map","_this2","filter","_this3","reduce","_this4","C","hasSeed","hasValue","acc","first","_this5","_len","sources","_key","index","startNext","flatMap","_this6","subscriptions","outer","inner","indexOf","splice","completeIfDone","closed","method","_step","_iterator","item","of","_len2","items","_key2","asyncMap","ZenObservable","catch","merge","sourceA","sourceB","Set","e_1","_a","subscriptions_1","subscriptions_1_1","sub","_b","e_1_1","return","clear","subscribeTo","source","err","delete","size","add","multicast","observers","e_2","observers_1","observers_1_1","obs","e_2_1","e_3","observers_2","observers_2_1","e_3_1","e_4","observers_3","observers_3_1","e_4_1","symbol","VERSION","AMPLITUDE_ELEMENT_CLICKED_EVENT","AMPLITUDE_EVENT_PROP_ELEMENT_TAG","AMPLITUDE_EVENT_PROP_ELEMENT_TEXT","AMPLITUDE_EVENT_PROP_PAGE_URL","AMPLITUDE_ORIGIN","AMPLITUDE_ORIGINS_MAP","US","EU","STAGING","DATA_AMP_MASK_ATTRIBUTES","SENSITIVE_TAGS","isElementPointerCursor","element","actionType","computedStyle","getComputedStyle","getPropertyValue","createShouldTrackEvent","autocaptureOptions","isAlwaysCaptureCursorPointer","pageUrlAllowlist","pageUrlExcludelist","shouldTrackEventResolver","tag","tagName","toLowerCase","location","href","elementType","String","getAttribute","isCursorPointer","hasMatchAnyAllowedSelector","selector","matches","parseAttributesToMask","attributeString","split","attr","trim","removeEmptyProperties","properties","keys","filteredProperties","isEmpty","getClosestElement","selectors","parentElement","filterOutNonTrackableEvents","event","closestTrackedAncestor","BLOCKED_ATTRIBUTES","SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST","SVG_TAGS","HIGHLY_SENSITIVE_INPUT_TYPES","getElementProperties","userMaskedAttributeNames","siblings","_c","children","indexOfType","el","prevSiblingTag","_e","_d","previousElementSibling","prevSib","id","classes","classList","attributes","filteredAttributes","has","isSensitiveElement","isContentEditable","HTMLElement","includes","isNonSensitiveElement","filteredAttributes_1","filteredAttributes_1_1","substring","attrs","executeActions","actions","ev","dataExtractor","action","data","extractDataFromDataSource","dataSource","targetElementProperties","destinationKey","DataExtractor","options","context","replaceSensitiveString","text","additionalMaskTextPatterns","replace","additionalMaskTextPatterns_1","additionalMaskTextPatterns_1_1","pattern","getHierarchy","hierarchy","startTime","performance","now","ancestors","targetEl","current","getAncestors","elementToAttributesToMaskMap","Map","node","attributesToMask","constants.DATA_AMP_MASK_ATTRIBUTES","ancestorAttributesToMask","combinedAttributesToMask","set","hierarchyNode","entries","hierarchy_1","hierarchy_1_1","endTime","diagnosticsClient","recordHistogram","getNearestLabel","labelElement","parent","querySelector","getText","getEventProperties","dataAttributePrefix","prefix","rect","getBoundingClientRect","left","top","currentElementAttributes","nearestLabel","attributeName","attributeValue","startsWith","attributeKey","constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG","constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT","Math","round","constants.AMPLITUDE_EVENT_PROP_PAGE_URL","locationStr","loggerProvider","decodedLocationStr","decodeURI","getDecodeURI","parseTitleFunction","document","title","titleElement","hasAttribute","getPageTitle","innerHeight","innerWidth","HTMLAnchorElement","addAdditionalEventProperties","selectorAllowlist","isCapturingCursorPointer","baseEvent","timestamp","Date","isElementBasedEvent","contextElement","sourceType","sourceElement","scopingElement","documentElement","scope","closest","getDataSource","elementExtractType","attribute","output","clonedTree","cloneNode","querySelectorAll","innerText","getEventTagProps","rawPatterns","maskTextRegex","compiled","rawPatterns_1","rawPatterns_1_1","entry","RegExp","WindowMessenger","origin","endpoint","requestCallbacks","onSelect","notify","onTrack","message","logger","debug","JSON","stringify","opener","postMessage","sendRequest","args","timeout","random","substr","request","Error","handleResponse","response","responseData","warn","setup","isElementSelectable","cssSelectorAllowlist","actionClickAllowlist","amplitudeVisualTaggingSelectorInstance","addEventListener","eventData","actionData_1","scriptElement","createElement","async","src","status","once","head","appendChild","amplitudeVisualTaggingSelector","visualHighlightClass","messenger","diagnostics","autocapture","version","close","ObservablesEnum","createMutationObservable","mutationObserver","MutationObserver","mutations","observe","childList","characterData","subtree","disconnect","createClickObservable","clickType","handler","capture","removeEventListener","eventTypeToBrowserEventMap","groupLabeledEventIdsByEventType","labeledEvents","groupedLabeledEvents","values","browserEvent","labeledEvents_1","labeledEvents_1_1","le","definition","def","event_type","console","createLabeledEventToTriggerMap","triggers","labeledEventToTriggerMap","triggers_1","triggers_1_1","trigger","conditions","condition","eventId","existingTriggers","matchEventToLabeledEvents","filters","every","subprop_key","subprop_op","subprop_value","matchEventToFilter","TriggerEvaluator","evaluate","pageActions","matchingTriggers","leToTriggerMap","labeledEvents_2","labeledEvents_2_1","triggers_2","e_6","triggers_2_1","matchLabeledEventsToTriggers","matchingTriggers_1","matchingTriggers_1_1","update","autocapturePlugin","setTag","_j","_k","visualTaggingOptions","enabled","debounceTime","excludePattern","regexError","_f","_g","_h","evaluateTriggers","createTriggerEvaluator","config","amplitude","fetchRemoteConfig","remoteConfigClient","remoteConfig","remotePageActions","recomputePageActionsData","shouldTrackEvent","shouldTrackActionClick","allObservables","navigateObservable","clickObservable","click","changeObservable","changeEvent","enrichedChangeEvent","navigation","navigateEvent","enrichedNavigateEvent","mutationObservable","mutation","ChangeObservable","ClickObservable","MutationObservable","NavigateObservable","createObservables","clickTrackingSubscription","track","trackClicks","changeSubscription","trackChange","_i","actionClickSubscription","filteredClickObservable","closestActionClickEl","clickEvent","mutationOrNavigate","clickMutationNavigateObservable","actionClickTimer","lastClickEvent","clearTimeout","event_1","actionClick","trackActionClick","serverZone","constants.AMPLITUDE_ORIGINS_MAP","execute","teardown","CHANGE_EVENTS","addCoordinates","regionBox","clientX","clientY","yMin","min","yMax","max","xMin","xMax","isOutOfBounds","getRageClickAnalyticsEvent","clickWindow","firstClick","lastClick","rageClickEvent","toISOString","X","Y","Time","time","trackRageClicks","shouldTrackRageClick","clickBoundingBox","pendingRageClick","resolutionValue","isNewElement","isClickOutsideRageClickWindow","resetClickWindow","timerId","rageCssSelectors","rageClicks","deadCssSelectors","deadClicks","combinedCssSelectors","shouldTrackDeadClick","enrichedNavigateObservable","enrichedMutationObservable","navigate","rageClickSubscription","deadClickSubscription","Element","changeObservables","clicksAndChangeObservable","deadClickTimer","deadClickEvent","trackDeadClick"],"mappings":"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"}