@amplitude/plugin-autocapture-browser 1.27.4 → 1.28.0-featelement-selector-v1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/lib/cjs/autocapture-plugin.d.ts.map +1 -1
  2. package/lib/cjs/autocapture-plugin.js +66 -2
  3. package/lib/cjs/autocapture-plugin.js.map +1 -1
  4. package/lib/cjs/data-extractor.d.ts +21 -0
  5. package/lib/cjs/data-extractor.d.ts.map +1 -1
  6. package/lib/cjs/data-extractor.js +26 -4
  7. package/lib/cjs/data-extractor.js.map +1 -1
  8. package/lib/cjs/libs/element-path.d.ts +23 -1
  9. package/lib/cjs/libs/element-path.d.ts.map +1 -1
  10. package/lib/cjs/libs/element-path.js +28 -173
  11. package/lib/cjs/libs/element-path.js.map +1 -1
  12. package/lib/cjs/version.d.ts +1 -1
  13. package/lib/cjs/version.d.ts.map +1 -1
  14. package/lib/cjs/version.js +1 -1
  15. package/lib/cjs/version.js.map +1 -1
  16. package/lib/esm/autocapture-plugin.d.ts.map +1 -1
  17. package/lib/esm/autocapture-plugin.js +66 -2
  18. package/lib/esm/autocapture-plugin.js.map +1 -1
  19. package/lib/esm/data-extractor.d.ts +21 -0
  20. package/lib/esm/data-extractor.d.ts.map +1 -1
  21. package/lib/esm/data-extractor.js +26 -4
  22. package/lib/esm/data-extractor.js.map +1 -1
  23. package/lib/esm/libs/element-path.d.ts +23 -1
  24. package/lib/esm/libs/element-path.d.ts.map +1 -1
  25. package/lib/esm/libs/element-path.js +27 -172
  26. package/lib/esm/libs/element-path.js.map +1 -1
  27. package/lib/esm/version.d.ts +1 -1
  28. package/lib/esm/version.d.ts.map +1 -1
  29. package/lib/esm/version.js +1 -1
  30. package/lib/esm/version.js.map +1 -1
  31. package/lib/scripts/amplitude-min.js +1 -1
  32. package/lib/scripts/amplitude-min.js.gz +0 -0
  33. package/lib/scripts/amplitude-min.js.map +1 -1
  34. package/lib/scripts/amplitude-min.umd.js +1 -1
  35. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  36. package/lib/scripts/autocapture-plugin.d.ts.map +1 -1
  37. package/lib/scripts/data-extractor.d.ts +21 -0
  38. package/lib/scripts/data-extractor.d.ts.map +1 -1
  39. package/lib/scripts/libs/element-path.d.ts +23 -1
  40. package/lib/scripts/libs/element-path.d.ts.map +1 -1
  41. package/lib/scripts/version.d.ts +1 -1
  42. package/lib/scripts/version.d.ts.map +1 -1
  43. package/package.json +3 -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@4.9.5/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/libs/element-path.ts","../../../src/autocapture-plugin.ts","../../../src/data-extractor.ts","../../../src/autocapture/track-click.ts","../../../src/autocapture/track-change.ts","../../../src/autocapture/track-action-click.ts","../../../src/autocapture/track-scroll.ts","../../../src/autocapture/track-viewport-content-updated.ts","../../../src/autocapture/track-exposure.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","../../../src/autocapture/track-long-task.ts","../../../src/performance-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 const DEFAULT_EXPOSURE_DURATION = 150;\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\n * on elements not already allowed by the cssSelectorAllowlist.\n * Only applies to click-based interaction tracking; has no effect on\n * viewport/exposure-based features (e.g., zoning).\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 /**\n * Duration in milliseconds an element must be visible before it is considered exposed.\n * Default is 150ms.\n * @deprecated Use `viewportContentUpdated.exposureDuration` instead.\n */\n exposureDuration?: number;\n\n /**\n * Options for viewport content updated tracking (zoning).\n */\n viewportContentUpdated?: {\n /**\n * Whether viewport content updated tracking is enabled.\n * Default is true.\n */\n enabled?: boolean;\n /**\n * Duration in milliseconds an element must be visible before it is considered exposed.\n * Default is 150ms.\n */\n exposureDuration?: number;\n };\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 20\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 */\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 */\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 = 'https://cdn.amplitude.com/libs/background-capture-1.0.1.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.27.4';\n","/* eslint-disable no-restricted-globals */\nimport { ElementInteractionsOptions, ActionType, isUrlMatchAllowlist, getGlobalScope } from '@amplitude/analytics-core';\nimport * as constants from './constants';\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): 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 /* 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 return actionType === 'click';\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 getCurrentPageViewId = (): string | undefined => {\n try {\n const globalScope = getGlobalScope();\n /* istanbul ignore next */\n const raw = globalScope?.sessionStorage?.getItem(constants.PAGE_VIEW_SESSION_STORAGE_KEY);\n if (!raw) {\n return undefined;\n }\n const parsed = JSON.parse(raw) as { pageViewId?: unknown };\n if (typeof parsed.pageViewId === 'string') {\n return parsed.pageViewId;\n }\n } catch {\n // ignore storage access or JSON errors\n }\n return undefined;\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';\nexport const PERFORMANCE_PLUGIN_NAME = '@amplitude/plugin-performance-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_PAGE_SCROLLED_EVENT = '[Amplitude] Page Scrolled';\nexport const AMPLITUDE_THRASHED_CURSOR_EVENT = '[Amplitude] Thrashed Cursor';\nexport const AMPLITUDE_MAIN_THREAD_BLOCK_EVENT = '[Amplitude] Main Thread Block';\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';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_PATH = '[Amplitude] Element Path';\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';\nexport const AMPLITUDE_EVENT_PROP_MAX_PAGE_X = '[Amplitude] Max Page X';\nexport const AMPLITUDE_EVENT_PROP_MAX_PAGE_Y = '[Amplitude] Max Page Y';\n\nexport const AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID = '[Amplitude] Page View ID';\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;\n\nexport const MAX_ATTRIBUTE_LENGTH = 128;\n\n// The key for the page view object in sessionStorage\nexport const PAGE_VIEW_SESSION_STORAGE_KEY = 'AMP_PAGE_VIEW';\n\nexport const MAX_ELEMENT_EXPOSED_STR_LENGTH = 18_000;\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 { TimestampedEvent } from './helpers';\nimport { 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\n getGlobalScope()?.document.addEventListener(clickType, handler, { capture: true });\n return () => {\n getGlobalScope()?.document.removeEventListener(clickType, handler, { capture: true });\n };\n });\n};\n\nexport const createScrollObservable = (): Observable<Event> => {\n return new Observable<Event>((observer) => {\n const handler = (event: Event) => {\n observer.next(event);\n };\n\n getGlobalScope()?.addEventListener('scroll', handler);\n return () => {\n getGlobalScope()?.removeEventListener('scroll', handler);\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\n// Tracks when a trackedelement is exposed to the viewport\nexport const createExposureObservable = (\n mutationObservable: Observable<TimestampedEvent<MutationRecord[]>>,\n selectorAllowlist: string[],\n): Observable<Event> => {\n return new Observable<Event>((observer) => {\n const globalScope = getGlobalScope();\n\n if (!globalScope?.IntersectionObserver) {\n return () => {\n return;\n };\n }\n\n const intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n observer.next(entry as unknown as Event);\n });\n },\n {\n root: null, // viewport\n rootMargin: '0px', // start exactly at the viewport edge\n threshold: 1.0, // trigger when 100% of the element is visible\n },\n );\n\n // Observe initial elements\n const selectorString = selectorAllowlist.join(',');\n /* istanbul ignore next */\n const initialElements = globalScope?.document.querySelectorAll(selectorString) ?? [];\n initialElements.forEach((element) => {\n intersectionObserver.observe(element);\n });\n\n // Use mutation observable to observe new elements that match the allowlist\n const mutationSubscription = mutationObservable.subscribe(({ event }) =>\n event.forEach(({ addedNodes }) =>\n addedNodes.forEach((node) => {\n if (!(node instanceof Element)) {\n return;\n }\n if (node.matches(selectorString)) {\n intersectionObserver.observe(node);\n }\n node.querySelectorAll(selectorString).forEach((child) => {\n intersectionObserver.observe(child);\n });\n }),\n ),\n );\n\n return () => {\n mutationSubscription.unsubscribe();\n intersectionObserver.disconnect();\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","/* istanbul ignore file */\n\n// Code is adapted from The Chromium Authors.\n// Source: https://github.com/ChromeDevTools/devtools-frontend/blob/main/front_end/panels/elements/DOMPath.ts#L14\n// License: BSD-style license\n//\n// Copyright 2014 The Chromium Authors\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nclass Step {\n constructor(public value: string, public optimized: boolean) {}\n toString() {\n return this.value;\n }\n}\n\nexport const cssPath = function (node: Element, optimized?: boolean): string {\n // `node` is already an Element; this check is defensive.\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return '';\n }\n\n const steps: Step[] = [];\n let contextNode: Element | null = node;\n\n while (contextNode) {\n const step = cssPathStep(contextNode, Boolean(optimized), contextNode === node);\n if (!step) {\n break;\n } // bail out early\n steps.push(step);\n if (step.optimized) {\n break;\n }\n contextNode = contextNode.parentElement;\n }\n\n steps.reverse();\n return steps.join(' > ');\n};\n\nconst cssPathStep = function (node: Element, optimized: boolean, isTargetNode: boolean): Step | null {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n\n const id = node.getAttribute('id');\n if (optimized) {\n if (id) {\n return new Step(idSelector(id), true);\n }\n\n const nodeNameLower = node.tagName.toLowerCase();\n if (nodeNameLower === 'body' || nodeNameLower === 'head' || nodeNameLower === 'html') {\n return new Step(nodeNameLower, true);\n }\n }\n\n const nodeName = node.tagName.toLowerCase();\n\n if (id) {\n return new Step(nodeName + idSelector(id), true);\n }\n\n const parent = node.parentNode;\n if (!parent || parent.nodeType === Node.DOCUMENT_NODE) {\n return new Step(nodeName, true);\n }\n\n function prefixedElementClassNames(el: Element): string[] {\n const classAttribute = el.getAttribute('class');\n if (!classAttribute) {\n return [];\n }\n return classAttribute\n .split(/\\s+/g)\n .filter(Boolean)\n .map(function (name) {\n // The prefix is required to store \"__proto__\" in a object-based map.\n return '$' + name;\n });\n }\n\n function idSelector(id: string): string {\n return '#' + CSS.escape(id);\n }\n\n const prefixedOwnClassNamesArray = prefixedElementClassNames(node);\n let needsClassNames = false;\n let needsNthChild = false;\n let ownIndex = -1;\n let elementIndex = -1;\n\n const siblings: HTMLCollectionOf<Element> = parent.children;\n\n for (let i = 0; siblings && (ownIndex === -1 || !needsNthChild) && i < siblings.length; ++i) {\n const sibling = siblings[i];\n if (sibling.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n\n elementIndex += 1;\n if (sibling === node) {\n ownIndex = elementIndex;\n continue;\n }\n if (needsNthChild) {\n continue;\n }\n\n if (sibling.tagName.toLowerCase() !== nodeName) {\n continue;\n }\n\n needsClassNames = true;\n const ownClassNames = new Set<string>(prefixedOwnClassNamesArray);\n if (!ownClassNames.size) {\n needsNthChild = true;\n continue;\n }\n\n const siblingClassNamesArray = prefixedElementClassNames(sibling);\n for (let j = 0; j < siblingClassNamesArray.length; ++j) {\n const siblingClass = siblingClassNamesArray[j];\n if (!ownClassNames.has(siblingClass)) {\n continue;\n }\n ownClassNames.delete(siblingClass);\n if (!ownClassNames.size) {\n needsNthChild = true;\n break;\n }\n }\n }\n\n let result = nodeName;\n if (\n isTargetNode &&\n nodeName.toLowerCase() === 'input' &&\n node.getAttribute('type') &&\n !node.getAttribute('id') &&\n !node.getAttribute('class')\n ) {\n result += '[type=' + CSS.escape(node.getAttribute('type') || '') + ']';\n }\n if (needsNthChild) {\n result += ':nth-child(' + String(ownIndex + 1) + ')';\n } else if (needsClassNames) {\n for (const prefixedName of prefixedOwnClassNamesArray) {\n result += '.' + CSS.escape(prefixedName.slice(1));\n }\n }\n\n return new Step(result, false);\n};\n","/* eslint-disable no-restricted-globals */\nimport {\n type BrowserClient,\n type BrowserConfig,\n type EnrichmentPlugin,\n type ElementInteractionsOptions,\n DEFAULT_EXPOSURE_DURATION,\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 { trackScroll } from './autocapture/track-scroll';\n\nimport {\n createClickObservable,\n createScrollObservable,\n createExposureObservable,\n createMutationObservable,\n} 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';\nimport { trackExposure } from './autocapture/track-exposure';\nimport { fireViewportContentUpdated, onExposure, ExposureTracker } from './autocapture/track-viewport-content-updated';\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 NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n ScrollObservable = 'scrollObservable',\n ExposureObservable = 'exposureObservable',\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.ScrollObservable]: Observable<Event>; // TODO: add type for scroll event\n [ObservablesEnum.ExposureObservable]: Observable<Event>;\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 const isViewportContentUpdatedEnabled = options.viewportContentUpdated?.enabled !== false;\n const resolvedExposureDuration =\n options.viewportContentUpdated?.exposureDuration ?? options.exposureDuration ?? DEFAULT_EXPOSURE_DURATION;\n options.viewportContentUpdated = {\n ...options.viewportContentUpdated,\n exposureDuration: resolvedExposureDuration,\n };\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 const dataExtractor = new DataExtractor(options, context);\n\n // Page-level state shared across trackers, emitted in a single Page View End event on beforeunload\n // elementExposedForPage holds the total set of elements seen during the entire page view lifetime\n const elementExposedForPage = new Set<string>();\n // currentElementExposed only holds the set of elements that will be flushed during the next [Amplitude] Viewport Content Updated event\n const currentElementExposed = new Set<string>();\n\n let beforeUnloadCleanup: () => void;\n\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 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 const scrollObservable = createScrollObservable();\n\n const exposureObservable = createExposureObservable(\n mutationObservable,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\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 [ObservablesEnum.ScrollObservable]: scrollObservable,\n [ObservablesEnum.ExposureObservable]: exposureObservable,\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 let pageViewEndFired = false;\n const lastScroll: { maxX: undefined | number; maxY: undefined | number } = { maxX: undefined, maxY: undefined };\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 const scrollTracker = trackScroll({\n allObservables,\n amplitude,\n });\n subscriptions.push(scrollTracker);\n\n const trackers: { exposure?: ExposureTracker & Unsubscribable } = {};\n\n const globalScope = getGlobalScope();\n\n const handleViewportContentUpdated = (isPageEnd: boolean) => {\n if (isPageEnd && pageViewEndFired) {\n return;\n }\n setTimeout(() => {\n pageViewEndFired = false;\n }, 100);\n\n pageViewEndFired = true;\n fireViewportContentUpdated({\n amplitude,\n scrollTracker,\n currentElementExposed,\n elementExposedForPage,\n exposureTracker: trackers.exposure,\n isPageEnd,\n lastScroll,\n });\n };\n\n const handleExposure = (elementPath: string) => {\n onExposure(elementPath, elementExposedForPage, currentElementExposed, handleViewportContentUpdated);\n };\n\n if (isViewportContentUpdatedEnabled) {\n trackers.exposure = trackExposure({\n allObservables,\n onExposure: handleExposure,\n dataExtractor,\n exposureDuration: resolvedExposureDuration,\n });\n if (trackers.exposure) {\n subscriptions.push(trackers.exposure);\n }\n\n const beforeUnloadHandler = () => {\n handleViewportContentUpdated(true);\n };\n /* istanbul ignore next */\n globalScope?.addEventListener('beforeunload', beforeUnloadHandler);\n beforeUnloadCleanup = () => {\n /* istanbul ignore next */\n globalScope?.removeEventListener('beforeunload', beforeUnloadHandler);\n };\n // Ensure cleanup on teardown as well\n subscriptions.push({ unsubscribe: () => beforeUnloadCleanup() });\n\n // Also track on navigation (SPA)\n const navigateObservable = allObservables[ObservablesEnum.NavigateObservable];\n if (navigateObservable) {\n subscriptions.push(\n navigateObservable.subscribe(() => {\n handleViewportContentUpdated(true);\n }),\n );\n } else if (globalScope) {\n const popstateHandler = () => {\n handleViewportContentUpdated(true);\n };\n /* istanbul ignore next */\n // Fallback for SPA tracking when Navigation API is not available\n globalScope.addEventListener('popstate', popstateHandler);\n\n /* istanbul ignore next */\n // There is no global browser listener for changes to history, so we have\n // to modify pushState directly.\n // https://stackoverflow.com/a/64927639\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalPushState = globalScope.history.pushState;\n if (globalScope.history && originalPushState) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n globalScope.history.pushState = new Proxy(originalPushState, {\n apply: (target, thisArg, [state, unused, url]) => {\n target.apply(thisArg, [state, unused, url]);\n handleViewportContentUpdated(true);\n },\n });\n }\n\n subscriptions.push({\n unsubscribe: () => {\n /* istanbul ignore next */\n globalScope.removeEventListener('popstate', popstateHandler);\n /* istanbul ignore next */\n if (globalScope.history && originalPushState) {\n globalScope.history.pushState = originalPushState;\n }\n },\n });\n }\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","/* 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 getCurrentPageViewId,\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';\nimport { cssPath } from './libs/element-path';\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 getElementPath = (element: Element | null): string => {\n if (!element) {\n return '';\n }\n const startTime = performance.now();\n\n const elementPath = cssPath(element);\n\n const endTime = performance.now();\n this.diagnosticsClient?.recordHistogram('autocapturePlugin.getElementPath', endTime - startTime);\n\n return elementPath;\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_PATH]: this.getElementPath(element),\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 const pageViewId = getCurrentPageViewId();\n /* istanbul ignore next */\n if (pageViewId) {\n /* istanbul ignore next */\n properties[constants.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID] = pageViewId;\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","import { AllWindowObservables } from '../autocapture-plugin';\nimport { ElementBasedEvent, type 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: ElementBasedTimestampedEvent<MouseEvent>) => {\n // Only track clicks on elements that should be tracked,\n return shouldTrackEvent('click', click.closestTrackedAncestor);\n })\n .map((click: ElementBasedTimestampedEvent<MouseEvent>) => 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 '../autocapture-plugin';\nimport { BrowserClient, getGlobalScope } from '@amplitude/analytics-core';\n\nexport interface ScrollState {\n maxX: number;\n maxY: number;\n}\n\nexport function trackScroll({\n amplitude,\n allObservables,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n}) {\n // amplitude is reserved for future periodic scroll event tracking\n void amplitude;\n\n const { scrollObservable } = allObservables;\n const state: ScrollState = { maxX: 0, maxY: 0 };\n\n const scrollSubscription = scrollObservable.subscribe(() => {\n const globalScope = getGlobalScope();\n /* istanbul ignore next */\n const currentX = Math.floor(globalScope?.scrollX ?? globalScope?.pageXOffset ?? 0);\n /* istanbul ignore next */\n const currentY = Math.floor(globalScope?.scrollY ?? globalScope?.pageYOffset ?? 0);\n\n // Update page-level max positions for Page View End event (never resets during page lifetime)\n state.maxX = Math.max(state.maxX, currentX);\n state.maxY = Math.max(state.maxY, currentY);\n });\n\n return {\n unsubscribe: () => {\n scrollSubscription.unsubscribe();\n },\n getState: () => state,\n reset: () => {\n state.maxX = 0;\n state.maxY = 0;\n },\n };\n}\n","import { BrowserClient, getDecodeURI, getGlobalScope } from '@amplitude/analytics-core';\nimport * as constants from '../constants';\nimport { getCurrentPageViewId } from '../helpers';\n\nexport interface ScrollTracker {\n getState: () => { maxX: number; maxY: number };\n reset: () => void;\n}\n\nexport interface ExposureTracker {\n reset: () => void;\n}\n\nexport function fireViewportContentUpdated({\n amplitude,\n scrollTracker,\n currentElementExposed,\n elementExposedForPage,\n exposureTracker,\n isPageEnd,\n lastScroll,\n}: {\n amplitude: BrowserClient;\n scrollTracker: ScrollTracker;\n currentElementExposed: Set<string>;\n elementExposedForPage: Set<string>;\n exposureTracker: ExposureTracker | undefined;\n isPageEnd: boolean;\n lastScroll: { maxX: undefined | number; maxY: undefined | number };\n}): void {\n const pageScrollMaxState = scrollTracker.getState();\n const globalScope = getGlobalScope();\n\n /* istanbul ignore next */\n const viewportWidth = globalScope?.innerWidth ?? 0;\n /* istanbul ignore next */\n const viewportHeight = globalScope?.innerHeight ?? 0;\n\n const eventProperties: Record<string, unknown> = {\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: getDecodeURI(\n /* istanbul ignore next */\n globalScope?.location?.href?.split('?')[0] ?? '',\n ),\n [constants.AMPLITUDE_EVENT_PROP_MAX_PAGE_X]: pageScrollMaxState.maxX + viewportWidth,\n [constants.AMPLITUDE_EVENT_PROP_MAX_PAGE_Y]: pageScrollMaxState.maxY + viewportHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: viewportHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: viewportWidth,\n '[Amplitude] Element Exposed': Array.from(currentElementExposed),\n };\n\n const pageViewId = getCurrentPageViewId();\n if (pageViewId) {\n eventProperties[constants.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID] = pageViewId;\n }\n\n // If elements exposed is empty and max scroll is same as last event, don't track\n if (\n currentElementExposed.size === 0 &&\n pageScrollMaxState.maxX === lastScroll.maxX &&\n pageScrollMaxState.maxY === lastScroll.maxY\n ) {\n if (isPageEnd) {\n scrollTracker.reset();\n elementExposedForPage.clear();\n exposureTracker?.reset();\n }\n return;\n }\n\n /* istanbul ignore next */\n amplitude?.track('[Amplitude] Viewport Content Updated', eventProperties);\n lastScroll.maxX = pageScrollMaxState.maxX;\n lastScroll.maxY = pageScrollMaxState.maxY;\n\n // Clear current batch\n currentElementExposed.clear();\n\n if (isPageEnd) {\n // Reset state for next page view\n scrollTracker.reset();\n elementExposedForPage.clear();\n exposureTracker?.reset();\n }\n}\n\nexport function onExposure(\n elementPath: string,\n elementExposedForPage: Set<string>,\n currentElementExposed: Set<string>,\n fireViewportContentUpdatedCallback: (isPageEnd: boolean) => void,\n) {\n if (elementExposedForPage.has(elementPath)) {\n return;\n }\n elementExposedForPage.add(elementPath);\n currentElementExposed.add(elementPath);\n\n // Check if current set size exceeds 18k chars\n const exposedArray = Array.from(currentElementExposed);\n const exposedString = JSON.stringify(exposedArray);\n\n if (exposedString.length >= constants.MAX_ELEMENT_EXPOSED_STR_LENGTH) {\n fireViewportContentUpdatedCallback(false);\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport { DEFAULT_EXPOSURE_DURATION } from '@amplitude/analytics-core';\nimport { AllWindowObservables } from '../autocapture-plugin';\nimport { DataExtractor } from '../data-extractor';\n\nexport function trackExposure({\n allObservables,\n onExposure,\n dataExtractor,\n exposureDuration = DEFAULT_EXPOSURE_DURATION,\n}: {\n allObservables: AllWindowObservables;\n onExposure: (elementPath: string) => void;\n dataExtractor: DataExtractor;\n exposureDuration?: number;\n}) {\n // Track which elements have been marked as exposed (per-element state)\n const exposureMap = new Map<Element, boolean>();\n\n // Track active timers for elements that are currently visible but not yet exposed\n const exposureTimerMap = new Map<Element, ReturnType<typeof setTimeout> | null | undefined>();\n\n const { exposureObservable } = allObservables;\n\n const exposureSubscription = exposureObservable.subscribe((event) => {\n const entry = event as unknown as IntersectionObserverEntry;\n const element = entry.target;\n\n if (entry.isIntersecting) {\n // Element became visible - start exposure timer if not already exposed\n if (!exposureMap.get(element)) {\n const timer = setTimeout(() => {\n // Element has been visible for exposureDuration - mark as exposed\n exposureMap.set(element, true);\n\n // Record the CSS selector path in the shared exposure state\n const elementPath = dataExtractor.getElementPath(element);\n onExposure(elementPath);\n\n // Clear the timer reference\n exposureTimerMap.set(element, null);\n }, exposureDuration);\n\n exposureTimerMap.set(element, timer);\n }\n } else if (!entry.isIntersecting && entry.intersectionRatio < 1.0) {\n // Element left viewport - cancel exposure timer if one exists\n const timer = exposureTimerMap.get(element);\n if (timer) {\n clearTimeout(timer);\n exposureTimerMap.set(element, null);\n }\n }\n });\n\n return {\n unsubscribe: () => {\n exposureSubscription.unsubscribe();\n },\n reset: () => {\n exposureTimerMap.forEach((timer) => {\n if (timer) {\n clearTimeout(timer);\n }\n });\n exposureTimerMap.clear();\n exposureMap.clear();\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 = 20;\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","import { BrowserClient, ElementInteractionsOptions, PerformanceTrackingOptions } from '@amplitude/analytics-core';\nimport { AMPLITUDE_MAIN_THREAD_BLOCK_EVENT } from '../constants';\nimport { isUrlAllowed } from '../helpers';\n\nconst DEFAULT_DURATION_THRESHOLD = 100; // ms\nconst MEASURE_BUFFER_WINDOW_MS = 10_000;\n\n// LoAF and Long Task types are not yet in TypeScript's built-in DOM types\ninterface PerformanceScriptTiming extends PerformanceEntry {\n sourceURL: string;\n sourceFunctionName: string;\n // Character offset into the source URL's script where the function was defined.\n // Used downstream for sourcemap resolution. Optional because coverage varies\n // across browsers and entry origins (inline handlers, new Function, etc.).\n sourceCharPosition?: number;\n invokerType: string;\n invoker: string;\n}\n\ninterface PerformanceLongAnimationFrameTiming extends PerformanceEntry {\n renderStart: number;\n styleAndLayoutStart: number;\n blockingDuration: number;\n scripts: PerformanceScriptTiming[];\n}\n\ninterface TaskAttributionTiming extends PerformanceEntry {\n name: string;\n}\n\ninterface PerformanceLongTaskTiming extends PerformanceEntry {\n attribution: TaskAttributionTiming[];\n}\n\nfunction getOverlappingMeasures(entry: PerformanceEntry, measures: PerformanceEntry[]): string[] {\n const taskEnd = entry.startTime + entry.duration;\n return measures\n .filter((measure) => measure.startTime < taskEnd && measure.startTime + measure.duration > entry.startTime)\n .map((measure) => measure.name);\n}\n\nfunction buildLoAFProperties(entry: PerformanceLongAnimationFrameTiming, measures: PerformanceEntry[]) {\n const overlappingMeasures = getOverlappingMeasures(entry, measures);\n const scripts = entry.scripts ?? [];\n\n const scriptURLs = scripts.map((s) => s.sourceURL).filter(Boolean);\n const scriptFunctions = scripts.map((s) => s.sourceFunctionName).filter(Boolean);\n const scriptPositions = scripts\n .map((s) => s.sourceCharPosition)\n .filter((p): p is number => typeof p === 'number' && p >= 0);\n const invokerTypes = scripts.map((s) => s.invokerType).filter(Boolean);\n const invokers = scripts.map((s) => s.invoker).filter(Boolean);\n\n return {\n '[Amplitude] Main Thread Block Source': 'long-animation-frame',\n '[Amplitude] Main Thread Block Duration': entry.duration,\n '[Amplitude] Main Thread Block Blocking Duration': entry.blockingDuration,\n '[Amplitude] Main Thread Block Start Time': entry.startTime,\n ...(overlappingMeasures.length > 0 && { '[Amplitude] Main Thread Block Measures': overlappingMeasures }),\n '[Amplitude] Main Thread Block Render Start': entry.renderStart,\n '[Amplitude] Main Thread Block Style And Layout Start': entry.styleAndLayoutStart,\n '[Amplitude] Main Thread Block Script Count': scripts.length,\n ...(scriptURLs.length > 0 && { '[Amplitude] Main Thread Block Script URLs': scriptURLs }),\n ...(scriptFunctions.length > 0 && { '[Amplitude] Main Thread Block Script Functions': scriptFunctions }),\n ...(scriptPositions.length > 0 && { '[Amplitude] Main Thread Block Script Positions': scriptPositions }),\n ...(invokerTypes.length > 0 && { '[Amplitude] Main Thread Block Invoker Types': invokerTypes }),\n ...(invokers.length > 0 && { '[Amplitude] Main Thread Block Invokers': invokers }),\n };\n}\n\nfunction buildLongTaskProperties(entry: PerformanceLongTaskTiming, measures: PerformanceEntry[]) {\n const overlappingMeasures = getOverlappingMeasures(entry, measures);\n const attribution = entry.attribution ?? [];\n\n return {\n '[Amplitude] Main Thread Block Source': 'long-task',\n '[Amplitude] Main Thread Block Duration': entry.duration,\n '[Amplitude] Main Thread Block Blocking Duration': entry.duration,\n '[Amplitude] Main Thread Block Start Time': entry.startTime,\n ...(overlappingMeasures.length > 0 && { '[Amplitude] Main Thread Block Measures': overlappingMeasures }),\n ...(attribution.length > 0 && {\n '[Amplitude] Main Thread Block Attribution': attribution.map((a: TaskAttributionTiming) => a.name),\n }),\n };\n}\n\nfunction getSupportedEntryType(): 'long-animation-frame' | 'longtask' | null {\n /* istanbul ignore next */\n if (typeof PerformanceObserver === 'undefined') return null;\n try {\n const supported = PerformanceObserver.supportedEntryTypes;\n if (supported.includes('long-animation-frame')) return 'long-animation-frame';\n if (supported.includes('longtask')) return 'longtask';\n } catch {\n // ignore\n }\n return null;\n}\n\nexport function trackMainThreadBlock({\n amplitude,\n options,\n durationThreshold = DEFAULT_DURATION_THRESHOLD,\n}: {\n amplitude: BrowserClient;\n options: PerformanceTrackingOptions;\n durationThreshold?: number;\n}) {\n const entryType = getSupportedEntryType();\n\n /* istanbul ignore next */\n if (!entryType) {\n return { unsubscribe: () => void 0 };\n }\n\n const measures: PerformanceEntry[] = [];\n\n const measureObserver = new PerformanceObserver((list) => {\n const now = performance.now();\n for (const entry of list.getEntries()) {\n measures.push(entry);\n }\n const cutoff = now - MEASURE_BUFFER_WINDOW_MS;\n while (measures.length > 0 && measures[0].startTime < cutoff) {\n measures.shift();\n }\n });\n\n try {\n measureObserver.observe({ entryTypes: ['measure'] });\n } catch {\n // measure not supported — continue without it\n }\n\n const blockObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!isUrlAllowed(options as ElementInteractionsOptions)) {\n return;\n }\n if (entry.duration < durationThreshold) {\n continue;\n }\n const properties =\n entryType === 'long-animation-frame'\n ? buildLoAFProperties(entry as PerformanceLongAnimationFrameTiming, measures)\n : buildLongTaskProperties(entry as PerformanceLongTaskTiming, measures);\n\n amplitude.track(AMPLITUDE_MAIN_THREAD_BLOCK_EVENT, properties);\n }\n });\n\n try {\n blockObserver.observe({ entryTypes: [entryType] });\n } catch {\n measureObserver.disconnect();\n return { unsubscribe: () => void 0 };\n }\n\n return {\n unsubscribe: () => {\n blockObserver.disconnect();\n measureObserver.disconnect();\n },\n };\n}\n","/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n PerformanceTrackingOptions,\n Unsubscribable,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { trackMainThreadBlock } from './autocapture/track-long-task';\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nconst DEFAULT_DURATION_THRESHOLD = 100; // ms\n\nexport const performancePlugin = (options: PerformanceTrackingOptions = {}): BrowserEnrichmentPlugin => {\n const name = constants.PERFORMANCE_PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Unsubscribable[] = [];\n\n const mainThreadBlockEnabled =\n options.mainThreadBlock === true ||\n (typeof options.mainThreadBlock === 'object' && options.mainThreadBlock !== null);\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n if (mainThreadBlockEnabled) {\n let durationThreshold = DEFAULT_DURATION_THRESHOLD;\n if (typeof options.mainThreadBlock === 'object' && options.mainThreadBlock.durationThreshold !== undefined) {\n durationThreshold = options.mainThreadBlock.durationThreshold;\n }\n\n const subscription = trackMainThreadBlock({\n amplitude,\n options,\n durationThreshold,\n });\n subscriptions.push(subscription);\n }\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} performance tracking 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","getDecodeURI","locationStr","loggerProvider","decodedLocationStr","decodeURI","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","AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT","AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH","AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID","DATA_AMP_MASK_ATTRIBUTES","SENSITIVE_TAGS","isUrlAllowed","autocaptureOptions","pageUrlAllowlist","pageUrlExcludelist","location","href","createShouldTrackEvent","actionType","element","shouldTrackEventResolver","tag","tagName","toLowerCase","elementType","String","getAttribute","hasMatchAnyAllowedSelector","selector","matches","parseAttributesToMask","attributeString","split","attr","trim","removeEmptyProperties","properties","keys","filteredProperties","isEmpty","getCurrentPageViewId","raw","sessionStorage","getItem","parsed","parse","pageViewId","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","definition","def","event_type","createLabeledEventToTriggerMap","triggers","labeledEventToTriggerMap","triggers_1","triggers_1_1","trigger","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","e_6","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","Step","optimized","cssPathStep","node","isTargetNode","nodeType","Node","ELEMENT_NODE","idSelector","nodeNameLower","nodeName","parent","parentNode","DOCUMENT_NODE","prefixedElementClassNames","classAttribute","prefixedOwnClassNamesArray","needsClassNames","needsNthChild","ownIndex","elementIndex","sibling","ownClassNames","siblingClassNamesArray","j","siblingClass","prefixedOwnClassNamesArray_1","prefixedOwnClassNamesArray_1_1","prefixedName","DataExtractor","context","replaceSensitiveString","text","additionalMaskTextPatterns","replace","additionalMaskTextPatterns_1","additionalMaskTextPatterns_1_1","pattern","getHierarchy","hierarchy","startTime","performance","ancestors","targetEl","current","getAncestors","elementToAttributesToMaskMap","attributesToMask","constants.DATA_AMP_MASK_ATTRIBUTES","ancestorAttributesToMask","combinedAttributesToMask","hierarchyNode","hierarchy_1","hierarchy_1_1","endTime","diagnosticsClient","recordHistogram","getNearestLabel","labelElement","getText","getElementPath","elementPath","steps","contextNode","reverse","join","cssPath","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","parseTitleFunction","title","titleElement","hasAttribute","getPageTitle","constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT","innerHeight","constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH","innerWidth","constants.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID","HTMLAnchorElement","addTypeAndTimestamp","timestamp","addAdditionalEventProperties","selectorAllowlist","isCapturingCursorPointer","baseEvent","isElementBasedEvent","isCursorPointer","computedStyle","getComputedStyle","getPropertyValue","isElementPointerCursor","contextElement","sourceType","sourceElement","scopingElement","documentElement","scope","getDataSource","elementExtractType","attribute","getTextWithMaskedDescendants","maskedSelector","innerText","childNodes","childNodes_1","childNodes_1_1","childNode","TEXT_NODE","Element","textContent","rawPatterns","maskTextRegex","compiled","rawPatterns_1","rawPatterns_1_1","entry","RegExp","autocapturePlugin","setTag","_o","_p","visualTaggingOptions","enabled","debounceTime","isViewportContentUpdatedEnabled","viewportContentUpdated","resolvedExposureDuration","_g","exposureDuration","_h","excludePattern","regexError","beforeUnloadCleanup","elementExposedForPage","currentElementExposed","createObservables","navigateObservable","clickObservable","click","changeObservable","changeEvent","enrichedChangeEvent","navigation","navigateEvent","enrichedNavigateEvent","mutationObservable","mutation","scrollObservable","exposureObservable","IntersectionObserver","intersectionObserver","root","rootMargin","threshold","selectorString","querySelectorAll","mutationSubscription","addedNodes","child","createExposureObservable","ChangeObservable","ClickObservable","MutationObservable","NavigateObservable","ScrollObservable","ExposureObservable","_k","_j","_l","_m","evaluateTriggers","createTriggerEvaluator","config","amplitude","pageViewEndFired","lastScroll","maxX","maxY","fetchRemoteConfig","remoteConfigClient","remoteConfig","remotePageActions","recomputePageActionsData","shouldTrackEvent","shouldTrackActionClick","allObservables","clickTrackingSubscription","track","trackClicks","bind","changeSubscription","trackChange","actionClickSubscription","filteredClickObservable","closestActionClickEl","clickEvent","mutationOrNavigate","clickMutationNavigateObservable","actionClickTimer","lastClickEvent","clearTimeout","event_1","actionClick","trackActionClick","scrollTracker","state","scrollSubscription","currentX","floor","scrollX","pageXOffset","currentY","scrollY","pageYOffset","max","getState","reset","trackScroll","trackers","handleViewportContentUpdated","isPageEnd","exposureTracker","pageScrollMaxState","viewportWidth","viewportHeight","eventProperties","fireViewportContentUpdated","exposure","handleExposure","fireViewportContentUpdatedCallback","exposedArray","onExposure","exposureMap","exposureTimerMap","exposureSubscription","isIntersecting","timer","intersectionRatio","trackExposure","beforeUnloadHandler_1","popstateHandler_1","originalPushState_1","history","pushState","Proxy","unused","scriptUrl","backgroundCaptureInstance","onBackgroundCapture","backgroundCaptureData","resolvedUrl","URL","amplitudeBackgroundCapture","enableBackgroundCapture","serverZone","constants.AMPLITUDE_ORIGINS_MAP","execute","teardown","CHANGE_EVENTS","addCoordinates","regionBox","pageX","pageY","yMin","min","yMax","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","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","getOverlappingMeasures","measures","taskEnd","duration","measure","buildLoAFProperties","overlappingMeasures","scripts","scriptURLs","sourceURL","scriptFunctions","sourceFunctionName","scriptPositions","sourceCharPosition","invokerTypes","invokerType","invokers","invoker","blockingDuration","renderStart","styleAndLayoutStart","buildLongTaskProperties","attribution","a","trackMainThreadBlock","durationThreshold","entryType","PerformanceObserver","supported","supportedEntryTypes","getSupportedEntryType","measureObserver","list","getEntries","cutoff","entryTypes","blockObserver","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","thrashedCursorSubscription","mainThreadBlockEnabled","mainThreadBlock"],"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@4.9.5/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","../../../element-selector/src/helpers/get-stable-id.ts","../../../element-selector/src/patterns/autogenerated-ids.ts","../../../element-selector/src/helpers/describe-relative.ts","../../../element-selector/src/helpers/escape-css-identifier.ts","../../../element-selector/src/helpers/escape-id.ts","../../../element-selector/src/strategies/stable-id.ts","../../../element-selector/src/orchestrator.ts","../../../element-selector/src/strategies/explicit-tracking-attribute.ts","../../../element-selector/src/fallback-css-path.ts","../../../element-selector/src/legacy-css-path.ts","../../../element-selector/src/config/resolve-config.ts","../../../element-selector/src/patterns/unstable-classes.ts","../../../element-selector/src/engine.ts","../../../element-selector/src/generate-selector.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-scroll.ts","../../../src/autocapture/track-viewport-content-updated.ts","../../../src/autocapture/track-exposure.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","../../../src/autocapture/track-long-task.ts","../../../src/performance-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 const DEFAULT_EXPOSURE_DURATION = 150;\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\n * on elements not already allowed by the cssSelectorAllowlist.\n * Only applies to click-based interaction tracking; has no effect on\n * viewport/exposure-based features (e.g., zoning).\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 /**\n * Duration in milliseconds an element must be visible before it is considered exposed.\n * Default is 150ms.\n * @deprecated Use `viewportContentUpdated.exposureDuration` instead.\n */\n exposureDuration?: number;\n\n /**\n * Options for viewport content updated tracking (zoning).\n */\n viewportContentUpdated?: {\n /**\n * Whether viewport content updated tracking is enabled.\n * Default is true.\n */\n enabled?: boolean;\n /**\n * Duration in milliseconds an element must be visible before it is considered exposed.\n * Default is 150ms.\n */\n exposureDuration?: number;\n };\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 20\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 */\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 */\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 = 'https://cdn.amplitude.com/libs/background-capture-1.0.1.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.28.0-featelement-selector-v1.0';\n","/* eslint-disable no-restricted-globals */\nimport { ElementInteractionsOptions, ActionType, isUrlMatchAllowlist, getGlobalScope } from '@amplitude/analytics-core';\nimport * as constants from './constants';\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): 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 /* 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 return actionType === 'click';\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 getCurrentPageViewId = (): string | undefined => {\n try {\n const globalScope = getGlobalScope();\n /* istanbul ignore next */\n const raw = globalScope?.sessionStorage?.getItem(constants.PAGE_VIEW_SESSION_STORAGE_KEY);\n if (!raw) {\n return undefined;\n }\n const parsed = JSON.parse(raw) as { pageViewId?: unknown };\n if (typeof parsed.pageViewId === 'string') {\n return parsed.pageViewId;\n }\n } catch {\n // ignore storage access or JSON errors\n }\n return undefined;\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';\nexport const PERFORMANCE_PLUGIN_NAME = '@amplitude/plugin-performance-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_PAGE_SCROLLED_EVENT = '[Amplitude] Page Scrolled';\nexport const AMPLITUDE_THRASHED_CURSOR_EVENT = '[Amplitude] Thrashed Cursor';\nexport const AMPLITUDE_MAIN_THREAD_BLOCK_EVENT = '[Amplitude] Main Thread Block';\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';\nexport const AMPLITUDE_EVENT_PROP_ELEMENT_PATH = '[Amplitude] Element Path';\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';\nexport const AMPLITUDE_EVENT_PROP_MAX_PAGE_X = '[Amplitude] Max Page X';\nexport const AMPLITUDE_EVENT_PROP_MAX_PAGE_Y = '[Amplitude] Max Page Y';\n\nexport const AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID = '[Amplitude] Page View ID';\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;\n\nexport const MAX_ATTRIBUTE_LENGTH = 128;\n\n// The key for the page view object in sessionStorage\nexport const PAGE_VIEW_SESSION_STORAGE_KEY = 'AMP_PAGE_VIEW';\n\nexport const MAX_ELEMENT_EXPOSED_STR_LENGTH = 18_000;\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 { TimestampedEvent } from './helpers';\nimport { 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\n getGlobalScope()?.document.addEventListener(clickType, handler, { capture: true });\n return () => {\n getGlobalScope()?.document.removeEventListener(clickType, handler, { capture: true });\n };\n });\n};\n\nexport const createScrollObservable = (): Observable<Event> => {\n return new Observable<Event>((observer) => {\n const handler = (event: Event) => {\n observer.next(event);\n };\n\n getGlobalScope()?.addEventListener('scroll', handler);\n return () => {\n getGlobalScope()?.removeEventListener('scroll', handler);\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\n// Tracks when a trackedelement is exposed to the viewport\nexport const createExposureObservable = (\n mutationObservable: Observable<TimestampedEvent<MutationRecord[]>>,\n selectorAllowlist: string[],\n): Observable<Event> => {\n return new Observable<Event>((observer) => {\n const globalScope = getGlobalScope();\n\n if (!globalScope?.IntersectionObserver) {\n return () => {\n return;\n };\n }\n\n const intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n observer.next(entry as unknown as Event);\n });\n },\n {\n root: null, // viewport\n rootMargin: '0px', // start exactly at the viewport edge\n threshold: 1.0, // trigger when 100% of the element is visible\n },\n );\n\n // Observe initial elements\n const selectorString = selectorAllowlist.join(',');\n /* istanbul ignore next */\n const initialElements = globalScope?.document.querySelectorAll(selectorString) ?? [];\n initialElements.forEach((element) => {\n intersectionObserver.observe(element);\n });\n\n // Use mutation observable to observe new elements that match the allowlist\n const mutationSubscription = mutationObservable.subscribe(({ event }) =>\n event.forEach(({ addedNodes }) =>\n addedNodes.forEach((node) => {\n if (!(node instanceof Element)) {\n return;\n }\n if (node.matches(selectorString)) {\n intersectionObserver.observe(node);\n }\n node.querySelectorAll(selectorString).forEach((child) => {\n intersectionObserver.observe(child);\n });\n }),\n ),\n );\n\n return () => {\n mutationSubscription.unsubscribe();\n intersectionObserver.disconnect();\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","import { ResolvedSelectorConfig } from '../types';\nimport { isStableId } from '../patterns/autogenerated-ids';\n\n/**\n * Shared helper that the `stableId` strategy (in this PR) and the\n * `fallback-css-path` walker (in the orchestration PR) both consult to decide\n * whether an element's id is usable as a selector anchor.\n *\n * Resolution order:\n *\n * 1. Check the customer's explicit-tracking attribute. If set with an empty\n * value (e.g. `data-amp-track-id=\"\"`), that's an explicit suppression\n * signal — the customer is telling us to ignore this element's id even\n * if it would otherwise look stable. Return null.\n * 2. Read the element's id. If absent or empty, return null.\n * 3. Check the id against the autogenerated-id pattern pack. If matched,\n * return null (the algorithm should walk past this element).\n * 4. Otherwise return the id.\n *\n * The single point of consultation means the strategy and the fallback always\n * agree on what's a usable id — no chance of one component filtering an id\n * while another uses it anyway.\n */\nexport function getStableId(el: Element, cfg: ResolvedSelectorConfig): string | null {\n // 1. Suppression signal: empty explicit-tracking attribute on this element.\n const trackAttr = el.getAttribute(cfg.explicitTrackingAttribute);\n if (trackAttr !== null && trackAttr === '') {\n return null;\n }\n\n // 2. Id presence.\n const id = el.getAttribute('id');\n if (id === null || id === '') {\n return null;\n }\n\n // 3. Autogenerated-pattern filter.\n if (!isStableId(id, cfg.autogeneratedIdPatterns)) {\n return null;\n }\n\n // 4. Stable.\n return id;\n}\n","import { ElementSelectorLogger } from '../types';\n\n/**\n * Autogenerated-id pattern pack.\n *\n * When an element id matches any of these regexes, the algorithm treats the\n * element as if it has no id — the stableId strategy returns null and the\n * fallback walks past it instead of anchoring on it. Stops selectors from\n * pinning to ids that change between page loads or component re-mounts.\n *\n * Defaults are surfaced to customers in remote config so they can audit what's\n * being filtered and add or remove patterns to match their stack.\n */\n\n/**\n * Built-in defaults, in the order they're applied (order doesn't affect\n * correctness — `some()` short-circuits on the first match).\n */\nexport const DEFAULT_AUTOGENERATED_ID_PATTERNS: ReadonlyArray<RegExp> = [\n // React useId() — \":r0:\", \":r1:\", \":rk:\". Stable for one render; new id on next mount.\n /^:r[0-9a-z]+:$/,\n // Radix UI primitives — \"radix-:r3:\", \"radix-A1B2C3\". Prefix match (the\n // shape of what comes after `radix-` varies by Radix version and React\n // major; only the prefix is reliable).\n /^radix-/,\n // Headless UI (Tailwind Labs) — \"headlessui-menu-button-:r5:\". Prefix match.\n /^headlessui-/,\n // MUI internal id prefix — \"mui-12345\". Don't confuse with Mui-* CSS class state markers.\n /^mui-/,\n // Hex-only ids >=16 chars — UUIDs without hyphens, build hashes. Whole-string match.\n /^[a-f0-9]{16,}$/i,\n // Trailing long digit run — \"session-1700000000\", \"row-20250515\". Timestamps, counters.\n /-\\d{8,}$/,\n // Any 4+ consecutive digits anywhere — \"product-2134\", \"swiper-wrapper-…41039\".\n // ContentSquare's heuristic; catches the digit-heavy portions of library-generated ids.\n /\\d{4,}/,\n];\n\n/**\n * Compile a list of regex pattern strings (e.g. from a remote-config payload)\n * into RegExp objects. Invalid patterns are skipped (not thrown) so a single\n * bad regex in remote config can't crash the engine.\n *\n * Pass `logger` to surface invalid patterns at `warn` level — useful for\n * diagnosing why a customer's override isn't taking effect.\n *\n * Callers decide whether to merge the result with `DEFAULT_AUTOGENERATED_ID_PATTERNS`\n * or use it as a full replacement. That policy lives in the config resolver,\n * not here.\n */\nexport function compile(patterns: string[], logger?: ElementSelectorLogger): RegExp[] {\n const compiled: RegExp[] = [];\n for (const pattern of patterns) {\n try {\n compiled.push(new RegExp(pattern));\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n logger?.warn(`@amplitude/element-selector: ignoring invalid autogenerated-id pattern \"${pattern}\" (${message})`);\n }\n }\n return compiled;\n}\n\n/**\n * Check whether `id` is \"stable\" relative to a set of patterns. An id is\n * stable when it's a non-empty string AND doesn't match any pattern in\n * `patterns`. Null, undefined, and empty-string ids are not stable.\n */\nexport function isStableId(id: string | null | undefined, patterns: ReadonlyArray<RegExp>): boolean {\n if (id === null || id === undefined || id === '') return false;\n for (const pattern of patterns) {\n if (pattern.test(id)) return false;\n }\n return true;\n}\n","/**\n * Positional descent builder.\n *\n * Given an anchor element (the result of pass 2's walk in the orchestration PR)\n * and the trail of intermediate elements between the anchor and the original\n * click target, produce the CSS-selector descent string. Each step in the\n * descent uses `tag:nth-of-type(n)` so the resulting selector resolves\n * unambiguously to the original target regardless of class-state churn.\n *\n * Matches ContentSquare's \"position within identical markers\" convention.\n *\n * Example:\n *\n * describeRelative(anchor, [<section>, <ul>, <li>])\n * → \"section:nth-of-type(1) > ul:nth-of-type(1) > li:nth-of-type(3)\"\n *\n * Combined with the anchor selector (`anchor#some-id`) by the orchestrator:\n *\n * \"anchor#some-id > section:nth-of-type(1) > ul:nth-of-type(1) > li:nth-of-type(3)\"\n *\n * The `anchor` parameter is accepted for symmetry with the orchestrator's call\n * site but isn't currently used — the function only needs each trail element's\n * own parent context. We keep the signature so subsequent work can reference\n * the anchor when extending the descent format (e.g., to optimize bare\n * `:nth-of-type(1)` away when there's only one of that type).\n */\nexport function describeRelative(_anchor: Element, trail: Element[]): string {\n return trail.map(stepFor).join(' > ');\n}\n\nfunction stepFor(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const parent = el.parentElement;\n if (parent === null) {\n // Detached element or root — emit just the tag. The orchestrator shouldn't\n // call us with a detached trail, but we don't want to crash if it does.\n return tag;\n }\n const index = sameTypeIndex(el, parent);\n return `${tag}:nth-of-type(${index})`;\n}\n\nfunction sameTypeIndex(el: Element, parent: Element): number {\n // 1-based index among same-tag element siblings, mirroring :nth-of-type semantics.\n let count = 0;\n for (let i = 0; i < parent.children.length; i++) {\n const sibling = parent.children[i];\n if (sibling.tagName === el.tagName) {\n count += 1;\n if (sibling === el) return count;\n }\n }\n // Element wasn't found among its parent's children — shouldn't happen for a\n // live element. Return 1 as a defensive fallback rather than throwing.\n return 1;\n}\n","/* eslint-disable no-restricted-globals */\n\ntype CssEscapeGlobal = {\n CSS?: {\n escape?: (value: string) => string;\n };\n};\n\n/**\n * Escape a string for use as a CSS identifier.\n *\n * Uses the native CSS.escape implementation when available, with the CSSOM\n * algorithm inlined for runtimes that do not expose it (notably jsdom).\n */\nexport function escapeCssIdentifier(value: string): string {\n const css = (globalThis as CssEscapeGlobal).CSS;\n if (css && typeof css.escape === 'function') {\n return css.escape(value);\n }\n\n const string = String(value);\n const length = string.length;\n let result = '';\n\n for (let index = 0; index < length; index++) {\n const codeUnit = string.charCodeAt(index);\n\n if (codeUnit === 0x0000) {\n result += '\\uFFFD';\n continue;\n }\n\n if (\n (codeUnit >= 0x0001 && codeUnit <= 0x001f) ||\n codeUnit === 0x007f ||\n (index === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n (index === 1 && codeUnit >= 0x0030 && codeUnit <= 0x0039 && string.charCodeAt(0) === 0x002d)\n ) {\n result += `\\\\${codeUnit.toString(16)} `;\n continue;\n }\n\n if (index === 0 && length === 1 && codeUnit === 0x002d) {\n result += '\\\\-';\n continue;\n }\n\n if (\n codeUnit >= 0x0080 ||\n codeUnit === 0x002d ||\n codeUnit === 0x005f ||\n (codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n (codeUnit >= 0x0041 && codeUnit <= 0x005a) ||\n (codeUnit >= 0x0061 && codeUnit <= 0x007a)\n ) {\n result += string.charAt(index);\n continue;\n }\n\n result += `\\\\${string.charAt(index)}`;\n }\n\n return result;\n}\n","import { escapeCssIdentifier } from './escape-css-identifier';\n\n/** Escape an element id for the `tag#<id>` selector form shared by strategies and fallback. */\nexport function escapeIdForCss(id: string): string {\n return escapeCssIdentifier(id);\n}\n","import { Strategy } from '../types';\nimport { getStableId } from '../helpers/get-stable-id';\nimport { escapeIdForCss } from '../helpers/escape-id';\n\n/**\n * Second strategy in the chain. Anchors on the element's `id` when the id is\n * \"stable\" — i.e., present, not suppressed via the explicit-tracking-attribute\n * empty-value mechanism, and not matching any autogenerated-id pattern.\n *\n * Returns `tag#id` (CSS-escaped) when the id is usable; null otherwise.\n *\n * Filtering is delegated to `getStableId` so this strategy and the\n * `fallback-css-path` walker (in the orchestration PR) share a single source\n * of truth for \"is this id usable?\"\n */\nexport const stableId: Strategy = {\n name: 'stableId',\n\n try(el, ctx) {\n const id = getStableId(el, ctx.config);\n if (id === null) {\n return null;\n }\n return `${el.tagName.toLowerCase()}#${escapeIdForCss(id)}`;\n },\n};\n","/**\n * Orchestrator — the entry point for the v1 element-selector algorithm.\n *\n * Given a click target, the orchestrator walks from the target up through its\n * ancestors and tries each registered strategy at each level. The first\n * strategy that returns a non-null candidate (and produces a selector that\n * resolves uniquely under the scope) wins; the trail of intermediate elements\n * between the anchor and the original target is then expressed as a positional\n * descent via `describeRelative`.\n *\n * Two-pass design: every ancestor is tried under the `explicitTrackingAttribute`\n * strategy first, then the entire walk repeats with `stableId`. This ordering\n * means an explicit anchor anywhere up the tree always beats a stable id deeper\n * down — the design doc describes this as the \"customer intent overrides\n * structural inference\" rule.\n *\n * The orchestrator does not own the fallback. When no strategy + walk produces\n * a unique selector, it returns `null` and the engine wires the\n * `fallback-css-path` path in instead. Keeping the fallback outside the\n * orchestrator keeps the strategy chain testable in isolation.\n *\n * See the design doc:\n * packages/plugin-autocapture-browser/element-selector-strategy-v1-no-classes.md\n */\n\nimport { ElementSelectorLogger, ResolvedSelectorConfig, Strategy, StrategyContext } from './types';\nimport { explicitTrackingAttribute } from './strategies/explicit-tracking-attribute';\nimport { stableId as stableIdStrategy } from './strategies/stable-id';\nimport { describeRelative } from './helpers/describe-relative';\n\n/**\n * Default strategy chain in priority order. Used by the engine factory when the\n * caller doesn't provide an explicit list. Exported for diagnostics — tests\n * import this so they don't have to duplicate the list.\n */\nexport const DEFAULT_STRATEGIES: ReadonlyArray<Strategy> = [explicitTrackingAttribute, stableIdStrategy];\n\nexport interface OrchestratorOptions {\n /** Strategy chain. Defaults to `DEFAULT_STRATEGIES`. Order = priority. */\n strategies?: ReadonlyArray<Strategy>;\n /** Document or shadow root used for uniqueness checks. Defaults to the target's owner document. */\n scope?: ParentNode;\n /**\n * Optional logger. When provided, the orchestrator emits a `debug` log if a\n * strategy produces a malformed selector that throws during the uniqueness\n * check — useful for diagnosing strategy bugs without crashing the engine.\n */\n logger?: ElementSelectorLogger;\n}\n\n/**\n * Try to produce a CSS selector for `el` using the strategy chain.\n *\n * Returns the composed selector string on success, or `null` if every strategy\n * declined at every walked ancestor. Callers (the engine) treat `null` as the\n * signal to invoke the fallback walker.\n *\n * Selector format on success:\n *\n * - Anchor only (target itself was an anchor): `<anchor-selector>`\n * - Anchor + trail (anchor was an ancestor): `<anchor-selector> > <descent>`\n *\n * Where `<anchor-selector>` is whatever the winning strategy returned for the\n * anchor element (e.g. `[data-amp-track-id=\"login-form\"]` or `div#hero`), and\n * `<descent>` is `describeRelative(anchor, trail)`.\n */\nexport function runOrchestrator(\n el: Element,\n config: ResolvedSelectorConfig,\n options: OrchestratorOptions = {},\n): string | null {\n const strategies = options.strategies ?? DEFAULT_STRATEGIES;\n const scope: ParentNode = options.scope ?? el.ownerDocument ?? document;\n const ctx: StrategyContext = { scope, config };\n\n const walk = collectWalk(el, config.maxAncestorWalkDepth);\n\n // Two-pass: try strategy[0] across the whole walk, then strategy[1], etc.\n // This gives an \"explicit anchor at any depth beats a structural anchor any\n // depth\" priority, which matches the design doc's \"customer intent overrides\n // structural inference\" rule.\n for (const strategy of strategies) {\n for (let i = 0; i < walk.length; i++) {\n const anchor = walk[i];\n const anchorSelector = strategy.try(anchor, ctx);\n if (anchorSelector === null) continue;\n\n // Anchor was the target itself — no descent needed.\n if (i === 0) {\n if (isUniqueMatch(scope, anchorSelector, el, strategy.name, options.logger)) {\n return anchorSelector;\n }\n continue;\n }\n\n // Anchor was an ancestor — descend back to the target through the trail.\n const trail = walk.slice(0, i).reverse();\n const descent = describeRelative(anchor, trail);\n const composed = `${anchorSelector} > ${descent}`;\n if (isUniqueMatch(scope, composed, el, strategy.name, options.logger)) {\n return composed;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Build the walk array `[target, parent, grandparent, ...]`, stopping at\n * `<html>` (or at the depth limit if configured). Excludes the document\n * element's parent (which is the Document node and not an Element).\n */\nfunction collectWalk(el: Element, maxDepth: number | undefined): Element[] {\n const walk: Element[] = [];\n let cursor: Element | null = el;\n while (cursor !== null) {\n walk.push(cursor);\n if (maxDepth !== undefined && walk.length > maxDepth) break;\n cursor = cursor.parentElement;\n }\n return walk;\n}\n\n/**\n * Check whether `selector` resolves to exactly `el` and no other element in\n * `scope`. The strategies themselves don't run uniqueness checks — that's the\n * orchestrator's job, so strategies stay pure transforms and stay testable in\n * isolation.\n *\n * When the selector is malformed (which is a strategy bug rather than user\n * input), we log at `debug` and return false rather than throwing. The log\n * lets engineers diagnose a misbehaving strategy without the engine taking\n * down whatever it's wired into.\n */\nfunction isUniqueMatch(\n scope: ParentNode,\n selector: string,\n el: Element,\n strategyName: string,\n logger?: ElementSelectorLogger,\n): boolean {\n let matches: NodeListOf<Element>;\n try {\n matches = scope.querySelectorAll(selector);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n logger?.debug(\n `@amplitude/element-selector: strategy \"${strategyName}\" emitted a malformed selector \"${selector}\" (${message})`,\n );\n return false;\n }\n return matches.length === 1 && matches[0] === el;\n}\n","import { Strategy } from '../types';\n\n/**\n * First strategy in the chain. Customer-controlled anchor selector via the\n * configured tracking attribute (default: `data-amp-track-id`).\n *\n * Semantics:\n *\n * - Attribute set with a non-empty value:\n * returns `[<attr>=\"<value>\"]` — uses this element as an explicit anchor.\n * - Attribute set with an empty value:\n * returns null. The empty value is a suppression signal for downstream\n * components (the `stableId` strategy and the fallback both consult\n * `getStableId` which honors the empty-value semantic). This strategy\n * doesn't anchor on the element either.\n * - Attribute absent:\n * returns null.\n *\n * The selector wraps the value in JSON-encoded quotes so any special CSS\n * characters in the value are escaped uniformly.\n */\nexport const explicitTrackingAttribute: Strategy = {\n name: 'explicitTrackingAttribute',\n\n try(el, ctx) {\n const attrName = ctx.config.explicitTrackingAttribute;\n const value = el.getAttribute(attrName);\n if (value === null || value === '') {\n return null;\n }\n // JSON.stringify wraps in double quotes and escapes embedded quotes /\n // backslashes — the resulting attribute selector is valid CSS.\n return `[${attrName}=${JSON.stringify(value)}]`;\n },\n};\n","/**\n * Fallback CSS-path walker — the safety net for the v1 element-selector\n * algorithm.\n *\n * When the orchestrator's strategy chain finds nothing usable across the full\n * ancestor walk, the engine invokes this fallback. It produces a positional\n * selector by walking up from the target to <html>, expressing each step as\n * either an id anchor (when one survives the autogen filter) or a\n * `tag:nth-of-type(n)` step.\n *\n * Key differences from the legacy autocapture `cssPath`:\n *\n * 1. Ids are filtered through `getStableId`, which honors the\n * explicit-tracking-attribute suppression signal AND the autogenerated-id\n * pattern pack. The legacy `cssPath` would happily anchor on `id=\":r5:\"`\n * and produce selectors that never match across page loads.\n *\n * 2. Classes — when they're used at all for sibling disambiguation — are\n * filtered through `filterClasses` against the unstable-class pattern\n * pack. The current v1 implementation here doesn't emit classes (we lean\n * entirely on `:nth-of-type` for sibling disambiguation), but the\n * filtering helper is wired through so future iterations can opt back in\n * surgically without re-deriving the policy.\n *\n * 3. A unique anchor id terminates the walk early — once we hit `body#main`,\n * we don't need to keep walking up to `<html>`.\n *\n * 4. Ambiguous id anchors are skipped. Duplicate ids are invalid HTML but\n * common enough in the wild that fallback must not emit selectors that\n * resolve to the wrong target.\n *\n * Output format mirrors the orchestrator's output: `<anchor> > <descent>`.\n * When no usable id is found anywhere on the walk, the fallback emits a\n * pure-positional selector rooted at `html`.\n *\n * See the design doc:\n * packages/plugin-autocapture-browser/element-selector-strategy-v1-no-classes.md\n */\n\nimport { ResolvedSelectorConfig } from './types';\nimport { getStableId } from './helpers/get-stable-id';\nimport { escapeIdForCss } from './helpers/escape-id';\n\nexport interface FallbackCssPathOptions {\n /** Document or shadow root used for uniqueness checks. Defaults to the target's owner document. */\n scope?: ParentNode;\n}\n\n/**\n * Build a positional CSS selector for `el`, using stable ids as anchors when\n * available and falling back to `tag:nth-of-type(n)` for disambiguation.\n *\n * Honors `config.maxAncestorWalkDepth` defensively — once the depth limit is\n * reached, the walker stops and returns whatever it has built so far rooted at\n * the deepest reached ancestor.\n */\nexport function fallbackCssPath(\n el: Element,\n config: ResolvedSelectorConfig,\n options: FallbackCssPathOptions = {},\n): string {\n const scope: ParentNode = options.scope ?? el.ownerDocument ?? document;\n const segments: string[] = [];\n let cursor: Element | null = el;\n let depth = 0;\n\n while (cursor !== null) {\n if (config.maxAncestorWalkDepth !== undefined && depth > config.maxAncestorWalkDepth) {\n break;\n }\n\n const id = getStableId(cursor, config);\n if (id !== null) {\n // Anchor format mirrors the stableId strategy: `tag#id` with the id\n // CSS-escaped. Only terminate if the composed selector uniquely resolves\n // to the target; duplicate ids should fall through to positional steps.\n const anchorSegment = `${cursor.tagName.toLowerCase()}#${escapeIdForCss(id)}`;\n const candidate = [anchorSegment, ...segments].join(' > ');\n if (isUniqueMatch(scope, candidate, el)) {\n return candidate;\n }\n }\n\n segments.unshift(stepFor(cursor));\n cursor = cursor.parentElement;\n depth += 1;\n }\n\n // Walked all the way to the document root without finding an id. The first\n // segment is whatever `<html>` produced (which is just `html` since it has\n // no parent and no same-tag siblings).\n return segments.join(' > ');\n}\n\n/**\n * Build a single step. For an element with a parent: `tag:nth-of-type(n)`.\n * For a root element (no parent — i.e. <html>): just `tag`.\n *\n * Class-based disambiguation is intentionally not emitted in v1 — see the\n * design doc, \"Why we don't use classes for sibling disambiguation\". The\n * `filterClasses` helper is imported in the package for future iterations.\n */\nfunction stepFor(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const parent = el.parentElement;\n if (parent === null) {\n return tag;\n }\n const index = sameTypeIndex(el, parent);\n return `${tag}:nth-of-type(${index})`;\n}\n\nfunction sameTypeIndex(el: Element, parent: Element): number {\n let count = 0;\n for (let i = 0; i < parent.children.length; i++) {\n const sibling = parent.children[i];\n if (sibling.tagName === el.tagName) {\n count += 1;\n if (sibling === el) return count;\n }\n }\n return 1;\n}\n\nfunction isUniqueMatch(scope: ParentNode, selector: string, el: Element): boolean {\n let matches: NodeListOf<Element>;\n try {\n matches = scope.querySelectorAll(selector);\n } catch (_e) {\n return false;\n }\n return matches.length === 1 && matches[0] === el;\n}\n","/**\n * Canonical legacy CSS-path walker.\n *\n * This is the Chromium-DevTools-derived `cssPath` algorithm that was the only\n * selector source autocapture used before the strategy engine existed. It still\n * matters in two situations:\n *\n * 1. The kill switch: when `ResolvedSelectorConfig.enabled === false`, the\n * engine routes here so a customer who flips the engine off mid-session\n * keeps emitting the same selectors their downstream zones and cohorts\n * were built against.\n * 2. The safety net: when the strategy chain or its internal walker throws\n * anything unexpected, the engine catches and falls back here. The\n * autocapture click handler must always produce *some* selector — a\n * runtime exception in selector generation is a worse outcome than a\n * slightly less stable selector.\n *\n * Until this file existed, the algorithm was duplicated in two places kept\n * \"in sync by comment\":\n *\n * - `packages/plugin-autocapture-browser/src/libs/element-path.ts`\n * - `javascript/packages/session-replay-ui/src/utils/element-path.ts`\n *\n * Both will eventually re-export from here so divergence becomes impossible.\n *\n * Behavior is byte-identical to those two copies — selectors emitted by this\n * function for a given element MUST match what the SDK has been emitting in\n * production. Do not \"fix\" the selector format without an explicit version\n * bump and a coordinated dashboard rollout.\n *\n * **Why this lives in the package, not as an optional consumer concern:**\n *\n * Every consumer that uses `engine.generate(el)` benefits from the kill\n * switch and the safety net automatically. Without this, each new consumer\n * (Chrome extension visual tagger, future tagging surfaces) has to\n * reimplement the same router and the same legacy walker. We learned that\n * the hard way — by writing the same `if (config.enabled && engine) ...\n * else cssPath()` block in two repositories with two copies of cssPath.\n *\n * Code is adapted from The Chromium Authors.\n * Source: https://github.com/ChromeDevTools/devtools-frontend/blob/main/front_end/panels/elements/DOMPath.ts#L14\n * License: BSD-style license\n *\n * Copyright 2014 The Chromium Authors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* istanbul ignore file -- the algorithm is locked-down behavior inherited from\n Chromium and validated by the SDK's own end-to-end suite. Re-running line\n coverage here only obscures the parts of the package that *do* have\n meaningful coverage. */\n\nimport { escapeCssIdentifier } from './helpers/escape-css-identifier';\n\nclass Step {\n constructor(public value: string, public optimized: boolean) {}\n toString(): string {\n return this.value;\n }\n}\n\n/**\n * Produce a CSS selector string for `node` using the legacy positional walker.\n *\n * Returns the empty string for non-element nodes — same shape every existing\n * caller depends on. Never throws for well-formed Element inputs.\n *\n * @param node Element to identify.\n * @param optimized When `true`, short-circuits at the nearest unique-ish step\n * (id or `<body>` / `<head>` / `<html>`). Default `false`,\n * which matches what autocapture has always passed.\n */\nexport const legacyCssPath = (node: Element, optimized?: boolean): string => {\n // `node` is already an Element; this check is defensive.\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return '';\n }\n\n const steps: Step[] = [];\n let contextNode: Element | null = node;\n\n while (contextNode) {\n const step = cssPathStep(contextNode, Boolean(optimized), contextNode === node);\n if (!step) {\n break;\n }\n steps.push(step);\n if (step.optimized) {\n break;\n }\n contextNode = contextNode.parentElement;\n }\n\n steps.reverse();\n return steps.join(' > ');\n};\n\nconst cssPathStep = (node: Element, optimized: boolean, isTargetNode: boolean): Step | null => {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n\n const id = node.getAttribute('id');\n if (optimized) {\n if (id) {\n return new Step(idSelector(id), true);\n }\n\n const nodeNameLower = node.tagName.toLowerCase();\n if (nodeNameLower === 'body' || nodeNameLower === 'head' || nodeNameLower === 'html') {\n return new Step(nodeNameLower, true);\n }\n }\n\n const nodeName = node.tagName.toLowerCase();\n\n if (id) {\n return new Step(nodeName + idSelector(id), true);\n }\n\n const parent = node.parentNode;\n if (!parent || parent.nodeType === Node.DOCUMENT_NODE) {\n return new Step(nodeName, true);\n }\n\n const prefixedOwnClassNamesArray = prefixedElementClassNames(node);\n let needsClassNames = false;\n let needsNthChild = false;\n let ownIndex = -1;\n let elementIndex = -1;\n\n const siblings: HTMLCollectionOf<Element> = (parent as Element | Document).children;\n\n for (let i = 0; siblings && (ownIndex === -1 || !needsNthChild) && i < siblings.length; ++i) {\n const sibling = siblings[i];\n if (sibling.nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n\n elementIndex += 1;\n if (sibling === node) {\n ownIndex = elementIndex;\n continue;\n }\n if (needsNthChild) {\n continue;\n }\n\n if (sibling.tagName.toLowerCase() !== nodeName) {\n continue;\n }\n\n needsClassNames = true;\n const ownClassNames = new Set<string>(prefixedOwnClassNamesArray);\n if (!ownClassNames.size) {\n needsNthChild = true;\n continue;\n }\n\n const siblingClassNamesArray = prefixedElementClassNames(sibling);\n for (let j = 0; j < siblingClassNamesArray.length; ++j) {\n const siblingClass = siblingClassNamesArray[j];\n if (!ownClassNames.has(siblingClass)) {\n continue;\n }\n ownClassNames.delete(siblingClass);\n if (!ownClassNames.size) {\n needsNthChild = true;\n break;\n }\n }\n }\n\n let result = nodeName;\n if (\n isTargetNode &&\n nodeName.toLowerCase() === 'input' &&\n node.getAttribute('type') &&\n !node.getAttribute('id') &&\n !node.getAttribute('class')\n ) {\n result += '[type=' + escapeCssIdentifier(node.getAttribute('type') || '') + ']';\n }\n if (needsNthChild) {\n result += ':nth-child(' + String(ownIndex + 1) + ')';\n } else if (needsClassNames) {\n for (const prefixedName of prefixedOwnClassNamesArray) {\n result += '.' + escapeCssIdentifier(prefixedName.slice(1));\n }\n }\n\n return new Step(result, false);\n};\n\nconst prefixedElementClassNames = (el: Element): string[] => {\n const classAttribute = el.getAttribute('class');\n if (!classAttribute) {\n return [];\n }\n return classAttribute\n .split(/\\s+/g)\n .filter(Boolean)\n .map((name) => {\n // The prefix is required to store \"__proto__\" in a object-based map.\n return '$' + name;\n });\n};\n\nconst idSelector = (id: string): string => '#' + escapeCssIdentifier(id);\n","/**\n * Config resolver — collapses the optional, string-based remote-config payload\n * into the fully-typed `ResolvedSelectorConfig` that strategies, orchestrator,\n * and fallback consume at runtime.\n *\n * Responsibilities:\n *\n * 1. Apply defaults for every field. The defaults (enabled = false,\n * attribute = `data-amp-track-id`, built-in pattern packs) match the\n * design doc's \"v1 defaults\" table.\n *\n * 2. Compile regex strings into `RegExp[]`. Bad regexes are skipped by the\n * underlying `compile` helpers; when a logger is provided it surfaces a\n * warning for each invalid pattern so customers can diagnose why their\n * override isn't taking effect.\n *\n * 3. Treat customer-provided pattern lists as a **full replacement** of the\n * defaults — not a merge. This matches the design doc: \"The customer\n * sees the defaults in the remote-config UI and may add or remove\n * patterns as needed.\" If a customer provides `autogeneratedIdPatterns:\n * []`, that's their explicit request to disable autogen filtering.\n *\n * 4. Clamp `maxAncestorWalkDepth` into a sane range. Negative / zero values\n * are coerced to `undefined` (treat as \"no limit\") rather than throwing —\n * remote config should never crash the engine.\n *\n * See the design doc:\n * packages/plugin-autocapture-browser/element-selector-strategy-v1-no-classes.md\n */\n\nimport { ElementSelectorLogger, ElementSelectorRemoteConfig, ResolvedSelectorConfig } from '../types';\nimport {\n DEFAULT_AUTOGENERATED_ID_PATTERNS,\n compile as compileAutogeneratedIdPatterns,\n} from '../patterns/autogenerated-ids';\nimport { DEFAULT_UNSTABLE_CLASS_PATTERNS, compile as compileUnstableClassPatterns } from '../patterns/unstable-classes';\n\n/**\n * Built-in defaults applied when a field is absent from the remote payload.\n * Exported so consumers (and tests) can introspect the baseline without\n * round-tripping through `resolveSelectorConfig({})`.\n */\nexport const DEFAULT_RESOLVED_CONFIG: Readonly<ResolvedSelectorConfig> = Object.freeze({\n // v1 ships disabled — autocapture only flips to the new engine when the\n // remote config explicitly enables it for an org.\n enabled: false,\n explicitTrackingAttribute: 'data-amp-track-id',\n autogeneratedIdPatterns: [...DEFAULT_AUTOGENERATED_ID_PATTERNS],\n unstableClassPatterns: [...DEFAULT_UNSTABLE_CLASS_PATTERNS],\n maxAncestorWalkDepth: undefined,\n});\n\n/**\n * Resolve a (possibly partial, possibly absent) remote-config payload into a\n * fully-typed runtime config. Always returns a fresh object; never mutates the\n * input.\n *\n * Field-by-field semantics:\n *\n * - `enabled`: defaults to false (the engine ships dormant). Any boolean in\n * the payload — including `false` — wins.\n * - `explicitTrackingAttribute`: defaults to `data-amp-track-id`. Empty\n * strings are rejected (they'd make the strategy match every element);\n * fall back to the default in that case.\n * - `autogeneratedIdPatterns` / `unstableClassPatterns`: present → compile\n * the strings (skipping invalid regexes), use the compiled list as-is.\n * Absent → use the defaults.\n * - `maxAncestorWalkDepth`: positive finite integer → use as-is. Anything\n * else (zero, negative, NaN, Infinity) → `undefined` (no limit).\n */\nexport function resolveSelectorConfig(\n remote?: ElementSelectorRemoteConfig,\n logger?: ElementSelectorLogger,\n): ResolvedSelectorConfig {\n if (!remote) {\n // Return a fresh copy so callers can safely mutate the result without\n // poisoning the frozen defaults singleton.\n return cloneDefaults();\n }\n\n const resolved: ResolvedSelectorConfig = cloneDefaults();\n\n if (typeof remote.enabled === 'boolean') {\n resolved.enabled = remote.enabled;\n }\n\n if (typeof remote.explicitTrackingAttribute === 'string' && remote.explicitTrackingAttribute !== '') {\n resolved.explicitTrackingAttribute = remote.explicitTrackingAttribute;\n }\n\n if (Array.isArray(remote.autogeneratedIdPatterns)) {\n resolved.autogeneratedIdPatterns = compileAutogeneratedIdPatterns(remote.autogeneratedIdPatterns, logger);\n }\n\n if (Array.isArray(remote.unstableClassPatterns)) {\n resolved.unstableClassPatterns = compileUnstableClassPatterns(remote.unstableClassPatterns, logger);\n }\n\n resolved.maxAncestorWalkDepth = clampDepth(remote.maxAncestorWalkDepth);\n\n return resolved;\n}\n\n/**\n * Coerce a remote-supplied depth value into the runtime contract:\n * - undefined / non-number / NaN / Infinity / <= 0 → undefined (no limit)\n * - positive finite number → floor()'d integer\n */\nfunction clampDepth(depth: number | undefined): number | undefined {\n if (typeof depth !== 'number') return undefined;\n if (!Number.isFinite(depth)) return undefined;\n if (depth <= 0) return undefined;\n return Math.floor(depth);\n}\n\nfunction cloneDefaults(): ResolvedSelectorConfig {\n return {\n enabled: DEFAULT_RESOLVED_CONFIG.enabled,\n explicitTrackingAttribute: DEFAULT_RESOLVED_CONFIG.explicitTrackingAttribute,\n autogeneratedIdPatterns: [...DEFAULT_RESOLVED_CONFIG.autogeneratedIdPatterns],\n unstableClassPatterns: [...DEFAULT_RESOLVED_CONFIG.unstableClassPatterns],\n maxAncestorWalkDepth: DEFAULT_RESOLVED_CONFIG.maxAncestorWalkDepth,\n };\n}\n","import { ElementSelectorLogger } from '../types';\n\n/**\n * Unstable-class pattern pack.\n *\n * The fallback walker filters classes through these regexes before adding them\n * to a selector. Classes that match are dropped — they don't participate in\n * sibling disambiguation and never appear in the emitted output. Defends\n * against three failure modes:\n *\n * 1. Build-tool / framework utilities (Tailwind, etc.) — class names that\n * look stable but change with every design tweak.\n * 2. CSS-in-JS / build-hash classes (Emotion, CSS modules, styled-components,\n * styled-jsx) — change on every build.\n * 3. Library runtime state classes (Swiper, MUI, Radix, Headless UI,\n * BEM-style is-active/is-open) — class is stable in name but its presence\n * on a given element moves as the user interacts.\n *\n * Defaults are surfaced to customers in remote config so they can audit what's\n * being filtered and add or remove patterns to match their stack.\n */\n\n/**\n * Built-in defaults grouped by category for readability. The runtime treats\n * the whole list uniformly via `Array.prototype.some(pattern.test)`.\n */\nexport const DEFAULT_UNSTABLE_CLASS_PATTERNS: ReadonlyArray<RegExp> = [\n // ===== Tailwind / build-tool utilities =====\n\n // Tailwind spacing: p-4, px-2, py-8, pt-1, mt-4, etc.\n /^(p|m|px|py|mx|my|pt|pb|pl|pr|mt|mb|ml|mr)-\\d+$/,\n // Tailwind sizing: w-full, h-screen, max-w-[1440px], etc.\n /^(w|h|min-w|max-w|min-h|max-h)-/,\n // Tailwind color / visual: bg-blue-500, text-white, border-gray-200, ring-2, etc.\n /^(text|bg|border|ring|fill|stroke)-/,\n // Tailwind state variants: hover:underline, focus:ring-2, active:bg-transparent.\n /^(hover|focus|active|disabled|group-hover):/,\n // Tailwind breakpoint variants: md:flex, lg:grid-cols-3.\n /^(sm|md|lg|xl|2xl):/,\n // Tailwind z-index utility: z-10, z-50.\n /^z-\\d+$/,\n // Tailwind arbitrary data-attribute variants: data-[state=open]:bg-white.\n /^data-\\[/,\n // Tailwind arbitrary selector variants: [&_.swiper-slide]:h-auto, [&>div]:p-4.\n /^\\[/,\n\n // ===== CSS-in-JS / build hashes =====\n\n // Emotion: css-1abcd23, css-9xyzkw0.\n /^css-[a-z0-9]{6,}$/,\n // CSS modules: Button_root__abc123, Card_container__xyz789. The middle\n // segment can be as short as `root` (4 chars) in practice; the trailing\n // hash is the load-bearing part.\n /^[a-zA-Z]+_[a-zA-Z0-9]{3,}__[a-zA-Z0-9]{5,}$/,\n // styled-components: sc-bdVaJa, sc-1jjuPXC0.\n /^sc-[a-zA-Z0-9]{6,}$/,\n // styled-jsx (Next.js): jsx-1234567.\n /^jsx-\\d+$/,\n\n // ===== Library runtime state classes =====\n\n // Swiper carousel slide states. Move between elements as carousel advances.\n /^swiper-slide-(visible|fully-visible|active|prev|next|duplicate)$/,\n // BEM-style interaction state: is-active, is-open, is-selected, etc.\n /^is-(active|open|selected|hovered|focused|expanded)$/,\n // MUI per-component state: MuiButton-focusVisible, MuiSwitch-checked, etc.\n /^Mui[A-Z][a-zA-Z]+-(focused|selected|disabled|expanded|focusVisible|active|checked)$/,\n // MUI bare state classes: Mui-selected, Mui-disabled.\n /^Mui-(selected|focused|disabled|expanded|focusVisible|active|checked)$/,\n // Radix-style state class mirrors: data-state-open, data-state-checked.\n /^data-state-/,\n];\n\n/**\n * Compile a list of regex pattern strings (e.g. from a remote-config payload)\n * into RegExp objects. Invalid patterns are skipped (not thrown) so a single\n * bad regex in remote config can't crash the engine.\n *\n * Pass `logger` to surface invalid patterns at `warn` level — useful for\n * diagnosing why a customer's override isn't taking effect.\n *\n * Callers decide whether to merge the result with `DEFAULT_UNSTABLE_CLASS_PATTERNS`\n * or use it as a full replacement. That policy lives in the config resolver,\n * not here.\n */\nexport function compile(patterns: string[], logger?: ElementSelectorLogger): RegExp[] {\n const compiled: RegExp[] = [];\n for (const pattern of patterns) {\n try {\n compiled.push(new RegExp(pattern));\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n logger?.warn(`@amplitude/element-selector: ignoring invalid unstable-class pattern \"${pattern}\" (${message})`);\n }\n }\n return compiled;\n}\n\n/**\n * Filter a list of class names, dropping any that match a pattern. Returns a\n * new array containing only the survivors, preserving original order.\n *\n * Used by the fallback walker (in the next PR) before adding classes to a\n * selector for sibling disambiguation. Also returns sensibly on null /\n * undefined / empty inputs.\n */\nexport function filterClasses(classes: string[], patterns: ReadonlyArray<RegExp>): string[] {\n if (!classes || classes.length === 0) return [];\n const survivors: string[] = [];\n for (const cls of classes) {\n if (!cls) continue;\n let matched = false;\n for (const pattern of patterns) {\n if (pattern.test(cls)) {\n matched = true;\n break;\n }\n }\n if (!matched) survivors.push(cls);\n }\n return survivors;\n}\n","/**\n * Engine factory — composes the strategy chain (via `runOrchestrator`) with\n * the safety-net fallback (`fallbackCssPath`) behind a single `SelectorEngine`\n * interface.\n *\n * This is the surface every consumer talks to:\n *\n * - autocapture SDK plugin → instantiates one engine per init() call,\n * wires it into the click handler, and forwards remote-config updates\n * via `updateConfig`.\n * - app.amplitude.com tagging UI → fetches the customer's remote config\n * out-of-band and stands up a transient engine to compute selectors for\n * elements the user clicks in the iframe.\n * - Chrome extension visual tagger → reads the customer's already-live\n * engine off `window.amplitude.elementSelector` (when present) and\n * subscribes to `onConfigChange` so the extension's preview stays in\n * sync with the customer's runtime config.\n *\n * The factory deliberately takes a pre-resolved `ResolvedSelectorConfig` rather\n * than the raw remote payload — config resolution is a separate concern handled\n * by `resolveSelectorConfig`, and keeping it out of the engine constructor lets\n * dashboard / extension consumers stand up an engine from a static snapshot\n * without re-running the full resolver.\n *\n * See the design doc:\n * packages/plugin-autocapture-browser/element-selector-strategy-v1-no-classes.md\n */\n\nimport { ElementSelectorLogger, ResolvedSelectorConfig, SelectorEngine } from './types';\nimport { runOrchestrator, OrchestratorOptions } from './orchestrator';\nimport { fallbackCssPath } from './fallback-css-path';\nimport { legacyCssPath } from './legacy-css-path';\n\nexport interface CreateSelectorEngineOptions {\n /** Optional document or shadow root for uniqueness checks. Defaults per-call to the target's owner document. */\n scope?: ParentNode;\n /** Optional override of the strategy chain. Primarily for testing / dashboard ad-hoc runs. */\n strategies?: OrchestratorOptions['strategies'];\n /**\n * Optional logger threaded through the orchestrator and the subscriber-fan-out\n * inside `updateConfig`. When provided, the engine surfaces malformed\n * selectors (`debug`) and listener exceptions (`warn`); when absent it stays\n * silent — preserving the legacy \"fire-and-forget\" semantics existing\n * consumers may rely on.\n */\n logger?: ElementSelectorLogger;\n}\n\n/**\n * Build a `SelectorEngine` bound to the supplied config.\n *\n * The returned engine is independent — calling the factory twice yields two\n * engines with separate config state and separate subscriber lists. This is the\n * shape the autocapture plugin wants (one engine per SDK instance) and the\n * shape the Chrome extension consumes off the page (the extension reads, never\n * writes).\n */\nexport function createSelectorEngine(\n initialConfig: ResolvedSelectorConfig,\n options: CreateSelectorEngineOptions = {},\n): SelectorEngine {\n let config: ResolvedSelectorConfig = initialConfig;\n const subscribers = new Set<(config: ResolvedSelectorConfig) => void>();\n const logger = options.logger;\n\n const orchestratorOptions: OrchestratorOptions = {\n strategies: options.strategies,\n scope: options.scope,\n logger,\n };\n\n return {\n generate(el: Element): string {\n // Kill switch: when the customer's remote config has the engine\n // disabled (the default for orgs that haven't opted in), emit the same\n // Chromium-derived selector autocapture has shipped since before the\n // strategy chain existed. This is what makes \"flip enabled back to\n // false\" a one-config-fetch revert for both the SDK and the dashboard —\n // they both go through this entry point now.\n if (!config.enabled) {\n return safeLegacyCssPath(el);\n }\n\n // Engine path: try the strategy chain, then the hardened fallback. Both\n // are wrapped so a runtime exception (malformed config slipped past the\n // resolver, browser API quirks, a bad scope) still produces a usable\n // selector. Without this, an autocapture click handler could throw\n // mid-flow and the customer would silently lose the event — a worse\n // outcome than emitting a less-stable selector.\n try {\n const composed = runOrchestrator(el, config, orchestratorOptions);\n if (composed !== null) {\n return composed;\n }\n return fallbackCssPath(el, config, { scope: options.scope ?? el.ownerDocument ?? document });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n logger?.warn(`@amplitude/element-selector: strategy chain threw — falling back to legacy cssPath: ${message}`);\n return safeLegacyCssPath(el);\n }\n },\n\n getConfig(): Readonly<ResolvedSelectorConfig> {\n return config;\n },\n\n updateConfig(next: ResolvedSelectorConfig): void {\n config = next;\n // Notify subscribers in insertion order. Errors thrown by individual\n // subscribers are isolated so one bad listener can't break the others —\n // the extension's listener is the canonical consumer here and we don't\n // want SDK-side changes to cascade-fail because of an extension bug.\n for (const cb of subscribers) {\n try {\n cb(next);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n logger?.warn(`@amplitude/element-selector: onConfigChange subscriber threw — ${message}`);\n }\n }\n },\n\n onConfigChange(cb: (config: ResolvedSelectorConfig) => void): () => void {\n subscribers.add(cb);\n return () => {\n subscribers.delete(cb);\n };\n },\n };\n\n // Local wrapper so a thrown error in the legacy walker (extremely unlikely\n // — Element inputs only — but defensible if a host environment is missing\n // `CSS.escape` or `Node` constants) doesn't escape `generate` and crash the\n // caller. Returns the empty string in that pathological case; consumers\n // already coalesce empty results to a sentinel.\n function safeLegacyCssPath(el: Element): string {\n try {\n return legacyCssPath(el);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n logger?.warn(`@amplitude/element-selector: legacyCssPath threw — emitting empty selector: ${message}`);\n return '';\n }\n }\n}\n","/**\n * Top-level chokepoint for \"generate a selector for this element.\"\n *\n * Both the SDK plugin (`plugin-autocapture-browser`) and the dashboard\n * (`session-replay-ui`) used to maintain their own copy of this routing logic:\n *\n * if (config.enabled && engine) return engine.generate(el);\n * else return cssPath(el, false);\n *\n * Two consumers, two routers, two locally-bundled copies of `cssPath`. As soon\n * as we considered a third consumer (Chrome extension visual tagger, future\n * tagging surfaces) the duplication became untenable — bug fixes had to land\n * three places and the kill-switch semantics could drift between them.\n *\n * Moving the kill switch inside `engine.generate` covered the \"engine present\"\n * case. This helper covers the remaining \"engine is null\" case that some\n * consumers genuinely have:\n *\n * - dashboard's `useElementSelectorEngineContext()` returns\n * `{ engine: null }` when no provider is mounted (tests, content-renderer\n * paths, future call sites outside the canonical mount tree).\n * - Chrome extension boots before the customer's SDK has stood up an engine\n * on the page; reads `null` from `window.amplitude.elementSelector` until\n * the SDK init finishes.\n *\n * In those cases, callers want the legacy `cssPath` selector — same shape the\n * SDK is emitting in production for orgs without the engine. This helper makes\n * that explicit and centralizes the rule so future consumers don't reinvent\n * it.\n */\n\nimport { ResolvedSelectorConfig, SelectorEngine } from './types';\nimport { legacyCssPath } from './legacy-css-path';\n\n/**\n * Generate a selector for `el`, transparently routing to the legacy\n * `cssPath` walker when no engine is available.\n *\n * Why this signature (engine + config separately, rather than just engine):\n * the dashboard's inert context has `engine: null` but still carries a\n * resolved config. Both `null`-engine and engine-with-`enabled: false`\n * collapse to \"legacy `cssPath`\", and we want the same one-line call site\n * to handle both. When the engine *is* present, this just delegates — the\n * engine's own kill switch handles `enabled === false`.\n *\n * Never throws. Returns the empty string in the pathological case where the\n * legacy walker itself can't produce one (non-element nodes; environments\n * missing `CSS.escape`).\n *\n * @param el DOM element to identify.\n * @param engine Live `SelectorEngine`, or `null` when no engine is mounted.\n * @param config Resolved selector config. Only consulted in the null-engine\n * branch; when `engine` is present, the engine consults its\n * own internal config.\n */\nexport const generateSelector = (\n el: Element,\n engine: SelectorEngine | null,\n config: ResolvedSelectorConfig,\n): string => {\n if (engine) {\n // The engine has its own kill switch (`config.enabled === false` →\n // legacy cssPath) and its own try/catch safety net. Trust it.\n return engine.generate(el);\n }\n // Engine-null branch. We don't have a live engine to consult, so we route\n // straight to the legacy walker — the same selector the SDK would be\n // emitting if `config.enabled === false`. `config` is accepted for symmetry\n // with the engine signature and so future versions can extend behavior\n // without a breaking change.\n void config;\n try {\n return legacyCssPath(el);\n } catch {\n return '';\n }\n};\n","/* eslint-disable no-restricted-globals */\nimport {\n ElementInteractionsOptions,\n ActionType,\n getDecodeURI,\n IDiagnosticsClient,\n MASKED_TEXT_VALUE,\n TEXT_MASK_ATTRIBUTE,\n getPageTitle,\n replaceSensitiveString,\n} from '@amplitude/analytics-core';\nimport type { DataSource } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport type { SelectorEngine } from '@amplitude/element-selector';\nimport * as constants from './constants';\nimport {\n removeEmptyProperties,\n extractPrefixedAttributes,\n isElementPointerCursor,\n getClosestElement,\n isElementBasedEvent,\n parseAttributesToMask,\n getCurrentPageViewId,\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';\nimport { DEFAULT_RESOLVED_CONFIG, generateSelector } from '@amplitude/element-selector';\n\nexport class DataExtractor {\n private readonly additionalMaskTextPatterns: RegExp[];\n diagnosticsClient?: IDiagnosticsClient;\n\n /**\n * Optional v1 selector engine. When set AND `engine.getConfig().enabled` is\n * true, `getElementPath()` routes through the v1 engine instead of the\n * legacy positional `cssPath`. When the engine is absent or its `enabled`\n * flag is false, this is a no-op and selector emission is byte-identical to\n * pre-integration behavior.\n *\n * The engine is set after construction (via `setSelectorEngine`) because\n * it depends on `config.loggerProvider` and `config.remoteConfigClient`,\n * which only become available in the plugin's async `setup()` flow.\n */\n private selectorEngine?: SelectorEngine;\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 /**\n * Attach (or replace) the v1 selector engine. Called by the autocapture\n * plugin's `setup()` once `config.loggerProvider` / `remoteConfigClient`\n * are available; the engine is shared (not copied) so subsequent\n * `engine.updateConfig(...)` calls driven by remote config take effect on\n * the very next selector emission with no additional plumbing.\n */\n setSelectorEngine = (engine: SelectorEngine | undefined): void => {\n this.selectorEngine = engine;\n };\n\n getElementPath = (element: Element | null): string => {\n if (!element) {\n return '';\n }\n const startTime = performance.now();\n\n // All routing — engine vs. legacy `cssPath`, plus the strategy-chain\n // safety net — lives inside `@amplitude/element-selector` now. We pass\n // the engine if we have one (any value of `getConfig().enabled`; the\n // engine itself handles the kill switch internally) and `null` when\n // we don't (frustration-plugin code path, pre-setup, remote-config\n // never loaded). In the null branch, `generateSelector` calls\n // `legacyCssPath` directly, byte-identical to the pre-integration\n // behavior.\n //\n // The `DEFAULT_RESOLVED_CONFIG` passed here is only consulted on the\n // null-engine branch where it functions as a placeholder; when the\n // engine is present, the engine's own internal config wins.\n const elementPath = generateSelector(element, this.selectorEngine ?? null, DEFAULT_RESOLVED_CONFIG);\n\n const endTime = performance.now();\n this.diagnosticsClient?.recordHistogram('autocapturePlugin.getElementPath', endTime - startTime);\n\n return elementPath;\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_PATH]: this.getElementPath(element),\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 const pageViewId = getCurrentPageViewId();\n /* istanbul ignore next */\n if (pageViewId) {\n /* istanbul ignore next */\n properties[constants.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID] = pageViewId;\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_EXPOSURE_DURATION,\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 { trackScroll } from './autocapture/track-scroll';\n\nimport {\n createClickObservable,\n createScrollObservable,\n createExposureObservable,\n createMutationObservable,\n} 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';\nimport {\n createSelectorEngine,\n resolveSelectorConfig,\n type ElementSelectorRemoteConfig,\n type ResolvedSelectorConfig,\n type SelectorEngine,\n} from '@amplitude/element-selector';\nimport { trackExposure } from './autocapture/track-exposure';\nimport { fireViewportContentUpdated, onExposure, ExposureTracker } from './autocapture/track-viewport-content-updated';\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>;\ntype ElementSelectorPublicSurface = {\n generate: (el: Element) => string;\n getConfig: () => Readonly<ResolvedSelectorConfig>;\n onConfigChange: (cb: (config: ResolvedSelectorConfig) => void) => () => void;\n};\ntype BrowserClientWithElementSelector = BrowserClient & { elementSelector?: unknown };\ntype RemoteConfigCallback = Parameters<NonNullable<BrowserConfig['remoteConfigClient']>['subscribe']>[2];\n\nconst subscribeRemoteConfig = (\n config: BrowserConfig,\n key: string,\n callback: RemoteConfigCallback,\n): Unsubscribable | undefined => {\n const remoteConfigClient = config.remoteConfigClient;\n if (!remoteConfigClient) {\n return undefined;\n }\n const subscriptionId = remoteConfigClient.subscribe(key, 'all', callback);\n return {\n unsubscribe: () => {\n remoteConfigClient.unsubscribe(subscriptionId);\n },\n };\n};\n\nconst attachElementSelectorSurface = (amplitude: BrowserClient, selectorEngine: SelectorEngine): Unsubscribable => {\n // Expose a narrowed, read-only surface of the engine on the customer's\n // BrowserClient instance so downstream consumers can use the same engine the\n // SDK is running. Attach to the instance, not window.amplitude, so custom\n // global names and multiple SDK instances do not clobber each other.\n const elementSelectorClient = amplitude as BrowserClientWithElementSelector;\n const hadPreviousElementSelector = Object.prototype.hasOwnProperty.call(elementSelectorClient, 'elementSelector');\n const previousElementSelector = elementSelectorClient.elementSelector;\n const elementSelectorSurface: ElementSelectorPublicSurface = {\n generate: (el: Element): string => selectorEngine.generate(el),\n getConfig: () => selectorEngine.getConfig(),\n onConfigChange: (cb: (config: ResolvedSelectorConfig) => void): (() => void) => selectorEngine.onConfigChange(cb),\n };\n /* istanbul ignore next */\n elementSelectorClient.elementSelector = elementSelectorSurface;\n\n return {\n unsubscribe: () => {\n if (hadPreviousElementSelector) {\n elementSelectorClient.elementSelector = previousElementSelector;\n } else {\n delete elementSelectorClient.elementSelector;\n }\n },\n };\n};\n\nconst setupElementSelector = (\n config: BrowserConfig,\n amplitude: BrowserClient,\n dataExtractor: DataExtractor,\n): Unsubscribable[] => {\n const subscriptions: Unsubscribable[] = [];\n\n // Construct the engine eagerly with defaults so `dataExtractor.getElementPath`\n // can route through it from the first emission. When `enabled` is false in\n // the resolved config (the default), `getElementPath` falls back to the\n // legacy `cssPath` algorithm.\n const initialSelectorConfig = resolveSelectorConfig(undefined, config.loggerProvider);\n const selectorEngine = createSelectorEngine(initialSelectorConfig, { logger: config.loggerProvider });\n dataExtractor.setSelectorEngine(selectorEngine);\n\n subscriptions.push(attachElementSelectorSurface(amplitude, selectorEngine));\n\n if (config.fetchRemoteConfig) {\n const elementSelectorSubscription = subscribeRemoteConfig(\n config,\n 'configs.analyticsSDK.autocapture.elementSelector',\n (remoteSelectorConfig) => {\n const nextResolved = resolveSelectorConfig(\n remoteSelectorConfig as ElementSelectorRemoteConfig | undefined,\n config.loggerProvider,\n );\n selectorEngine.updateConfig(nextResolved);\n },\n );\n if (elementSelectorSubscription) {\n subscriptions.push(elementSelectorSubscription);\n }\n }\n\n return subscriptions;\n};\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 NavigateObservable = 'navigateObservable',\n MutationObservable = 'mutationObservable',\n ScrollObservable = 'scrollObservable',\n ExposureObservable = 'exposureObservable',\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.ScrollObservable]: Observable<Event>; // TODO: add type for scroll event\n [ObservablesEnum.ExposureObservable]: Observable<Event>;\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 const isViewportContentUpdatedEnabled = options.viewportContentUpdated?.enabled !== false;\n const resolvedExposureDuration =\n options.viewportContentUpdated?.exposureDuration ?? options.exposureDuration ?? DEFAULT_EXPOSURE_DURATION;\n options.viewportContentUpdated = {\n ...options.viewportContentUpdated,\n exposureDuration: resolvedExposureDuration,\n };\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 const dataExtractor = new DataExtractor(options, context);\n\n // Page-level state shared across trackers, emitted in a single Page View End event on beforeunload\n // elementExposedForPage holds the total set of elements seen during the entire page view lifetime\n const elementExposedForPage = new Set<string>();\n // currentElementExposed only holds the set of elements that will be flushed during the next [Amplitude] Viewport Content Updated event\n const currentElementExposed = new Set<string>();\n\n let beforeUnloadCleanup: () => void;\n\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 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 const scrollObservable = createScrollObservable();\n\n const exposureObservable = createExposureObservable(\n mutationObservable,\n (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,\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 [ObservablesEnum.ScrollObservable]: scrollObservable,\n [ObservablesEnum.ExposureObservable]: exposureObservable,\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 let pageViewEndFired = false;\n const lastScroll: { maxX: undefined | number; maxY: undefined | number } = { maxX: undefined, maxY: undefined };\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 const pageActionsSubscription = subscribeRemoteConfig(\n config,\n 'configs.analyticsSDK.pageActions',\n (remoteConfig) => {\n recomputePageActionsData(remoteConfig as ElementInteractionsOptions['pageActions']);\n },\n );\n if (pageActionsSubscription) {\n subscriptions.push(pageActionsSubscription);\n }\n }\n }\n\n subscriptions.push(...setupElementSelector(config, amplitude, dataExtractor));\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 const scrollTracker = trackScroll({\n allObservables,\n amplitude,\n });\n subscriptions.push(scrollTracker);\n\n const trackers: { exposure?: ExposureTracker & Unsubscribable } = {};\n\n const globalScope = getGlobalScope();\n\n const handleViewportContentUpdated = (isPageEnd: boolean) => {\n if (isPageEnd && pageViewEndFired) {\n return;\n }\n setTimeout(() => {\n pageViewEndFired = false;\n }, 100);\n\n pageViewEndFired = true;\n fireViewportContentUpdated({\n amplitude,\n scrollTracker,\n currentElementExposed,\n elementExposedForPage,\n exposureTracker: trackers.exposure,\n isPageEnd,\n lastScroll,\n });\n };\n\n const handleExposure = (elementPath: string) => {\n onExposure(elementPath, elementExposedForPage, currentElementExposed, handleViewportContentUpdated);\n };\n\n if (isViewportContentUpdatedEnabled) {\n trackers.exposure = trackExposure({\n allObservables,\n onExposure: handleExposure,\n dataExtractor,\n exposureDuration: resolvedExposureDuration,\n });\n if (trackers.exposure) {\n subscriptions.push(trackers.exposure);\n }\n\n const beforeUnloadHandler = () => {\n handleViewportContentUpdated(true);\n };\n /* istanbul ignore next */\n globalScope?.addEventListener('beforeunload', beforeUnloadHandler);\n beforeUnloadCleanup = () => {\n /* istanbul ignore next */\n globalScope?.removeEventListener('beforeunload', beforeUnloadHandler);\n };\n // Ensure cleanup on teardown as well\n subscriptions.push({ unsubscribe: () => beforeUnloadCleanup() });\n\n // Also track on navigation (SPA)\n const navigateObservable = allObservables[ObservablesEnum.NavigateObservable];\n if (navigateObservable) {\n subscriptions.push(\n navigateObservable.subscribe(() => {\n handleViewportContentUpdated(true);\n }),\n );\n } else if (globalScope) {\n const popstateHandler = () => {\n handleViewportContentUpdated(true);\n };\n /* istanbul ignore next */\n // Fallback for SPA tracking when Navigation API is not available\n globalScope.addEventListener('popstate', popstateHandler);\n\n /* istanbul ignore next */\n // There is no global browser listener for changes to history, so we have\n // to modify pushState directly.\n // https://stackoverflow.com/a/64927639\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalPushState = globalScope.history.pushState;\n if (globalScope.history && originalPushState) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n globalScope.history.pushState = new Proxy(originalPushState, {\n apply: (target, thisArg, [state, unused, url]) => {\n target.apply(thisArg, [state, unused, url]);\n handleViewportContentUpdated(true);\n },\n });\n }\n\n subscriptions.push({\n unsubscribe: () => {\n /* istanbul ignore next */\n globalScope.removeEventListener('popstate', popstateHandler);\n /* istanbul ignore next */\n if (globalScope.history && originalPushState) {\n globalScope.history.pushState = originalPushState;\n }\n },\n });\n }\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, type 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: ElementBasedTimestampedEvent<MouseEvent>) => {\n // Only track clicks on elements that should be tracked,\n return shouldTrackEvent('click', click.closestTrackedAncestor);\n })\n .map((click: ElementBasedTimestampedEvent<MouseEvent>) => 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 '../autocapture-plugin';\nimport { BrowserClient, getGlobalScope } from '@amplitude/analytics-core';\n\nexport interface ScrollState {\n maxX: number;\n maxY: number;\n}\n\nexport function trackScroll({\n amplitude,\n allObservables,\n}: {\n amplitude: BrowserClient;\n allObservables: AllWindowObservables;\n}) {\n // amplitude is reserved for future periodic scroll event tracking\n void amplitude;\n\n const { scrollObservable } = allObservables;\n const state: ScrollState = { maxX: 0, maxY: 0 };\n\n const scrollSubscription = scrollObservable.subscribe(() => {\n const globalScope = getGlobalScope();\n /* istanbul ignore next */\n const currentX = Math.floor(globalScope?.scrollX ?? globalScope?.pageXOffset ?? 0);\n /* istanbul ignore next */\n const currentY = Math.floor(globalScope?.scrollY ?? globalScope?.pageYOffset ?? 0);\n\n // Update page-level max positions for Page View End event (never resets during page lifetime)\n state.maxX = Math.max(state.maxX, currentX);\n state.maxY = Math.max(state.maxY, currentY);\n });\n\n return {\n unsubscribe: () => {\n scrollSubscription.unsubscribe();\n },\n getState: () => state,\n reset: () => {\n state.maxX = 0;\n state.maxY = 0;\n },\n };\n}\n","import { BrowserClient, getDecodeURI, getGlobalScope } from '@amplitude/analytics-core';\nimport * as constants from '../constants';\nimport { getCurrentPageViewId } from '../helpers';\n\nexport interface ScrollTracker {\n getState: () => { maxX: number; maxY: number };\n reset: () => void;\n}\n\nexport interface ExposureTracker {\n reset: () => void;\n}\n\nexport function fireViewportContentUpdated({\n amplitude,\n scrollTracker,\n currentElementExposed,\n elementExposedForPage,\n exposureTracker,\n isPageEnd,\n lastScroll,\n}: {\n amplitude: BrowserClient;\n scrollTracker: ScrollTracker;\n currentElementExposed: Set<string>;\n elementExposedForPage: Set<string>;\n exposureTracker: ExposureTracker | undefined;\n isPageEnd: boolean;\n lastScroll: { maxX: undefined | number; maxY: undefined | number };\n}): void {\n const pageScrollMaxState = scrollTracker.getState();\n const globalScope = getGlobalScope();\n\n /* istanbul ignore next */\n const viewportWidth = globalScope?.innerWidth ?? 0;\n /* istanbul ignore next */\n const viewportHeight = globalScope?.innerHeight ?? 0;\n\n const eventProperties: Record<string, unknown> = {\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: getDecodeURI(\n /* istanbul ignore next */\n globalScope?.location?.href?.split('?')[0] ?? '',\n ),\n [constants.AMPLITUDE_EVENT_PROP_MAX_PAGE_X]: pageScrollMaxState.maxX + viewportWidth,\n [constants.AMPLITUDE_EVENT_PROP_MAX_PAGE_Y]: pageScrollMaxState.maxY + viewportHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT]: viewportHeight,\n [constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH]: viewportWidth,\n '[Amplitude] Element Exposed': Array.from(currentElementExposed),\n };\n\n const pageViewId = getCurrentPageViewId();\n if (pageViewId) {\n eventProperties[constants.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID] = pageViewId;\n }\n\n // If elements exposed is empty and max scroll is same as last event, don't track\n if (\n currentElementExposed.size === 0 &&\n pageScrollMaxState.maxX === lastScroll.maxX &&\n pageScrollMaxState.maxY === lastScroll.maxY\n ) {\n if (isPageEnd) {\n scrollTracker.reset();\n elementExposedForPage.clear();\n exposureTracker?.reset();\n }\n return;\n }\n\n /* istanbul ignore next */\n amplitude?.track('[Amplitude] Viewport Content Updated', eventProperties);\n lastScroll.maxX = pageScrollMaxState.maxX;\n lastScroll.maxY = pageScrollMaxState.maxY;\n\n // Clear current batch\n currentElementExposed.clear();\n\n if (isPageEnd) {\n // Reset state for next page view\n scrollTracker.reset();\n elementExposedForPage.clear();\n exposureTracker?.reset();\n }\n}\n\nexport function onExposure(\n elementPath: string,\n elementExposedForPage: Set<string>,\n currentElementExposed: Set<string>,\n fireViewportContentUpdatedCallback: (isPageEnd: boolean) => void,\n) {\n if (elementExposedForPage.has(elementPath)) {\n return;\n }\n elementExposedForPage.add(elementPath);\n currentElementExposed.add(elementPath);\n\n // Check if current set size exceeds 18k chars\n const exposedArray = Array.from(currentElementExposed);\n const exposedString = JSON.stringify(exposedArray);\n\n if (exposedString.length >= constants.MAX_ELEMENT_EXPOSED_STR_LENGTH) {\n fireViewportContentUpdatedCallback(false);\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport { DEFAULT_EXPOSURE_DURATION } from '@amplitude/analytics-core';\nimport { AllWindowObservables } from '../autocapture-plugin';\nimport { DataExtractor } from '../data-extractor';\n\nexport function trackExposure({\n allObservables,\n onExposure,\n dataExtractor,\n exposureDuration = DEFAULT_EXPOSURE_DURATION,\n}: {\n allObservables: AllWindowObservables;\n onExposure: (elementPath: string) => void;\n dataExtractor: DataExtractor;\n exposureDuration?: number;\n}) {\n // Track which elements have been marked as exposed (per-element state)\n const exposureMap = new Map<Element, boolean>();\n\n // Track active timers for elements that are currently visible but not yet exposed\n const exposureTimerMap = new Map<Element, ReturnType<typeof setTimeout> | null | undefined>();\n\n const { exposureObservable } = allObservables;\n\n const exposureSubscription = exposureObservable.subscribe((event) => {\n const entry = event as unknown as IntersectionObserverEntry;\n const element = entry.target;\n\n if (entry.isIntersecting) {\n // Element became visible - start exposure timer if not already exposed\n if (!exposureMap.get(element)) {\n const timer = setTimeout(() => {\n // Element has been visible for exposureDuration - mark as exposed\n exposureMap.set(element, true);\n\n // Record the CSS selector path in the shared exposure state\n const elementPath = dataExtractor.getElementPath(element);\n onExposure(elementPath);\n\n // Clear the timer reference\n exposureTimerMap.set(element, null);\n }, exposureDuration);\n\n exposureTimerMap.set(element, timer);\n }\n } else if (!entry.isIntersecting && entry.intersectionRatio < 1.0) {\n // Element left viewport - cancel exposure timer if one exists\n const timer = exposureTimerMap.get(element);\n if (timer) {\n clearTimeout(timer);\n exposureTimerMap.set(element, null);\n }\n }\n });\n\n return {\n unsubscribe: () => {\n exposureSubscription.unsubscribe();\n },\n reset: () => {\n exposureTimerMap.forEach((timer) => {\n if (timer) {\n clearTimeout(timer);\n }\n });\n exposureTimerMap.clear();\n exposureMap.clear();\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 = 20;\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","import { BrowserClient, ElementInteractionsOptions, PerformanceTrackingOptions } from '@amplitude/analytics-core';\nimport { AMPLITUDE_MAIN_THREAD_BLOCK_EVENT } from '../constants';\nimport { isUrlAllowed } from '../helpers';\n\nconst DEFAULT_DURATION_THRESHOLD = 100; // ms\nconst MEASURE_BUFFER_WINDOW_MS = 10_000;\n\n// LoAF and Long Task types are not yet in TypeScript's built-in DOM types\ninterface PerformanceScriptTiming extends PerformanceEntry {\n sourceURL: string;\n sourceFunctionName: string;\n // Character offset into the source URL's script where the function was defined.\n // Used downstream for sourcemap resolution. Optional because coverage varies\n // across browsers and entry origins (inline handlers, new Function, etc.).\n sourceCharPosition?: number;\n invokerType: string;\n invoker: string;\n}\n\ninterface PerformanceLongAnimationFrameTiming extends PerformanceEntry {\n renderStart: number;\n styleAndLayoutStart: number;\n blockingDuration: number;\n scripts: PerformanceScriptTiming[];\n}\n\ninterface TaskAttributionTiming extends PerformanceEntry {\n name: string;\n}\n\ninterface PerformanceLongTaskTiming extends PerformanceEntry {\n attribution: TaskAttributionTiming[];\n}\n\nfunction getOverlappingMeasures(entry: PerformanceEntry, measures: PerformanceEntry[]): string[] {\n const taskEnd = entry.startTime + entry.duration;\n return measures\n .filter((measure) => measure.startTime < taskEnd && measure.startTime + measure.duration > entry.startTime)\n .map((measure) => measure.name);\n}\n\nfunction buildLoAFProperties(entry: PerformanceLongAnimationFrameTiming, measures: PerformanceEntry[]) {\n const overlappingMeasures = getOverlappingMeasures(entry, measures);\n const scripts = entry.scripts ?? [];\n\n const scriptURLs = scripts.map((s) => s.sourceURL).filter(Boolean);\n const scriptFunctions = scripts.map((s) => s.sourceFunctionName).filter(Boolean);\n const scriptPositions = scripts\n .map((s) => s.sourceCharPosition)\n .filter((p): p is number => typeof p === 'number' && p >= 0);\n const invokerTypes = scripts.map((s) => s.invokerType).filter(Boolean);\n const invokers = scripts.map((s) => s.invoker).filter(Boolean);\n\n return {\n '[Amplitude] Main Thread Block Source': 'long-animation-frame',\n '[Amplitude] Main Thread Block Duration': entry.duration,\n '[Amplitude] Main Thread Block Blocking Duration': entry.blockingDuration,\n '[Amplitude] Main Thread Block Start Time': entry.startTime,\n ...(overlappingMeasures.length > 0 && { '[Amplitude] Main Thread Block Measures': overlappingMeasures }),\n '[Amplitude] Main Thread Block Render Start': entry.renderStart,\n '[Amplitude] Main Thread Block Style And Layout Start': entry.styleAndLayoutStart,\n '[Amplitude] Main Thread Block Script Count': scripts.length,\n ...(scriptURLs.length > 0 && { '[Amplitude] Main Thread Block Script URLs': scriptURLs }),\n ...(scriptFunctions.length > 0 && { '[Amplitude] Main Thread Block Script Functions': scriptFunctions }),\n ...(scriptPositions.length > 0 && { '[Amplitude] Main Thread Block Script Positions': scriptPositions }),\n ...(invokerTypes.length > 0 && { '[Amplitude] Main Thread Block Invoker Types': invokerTypes }),\n ...(invokers.length > 0 && { '[Amplitude] Main Thread Block Invokers': invokers }),\n };\n}\n\nfunction buildLongTaskProperties(entry: PerformanceLongTaskTiming, measures: PerformanceEntry[]) {\n const overlappingMeasures = getOverlappingMeasures(entry, measures);\n const attribution = entry.attribution ?? [];\n\n return {\n '[Amplitude] Main Thread Block Source': 'long-task',\n '[Amplitude] Main Thread Block Duration': entry.duration,\n '[Amplitude] Main Thread Block Blocking Duration': entry.duration,\n '[Amplitude] Main Thread Block Start Time': entry.startTime,\n ...(overlappingMeasures.length > 0 && { '[Amplitude] Main Thread Block Measures': overlappingMeasures }),\n ...(attribution.length > 0 && {\n '[Amplitude] Main Thread Block Attribution': attribution.map((a: TaskAttributionTiming) => a.name),\n }),\n };\n}\n\nfunction getSupportedEntryType(): 'long-animation-frame' | 'longtask' | null {\n /* istanbul ignore next */\n if (typeof PerformanceObserver === 'undefined') return null;\n try {\n const supported = PerformanceObserver.supportedEntryTypes;\n if (supported.includes('long-animation-frame')) return 'long-animation-frame';\n if (supported.includes('longtask')) return 'longtask';\n } catch {\n // ignore\n }\n return null;\n}\n\nexport function trackMainThreadBlock({\n amplitude,\n options,\n durationThreshold = DEFAULT_DURATION_THRESHOLD,\n}: {\n amplitude: BrowserClient;\n options: PerformanceTrackingOptions;\n durationThreshold?: number;\n}) {\n const entryType = getSupportedEntryType();\n\n /* istanbul ignore next */\n if (!entryType) {\n return { unsubscribe: () => void 0 };\n }\n\n const measures: PerformanceEntry[] = [];\n\n const measureObserver = new PerformanceObserver((list) => {\n const now = performance.now();\n for (const entry of list.getEntries()) {\n measures.push(entry);\n }\n const cutoff = now - MEASURE_BUFFER_WINDOW_MS;\n while (measures.length > 0 && measures[0].startTime < cutoff) {\n measures.shift();\n }\n });\n\n try {\n measureObserver.observe({ entryTypes: ['measure'] });\n } catch {\n // measure not supported — continue without it\n }\n\n const blockObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!isUrlAllowed(options as ElementInteractionsOptions)) {\n return;\n }\n if (entry.duration < durationThreshold) {\n continue;\n }\n const properties =\n entryType === 'long-animation-frame'\n ? buildLoAFProperties(entry as PerformanceLongAnimationFrameTiming, measures)\n : buildLongTaskProperties(entry as PerformanceLongTaskTiming, measures);\n\n amplitude.track(AMPLITUDE_MAIN_THREAD_BLOCK_EVENT, properties);\n }\n });\n\n try {\n blockObserver.observe({ entryTypes: [entryType] });\n } catch {\n measureObserver.disconnect();\n return { unsubscribe: () => void 0 };\n }\n\n return {\n unsubscribe: () => {\n blockObserver.disconnect();\n measureObserver.disconnect();\n },\n };\n}\n","/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n PerformanceTrackingOptions,\n Unsubscribable,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { trackMainThreadBlock } from './autocapture/track-long-task';\n\ntype BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nconst DEFAULT_DURATION_THRESHOLD = 100; // ms\n\nexport const performancePlugin = (options: PerformanceTrackingOptions = {}): BrowserEnrichmentPlugin => {\n const name = constants.PERFORMANCE_PLUGIN_NAME;\n const type = 'enrichment';\n\n const subscriptions: Unsubscribable[] = [];\n\n const mainThreadBlockEnabled =\n options.mainThreadBlock === true ||\n (typeof options.mainThreadBlock === 'object' && options.mainThreadBlock !== null);\n\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n if (mainThreadBlockEnabled) {\n let durationThreshold = DEFAULT_DURATION_THRESHOLD;\n if (typeof options.mainThreadBlock === 'object' && options.mainThreadBlock.durationThreshold !== undefined) {\n durationThreshold = options.mainThreadBlock.durationThreshold;\n }\n\n const subscription = trackMainThreadBlock({\n amplitude,\n options,\n durationThreshold,\n });\n subscriptions.push(subscription);\n }\n\n /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} performance tracking 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","getDecodeURI","locationStr","loggerProvider","decodedLocationStr","decodeURI","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","AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT","AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH","AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID","DATA_AMP_MASK_ATTRIBUTES","SENSITIVE_TAGS","isUrlAllowed","autocaptureOptions","pageUrlAllowlist","pageUrlExcludelist","location","href","createShouldTrackEvent","actionType","element","shouldTrackEventResolver","tag","tagName","toLowerCase","elementType","String","getAttribute","hasMatchAnyAllowedSelector","selector","matches","parseAttributesToMask","attributeString","split","attr","trim","removeEmptyProperties","properties","keys","filteredProperties","isEmpty","getCurrentPageViewId","raw","sessionStorage","getItem","parsed","parse","pageViewId","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","definition","def","event_type","createLabeledEventToTriggerMap","triggers","labeledEventToTriggerMap","triggers_1","triggers_1_1","trigger","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","e_6","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","getStableId","cfg","trackAttr","explicitTrackingAttribute","patterns","patterns_2","patterns_2_1","test","isStableId","autogeneratedIdPatterns","describeRelative","_anchor","trail","stepFor","join","parent","count","sibling","sameTypeIndex","escapeCssIdentifier","css","string","codeUnit","charCodeAt","charAt","escapeIdForCss","DEFAULT_STRATEGIES","try","ctx","attrName","config","runOrchestrator","strategies","scope","ownerDocument","walk","maxDepth","cursor","collectWalk","maxAncestorWalkDepth","strategies_1","strategies_1_1","strategy","anchor","anchorSelector","descent","reverse","composed","isUniqueMatch","strategyName","querySelectorAll","Step","optimized","legacyCssPath","node","nodeType","Node","ELEMENT_NODE","steps","contextNode","cssPathStep","isTargetNode","idSelector","nodeNameLower","nodeName","parentNode","DOCUMENT_NODE","prefixedOwnClassNamesArray","prefixedElementClassNames","needsClassNames","needsNthChild","ownIndex","elementIndex","ownClassNames","siblingClassNamesArray","j","siblingClass","prefixedOwnClassNamesArray_1","prefixedOwnClassNamesArray_1_1","classAttribute","DEFAULT_RESOLVED_CONFIG","freeze","enabled","unstableClassPatterns","resolveSelectorConfig","remote","cloneDefaults","depth","resolved","compiled","patterns_1","patterns_1_1","pattern","RegExp","compileAutogeneratedIdPatterns","compileUnstableClassPatterns","Number","isFinite","floor","createSelectorEngine","initialConfig","subscribers","orchestratorOptions","generate","safeLegacyCssPath","segments","candidate","unshift","fallbackCssPath","getConfig","updateConfig","subscribers_1","subscribers_1_1","cb","onConfigChange","DataExtractor","context","replaceSensitiveString","text","additionalMaskTextPatterns","replace","additionalMaskTextPatterns_1","additionalMaskTextPatterns_1_1","getHierarchy","hierarchy","startTime","performance","ancestors","targetEl","current","getAncestors","elementToAttributesToMaskMap","attributesToMask","constants.DATA_AMP_MASK_ATTRIBUTES","ancestorAttributesToMask","combinedAttributesToMask","hierarchyNode","hierarchy_1","hierarchy_1_1","endTime","diagnosticsClient","recordHistogram","getNearestLabel","labelElement","getText","setSelectorEngine","engine","selectorEngine","getElementPath","elementPath","generateSelector","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","parseTitleFunction","title","titleElement","hasAttribute","getPageTitle","constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT","innerHeight","constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH","innerWidth","constants.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID","HTMLAnchorElement","addTypeAndTimestamp","timestamp","addAdditionalEventProperties","selectorAllowlist","isCapturingCursorPointer","baseEvent","isElementBasedEvent","isCursorPointer","computedStyle","getComputedStyle","getPropertyValue","isElementPointerCursor","contextElement","sourceType","sourceElement","scopingElement","documentElement","getDataSource","elementExtractType","attribute","getTextWithMaskedDescendants","maskedSelector","innerText","childNodes","childNodes_1","childNodes_1_1","childNode","TEXT_NODE","Element","textContent","rawPatterns","maskTextRegex","rawPatterns_1","rawPatterns_1_1","entry","ObservablesEnum","subscribeRemoteConfig","remoteConfigClient","subscriptionId","setupElementSelector","amplitude","elementSelectorClient","hadPreviousElementSelector","previousElementSelector","elementSelector","elementSelectorSurface","attachElementSelectorSurface","fetchRemoteConfig","elementSelectorSubscription","remoteSelectorConfig","nextResolved","autocapturePlugin","setTag","_o","_p","visualTaggingOptions","debounceTime","isViewportContentUpdatedEnabled","viewportContentUpdated","resolvedExposureDuration","_g","exposureDuration","_h","excludePattern","regexError","beforeUnloadCleanup","elementExposedForPage","currentElementExposed","createObservables","navigateObservable","clickObservable","click","changeObservable","changeEvent","enrichedChangeEvent","navigation","navigateEvent","enrichedNavigateEvent","mutationObservable","mutation","scrollObservable","exposureObservable","IntersectionObserver","intersectionObserver","root","rootMargin","threshold","selectorString","mutationSubscription","addedNodes","child","createExposureObservable","ChangeObservable","ClickObservable","MutationObservable","NavigateObservable","ScrollObservable","ExposureObservable","_k","_j","_l","_m","evaluateTriggers","createTriggerEvaluator","pageViewEndFired","lastScroll","maxX","maxY","pageActionsSubscription","remoteConfig","remotePageActions","recomputePageActionsData","shouldTrackEvent","shouldTrackActionClick","allObservables","clickTrackingSubscription","track","trackClicks","bind","changeSubscription","trackChange","actionClickSubscription","filteredClickObservable","closestActionClickEl","clickEvent","mutationOrNavigate","clickMutationNavigateObservable","actionClickTimer","lastClickEvent","clearTimeout","event_1","actionClick","trackActionClick","scrollTracker","state","scrollSubscription","currentX","scrollX","pageXOffset","currentY","scrollY","pageYOffset","max","getState","reset","trackScroll","trackers","handleViewportContentUpdated","isPageEnd","exposureTracker","pageScrollMaxState","viewportWidth","viewportHeight","eventProperties","fireViewportContentUpdated","exposure","handleExposure","fireViewportContentUpdatedCallback","exposedArray","onExposure","exposureMap","exposureTimerMap","exposureSubscription","isIntersecting","timer","intersectionRatio","trackExposure","beforeUnloadHandler_1","popstateHandler_1","originalPushState_1","history","pushState","Proxy","unused","scriptUrl","backgroundCaptureInstance","onBackgroundCapture","backgroundCaptureData","resolvedUrl","URL","amplitudeBackgroundCapture","enableBackgroundCapture","serverZone","constants.AMPLITUDE_ORIGINS_MAP","execute","teardown","CHANGE_EVENTS","addCoordinates","regionBox","pageX","pageY","yMin","min","yMax","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","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","getOverlappingMeasures","measures","taskEnd","duration","measure","buildLoAFProperties","overlappingMeasures","scripts","scriptURLs","sourceURL","scriptFunctions","sourceFunctionName","scriptPositions","sourceCharPosition","invokerTypes","invokerType","invokers","invoker","blockingDuration","renderStart","styleAndLayoutStart","buildLongTaskProperties","attribution","a","trackMainThreadBlock","durationThreshold","entryType","PerformanceObserver","supported","supportedEntryTypes","getSupportedEntryType","measureObserver","list","getEntries","cutoff","entryTypes","blockObserver","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","thrashedCursorSubscription","mainThreadBlockEnabled","mainThreadBlock"],"mappings":"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"}