@amplitude/plugin-autocapture-browser 1.23.4 → 1.23.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/version.d.ts +1 -1
- package/lib/cjs/version.js +1 -1
- package/lib/cjs/version.js.map +1 -1
- package/lib/esm/version.d.ts +1 -1
- package/lib/esm/version.js +1 -1
- package/lib/esm/version.js.map +1 -1
- package/lib/scripts/amplitude-min.js +1 -1
- package/lib/scripts/amplitude-min.js.gz +0 -0
- package/lib/scripts/amplitude-min.js.map +1 -1
- package/lib/scripts/amplitude-min.umd.js +1 -1
- package/lib/scripts/amplitude-min.umd.js.gz +0 -0
- package/lib/scripts/version.d.ts +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amplitude-min.js","sources":["../../../../node_modules/.pnpm/@rollup+plugin-typescript@10.0.1_rollup@2.79.2_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js","../../../analytics-core/src/global-scope.ts","../../../analytics-core/src/utils/url-utils.ts","../../../analytics-core/src/observers/console.ts","../../../analytics-core/src/types/element-interactions.ts","../../../analytics-core/src/types/frustration-interactions.ts","../../../analytics-core/src/plugins/helpers.ts","../../../../node_modules/.pnpm/zen-observable@0.10.0/node_modules/zen-observable/lib/Observable.js","../../../../node_modules/.pnpm/zen-observable@0.10.0/node_modules/zen-observable/index.js","../../../analytics-core/src/utils/observable.ts","../../../analytics-core/src/messenger/constants.ts","../../../analytics-core/src/messenger/base-window-messenger.ts","../../../analytics-core/src/messenger/utils.ts","../../../analytics-core/src/messenger/background-capture.ts","../../../src/version.ts","../../../src/helpers.ts","../../../src/constants.ts","../../../src/libs/messenger.ts","../../../src/observables.ts","../../../src/pageActions/actions.ts","../../../src/pageActions/triggers.ts","../../../src/pageActions/matchEventToFilter.ts","../../../src/hierarchy.ts","../../../src/data-extractor.ts","../../../src/autocapture-plugin.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/autocapture/track-error-click.ts","../../../src/autocapture/track-thrashed-cursor.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 */\n\nexport const getGlobalScope = (): typeof globalThis | undefined => {\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 const ampIntegrationContextName = 'ampIntegrationContext' as keyof typeof globalThis;\n if (typeof globalThis !== 'undefined' && typeof globalThis[ampIntegrationContextName] !== 'undefined') {\n return globalThis[ampIntegrationContextName] as typeof globalThis;\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","import { ILogger } from '../logger';\n\n/**\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 const isUrlMatchAllowlist = (url: string, allowlist: (string | RegExp)[] | undefined): boolean => {\n if (!allowlist || !allowlist.length) {\n return true;\n }\n return allowlist.some((allowedUrl) => {\n if (typeof allowedUrl === 'string') {\n return url === allowedUrl;\n }\n return url.match(allowedUrl);\n });\n};\n\nexport const getDecodeURI = (locationStr: string, loggerProvider?: ILogger): string => {\n let decodedLocationStr = locationStr;\n try {\n decodedLocationStr = decodeURI(locationStr);\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.error('Malformed URI sequence: ', e);\n }\n\n return decodedLocationStr;\n};\n","import { getGlobalScope } from '../global-scope';\n\ntype ConsoleLogLevel = keyof Console;\ntype Callback = (logLevel: ConsoleLogLevel, args: any[]) => void;\n\nconst globalScope = getGlobalScope();\n/* istanbul ignore next */\nconst originalConsole: any = globalScope?.console;\n\nlet handlers: { [key in ConsoleLogLevel]?: Array<Callback> } = {};\n\n// keeps reference to original console methods\nlet originalFn: { [key in ConsoleLogLevel]?: (...args: any[]) => void } = {};\n\nlet inConsoleOverride = false;\n\nfunction overrideConsole(logLevel: ConsoleLogLevel): boolean {\n /* istanbul ignore if */\n if (!originalConsole) {\n return false;\n }\n\n // should not override if original console property is not a function\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n if (typeof originalConsole[logLevel] !== 'function') {\n return false;\n }\n\n // if console is already overridden, return true\n if (originalFn[logLevel]) {\n return true;\n }\n\n // override console method\n const handler = function (...args: any[]) {\n try {\n if (handlers[logLevel] && !inConsoleOverride) {\n // add a re-entrancy guard to prevent infinite recursion\n inConsoleOverride = true;\n const callbacks = handlers[logLevel];\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(logLevel, args);\n } catch {\n // do nothing\n }\n });\n }\n }\n } catch {\n // do nothing\n }\n inConsoleOverride = false;\n return originalFn[logLevel]!.apply(originalConsole, args);\n };\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n originalFn[logLevel] = originalConsole[logLevel] as (...args: any[]) => void;\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n originalConsole[logLevel] = handler;\n return true;\n}\n\n/**\n * Observe a console log method (log, warn, error, etc.)\n * @param level - The console log level to observe\n * @param callback - The callback function to call when the console log level is observed\n */\nfunction addListener(level: ConsoleLogLevel, callback: Callback): Error | void {\n const res = overrideConsole(level);\n\n /* istanbul ignore if */\n if (!res) {\n return new Error('Console override failed');\n }\n\n if (handlers[level]) {\n // using ! is safe because we know the key exists based on condition above\n handlers[level]!.push(callback);\n } else {\n handlers[level] = [callback];\n }\n}\n\n/**\n * Disconnect a callback function from a console log method\n * @param callback - The callback function to disconnect\n */\nfunction removeListener(callback: Callback) {\n for (const callbacks of Object.values(handlers)) {\n // iterate backwards to avoid index shifting\n for (let i = callbacks.length - 1; i >= 0; i--) {\n if (callbacks[i] === callback) {\n callbacks.splice(i, 1);\n break;\n }\n }\n }\n}\n\n// this should only be used for testing\n// restoring console can break console overrides\nfunction _restoreConsole() {\n for (const [key, originalHandler] of Object.entries(originalFn)) {\n if (originalHandler) {\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n originalConsole[key] = originalHandler;\n }\n }\n originalFn = {};\n handlers = {};\n}\n\nconst consoleObserver = {\n addListener,\n removeListener,\n _restoreConsole,\n};\n\nexport { consoleObserver, ConsoleLogLevel };\n","import { ILogger } from '../logger';\n\nexport type ActionType = 'click' | 'change';\n\n/**\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 const 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/**\n * Default prefix to allow the plugin to capture data attributes as an event property.\n */\nexport const DEFAULT_DATA_ATTRIBUTE_PREFIX = 'data-amp-track-';\n\n/**\n * Default list of elements on the page should be tracked when the page changes.\n */\nexport const DEFAULT_ACTION_CLICK_ALLOWLIST = ['div', 'span', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\nexport interface ElementInteractionsOptions {\n /**\n * List of CSS selectors to allow auto tracking on.\n * When provided, allow elements matching any selector to be tracked.\n * Default is ['a', 'button', 'input', 'select', 'textarea', 'label', '[data-amp-default-track]', '.amp-default-track'].\n */\n cssSelectorAllowlist?: string[];\n\n /**\n * List of page URLs to allow auto tracking on.\n * When provided, only allow tracking on these URLs.\n * Both full URLs and regex are supported.\n */\n pageUrlAllowlist?: (string | RegExp)[];\n\n /**\n * List of page URLs to exclude from auto tracking.\n * When provided, tracking will be blocked on these URLs.\n * Both full URLs and regex are supported.\n * This takes precedence over pageUrlAllowlist.\n */\n pageUrlExcludelist?: (RegExp | string | { pattern: string })[];\n\n /**\n * Function to determine whether an event should be tracked.\n * When provided, this function overwrites all other allowlists and configurations.\n * If the function returns true, the event will be tracked.\n * If the function returns false, the event will not be tracked.\n * @param actionType - The type of action that triggered the event.\n * @param element - The [Element](https://developer.mozilla.org/en-US/docs/Web/API/Element) that triggered the event.\n */\n shouldTrackEventResolver?: (actionType: ActionType, element: DomElement) => boolean;\n\n /**\n * Prefix for data attributes to allow auto collecting.\n * Default is 'data-amp-track-'.\n */\n dataAttributePrefix?: string;\n\n /**\n * Options for integrating visual tagging selector.\n */\n visualTaggingOptions?: {\n enabled?: boolean;\n };\n\n /**\n * This has been deprecated in favor of rage clicks tracking\n * via frustrationInteractions.\n *\n * Setting this will have no effect.\n *\n * @deprecated\n */\n debounceTime?: number;\n\n /**\n * CSS selector allowlist for tracking clicks that result in a DOM change/navigation on elements not already allowed by the cssSelectorAllowlist\n */\n actionClickAllowlist?: string[];\n\n /**\n * Remote config for page actions\n */\n pageActions?: {\n triggers: Trigger[];\n labeledEvents: Record<string, LabeledEvent>;\n };\n\n /**\n * RegExp pattern list to allow custom patterns for text masking\n */\n maskTextRegex?: (RegExp | { pattern: string; description: string })[];\n}\n\ntype MatchingCondition = {\n type: 'LABELED_EVENT';\n match: {\n eventId: string;\n };\n};\n\nexport type Trigger = {\n id: string;\n name: string; // Human friendly name for the trigger\n conditions: MatchingCondition[]; // Configures when the actions should be executed; AND\n actions: Array<PageAction | string>; // Actions to execute if conditions are met\n};\n\nexport type PageAction = {\n id: string;\n actionType: 'ATTACH_EVENT_PROPERTY';\n dataSource: DataSource; // Defines where and how to get the data\n destinationKey: string; // Property key name for the data (e.g. event property name, data layer key, user property name)\n};\n\nexport type DataSource = {\n sourceType: 'DOM_ELEMENT' | 'PAGE_CONTEXT'; // | 'URL' ;\n} & (\n | {\n sourceType: 'DOM_ELEMENT';\n selector?: string; // For DOM_ELEMENT: CSS selector for the target element\n elementExtractType: 'TEXT' | 'ATTRIBUTE';\n attribute?: string; // For DOM_ELEMENT: Attribute name to extract (null/empty for text content)\n scope?: string; // CSS selector for the scope of the element, document by default\n }\n | {\n sourceType: 'PAGE_CONTEXT';\n propertyPath: string; // For PAGE_CONTEXT: e.g., 'document.title'\n }\n);\n\nexport type EventSubpropKey = '[Amplitude] Element Text' | '[Amplitude] Element Hierarchy';\n\nexport type Filter = {\n subprop_key: EventSubpropKey;\n subprop_op: string; // exact, autotrack css match\n subprop_value: string[];\n};\n\nexport type LabeledEvent = {\n id: string;\n definition: {\n event_type: '[Amplitude] Element Clicked' | '[Amplitude] Element Changed';\n filters: Filter[];\n }[];\n};\n\nexport interface Messenger {\n logger?: ILogger;\n setup: () => void;\n}\n\n// DomElement is [Element](https://developer.mozilla.org/en-US/docs/Web/API/Element) if the dom library is included in tsconfig.json\n// and never if it is not included\n// eslint-disable-next-line no-restricted-globals\ntype DomElement = typeof globalThis extends {\n Element: new (...args: any) => infer T;\n}\n ? T\n : never;\n","import { ActionType } from './element-interactions';\n\n/**\n * Configuration options for dead clicks tracking\n */\nexport interface DeadClickOptions {\n /**\n * CSS selectors to define which elements on the page to track for dead clicks.\n * A dead click is a click that doesn't result in any visible change or navigation.\n */\n cssSelectorAllowlist?: string[];\n}\n\n/**\n * Configuration options for rage clicks tracking\n */\nexport interface RageClickOptions {\n /**\n * CSS selectors to define which elements on the page to track for rage clicks.\n * A rage click is multiple rapid clicks on the same element within a 3s time window.\n */\n cssSelectorAllowlist?: string[];\n}\n\n/**\n * Configuration options for thrashed cursor tracking\n */\nexport interface ThrashedCursorOptions {\n /**\n * Number of direction changes required to consider a thrashed cursor.\n * Minimum of 5\n * (x axis changes and y axis changes are counted separately)\n * @default 10\n */\n directionChanges?: number;\n /**\n * Time window in milliseconds to consider a thrashed cursor.\n * Maximum of of 4000\n * @default 2000\n */\n threshold?: number;\n}\n\n/**\n * Configuration options for error clicks tracking\n */\nexport interface ErrorClickOptions {\n /**\n * CSS selectors to define which elements on the page to track for error clicks.\n * An error click is a click that results in an error.\n */\n cssSelectorAllowlist?: string[];\n}\n\n/**\n * Configuration options for frustration interactions tracking.\n * This includes dead clicks and rage clicks tracking.\n */\nexport interface FrustrationInteractionsOptions {\n /**\n * List of page URLs to allow auto tracking on.\n * When provided, only allow tracking on these URLs.\n * Both full URLs and regex are supported.\n */\n pageUrlAllowlist?: (string | RegExp)[];\n\n /**\n * List of page URLs to exclude from auto tracking.\n * When provided, tracking will be blocked on these URLs.\n * Both full URLs and regex are supported.\n * This takes precedence over pageUrlAllowlist.\n */\n pageUrlExcludelist?: (string | RegExp)[];\n\n /**\n * Function to determine whether an event should be tracked.\n * When provided, this function overwrites all other allowlists and configurations.\n * If the function returns true, the event will be tracked.\n * If the function returns false, the event will not be tracked.\n * @param actionType - The type of action that triggered the event.\n * @param element - The [Element](https://developer.mozilla.org/en-US/docs/Web/API/Element) that triggered the event.\n */\n shouldTrackEventResolver?: (actionType: ActionType, element: DomElement) => boolean;\n\n /**\n * Prefix for data attributes to allow auto collecting.\n * Default is 'data-amp-track-'.\n */\n dataAttributePrefix?: string;\n\n /**\n * Configuration for dead clicks tracking.\n * Set to `false` to disable dead click tracking.\n * Set to `true` or an options object to enable with default or custom settings.\n * Default is false.\n */\n deadClicks?: boolean | DeadClickOptions;\n\n /**\n * Configuration for rage clicks tracking.\n * Set to `false` to disable rage click tracking.\n * Set to `true` or an options object to enable with default settings.\n * Default is false.\n */\n rageClicks?: boolean | RageClickOptions;\n\n /**\n * Configuration for error clicks tracking\n * Set to `false` to disable error click tracking.\n * Set to `true` or an options object to enable with default settings.\n * Default is false.\n * @experimental this feature is experimental and may not be stable\n */\n errorClicks?: boolean | ErrorClickOptions;\n /**\n * Configuration for thrashed cursor tracking.\n * Set to `false` to disable thrashed cursor tracking.\n * Set to `true` or an options object to enable with default settings.\n * Default is false.\n * @experimental this feature is experimental and may not be stable\n */\n thrashedCursor?: boolean | ThrashedCursorOptions;\n\n /**\n * RegExp pattern list to allow custom patterns for text masking\n */\n maskTextRegex?: (RegExp | { pattern: string; description: string })[];\n}\n\nconst 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\nconst DEFAULT_ERROR_AND_DEAD_CLICK_ALLOWLIST = [\n 'input[type=\"button\"]',\n 'input[type=\"submit\"]',\n 'input[type=\"reset\"]',\n 'input[type=\"image\"]',\n 'input[type=\"file\"]',\n ...CLICKABLE_ELEMENT_SELECTORS,\n];\n\n/**\n * Default CSS selectors for dead clicks tracking\n */\nexport const DEFAULT_DEAD_CLICK_ALLOWLIST = DEFAULT_ERROR_AND_DEAD_CLICK_ALLOWLIST;\n\n/**\n * Default CSS selectors for error tracking\n */\nexport const DEFAULT_ERROR_CLICK_ALLOWLIST = DEFAULT_ERROR_AND_DEAD_CLICK_ALLOWLIST;\n\n/**\n * Default CSS selectors for rage clicks tracking\n */\nexport const DEFAULT_RAGE_CLICK_ALLOWLIST = ['*'];\n\n/**\n * Default time window for dead clicks (3 seconds)\n */\nexport const DEFAULT_DEAD_CLICK_WINDOW_MS = 3_000;\n\n/**\n * Default time window for rage clicks (1 second)\n */\nexport const DEFAULT_RAGE_CLICK_WINDOW_MS = 1_000;\n\n/**\n * Default threshold for rage clicks (4 clicks)\n */\nexport const DEFAULT_RAGE_CLICK_THRESHOLD = 4;\n\n/**\n * Default threshold for rage clicks to be considered out of bounds (50 pixels)\n */\nexport const DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD = 50; // pixels\n\n// DomElement is [Element](https://developer.mozilla.org/en-US/docs/Web/API/Element) if the dom library is included in tsconfig.json\n// and never if it is not included\n// eslint-disable-next-line no-restricted-globals\ntype DomElement = typeof globalThis extends {\n Element: new (...args: any) => infer T;\n}\n ? T\n : never;\n","export const TEXT_MASK_ATTRIBUTE = 'data-amp-mask';\nexport const MASKED_TEXT_VALUE = '*****';\n\n// Regex patterns for sensitive data\nexport const CC_REGEX = /\\b(?:\\d[ -]*?){13,16}\\b/;\nexport const SSN_REGEX = /(\\d{3}-?\\d{2}-?\\d{4})/g;\nexport const EMAIL_REGEX = /[^\\s@]+@[^\\s@.]+\\.[^\\s@]+/g;\n\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 const replaceSensitiveString = (text: string | null, additionalMaskTextPatterns: RegExp[] = []): string => {\n if (typeof text !== 'string') {\n return '';\n }\n\n let result = text;\n\n // Check for credit card number (with or without spaces/dashes)\n result = result.replace(CC_REGEX, MASKED_TEXT_VALUE);\n\n // Check for social security number\n result = result.replace(SSN_REGEX, MASKED_TEXT_VALUE);\n\n // Check for email\n result = result.replace(EMAIL_REGEX, MASKED_TEXT_VALUE);\n\n // Check for additional mask text patterns\n for (const pattern of additionalMaskTextPatterns) {\n try {\n result = result.replace(pattern, MASKED_TEXT_VALUE);\n } catch {\n // ignore invalid pattern\n }\n }\n\n return result;\n};\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 const getPageTitle = (parseTitleFunction?: (title: string) => string): string => {\n if (typeof document === 'undefined' || !document.title) {\n return '';\n }\n const 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","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Observable = void 0;\n\n// === Symbol Support ===\nconst hasSymbol = name => Boolean(Symbol[name]);\n\nconst getSymbol = name => hasSymbol(name) ? Symbol[name] : '@@' + name;\n\nconst SymbolIterator = getSymbol('iterator');\nconst SymbolObservable = getSymbol('observable');\nconst SymbolSpecies = getSymbol('species'); // === Abstract Operations ===\n\nfunction getMethod(obj, key) {\n let 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 let 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(() => {\n throw e;\n });\n }\n}\n\nfunction enqueue(fn) {\n Promise.resolve().then(() => {\n try {\n fn();\n } catch (e) {\n hostReportError(e);\n }\n });\n}\n\nfunction cleanupSubscription(subscription) {\n let 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 let 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 let queue = subscription._queue;\n\n if (!queue) {\n return;\n }\n\n subscription._queue = undefined;\n subscription._state = 'ready';\n\n for (let 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 let observer = subscription._observer;\n\n try {\n let 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,\n value\n });\n\n return;\n }\n\n if (subscription._state !== 'ready') {\n subscription._state = 'buffering';\n subscription._queue = [{\n type,\n value\n }];\n enqueue(() => flushSubscription(subscription));\n return;\n }\n\n notifySubscription(subscription, type, value);\n}\n\nclass Subscription {\n constructor(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 let self = this;\n let subscriptionObserver = {\n get closed() {\n return self._state === 'closed';\n },\n\n next(value) {\n onNotify(self, 'next', value);\n },\n\n error(value) {\n onNotify(self, 'error', value);\n },\n\n complete() {\n onNotify(self, 'complete');\n }\n\n };\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 get closed() {\n return this._state === 'closed';\n }\n\n unsubscribe() {\n if (this._state !== 'closed') {\n closeSubscription(this);\n cleanupSubscription(this);\n }\n }\n\n}\n\nclass Observable {\n constructor(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 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 forEach(fn) {\n return new Promise((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 let subscription = this.subscribe({\n next(value) {\n try {\n fn(value, done);\n } catch (e) {\n reject(e);\n subscription.unsubscribe();\n }\n },\n\n error: reject,\n complete: resolve\n });\n });\n }\n\n map(fn) {\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n let C = getSpecies(this);\n return new C(observer => this.subscribe({\n next(value) {\n try {\n value = fn(value);\n } catch (e) {\n return observer.error(e);\n }\n\n observer.next(value);\n },\n\n error(e) {\n observer.error(e);\n },\n\n complete() {\n observer.complete();\n }\n\n }));\n }\n\n filter(fn) {\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n let C = getSpecies(this);\n return new C(observer => this.subscribe({\n next(value) {\n try {\n if (!fn(value)) return;\n } catch (e) {\n return observer.error(e);\n }\n\n observer.next(value);\n },\n\n error(e) {\n observer.error(e);\n },\n\n complete() {\n observer.complete();\n }\n\n }));\n }\n\n reduce(fn) {\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n let C = getSpecies(this);\n let hasSeed = arguments.length > 1;\n let hasValue = false;\n let seed = arguments[1];\n let acc = seed;\n return new C(observer => this.subscribe({\n next(value) {\n let 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\n error(e) {\n observer.error(e);\n },\n\n complete() {\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 async all() {\n let values = [];\n await this.forEach(value => values.push(value));\n return values;\n }\n\n concat(...sources) {\n let C = getSpecies(this);\n return new C(observer => {\n let subscription;\n let index = 0;\n\n function startNext(next) {\n subscription = next.subscribe({\n next(v) {\n observer.next(v);\n },\n\n error(e) {\n observer.error(e);\n },\n\n complete() {\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\n startNext(this);\n return () => {\n if (subscription) {\n subscription.unsubscribe();\n subscription = undefined;\n }\n };\n });\n }\n\n flatMap(fn) {\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n let C = getSpecies(this);\n return new C(observer => {\n let subscriptions = [];\n let outer = this.subscribe({\n next(value) {\n if (fn) {\n try {\n value = fn(value);\n } catch (e) {\n return observer.error(e);\n }\n }\n\n let inner = C.from(value).subscribe({\n next(value) {\n observer.next(value);\n },\n\n error(e) {\n observer.error(e);\n },\n\n complete() {\n let i = subscriptions.indexOf(inner);\n if (i >= 0) subscriptions.splice(i, 1);\n completeIfDone();\n }\n\n });\n subscriptions.push(inner);\n },\n\n error(e) {\n observer.error(e);\n },\n\n complete() {\n completeIfDone();\n }\n\n });\n\n function completeIfDone() {\n if (outer.closed && subscriptions.length === 0) observer.complete();\n }\n\n return () => {\n subscriptions.forEach(s => s.unsubscribe());\n outer.unsubscribe();\n };\n });\n }\n\n [SymbolObservable]() {\n return this;\n }\n\n static from(x) {\n let C = typeof this === 'function' ? this : Observable;\n if (x == null) throw new TypeError(x + ' is not an object');\n let method = getMethod(x, SymbolObservable);\n\n if (method) {\n let 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(observer => observable.subscribe(observer));\n }\n\n if (hasSymbol('iterator')) {\n method = getMethod(x, SymbolIterator);\n\n if (method) {\n return new C(observer => {\n enqueue(() => {\n if (observer.closed) return;\n\n for (let item of method.call(x)) {\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(observer => {\n enqueue(() => {\n if (observer.closed) return;\n\n for (let 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 static of(...items) {\n let C = typeof this === 'function' ? this : Observable;\n return new C(observer => {\n enqueue(() => {\n if (observer.closed) return;\n\n for (let 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 static get [SymbolSpecies]() {\n return this;\n }\n\n}\n\nexports.Observable = Observable;\nObject.defineProperty(Observable, Symbol('extensions'), {\n value: {\n symbol: SymbolObservable,\n hostReportError\n },\n configurable: true\n});","module.exports = require('./lib/Observable.js').Observable;\n","import ZenObservable from 'zen-observable';\n\nexport { ZenObservable as Observable };\n\n/** Subscription type for zen-observable */\ninterface Subscription {\n closed: boolean;\n unsubscribe(): void;\n}\n\n/** Observer type for zen-observable */\ninterface Observer<T> {\n start?(subscription: Subscription): unknown;\n next?(value: T): void;\n error?(errorValue: unknown): void;\n complete?(): void;\n}\n\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<T, R>(observable: ZenObservable<T>, fn: (value: T) => Promise<R>): ZenObservable<R> {\n return new ZenObservable(\n (observer: { next: (value: R) => void; error: (error: any) => void; complete: () => void }) => {\n observable.subscribe({\n next: (value: T) => {\n fn(value)\n .then((result: R) => {\n return observer.next(result);\n })\n .catch((error: any) => observer.error(error));\n },\n error: (error: any) => {\n observer.error(error);\n },\n complete: () => {\n observer.complete();\n },\n });\n },\n );\n}\n\ntype Unsubscribable = {\n unsubscribe: () => void;\n};\n\ntype ZenObserver<A, B> = { next: (v: A | B) => void; error: (e: unknown) => void; complete: () => void };\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<A, B>(sourceA: ZenObservable<A>, sourceB: ZenObservable<B>): ZenObservable<A | B> {\n return new ZenObservable<A | B>((observer: ZenObserver<A, B>) => {\n let closed = false;\n\n const subscriptions: Set<Unsubscribable> = new Set();\n\n const cleanup = (): void => {\n closed = true;\n for (const sub of subscriptions) {\n try {\n sub.unsubscribe();\n } catch {\n /* do nothing */\n }\n }\n subscriptions.clear();\n };\n\n const subscribeTo = <T>(source: ZenObservable<T>) => {\n const sub = source.subscribe({\n next(value: T) {\n if (!closed) observer.next(value as A | B);\n },\n error(err: unknown) {\n if (!closed) {\n closed = true;\n observer.error(err);\n cleanup();\n }\n },\n complete() {\n subscriptions.delete(sub);\n if (!closed && subscriptions.size === 0) {\n observer.complete();\n cleanup();\n closed = true;\n }\n },\n });\n\n subscriptions.add(sub);\n };\n\n subscribeTo(sourceA);\n subscribeTo(sourceB);\n\n return cleanup;\n });\n}\n\n// function share() {\nfunction multicast<T>(source: ZenObservable<T>): ZenObservable<T> {\n const observers: Set<Observer<T>> = new Set();\n let subscription: Subscription | null = null;\n\n function cleanup() {\n /* istanbul ignore next */\n subscription?.unsubscribe();\n subscription = null;\n observers.clear();\n }\n\n return new ZenObservable<T>((observer: Observer<T>) => {\n observers.add(observer);\n\n if (subscription === null) {\n subscription = source.subscribe({\n next(value: T) {\n for (const obs of observers) {\n /* istanbul ignore next */\n obs.next?.(value);\n }\n },\n error(err: unknown) {\n for (const obs of observers) {\n /* istanbul ignore next */\n obs.error?.(err);\n }\n cleanup();\n },\n complete() {\n for (const obs of observers) {\n /* istanbul ignore next */\n obs.complete?.();\n }\n cleanup();\n },\n });\n }\n\n // Return unsubscribe function for this observer\n return () => {\n observers.delete(observer);\n\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}\n\nexport { asyncMap, multicast, merge, Unsubscribable };\n","// Shared origin constants for Amplitude cross-window communication\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: Record<string, string> = {\n US: AMPLITUDE_ORIGIN,\n EU: AMPLITUDE_ORIGIN_EU,\n STAGING: AMPLITUDE_ORIGIN_STAGING,\n};\n\n// Background capture script URL (shared between autocapture and session-replay)\nexport const AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL =\n 'https://cdn.amplitude.com/libs/background-capture-1.0.0-alpha.2.js.gz';\n","/* eslint-disable no-restricted-globals */\nimport { ILogger } from '../logger';\nimport { Messenger } from '../types/element-interactions';\nimport { getGlobalScope } from '../global-scope';\nimport { AMPLITUDE_ORIGIN } from './constants';\nimport { asyncLoadScript, generateUniqueId } from './utils';\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\nexport type ActionHandler = (data: any) => void;\n\n/**\n * Brand key used to identify BaseWindowMessenger instances across bundle boundaries.\n */\nconst MESSENGER_BRAND = '__AMPLITUDE_MESSENGER_INSTANCE__' as const;\n\n/** Global scope key where the singleton messenger is stored. */\nconst MESSENGER_GLOBAL_KEY = '__AMPLITUDE_MESSENGER__';\n\n/**\n * BaseWindowMessenger provides generic cross-window communication via postMessage.\n * Singleton access via getOrCreateWindowMessenger() to prevent duplicate instances\n */\nclass BaseWindowMessenger implements Messenger {\n /** Brand property for cross-bundle instanceof checks. */\n readonly [MESSENGER_BRAND] = true;\n\n endpoint: string;\n logger?: ILogger;\n private isSetup = false;\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n requestCallbacks: {\n [id: string]: {\n resolve: (data: any) => void;\n reject: (data: any) => void;\n };\n } = {};\n private actionHandlers = new Map<string, ActionHandler>();\n\n /**\n * Messages received for actions that had no registered handler yet.\n * Drained automatically when the corresponding handler is registered via\n * registerActionHandler(), solving startup race conditions between\n * independently-initialized plugins.\n */\n private pendingMessages = new Map<string, any[]>();\n\n /**\n * Tracks in-flight and completed script loads by URL.\n * Using a map, this prevents duplicate loads before the first resolves.\n */\n private scriptLoadPromises = new Map<string, Promise<void>>();\n\n constructor({ origin = AMPLITUDE_ORIGIN }: { origin?: string } = {}) {\n this.endpoint = origin;\n }\n\n /**\n * Send a message to the parent window (window.opener).\n */\n notify(message: { action: string; data?: any } | MessageRequest) {\n this.logger?.debug?.('Message sent: ', JSON.stringify(message));\n (window.opener as WindowProxy)?.postMessage?.(message, this.endpoint);\n }\n\n /**\n * Send an async request to the parent window with a unique ID.\n * Returns a Promise that resolves when the parent responds.\n */\n public sendRequest(action: string, args: Record<string, any>, options = { timeout: 15_000 }): Promise<any> {\n const id = generateUniqueId();\n const request: MessageRequest = { id, action, args };\n\n const promise = new Promise((resolve, reject) => {\n this.requestCallbacks[id] = { resolve, reject };\n\n this.notify(request);\n\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 /**\n * Handle a response to a previous request by resolving its Promise.\n */\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 /**\n * Register a handler for a specific action type.\n * Logs a warning if overwriting an existing handler.\n */\n registerActionHandler(action: string, handler: ActionHandler) {\n if (this.actionHandlers.has(action)) {\n this.logger?.warn?.(`Overwriting existing action handler for: ${action}`);\n }\n this.actionHandlers.set(action, handler);\n\n // Replay any messages that arrived before this handler was registered\n const queued = this.pendingMessages.get(action);\n if (queued) {\n this.pendingMessages.delete(action);\n for (const data of queued) {\n handler(data);\n }\n }\n }\n\n /**\n * Load a script once, deduplicating by URL.\n * Safe against concurrent calls — the second call awaits the first's in-flight Promise\n * rather than triggering a duplicate load.\n */\n async loadScriptOnce(url: string): Promise<void> {\n const existing = this.scriptLoadPromises.get(url);\n if (existing) {\n return existing;\n }\n\n const loadPromise = asyncLoadScript(url).then(() => {\n // Resolve to void\n });\n this.scriptLoadPromises.set(url, loadPromise);\n\n try {\n await loadPromise;\n } catch (error) {\n // Remove failed loads so they can be retried\n this.scriptLoadPromises.delete(url);\n throw error;\n }\n }\n\n /**\n * Set up the message listener. Idempotent — safe to call multiple times.\n * Subclasses should call super.setup() and then register their own action handlers.\n */\n setup({ logger, endpoint }: { logger?: ILogger; endpoint?: string } = {}) {\n if (logger) {\n this.logger = logger;\n }\n\n // If endpoint is customized, don't override a previously customized endpoint.\n if (endpoint && this.endpoint === AMPLITUDE_ORIGIN) {\n this.endpoint = endpoint;\n }\n\n // Only attach the message listener once\n if (this.isSetup) {\n return;\n }\n this.isSetup = true;\n\n this.logger?.debug?.('Setting up messenger');\n\n // Attach Event Listener to listen for messages from the parent window\n this.messageHandler = (event: MessageEvent) => {\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 { action?: string; id?: string; data?: any; responseData?: any };\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 && eventData.id) {\n this.logger?.debug?.('Received Response to previous request: ', JSON.stringify(event));\n this.handleResponse(eventData as MessageResponse);\n } else {\n if (action === 'ping') {\n this.notify({ action: 'pong' });\n return;\n }\n\n // Dispatch to registered action handlers, or buffer for late registration\n const handler = this.actionHandlers.get(action);\n if (handler) {\n handler(eventData.data);\n } else {\n const queue = this.pendingMessages.get(action) ?? [];\n queue.push(eventData.data);\n this.pendingMessages.set(action, queue);\n }\n }\n };\n window.addEventListener('message', this.messageHandler);\n\n this.notify({ action: 'page-loaded' });\n }\n\n /**\n * Tear down the messenger: remove the message listener, clear all state.\n */\n destroy() {\n if (this.messageHandler) {\n window.removeEventListener('message', this.messageHandler);\n this.messageHandler = null;\n }\n this.isSetup = false;\n this.actionHandlers.clear();\n this.pendingMessages.clear();\n this.requestCallbacks = {};\n this.scriptLoadPromises.clear();\n\n // Remove from global scope if this is the singleton\n const globalScope = getGlobalScope() as Record<string, unknown> | undefined;\n if (globalScope?.[MESSENGER_GLOBAL_KEY] === this) {\n delete globalScope[MESSENGER_GLOBAL_KEY];\n }\n }\n}\n\n/**\n * Type guard: checks whether a value is a BaseWindowMessenger instance.\n */\nfunction isWindowMessenger(value: unknown): value is BaseWindowMessenger {\n return (\n typeof value === 'object' &&\n value !== null &&\n MESSENGER_BRAND in value &&\n (value as Record<string, unknown>)[MESSENGER_BRAND] === true\n );\n}\n\n/**\n * Get or create a singleton BaseWindowMessenger instance.\n * Ensures only one messenger (and one message listener) exists per page,\n * preventing duplicate script loads and double notifications.\n *\n * The singleton is stored on globalScope under the same MESSENGER_KEY.\n * The branded property check verifies the stored value is actually a messenger.\n */\nexport function getOrCreateWindowMessenger(options?: { origin?: string }): BaseWindowMessenger {\n const globalScope = getGlobalScope() as Record<string, unknown> | undefined;\n\n const existing = globalScope?.[MESSENGER_GLOBAL_KEY];\n if (isWindowMessenger(existing)) {\n return existing;\n }\n\n const messenger = new BaseWindowMessenger(options);\n if (globalScope) {\n globalScope[MESSENGER_GLOBAL_KEY] = messenger;\n }\n return messenger;\n}\n\nexport type { BaseWindowMessenger };\n","/* eslint-disable no-restricted-globals */\n\n/**\n * Dynamically loads an external script by appending a <script> tag to the document head.\n * Deduplicates by checking if a script with the same src already exists.\n */\nexport const asyncLoadScript = (url: string): Promise<{ status: boolean }> => {\n // Dedup: if a script with this src already exists, resolve immediately\n const existing = document.querySelector(`script[src=\"${CSS.escape(url)}\"]`);\n if (existing) {\n return Promise.resolve({ status: true });\n }\n\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\n/**\n * Generates a simple unique ID for message request/response correlation.\n */\nexport function generateUniqueId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n","/* eslint-disable no-restricted-globals */\nimport type { BaseWindowMessenger } from './base-window-messenger';\nimport { AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL } from './constants';\n\n/**\n * Brand key set on the messenger instance to track whether background capture\n * has been enabled.\n */\nconst BG_CAPTURE_BRAND = '__AMPLITUDE_BACKGROUND_CAPTURE__' as const;\n\n/**\n * Enable background capture on a messenger instance.\n * Plugins can call this on a shared messenger instance.\n * The first call registers the handlers; subsequent calls are no-ops.\n *\n * @param messenger - The messenger to enable background capture on\n * @param options.scriptUrl - Override the background capture script URL (optional)\n */\nexport function enableBackgroundCapture(messenger: BaseWindowMessenger, options?: { scriptUrl?: string }): void {\n // Check the brand on the messenger object itself — works across bundle boundaries\n const branded = messenger as unknown as Record<string, unknown>;\n if (branded[BG_CAPTURE_BRAND] === true) {\n return;\n }\n branded[BG_CAPTURE_BRAND] = true;\n\n const scriptUrl = options?.scriptUrl ?? AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL;\n let backgroundCaptureInstance: any = null;\n\n const onBackgroundCapture = (type: string, backgroundCaptureData: { [key: string]: string | number | null }) => {\n if (type === 'background-capture-complete') {\n messenger.logger?.debug?.('Background capture complete');\n messenger.notify({ action: 'background-capture-complete', data: backgroundCaptureData });\n }\n };\n\n messenger.registerActionHandler('initialize-background-capture', () => {\n messenger.logger?.debug?.('Initializing background capture (external script)');\n const resolvedUrl = new URL(scriptUrl, messenger.endpoint).toString();\n\n messenger\n .loadScriptOnce(resolvedUrl)\n .then(() => {\n messenger.logger?.debug?.('Background capture script loaded (external)');\n // eslint-disable-next-line\n backgroundCaptureInstance = /* istanbul ignore next -- window is always defined in browser */ (\n window as any\n )?.amplitudeBackgroundCapture?.({\n messenger,\n onBackgroundCapture,\n });\n messenger.notify({ action: 'background-capture-loaded' });\n })\n .catch(() => {\n messenger.logger?.warn('Failed to initialize background capture');\n });\n });\n\n messenger.registerActionHandler('close-background-capture', () => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n backgroundCaptureInstance?.close?.();\n backgroundCaptureInstance = null;\n });\n}\n","export const VERSION = '1.23.4';\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 isUrlAllowed = (autocaptureOptions: ElementInteractionsOptions): boolean => {\n const { pageUrlAllowlist, pageUrlExcludelist } = autocaptureOptions;\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 // check if the URL is in the allow list\n if (!isUrlMatchAllowlist(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n return true;\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 { 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 if (!isUrlAllowed(autocaptureOptions)) {\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\nexport enum MouseButton {\n LEFT_OR_TOUCH_CONTACT = 0,\n MIDDLE = 1,\n RIGHT = 2,\n}\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_ERROR_CLICKED_EVENT = '[Amplitude] Error Click';\nexport const AMPLITUDE_ELEMENT_CHANGED_EVENT = '[Amplitude] Element Changed';\nexport const AMPLITUDE_THRASHED_CURSOR_EVENT = '[Amplitude] Thrashed Cursor';\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// Origin constants are now shared via analytics-core; re-export for backwards compatibility\nexport {\n AMPLITUDE_ORIGIN,\n AMPLITUDE_ORIGIN_EU,\n AMPLITUDE_ORIGIN_STAGING,\n AMPLITUDE_ORIGINS_MAP,\n AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL,\n} from '@amplitude/analytics-core';\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","/* istanbul ignore file */\n/* eslint-disable no-restricted-globals */\nimport { AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL, AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS } from '../constants';\nimport type { BaseWindowMessenger } from '@amplitude/analytics-core';\nimport { 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 | 'initialize-background-capture'\n | 'close-background-capture'\n | 'background-capture-loaded'\n | 'background-capture-complete';\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 'initialize-background-capture': null | undefined;\n 'close-background-capture': null | undefined;\n 'background-capture-loaded': null | undefined;\n 'background-capture-complete': { [key: string]: string | null };\n};\n\nexport interface Message<A extends Action> {\n action: A;\n data?: ActionData[A];\n}\n\n/**\n * Brand key to track whether visual tagging has been enabled on a messenger.\n */\nconst VISUAL_TAGGING_BRAND = '__AMPLITUDE_VISUAL_TAGGING__' as const;\n\n/**\n * Enable visual tagging on a messenger instance.\n * The first call registers the handlers; subsequent calls are no-ops.\n *\n * @param messenger - The messenger to enable visual tagging on\n * @param options - Visual tagging configuration\n */\nexport function enableVisualTagging(\n messenger: BaseWindowMessenger,\n options: {\n isElementSelectable?: (action: InitializeVisualTaggingSelectorData['actionType'], element: Element) => boolean;\n cssSelectorAllowlist?: string[];\n actionClickAllowlist?: string[];\n dataExtractor: DataExtractor;\n },\n): void {\n // Idempotency guard — works across bundle boundaries\n const branded = messenger as unknown as Record<string, unknown>;\n if (branded[VISUAL_TAGGING_BRAND] === true) {\n return;\n }\n branded[VISUAL_TAGGING_BRAND] = true;\n\n const { dataExtractor, isElementSelectable, cssSelectorAllowlist, actionClickAllowlist } = options;\n\n let amplitudeVisualTaggingSelectorInstance: any = null;\n\n const onSelect = (data: ElementSelectedData) => {\n messenger.notify({ action: 'element-selected', data });\n };\n\n const onTrack = (type: string, properties: { [key: string]: string | null }) => {\n if (type === 'selector-mode-changed') {\n messenger.notify({ action: 'track-selector-mode-changed', data: properties });\n } else if (type === 'selector-moved') {\n messenger.notify({ action: 'track-selector-moved', data: properties });\n }\n };\n\n messenger.registerActionHandler(\n 'initialize-visual-tagging-selector',\n (actionData: InitializeVisualTaggingSelectorData) => {\n messenger\n .loadScriptOnce(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,\n onSelect,\n visualHighlightClass: AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n messenger,\n cssSelectorAllowlist,\n actionClickAllowlist,\n extractDataFromDataSource: dataExtractor.extractDataFromDataSource,\n dataExtractor,\n diagnostics: {\n autocapture: {\n version: VERSION,\n },\n },\n });\n messenger.notify({ action: 'selector-loaded' });\n })\n .catch(() => {\n messenger.logger?.warn('Failed to initialize visual tagging selector');\n });\n },\n );\n\n messenger.registerActionHandler('close-visual-tagging-selector', () => {\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance?.close?.();\n });\n}\n","import { Observable, consoleObserver, getGlobalScope, merge } from '@amplitude/analytics-core';\n\n/* eslint-disable-next-line no-restricted-globals */\nconst globalScope = getGlobalScope() as typeof window;\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 globalScope.document.addEventListener(clickType, handler, { capture: true });\n return () => {\n globalScope.document.removeEventListener(clickType, handler, { capture: true });\n };\n });\n};\n\nconst createConsoleErrorObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (_: string, ...args: any[]) => {\n /* istanbul ignore next */\n let message: string | undefined = undefined;\n if (Array.isArray(args[0]) && typeof args[0][0] === 'string') {\n message = args[0][0];\n }\n observer.next({ kind: 'console', message });\n };\n consoleObserver.addListener('error', handler);\n return () => {\n consoleObserver.removeListener(handler);\n };\n });\n};\n\nconst createUnhandledErrorObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (event: Event) => {\n if (!(event instanceof ErrorEvent)) {\n return;\n }\n let output: BrowserErrorEvent = {\n kind: 'error',\n };\n\n if (event.error instanceof Error || event.error instanceof DOMException) {\n output = {\n ...output,\n message: event.error.message,\n stack: event.error.stack,\n filename: event.filename,\n lineNumber: event.lineno,\n columnNumber: event.colno,\n };\n } else if (typeof event.error === 'string') {\n output.message = event.error;\n }\n observer.next(output);\n };\n\n globalScope.addEventListener('error', handler);\n return () => {\n globalScope.removeEventListener('error', handler);\n };\n });\n};\n\nconst createUnhandledRejectionObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (event: PromiseRejectionEvent) => {\n const output: BrowserErrorEvent = {\n kind: 'unhandledrejection',\n };\n if (event.reason instanceof Error || event.reason instanceof DOMException) {\n output.message = event.reason.message;\n output.stack = event.reason.stack;\n } else if (typeof event.reason === 'string') {\n output.message = event.reason;\n }\n observer.next(output);\n };\n globalScope.addEventListener('unhandledrejection', handler);\n return () => {\n globalScope.removeEventListener('unhandledrejection', handler);\n };\n });\n};\n\nexport type BrowserErrorEvent = {\n kind: 'error' | 'unhandledrejection' | 'console';\n message?: string;\n filename?: string;\n lineNumber?: number;\n columnNumber?: number;\n stack?: string;\n};\n\nexport const createErrorObservable = (): Observable<BrowserErrorEvent> => {\n const unhandledErrorObservable = merge(createUnhandledErrorObservable(), createUnhandledRejectionObservable());\n return merge(unhandledErrorObservable, createConsoleErrorObservable());\n};\n\nexport const createMouseMoveObservable = (): Observable<MouseEvent> => {\n return new Observable<MouseEvent>((observer) => {\n const handler = (event: MouseEvent) => {\n observer.next(event);\n };\n const args: AddEventListenerOptions = { capture: true };\n globalScope.document.addEventListener('mousemove', handler, args);\n return () => {\n globalScope.document.removeEventListener('mousemove', handler, args);\n };\n });\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","import type { ElementInteractionsOptions, LabeledEvent, Trigger } from '@amplitude/analytics-core';\nimport type { ElementBasedTimestampedEvent, ElementBasedEvent } from '../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 '../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 { 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","/* 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 addTypeAndTimestamp = <T>(\n event: T,\n type: BaseTimestampedEvent<T>['type'] | ElementBasedTimestampedEvent<T>['type'],\n ): BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n return {\n event,\n timestamp: Date.now(),\n type,\n };\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 = this.addTypeAndTimestamp(event, type);\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 // Traverse text content without cloning DOM nodes, which avoids media/network side effects\n // from recreating nested elements such as <video>, <audio>, or <img>.\n private getTextWithMaskedDescendants = (element: Element): string => {\n const maskedSelector = `[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`;\n // Fast path: if no masked descendants exist, rely on native text extraction.\n if (!element.querySelector(maskedSelector)) {\n return (element as HTMLElement).innerText;\n }\n\n let output = '';\n const childNodes = Array.from(element.childNodes);\n for (const childNode of childNodes) {\n if (childNode.nodeType === Node.TEXT_NODE) {\n output += childNode.textContent || '';\n continue;\n }\n\n if (!(childNode instanceof Element)) {\n continue;\n }\n\n // Replace entire masked/contenteditable subtrees with the mask token.\n if (childNode.hasAttribute(TEXT_MASK_ATTRIBUTE) || childNode.hasAttribute('contenteditable')) {\n output += MASKED_TEXT_VALUE;\n continue;\n }\n output += this.getTextWithMaskedDescendants(childNode);\n }\n return output;\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 output = this.getTextWithMaskedDescendants(element);\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","/* 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 getOrCreateWindowMessenger,\n enableBackgroundCapture,\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 { enableVisualTagging } 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 BrowserErrorObservable = 'browserErrorObservable',\n SelectionObservable = 'selectionObservable',\n MouseMoveObservable = 'mouseMoveObservable',\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 [ObservablesEnum.SelectionObservable]?: Observable<void>;\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 },\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('configs.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 and background capture on the shared messenger singleton.\n // Using the singleton ensures a single message listener per page, even when\n // session-replay is also loaded.\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n const messenger = getOrCreateWindowMessenger();\n enableVisualTagging(messenger, {\n dataExtractor,\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist,\n });\n enableBackgroundCapture(messenger);\n /* istanbul ignore next */\n messenger.setup({\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\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 { AllWindowObservables } from '../autocapture-plugin';\nimport { ElementBasedEvent, ElementBasedTimestampedEvent, type evaluateTriggersFn } from '../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: ElementBasedTimestampedEvent<ElementBasedEvent>) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CLICKED_EVENT, click.targetElementProperties);\n });\n}\n","import { AllWindowObservables } from '../autocapture-plugin';\nimport {\n filterOutNonTrackableEvents,\n shouldTrackEvent,\n ElementBasedTimestampedEvent,\n type evaluateTriggersFn,\n} from '../helpers';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\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 '../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 '../frustration-plugin';\nimport { BrowserClient, ActionType, merge, asyncMap } from '@amplitude/analytics-core';\nimport { ElementBasedTimestampedEvent, filterOutNonTrackableEvents, MouseButton, 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 click.event.button === MouseButton.LEFT_OR_TOUCH_CONTACT\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 '../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 { pageX, pageY } = click.event as MouseEvent;\n regionBox.yMin = Math.min(regionBox.yMin ?? pageY, pageY);\n regionBox.yMax = Math.max(regionBox.yMax ?? pageY, pageY);\n regionBox.xMin = Math.min(regionBox.xMin ?? pageX, pageX);\n regionBox.xMax = Math.max(regionBox.xMax ?? pageX, pageX);\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).pageX,\n Y: (click.event as MouseEvent).pageY,\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, selectionObservable }: 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 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 // reset the click window when a selection change occurs\n /* istanbul ignore next */\n const selectionSubscription = selectionObservable?.subscribe(() => {\n resetClickWindow();\n });\n\n const rageClickSubscription = 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 return {\n unsubscribe: () => {\n rageClickSubscription.unsubscribe();\n /* istanbul ignore next */\n selectionSubscription?.unsubscribe();\n },\n };\n}\n","import { BrowserErrorEvent } from '../observables';\nimport { AllWindowObservables } from '../frustration-plugin';\nimport {\n ElementBasedTimestampedEvent,\n filterOutNonTrackableEvents,\n MouseButton,\n shouldTrackEvent,\n TimestampedEvent,\n} from '../helpers';\nimport { BrowserClient, merge } from '@amplitude/analytics-core';\nimport { AMPLITUDE_ELEMENT_ERROR_CLICKED_EVENT } from '../constants';\n\ntype ClickOrErrorEvent = ElementBasedTimestampedEvent<MouseEvent> | TimestampedEvent<BrowserErrorEvent>;\n\nconst ERROR_CLICK_TIMEOUT = 2_000; // 2 seconds to wait for an error to happen\n\nexport function trackErrorClicks({\n amplitude,\n allObservables,\n shouldTrackErrorClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n shouldTrackErrorClick: shouldTrackEvent;\n}) {\n const { clickObservable, browserErrorObservable } = allObservables;\n\n const filteredClickObservable = clickObservable.filter((click) => {\n return (\n filterOutNonTrackableEvents(click) &&\n shouldTrackErrorClick('click', click.closestTrackedAncestor) &&\n click.event.target instanceof Element &&\n click.event.target.closest('a[target=\"_blank\"]') === null &&\n click.event.button === MouseButton.LEFT_OR_TOUCH_CONTACT\n );\n });\n\n let errorClickTimer: ReturnType<typeof setTimeout> | null = null;\n let latestClickEvent: ElementBasedTimestampedEvent<MouseEvent> | null = null;\n\n const clearClickTimer = () => {\n if (errorClickTimer !== null) {\n clearTimeout(errorClickTimer);\n errorClickTimer = null;\n }\n latestClickEvent = null;\n };\n\n return merge(filteredClickObservable, browserErrorObservable).subscribe((event: ClickOrErrorEvent) => {\n if (event.type === 'click') {\n clearClickTimer();\n latestClickEvent = event as ElementBasedTimestampedEvent<MouseEvent>;\n errorClickTimer = setTimeout(clearClickTimer, ERROR_CLICK_TIMEOUT);\n return;\n }\n\n if (event.type === 'error' && latestClickEvent) {\n amplitude.track(AMPLITUDE_ELEMENT_ERROR_CLICKED_EVENT, {\n ['[Amplitude] Kind']: event.event.kind,\n ['[Amplitude] Message']: event.event.message,\n ['[Amplitude] Stack']: event.event.stack,\n ['[Amplitude] Filename']: event.event.filename,\n ['[Amplitude] Line Number']: event.event.lineNumber,\n ['[Amplitude] Column Number']: event.event.columnNumber,\n ...latestClickEvent.targetElementProperties,\n });\n clearClickTimer();\n }\n });\n}\n","import { BrowserClient, ElementInteractionsOptions, Observable } from '@amplitude/analytics-core';\nimport { AllWindowObservables } from '../frustration-plugin';\nimport { AMPLITUDE_THRASHED_CURSOR_EVENT } from '../constants';\nimport { isUrlAllowed } from '../helpers';\n\ntype Position = {\n x: number;\n y: number;\n};\n\nenum Direction {\n INCREASING = 'increasing',\n DECREASING = 'decreasing',\n}\n\nenum Axis {\n X = 'x',\n Y = 'y',\n}\n\nexport const createMouseDirectionChangeObservable = ({\n allWindowObservables,\n}: {\n allWindowObservables: AllWindowObservables;\n}): Observable<Axis> => {\n const { mouseMoveObservable } = allWindowObservables;\n return new Observable<Axis>((observer) => {\n let lastPosition: Position | null = null;\n let xDirection: Direction | null = null;\n let yDirection: Direction | null = null;\n return mouseMoveObservable.subscribe((event) => {\n const currentPosition = { x: event.clientX, y: event.clientY };\n if (lastPosition === null) {\n lastPosition = currentPosition;\n return;\n }\n if (currentPosition.x > lastPosition.x) {\n if (xDirection === Direction.DECREASING) {\n observer.next(Axis.X);\n }\n xDirection = Direction.INCREASING;\n } else if (currentPosition.x < lastPosition.x) {\n if (xDirection === Direction.INCREASING) {\n observer.next(Axis.X);\n }\n xDirection = Direction.DECREASING;\n }\n\n if (currentPosition.y > lastPosition.y) {\n if (yDirection === Direction.DECREASING) {\n observer.next(Axis.Y);\n }\n yDirection = Direction.INCREASING;\n } else if (currentPosition.y < lastPosition.y) {\n if (yDirection === Direction.INCREASING) {\n observer.next(Axis.Y);\n }\n yDirection = Direction.DECREASING;\n }\n lastPosition = currentPosition;\n });\n });\n};\n\ntype DirectionChangeSeries = {\n // number of direction changes to be considered a thrashed cursor\n changesThreshold: number;\n // timestamps of direction changes (limited to \"changesThreshold\" to avoid memory leaks)\n changes: number[];\n // window duration in milliseconds\n thresholdMs: number;\n // when the series of direction changes started\n startTime?: number;\n};\n\nfunction addDirectionChange(directionChangeSeries: DirectionChangeSeries) {\n const now = +Date.now();\n\n directionChangeSeries.startTime = directionChangeSeries.startTime || now;\n\n // add this direction change to the series (fixed length array to avoid memory leaks)\n const { changes, changesThreshold } = directionChangeSeries;\n changes.push(now);\n if (changes.length > changesThreshold) changes.shift();\n}\n\n// checks if there are enough direction changes within window + threshold\n// for it to be considered a thrashed cursor\nfunction isThrashedCursor(directionChanges: DirectionChangeSeries): boolean {\n const { changes, changesThreshold, thresholdMs } = directionChanges;\n if (changes.length < changesThreshold) return false;\n const delta = changes[changes.length - 1] - changes[0];\n return delta < thresholdMs;\n}\n\nfunction resetDirectionChangeSeries(directionChangeSeries: DirectionChangeSeries) {\n directionChangeSeries.changes = [];\n directionChangeSeries.startTime = undefined;\n}\n\n// if the time between first and last change is greater than the threshold,\n// shift the window to the right until it is below the threshold\nfunction adjustWindow(directionChanges: DirectionChangeSeries) {\n const { changes, thresholdMs } = directionChanges;\n\n // find the first change that is within the threshold\n let leftPtr = 0;\n const lastChange = changes[changes.length - 1];\n for (; leftPtr < changes.length; leftPtr++) {\n const delta = lastChange - changes[leftPtr];\n if (delta < thresholdMs) {\n break;\n }\n }\n if (leftPtr === 0) return;\n\n directionChanges.startTime = changes[leftPtr];\n directionChanges.changes.splice(0, leftPtr);\n}\n\nfunction getPendingThrashedCursor(\n directionChangesX: DirectionChangeSeries,\n directionChangesY: DirectionChangeSeries,\n): number | undefined {\n let startTime = undefined;\n if (isThrashedCursor(directionChangesX)) {\n startTime = directionChangesX.startTime;\n }\n if (isThrashedCursor(directionChangesY)) {\n const startTimeY = directionChangesY.startTime;\n if (startTimeY && (!startTime || startTimeY < startTime)) {\n startTime = startTimeY;\n }\n }\n return startTime;\n}\n\nconst DEFAULT_THRESHOLD = 10;\nconst DEFAULT_WINDOW_MS = 2_000;\n\nexport const createThrashedCursorObservable = ({\n mouseDirectionChangeObservable,\n directionChanges = DEFAULT_THRESHOLD,\n thresholdMs = DEFAULT_WINDOW_MS,\n}: {\n mouseDirectionChangeObservable: Observable<Axis>;\n directionChanges?: number;\n thresholdMs?: number;\n}): Observable<number> => {\n return new Observable<number>((observer) => {\n const xDirectionChanges: DirectionChangeSeries = { changes: [], changesThreshold: directionChanges, thresholdMs };\n const yDirectionChanges: DirectionChangeSeries = { changes: [], changesThreshold: directionChanges, thresholdMs };\n let pendingThrashedCursor: number | undefined = undefined;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n function emitPendingThrashedCursor() {\n if (pendingThrashedCursor !== undefined) {\n observer.next(pendingThrashedCursor);\n pendingThrashedCursor = undefined;\n\n // reset window\n if (timer !== null) clearTimeout(timer);\n resetDirectionChangeSeries(xDirectionChanges);\n resetDirectionChangeSeries(yDirectionChanges);\n }\n }\n\n return mouseDirectionChangeObservable.subscribe((axis) => {\n if (timer !== null) clearTimeout(timer);\n addDirectionChange(axis === Axis.X ? xDirectionChanges : yDirectionChanges);\n\n const nextPendingThrashedCursor = getPendingThrashedCursor(xDirectionChanges, yDirectionChanges);\n if (nextPendingThrashedCursor) {\n // if we're in a thrashed cursor window, debounce it for \"thresholdMs\" duration\n // this is so that we do not restart the window if more direction changes are\n // detected in this series\n pendingThrashedCursor = pendingThrashedCursor || nextPendingThrashedCursor;\n timer = setTimeout(() => {\n emitPendingThrashedCursor();\n timer = null;\n }, thresholdMs);\n } else {\n emitPendingThrashedCursor();\n }\n\n adjustWindow(xDirectionChanges);\n adjustWindow(yDirectionChanges);\n\n /* istanbul ignore next */\n return () => {\n /* istanbul ignore if */\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n };\n });\n });\n};\n\nexport const trackThrashedCursor = ({\n amplitude,\n options,\n allObservables,\n directionChanges = DEFAULT_THRESHOLD,\n thresholdMs = DEFAULT_WINDOW_MS,\n}: {\n amplitude: BrowserClient;\n options: ElementInteractionsOptions;\n allObservables: AllWindowObservables;\n directionChanges?: number;\n thresholdMs?: number;\n}) => {\n const mouseDirectionChangeObservable = createMouseDirectionChangeObservable({ allWindowObservables: allObservables });\n const thrashedCursorObservable = createThrashedCursorObservable({\n mouseDirectionChangeObservable,\n directionChanges,\n thresholdMs,\n });\n return thrashedCursorObservable.subscribe((time) => {\n if (!isUrlAllowed(options)) {\n return;\n }\n amplitude.track(AMPLITUDE_THRASHED_CURSOR_EVENT, undefined, { time });\n });\n};\n","/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n FrustrationInteractionsOptions,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n multicast,\n Observable,\n Unsubscribable,\n DEFAULT_RAGE_CLICK_ALLOWLIST,\n DEFAULT_DEAD_CLICK_ALLOWLIST,\n DEFAULT_ERROR_CLICK_ALLOWLIST,\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 {\n BrowserErrorEvent,\n createClickObservable,\n createErrorObservable,\n createMutationObservable,\n createMouseMoveObservable,\n} from './observables';\nimport { DataExtractor } from './data-extractor';\nimport { trackErrorClicks } from './autocapture/track-error-click';\nimport { trackThrashedCursor } from './autocapture/track-thrashed-cursor';\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n [ObservablesEnum.BrowserErrorObservable]: Observable<TimestampedEvent<BrowserErrorEvent>>;\n [ObservablesEnum.NavigateObservable]?: Observable<TimestampedEvent<NavigateEvent>>;\n [ObservablesEnum.SelectionObservable]?: Observable<void>;\n [ObservablesEnum.MouseMoveObservable]: Observable<MouseEvent>;\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\n/**\n * Helper function to extract the css selector allowlist\n * from the frustration interactions options for a specific\n * autocapture feature.\n */\nfunction getCssSelectorAllowlist(\n options: FrustrationInteractionsOptions,\n attribute: keyof FrustrationInteractionsOptions,\n defaultAllowlist: string[],\n enabled: boolean,\n): string[] {\n if (!enabled) {\n return [];\n }\n const config = options[attribute];\n if (\n typeof config === 'object' &&\n config !== null &&\n 'cssSelectorAllowlist' in config &&\n Array.isArray(config.cssSelectorAllowlist)\n ) {\n return config.cssSelectorAllowlist;\n }\n return defaultAllowlist;\n}\n\nconst MINIMUM_THRASHED_CURSOR_DIRECTION_CHANGES = 5;\nconst MAXIMUM_THRASHED_CURSOR_THRESHOLD = 4000;\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 let isErrorClicksEnabled = options.errorClicks !== false;\n\n // if errorClicks is not defined, disable it\n // change this once it moves out of @experimental\n if (!options.errorClicks) {\n isErrorClicksEnabled = false;\n }\n\n // Check if each feature is enabled\n const deadClicksEnabled = options.deadClicks !== false && options.deadClicks !== null;\n const rageClicksEnabled = options.rageClicks !== false && options.rageClicks !== null;\n\n let thrashedCursorEnabled = options.thrashedCursor !== false && options.thrashedCursor !== null;\n if (!options.thrashedCursor) {\n thrashedCursorEnabled = false;\n }\n\n // Get CSS selectors for enabled features\n const rageCssSelectors = getCssSelectorAllowlist(\n options,\n 'rageClicks',\n DEFAULT_RAGE_CLICK_ALLOWLIST,\n rageClicksEnabled,\n );\n\n const deadCssSelectors = getCssSelectorAllowlist(\n options,\n 'deadClicks',\n DEFAULT_DEAD_CLICK_ALLOWLIST,\n deadClicksEnabled,\n );\n\n const errorCssSelectors = getCssSelectorAllowlist(\n options,\n 'errorClicks',\n DEFAULT_ERROR_CLICK_ALLOWLIST,\n isErrorClicksEnabled,\n );\n\n const dataAttributePrefix = options.dataAttributePrefix ?? DEFAULT_DATA_ATTRIBUTE_PREFIX;\n\n const dataExtractor = new DataExtractor(options);\n\n // combine the selector lists from enabled features to determine which clicked elements should be filtered\n const combinedCssSelectors = [...new Set([...rageCssSelectors, ...deadCssSelectors, ...errorCssSelectors])];\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 browserErrorObservables = multicast(\n createErrorObservable().map((error) => {\n return dataExtractor.addTypeAndTimestamp(error, 'error');\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 const selectionObservable = multicast(\n new Observable<void>((observer) => {\n const handler = () => {\n const el: HTMLElement | null = document.activeElement as HTMLElement;\n\n // handle input and textarea\n\n // if the selectionStart and selectionEnd are the same, it means\n // nothing is selected (collapsed) and the cursor position is one point\n if (el && (el.tagName === 'TEXTAREA' || el.tagName === 'INPUT')) {\n let start: number | null | undefined;\n let end: number | null | undefined;\n try {\n start = (el as HTMLInputElement | HTMLTextAreaElement).selectionStart;\n end = (el as HTMLInputElement | HTMLTextAreaElement).selectionEnd;\n if (start === end) return; // collapsed\n } catch (error) {\n // input that doesn't support selectionStart/selectionEnd (like checkbox)\n // do nothing here\n return;\n }\n return observer.next();\n }\n\n // handle non-input elements\n\n // non-input elements have an attribute called \"isCollapsed\" which\n // if true, indicates there \"is currently not any text selected\"\n // (see https://developer.mozilla.org/en-US/docs/Web/API/Selection/isCollapsed)\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed) return;\n return observer.next();\n };\n window.document.addEventListener('selectionchange', handler);\n return () => {\n window.document.removeEventListener('selectionchange', handler);\n };\n }),\n );\n\n const mouseMoveObservable = multicast(createMouseMoveObservable());\n\n return {\n [ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,\n [ObservablesEnum.MutationObservable]: enrichedMutationObservable,\n [ObservablesEnum.NavigateObservable]: enrichedNavigateObservable,\n [ObservablesEnum.BrowserErrorObservable]: browserErrorObservables,\n [ObservablesEnum.SelectionObservable]: selectionObservable,\n [ObservablesEnum.MouseMoveObservable]: mouseMoveObservable,\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 observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions only for enabled features\n if (rageClicksEnabled) {\n const shouldTrackRageClick = createShouldTrackEvent(options, rageCssSelectors);\n const rageClickSubscription = trackRageClicks({\n allObservables,\n amplitude,\n shouldTrackRageClick,\n });\n subscriptions.push(rageClickSubscription);\n }\n\n if (deadClicksEnabled) {\n const shouldTrackDeadClick = createShouldTrackEvent(options, deadCssSelectors);\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\n if (isErrorClicksEnabled) {\n const shouldTrackErrorClick = createShouldTrackEvent(options, errorCssSelectors);\n const errorClickSubscription = trackErrorClicks({\n amplitude,\n allObservables,\n shouldTrackErrorClick,\n });\n subscriptions.push(errorClickSubscription);\n }\n\n if (thrashedCursorEnabled) {\n let directionChanges, thresholdMs;\n if (typeof options.thrashedCursor === 'object') {\n directionChanges = options.thrashedCursor.directionChanges;\n thresholdMs = options.thrashedCursor.threshold;\n\n if (directionChanges && directionChanges < MINIMUM_THRASHED_CURSOR_DIRECTION_CHANGES) {\n config.loggerProvider.warn(\n `'thrashedCursor.directionChanges' of ${directionChanges} is below the minimum of ${MINIMUM_THRASHED_CURSOR_DIRECTION_CHANGES}, setting to ${MINIMUM_THRASHED_CURSOR_DIRECTION_CHANGES}`,\n );\n directionChanges = MINIMUM_THRASHED_CURSOR_DIRECTION_CHANGES;\n }\n if (thresholdMs && thresholdMs > MAXIMUM_THRASHED_CURSOR_THRESHOLD) {\n config.loggerProvider.warn(\n `'thrashedCursor.threshold' of ${thresholdMs} is above the maximum of ${MAXIMUM_THRASHED_CURSOR_THRESHOLD}, setting to ${MAXIMUM_THRASHED_CURSOR_THRESHOLD}`,\n );\n thresholdMs = MAXIMUM_THRASHED_CURSOR_THRESHOLD;\n }\n }\n const thrashedCursorSubscription = trackThrashedCursor({\n amplitude,\n options,\n allObservables,\n directionChanges,\n thresholdMs,\n });\n subscriptions.push(thrashedCursorSubscription);\n }\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","globalScope","originalConsole","console","handlers","originalFn","inConsoleOverride","consoleObserver","addListener","level","callback","logLevel","res","args","_i","callbacks","forEach","_a","Error","removeListener","_b","values","_c","splice","_restoreConsole","entries","_d","key","originalHandler","DEFAULT_CSS_SELECTOR_ALLOWLIST","DEFAULT_DATA_ATTRIBUTE_PREFIX","DEFAULT_ACTION_CLICK_ALLOWLIST","DEFAULT_ERROR_AND_DEAD_CLICK_ALLOWLIST","DEFAULT_DEAD_CLICK_ALLOWLIST","DEFAULT_ERROR_CLICK_ALLOWLIST","DEFAULT_RAGE_CLICK_ALLOWLIST","TEXT_MASK_ATTRIBUTE","MASKED_TEXT_VALUE","CC_REGEX","SSN_REGEX","EMAIL_REGEX","defineProperty","Observable_1","Observable","hasSymbol","name","Boolean","getSymbol","SymbolIterator","SymbolObservable","SymbolSpecies","getMethod","obj","getSpecies","ctor","constructor","undefined","hostReportError","log","setTimeout","enqueue","fn","cleanupSubscription","subscription","cleanup","_cleanup","unsubscribe","closeSubscription","_observer","_queue","_state","notifySubscription","type","observer","onNotify","queue","flushSubscription","Subscription","subscriber","subscriptionObserver","closed","complete","_subscriber","subscribe","map","filter","reduce","C","hasSeed","hasValue","acc","first","all","sources","index","startNext","flatMap","subscriptions","outer","inner","indexOf","completeIfDone","x","method","observable","isObservable","item","isArray","of","items","symbol","configurable","require$$0","asyncMap","ZenObservable","catch","merge","sourceA","sourceB","Set","subscriptions_1","subscriptions_1_1","sub","clear","subscribeTo","source","err","delete","size","add","multicast","observers","observers_1","observers_1_1","obs","observers_2","observers_2_1","observers_3","observers_3_1","AMPLITUDE_ORIGIN","AMPLITUDE_ORIGINS_MAP","US","EU","STAGING","MESSENGER_BRAND","MESSENGER_GLOBAL_KEY","BaseWindowMessenger","origin","isSetup","messageHandler","requestCallbacks","actionHandlers","Map","pendingMessages","scriptLoadPromises","endpoint","notify","message","logger","debug","JSON","stringify","_e","opener","postMessage","sendRequest","action","options","_this","timeout","id","Date","now","Math","random","toString","substr","request","handleResponse","response","responseData","warn","registerActionHandler","handler","has","set","queued","get","queued_1","queued_1_1","loadScriptOnce","existing","loadPromise","document","querySelector","CSS","escape","status","scriptElement","createElement","async","src","addEventListener","once","head","appendChild","asyncLoadScript","error_1","setup","event","eventData","data","_f","destroy","removeEventListener","getOrCreateWindowMessenger","messenger","BG_CAPTURE_BRAND","MouseButton","VERSION","AMPLITUDE_ELEMENT_CLICKED_EVENT","AMPLITUDE_EVENT_PROP_ELEMENT_TAG","AMPLITUDE_EVENT_PROP_ELEMENT_TEXT","AMPLITUDE_EVENT_PROP_PAGE_URL","DATA_AMP_MASK_ATTRIBUTES","SENSITIVE_TAGS","isElementPointerCursor","element","actionType","computedStyle","getComputedStyle","getPropertyValue","isUrlAllowed","autocaptureOptions","pageUrlAllowlist","pageUrlExcludelist","location","href","createShouldTrackEvent","isAlwaysCaptureCursorPointer","shouldTrackEventResolver","tag","tagName","toLowerCase","elementType","String","getAttribute","isCursorPointer","hasMatchAnyAllowedSelector","selector","matches","parseAttributesToMask","attributeString","split","attr","trim","removeEmptyProperties","properties","keys","filteredProperties","isEmpty","getClosestElement","selectors","parentElement","filterOutNonTrackableEvents","target","closestTrackedAncestor","VISUAL_TAGGING_BRAND","enableVisualTagging","branded","dataExtractor","isElementSelectable","cssSelectorAllowlist","actionClickAllowlist","amplitudeVisualTaggingSelectorInstance","onSelect","onTrack","actionData","amplitudeVisualTaggingSelector","getEventTagProps","visualHighlightClass","extractDataFromDataSource","diagnostics","autocapture","version","close","createMutationObservable","mutationObserver","MutationObserver","mutations","observe","childList","attributes","characterData","subtree","disconnect","createClickObservable","clickType","capture","createErrorObservable","unhandledErrorObservable","ErrorEvent","output","kind","DOMException","stack","filename","lineNumber","lineno","columnNumber","colno","reason","executeActions","actions","ev","dataSource","targetElementProperties","destinationKey","eventTypeToBrowserEventMap","groupLabeledEventIdsByEventType","labeledEvents","groupedLabeledEvents","browserEvent","labeledEvents_1","labeledEvents_1_1","le","e_2","definition","def","event_type","createLabeledEventToTriggerMap","triggers","labeledEventToTriggerMap","triggers_1","triggers_1_1","trigger","e_4","conditions","condition","eventId","existingTriggers","matchEventToLabeledEvents","filters","every","subprop_key","subprop_op","subprop_value","includes","closest","matchEventToFilter","TriggerEvaluator","evaluate","pageActions","matchingTriggers","leToTriggerMap","labeledEvents_2","labeledEvents_2_1","triggers_2","triggers_2_1","matchLabeledEventsToTriggers","matchingTriggers_1","matchingTriggers_1_1","update","BLOCKED_ATTRIBUTES","SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST","SVG_TAGS","HIGHLY_SENSITIVE_INPUT_TYPES","getElementProperties","userMaskedAttributeNames","siblings","children","indexOfType","el","prevSiblingTag","previousElementSibling","prevSib","classes","classList","filteredAttributes","isSensitiveElement","isContentEditable","HTMLElement","isNonSensitiveElement","filteredAttributes_1","filteredAttributes_1_1","substring","attrs","ObservablesEnum","DataExtractor","context","replaceSensitiveString","text","additionalMaskTextPatterns","replace","additionalMaskTextPatterns_1","additionalMaskTextPatterns_1_1","pattern","getHierarchy","hierarchy","startTime","performance","ancestors","targetEl","current","getAncestors","elementToAttributesToMaskMap","node","attributesToMask","constants.DATA_AMP_MASK_ATTRIBUTES","ancestorAttributesToMask","combinedAttributesToMask","hierarchyNode","hierarchy_1","hierarchy_1_1","endTime","diagnosticsClient","recordHistogram","getNearestLabel","labelElement","parent","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","round","constants.AMPLITUDE_EVENT_PROP_PAGE_URL","locationStr","loggerProvider","decodedLocationStr","decodeURI","getDecodeURI","parseTitleFunction","title","titleElement","hasAttribute","getPageTitle","innerHeight","innerWidth","HTMLAnchorElement","addTypeAndTimestamp","timestamp","addAdditionalEventProperties","selectorAllowlist","isCapturingCursorPointer","baseEvent","isElementBasedEvent","contextElement","sourceType","sourceElement","scopingElement","documentElement","scope","getDataSource","elementExtractType","attribute","getTextWithMaskedDescendants","maskedSelector","innerText","childNodes","childNodes_1","childNodes_1_1","childNode","nodeType","Node","TEXT_NODE","Element","textContent","rawPatterns","maskTextRegex","compiled","rawPatterns_1","rawPatterns_1_1","entry","RegExp","autocapturePlugin","setTag","_j","_k","visualTaggingOptions","enabled","debounceTime","excludePattern","regexError","_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","bind","changeSubscription","trackChange","actionClickSubscription","filteredClickObservable","closestActionClickEl","clickEvent","mutationOrNavigate","clickMutationNavigateObservable","actionClickTimer","lastClickEvent","clearTimeout","event_1","actionClick","trackActionClick","scriptUrl","backgroundCaptureInstance","onBackgroundCapture","backgroundCaptureData","resolvedUrl","URL","amplitudeBackgroundCapture","enableBackgroundCapture","serverZone","constants.AMPLITUDE_ORIGINS_MAP","execute","teardown","CHANGE_EVENTS","addCoordinates","regionBox","pageX","pageY","yMin","min","yMax","max","xMin","xMax","isOutOfBounds","getRageClickAnalyticsEvent","clickWindow","firstClick","lastClick","rageClickEvent","toISOString","X","Y","Time","time","trackRageClicks","shouldTrackRageClick","selectionObservable","clickBoundingBox","pendingRageClick","resetClickWindow","rageClickObservable","resolutionValue","isNewElement","isClickOutsideRageClickWindow","timerId","selectionSubscription","rageClickSubscription","Direction","Axis","isThrashedCursor","directionChanges","changes","changesThreshold","thresholdMs","resetDirectionChangeSeries","directionChangeSeries","adjustWindow","leftPtr","lastChange","createThrashedCursorObservable","mouseDirectionChangeObservable","xDirectionChanges","yDirectionChanges","pendingThrashedCursor","timer","emitPendingThrashedCursor","axis","shift","addDirectionChange","nextPendingThrashedCursor","directionChangesX","directionChangesY","startTimeY","getPendingThrashedCursor","trackThrashedCursor","mouseMoveObservable","allWindowObservables","lastPosition","xDirection","yDirection","currentPosition","clientX","clientY","DECREASING","INCREASING","createMouseDirectionChangeObservable","getCssSelectorAllowlist","defaultAllowlist","MAXIMUM_THRASHED_CURSOR_THRESHOLD","isErrorClicksEnabled","errorClicks","deadClicksEnabled","deadClicks","rageClicksEnabled","rageClicks","thrashedCursorEnabled","thrashedCursor","rageCssSelectors","deadCssSelectors","errorCssSelectors","combinedCssSelectors","enrichedNavigateObservable","browserErrorObservables","enrichedMutationObservable","navigate","activeElement","selectionStart","selectionEnd","selection","getSelection","isCollapsed","BrowserErrorObservable","SelectionObservable","MouseMoveObservable","shouldTrackDeadClick","deadClickSubscription","button","LEFT_OR_TOUCH_CONTACT","changeObservables","clicksAndChangeObservable","deadClickTimer","deadClickEvent","trackDeadClick","shouldTrackErrorClick","errorClickSubscription","browserErrorObservable","errorClickTimer","latestClickEvent","clearClickTimer","trackErrorClicks","threshold","thrashedCursorSubscription"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"amplitude-min.js","sources":["../../../../node_modules/.pnpm/@rollup+plugin-typescript@10.0.1_rollup@2.79.2_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js","../../../analytics-core/src/global-scope.ts","../../../analytics-core/src/utils/url-utils.ts","../../../analytics-core/src/observers/console.ts","../../../analytics-core/src/types/element-interactions.ts","../../../analytics-core/src/types/frustration-interactions.ts","../../../analytics-core/src/plugins/helpers.ts","../../../../node_modules/.pnpm/zen-observable@0.10.0/node_modules/zen-observable/lib/Observable.js","../../../../node_modules/.pnpm/zen-observable@0.10.0/node_modules/zen-observable/index.js","../../../analytics-core/src/utils/observable.ts","../../../analytics-core/src/messenger/constants.ts","../../../analytics-core/src/messenger/base-window-messenger.ts","../../../analytics-core/src/messenger/utils.ts","../../../analytics-core/src/messenger/background-capture.ts","../../../src/version.ts","../../../src/helpers.ts","../../../src/constants.ts","../../../src/libs/messenger.ts","../../../src/observables.ts","../../../src/pageActions/actions.ts","../../../src/pageActions/triggers.ts","../../../src/pageActions/matchEventToFilter.ts","../../../src/hierarchy.ts","../../../src/data-extractor.ts","../../../src/autocapture-plugin.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/autocapture/track-error-click.ts","../../../src/autocapture/track-thrashed-cursor.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 */\n\nexport const getGlobalScope = (): typeof globalThis | undefined => {\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 const ampIntegrationContextName = 'ampIntegrationContext' as keyof typeof globalThis;\n if (typeof globalThis !== 'undefined' && typeof globalThis[ampIntegrationContextName] !== 'undefined') {\n return globalThis[ampIntegrationContextName] as typeof globalThis;\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","import { ILogger } from '../logger';\n\n/**\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 const isUrlMatchAllowlist = (url: string, allowlist: (string | RegExp)[] | undefined): boolean => {\n if (!allowlist || !allowlist.length) {\n return true;\n }\n return allowlist.some((allowedUrl) => {\n if (typeof allowedUrl === 'string') {\n return url === allowedUrl;\n }\n return url.match(allowedUrl);\n });\n};\n\nexport const getDecodeURI = (locationStr: string, loggerProvider?: ILogger): string => {\n let decodedLocationStr = locationStr;\n try {\n decodedLocationStr = decodeURI(locationStr);\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.error('Malformed URI sequence: ', e);\n }\n\n return decodedLocationStr;\n};\n","import { getGlobalScope } from '../global-scope';\n\ntype ConsoleLogLevel = keyof Console;\ntype Callback = (logLevel: ConsoleLogLevel, args: any[]) => void;\n\nconst globalScope = getGlobalScope();\n/* istanbul ignore next */\nconst originalConsole: any = globalScope?.console;\n\nlet handlers: { [key in ConsoleLogLevel]?: Array<Callback> } = {};\n\n// keeps reference to original console methods\nlet originalFn: { [key in ConsoleLogLevel]?: (...args: any[]) => void } = {};\n\nlet inConsoleOverride = false;\n\nfunction overrideConsole(logLevel: ConsoleLogLevel): boolean {\n /* istanbul ignore if */\n if (!originalConsole) {\n return false;\n }\n\n // should not override if original console property is not a function\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n if (typeof originalConsole[logLevel] !== 'function') {\n return false;\n }\n\n // if console is already overridden, return true\n if (originalFn[logLevel]) {\n return true;\n }\n\n // override console method\n const handler = function (...args: any[]) {\n try {\n if (handlers[logLevel] && !inConsoleOverride) {\n // add a re-entrancy guard to prevent infinite recursion\n inConsoleOverride = true;\n const callbacks = handlers[logLevel];\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(logLevel, args);\n } catch {\n // do nothing\n }\n });\n }\n }\n } catch {\n // do nothing\n }\n inConsoleOverride = false;\n return originalFn[logLevel]!.apply(originalConsole, args);\n };\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n originalFn[logLevel] = originalConsole[logLevel] as (...args: any[]) => void;\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n originalConsole[logLevel] = handler;\n return true;\n}\n\n/**\n * Observe a console log method (log, warn, error, etc.)\n * @param level - The console log level to observe\n * @param callback - The callback function to call when the console log level is observed\n */\nfunction addListener(level: ConsoleLogLevel, callback: Callback): Error | void {\n const res = overrideConsole(level);\n\n /* istanbul ignore if */\n if (!res) {\n return new Error('Console override failed');\n }\n\n if (handlers[level]) {\n // using ! is safe because we know the key exists based on condition above\n handlers[level]!.push(callback);\n } else {\n handlers[level] = [callback];\n }\n}\n\n/**\n * Disconnect a callback function from a console log method\n * @param callback - The callback function to disconnect\n */\nfunction removeListener(callback: Callback) {\n for (const callbacks of Object.values(handlers)) {\n // iterate backwards to avoid index shifting\n for (let i = callbacks.length - 1; i >= 0; i--) {\n if (callbacks[i] === callback) {\n callbacks.splice(i, 1);\n break;\n }\n }\n }\n}\n\n// this should only be used for testing\n// restoring console can break console overrides\nfunction _restoreConsole() {\n for (const [key, originalHandler] of Object.entries(originalFn)) {\n if (originalHandler) {\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n originalConsole[key] = originalHandler;\n }\n }\n originalFn = {};\n handlers = {};\n}\n\nconst consoleObserver = {\n addListener,\n removeListener,\n _restoreConsole,\n};\n\nexport { consoleObserver, ConsoleLogLevel };\n","import { ILogger } from '../logger';\n\nexport type ActionType = 'click' | 'change';\n\n/**\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 const 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/**\n * Default prefix to allow the plugin to capture data attributes as an event property.\n */\nexport const DEFAULT_DATA_ATTRIBUTE_PREFIX = 'data-amp-track-';\n\n/**\n * Default list of elements on the page should be tracked when the page changes.\n */\nexport const DEFAULT_ACTION_CLICK_ALLOWLIST = ['div', 'span', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\nexport interface ElementInteractionsOptions {\n /**\n * List of CSS selectors to allow auto tracking on.\n * When provided, allow elements matching any selector to be tracked.\n * Default is ['a', 'button', 'input', 'select', 'textarea', 'label', '[data-amp-default-track]', '.amp-default-track'].\n */\n cssSelectorAllowlist?: string[];\n\n /**\n * List of page URLs to allow auto tracking on.\n * When provided, only allow tracking on these URLs.\n * Both full URLs and regex are supported.\n */\n pageUrlAllowlist?: (string | RegExp)[];\n\n /**\n * List of page URLs to exclude from auto tracking.\n * When provided, tracking will be blocked on these URLs.\n * Both full URLs and regex are supported.\n * This takes precedence over pageUrlAllowlist.\n */\n pageUrlExcludelist?: (RegExp | string | { pattern: string })[];\n\n /**\n * Function to determine whether an event should be tracked.\n * When provided, this function overwrites all other allowlists and configurations.\n * If the function returns true, the event will be tracked.\n * If the function returns false, the event will not be tracked.\n * @param actionType - The type of action that triggered the event.\n * @param element - The [Element](https://developer.mozilla.org/en-US/docs/Web/API/Element) that triggered the event.\n */\n shouldTrackEventResolver?: (actionType: ActionType, element: DomElement) => boolean;\n\n /**\n * Prefix for data attributes to allow auto collecting.\n * Default is 'data-amp-track-'.\n */\n dataAttributePrefix?: string;\n\n /**\n * Options for integrating visual tagging selector.\n */\n visualTaggingOptions?: {\n enabled?: boolean;\n };\n\n /**\n * This has been deprecated in favor of rage clicks tracking\n * via frustrationInteractions.\n *\n * Setting this will have no effect.\n *\n * @deprecated\n */\n debounceTime?: number;\n\n /**\n * CSS selector allowlist for tracking clicks that result in a DOM change/navigation on elements not already allowed by the cssSelectorAllowlist\n */\n actionClickAllowlist?: string[];\n\n /**\n * Remote config for page actions\n */\n pageActions?: {\n triggers: Trigger[];\n labeledEvents: Record<string, LabeledEvent>;\n };\n\n /**\n * RegExp pattern list to allow custom patterns for text masking\n */\n maskTextRegex?: (RegExp | { pattern: string; description: string })[];\n}\n\ntype MatchingCondition = {\n type: 'LABELED_EVENT';\n match: {\n eventId: string;\n };\n};\n\nexport type Trigger = {\n id: string;\n name: string; // Human friendly name for the trigger\n conditions: MatchingCondition[]; // Configures when the actions should be executed; AND\n actions: Array<PageAction | string>; // Actions to execute if conditions are met\n};\n\nexport type PageAction = {\n id: string;\n actionType: 'ATTACH_EVENT_PROPERTY';\n dataSource: DataSource; // Defines where and how to get the data\n destinationKey: string; // Property key name for the data (e.g. event property name, data layer key, user property name)\n};\n\nexport type DataSource = {\n sourceType: 'DOM_ELEMENT' | 'PAGE_CONTEXT'; // | 'URL' ;\n} & (\n | {\n sourceType: 'DOM_ELEMENT';\n selector?: string; // For DOM_ELEMENT: CSS selector for the target element\n elementExtractType: 'TEXT' | 'ATTRIBUTE';\n attribute?: string; // For DOM_ELEMENT: Attribute name to extract (null/empty for text content)\n scope?: string; // CSS selector for the scope of the element, document by default\n }\n | {\n sourceType: 'PAGE_CONTEXT';\n propertyPath: string; // For PAGE_CONTEXT: e.g., 'document.title'\n }\n);\n\nexport type EventSubpropKey = '[Amplitude] Element Text' | '[Amplitude] Element Hierarchy';\n\nexport type Filter = {\n subprop_key: EventSubpropKey;\n subprop_op: string; // exact, autotrack css match\n subprop_value: string[];\n};\n\nexport type LabeledEvent = {\n id: string;\n definition: {\n event_type: '[Amplitude] Element Clicked' | '[Amplitude] Element Changed';\n filters: Filter[];\n }[];\n};\n\nexport interface Messenger {\n logger?: ILogger;\n setup: () => void;\n}\n\n// DomElement is [Element](https://developer.mozilla.org/en-US/docs/Web/API/Element) if the dom library is included in tsconfig.json\n// and never if it is not included\n// eslint-disable-next-line no-restricted-globals\ntype DomElement = typeof globalThis extends {\n Element: new (...args: any) => infer T;\n}\n ? T\n : never;\n","import { ActionType } from './element-interactions';\n\n/**\n * Configuration options for dead clicks tracking\n */\nexport interface DeadClickOptions {\n /**\n * CSS selectors to define which elements on the page to track for dead clicks.\n * A dead click is a click that doesn't result in any visible change or navigation.\n */\n cssSelectorAllowlist?: string[];\n}\n\n/**\n * Configuration options for rage clicks tracking\n */\nexport interface RageClickOptions {\n /**\n * CSS selectors to define which elements on the page to track for rage clicks.\n * A rage click is multiple rapid clicks on the same element within a 3s time window.\n */\n cssSelectorAllowlist?: string[];\n}\n\n/**\n * Configuration options for thrashed cursor tracking\n */\nexport interface ThrashedCursorOptions {\n /**\n * Number of direction changes required to consider a thrashed cursor.\n * Minimum of 5\n * (x axis changes and y axis changes are counted separately)\n * @default 10\n */\n directionChanges?: number;\n /**\n * Time window in milliseconds to consider a thrashed cursor.\n * Maximum of of 4000\n * @default 2000\n */\n threshold?: number;\n}\n\n/**\n * Configuration options for error clicks tracking\n */\nexport interface ErrorClickOptions {\n /**\n * CSS selectors to define which elements on the page to track for error clicks.\n * An error click is a click that results in an error.\n */\n cssSelectorAllowlist?: string[];\n}\n\n/**\n * Configuration options for frustration interactions tracking.\n * This includes dead clicks and rage clicks tracking.\n */\nexport interface FrustrationInteractionsOptions {\n /**\n * List of page URLs to allow auto tracking on.\n * When provided, only allow tracking on these URLs.\n * Both full URLs and regex are supported.\n */\n pageUrlAllowlist?: (string | RegExp)[];\n\n /**\n * List of page URLs to exclude from auto tracking.\n * When provided, tracking will be blocked on these URLs.\n * Both full URLs and regex are supported.\n * This takes precedence over pageUrlAllowlist.\n */\n pageUrlExcludelist?: (string | RegExp)[];\n\n /**\n * Function to determine whether an event should be tracked.\n * When provided, this function overwrites all other allowlists and configurations.\n * If the function returns true, the event will be tracked.\n * If the function returns false, the event will not be tracked.\n * @param actionType - The type of action that triggered the event.\n * @param element - The [Element](https://developer.mozilla.org/en-US/docs/Web/API/Element) that triggered the event.\n */\n shouldTrackEventResolver?: (actionType: ActionType, element: DomElement) => boolean;\n\n /**\n * Prefix for data attributes to allow auto collecting.\n * Default is 'data-amp-track-'.\n */\n dataAttributePrefix?: string;\n\n /**\n * Configuration for dead clicks tracking.\n * Set to `false` to disable dead click tracking.\n * Set to `true` or an options object to enable with default or custom settings.\n * Default is false.\n */\n deadClicks?: boolean | DeadClickOptions;\n\n /**\n * Configuration for rage clicks tracking.\n * Set to `false` to disable rage click tracking.\n * Set to `true` or an options object to enable with default settings.\n * Default is false.\n */\n rageClicks?: boolean | RageClickOptions;\n\n /**\n * Configuration for error clicks tracking\n * Set to `false` to disable error click tracking.\n * Set to `true` or an options object to enable with default settings.\n * Default is false.\n * @experimental this feature is experimental and may not be stable\n */\n errorClicks?: boolean | ErrorClickOptions;\n /**\n * Configuration for thrashed cursor tracking.\n * Set to `false` to disable thrashed cursor tracking.\n * Set to `true` or an options object to enable with default settings.\n * Default is false.\n * @experimental this feature is experimental and may not be stable\n */\n thrashedCursor?: boolean | ThrashedCursorOptions;\n\n /**\n * RegExp pattern list to allow custom patterns for text masking\n */\n maskTextRegex?: (RegExp | { pattern: string; description: string })[];\n}\n\nconst 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\nconst DEFAULT_ERROR_AND_DEAD_CLICK_ALLOWLIST = [\n 'input[type=\"button\"]',\n 'input[type=\"submit\"]',\n 'input[type=\"reset\"]',\n 'input[type=\"image\"]',\n 'input[type=\"file\"]',\n ...CLICKABLE_ELEMENT_SELECTORS,\n];\n\n/**\n * Default CSS selectors for dead clicks tracking\n */\nexport const DEFAULT_DEAD_CLICK_ALLOWLIST = DEFAULT_ERROR_AND_DEAD_CLICK_ALLOWLIST;\n\n/**\n * Default CSS selectors for error tracking\n */\nexport const DEFAULT_ERROR_CLICK_ALLOWLIST = DEFAULT_ERROR_AND_DEAD_CLICK_ALLOWLIST;\n\n/**\n * Default CSS selectors for rage clicks tracking\n */\nexport const DEFAULT_RAGE_CLICK_ALLOWLIST = ['*'];\n\n/**\n * Default time window for dead clicks (3 seconds)\n */\nexport const DEFAULT_DEAD_CLICK_WINDOW_MS = 3_000;\n\n/**\n * Default time window for rage clicks (1 second)\n */\nexport const DEFAULT_RAGE_CLICK_WINDOW_MS = 1_000;\n\n/**\n * Default threshold for rage clicks (4 clicks)\n */\nexport const DEFAULT_RAGE_CLICK_THRESHOLD = 4;\n\n/**\n * Default threshold for rage clicks to be considered out of bounds (50 pixels)\n */\nexport const DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD = 50; // pixels\n\n// DomElement is [Element](https://developer.mozilla.org/en-US/docs/Web/API/Element) if the dom library is included in tsconfig.json\n// and never if it is not included\n// eslint-disable-next-line no-restricted-globals\ntype DomElement = typeof globalThis extends {\n Element: new (...args: any) => infer T;\n}\n ? T\n : never;\n","export const TEXT_MASK_ATTRIBUTE = 'data-amp-mask';\nexport const MASKED_TEXT_VALUE = '*****';\n\n// Regex patterns for sensitive data\nexport const CC_REGEX = /\\b(?:\\d[ -]*?){13,16}\\b/;\nexport const SSN_REGEX = /(\\d{3}-?\\d{2}-?\\d{4})/g;\nexport const EMAIL_REGEX = /[^\\s@]+@[^\\s@.]+\\.[^\\s@]+/g;\n\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 const replaceSensitiveString = (text: string | null, additionalMaskTextPatterns: RegExp[] = []): string => {\n if (typeof text !== 'string') {\n return '';\n }\n\n let result = text;\n\n // Check for credit card number (with or without spaces/dashes)\n result = result.replace(CC_REGEX, MASKED_TEXT_VALUE);\n\n // Check for social security number\n result = result.replace(SSN_REGEX, MASKED_TEXT_VALUE);\n\n // Check for email\n result = result.replace(EMAIL_REGEX, MASKED_TEXT_VALUE);\n\n // Check for additional mask text patterns\n for (const pattern of additionalMaskTextPatterns) {\n try {\n result = result.replace(pattern, MASKED_TEXT_VALUE);\n } catch {\n // ignore invalid pattern\n }\n }\n\n return result;\n};\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 const getPageTitle = (parseTitleFunction?: (title: string) => string): string => {\n if (typeof document === 'undefined' || !document.title) {\n return '';\n }\n const 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","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Observable = void 0;\n\n// === Symbol Support ===\nconst hasSymbol = name => Boolean(Symbol[name]);\n\nconst getSymbol = name => hasSymbol(name) ? Symbol[name] : '@@' + name;\n\nconst SymbolIterator = getSymbol('iterator');\nconst SymbolObservable = getSymbol('observable');\nconst SymbolSpecies = getSymbol('species'); // === Abstract Operations ===\n\nfunction getMethod(obj, key) {\n let 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 let 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(() => {\n throw e;\n });\n }\n}\n\nfunction enqueue(fn) {\n Promise.resolve().then(() => {\n try {\n fn();\n } catch (e) {\n hostReportError(e);\n }\n });\n}\n\nfunction cleanupSubscription(subscription) {\n let 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 let 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 let queue = subscription._queue;\n\n if (!queue) {\n return;\n }\n\n subscription._queue = undefined;\n subscription._state = 'ready';\n\n for (let 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 let observer = subscription._observer;\n\n try {\n let 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,\n value\n });\n\n return;\n }\n\n if (subscription._state !== 'ready') {\n subscription._state = 'buffering';\n subscription._queue = [{\n type,\n value\n }];\n enqueue(() => flushSubscription(subscription));\n return;\n }\n\n notifySubscription(subscription, type, value);\n}\n\nclass Subscription {\n constructor(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 let self = this;\n let subscriptionObserver = {\n get closed() {\n return self._state === 'closed';\n },\n\n next(value) {\n onNotify(self, 'next', value);\n },\n\n error(value) {\n onNotify(self, 'error', value);\n },\n\n complete() {\n onNotify(self, 'complete');\n }\n\n };\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 get closed() {\n return this._state === 'closed';\n }\n\n unsubscribe() {\n if (this._state !== 'closed') {\n closeSubscription(this);\n cleanupSubscription(this);\n }\n }\n\n}\n\nclass Observable {\n constructor(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 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 forEach(fn) {\n return new Promise((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 let subscription = this.subscribe({\n next(value) {\n try {\n fn(value, done);\n } catch (e) {\n reject(e);\n subscription.unsubscribe();\n }\n },\n\n error: reject,\n complete: resolve\n });\n });\n }\n\n map(fn) {\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n let C = getSpecies(this);\n return new C(observer => this.subscribe({\n next(value) {\n try {\n value = fn(value);\n } catch (e) {\n return observer.error(e);\n }\n\n observer.next(value);\n },\n\n error(e) {\n observer.error(e);\n },\n\n complete() {\n observer.complete();\n }\n\n }));\n }\n\n filter(fn) {\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n let C = getSpecies(this);\n return new C(observer => this.subscribe({\n next(value) {\n try {\n if (!fn(value)) return;\n } catch (e) {\n return observer.error(e);\n }\n\n observer.next(value);\n },\n\n error(e) {\n observer.error(e);\n },\n\n complete() {\n observer.complete();\n }\n\n }));\n }\n\n reduce(fn) {\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n let C = getSpecies(this);\n let hasSeed = arguments.length > 1;\n let hasValue = false;\n let seed = arguments[1];\n let acc = seed;\n return new C(observer => this.subscribe({\n next(value) {\n let 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\n error(e) {\n observer.error(e);\n },\n\n complete() {\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 async all() {\n let values = [];\n await this.forEach(value => values.push(value));\n return values;\n }\n\n concat(...sources) {\n let C = getSpecies(this);\n return new C(observer => {\n let subscription;\n let index = 0;\n\n function startNext(next) {\n subscription = next.subscribe({\n next(v) {\n observer.next(v);\n },\n\n error(e) {\n observer.error(e);\n },\n\n complete() {\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\n startNext(this);\n return () => {\n if (subscription) {\n subscription.unsubscribe();\n subscription = undefined;\n }\n };\n });\n }\n\n flatMap(fn) {\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n let C = getSpecies(this);\n return new C(observer => {\n let subscriptions = [];\n let outer = this.subscribe({\n next(value) {\n if (fn) {\n try {\n value = fn(value);\n } catch (e) {\n return observer.error(e);\n }\n }\n\n let inner = C.from(value).subscribe({\n next(value) {\n observer.next(value);\n },\n\n error(e) {\n observer.error(e);\n },\n\n complete() {\n let i = subscriptions.indexOf(inner);\n if (i >= 0) subscriptions.splice(i, 1);\n completeIfDone();\n }\n\n });\n subscriptions.push(inner);\n },\n\n error(e) {\n observer.error(e);\n },\n\n complete() {\n completeIfDone();\n }\n\n });\n\n function completeIfDone() {\n if (outer.closed && subscriptions.length === 0) observer.complete();\n }\n\n return () => {\n subscriptions.forEach(s => s.unsubscribe());\n outer.unsubscribe();\n };\n });\n }\n\n [SymbolObservable]() {\n return this;\n }\n\n static from(x) {\n let C = typeof this === 'function' ? this : Observable;\n if (x == null) throw new TypeError(x + ' is not an object');\n let method = getMethod(x, SymbolObservable);\n\n if (method) {\n let 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(observer => observable.subscribe(observer));\n }\n\n if (hasSymbol('iterator')) {\n method = getMethod(x, SymbolIterator);\n\n if (method) {\n return new C(observer => {\n enqueue(() => {\n if (observer.closed) return;\n\n for (let item of method.call(x)) {\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(observer => {\n enqueue(() => {\n if (observer.closed) return;\n\n for (let 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 static of(...items) {\n let C = typeof this === 'function' ? this : Observable;\n return new C(observer => {\n enqueue(() => {\n if (observer.closed) return;\n\n for (let 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 static get [SymbolSpecies]() {\n return this;\n }\n\n}\n\nexports.Observable = Observable;\nObject.defineProperty(Observable, Symbol('extensions'), {\n value: {\n symbol: SymbolObservable,\n hostReportError\n },\n configurable: true\n});","module.exports = require('./lib/Observable.js').Observable;\n","import ZenObservable from 'zen-observable';\n\nexport { ZenObservable as Observable };\n\n/** Subscription type for zen-observable */\ninterface Subscription {\n closed: boolean;\n unsubscribe(): void;\n}\n\n/** Observer type for zen-observable */\ninterface Observer<T> {\n start?(subscription: Subscription): unknown;\n next?(value: T): void;\n error?(errorValue: unknown): void;\n complete?(): void;\n}\n\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<T, R>(observable: ZenObservable<T>, fn: (value: T) => Promise<R>): ZenObservable<R> {\n return new ZenObservable(\n (observer: { next: (value: R) => void; error: (error: any) => void; complete: () => void }) => {\n observable.subscribe({\n next: (value: T) => {\n fn(value)\n .then((result: R) => {\n return observer.next(result);\n })\n .catch((error: any) => observer.error(error));\n },\n error: (error: any) => {\n observer.error(error);\n },\n complete: () => {\n observer.complete();\n },\n });\n },\n );\n}\n\ntype Unsubscribable = {\n unsubscribe: () => void;\n};\n\ntype ZenObserver<A, B> = { next: (v: A | B) => void; error: (e: unknown) => void; complete: () => void };\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<A, B>(sourceA: ZenObservable<A>, sourceB: ZenObservable<B>): ZenObservable<A | B> {\n return new ZenObservable<A | B>((observer: ZenObserver<A, B>) => {\n let closed = false;\n\n const subscriptions: Set<Unsubscribable> = new Set();\n\n const cleanup = (): void => {\n closed = true;\n for (const sub of subscriptions) {\n try {\n sub.unsubscribe();\n } catch {\n /* do nothing */\n }\n }\n subscriptions.clear();\n };\n\n const subscribeTo = <T>(source: ZenObservable<T>) => {\n const sub = source.subscribe({\n next(value: T) {\n if (!closed) observer.next(value as A | B);\n },\n error(err: unknown) {\n if (!closed) {\n closed = true;\n observer.error(err);\n cleanup();\n }\n },\n complete() {\n subscriptions.delete(sub);\n if (!closed && subscriptions.size === 0) {\n observer.complete();\n cleanup();\n closed = true;\n }\n },\n });\n\n subscriptions.add(sub);\n };\n\n subscribeTo(sourceA);\n subscribeTo(sourceB);\n\n return cleanup;\n });\n}\n\n// function share() {\nfunction multicast<T>(source: ZenObservable<T>): ZenObservable<T> {\n const observers: Set<Observer<T>> = new Set();\n let subscription: Subscription | null = null;\n\n function cleanup() {\n /* istanbul ignore next */\n subscription?.unsubscribe();\n subscription = null;\n observers.clear();\n }\n\n return new ZenObservable<T>((observer: Observer<T>) => {\n observers.add(observer);\n\n if (subscription === null) {\n subscription = source.subscribe({\n next(value: T) {\n for (const obs of observers) {\n /* istanbul ignore next */\n obs.next?.(value);\n }\n },\n error(err: unknown) {\n for (const obs of observers) {\n /* istanbul ignore next */\n obs.error?.(err);\n }\n cleanup();\n },\n complete() {\n for (const obs of observers) {\n /* istanbul ignore next */\n obs.complete?.();\n }\n cleanup();\n },\n });\n }\n\n // Return unsubscribe function for this observer\n return () => {\n observers.delete(observer);\n\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}\n\nexport { asyncMap, multicast, merge, Unsubscribable };\n","// Shared origin constants for Amplitude cross-window communication\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: Record<string, string> = {\n US: AMPLITUDE_ORIGIN,\n EU: AMPLITUDE_ORIGIN_EU,\n STAGING: AMPLITUDE_ORIGIN_STAGING,\n};\n\n// Background capture script URL (shared between autocapture and session-replay)\nexport const AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL =\n 'https://cdn.amplitude.com/libs/background-capture-1.0.0-alpha.2.js.gz';\n","/* eslint-disable no-restricted-globals */\nimport { ILogger } from '../logger';\nimport { Messenger } from '../types/element-interactions';\nimport { getGlobalScope } from '../global-scope';\nimport { AMPLITUDE_ORIGIN } from './constants';\nimport { asyncLoadScript, generateUniqueId } from './utils';\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\nexport type ActionHandler = (data: any) => void;\n\n/**\n * Brand key used to identify BaseWindowMessenger instances across bundle boundaries.\n */\nconst MESSENGER_BRAND = '__AMPLITUDE_MESSENGER_INSTANCE__' as const;\n\n/** Global scope key where the singleton messenger is stored. */\nconst MESSENGER_GLOBAL_KEY = '__AMPLITUDE_MESSENGER__';\n\n/**\n * BaseWindowMessenger provides generic cross-window communication via postMessage.\n * Singleton access via getOrCreateWindowMessenger() to prevent duplicate instances\n */\nclass BaseWindowMessenger implements Messenger {\n /** Brand property for cross-bundle instanceof checks. */\n readonly [MESSENGER_BRAND] = true;\n\n endpoint: string;\n logger?: ILogger;\n private isSetup = false;\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n requestCallbacks: {\n [id: string]: {\n resolve: (data: any) => void;\n reject: (data: any) => void;\n };\n } = {};\n private actionHandlers = new Map<string, ActionHandler>();\n\n /**\n * Messages received for actions that had no registered handler yet.\n * Drained automatically when the corresponding handler is registered via\n * registerActionHandler(), solving startup race conditions between\n * independently-initialized plugins.\n */\n private pendingMessages = new Map<string, any[]>();\n\n /**\n * Tracks in-flight and completed script loads by URL.\n * Using a map, this prevents duplicate loads before the first resolves.\n */\n private scriptLoadPromises = new Map<string, Promise<void>>();\n\n constructor({ origin = AMPLITUDE_ORIGIN }: { origin?: string } = {}) {\n this.endpoint = origin;\n }\n\n /**\n * Send a message to the parent window (window.opener).\n */\n notify(message: { action: string; data?: any } | MessageRequest) {\n this.logger?.debug?.('Message sent: ', JSON.stringify(message));\n (window.opener as WindowProxy)?.postMessage?.(message, this.endpoint);\n }\n\n /**\n * Send an async request to the parent window with a unique ID.\n * Returns a Promise that resolves when the parent responds.\n */\n public sendRequest(action: string, args: Record<string, any>, options = { timeout: 15_000 }): Promise<any> {\n const id = generateUniqueId();\n const request: MessageRequest = { id, action, args };\n\n const promise = new Promise((resolve, reject) => {\n this.requestCallbacks[id] = { resolve, reject };\n\n this.notify(request);\n\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 /**\n * Handle a response to a previous request by resolving its Promise.\n */\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 /**\n * Register a handler for a specific action type.\n * Logs a warning if overwriting an existing handler.\n */\n registerActionHandler(action: string, handler: ActionHandler) {\n if (this.actionHandlers.has(action)) {\n this.logger?.warn?.(`Overwriting existing action handler for: ${action}`);\n }\n this.actionHandlers.set(action, handler);\n\n // Replay any messages that arrived before this handler was registered\n const queued = this.pendingMessages.get(action);\n if (queued) {\n this.pendingMessages.delete(action);\n for (const data of queued) {\n handler(data);\n }\n }\n }\n\n /**\n * Load a script once, deduplicating by URL.\n * Safe against concurrent calls — the second call awaits the first's in-flight Promise\n * rather than triggering a duplicate load.\n */\n async loadScriptOnce(url: string): Promise<void> {\n const existing = this.scriptLoadPromises.get(url);\n if (existing) {\n return existing;\n }\n\n const loadPromise = asyncLoadScript(url).then(() => {\n // Resolve to void\n });\n this.scriptLoadPromises.set(url, loadPromise);\n\n try {\n await loadPromise;\n } catch (error) {\n // Remove failed loads so they can be retried\n this.scriptLoadPromises.delete(url);\n throw error;\n }\n }\n\n /**\n * Set up the message listener. Idempotent — safe to call multiple times.\n * Subclasses should call super.setup() and then register their own action handlers.\n */\n setup({ logger, endpoint }: { logger?: ILogger; endpoint?: string } = {}) {\n if (logger) {\n this.logger = logger;\n }\n\n // If endpoint is customized, don't override a previously customized endpoint.\n if (endpoint && this.endpoint === AMPLITUDE_ORIGIN) {\n this.endpoint = endpoint;\n }\n\n // Only attach the message listener once\n if (this.isSetup) {\n return;\n }\n this.isSetup = true;\n\n this.logger?.debug?.('Setting up messenger');\n\n // Attach Event Listener to listen for messages from the parent window\n this.messageHandler = (event: MessageEvent) => {\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 { action?: string; id?: string; data?: any; responseData?: any };\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 && eventData.id) {\n this.logger?.debug?.('Received Response to previous request: ', JSON.stringify(event));\n this.handleResponse(eventData as MessageResponse);\n } else {\n if (action === 'ping') {\n this.notify({ action: 'pong' });\n return;\n }\n\n // Dispatch to registered action handlers, or buffer for late registration\n const handler = this.actionHandlers.get(action);\n if (handler) {\n handler(eventData.data);\n } else {\n const queue = this.pendingMessages.get(action) ?? [];\n queue.push(eventData.data);\n this.pendingMessages.set(action, queue);\n }\n }\n };\n window.addEventListener('message', this.messageHandler);\n\n this.notify({ action: 'page-loaded' });\n }\n\n /**\n * Tear down the messenger: remove the message listener, clear all state.\n */\n destroy() {\n if (this.messageHandler) {\n window.removeEventListener('message', this.messageHandler);\n this.messageHandler = null;\n }\n this.isSetup = false;\n this.actionHandlers.clear();\n this.pendingMessages.clear();\n this.requestCallbacks = {};\n this.scriptLoadPromises.clear();\n\n // Remove from global scope if this is the singleton\n const globalScope = getGlobalScope() as Record<string, unknown> | undefined;\n if (globalScope?.[MESSENGER_GLOBAL_KEY] === this) {\n delete globalScope[MESSENGER_GLOBAL_KEY];\n }\n }\n}\n\n/**\n * Type guard: checks whether a value is a BaseWindowMessenger instance.\n */\nfunction isWindowMessenger(value: unknown): value is BaseWindowMessenger {\n return (\n typeof value === 'object' &&\n value !== null &&\n MESSENGER_BRAND in value &&\n (value as Record<string, unknown>)[MESSENGER_BRAND] === true\n );\n}\n\n/**\n * Get or create a singleton BaseWindowMessenger instance.\n * Ensures only one messenger (and one message listener) exists per page,\n * preventing duplicate script loads and double notifications.\n *\n * The singleton is stored on globalScope under the same MESSENGER_KEY.\n * The branded property check verifies the stored value is actually a messenger.\n */\nexport function getOrCreateWindowMessenger(options?: { origin?: string }): BaseWindowMessenger {\n const globalScope = getGlobalScope() as Record<string, unknown> | undefined;\n\n const existing = globalScope?.[MESSENGER_GLOBAL_KEY];\n if (isWindowMessenger(existing)) {\n return existing;\n }\n\n const messenger = new BaseWindowMessenger(options);\n if (globalScope) {\n globalScope[MESSENGER_GLOBAL_KEY] = messenger;\n }\n return messenger;\n}\n\nexport type { BaseWindowMessenger };\n","/* eslint-disable no-restricted-globals */\n\n/**\n * Dynamically loads an external script by appending a <script> tag to the document head.\n * Deduplicates by checking if a script with the same src already exists.\n */\nexport const asyncLoadScript = (url: string): Promise<{ status: boolean }> => {\n // Dedup: if a script with this src already exists, resolve immediately\n const existing = document.querySelector(`script[src=\"${CSS.escape(url)}\"]`);\n if (existing) {\n return Promise.resolve({ status: true });\n }\n\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\n/**\n * Generates a simple unique ID for message request/response correlation.\n */\nexport function generateUniqueId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n","/* eslint-disable no-restricted-globals */\nimport type { BaseWindowMessenger } from './base-window-messenger';\nimport { AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL } from './constants';\n\n/**\n * Brand key set on the messenger instance to track whether background capture\n * has been enabled.\n */\nconst BG_CAPTURE_BRAND = '__AMPLITUDE_BACKGROUND_CAPTURE__' as const;\n\n/**\n * Enable background capture on a messenger instance.\n * Plugins can call this on a shared messenger instance.\n * The first call registers the handlers; subsequent calls are no-ops.\n *\n * @param messenger - The messenger to enable background capture on\n * @param options.scriptUrl - Override the background capture script URL (optional)\n */\nexport function enableBackgroundCapture(messenger: BaseWindowMessenger, options?: { scriptUrl?: string }): void {\n // Check the brand on the messenger object itself — works across bundle boundaries\n const branded = messenger as unknown as Record<string, unknown>;\n if (branded[BG_CAPTURE_BRAND] === true) {\n return;\n }\n branded[BG_CAPTURE_BRAND] = true;\n\n const scriptUrl = options?.scriptUrl ?? AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL;\n let backgroundCaptureInstance: any = null;\n\n const onBackgroundCapture = (type: string, backgroundCaptureData: { [key: string]: string | number | null }) => {\n if (type === 'background-capture-complete') {\n messenger.logger?.debug?.('Background capture complete');\n messenger.notify({ action: 'background-capture-complete', data: backgroundCaptureData });\n }\n };\n\n messenger.registerActionHandler('initialize-background-capture', () => {\n messenger.logger?.debug?.('Initializing background capture (external script)');\n const resolvedUrl = new URL(scriptUrl, messenger.endpoint).toString();\n\n messenger\n .loadScriptOnce(resolvedUrl)\n .then(() => {\n messenger.logger?.debug?.('Background capture script loaded (external)');\n // eslint-disable-next-line\n backgroundCaptureInstance = /* istanbul ignore next -- window is always defined in browser */ (\n window as any\n )?.amplitudeBackgroundCapture?.({\n messenger,\n onBackgroundCapture,\n });\n messenger.notify({ action: 'background-capture-loaded' });\n })\n .catch(() => {\n messenger.logger?.warn('Failed to initialize background capture');\n });\n });\n\n messenger.registerActionHandler('close-background-capture', () => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n backgroundCaptureInstance?.close?.();\n backgroundCaptureInstance = null;\n });\n}\n","export const VERSION = '1.23.6';\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 isUrlAllowed = (autocaptureOptions: ElementInteractionsOptions): boolean => {\n const { pageUrlAllowlist, pageUrlExcludelist } = autocaptureOptions;\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 // check if the URL is in the allow list\n if (!isUrlMatchAllowlist(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n return true;\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 { 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 if (!isUrlAllowed(autocaptureOptions)) {\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\nexport enum MouseButton {\n LEFT_OR_TOUCH_CONTACT = 0,\n MIDDLE = 1,\n RIGHT = 2,\n}\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_ERROR_CLICKED_EVENT = '[Amplitude] Error Click';\nexport const AMPLITUDE_ELEMENT_CHANGED_EVENT = '[Amplitude] Element Changed';\nexport const AMPLITUDE_THRASHED_CURSOR_EVENT = '[Amplitude] Thrashed Cursor';\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// Origin constants are now shared via analytics-core; re-export for backwards compatibility\nexport {\n AMPLITUDE_ORIGIN,\n AMPLITUDE_ORIGIN_EU,\n AMPLITUDE_ORIGIN_STAGING,\n AMPLITUDE_ORIGINS_MAP,\n AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL,\n} from '@amplitude/analytics-core';\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","/* istanbul ignore file */\n/* eslint-disable no-restricted-globals */\nimport { AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL, AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS } from '../constants';\nimport type { BaseWindowMessenger } from '@amplitude/analytics-core';\nimport { 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 | 'initialize-background-capture'\n | 'close-background-capture'\n | 'background-capture-loaded'\n | 'background-capture-complete';\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 'initialize-background-capture': null | undefined;\n 'close-background-capture': null | undefined;\n 'background-capture-loaded': null | undefined;\n 'background-capture-complete': { [key: string]: string | null };\n};\n\nexport interface Message<A extends Action> {\n action: A;\n data?: ActionData[A];\n}\n\n/**\n * Brand key to track whether visual tagging has been enabled on a messenger.\n */\nconst VISUAL_TAGGING_BRAND = '__AMPLITUDE_VISUAL_TAGGING__' as const;\n\n/**\n * Enable visual tagging on a messenger instance.\n * The first call registers the handlers; subsequent calls are no-ops.\n *\n * @param messenger - The messenger to enable visual tagging on\n * @param options - Visual tagging configuration\n */\nexport function enableVisualTagging(\n messenger: BaseWindowMessenger,\n options: {\n isElementSelectable?: (action: InitializeVisualTaggingSelectorData['actionType'], element: Element) => boolean;\n cssSelectorAllowlist?: string[];\n actionClickAllowlist?: string[];\n dataExtractor: DataExtractor;\n },\n): void {\n // Idempotency guard — works across bundle boundaries\n const branded = messenger as unknown as Record<string, unknown>;\n if (branded[VISUAL_TAGGING_BRAND] === true) {\n return;\n }\n branded[VISUAL_TAGGING_BRAND] = true;\n\n const { dataExtractor, isElementSelectable, cssSelectorAllowlist, actionClickAllowlist } = options;\n\n let amplitudeVisualTaggingSelectorInstance: any = null;\n\n const onSelect = (data: ElementSelectedData) => {\n messenger.notify({ action: 'element-selected', data });\n };\n\n const onTrack = (type: string, properties: { [key: string]: string | null }) => {\n if (type === 'selector-mode-changed') {\n messenger.notify({ action: 'track-selector-mode-changed', data: properties });\n } else if (type === 'selector-moved') {\n messenger.notify({ action: 'track-selector-moved', data: properties });\n }\n };\n\n messenger.registerActionHandler(\n 'initialize-visual-tagging-selector',\n (actionData: InitializeVisualTaggingSelectorData) => {\n messenger\n .loadScriptOnce(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,\n onSelect,\n visualHighlightClass: AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n messenger,\n cssSelectorAllowlist,\n actionClickAllowlist,\n extractDataFromDataSource: dataExtractor.extractDataFromDataSource,\n dataExtractor,\n diagnostics: {\n autocapture: {\n version: VERSION,\n },\n },\n });\n messenger.notify({ action: 'selector-loaded' });\n })\n .catch(() => {\n messenger.logger?.warn('Failed to initialize visual tagging selector');\n });\n },\n );\n\n messenger.registerActionHandler('close-visual-tagging-selector', () => {\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance?.close?.();\n });\n}\n","import { Observable, consoleObserver, getGlobalScope, merge } from '@amplitude/analytics-core';\n\n/* eslint-disable-next-line no-restricted-globals */\nconst globalScope = getGlobalScope() as typeof window;\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 globalScope.document.addEventListener(clickType, handler, { capture: true });\n return () => {\n globalScope.document.removeEventListener(clickType, handler, { capture: true });\n };\n });\n};\n\nconst createConsoleErrorObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (_: string, ...args: any[]) => {\n /* istanbul ignore next */\n let message: string | undefined = undefined;\n if (Array.isArray(args[0]) && typeof args[0][0] === 'string') {\n message = args[0][0];\n }\n observer.next({ kind: 'console', message });\n };\n consoleObserver.addListener('error', handler);\n return () => {\n consoleObserver.removeListener(handler);\n };\n });\n};\n\nconst createUnhandledErrorObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (event: Event) => {\n if (!(event instanceof ErrorEvent)) {\n return;\n }\n let output: BrowserErrorEvent = {\n kind: 'error',\n };\n\n if (event.error instanceof Error || event.error instanceof DOMException) {\n output = {\n ...output,\n message: event.error.message,\n stack: event.error.stack,\n filename: event.filename,\n lineNumber: event.lineno,\n columnNumber: event.colno,\n };\n } else if (typeof event.error === 'string') {\n output.message = event.error;\n }\n observer.next(output);\n };\n\n globalScope.addEventListener('error', handler);\n return () => {\n globalScope.removeEventListener('error', handler);\n };\n });\n};\n\nconst createUnhandledRejectionObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (event: PromiseRejectionEvent) => {\n const output: BrowserErrorEvent = {\n kind: 'unhandledrejection',\n };\n if (event.reason instanceof Error || event.reason instanceof DOMException) {\n output.message = event.reason.message;\n output.stack = event.reason.stack;\n } else if (typeof event.reason === 'string') {\n output.message = event.reason;\n }\n observer.next(output);\n };\n globalScope.addEventListener('unhandledrejection', handler);\n return () => {\n globalScope.removeEventListener('unhandledrejection', handler);\n };\n });\n};\n\nexport type BrowserErrorEvent = {\n kind: 'error' | 'unhandledrejection' | 'console';\n message?: string;\n filename?: string;\n lineNumber?: number;\n columnNumber?: number;\n stack?: string;\n};\n\nexport const createErrorObservable = (): Observable<BrowserErrorEvent> => {\n const unhandledErrorObservable = merge(createUnhandledErrorObservable(), createUnhandledRejectionObservable());\n return merge(unhandledErrorObservable, createConsoleErrorObservable());\n};\n\nexport const createMouseMoveObservable = (): Observable<MouseEvent> => {\n return new Observable<MouseEvent>((observer) => {\n const handler = (event: MouseEvent) => {\n observer.next(event);\n };\n const args: AddEventListenerOptions = { capture: true };\n globalScope.document.addEventListener('mousemove', handler, args);\n return () => {\n globalScope.document.removeEventListener('mousemove', handler, args);\n };\n });\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","import type { ElementInteractionsOptions, LabeledEvent, Trigger } from '@amplitude/analytics-core';\nimport type { ElementBasedTimestampedEvent, ElementBasedEvent } from '../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 '../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 { 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","/* 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 addTypeAndTimestamp = <T>(\n event: T,\n type: BaseTimestampedEvent<T>['type'] | ElementBasedTimestampedEvent<T>['type'],\n ): BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n return {\n event,\n timestamp: Date.now(),\n type,\n };\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 = this.addTypeAndTimestamp(event, type);\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 // Traverse text content without cloning DOM nodes, which avoids media/network side effects\n // from recreating nested elements such as <video>, <audio>, or <img>.\n private getTextWithMaskedDescendants = (element: Element): string => {\n const maskedSelector = `[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`;\n // Fast path: if no masked descendants exist, rely on native text extraction.\n if (!element.querySelector(maskedSelector)) {\n return (element as HTMLElement).innerText;\n }\n\n let output = '';\n const childNodes = Array.from(element.childNodes);\n for (const childNode of childNodes) {\n if (childNode.nodeType === Node.TEXT_NODE) {\n output += childNode.textContent || '';\n continue;\n }\n\n if (!(childNode instanceof Element)) {\n continue;\n }\n\n // Replace entire masked/contenteditable subtrees with the mask token.\n if (childNode.hasAttribute(TEXT_MASK_ATTRIBUTE) || childNode.hasAttribute('contenteditable')) {\n output += MASKED_TEXT_VALUE;\n continue;\n }\n output += this.getTextWithMaskedDescendants(childNode);\n }\n return output;\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 output = this.getTextWithMaskedDescendants(element);\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","/* 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 getOrCreateWindowMessenger,\n enableBackgroundCapture,\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 { enableVisualTagging } 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 BrowserErrorObservable = 'browserErrorObservable',\n SelectionObservable = 'selectionObservable',\n MouseMoveObservable = 'mouseMoveObservable',\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 [ObservablesEnum.SelectionObservable]?: Observable<void>;\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 },\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('configs.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 and background capture on the shared messenger singleton.\n // Using the singleton ensures a single message listener per page, even when\n // session-replay is also loaded.\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n const messenger = getOrCreateWindowMessenger();\n enableVisualTagging(messenger, {\n dataExtractor,\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist,\n });\n enableBackgroundCapture(messenger);\n /* istanbul ignore next */\n messenger.setup({\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\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 { AllWindowObservables } from '../autocapture-plugin';\nimport { ElementBasedEvent, ElementBasedTimestampedEvent, type evaluateTriggersFn } from '../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: ElementBasedTimestampedEvent<ElementBasedEvent>) => {\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_ELEMENT_CLICKED_EVENT, click.targetElementProperties);\n });\n}\n","import { AllWindowObservables } from '../autocapture-plugin';\nimport {\n filterOutNonTrackableEvents,\n shouldTrackEvent,\n ElementBasedTimestampedEvent,\n type evaluateTriggersFn,\n} from '../helpers';\nimport { BrowserClient, ActionType } from '@amplitude/analytics-core';\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 '../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 '../frustration-plugin';\nimport { BrowserClient, ActionType, merge, asyncMap } from '@amplitude/analytics-core';\nimport { ElementBasedTimestampedEvent, filterOutNonTrackableEvents, MouseButton, 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 click.event.button === MouseButton.LEFT_OR_TOUCH_CONTACT\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 '../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 { pageX, pageY } = click.event as MouseEvent;\n regionBox.yMin = Math.min(regionBox.yMin ?? pageY, pageY);\n regionBox.yMax = Math.max(regionBox.yMax ?? pageY, pageY);\n regionBox.xMin = Math.min(regionBox.xMin ?? pageX, pageX);\n regionBox.xMax = Math.max(regionBox.xMax ?? pageX, pageX);\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).pageX,\n Y: (click.event as MouseEvent).pageY,\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, selectionObservable }: 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 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 // reset the click window when a selection change occurs\n /* istanbul ignore next */\n const selectionSubscription = selectionObservable?.subscribe(() => {\n resetClickWindow();\n });\n\n const rageClickSubscription = 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 return {\n unsubscribe: () => {\n rageClickSubscription.unsubscribe();\n /* istanbul ignore next */\n selectionSubscription?.unsubscribe();\n },\n };\n}\n","import { BrowserErrorEvent } from '../observables';\nimport { AllWindowObservables } from '../frustration-plugin';\nimport {\n ElementBasedTimestampedEvent,\n filterOutNonTrackableEvents,\n MouseButton,\n shouldTrackEvent,\n TimestampedEvent,\n} from '../helpers';\nimport { BrowserClient, merge } from '@amplitude/analytics-core';\nimport { AMPLITUDE_ELEMENT_ERROR_CLICKED_EVENT } from '../constants';\n\ntype ClickOrErrorEvent = ElementBasedTimestampedEvent<MouseEvent> | TimestampedEvent<BrowserErrorEvent>;\n\nconst ERROR_CLICK_TIMEOUT = 2_000; // 2 seconds to wait for an error to happen\n\nexport function trackErrorClicks({\n amplitude,\n allObservables,\n shouldTrackErrorClick,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n shouldTrackErrorClick: shouldTrackEvent;\n}) {\n const { clickObservable, browserErrorObservable } = allObservables;\n\n const filteredClickObservable = clickObservable.filter((click) => {\n return (\n filterOutNonTrackableEvents(click) &&\n shouldTrackErrorClick('click', click.closestTrackedAncestor) &&\n click.event.target instanceof Element &&\n click.event.target.closest('a[target=\"_blank\"]') === null &&\n click.event.button === MouseButton.LEFT_OR_TOUCH_CONTACT\n );\n });\n\n let errorClickTimer: ReturnType<typeof setTimeout> | null = null;\n let latestClickEvent: ElementBasedTimestampedEvent<MouseEvent> | null = null;\n\n const clearClickTimer = () => {\n if (errorClickTimer !== null) {\n clearTimeout(errorClickTimer);\n errorClickTimer = null;\n }\n latestClickEvent = null;\n };\n\n return merge(filteredClickObservable, browserErrorObservable).subscribe((event: ClickOrErrorEvent) => {\n if (event.type === 'click') {\n clearClickTimer();\n latestClickEvent = event as ElementBasedTimestampedEvent<MouseEvent>;\n errorClickTimer = setTimeout(clearClickTimer, ERROR_CLICK_TIMEOUT);\n return;\n }\n\n if (event.type === 'error' && latestClickEvent) {\n amplitude.track(AMPLITUDE_ELEMENT_ERROR_CLICKED_EVENT, {\n ['[Amplitude] Kind']: event.event.kind,\n ['[Amplitude] Message']: event.event.message,\n ['[Amplitude] Stack']: event.event.stack,\n ['[Amplitude] Filename']: event.event.filename,\n ['[Amplitude] Line Number']: event.event.lineNumber,\n ['[Amplitude] Column Number']: event.event.columnNumber,\n ...latestClickEvent.targetElementProperties,\n });\n clearClickTimer();\n }\n });\n}\n","import { BrowserClient, ElementInteractionsOptions, Observable } from '@amplitude/analytics-core';\nimport { AllWindowObservables } from '../frustration-plugin';\nimport { AMPLITUDE_THRASHED_CURSOR_EVENT } from '../constants';\nimport { isUrlAllowed } from '../helpers';\n\ntype Position = {\n x: number;\n y: number;\n};\n\nenum Direction {\n INCREASING = 'increasing',\n DECREASING = 'decreasing',\n}\n\nenum Axis {\n X = 'x',\n Y = 'y',\n}\n\nexport const createMouseDirectionChangeObservable = ({\n allWindowObservables,\n}: {\n allWindowObservables: AllWindowObservables;\n}): Observable<Axis> => {\n const { mouseMoveObservable } = allWindowObservables;\n return new Observable<Axis>((observer) => {\n let lastPosition: Position | null = null;\n let xDirection: Direction | null = null;\n let yDirection: Direction | null = null;\n return mouseMoveObservable.subscribe((event) => {\n const currentPosition = { x: event.clientX, y: event.clientY };\n if (lastPosition === null) {\n lastPosition = currentPosition;\n return;\n }\n if (currentPosition.x > lastPosition.x) {\n if (xDirection === Direction.DECREASING) {\n observer.next(Axis.X);\n }\n xDirection = Direction.INCREASING;\n } else if (currentPosition.x < lastPosition.x) {\n if (xDirection === Direction.INCREASING) {\n observer.next(Axis.X);\n }\n xDirection = Direction.DECREASING;\n }\n\n if (currentPosition.y > lastPosition.y) {\n if (yDirection === Direction.DECREASING) {\n observer.next(Axis.Y);\n }\n yDirection = Direction.INCREASING;\n } else if (currentPosition.y < lastPosition.y) {\n if (yDirection === Direction.INCREASING) {\n observer.next(Axis.Y);\n }\n yDirection = Direction.DECREASING;\n }\n lastPosition = currentPosition;\n });\n });\n};\n\ntype DirectionChangeSeries = {\n // number of direction changes to be considered a thrashed cursor\n changesThreshold: number;\n // timestamps of direction changes (limited to \"changesThreshold\" to avoid memory leaks)\n changes: number[];\n // window duration in milliseconds\n thresholdMs: number;\n // when the series of direction changes started\n startTime?: number;\n};\n\nfunction addDirectionChange(directionChangeSeries: DirectionChangeSeries) {\n const now = +Date.now();\n\n directionChangeSeries.startTime = directionChangeSeries.startTime || now;\n\n // add this direction change to the series (fixed length array to avoid memory leaks)\n const { changes, changesThreshold } = directionChangeSeries;\n changes.push(now);\n if (changes.length > changesThreshold) changes.shift();\n}\n\n// checks if there are enough direction changes within window + threshold\n// for it to be considered a thrashed cursor\nfunction isThrashedCursor(directionChanges: DirectionChangeSeries): boolean {\n const { changes, changesThreshold, thresholdMs } = directionChanges;\n if (changes.length < changesThreshold) return false;\n const delta = changes[changes.length - 1] - changes[0];\n return delta < thresholdMs;\n}\n\nfunction resetDirectionChangeSeries(directionChangeSeries: DirectionChangeSeries) {\n directionChangeSeries.changes = [];\n directionChangeSeries.startTime = undefined;\n}\n\n// if the time between first and last change is greater than the threshold,\n// shift the window to the right until it is below the threshold\nfunction adjustWindow(directionChanges: DirectionChangeSeries) {\n const { changes, thresholdMs } = directionChanges;\n\n // find the first change that is within the threshold\n let leftPtr = 0;\n const lastChange = changes[changes.length - 1];\n for (; leftPtr < changes.length; leftPtr++) {\n const delta = lastChange - changes[leftPtr];\n if (delta < thresholdMs) {\n break;\n }\n }\n if (leftPtr === 0) return;\n\n directionChanges.startTime = changes[leftPtr];\n directionChanges.changes.splice(0, leftPtr);\n}\n\nfunction getPendingThrashedCursor(\n directionChangesX: DirectionChangeSeries,\n directionChangesY: DirectionChangeSeries,\n): number | undefined {\n let startTime = undefined;\n if (isThrashedCursor(directionChangesX)) {\n startTime = directionChangesX.startTime;\n }\n if (isThrashedCursor(directionChangesY)) {\n const startTimeY = directionChangesY.startTime;\n if (startTimeY && (!startTime || startTimeY < startTime)) {\n startTime = startTimeY;\n }\n }\n return startTime;\n}\n\nconst DEFAULT_THRESHOLD = 10;\nconst DEFAULT_WINDOW_MS = 2_000;\n\nexport const createThrashedCursorObservable = ({\n mouseDirectionChangeObservable,\n directionChanges = DEFAULT_THRESHOLD,\n thresholdMs = DEFAULT_WINDOW_MS,\n}: {\n mouseDirectionChangeObservable: Observable<Axis>;\n directionChanges?: number;\n thresholdMs?: number;\n}): Observable<number> => {\n return new Observable<number>((observer) => {\n const xDirectionChanges: DirectionChangeSeries = { changes: [], changesThreshold: directionChanges, thresholdMs };\n const yDirectionChanges: DirectionChangeSeries = { changes: [], changesThreshold: directionChanges, thresholdMs };\n let pendingThrashedCursor: number | undefined = undefined;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n function emitPendingThrashedCursor() {\n if (pendingThrashedCursor !== undefined) {\n observer.next(pendingThrashedCursor);\n pendingThrashedCursor = undefined;\n\n // reset window\n if (timer !== null) clearTimeout(timer);\n resetDirectionChangeSeries(xDirectionChanges);\n resetDirectionChangeSeries(yDirectionChanges);\n }\n }\n\n return mouseDirectionChangeObservable.subscribe((axis) => {\n if (timer !== null) clearTimeout(timer);\n addDirectionChange(axis === Axis.X ? xDirectionChanges : yDirectionChanges);\n\n const nextPendingThrashedCursor = getPendingThrashedCursor(xDirectionChanges, yDirectionChanges);\n if (nextPendingThrashedCursor) {\n // if we're in a thrashed cursor window, debounce it for \"thresholdMs\" duration\n // this is so that we do not restart the window if more direction changes are\n // detected in this series\n pendingThrashedCursor = pendingThrashedCursor || nextPendingThrashedCursor;\n timer = setTimeout(() => {\n emitPendingThrashedCursor();\n timer = null;\n }, thresholdMs);\n } else {\n emitPendingThrashedCursor();\n }\n\n adjustWindow(xDirectionChanges);\n adjustWindow(yDirectionChanges);\n\n /* istanbul ignore next */\n return () => {\n /* istanbul ignore if */\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n };\n });\n });\n};\n\nexport const trackThrashedCursor = ({\n amplitude,\n options,\n allObservables,\n directionChanges = DEFAULT_THRESHOLD,\n thresholdMs = DEFAULT_WINDOW_MS,\n}: {\n amplitude: BrowserClient;\n options: ElementInteractionsOptions;\n allObservables: AllWindowObservables;\n directionChanges?: number;\n thresholdMs?: number;\n}) => {\n const mouseDirectionChangeObservable = createMouseDirectionChangeObservable({ allWindowObservables: allObservables });\n const thrashedCursorObservable = createThrashedCursorObservable({\n mouseDirectionChangeObservable,\n directionChanges,\n thresholdMs,\n });\n return thrashedCursorObservable.subscribe((time) => {\n if (!isUrlAllowed(options)) {\n return;\n }\n amplitude.track(AMPLITUDE_THRASHED_CURSOR_EVENT, undefined, { time });\n });\n};\n","/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n FrustrationInteractionsOptions,\n DEFAULT_DATA_ATTRIBUTE_PREFIX,\n multicast,\n Observable,\n Unsubscribable,\n DEFAULT_RAGE_CLICK_ALLOWLIST,\n DEFAULT_DEAD_CLICK_ALLOWLIST,\n DEFAULT_ERROR_CLICK_ALLOWLIST,\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 {\n BrowserErrorEvent,\n createClickObservable,\n createErrorObservable,\n createMutationObservable,\n createMouseMoveObservable,\n} from './observables';\nimport { DataExtractor } from './data-extractor';\nimport { trackErrorClicks } from './autocapture/track-error-click';\nimport { trackThrashedCursor } from './autocapture/track-thrashed-cursor';\n\nexport interface AllWindowObservables {\n [ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;\n [ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;\n [ObservablesEnum.BrowserErrorObservable]: Observable<TimestampedEvent<BrowserErrorEvent>>;\n [ObservablesEnum.NavigateObservable]?: Observable<TimestampedEvent<NavigateEvent>>;\n [ObservablesEnum.SelectionObservable]?: Observable<void>;\n [ObservablesEnum.MouseMoveObservable]: Observable<MouseEvent>;\n}\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\n/**\n * Helper function to extract the css selector allowlist\n * from the frustration interactions options for a specific\n * autocapture feature.\n */\nfunction getCssSelectorAllowlist(\n options: FrustrationInteractionsOptions,\n attribute: keyof FrustrationInteractionsOptions,\n defaultAllowlist: string[],\n enabled: boolean,\n): string[] {\n if (!enabled) {\n return [];\n }\n const config = options[attribute];\n if (\n typeof config === 'object' &&\n config !== null &&\n 'cssSelectorAllowlist' in config &&\n Array.isArray(config.cssSelectorAllowlist)\n ) {\n return config.cssSelectorAllowlist;\n }\n return defaultAllowlist;\n}\n\nconst MINIMUM_THRASHED_CURSOR_DIRECTION_CHANGES = 5;\nconst MAXIMUM_THRASHED_CURSOR_THRESHOLD = 4000;\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 let isErrorClicksEnabled = options.errorClicks !== false;\n\n // if errorClicks is not defined, disable it\n // change this once it moves out of @experimental\n if (!options.errorClicks) {\n isErrorClicksEnabled = false;\n }\n\n // Check if each feature is enabled\n const deadClicksEnabled = options.deadClicks !== false && options.deadClicks !== null;\n const rageClicksEnabled = options.rageClicks !== false && options.rageClicks !== null;\n\n let thrashedCursorEnabled = options.thrashedCursor !== false && options.thrashedCursor !== null;\n if (!options.thrashedCursor) {\n thrashedCursorEnabled = false;\n }\n\n // Get CSS selectors for enabled features\n const rageCssSelectors = getCssSelectorAllowlist(\n options,\n 'rageClicks',\n DEFAULT_RAGE_CLICK_ALLOWLIST,\n rageClicksEnabled,\n );\n\n const deadCssSelectors = getCssSelectorAllowlist(\n options,\n 'deadClicks',\n DEFAULT_DEAD_CLICK_ALLOWLIST,\n deadClicksEnabled,\n );\n\n const errorCssSelectors = getCssSelectorAllowlist(\n options,\n 'errorClicks',\n DEFAULT_ERROR_CLICK_ALLOWLIST,\n isErrorClicksEnabled,\n );\n\n const dataAttributePrefix = options.dataAttributePrefix ?? DEFAULT_DATA_ATTRIBUTE_PREFIX;\n\n const dataExtractor = new DataExtractor(options);\n\n // combine the selector lists from enabled features to determine which clicked elements should be filtered\n const combinedCssSelectors = [...new Set([...rageCssSelectors, ...deadCssSelectors, ...errorCssSelectors])];\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 browserErrorObservables = multicast(\n createErrorObservable().map((error) => {\n return dataExtractor.addTypeAndTimestamp(error, 'error');\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 const selectionObservable = multicast(\n new Observable<void>((observer) => {\n const handler = () => {\n const el: HTMLElement | null = document.activeElement as HTMLElement;\n\n // handle input and textarea\n\n // if the selectionStart and selectionEnd are the same, it means\n // nothing is selected (collapsed) and the cursor position is one point\n if (el && (el.tagName === 'TEXTAREA' || el.tagName === 'INPUT')) {\n let start: number | null | undefined;\n let end: number | null | undefined;\n try {\n start = (el as HTMLInputElement | HTMLTextAreaElement).selectionStart;\n end = (el as HTMLInputElement | HTMLTextAreaElement).selectionEnd;\n if (start === end) return; // collapsed\n } catch (error) {\n // input that doesn't support selectionStart/selectionEnd (like checkbox)\n // do nothing here\n return;\n }\n return observer.next();\n }\n\n // handle non-input elements\n\n // non-input elements have an attribute called \"isCollapsed\" which\n // if true, indicates there \"is currently not any text selected\"\n // (see https://developer.mozilla.org/en-US/docs/Web/API/Selection/isCollapsed)\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed) return;\n return observer.next();\n };\n window.document.addEventListener('selectionchange', handler);\n return () => {\n window.document.removeEventListener('selectionchange', handler);\n };\n }),\n );\n\n const mouseMoveObservable = multicast(createMouseMoveObservable());\n\n return {\n [ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,\n [ObservablesEnum.MutationObservable]: enrichedMutationObservable,\n [ObservablesEnum.NavigateObservable]: enrichedNavigateObservable,\n [ObservablesEnum.BrowserErrorObservable]: browserErrorObservables,\n [ObservablesEnum.SelectionObservable]: selectionObservable,\n [ObservablesEnum.MouseMoveObservable]: mouseMoveObservable,\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 observables for events on the window\n const allObservables = createObservables();\n\n // Create subscriptions only for enabled features\n if (rageClicksEnabled) {\n const shouldTrackRageClick = createShouldTrackEvent(options, rageCssSelectors);\n const rageClickSubscription = trackRageClicks({\n allObservables,\n amplitude,\n shouldTrackRageClick,\n });\n subscriptions.push(rageClickSubscription);\n }\n\n if (deadClicksEnabled) {\n const shouldTrackDeadClick = createShouldTrackEvent(options, deadCssSelectors);\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\n if (isErrorClicksEnabled) {\n const shouldTrackErrorClick = createShouldTrackEvent(options, errorCssSelectors);\n const errorClickSubscription = trackErrorClicks({\n amplitude,\n allObservables,\n shouldTrackErrorClick,\n });\n subscriptions.push(errorClickSubscription);\n }\n\n if (thrashedCursorEnabled) {\n let directionChanges, thresholdMs;\n if (typeof options.thrashedCursor === 'object') {\n directionChanges = options.thrashedCursor.directionChanges;\n thresholdMs = options.thrashedCursor.threshold;\n\n if (directionChanges && directionChanges < MINIMUM_THRASHED_CURSOR_DIRECTION_CHANGES) {\n config.loggerProvider.warn(\n `'thrashedCursor.directionChanges' of ${directionChanges} is below the minimum of ${MINIMUM_THRASHED_CURSOR_DIRECTION_CHANGES}, setting to ${MINIMUM_THRASHED_CURSOR_DIRECTION_CHANGES}`,\n );\n directionChanges = MINIMUM_THRASHED_CURSOR_DIRECTION_CHANGES;\n }\n if (thresholdMs && thresholdMs > MAXIMUM_THRASHED_CURSOR_THRESHOLD) {\n config.loggerProvider.warn(\n `'thrashedCursor.threshold' of ${thresholdMs} is above the maximum of ${MAXIMUM_THRASHED_CURSOR_THRESHOLD}, setting to ${MAXIMUM_THRASHED_CURSOR_THRESHOLD}`,\n );\n thresholdMs = MAXIMUM_THRASHED_CURSOR_THRESHOLD;\n }\n }\n const thrashedCursorSubscription = trackThrashedCursor({\n amplitude,\n options,\n allObservables,\n directionChanges,\n thresholdMs,\n });\n subscriptions.push(thrashedCursorSubscription);\n }\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","globalScope","originalConsole","console","handlers","originalFn","inConsoleOverride","consoleObserver","addListener","level","callback","logLevel","res","args","_i","callbacks","forEach","_a","Error","removeListener","_b","values","_c","splice","_restoreConsole","entries","_d","key","originalHandler","DEFAULT_CSS_SELECTOR_ALLOWLIST","DEFAULT_DATA_ATTRIBUTE_PREFIX","DEFAULT_ACTION_CLICK_ALLOWLIST","DEFAULT_ERROR_AND_DEAD_CLICK_ALLOWLIST","DEFAULT_DEAD_CLICK_ALLOWLIST","DEFAULT_ERROR_CLICK_ALLOWLIST","DEFAULT_RAGE_CLICK_ALLOWLIST","TEXT_MASK_ATTRIBUTE","MASKED_TEXT_VALUE","CC_REGEX","SSN_REGEX","EMAIL_REGEX","defineProperty","Observable_1","Observable","hasSymbol","name","Boolean","getSymbol","SymbolIterator","SymbolObservable","SymbolSpecies","getMethod","obj","getSpecies","ctor","constructor","undefined","hostReportError","log","setTimeout","enqueue","fn","cleanupSubscription","subscription","cleanup","_cleanup","unsubscribe","closeSubscription","_observer","_queue","_state","notifySubscription","type","observer","onNotify","queue","flushSubscription","Subscription","subscriber","subscriptionObserver","closed","complete","_subscriber","subscribe","map","filter","reduce","C","hasSeed","hasValue","acc","first","all","sources","index","startNext","flatMap","subscriptions","outer","inner","indexOf","completeIfDone","x","method","observable","isObservable","item","isArray","of","items","symbol","configurable","require$$0","asyncMap","ZenObservable","catch","merge","sourceA","sourceB","Set","subscriptions_1","subscriptions_1_1","sub","clear","subscribeTo","source","err","delete","size","add","multicast","observers","observers_1","observers_1_1","obs","observers_2","observers_2_1","observers_3","observers_3_1","AMPLITUDE_ORIGIN","AMPLITUDE_ORIGINS_MAP","US","EU","STAGING","MESSENGER_BRAND","MESSENGER_GLOBAL_KEY","BaseWindowMessenger","origin","isSetup","messageHandler","requestCallbacks","actionHandlers","Map","pendingMessages","scriptLoadPromises","endpoint","notify","message","logger","debug","JSON","stringify","_e","opener","postMessage","sendRequest","action","options","_this","timeout","id","Date","now","Math","random","toString","substr","request","handleResponse","response","responseData","warn","registerActionHandler","handler","has","set","queued","get","queued_1","queued_1_1","loadScriptOnce","existing","loadPromise","document","querySelector","CSS","escape","status","scriptElement","createElement","async","src","addEventListener","once","head","appendChild","asyncLoadScript","error_1","setup","event","eventData","data","_f","destroy","removeEventListener","getOrCreateWindowMessenger","messenger","BG_CAPTURE_BRAND","MouseButton","VERSION","AMPLITUDE_ELEMENT_CLICKED_EVENT","AMPLITUDE_EVENT_PROP_ELEMENT_TAG","AMPLITUDE_EVENT_PROP_ELEMENT_TEXT","AMPLITUDE_EVENT_PROP_PAGE_URL","DATA_AMP_MASK_ATTRIBUTES","SENSITIVE_TAGS","isElementPointerCursor","element","actionType","computedStyle","getComputedStyle","getPropertyValue","isUrlAllowed","autocaptureOptions","pageUrlAllowlist","pageUrlExcludelist","location","href","createShouldTrackEvent","isAlwaysCaptureCursorPointer","shouldTrackEventResolver","tag","tagName","toLowerCase","elementType","String","getAttribute","isCursorPointer","hasMatchAnyAllowedSelector","selector","matches","parseAttributesToMask","attributeString","split","attr","trim","removeEmptyProperties","properties","keys","filteredProperties","isEmpty","getClosestElement","selectors","parentElement","filterOutNonTrackableEvents","target","closestTrackedAncestor","VISUAL_TAGGING_BRAND","enableVisualTagging","branded","dataExtractor","isElementSelectable","cssSelectorAllowlist","actionClickAllowlist","amplitudeVisualTaggingSelectorInstance","onSelect","onTrack","actionData","amplitudeVisualTaggingSelector","getEventTagProps","visualHighlightClass","extractDataFromDataSource","diagnostics","autocapture","version","close","createMutationObservable","mutationObserver","MutationObserver","mutations","observe","childList","attributes","characterData","subtree","disconnect","createClickObservable","clickType","capture","createErrorObservable","unhandledErrorObservable","ErrorEvent","output","kind","DOMException","stack","filename","lineNumber","lineno","columnNumber","colno","reason","executeActions","actions","ev","dataSource","targetElementProperties","destinationKey","eventTypeToBrowserEventMap","groupLabeledEventIdsByEventType","labeledEvents","groupedLabeledEvents","browserEvent","labeledEvents_1","labeledEvents_1_1","le","e_2","definition","def","event_type","createLabeledEventToTriggerMap","triggers","labeledEventToTriggerMap","triggers_1","triggers_1_1","trigger","e_4","conditions","condition","eventId","existingTriggers","matchEventToLabeledEvents","filters","every","subprop_key","subprop_op","subprop_value","includes","closest","matchEventToFilter","TriggerEvaluator","evaluate","pageActions","matchingTriggers","leToTriggerMap","labeledEvents_2","labeledEvents_2_1","triggers_2","triggers_2_1","matchLabeledEventsToTriggers","matchingTriggers_1","matchingTriggers_1_1","update","BLOCKED_ATTRIBUTES","SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST","SVG_TAGS","HIGHLY_SENSITIVE_INPUT_TYPES","getElementProperties","userMaskedAttributeNames","siblings","children","indexOfType","el","prevSiblingTag","previousElementSibling","prevSib","classes","classList","filteredAttributes","isSensitiveElement","isContentEditable","HTMLElement","isNonSensitiveElement","filteredAttributes_1","filteredAttributes_1_1","substring","attrs","ObservablesEnum","DataExtractor","context","replaceSensitiveString","text","additionalMaskTextPatterns","replace","additionalMaskTextPatterns_1","additionalMaskTextPatterns_1_1","pattern","getHierarchy","hierarchy","startTime","performance","ancestors","targetEl","current","getAncestors","elementToAttributesToMaskMap","node","attributesToMask","constants.DATA_AMP_MASK_ATTRIBUTES","ancestorAttributesToMask","combinedAttributesToMask","hierarchyNode","hierarchy_1","hierarchy_1_1","endTime","diagnosticsClient","recordHistogram","getNearestLabel","labelElement","parent","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","round","constants.AMPLITUDE_EVENT_PROP_PAGE_URL","locationStr","loggerProvider","decodedLocationStr","decodeURI","getDecodeURI","parseTitleFunction","title","titleElement","hasAttribute","getPageTitle","innerHeight","innerWidth","HTMLAnchorElement","addTypeAndTimestamp","timestamp","addAdditionalEventProperties","selectorAllowlist","isCapturingCursorPointer","baseEvent","isElementBasedEvent","contextElement","sourceType","sourceElement","scopingElement","documentElement","scope","getDataSource","elementExtractType","attribute","getTextWithMaskedDescendants","maskedSelector","innerText","childNodes","childNodes_1","childNodes_1_1","childNode","nodeType","Node","TEXT_NODE","Element","textContent","rawPatterns","maskTextRegex","compiled","rawPatterns_1","rawPatterns_1_1","entry","RegExp","autocapturePlugin","setTag","_j","_k","visualTaggingOptions","enabled","debounceTime","excludePattern","regexError","_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","bind","changeSubscription","trackChange","actionClickSubscription","filteredClickObservable","closestActionClickEl","clickEvent","mutationOrNavigate","clickMutationNavigateObservable","actionClickTimer","lastClickEvent","clearTimeout","event_1","actionClick","trackActionClick","scriptUrl","backgroundCaptureInstance","onBackgroundCapture","backgroundCaptureData","resolvedUrl","URL","amplitudeBackgroundCapture","enableBackgroundCapture","serverZone","constants.AMPLITUDE_ORIGINS_MAP","execute","teardown","CHANGE_EVENTS","addCoordinates","regionBox","pageX","pageY","yMin","min","yMax","max","xMin","xMax","isOutOfBounds","getRageClickAnalyticsEvent","clickWindow","firstClick","lastClick","rageClickEvent","toISOString","X","Y","Time","time","trackRageClicks","shouldTrackRageClick","selectionObservable","clickBoundingBox","pendingRageClick","resetClickWindow","rageClickObservable","resolutionValue","isNewElement","isClickOutsideRageClickWindow","timerId","selectionSubscription","rageClickSubscription","Direction","Axis","isThrashedCursor","directionChanges","changes","changesThreshold","thresholdMs","resetDirectionChangeSeries","directionChangeSeries","adjustWindow","leftPtr","lastChange","createThrashedCursorObservable","mouseDirectionChangeObservable","xDirectionChanges","yDirectionChanges","pendingThrashedCursor","timer","emitPendingThrashedCursor","axis","shift","addDirectionChange","nextPendingThrashedCursor","directionChangesX","directionChangesY","startTimeY","getPendingThrashedCursor","trackThrashedCursor","mouseMoveObservable","allWindowObservables","lastPosition","xDirection","yDirection","currentPosition","clientX","clientY","DECREASING","INCREASING","createMouseDirectionChangeObservable","getCssSelectorAllowlist","defaultAllowlist","MAXIMUM_THRASHED_CURSOR_THRESHOLD","isErrorClicksEnabled","errorClicks","deadClicksEnabled","deadClicks","rageClicksEnabled","rageClicks","thrashedCursorEnabled","thrashedCursor","rageCssSelectors","deadCssSelectors","errorCssSelectors","combinedCssSelectors","enrichedNavigateObservable","browserErrorObservables","enrichedMutationObservable","navigate","activeElement","selectionStart","selectionEnd","selection","getSelection","isCollapsed","BrowserErrorObservable","SelectionObservable","MouseMoveObservable","shouldTrackDeadClick","deadClickSubscription","button","LEFT_OR_TOUCH_CONTACT","changeObservables","clicksAndChangeObservable","deadClickTimer","deadClickEvent","trackDeadClick","shouldTrackErrorClick","errorClickSubscription","browserErrorObservable","errorClickTimer","latestClickEvent","clearClickTimer","trackErrorClicks","threshold","thrashedCursorSubscription"],"mappings":"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"}
|