@amplitude/analytics-browser 2.33.5 → 2.34.1-feat-zoning-alpha.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 (48) hide show
  1. package/README.md +1 -1
  2. package/lib/cjs/config.d.ts +1 -1
  3. package/lib/cjs/config.d.ts.map +1 -1
  4. package/lib/cjs/default-tracking.d.ts +2 -1
  5. package/lib/cjs/default-tracking.d.ts.map +1 -1
  6. package/lib/cjs/default-tracking.js +11 -1
  7. package/lib/cjs/default-tracking.js.map +1 -1
  8. package/lib/cjs/plugins/form-interaction-tracking.d.ts.map +1 -1
  9. package/lib/cjs/plugins/form-interaction-tracking.js +24 -1
  10. package/lib/cjs/plugins/form-interaction-tracking.js.map +1 -1
  11. package/lib/cjs/version.d.ts +1 -1
  12. package/lib/cjs/version.d.ts.map +1 -1
  13. package/lib/cjs/version.js +1 -1
  14. package/lib/cjs/version.js.map +1 -1
  15. package/lib/esm/config.d.ts +1 -1
  16. package/lib/esm/config.d.ts.map +1 -1
  17. package/lib/esm/default-tracking.d.ts +2 -1
  18. package/lib/esm/default-tracking.d.ts.map +1 -1
  19. package/lib/esm/default-tracking.js +9 -0
  20. package/lib/esm/default-tracking.js.map +1 -1
  21. package/lib/esm/plugins/form-interaction-tracking.d.ts.map +1 -1
  22. package/lib/esm/plugins/form-interaction-tracking.js +25 -2
  23. package/lib/esm/plugins/form-interaction-tracking.js.map +1 -1
  24. package/lib/esm/version.d.ts +1 -1
  25. package/lib/esm/version.d.ts.map +1 -1
  26. package/lib/esm/version.js +1 -1
  27. package/lib/esm/version.js.map +1 -1
  28. package/lib/scripts/amplitude-bookmarklet-snippet-min.js +1 -1
  29. package/lib/scripts/amplitude-bookmarklet.html +1 -1
  30. package/lib/scripts/amplitude-gtm-min.js +1 -1
  31. package/lib/scripts/amplitude-gtm-min.js.gz +0 -0
  32. package/lib/scripts/amplitude-gtm-min.js.map +1 -1
  33. package/lib/scripts/amplitude-gtm-snippet-min.js +1 -1
  34. package/lib/scripts/amplitude-min.js +1 -1
  35. package/lib/scripts/amplitude-min.js.gz +0 -0
  36. package/lib/scripts/amplitude-min.js.map +1 -1
  37. package/lib/scripts/amplitude-min.umd.js +1 -1
  38. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  39. package/lib/scripts/amplitude-snippet-instructions.html +1 -1
  40. package/lib/scripts/amplitude-snippet-min.js +1 -1
  41. package/lib/scripts/config.d.ts +1 -1
  42. package/lib/scripts/config.d.ts.map +1 -1
  43. package/lib/scripts/default-tracking.d.ts +2 -1
  44. package/lib/scripts/default-tracking.d.ts.map +1 -1
  45. package/lib/scripts/plugins/form-interaction-tracking.d.ts.map +1 -1
  46. package/lib/scripts/version.d.ts +1 -1
  47. package/lib/scripts/version.d.ts.map +1 -1
  48. package/package.json +8 -7
@@ -1 +1 @@
1
- {"version":3,"file":"amplitude-min.js","sources":["../../../../node_modules/.pnpm/@rollup+plugin-typescript@10.0.1_rollup@2.79.2_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js","../../../analytics-core/lib/esm/types/event/event.js","../../../analytics-core/lib/esm/types/constants.js","../../../analytics-core/lib/esm/identify.js","../../../analytics-core/lib/esm/utils/valid-properties.js","../../../analytics-core/lib/esm/types/status.js","../../../analytics-core/lib/esm/utils/result-builder.js","../../../analytics-core/lib/esm/revenue.js","../../../analytics-core/lib/esm/global-scope.js","../../../analytics-core/lib/esm/utils/uuid.js","../../../analytics-core/lib/esm/timeline.js","../../../analytics-core/lib/esm/utils/event-builder.js","../../../analytics-core/lib/esm/utils/return-wrapper.js","../../../analytics-core/lib/esm/core-client.js","../../../analytics-core/lib/esm/types/messages.js","../../../analytics-core/lib/esm/utils/chunk.js","../../../analytics-core/lib/esm/types/loglevel.js","../../../analytics-core/lib/esm/logger.js","../../../analytics-core/lib/esm/config.js","../../../analytics-core/lib/esm/utils/status-code.js","../../../analytics-core/lib/esm/utils/debug.js","../../../analytics-core/lib/esm/plugins/destination.js","../../../../node_modules/.pnpm/@amplitude+analytics-connector@1.6.4/node_modules/@amplitude/analytics-connector/dist/analytics-connector.esm.js","../../../analytics-core/lib/esm/types/server-zone.js","../../../analytics-core/lib/esm/analytics-connector.js","../../../analytics-core/lib/esm/plugins/identity.js","../../../analytics-core/lib/esm/session.js","../../../analytics-core/lib/esm/cookie-name.js","../../../analytics-core/lib/esm/language.js","../../../analytics-core/lib/esm/query-params.js","../../../analytics-core/lib/esm/utils/url-utils.js","../../../analytics-core/lib/esm/utils/sampling.js","../../../analytics-core/lib/esm/storage/memory.js","../../../analytics-core/lib/esm/storage/cookie.js","../../../analytics-core/lib/esm/storage/helpers.js","../../../analytics-core/lib/esm/storage/browser-storage.js","../../../analytics-core/lib/esm/diagnostics/diagnostics-storage.js","../../../analytics-core/lib/esm/diagnostics/uncaught-sdk-errors.js","../../../analytics-core/lib/esm/diagnostics/diagnostics-client.js","../../../analytics-core/lib/esm/transports/base.js","../../../analytics-core/lib/esm/transports/fetch.js","../../../analytics-core/lib/esm/remote-config/remote-config-localstorage.js","../../../analytics-core/lib/esm/remote-config/remote-config.js","../../../analytics-core/lib/esm/types/offline.js","../../../analytics-core/lib/esm/types/element-interactions.js","../../../analytics-core/lib/esm/types/frustration-interactions.js","../../../analytics-core/lib/esm/utils/json-query.js","../../../analytics-core/lib/esm/network-request-event.js","../../../analytics-core/lib/esm/observers/network.js","../../../analytics-core/lib/esm/campaign/campaign-parser.js","../../../analytics-core/lib/esm/plugins/helpers.js","../../../../node_modules/.pnpm/zen-observable-ts@1.1.0/node_modules/zen-observable-ts/module.js","../../../analytics-core/lib/esm/utils/observable.js","../../../src/default-tracking.ts","../../../src/utils/snippet-helper.ts","../../../src/version.ts","../../../src/lib-prefix.ts","../../../src/plugins/context.ts","../../../src/storage/local-storage.ts","../../../src/storage/session-storage.ts","../../../src/transports/xhr.ts","../../../src/transports/send-beacon.ts","../../../src/cookie-migration/index.ts","../../../src/constants.ts","../../../src/config.ts","../../../plugin-page-view-tracking-browser/lib/esm/utils.js","../../../plugin-page-view-tracking-browser/lib/esm/page-view-tracking.js","../../../src/plugins/form-interaction-tracking.ts","../../../src/plugins/file-download-tracking.ts","../../../src/det-notification.ts","../../../src/plugins/network-connectivity-checker.ts","../../../src/config/joined-config.ts","../../../plugin-autocapture-browser/lib/esm/version.js","../../../plugin-autocapture-browser/lib/esm/constants.js","../../../plugin-autocapture-browser/lib/esm/helpers.js","../../../plugin-autocapture-browser/lib/esm/hierarchy.js","../../../plugin-autocapture-browser/lib/esm/pageActions/actions.js","../../../plugin-autocapture-browser/lib/esm/data-extractor.js","../../../plugin-autocapture-browser/lib/esm/libs/messenger.js","../../../plugin-autocapture-browser/lib/esm/observables.js","../../../plugin-autocapture-browser/lib/esm/autocapture-plugin.js","../../../plugin-autocapture-browser/lib/esm/pageActions/triggers.js","../../../plugin-autocapture-browser/lib/esm/pageActions/matchEventToFilter.js","../../../plugin-autocapture-browser/lib/esm/autocapture/track-click.js","../../../plugin-autocapture-browser/lib/esm/autocapture/track-change.js","../../../plugin-autocapture-browser/lib/esm/autocapture/track-action-click.js","../../../plugin-autocapture-browser/lib/esm/autocapture/track-dead-click.js","../../../plugin-autocapture-browser/lib/esm/autocapture/track-rage-click.js","../../../plugin-autocapture-browser/lib/esm/frustration-plugin.js","../../../plugin-network-capture-browser/lib/esm/network-capture-plugin.js","../../../plugin-network-capture-browser/lib/esm/constants.js","../../../plugin-network-capture-browser/lib/esm/track-network-event.js","../../../../node_modules/.pnpm/web-vitals@5.1.0/node_modules/web-vitals/dist/web-vitals.js","../../../plugin-web-vitals-browser/lib/esm/web-vitals-plugin.js","../../../plugin-page-url-enrichment-browser/lib/esm/page-url-enrichment.js","../../../plugin-web-vitals-browser/lib/esm/constants.js","../../../src/attribution/helpers.ts","../../../src/attribution/web-attribution.ts","../../../src/browser-client.ts","../../../src/browser-client-factory.ts","../../../src/index.ts","../../../src/snippet-index.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","export var IdentifyOperation;\n(function (IdentifyOperation) {\n // Base Operations to set values\n IdentifyOperation[\"SET\"] = \"$set\";\n IdentifyOperation[\"SET_ONCE\"] = \"$setOnce\";\n // Operations around modifying existing values\n IdentifyOperation[\"ADD\"] = \"$add\";\n IdentifyOperation[\"APPEND\"] = \"$append\";\n IdentifyOperation[\"PREPEND\"] = \"$prepend\";\n IdentifyOperation[\"REMOVE\"] = \"$remove\";\n // Operations around appending values *if* they aren't present\n IdentifyOperation[\"PREINSERT\"] = \"$preInsert\";\n IdentifyOperation[\"POSTINSERT\"] = \"$postInsert\";\n // Operations around removing properties/values\n IdentifyOperation[\"UNSET\"] = \"$unset\";\n IdentifyOperation[\"CLEAR_ALL\"] = \"$clearAll\";\n})(IdentifyOperation || (IdentifyOperation = {}));\n/**\n * Strings that have special meaning when used as an event's type\n * and have different specifications.\n */\nexport var SpecialEventType;\n(function (SpecialEventType) {\n SpecialEventType[\"IDENTIFY\"] = \"$identify\";\n SpecialEventType[\"GROUP_IDENTIFY\"] = \"$groupidentify\";\n SpecialEventType[\"REVENUE\"] = \"revenue_amount\";\n})(SpecialEventType || (SpecialEventType = {}));\n//# sourceMappingURL=event.js.map","export var UNSET_VALUE = '-';\nexport var AMPLITUDE_PREFIX = 'AMP';\nexport var STORAGE_PREFIX = \"\".concat(AMPLITUDE_PREFIX, \"_unsent\");\nexport var DEFAULT_INSTANCE_NAME = '$default_instance';\nexport var AMPLITUDE_SERVER_URL = 'https://api2.amplitude.com/2/httpapi';\nexport var EU_AMPLITUDE_SERVER_URL = 'https://api.eu.amplitude.com/2/httpapi';\nexport var AMPLITUDE_BATCH_SERVER_URL = 'https://api2.amplitude.com/batch';\nexport var EU_AMPLITUDE_BATCH_SERVER_URL = 'https://api.eu.amplitude.com/batch';\n// Campaign constants\nexport var UTM_CAMPAIGN = 'utm_campaign';\nexport var UTM_CONTENT = 'utm_content';\nexport var UTM_ID = 'utm_id';\nexport var UTM_MEDIUM = 'utm_medium';\nexport var UTM_SOURCE = 'utm_source';\nexport var UTM_TERM = 'utm_term';\nexport var DCLID = 'dclid';\nexport var FBCLID = 'fbclid';\nexport var GBRAID = 'gbraid';\nexport var GCLID = 'gclid';\nexport var KO_CLICK_ID = 'ko_click_id';\nexport var LI_FAT_ID = 'li_fat_id';\nexport var MSCLKID = 'msclkid';\nexport var RDT_CID = 'rdt_cid';\nexport var TTCLID = 'ttclid';\nexport var TWCLID = 'twclid';\nexport var WBRAID = 'wbraid';\nexport var EMPTY_VALUE = 'EMPTY';\nexport var BASE_CAMPAIGN = {\n utm_campaign: undefined,\n utm_content: undefined,\n utm_id: undefined,\n utm_medium: undefined,\n utm_source: undefined,\n utm_term: undefined,\n referrer: undefined,\n referring_domain: undefined,\n dclid: undefined,\n gbraid: undefined,\n gclid: undefined,\n fbclid: undefined,\n ko_click_id: undefined,\n li_fat_id: undefined,\n msclkid: undefined,\n rdt_cid: undefined,\n ttclid: undefined,\n twclid: undefined,\n wbraid: undefined,\n};\nexport var MKTG = 'MKTG';\n// list of Network headers that are safe to capture\nexport var SAFE_HEADERS = [\n 'access-control-allow-origin',\n 'access-control-allow-credentials',\n 'access-control-expose-headers',\n 'access-control-max-age',\n 'access-control-allow-methods',\n 'access-control-allow-headers',\n 'accept-patch',\n 'accept-ranges',\n 'age',\n 'allow',\n 'alt-svc',\n 'cache-control',\n 'connection',\n 'content-disposition',\n 'content-encoding',\n 'content-language',\n 'content-length',\n 'content-location',\n 'content-md5',\n 'content-range',\n 'content-type',\n 'date',\n 'delta-base',\n 'etag',\n 'expires',\n 'im',\n 'last-modified',\n 'link',\n 'location',\n 'permanent',\n 'p3p',\n 'pragma',\n 'proxy-authenticate',\n 'public-key-pins',\n 'retry-after',\n 'server',\n 'status',\n 'strict-transport-security',\n 'trailer',\n 'transfer-encoding',\n 'tk',\n 'upgrade',\n 'vary',\n 'via',\n 'warning',\n 'www-authenticate',\n 'x-b3-traceid',\n 'x-frame-options',\n];\n// list of Network headers to never capture\nexport var FORBIDDEN_HEADERS = ['authorization', 'cookie', 'set-cookie'];\n//# sourceMappingURL=constants.js.map","import { __assign } from \"tslib\";\nimport { UNSET_VALUE } from './types/constants';\nimport { isValidProperties } from './utils/valid-properties';\nvar Identify = /** @class */ (function () {\n function Identify() {\n this._propertySet = new Set();\n this._properties = {};\n }\n Identify.prototype.getUserProperties = function () {\n return __assign({}, this._properties);\n };\n Identify.prototype.set = function (property, value) {\n this._safeSet(IdentifyOperation.SET, property, value);\n return this;\n };\n Identify.prototype.setOnce = function (property, value) {\n this._safeSet(IdentifyOperation.SET_ONCE, property, value);\n return this;\n };\n Identify.prototype.append = function (property, value) {\n this._safeSet(IdentifyOperation.APPEND, property, value);\n return this;\n };\n Identify.prototype.prepend = function (property, value) {\n this._safeSet(IdentifyOperation.PREPEND, property, value);\n return this;\n };\n Identify.prototype.postInsert = function (property, value) {\n this._safeSet(IdentifyOperation.POSTINSERT, property, value);\n return this;\n };\n Identify.prototype.preInsert = function (property, value) {\n this._safeSet(IdentifyOperation.PREINSERT, property, value);\n return this;\n };\n Identify.prototype.remove = function (property, value) {\n this._safeSet(IdentifyOperation.REMOVE, property, value);\n return this;\n };\n Identify.prototype.add = function (property, value) {\n this._safeSet(IdentifyOperation.ADD, property, value);\n return this;\n };\n Identify.prototype.unset = function (property) {\n this._safeSet(IdentifyOperation.UNSET, property, UNSET_VALUE);\n return this;\n };\n Identify.prototype.clearAll = function () {\n // When clear all happens, all properties are unset. Reset the entire object.\n this._properties = {};\n this._properties[IdentifyOperation.CLEAR_ALL] = UNSET_VALUE;\n return this;\n };\n // Returns whether or not this set actually worked.\n Identify.prototype._safeSet = function (operation, property, value) {\n if (this._validate(operation, property, value)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n var userPropertyMap = this._properties[operation];\n if (userPropertyMap === undefined) {\n userPropertyMap = {};\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n this._properties[operation] = userPropertyMap;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n userPropertyMap[property] = value;\n this._propertySet.add(property);\n return true;\n }\n return false;\n };\n Identify.prototype._validate = function (operation, property, value) {\n if (this._properties[IdentifyOperation.CLEAR_ALL] !== undefined) {\n // clear all already set. Skipping operation;\n return false;\n }\n if (this._propertySet.has(property)) {\n // Property already used. Skipping operation\n return false;\n }\n if (operation === IdentifyOperation.ADD) {\n return typeof value === 'number';\n }\n if (operation !== IdentifyOperation.UNSET && operation !== IdentifyOperation.REMOVE) {\n return isValidProperties(property, value);\n }\n return true;\n };\n return Identify;\n}());\nexport { Identify };\nexport var IdentifyOperation;\n(function (IdentifyOperation) {\n // Base Operations to set values\n IdentifyOperation[\"SET\"] = \"$set\";\n IdentifyOperation[\"SET_ONCE\"] = \"$setOnce\";\n // Operations around modifying existing values\n IdentifyOperation[\"ADD\"] = \"$add\";\n IdentifyOperation[\"APPEND\"] = \"$append\";\n IdentifyOperation[\"PREPEND\"] = \"$prepend\";\n IdentifyOperation[\"REMOVE\"] = \"$remove\";\n // Operations around appending values *if* they aren't present\n IdentifyOperation[\"PREINSERT\"] = \"$preInsert\";\n IdentifyOperation[\"POSTINSERT\"] = \"$postInsert\";\n // Operations around removing properties/values\n IdentifyOperation[\"UNSET\"] = \"$unset\";\n IdentifyOperation[\"CLEAR_ALL\"] = \"$clearAll\";\n})(IdentifyOperation || (IdentifyOperation = {}));\n/**\n * Note that the order of operations should align with https://github.com/amplitude/nova/blob/7701b5986b565d4b2fb53b99a9f2175df055dea8/src/main/java/com/amplitude/ingestion/core/UserPropertyUtils.java#L210\n */\nexport var OrderedIdentifyOperations = [\n IdentifyOperation.CLEAR_ALL,\n IdentifyOperation.UNSET,\n IdentifyOperation.SET,\n IdentifyOperation.SET_ONCE,\n IdentifyOperation.ADD,\n IdentifyOperation.APPEND,\n IdentifyOperation.PREPEND,\n IdentifyOperation.PREINSERT,\n IdentifyOperation.POSTINSERT,\n IdentifyOperation.REMOVE,\n];\n//# sourceMappingURL=identify.js.map","import { __values } from \"tslib\";\nvar MAX_PROPERTY_KEYS = 1000;\nexport var isValidObject = function (properties) {\n if (Object.keys(properties).length > MAX_PROPERTY_KEYS) {\n return false;\n }\n for (var key in properties) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n var value = properties[key];\n if (!isValidProperties(key, value))\n return false;\n }\n return true;\n};\nexport var isValidProperties = function (property, value) {\n var e_1, _a;\n if (typeof property !== 'string')\n return false;\n if (Array.isArray(value)) {\n var isValid = true;\n try {\n for (var value_1 = __values(value), value_1_1 = value_1.next(); !value_1_1.done; value_1_1 = value_1.next()) {\n var valueElement = value_1_1.value;\n if (Array.isArray(valueElement)) {\n return false;\n }\n else if (typeof valueElement === 'object') {\n isValid = isValid && isValidObject(valueElement);\n }\n else if (!['number', 'string'].includes(typeof valueElement)) {\n return false;\n }\n if (!isValid) {\n return false;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (value_1_1 && !value_1_1.done && (_a = value_1.return)) _a.call(value_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n else if (value === null || value === undefined) {\n return false;\n }\n else if (typeof value === 'object') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return isValidObject(value);\n }\n else if (!['number', 'string', 'boolean'].includes(typeof value)) {\n return false;\n }\n return true;\n};\n//# sourceMappingURL=valid-properties.js.map","/** The status of an event. */\nexport var Status;\n(function (Status) {\n /** The status could not be determined. */\n Status[\"Unknown\"] = \"unknown\";\n /** The event was skipped due to configuration or callbacks. */\n Status[\"Skipped\"] = \"skipped\";\n /** The event was sent successfully. */\n Status[\"Success\"] = \"success\";\n /** A user or device in the payload is currently rate limited and should try again later. */\n Status[\"RateLimit\"] = \"rate_limit\";\n /** The sent payload was too large to be processed. */\n Status[\"PayloadTooLarge\"] = \"payload_too_large\";\n /** The event could not be processed. */\n Status[\"Invalid\"] = \"invalid\";\n /** A server-side error ocurred during submission. */\n Status[\"Failed\"] = \"failed\";\n /** a server or client side error occuring when a request takes too long and is cancelled */\n Status[\"Timeout\"] = \"Timeout\";\n /** NodeJS runtime environment error.. E.g. disconnected from network */\n Status[\"SystemError\"] = \"SystemError\";\n})(Status || (Status = {}));\n//# sourceMappingURL=status.js.map","import { Status } from '../types/status';\nexport var buildResult = function (event, code, message) {\n if (code === void 0) { code = 0; }\n if (message === void 0) { message = Status.Unknown; }\n return { event: event, code: code, message: message };\n};\n//# sourceMappingURL=result-builder.js.map","import { __assign } from \"tslib\";\nimport { isValidObject } from './utils/valid-properties';\nvar Revenue = /** @class */ (function () {\n function Revenue() {\n this.productId = '';\n this.quantity = 1;\n this.price = 0.0;\n }\n Revenue.prototype.setProductId = function (productId) {\n this.productId = productId;\n return this;\n };\n Revenue.prototype.setQuantity = function (quantity) {\n if (quantity > 0) {\n this.quantity = quantity;\n }\n return this;\n };\n Revenue.prototype.setPrice = function (price) {\n this.price = price;\n return this;\n };\n Revenue.prototype.setRevenueType = function (revenueType) {\n this.revenueType = revenueType;\n return this;\n };\n Revenue.prototype.setCurrency = function (currency) {\n this.currency = currency;\n return this;\n };\n Revenue.prototype.setRevenue = function (revenue) {\n this.revenue = revenue;\n return this;\n };\n Revenue.prototype.setReceipt = function (receipt) {\n this.receipt = receipt;\n return this;\n };\n Revenue.prototype.setReceiptSig = function (receiptSig) {\n this.receiptSig = receiptSig;\n return this;\n };\n Revenue.prototype.setEventProperties = function (properties) {\n if (isValidObject(properties)) {\n this.properties = properties;\n }\n return this;\n };\n Revenue.prototype.getEventProperties = function () {\n var eventProperties = this.properties ? __assign({}, this.properties) : {};\n eventProperties[RevenueProperty.REVENUE_PRODUCT_ID] = this.productId;\n eventProperties[RevenueProperty.REVENUE_QUANTITY] = this.quantity;\n eventProperties[RevenueProperty.REVENUE_PRICE] = this.price;\n eventProperties[RevenueProperty.REVENUE_TYPE] = this.revenueType;\n eventProperties[RevenueProperty.REVENUE_CURRENCY] = this.currency;\n eventProperties[RevenueProperty.REVENUE] = this.revenue;\n eventProperties[RevenueProperty.RECEIPT] = this.receipt;\n eventProperties[RevenueProperty.RECEIPT_SIG] = this.receiptSig;\n return eventProperties;\n };\n return Revenue;\n}());\nexport { Revenue };\nexport var RevenueProperty;\n(function (RevenueProperty) {\n RevenueProperty[\"REVENUE_PRODUCT_ID\"] = \"$productId\";\n RevenueProperty[\"REVENUE_QUANTITY\"] = \"$quantity\";\n RevenueProperty[\"REVENUE_PRICE\"] = \"$price\";\n RevenueProperty[\"REVENUE_TYPE\"] = \"$revenueType\";\n RevenueProperty[\"REVENUE_CURRENCY\"] = \"$currency\";\n RevenueProperty[\"REVENUE\"] = \"$revenue\";\n RevenueProperty[\"RECEIPT\"] = \"$receipt\";\n RevenueProperty[\"RECEIPT_SIG\"] = \"$receiptSig\";\n})(RevenueProperty || (RevenueProperty = {}));\n//# sourceMappingURL=revenue.js.map","/* eslint-disable no-restricted-globals */\n/* Only file allowed to access to globalThis, window, self */\nexport var getGlobalScope = function () {\n // This should only be used for integrations with Amplitude that are not running in a browser environment\n // We need to specify the name of the global variable as a string to prevent it from being minified\n var ampIntegrationContextName = 'ampIntegrationContext';\n if (typeof globalThis !== 'undefined' && typeof globalThis[ampIntegrationContextName] !== 'undefined') {\n return globalThis[ampIntegrationContextName];\n }\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n return undefined;\n};\n//# sourceMappingURL=global-scope.js.map","/**\n * Source: [jed's gist's comment]{@link https://gist.github.com/jed/982883?permalink_comment_id=3223002#gistcomment-3223002}.\n * Returns a random v4 UUID of the form xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx,\n * where each x is replaced with a random hexadecimal digit from 0 to f, and\n * y is replaced with a random hexadecimal digit from 8 to b.\n * Used to generate UUIDs for deviceIds.\n * @private\n */\nimport { __read, __spreadArray } from \"tslib\";\nimport { getGlobalScope } from '../global-scope';\nvar legacyUUID = function (a) {\n return a // if the placeholder was passed, return\n ? // a random number from 0 to 15\n (a ^ // unless b is 8,\n ((Math.random() * // in which case\n 16) >> // a random number from\n (a / 4))) // 8 to 11\n .toString(16) // in hexadecimal\n : // or otherwise a concatenated string:\n (String(1e7) + // 10000000 +\n String(-1e3) + // -1000 +\n String(-4e3) + // -4000 +\n String(-8e3) + // -80000000 +\n String(-1e11)) // -100000000000,\n .replace(\n // replacing\n /[018]/g, // zeroes, ones, and eights with\n UUID);\n};\nvar hex = __spreadArray([], __read(Array(256).keys()), false).map(function (index) { return index.toString(16).padStart(2, '0'); });\nexport var UUID = function (a) {\n var _a;\n var globalScope = getGlobalScope();\n /* istanbul ignore next */\n if (!((_a = globalScope === null || globalScope === void 0 ? void 0 : globalScope.crypto) === null || _a === void 0 ? void 0 : _a.getRandomValues)) {\n // Fallback to legacy UUID generation if crypto is not available\n return legacyUUID(a);\n }\n var r = globalScope.crypto.getRandomValues(new Uint8Array(16));\n r[6] = (r[6] & 0x0f) | 0x40;\n r[8] = (r[8] & 0x3f) | 0x80;\n return __spreadArray([], __read(r.entries()), false).map(function (_a) {\n var _b = __read(_a, 2), index = _b[0], int = _b[1];\n return ([4, 6, 8, 10].includes(index) ? \"-\".concat(hex[int]) : hex[int]);\n }).join('');\n};\n//# sourceMappingURL=uuid.js.map","import { __assign, __awaiter, __generator, __read, __values } from \"tslib\";\nimport { buildResult } from './utils/result-builder';\nimport { UUID } from './utils/uuid';\nvar Timeline = /** @class */ (function () {\n function Timeline(client) {\n this.client = client;\n this.queue = [];\n // Flag to guarantee one schedule apply is running\n this.applying = false;\n // Flag indicates whether timeline is ready to process event\n // Events collected before timeline is ready will stay in the queue to be processed later\n this.plugins = [];\n }\n Timeline.prototype.register = function (plugin, config) {\n var _a, _b;\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_c) {\n switch (_c.label) {\n case 0:\n if (this.plugins.some(function (existingPlugin) { return existingPlugin.name === plugin.name; })) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n this.loggerProvider.warn(\"Plugin with name \".concat(plugin.name, \" already exists, skipping registration\"));\n return [2 /*return*/];\n }\n if (plugin.name === undefined) {\n plugin.name = UUID();\n this.loggerProvider.warn(\"Plugin name is undefined. \\n Generating a random UUID for plugin name: \".concat(plugin.name, \". \\n Set a name for the plugin to prevent it from being added multiple times.\"));\n }\n plugin.type = (_a = plugin.type) !== null && _a !== void 0 ? _a : 'enrichment';\n return [4 /*yield*/, ((_b = plugin.setup) === null || _b === void 0 ? void 0 : _b.call(plugin, config, this.client))];\n case 1:\n _c.sent();\n this.plugins.push(plugin);\n return [2 /*return*/];\n }\n });\n });\n };\n Timeline.prototype.deregister = function (pluginName, config) {\n var _a;\n return __awaiter(this, void 0, void 0, function () {\n var index, plugin;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n index = this.plugins.findIndex(function (plugin) { return plugin.name === pluginName; });\n if (index === -1) {\n config.loggerProvider.warn(\"Plugin with name \".concat(pluginName, \" does not exist, skipping deregistration\"));\n return [2 /*return*/];\n }\n plugin = this.plugins[index];\n this.plugins.splice(index, 1);\n return [4 /*yield*/, ((_a = plugin.teardown) === null || _a === void 0 ? void 0 : _a.call(plugin))];\n case 1:\n _b.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n Timeline.prototype.reset = function (client) {\n this.applying = false;\n var plugins = this.plugins;\n plugins.map(function (plugin) { var _a; return (_a = plugin.teardown) === null || _a === void 0 ? void 0 : _a.call(plugin); });\n this.plugins = [];\n this.client = client;\n };\n Timeline.prototype.push = function (event) {\n var _this = this;\n return new Promise(function (resolve) {\n _this.queue.push([event, resolve]);\n _this.scheduleApply(0);\n });\n };\n Timeline.prototype.scheduleApply = function (timeout) {\n var _this = this;\n if (this.applying)\n return;\n this.applying = true;\n setTimeout(function () {\n void _this.apply(_this.queue.shift()).then(function () {\n _this.applying = false;\n if (_this.queue.length > 0) {\n _this.scheduleApply(0);\n }\n });\n }, timeout);\n };\n Timeline.prototype.apply = function (item) {\n return __awaiter(this, void 0, void 0, function () {\n var _a, event, _b, resolve, before, before_1, before_1_1, plugin, e, e_1_1, enrichment, enrichment_1, enrichment_1_1, plugin, e, e_2_1, destination, executeDestinations;\n var e_1, _c, e_2, _d;\n return __generator(this, function (_e) {\n switch (_e.label) {\n case 0:\n if (!item) {\n return [2 /*return*/];\n }\n _a = __read(item, 1), event = _a[0];\n _b = __read(item, 2), resolve = _b[1];\n // Log initial event\n this.loggerProvider.log('Timeline.apply: Initial event', event);\n before = this.plugins.filter(function (plugin) { return plugin.type === 'before'; });\n _e.label = 1;\n case 1:\n _e.trys.push([1, 6, 7, 8]);\n before_1 = __values(before), before_1_1 = before_1.next();\n _e.label = 2;\n case 2:\n if (!!before_1_1.done) return [3 /*break*/, 5];\n plugin = before_1_1.value;\n /* istanbul ignore if */\n if (!plugin.execute) {\n // do nothing\n return [3 /*break*/, 4];\n }\n return [4 /*yield*/, plugin.execute(__assign({}, event))];\n case 3:\n e = _e.sent();\n if (e === null) {\n this.loggerProvider.log(\"Timeline.apply: Event filtered out by before plugin '\".concat(String(plugin.name), \"', event: \").concat(JSON.stringify(event)));\n resolve({ event: event, code: 0, message: '' });\n return [2 /*return*/];\n }\n else {\n event = e;\n this.loggerProvider.log(\"Timeline.apply: Event after before plugin '\".concat(String(plugin.name), \"', event: \").concat(JSON.stringify(event)));\n }\n _e.label = 4;\n case 4:\n before_1_1 = before_1.next();\n return [3 /*break*/, 2];\n case 5: return [3 /*break*/, 8];\n case 6:\n e_1_1 = _e.sent();\n e_1 = { error: e_1_1 };\n return [3 /*break*/, 8];\n case 7:\n try {\n if (before_1_1 && !before_1_1.done && (_c = before_1.return)) _c.call(before_1);\n }\n finally { if (e_1) throw e_1.error; }\n return [7 /*endfinally*/];\n case 8:\n enrichment = this.plugins.filter(function (plugin) { return plugin.type === 'enrichment' || plugin.type === undefined; });\n _e.label = 9;\n case 9:\n _e.trys.push([9, 14, 15, 16]);\n enrichment_1 = __values(enrichment), enrichment_1_1 = enrichment_1.next();\n _e.label = 10;\n case 10:\n if (!!enrichment_1_1.done) return [3 /*break*/, 13];\n plugin = enrichment_1_1.value;\n /* istanbul ignore if */\n if (!plugin.execute) {\n // do nothing\n return [3 /*break*/, 12];\n }\n return [4 /*yield*/, plugin.execute(__assign({}, event))];\n case 11:\n e = _e.sent();\n if (e === null) {\n this.loggerProvider.log(\"Timeline.apply: Event filtered out by enrichment plugin '\".concat(String(plugin.name), \"', event: \").concat(JSON.stringify(event)));\n resolve({ event: event, code: 0, message: '' });\n return [2 /*return*/];\n }\n else {\n event = e;\n this.loggerProvider.log(\"Timeline.apply: Event after enrichment plugin '\".concat(String(plugin.name), \"', event: \").concat(JSON.stringify(event)));\n }\n _e.label = 12;\n case 12:\n enrichment_1_1 = enrichment_1.next();\n return [3 /*break*/, 10];\n case 13: return [3 /*break*/, 16];\n case 14:\n e_2_1 = _e.sent();\n e_2 = { error: e_2_1 };\n return [3 /*break*/, 16];\n case 15:\n try {\n if (enrichment_1_1 && !enrichment_1_1.done && (_d = enrichment_1.return)) _d.call(enrichment_1);\n }\n finally { if (e_2) throw e_2.error; }\n return [7 /*endfinally*/];\n case 16:\n destination = this.plugins.filter(function (plugin) { return plugin.type === 'destination'; });\n // Log final event before sending to destinations\n this.loggerProvider.log(\"Timeline.apply: Final event before destinations, event: \".concat(JSON.stringify(event)));\n executeDestinations = destination.map(function (plugin) {\n var eventClone = __assign({}, event);\n return plugin.execute(eventClone).catch(function (e) { return buildResult(eventClone, 0, String(e)); });\n });\n void Promise.all(executeDestinations).then(function (_a) {\n var _b = __read(_a, 1), result = _b[0];\n var resolveResult = result || buildResult(event, 100, 'Event not tracked, no destination plugins on the instance');\n resolve(resolveResult);\n });\n return [2 /*return*/];\n }\n });\n });\n };\n Timeline.prototype.flush = function () {\n return __awaiter(this, void 0, void 0, function () {\n var queue, destination, executeDestinations;\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n queue = this.queue;\n this.queue = [];\n return [4 /*yield*/, Promise.all(queue.map(function (item) { return _this.apply(item); }))];\n case 1:\n _a.sent();\n destination = this.plugins.filter(function (plugin) { return plugin.type === 'destination'; });\n executeDestinations = destination.map(function (plugin) {\n return plugin.flush && plugin.flush();\n });\n return [4 /*yield*/, Promise.all(executeDestinations)];\n case 2:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n Timeline.prototype.onIdentityChanged = function (identity) {\n this.plugins.forEach(function (plugin) {\n var _a;\n // Intentionally to not await plugin.onIdentityChanged() for non-blocking.\n // Ignore optional channing next line for test coverage.\n // If the plugin doesn't implement it, it won't be called.\n /* istanbul ignore next */\n void ((_a = plugin.onIdentityChanged) === null || _a === void 0 ? void 0 : _a.call(plugin, identity));\n });\n };\n Timeline.prototype.onSessionIdChanged = function (sessionId) {\n this.plugins.forEach(function (plugin) {\n var _a;\n // Intentionally to not await plugin.onSessionIdChanged() for non-blocking.\n // Ignore optional channing next line for test coverage.\n // If the plugin doesn't implement it, it won't be called.\n /* istanbul ignore next */\n void ((_a = plugin.onSessionIdChanged) === null || _a === void 0 ? void 0 : _a.call(plugin, sessionId));\n });\n };\n Timeline.prototype.onOptOutChanged = function (optOut) {\n this.plugins.forEach(function (plugin) {\n var _a;\n // Intentionally to not await plugin.onOptOutChanged() for non-blocking.\n // Ignore optional channing next line for test coverage.\n // If the plugin doesn't implement it, it won't be called.\n /* istanbul ignore next */\n void ((_a = plugin.onOptOutChanged) === null || _a === void 0 ? void 0 : _a.call(plugin, optOut));\n });\n };\n Timeline.prototype.onReset = function () {\n this.plugins.forEach(function (plugin) {\n var _a;\n // Intentionally to not await plugin.onReset() for non-blocking.\n // Ignore optional channing next line for test coverage.\n // If the plugin doesn't implement it, it won't be called.\n /* istanbul ignore next */\n void ((_a = plugin.onReset) === null || _a === void 0 ? void 0 : _a.call(plugin));\n });\n };\n return Timeline;\n}());\nexport { Timeline };\n//# sourceMappingURL=timeline.js.map","import { __assign } from \"tslib\";\nimport { Identify } from '../identify';\nimport { SpecialEventType } from '../types/event/event';\nexport var createTrackEvent = function (eventInput, eventProperties, eventOptions) {\n var baseEvent = typeof eventInput === 'string' ? { event_type: eventInput } : eventInput;\n return __assign(__assign(__assign({}, baseEvent), eventOptions), (eventProperties && { event_properties: eventProperties }));\n};\nexport var createIdentifyEvent = function (identify, eventOptions) {\n var identifyEvent = __assign(__assign({}, eventOptions), { event_type: SpecialEventType.IDENTIFY, user_properties: identify.getUserProperties() });\n return identifyEvent;\n};\nexport var createGroupIdentifyEvent = function (groupType, groupName, identify, eventOptions) {\n var _a;\n var groupIdentify = __assign(__assign({}, eventOptions), { event_type: SpecialEventType.GROUP_IDENTIFY, group_properties: identify.getUserProperties(), groups: (_a = {},\n _a[groupType] = groupName,\n _a) });\n return groupIdentify;\n};\nexport var createGroupEvent = function (groupType, groupName, eventOptions) {\n var _a;\n var identify = new Identify();\n identify.set(groupType, groupName);\n var groupEvent = __assign(__assign({}, eventOptions), { event_type: SpecialEventType.IDENTIFY, user_properties: identify.getUserProperties(), groups: (_a = {},\n _a[groupType] = groupName,\n _a) });\n return groupEvent;\n};\nexport var createRevenueEvent = function (revenue, eventOptions) {\n return __assign(__assign({}, eventOptions), { event_type: SpecialEventType.REVENUE, event_properties: revenue.getEventProperties() });\n};\n//# sourceMappingURL=event-builder.js.map","export var returnWrapper = function (awaitable) { return ({\n promise: awaitable || Promise.resolve(),\n}); };\n//# sourceMappingURL=return-wrapper.js.map","import { __awaiter, __generator, __values } from \"tslib\";\nimport { IdentifyOperation, SpecialEventType, } from './types/event/event';\nimport { OrderedIdentifyOperations } from './identify';\nimport { CLIENT_NOT_INITIALIZED, OPT_OUT_MESSAGE } from './types/messages';\nimport { Timeline } from './timeline';\nimport { createGroupEvent, createGroupIdentifyEvent, createIdentifyEvent, createRevenueEvent, createTrackEvent, } from './utils/event-builder';\nimport { buildResult } from './utils/result-builder';\nimport { returnWrapper } from './utils/return-wrapper';\nvar AmplitudeCore = /** @class */ (function () {\n function AmplitudeCore(name) {\n if (name === void 0) { name = '$default'; }\n this.initializing = false;\n this.isReady = false;\n this.q = [];\n this.dispatchQ = [];\n this.logEvent = this.track.bind(this);\n this.timeline = new Timeline(this);\n this.name = name;\n }\n AmplitudeCore.prototype._init = function (config) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n this.config = config;\n this.timeline.reset(this);\n this.timeline.loggerProvider = this.config.loggerProvider;\n return [4 /*yield*/, this.runQueuedFunctions('q')];\n case 1:\n _a.sent();\n this.isReady = true;\n return [2 /*return*/];\n }\n });\n });\n };\n AmplitudeCore.prototype.runQueuedFunctions = function (queueName) {\n return __awaiter(this, void 0, void 0, function () {\n var queuedFunctions, queuedFunctions_1, queuedFunctions_1_1, queuedFunction, val, e_1_1;\n var e_1, _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n queuedFunctions = this[queueName];\n this[queueName] = [];\n _b.label = 1;\n case 1:\n _b.trys.push([1, 8, 9, 10]);\n queuedFunctions_1 = __values(queuedFunctions), queuedFunctions_1_1 = queuedFunctions_1.next();\n _b.label = 2;\n case 2:\n if (!!queuedFunctions_1_1.done) return [3 /*break*/, 7];\n queuedFunction = queuedFunctions_1_1.value;\n val = queuedFunction();\n if (!(val && 'promise' in val)) return [3 /*break*/, 4];\n return [4 /*yield*/, val.promise];\n case 3:\n _b.sent();\n return [3 /*break*/, 6];\n case 4: return [4 /*yield*/, val];\n case 5:\n _b.sent();\n _b.label = 6;\n case 6:\n queuedFunctions_1_1 = queuedFunctions_1.next();\n return [3 /*break*/, 2];\n case 7: return [3 /*break*/, 10];\n case 8:\n e_1_1 = _b.sent();\n e_1 = { error: e_1_1 };\n return [3 /*break*/, 10];\n case 9:\n try {\n if (queuedFunctions_1_1 && !queuedFunctions_1_1.done && (_a = queuedFunctions_1.return)) _a.call(queuedFunctions_1);\n }\n finally { if (e_1) throw e_1.error; }\n return [7 /*endfinally*/];\n case 10:\n if (!this[queueName].length) return [3 /*break*/, 12];\n return [4 /*yield*/, this.runQueuedFunctions(queueName)];\n case 11:\n _b.sent();\n _b.label = 12;\n case 12: return [2 /*return*/];\n }\n });\n });\n };\n AmplitudeCore.prototype.track = function (eventInput, eventProperties, eventOptions) {\n var event = createTrackEvent(eventInput, eventProperties, eventOptions);\n return returnWrapper(this.dispatch(event));\n };\n AmplitudeCore.prototype.identify = function (identify, eventOptions) {\n var event = createIdentifyEvent(identify, eventOptions);\n return returnWrapper(this.dispatch(event));\n };\n AmplitudeCore.prototype.groupIdentify = function (groupType, groupName, identify, eventOptions) {\n var event = createGroupIdentifyEvent(groupType, groupName, identify, eventOptions);\n return returnWrapper(this.dispatch(event));\n };\n AmplitudeCore.prototype.setGroup = function (groupType, groupName, eventOptions) {\n var event = createGroupEvent(groupType, groupName, eventOptions);\n return returnWrapper(this.dispatch(event));\n };\n AmplitudeCore.prototype.revenue = function (revenue, eventOptions) {\n var event = createRevenueEvent(revenue, eventOptions);\n return returnWrapper(this.dispatch(event));\n };\n AmplitudeCore.prototype.add = function (plugin) {\n if (!this.isReady) {\n this.q.push(this._addPlugin.bind(this, plugin));\n return returnWrapper();\n }\n return this._addPlugin(plugin);\n };\n AmplitudeCore.prototype._addPlugin = function (plugin) {\n return returnWrapper(this.timeline.register(plugin, this.config));\n };\n AmplitudeCore.prototype.remove = function (pluginName) {\n if (!this.isReady) {\n this.q.push(this._removePlugin.bind(this, pluginName));\n return returnWrapper();\n }\n return this._removePlugin(pluginName);\n };\n AmplitudeCore.prototype._removePlugin = function (pluginName) {\n return returnWrapper(this.timeline.deregister(pluginName, this.config));\n };\n AmplitudeCore.prototype.dispatchWithCallback = function (event, callback) {\n if (!this.isReady) {\n return callback(buildResult(event, 0, CLIENT_NOT_INITIALIZED));\n }\n void this.process(event).then(callback);\n };\n AmplitudeCore.prototype.dispatch = function (event) {\n return __awaiter(this, void 0, void 0, function () {\n var _this = this;\n return __generator(this, function (_a) {\n if (!this.isReady) {\n return [2 /*return*/, new Promise(function (resolve) {\n _this.dispatchQ.push(_this.dispatchWithCallback.bind(_this, event, resolve));\n })];\n }\n return [2 /*return*/, this.process(event)];\n });\n });\n };\n /**\n *\n * This method applies identify operations to user properties and\n * returns a single object representing the final user property state.\n *\n * This is a best-effort api that only supports $set, $clearAll, and $unset.\n * Other operations are not supported and are ignored.\n *\n *\n * @param userProperties The `event.userProperties` object from an Identify event.\n * @returns A key-value object user properties without operations.\n *\n * @example\n * Input:\n * {\n * $set: { plan: 'premium' },\n * custom_flag: true\n * }\n *\n * Output:\n * {\n * plan: 'premium',\n * custom_flag: true\n * }\n */\n AmplitudeCore.prototype.getOperationAppliedUserProperties = function (userProperties) {\n var updatedProperties = {};\n if (userProperties === undefined) {\n return updatedProperties;\n }\n // Keep non-operation keys for later merge\n var nonOpProperties = {};\n Object.keys(userProperties).forEach(function (key) {\n if (!Object.values(IdentifyOperation).includes(key)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n nonOpProperties[key] = userProperties[key];\n }\n });\n OrderedIdentifyOperations.forEach(function (operation) {\n // Skip when key is an operation.\n if (!Object.keys(userProperties).includes(operation))\n return;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n var opProperties = userProperties[operation];\n switch (operation) {\n case IdentifyOperation.CLEAR_ALL:\n // Due to operation order, the following line will never execute.\n /* istanbul ignore next */\n Object.keys(updatedProperties).forEach(function (prop) {\n delete updatedProperties[prop];\n });\n break;\n case IdentifyOperation.UNSET:\n Object.keys(opProperties).forEach(function (prop) {\n delete updatedProperties[prop];\n });\n break;\n case IdentifyOperation.SET:\n Object.assign(updatedProperties, opProperties);\n break;\n }\n });\n // Merge non-operation properties.\n // Custom properties should not be affected by operations.\n // https://github.com/amplitude/nova/blob/343f678ded83c032e83b189796b3c2be161b48f5/src/main/java/com/amplitude/userproperty/model/ModifyUserPropertiesIdent.java#L79-L83\n Object.assign(updatedProperties, nonOpProperties);\n return updatedProperties;\n };\n AmplitudeCore.prototype.process = function (event) {\n return __awaiter(this, void 0, void 0, function () {\n var userProperties, result, e_2, message, result;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 2, , 3]);\n // skip event processing if opt out\n if (this.config.optOut) {\n return [2 /*return*/, buildResult(event, 0, OPT_OUT_MESSAGE)];\n }\n if (event.event_type === SpecialEventType.IDENTIFY) {\n userProperties = this.getOperationAppliedUserProperties(event.user_properties);\n this.timeline.onIdentityChanged({ userProperties: userProperties });\n }\n return [4 /*yield*/, this.timeline.push(event)];\n case 1:\n result = _a.sent();\n result.code === 200\n ? this.config.loggerProvider.log(result.message)\n : result.code === 100\n ? this.config.loggerProvider.warn(result.message)\n : this.config.loggerProvider.error(result.message);\n return [2 /*return*/, result];\n case 2:\n e_2 = _a.sent();\n message = String(e_2);\n this.config.loggerProvider.error(message);\n result = buildResult(event, 0, message);\n return [2 /*return*/, result];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n AmplitudeCore.prototype.setOptOut = function (optOut) {\n if (!this.isReady) {\n this.q.push(this._setOptOut.bind(this, Boolean(optOut)));\n return;\n }\n this._setOptOut(optOut);\n };\n AmplitudeCore.prototype._setOptOut = function (optOut) {\n if (this.config.optOut !== optOut) {\n this.timeline.onOptOutChanged(optOut);\n this.config.optOut = Boolean(optOut);\n }\n };\n AmplitudeCore.prototype.flush = function () {\n return returnWrapper(this.timeline.flush());\n };\n AmplitudeCore.prototype.plugin = function (name) {\n var plugin = this.timeline.plugins.find(function (plugin) { return plugin.name === name; });\n if (plugin === undefined) {\n this.config.loggerProvider.debug(\"Cannot find plugin with name \".concat(name));\n return undefined;\n }\n return plugin;\n };\n AmplitudeCore.prototype.plugins = function (pluginClass) {\n return this.timeline.plugins.filter(function (plugin) { return plugin instanceof pluginClass; });\n };\n return AmplitudeCore;\n}());\nexport { AmplitudeCore };\n//# sourceMappingURL=core-client.js.map","export var SUCCESS_MESSAGE = 'Event tracked successfully';\nexport var UNEXPECTED_ERROR_MESSAGE = 'Unexpected error occurred';\nexport var MAX_RETRIES_EXCEEDED_MESSAGE = 'Event rejected due to exceeded retry count';\nexport var OPT_OUT_MESSAGE = 'Event skipped due to optOut config';\nexport var MISSING_API_KEY_MESSAGE = 'Event rejected due to missing API key';\nexport var INVALID_API_KEY = 'Invalid API key';\nexport var CLIENT_NOT_INITIALIZED = 'Client not initialized';\n//# sourceMappingURL=messages.js.map","// Creates an array of elements split into groups the length of size.\n// If array can't be split evenly, the final chunk will be the remaining elements.\n// Works similary as https://lodash.com/docs/4.17.15#chunk\nexport var chunk = function (arr, size) {\n var chunkSize = Math.max(size, 1);\n return arr.reduce(function (chunks, element, index) {\n var chunkIndex = Math.floor(index / chunkSize);\n if (!chunks[chunkIndex]) {\n chunks[chunkIndex] = [];\n }\n chunks[chunkIndex].push(element);\n return chunks;\n }, []);\n};\n//# sourceMappingURL=chunk.js.map","export var LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"None\"] = 0] = \"None\";\n LogLevel[LogLevel[\"Error\"] = 1] = \"Error\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Verbose\"] = 3] = \"Verbose\";\n LogLevel[LogLevel[\"Debug\"] = 4] = \"Debug\";\n})(LogLevel || (LogLevel = {}));\n//# sourceMappingURL=loglevel.js.map","import { LogLevel } from './types/loglevel';\nvar PREFIX = 'Amplitude Logger ';\nvar Logger = /** @class */ (function () {\n function Logger() {\n this.logLevel = LogLevel.None;\n }\n Logger.prototype.disable = function () {\n this.logLevel = LogLevel.None;\n };\n Logger.prototype.enable = function (logLevel) {\n if (logLevel === void 0) { logLevel = LogLevel.Warn; }\n this.logLevel = logLevel;\n };\n Logger.prototype.log = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (this.logLevel < LogLevel.Verbose) {\n return;\n }\n console.log(\"\".concat(PREFIX, \"[Log]: \").concat(args.join(' ')));\n };\n Logger.prototype.warn = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (this.logLevel < LogLevel.Warn) {\n return;\n }\n console.warn(\"\".concat(PREFIX, \"[Warn]: \").concat(args.join(' ')));\n };\n Logger.prototype.error = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (this.logLevel < LogLevel.Error) {\n return;\n }\n console.error(\"\".concat(PREFIX, \"[Error]: \").concat(args.join(' ')));\n };\n Logger.prototype.debug = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (this.logLevel < LogLevel.Debug) {\n return;\n }\n // console.debug output is hidden by default in chrome\n console.log(\"\".concat(PREFIX, \"[Debug]: \").concat(args.join(' ')));\n };\n return Logger;\n}());\nexport { Logger };\n//# sourceMappingURL=logger.js.map","import { AMPLITUDE_SERVER_URL, AMPLITUDE_BATCH_SERVER_URL, EU_AMPLITUDE_SERVER_URL, EU_AMPLITUDE_BATCH_SERVER_URL, DEFAULT_INSTANCE_NAME, } from './types/constants';\nimport { Logger } from './logger';\nimport { LogLevel } from './types/loglevel';\nexport var getDefaultConfig = function () { return ({\n flushMaxRetries: 12,\n flushQueueSize: 200,\n flushIntervalMillis: 10000,\n instanceName: DEFAULT_INSTANCE_NAME,\n logLevel: LogLevel.Warn,\n loggerProvider: new Logger(),\n offline: false,\n optOut: false,\n serverUrl: AMPLITUDE_SERVER_URL,\n serverZone: 'US',\n useBatch: false,\n}); };\nvar Config = /** @class */ (function () {\n function Config(options) {\n var _a, _b, _c, _d;\n this._optOut = false;\n var defaultConfig = getDefaultConfig();\n this.apiKey = options.apiKey;\n this.flushIntervalMillis = (_a = options.flushIntervalMillis) !== null && _a !== void 0 ? _a : defaultConfig.flushIntervalMillis;\n this.flushMaxRetries = options.flushMaxRetries || defaultConfig.flushMaxRetries;\n this.flushQueueSize = options.flushQueueSize || defaultConfig.flushQueueSize;\n this.instanceName = options.instanceName || defaultConfig.instanceName;\n this.loggerProvider = options.loggerProvider || defaultConfig.loggerProvider;\n this.logLevel = (_b = options.logLevel) !== null && _b !== void 0 ? _b : defaultConfig.logLevel;\n this.minIdLength = options.minIdLength;\n this.plan = options.plan;\n this.ingestionMetadata = options.ingestionMetadata;\n this.offline = options.offline !== undefined ? options.offline : defaultConfig.offline;\n this.optOut = (_c = options.optOut) !== null && _c !== void 0 ? _c : defaultConfig.optOut;\n this.serverUrl = options.serverUrl;\n this.serverZone = options.serverZone || defaultConfig.serverZone;\n this.storageProvider = options.storageProvider;\n this.transportProvider = options.transportProvider;\n this.useBatch = (_d = options.useBatch) !== null && _d !== void 0 ? _d : defaultConfig.useBatch;\n this.loggerProvider.enable(this.logLevel);\n var serverConfig = createServerConfig(options.serverUrl, options.serverZone, options.useBatch);\n this.serverZone = serverConfig.serverZone;\n this.serverUrl = serverConfig.serverUrl;\n }\n Object.defineProperty(Config.prototype, \"optOut\", {\n get: function () {\n return this._optOut;\n },\n set: function (optOut) {\n this._optOut = optOut;\n },\n enumerable: false,\n configurable: true\n });\n return Config;\n}());\nexport { Config };\nexport var getServerUrl = function (serverZone, useBatch) {\n if (serverZone === 'EU') {\n return useBatch ? EU_AMPLITUDE_BATCH_SERVER_URL : EU_AMPLITUDE_SERVER_URL;\n }\n return useBatch ? AMPLITUDE_BATCH_SERVER_URL : AMPLITUDE_SERVER_URL;\n};\nexport var createServerConfig = function (serverUrl, serverZone, useBatch) {\n if (serverUrl === void 0) { serverUrl = ''; }\n if (serverZone === void 0) { serverZone = getDefaultConfig().serverZone; }\n if (useBatch === void 0) { useBatch = getDefaultConfig().useBatch; }\n if (serverUrl) {\n return { serverUrl: serverUrl, serverZone: undefined };\n }\n var _serverZone = ['US', 'EU'].includes(serverZone) ? serverZone : getDefaultConfig().serverZone;\n return {\n serverZone: _serverZone,\n serverUrl: getServerUrl(_serverZone, useBatch),\n };\n};\nvar RequestMetadata = /** @class */ (function () {\n function RequestMetadata() {\n this.sdk = {\n metrics: {\n histogram: {},\n },\n };\n }\n RequestMetadata.prototype.recordHistogram = function (key, value) {\n this.sdk.metrics.histogram[key] = value;\n };\n return RequestMetadata;\n}());\nexport { RequestMetadata };\nvar HistogramOptions = /** @class */ (function () {\n function HistogramOptions() {\n }\n return HistogramOptions;\n}());\n//# sourceMappingURL=config.js.map","/**\n * Checks if an HTTP status code indicates success (2xx range)\n * @param code - The HTTP status code to check\n * @returns true if the status code is in the 2xx range, false otherwise\n */\nexport function isSuccessStatusCode(code) {\n return code >= 200 && code < 300;\n}\n//# sourceMappingURL=status-code.js.map","import { __assign, __values } from \"tslib\";\nimport { LogLevel } from '../types/loglevel';\nexport var getStacktrace = function (ignoreDepth) {\n if (ignoreDepth === void 0) { ignoreDepth = 0; }\n var trace = new Error().stack || '';\n return trace\n .split('\\n')\n .slice(2 + ignoreDepth)\n .map(function (text) { return text.trim(); });\n};\n// This hook makes sure we always get the latest logger and logLevel.\nexport var getClientLogConfig = function (client) { return function () {\n var _a = __assign({}, client.config), logger = _a.loggerProvider, logLevel = _a.logLevel;\n return {\n logger: logger,\n logLevel: logLevel,\n };\n}; };\n// This is a convenient function to get the attribute from object with string path, similar to lodash '#get'.\nexport var getValueByStringPath = function (obj, path) {\n var e_1, _a;\n path = path.replace(/\\[(\\w+)\\]/g, '.$1'); // convert indexes to properties\n path = path.replace(/^\\./, ''); // strip a leading dot\n try {\n for (var _b = __values(path.split('.')), _c = _b.next(); !_c.done; _c = _b.next()) {\n var attr = _c.value;\n if (attr in obj) {\n obj = obj[attr];\n }\n else {\n return;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return obj;\n};\nexport var getClientStates = function (client, paths) { return function () {\n var e_2, _a;\n var res = {};\n try {\n for (var paths_1 = __values(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) {\n var path = paths_1_1.value;\n res[path] = getValueByStringPath(client, path);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n return res;\n}; };\nexport var debugWrapper = function (fn, fnName, getLogConfig, getStates, fnContext) {\n if (fnContext === void 0) { fnContext = null; }\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var _a = getLogConfig(), logger = _a.logger, logLevel = _a.logLevel;\n // return early if possible to reduce overhead\n if ((logLevel && logLevel < LogLevel.Debug) || !logLevel || !logger) {\n return fn.apply(fnContext, args);\n }\n var debugContext = {\n type: 'invoke public method',\n name: fnName,\n args: args,\n stacktrace: getStacktrace(1),\n time: {\n start: new Date().toISOString(),\n },\n states: {},\n };\n if (getStates && debugContext.states) {\n debugContext.states.before = getStates();\n }\n var result = fn.apply(fnContext, args);\n if (result && result.promise) {\n // if result is a promise, add the callback\n result.promise.then(function () {\n if (getStates && debugContext.states) {\n debugContext.states.after = getStates();\n }\n if (debugContext.time) {\n debugContext.time.end = new Date().toISOString();\n }\n logger.debug(JSON.stringify(debugContext, null, 2));\n });\n }\n else {\n if (getStates && debugContext.states) {\n debugContext.states.after = getStates();\n }\n if (debugContext.time) {\n debugContext.time.end = new Date().toISOString();\n }\n logger.debug(JSON.stringify(debugContext, null, 2));\n }\n return result;\n };\n};\n//# sourceMappingURL=debug.js.map","import { __awaiter, __generator, __read, __rest, __spreadArray } from \"tslib\";\nimport { Status } from '../types/status';\nimport { INVALID_API_KEY, MAX_RETRIES_EXCEEDED_MESSAGE, MISSING_API_KEY_MESSAGE, SUCCESS_MESSAGE, UNEXPECTED_ERROR_MESSAGE, } from '../types/messages';\nimport { STORAGE_PREFIX } from '../types/constants';\nimport { chunk } from '../utils/chunk';\nimport { buildResult } from '../utils/result-builder';\nimport { createServerConfig, RequestMetadata } from '../config';\nimport { UUID } from '../utils/uuid';\nimport { isSuccessStatusCode } from '../utils/status-code';\nimport { getStacktrace } from '../utils/debug';\nfunction getErrorMessage(error) {\n if (error instanceof Error)\n return error.message;\n return String(error);\n}\nexport function getResponseBodyString(res) {\n var responseBodyString = '';\n try {\n if ('body' in res) {\n responseBodyString = JSON.stringify(res.body, null, 2);\n }\n }\n catch (_a) {\n // to avoid crash, but don't care about the error, add comment to avoid empty block lint error\n }\n return responseBodyString;\n}\nvar Destination = /** @class */ (function () {\n function Destination(context) {\n this.name = 'amplitude';\n this.type = 'destination';\n this.retryTimeout = 1000;\n this.throttleTimeout = 30000;\n this.storageKey = '';\n // Indicator of whether events that are scheduled (but not flushed yet).\n // When flush:\n // 1. assign `scheduleId` to `flushId`\n // 2. set `scheduleId` to null\n this.scheduleId = null;\n // Timeout in milliseconds of current schedule\n this.scheduledTimeout = 0;\n // Indicator of whether current flush resolves.\n // When flush resolves, set `flushId` to null\n this.flushId = null;\n this.queue = [];\n this.diagnosticsClient = context === null || context === void 0 ? void 0 : context.diagnosticsClient;\n }\n Destination.prototype.setup = function (config) {\n var _a;\n return __awaiter(this, void 0, void 0, function () {\n var unsent;\n var _this = this;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n this.config = config;\n this.storageKey = \"\".concat(STORAGE_PREFIX, \"_\").concat(this.config.apiKey.substring(0, 10));\n return [4 /*yield*/, ((_a = this.config.storageProvider) === null || _a === void 0 ? void 0 : _a.get(this.storageKey))];\n case 1:\n unsent = _b.sent();\n if (unsent && unsent.length > 0) {\n void Promise.all(unsent.map(function (event) { return _this.execute(event); })).catch();\n }\n return [2 /*return*/, Promise.resolve(undefined)];\n }\n });\n });\n };\n Destination.prototype.execute = function (event) {\n var _this = this;\n // Assign insert_id for dropping invalid event later\n if (!event.insert_id) {\n event.insert_id = UUID();\n }\n return new Promise(function (resolve) {\n var context = {\n event: event,\n attempts: 0,\n callback: function (result) { return resolve(result); },\n timeout: 0,\n };\n _this.queue.push(context);\n _this.schedule(_this.config.flushIntervalMillis);\n _this.saveEvents();\n });\n };\n Destination.prototype.removeEventsExceedFlushMaxRetries = function (list) {\n var _this = this;\n return list.filter(function (context) {\n context.attempts += 1;\n if (context.attempts < _this.config.flushMaxRetries) {\n return true;\n }\n void _this.fulfillRequest([context], 500, MAX_RETRIES_EXCEEDED_MESSAGE);\n return false;\n });\n };\n Destination.prototype.scheduleEvents = function (list) {\n var _this = this;\n list.forEach(function (context) {\n _this.schedule(context.timeout === 0 ? _this.config.flushIntervalMillis : context.timeout);\n });\n };\n // Schedule a flush in timeout when\n // 1. No schedule\n // 2. Timeout greater than existing timeout.\n // This makes sure that when throttled, no flush when throttle timeout expires.\n Destination.prototype.schedule = function (timeout) {\n var _this = this;\n if (this.config.offline) {\n return;\n }\n if (this.scheduleId === null || (this.scheduleId && timeout > this.scheduledTimeout)) {\n if (this.scheduleId) {\n clearTimeout(this.scheduleId);\n }\n this.scheduledTimeout = timeout;\n this.scheduleId = setTimeout(function () {\n _this.queue = _this.queue.map(function (context) {\n context.timeout = 0;\n return context;\n });\n void _this.flush(true);\n }, timeout);\n return;\n }\n };\n // Mark current schedule is flushed.\n Destination.prototype.resetSchedule = function () {\n this.scheduleId = null;\n this.scheduledTimeout = 0;\n };\n // Flush all events regardless of their timeout\n Destination.prototype.flush = function (useRetry) {\n if (useRetry === void 0) { useRetry = false; }\n return __awaiter(this, void 0, void 0, function () {\n var list, later, batches;\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n // Skip flush if offline\n if (this.config.offline) {\n this.resetSchedule();\n this.config.loggerProvider.debug('Skipping flush while offline.');\n return [2 /*return*/];\n }\n if (this.flushId) {\n this.resetSchedule();\n this.config.loggerProvider.debug('Skipping flush because previous flush has not resolved.');\n return [2 /*return*/];\n }\n this.flushId = this.scheduleId;\n this.resetSchedule();\n list = [];\n later = [];\n this.queue.forEach(function (context) { return (context.timeout === 0 ? list.push(context) : later.push(context)); });\n batches = chunk(list, this.config.flushQueueSize);\n // Promise.all() doesn't guarantee resolve order.\n // Sequentially resolve to make sure backend receives events in order\n return [4 /*yield*/, batches.reduce(function (promise, batch) { return __awaiter(_this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, promise];\n case 1:\n _a.sent();\n return [4 /*yield*/, this.send(batch, useRetry)];\n case 2: return [2 /*return*/, _a.sent()];\n }\n });\n }); }, Promise.resolve())];\n case 1:\n // Promise.all() doesn't guarantee resolve order.\n // Sequentially resolve to make sure backend receives events in order\n _a.sent();\n // Mark current flush is done\n this.flushId = null;\n this.scheduleEvents(this.queue);\n return [2 /*return*/];\n }\n });\n });\n };\n Destination.prototype.send = function (list, useRetry) {\n var _a;\n if (useRetry === void 0) { useRetry = true; }\n return __awaiter(this, void 0, void 0, function () {\n var payload, serverUrl, res, e_1, errorMessage;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n if (!this.config.apiKey) {\n return [2 /*return*/, this.fulfillRequest(list, 400, MISSING_API_KEY_MESSAGE)];\n }\n payload = {\n api_key: this.config.apiKey,\n events: list.map(function (context) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n var _a = context.event, extra = _a.extra, eventWithoutExtra = __rest(_a, [\"extra\"]);\n return eventWithoutExtra;\n }),\n options: {\n min_id_length: this.config.minIdLength,\n },\n client_upload_time: new Date().toISOString(),\n request_metadata: this.config.requestMetadata,\n };\n this.config.requestMetadata = new RequestMetadata();\n _b.label = 1;\n case 1:\n _b.trys.push([1, 3, , 4]);\n serverUrl = createServerConfig(this.config.serverUrl, this.config.serverZone, this.config.useBatch).serverUrl;\n return [4 /*yield*/, this.config.transportProvider.send(serverUrl, payload)];\n case 2:\n res = _b.sent();\n if (res === null) {\n this.fulfillRequest(list, 0, UNEXPECTED_ERROR_MESSAGE);\n return [2 /*return*/];\n }\n if (!useRetry) {\n if ('body' in res) {\n this.fulfillRequest(list, res.statusCode, \"\".concat(res.status, \": \").concat(getResponseBodyString(res)));\n }\n else {\n this.fulfillRequest(list, res.statusCode, res.status);\n }\n return [2 /*return*/];\n }\n this.handleResponse(res, list);\n return [3 /*break*/, 4];\n case 3:\n e_1 = _b.sent();\n errorMessage = getErrorMessage(e_1);\n this.config.loggerProvider.error(errorMessage);\n (_a = this.diagnosticsClient) === null || _a === void 0 ? void 0 : _a.recordEvent('analytics.events.unsuccessful.from.catch.error', {\n events: list.map(function (context) { return context.event.event_type; }),\n message: errorMessage,\n stack_trace: getStacktrace(),\n });\n this.handleResponse({ status: Status.Failed, statusCode: 0 }, list);\n return [3 /*break*/, 4];\n case 4: return [2 /*return*/];\n }\n });\n });\n };\n Destination.prototype.handleResponse = function (res, list) {\n var _a;\n if (!isSuccessStatusCode(res.statusCode)) {\n (_a = this.diagnosticsClient) === null || _a === void 0 ? void 0 : _a.recordEvent('analytics.events.unsuccessful', {\n events: list.map(function (context) { return context.event.event_type; }),\n code: res.statusCode,\n status: res.status,\n body: getResponseBodyString(res),\n stack_trace: getStacktrace(),\n });\n }\n var status = res.status;\n switch (status) {\n case Status.Success: {\n this.handleSuccessResponse(res, list);\n break;\n }\n case Status.Invalid: {\n this.handleInvalidResponse(res, list);\n break;\n }\n case Status.PayloadTooLarge: {\n this.handlePayloadTooLargeResponse(res, list);\n break;\n }\n case Status.RateLimit: {\n this.handleRateLimitResponse(res, list);\n break;\n }\n default: {\n // log intermediate event status before retry\n this.config.loggerProvider.warn(\"{code: 0, error: \\\"Status '\".concat(status, \"' provided for \").concat(list.length, \" events\\\"}\"));\n this.handleOtherResponse(list);\n break;\n }\n }\n };\n Destination.prototype.handleSuccessResponse = function (res, list) {\n this.fulfillRequest(list, res.statusCode, SUCCESS_MESSAGE);\n };\n Destination.prototype.handleInvalidResponse = function (res, list) {\n var _this = this;\n if (res.body.missingField || res.body.error.startsWith(INVALID_API_KEY)) {\n this.fulfillRequest(list, res.statusCode, res.body.error);\n return;\n }\n var dropIndex = __spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(Object.values(res.body.eventsWithInvalidFields)), false), __read(Object.values(res.body.eventsWithMissingFields)), false), __read(Object.values(res.body.eventsWithInvalidIdLengths)), false), __read(res.body.silencedEvents), false).flat();\n var dropIndexSet = new Set(dropIndex);\n var retry = list.filter(function (context, index) {\n if (dropIndexSet.has(index)) {\n _this.fulfillRequest([context], res.statusCode, res.body.error);\n return;\n }\n return true;\n });\n if (retry.length > 0) {\n // log intermediate event status before retry\n this.config.loggerProvider.warn(getResponseBodyString(res));\n }\n var tryable = this.removeEventsExceedFlushMaxRetries(retry);\n this.scheduleEvents(tryable);\n };\n Destination.prototype.handlePayloadTooLargeResponse = function (res, list) {\n if (list.length === 1) {\n this.fulfillRequest(list, res.statusCode, res.body.error);\n return;\n }\n // log intermediate event status before retry\n this.config.loggerProvider.warn(getResponseBodyString(res));\n this.config.flushQueueSize /= 2;\n var tryable = this.removeEventsExceedFlushMaxRetries(list);\n this.scheduleEvents(tryable);\n };\n Destination.prototype.handleRateLimitResponse = function (res, list) {\n var _this = this;\n var dropUserIds = Object.keys(res.body.exceededDailyQuotaUsers);\n var dropDeviceIds = Object.keys(res.body.exceededDailyQuotaDevices);\n var throttledIndex = res.body.throttledEvents;\n var dropUserIdsSet = new Set(dropUserIds);\n var dropDeviceIdsSet = new Set(dropDeviceIds);\n var throttledIndexSet = new Set(throttledIndex);\n var retry = list.filter(function (context, index) {\n if ((context.event.user_id && dropUserIdsSet.has(context.event.user_id)) ||\n (context.event.device_id && dropDeviceIdsSet.has(context.event.device_id))) {\n _this.fulfillRequest([context], res.statusCode, res.body.error);\n return;\n }\n if (throttledIndexSet.has(index)) {\n context.timeout = _this.throttleTimeout;\n }\n return true;\n });\n if (retry.length > 0) {\n // log intermediate event status before retry\n this.config.loggerProvider.warn(getResponseBodyString(res));\n }\n var tryable = this.removeEventsExceedFlushMaxRetries(retry);\n this.scheduleEvents(tryable);\n };\n Destination.prototype.handleOtherResponse = function (list) {\n var _this = this;\n var later = list.map(function (context) {\n context.timeout = context.attempts * _this.retryTimeout;\n return context;\n });\n var tryable = this.removeEventsExceedFlushMaxRetries(later);\n this.scheduleEvents(tryable);\n };\n Destination.prototype.fulfillRequest = function (list, code, message) {\n var _a, _b, _c;\n // Record diagnostics for dropped events (non-success status codes)\n if (!isSuccessStatusCode(code)) {\n (_a = this.diagnosticsClient) === null || _a === void 0 ? void 0 : _a.increment('analytics.events.dropped', list.length);\n (_b = this.diagnosticsClient) === null || _b === void 0 ? void 0 : _b.recordEvent('analytics.events.dropped', {\n events: list.map(function (context) { return context.event.event_type; }),\n code: code,\n message: message,\n stack_trace: getStacktrace(),\n });\n }\n else {\n (_c = this.diagnosticsClient) === null || _c === void 0 ? void 0 : _c.increment('analytics.events.sent', list.length);\n }\n this.removeEvents(list);\n list.forEach(function (context) { return context.callback(buildResult(context.event, code, message)); });\n };\n /**\n * This is called on\n * 1) new events are added to queue; or\n * 2) response comes back for a request\n *\n * Update the event storage based on the queue\n */\n Destination.prototype.saveEvents = function () {\n if (!this.config.storageProvider) {\n return;\n }\n var updatedEvents = this.queue.map(function (context) { return context.event; });\n void this.config.storageProvider.set(this.storageKey, updatedEvents);\n };\n /**\n * This is called on response comes back for a request\n */\n Destination.prototype.removeEvents = function (eventsToRemove) {\n this.queue = this.queue.filter(function (queuedContext) { return !eventsToRemove.some(function (context) { return context.event.insert_id === queuedContext.event.insert_id; }); });\n this.saveEvents();\n };\n return Destination;\n}());\nexport { Destination };\n//# sourceMappingURL=destination.js.map","var ApplicationContextProviderImpl = /** @class */ (function () {\n function ApplicationContextProviderImpl() {\n }\n ApplicationContextProviderImpl.prototype.getApplicationContext = function () {\n return {\n versionName: this.versionName,\n language: getLanguage(),\n platform: 'Web',\n os: undefined,\n deviceModel: undefined,\n };\n };\n return ApplicationContextProviderImpl;\n}());\nvar getLanguage = function () {\n return ((typeof navigator !== 'undefined' &&\n ((navigator.languages && navigator.languages[0]) ||\n navigator.language)) ||\n '');\n};\n\nvar EventBridgeImpl = /** @class */ (function () {\n function EventBridgeImpl() {\n this.queue = [];\n }\n EventBridgeImpl.prototype.logEvent = function (event) {\n if (!this.receiver) {\n if (this.queue.length < 512) {\n this.queue.push(event);\n }\n }\n else {\n this.receiver(event);\n }\n };\n EventBridgeImpl.prototype.setEventReceiver = function (receiver) {\n this.receiver = receiver;\n if (this.queue.length > 0) {\n this.queue.forEach(function (event) {\n receiver(event);\n });\n this.queue = [];\n }\n };\n return EventBridgeImpl;\n}());\n\n/******************************************************************************\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***************************************************************************** */\nvar __assign = function () {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nfunction __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\nfunction __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n return ar;\n}\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nvar isEqual = function (obj1, obj2) {\n var e_1, _a;\n var primitive = ['string', 'number', 'boolean', 'undefined'];\n var typeA = typeof obj1;\n var typeB = typeof obj2;\n if (typeA !== typeB) {\n return false;\n }\n try {\n for (var primitive_1 = __values(primitive), primitive_1_1 = primitive_1.next(); !primitive_1_1.done; primitive_1_1 = primitive_1.next()) {\n var p = primitive_1_1.value;\n if (p === typeA) {\n return obj1 === obj2;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (primitive_1_1 && !primitive_1_1.done && (_a = primitive_1.return)) _a.call(primitive_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n // check null\n if (obj1 == null && obj2 == null) {\n return true;\n }\n else if (obj1 == null || obj2 == null) {\n return false;\n }\n // if got here - objects\n if (obj1.length !== obj2.length) {\n return false;\n }\n //check if arrays\n var isArrayA = Array.isArray(obj1);\n var isArrayB = Array.isArray(obj2);\n if (isArrayA !== isArrayB) {\n return false;\n }\n if (isArrayA && isArrayB) {\n //arrays\n for (var i = 0; i < obj1.length; i++) {\n if (!isEqual(obj1[i], obj2[i])) {\n return false;\n }\n }\n }\n else {\n //objects\n var sorted1 = Object.keys(obj1).sort();\n var sorted2 = Object.keys(obj2).sort();\n if (!isEqual(sorted1, sorted2)) {\n return false;\n }\n //compare object values\n var result_1 = true;\n Object.keys(obj1).forEach(function (key) {\n if (!isEqual(obj1[key], obj2[key])) {\n result_1 = false;\n }\n });\n return result_1;\n }\n return true;\n};\n\nvar ID_OP_SET = '$set';\nvar ID_OP_UNSET = '$unset';\nvar ID_OP_CLEAR_ALL = '$clearAll';\n// Polyfill for Object.entries\nif (!Object.entries) {\n Object.entries = function (obj) {\n var ownProps = Object.keys(obj);\n var i = ownProps.length;\n var resArray = new Array(i);\n while (i--) {\n resArray[i] = [ownProps[i], obj[ownProps[i]]];\n }\n return resArray;\n };\n}\nvar IdentityStoreImpl = /** @class */ (function () {\n function IdentityStoreImpl() {\n this.identity = { userProperties: {} };\n this.listeners = new Set();\n }\n IdentityStoreImpl.prototype.editIdentity = function () {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n var self = this;\n var actingUserProperties = __assign({}, this.identity.userProperties);\n var actingIdentity = __assign(__assign({}, this.identity), { userProperties: actingUserProperties });\n return {\n setUserId: function (userId) {\n actingIdentity.userId = userId;\n return this;\n },\n setDeviceId: function (deviceId) {\n actingIdentity.deviceId = deviceId;\n return this;\n },\n setUserProperties: function (userProperties) {\n actingIdentity.userProperties = userProperties;\n return this;\n },\n setOptOut: function (optOut) {\n actingIdentity.optOut = optOut;\n return this;\n },\n updateUserProperties: function (actions) {\n var e_1, _a, e_2, _b, e_3, _c;\n var actingProperties = actingIdentity.userProperties || {};\n try {\n for (var _d = __values(Object.entries(actions)), _e = _d.next(); !_e.done; _e = _d.next()) {\n var _f = __read(_e.value, 2), action = _f[0], properties = _f[1];\n switch (action) {\n case ID_OP_SET:\n try {\n for (var _g = (e_2 = void 0, __values(Object.entries(properties))), _h = _g.next(); !_h.done; _h = _g.next()) {\n var _j = __read(_h.value, 2), key = _j[0], value = _j[1];\n actingProperties[key] = value;\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_h && !_h.done && (_b = _g.return)) _b.call(_g);\n }\n finally { if (e_2) throw e_2.error; }\n }\n break;\n case ID_OP_UNSET:\n try {\n for (var _k = (e_3 = void 0, __values(Object.keys(properties))), _l = _k.next(); !_l.done; _l = _k.next()) {\n var key = _l.value;\n delete actingProperties[key];\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (_l && !_l.done && (_c = _k.return)) _c.call(_k);\n }\n finally { if (e_3) throw e_3.error; }\n }\n break;\n case ID_OP_CLEAR_ALL:\n actingProperties = {};\n break;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_e && !_e.done && (_a = _d.return)) _a.call(_d);\n }\n finally { if (e_1) throw e_1.error; }\n }\n actingIdentity.userProperties = actingProperties;\n return this;\n },\n commit: function () {\n self.setIdentity(actingIdentity);\n return this;\n },\n };\n };\n IdentityStoreImpl.prototype.getIdentity = function () {\n return __assign({}, this.identity);\n };\n IdentityStoreImpl.prototype.setIdentity = function (identity) {\n var originalIdentity = __assign({}, this.identity);\n this.identity = __assign({}, identity);\n if (!isEqual(originalIdentity, this.identity)) {\n this.listeners.forEach(function (listener) {\n listener(identity);\n });\n }\n };\n IdentityStoreImpl.prototype.addIdentityListener = function (listener) {\n this.listeners.add(listener);\n };\n IdentityStoreImpl.prototype.removeIdentityListener = function (listener) {\n this.listeners.delete(listener);\n };\n return IdentityStoreImpl;\n}());\n\nvar safeGlobal = typeof globalThis !== 'undefined'\n ? globalThis\n : typeof global !== 'undefined'\n ? global\n : self;\n\nvar AnalyticsConnector = /** @class */ (function () {\n function AnalyticsConnector() {\n this.identityStore = new IdentityStoreImpl();\n this.eventBridge = new EventBridgeImpl();\n this.applicationContextProvider = new ApplicationContextProviderImpl();\n }\n AnalyticsConnector.getInstance = function (instanceName) {\n if (!safeGlobal['analyticsConnectorInstances']) {\n safeGlobal['analyticsConnectorInstances'] = {};\n }\n if (!safeGlobal['analyticsConnectorInstances'][instanceName]) {\n safeGlobal['analyticsConnectorInstances'][instanceName] =\n new AnalyticsConnector();\n }\n return safeGlobal['analyticsConnectorInstances'][instanceName];\n };\n return AnalyticsConnector;\n}());\n\nexport { AnalyticsConnector };\n","/**\n * @deprecated use ServerZoneType instead\n */\nexport var ServerZone;\n(function (ServerZone) {\n ServerZone[\"US\"] = \"US\";\n ServerZone[\"EU\"] = \"EU\";\n /**\n * Add for session-replay-browser migration from analytics-type v1.x.\n */\n ServerZone[\"STAGING\"] = \"STAGING\";\n})(ServerZone || (ServerZone = {}));\n//# sourceMappingURL=server-zone.js.map","import { AnalyticsConnector } from '@amplitude/analytics-connector';\nimport { DEFAULT_INSTANCE_NAME } from './types/constants';\nexport var getAnalyticsConnector = function (instanceName) {\n if (instanceName === void 0) { instanceName = DEFAULT_INSTANCE_NAME; }\n return AnalyticsConnector.getInstance(instanceName);\n};\nexport var setConnectorUserId = function (userId, instanceName) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n getAnalyticsConnector(instanceName).identityStore.editIdentity().setUserId(userId).commit();\n};\nexport var setConnectorDeviceId = function (deviceId, instanceName) {\n getAnalyticsConnector(instanceName).identityStore.editIdentity().setDeviceId(deviceId).commit();\n};\n//# sourceMappingURL=analytics-connector.js.map","import { __awaiter, __generator } from \"tslib\";\nimport { getAnalyticsConnector } from '../analytics-connector';\nvar IdentityEventSender = /** @class */ (function () {\n function IdentityEventSender() {\n this.name = 'identity';\n this.type = 'before';\n this.identityStore = getAnalyticsConnector().identityStore;\n }\n IdentityEventSender.prototype.execute = function (context) {\n return __awaiter(this, void 0, void 0, function () {\n var userProperties;\n return __generator(this, function (_a) {\n userProperties = context.user_properties;\n if (userProperties) {\n this.identityStore.editIdentity().updateUserProperties(userProperties).commit();\n }\n return [2 /*return*/, context];\n });\n });\n };\n IdentityEventSender.prototype.setup = function (config) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n if (config.instanceName) {\n this.identityStore = getAnalyticsConnector(config.instanceName).identityStore;\n }\n return [2 /*return*/];\n });\n });\n };\n return IdentityEventSender;\n}());\nexport { IdentityEventSender };\n//# sourceMappingURL=identity.js.map","export var isNewSession = function (sessionTimeout, lastEventTime) {\n if (lastEventTime === void 0) { lastEventTime = Date.now(); }\n var currentTime = Date.now();\n var timeSinceLastEvent = currentTime - lastEventTime;\n return timeSinceLastEvent > sessionTimeout;\n};\n//# sourceMappingURL=session.js.map","import { AMPLITUDE_PREFIX } from './types/constants';\nexport var getCookieName = function (apiKey, postKey, limit) {\n if (postKey === void 0) { postKey = ''; }\n if (limit === void 0) { limit = 10; }\n return [AMPLITUDE_PREFIX, postKey, apiKey.substring(0, limit)].filter(Boolean).join('_');\n};\nexport var getOldCookieName = function (apiKey) {\n return \"\".concat(AMPLITUDE_PREFIX.toLowerCase(), \"_\").concat(apiKey.substring(0, 6));\n};\n//# sourceMappingURL=cookie-name.js.map","export var getLanguage = function () {\n var _a, _b, _c, _d;\n if (typeof navigator === 'undefined')\n return '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n var userLanguage = navigator.userLanguage;\n return (_d = (_c = (_b = (_a = navigator.languages) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : navigator.language) !== null && _c !== void 0 ? _c : userLanguage) !== null && _d !== void 0 ? _d : '';\n};\n//# sourceMappingURL=language.js.map","import { getGlobalScope } from './global-scope';\nexport var getQueryParams = function () {\n var _a;\n var globalScope = getGlobalScope();\n /* istanbul ignore if */\n if (!((_a = globalScope === null || globalScope === void 0 ? void 0 : globalScope.location) === null || _a === void 0 ? void 0 : _a.search)) {\n return {};\n }\n var pairs = globalScope.location.search.substring(1).split('&').filter(Boolean);\n var params = pairs.reduce(function (acc, curr) {\n var query = curr.split('=', 2);\n var key = tryDecodeURIComponent(query[0]);\n var value = tryDecodeURIComponent(query[1]);\n if (!value) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n return params;\n};\nexport var tryDecodeURIComponent = function (value) {\n if (value === void 0) { value = ''; }\n try {\n return decodeURIComponent(value);\n }\n catch (_a) {\n return '';\n }\n};\n//# sourceMappingURL=query-params.js.map","/**\n * Checks if a given URL matches any pattern in an allowlist of URLs or regex patterns.\n * @param url - The URL to check\n * @param allowlist - Array of allowed URLs (strings) or regex patterns\n * @returns true if the URL matches any pattern in the allowlist, false otherwise\n */\nexport var isUrlMatchAllowlist = function (url, allowlist) {\n if (!allowlist || !allowlist.length) {\n return true;\n }\n return allowlist.some(function (allowedUrl) {\n if (typeof allowedUrl === 'string') {\n return url === allowedUrl;\n }\n return url.match(allowedUrl);\n });\n};\nexport var getDecodeURI = function (locationStr, loggerProvider) {\n var decodedLocationStr = locationStr;\n try {\n decodedLocationStr = decodeURI(locationStr);\n }\n catch (e) {\n /* istanbul ignore next */\n loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.error('Malformed URI sequence: ', e);\n }\n return decodedLocationStr;\n};\n//# sourceMappingURL=url-utils.js.map","export var generateHashCode = function (str) {\n var hash = 0;\n if (str.length === 0)\n return hash;\n for (var i = 0; i < str.length; i++) {\n var chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0;\n }\n return hash;\n};\nexport var isTimestampInSample = function (timestamp, sampleRate) {\n var hashNumber = generateHashCode(timestamp.toString());\n var absHash = Math.abs(hashNumber);\n var absHashMultiply = absHash * 31;\n var mod = absHashMultiply % 1000000;\n return mod / 1000000 < sampleRate;\n};\n// TODO(xinyi): replace the temp one in diagnostics client after the fix\n// istanbul ignore next\nexport var isTimestampInSampleTemp = function (timestamp, sampleRate) {\n var hashNumber = generateHashCode(timestamp.toString());\n var absHash = Math.abs(hashNumber);\n var absHashMultiply = absHash * 31;\n var mod = absHashMultiply % 100000;\n return mod / 100000 < sampleRate;\n};\n//# sourceMappingURL=sampling.js.map","import { __awaiter, __generator } from \"tslib\";\nvar MemoryStorage = /** @class */ (function () {\n function MemoryStorage() {\n this.memoryStorage = new Map();\n }\n MemoryStorage.prototype.isEnabled = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2 /*return*/, true];\n });\n });\n };\n MemoryStorage.prototype.get = function (key) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2 /*return*/, this.memoryStorage.get(key)];\n });\n });\n };\n MemoryStorage.prototype.getRaw = function (key) {\n return __awaiter(this, void 0, void 0, function () {\n var value;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.get(key)];\n case 1:\n value = _a.sent();\n return [2 /*return*/, value ? JSON.stringify(value) : undefined];\n }\n });\n });\n };\n MemoryStorage.prototype.set = function (key, value) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n this.memoryStorage.set(key, value);\n return [2 /*return*/];\n });\n });\n };\n MemoryStorage.prototype.remove = function (key) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n this.memoryStorage.delete(key);\n return [2 /*return*/];\n });\n });\n };\n MemoryStorage.prototype.reset = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n this.memoryStorage.clear();\n return [2 /*return*/];\n });\n });\n };\n return MemoryStorage;\n}());\nexport { MemoryStorage };\n//# sourceMappingURL=memory.js.map","import { __assign, __awaiter, __generator, __values } from \"tslib\";\nimport { getGlobalScope } from '../global-scope';\nimport { UUID } from '../utils/uuid';\nvar CookieStorage = /** @class */ (function () {\n function CookieStorage(options, config) {\n if (config === void 0) { config = {}; }\n this.options = __assign({}, options);\n this.config = config;\n }\n CookieStorage.prototype.isEnabled = function () {\n return __awaiter(this, void 0, void 0, function () {\n var testCookieOptions, testStorage, testKey, value, _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n /* istanbul ignore if */\n if (!getGlobalScope()) {\n return [2 /*return*/, false];\n }\n CookieStorage.testValue = String(Date.now());\n testCookieOptions = __assign(__assign({}, this.options), { expirationDays: 0.003 });\n testStorage = new CookieStorage(testCookieOptions);\n testKey = \"AMP_TEST_\".concat(UUID().substring(0, 8));\n _b.label = 1;\n case 1:\n _b.trys.push([1, 4, 5, 7]);\n return [4 /*yield*/, testStorage.set(testKey, CookieStorage.testValue)];\n case 2:\n _b.sent();\n return [4 /*yield*/, testStorage.get(testKey)];\n case 3:\n value = _b.sent();\n return [2 /*return*/, value === CookieStorage.testValue];\n case 4:\n _a = _b.sent();\n /* istanbul ignore next */\n return [2 /*return*/, false];\n case 5: return [4 /*yield*/, testStorage.remove(testKey)];\n case 6:\n _b.sent();\n return [7 /*endfinally*/];\n case 7: return [2 /*return*/];\n }\n });\n });\n };\n CookieStorage.prototype.get = function (key) {\n return __awaiter(this, void 0, void 0, function () {\n var value, decodedValue;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.getRaw(key)];\n case 1:\n value = _a.sent();\n if (!value) {\n return [2 /*return*/, undefined];\n }\n try {\n decodedValue = decodeCookieValue(value);\n if (decodedValue === undefined) {\n console.error(\"Amplitude Logger [Error]: Failed to decode cookie value for key: \".concat(key, \", value: \").concat(value));\n return [2 /*return*/, undefined];\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return [2 /*return*/, JSON.parse(decodedValue)];\n }\n catch (_b) {\n console.error(\"Amplitude Logger [Error]: Failed to parse cookie value for key: \".concat(key, \", value: \").concat(value));\n return [2 /*return*/, undefined];\n }\n return [2 /*return*/];\n }\n });\n });\n };\n CookieStorage.prototype.getRaw = function (key) {\n var _a, _b, _c, _d;\n return __awaiter(this, void 0, void 0, function () {\n var globalScope, globalScopeWithCookiesStore, cookieStore, cookies_2, cookies_1, cookies_1_1, cookie, ignoreError_1, cookies, match, duplicateResolverFn;\n var e_1, _e;\n var _this = this;\n return __generator(this, function (_f) {\n switch (_f.label) {\n case 0:\n globalScope = getGlobalScope();\n globalScopeWithCookiesStore = globalScope;\n _f.label = 1;\n case 1:\n _f.trys.push([1, 4, , 5]);\n cookieStore = globalScopeWithCookiesStore === null || globalScopeWithCookiesStore === void 0 ? void 0 : globalScopeWithCookiesStore.cookieStore;\n if (!cookieStore) return [3 /*break*/, 3];\n return [4 /*yield*/, cookieStore.getAll(key)];\n case 2:\n cookies_2 = _f.sent();\n if (cookies_2) {\n /* istanbul ignore if */\n if (cookies_2.length > 1) {\n (_a = this.config.diagnosticsClient) === null || _a === void 0 ? void 0 : _a.recordEvent('cookies.duplicate', {\n cookies: cookies_2.map(function (cookie) { return cookie.domain; }),\n });\n (_b = this.config.diagnosticsClient) === null || _b === void 0 ? void 0 : _b.increment('cookies.duplicate.occurrence.cookieStore');\n }\n try {\n for (cookies_1 = __values(cookies_2), cookies_1_1 = cookies_1.next(); !cookies_1_1.done; cookies_1_1 = cookies_1.next()) {\n cookie = cookies_1_1.value;\n if (isDomainEqual(cookie.domain, this.options.domain)) {\n return [2 /*return*/, cookie.value];\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (cookies_1_1 && !cookies_1_1.done && (_e = cookies_1.return)) _e.call(cookies_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n _f.label = 3;\n case 3: return [3 /*break*/, 5];\n case 4:\n ignoreError_1 = _f.sent();\n return [3 /*break*/, 5];\n case 5:\n cookies = ((_d = (_c = globalScope === null || globalScope === void 0 ? void 0 : globalScope.document) === null || _c === void 0 ? void 0 : _c.cookie.split('; ')) !== null && _d !== void 0 ? _d : []).filter(function (c) { return c.indexOf(key + '=') === 0; });\n match = undefined;\n duplicateResolverFn = this.config.duplicateResolverFn;\n if (typeof duplicateResolverFn === 'function' && cookies.length > 1) {\n match = cookies.find(function (c) {\n var _a;\n try {\n var res = duplicateResolverFn(c.substring(key.length + 1));\n if (!res) {\n (_a = _this.config.diagnosticsClient) === null || _a === void 0 ? void 0 : _a.increment('cookies.duplicate.occurrence.document.cookie');\n }\n return res;\n }\n catch (ignoreError) {\n /* istanbul ignore next */\n return false;\n }\n });\n }\n // if match was not found, just get the first one that matches the key\n if (!match) {\n match = cookies[0];\n }\n if (!match) {\n return [2 /*return*/, undefined];\n }\n return [2 /*return*/, match.substring(key.length + 1)];\n }\n });\n });\n };\n CookieStorage.prototype.set = function (key, value) {\n var _a;\n return __awaiter(this, void 0, void 0, function () {\n var expirationDays, expires, expireDate, date, str, globalScope, errorMessage;\n return __generator(this, function (_b) {\n try {\n expirationDays = (_a = this.options.expirationDays) !== null && _a !== void 0 ? _a : 0;\n expires = value !== null ? expirationDays : -1;\n expireDate = undefined;\n if (expires) {\n date = new Date();\n date.setTime(date.getTime() + expires * 24 * 60 * 60 * 1000);\n expireDate = date;\n }\n str = \"\".concat(key, \"=\").concat(btoa(encodeURIComponent(JSON.stringify(value))));\n if (expireDate) {\n str += \"; expires=\".concat(expireDate.toUTCString());\n }\n str += '; path=/';\n if (this.options.domain) {\n str += \"; domain=\".concat(this.options.domain);\n }\n if (this.options.secure) {\n str += '; Secure';\n }\n if (this.options.sameSite) {\n str += \"; SameSite=\".concat(this.options.sameSite);\n }\n globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.document.cookie = str;\n }\n }\n catch (error) {\n errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\"Amplitude Logger [Error]: Failed to set cookie for key: \".concat(key, \". Error: \").concat(errorMessage));\n }\n return [2 /*return*/];\n });\n });\n };\n CookieStorage.prototype.remove = function (key) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.set(key, null)];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n CookieStorage.prototype.reset = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2 /*return*/];\n });\n });\n };\n return CookieStorage;\n}());\nexport { CookieStorage };\nvar decodeCookiesAsDefault = function (value) {\n try {\n return decodeURIComponent(atob(value));\n }\n catch (_a) {\n return undefined;\n }\n};\nvar decodeCookiesWithDoubleUrlEncoding = function (value) {\n // Modern Ruby (v7+) automatically encodes cookies with URL encoding by\n // https://api.rubyonrails.org/classes/ActionDispatch/Cookies.html\n try {\n return decodeURIComponent(atob(decodeURIComponent(value)));\n }\n catch (_a) {\n return undefined;\n }\n};\n/**\n * Decodes a cookie value that was encoded with btoa(encodeURIComponent(...)).\n * Handles both standard encoding and double URL encoding (used by Ruby Rails v7+).\n */\nexport var decodeCookieValue = function (value) {\n var _a;\n return (_a = decodeCookiesAsDefault(value)) !== null && _a !== void 0 ? _a : decodeCookiesWithDoubleUrlEncoding(value);\n};\n/**\n * Compares two domain strings for equality, ignoring leading dots.\n * This is useful for comparing cookie domains since \".example.com\" and \"example.com\"\n * are effectively equivalent for cookie scoping.\n */\nexport var isDomainEqual = function (domain1, domain2) {\n if (!domain1 || !domain2) {\n return false;\n }\n var normalized1 = domain1.startsWith('.') ? domain1.substring(1) : domain1;\n var normalized2 = domain2.startsWith('.') ? domain2.substring(1) : domain2;\n return normalized1.toLowerCase() === normalized2.toLowerCase();\n};\n//# sourceMappingURL=cookie.js.map","import { AMPLITUDE_PREFIX } from '../types/constants';\nexport var getStorageKey = function (apiKey, postKey, limit) {\n if (postKey === void 0) { postKey = ''; }\n if (limit === void 0) { limit = 10; }\n return [AMPLITUDE_PREFIX, postKey, apiKey.substring(0, limit)].filter(Boolean).join('_');\n};\n//# sourceMappingURL=helpers.js.map","import { __awaiter, __generator } from \"tslib\";\nvar BrowserStorage = /** @class */ (function () {\n function BrowserStorage(storage) {\n this.storage = storage;\n }\n BrowserStorage.prototype.isEnabled = function () {\n return __awaiter(this, void 0, void 0, function () {\n var random, testStorage, testKey, value, _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n /* istanbul ignore if */\n if (!this.storage) {\n return [2 /*return*/, false];\n }\n random = String(Date.now());\n testStorage = new BrowserStorage(this.storage);\n testKey = 'AMP_TEST';\n _b.label = 1;\n case 1:\n _b.trys.push([1, 4, 5, 7]);\n return [4 /*yield*/, testStorage.set(testKey, random)];\n case 2:\n _b.sent();\n return [4 /*yield*/, testStorage.get(testKey)];\n case 3:\n value = _b.sent();\n return [2 /*return*/, value === random];\n case 4:\n _a = _b.sent();\n /* istanbul ignore next */\n return [2 /*return*/, false];\n case 5: return [4 /*yield*/, testStorage.remove(testKey)];\n case 6:\n _b.sent();\n return [7 /*endfinally*/];\n case 7: return [2 /*return*/];\n }\n });\n });\n };\n BrowserStorage.prototype.get = function (key) {\n return __awaiter(this, void 0, void 0, function () {\n var value, _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _b.trys.push([0, 2, , 3]);\n return [4 /*yield*/, this.getRaw(key)];\n case 1:\n value = _b.sent();\n if (!value) {\n return [2 /*return*/, undefined];\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return [2 /*return*/, JSON.parse(value)];\n case 2:\n _a = _b.sent();\n console.error(\"[Amplitude] Error: Could not get value from storage\");\n return [2 /*return*/, undefined];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n BrowserStorage.prototype.getRaw = function (key) {\n var _a;\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_b) {\n return [2 /*return*/, ((_a = this.storage) === null || _a === void 0 ? void 0 : _a.getItem(key)) || undefined];\n });\n });\n };\n BrowserStorage.prototype.set = function (key, value) {\n var _a;\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_b) {\n try {\n (_a = this.storage) === null || _a === void 0 ? void 0 : _a.setItem(key, JSON.stringify(value));\n }\n catch (_c) {\n //\n }\n return [2 /*return*/];\n });\n });\n };\n BrowserStorage.prototype.remove = function (key) {\n var _a;\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_b) {\n try {\n (_a = this.storage) === null || _a === void 0 ? void 0 : _a.removeItem(key);\n }\n catch (_c) {\n //\n }\n return [2 /*return*/];\n });\n });\n };\n BrowserStorage.prototype.reset = function () {\n var _a;\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_b) {\n try {\n (_a = this.storage) === null || _a === void 0 ? void 0 : _a.clear();\n }\n catch (_c) {\n //\n }\n return [2 /*return*/];\n });\n });\n };\n return BrowserStorage;\n}());\nexport { BrowserStorage };\n//# sourceMappingURL=browser-storage.js.map","import { __awaiter, __generator, __read } from \"tslib\";\nimport { getGlobalScope } from '../global-scope';\nvar MAX_PERSISTENT_STORAGE_EVENTS_COUNT = 10;\n// Database configuration\nvar DB_VERSION = 1;\n// Table names for different diagnostics types\nexport var TABLE_NAMES = {\n TAGS: 'tags',\n COUNTERS: 'counters',\n HISTOGRAMS: 'histograms',\n EVENTS: 'events',\n INTERNAL: 'internal', // New table for internal storage like flush timestamps\n};\n// Keys for internal storage table\nexport var INTERNAL_KEYS = {\n LAST_FLUSH_TIMESTAMP: 'last_flush_timestamp',\n};\n/**\n * Purpose-specific IndexedDB storage for diagnostics data\n * Provides optimized methods for each type of diagnostics data\n */\nvar DiagnosticsStorage = /** @class */ (function () {\n function DiagnosticsStorage(apiKey, logger) {\n this.dbPromise = null;\n this.logger = logger;\n this.dbName = \"AMP_diagnostics_\".concat(apiKey.substring(0, 10));\n }\n /**\n * Check if IndexedDB is supported in the current environment\n * @returns true if IndexedDB is available, false otherwise\n */\n DiagnosticsStorage.isSupported = function () {\n var _a;\n return ((_a = getGlobalScope()) === null || _a === void 0 ? void 0 : _a.indexedDB) !== undefined;\n };\n DiagnosticsStorage.prototype.getDB = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n if (!this.dbPromise) {\n this.dbPromise = this.openDB();\n }\n return [2 /*return*/, this.dbPromise];\n });\n });\n };\n DiagnosticsStorage.prototype.openDB = function () {\n var _this = this;\n return new Promise(function (resolve, reject) {\n var request = indexedDB.open(_this.dbName, DB_VERSION);\n request.onerror = function () {\n // Clear dbPromise when it rejects for the first time\n _this.dbPromise = null;\n reject(new Error('Failed to open IndexedDB'));\n };\n request.onsuccess = function () {\n var db = request.result;\n // Clear dbPromise when connection was on but went off later\n db.onclose = function () {\n _this.dbPromise = null;\n _this.logger.debug('DiagnosticsStorage: DB connection closed.');\n };\n db.onerror = function (event) {\n _this.logger.debug('DiagnosticsStorage: A global database error occurred.', event);\n db.close();\n };\n resolve(db);\n };\n request.onupgradeneeded = function (event) {\n var db = event.target.result;\n _this.createTables(db);\n };\n });\n };\n DiagnosticsStorage.prototype.createTables = function (db) {\n // Create tags table\n if (!db.objectStoreNames.contains(TABLE_NAMES.TAGS)) {\n db.createObjectStore(TABLE_NAMES.TAGS, { keyPath: 'key' });\n }\n // Create counters table\n if (!db.objectStoreNames.contains(TABLE_NAMES.COUNTERS)) {\n db.createObjectStore(TABLE_NAMES.COUNTERS, { keyPath: 'key' });\n }\n // Create histograms table for storing histogram stats (count, min, max, sum)\n if (!db.objectStoreNames.contains(TABLE_NAMES.HISTOGRAMS)) {\n db.createObjectStore(TABLE_NAMES.HISTOGRAMS, {\n keyPath: 'key',\n });\n }\n // Create events table\n if (!db.objectStoreNames.contains(TABLE_NAMES.EVENTS)) {\n var eventsStore = db.createObjectStore(TABLE_NAMES.EVENTS, {\n keyPath: 'id',\n autoIncrement: true,\n });\n // Create index on time for chronological queries\n eventsStore.createIndex('time_idx', 'time', { unique: false });\n }\n // Create internal table for storing internal data like flush timestamps\n if (!db.objectStoreNames.contains(TABLE_NAMES.INTERNAL)) {\n db.createObjectStore(TABLE_NAMES.INTERNAL, { keyPath: 'key' });\n }\n };\n DiagnosticsStorage.prototype.setTags = function (tags) {\n return __awaiter(this, void 0, void 0, function () {\n var db, transaction_1, store_1, error_1;\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 2, , 3]);\n if (Object.entries(tags).length === 0) {\n return [2 /*return*/];\n }\n return [4 /*yield*/, this.getDB()];\n case 1:\n db = _a.sent();\n transaction_1 = db.transaction([TABLE_NAMES.TAGS], 'readwrite');\n store_1 = transaction_1.objectStore(TABLE_NAMES.TAGS);\n return [2 /*return*/, new Promise(function (resolve) {\n var entries = Object.entries(tags);\n transaction_1.oncomplete = function () {\n resolve();\n };\n transaction_1.onabort = function (event) {\n _this.logger.debug('DiagnosticsStorage: Failed to set tags', event);\n resolve();\n };\n entries.forEach(function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n var putRequest = store_1.put({ key: key, value: value });\n putRequest.onerror = function (event) {\n _this.logger.debug('DiagnosticsStorage: Failed to set tag', key, value, event);\n };\n });\n })];\n case 2:\n error_1 = _a.sent();\n this.logger.debug('DiagnosticsStorage: Failed to set tags', error_1);\n return [3 /*break*/, 3];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n DiagnosticsStorage.prototype.incrementCounters = function (counters) {\n return __awaiter(this, void 0, void 0, function () {\n var db, transaction_2, store_2, error_2;\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 2, , 3]);\n if (Object.entries(counters).length === 0) {\n return [2 /*return*/];\n }\n return [4 /*yield*/, this.getDB()];\n case 1:\n db = _a.sent();\n transaction_2 = db.transaction([TABLE_NAMES.COUNTERS], 'readwrite');\n store_2 = transaction_2.objectStore(TABLE_NAMES.COUNTERS);\n return [2 /*return*/, new Promise(function (resolve) {\n var entries = Object.entries(counters);\n transaction_2.oncomplete = function () {\n resolve();\n };\n transaction_2.onabort = function (event) {\n _this.logger.debug('DiagnosticsStorage: Failed to increment counters', event);\n resolve();\n };\n // Read existing values and update them\n entries.forEach(function (_a) {\n var _b = __read(_a, 2), key = _b[0], incrementValue = _b[1];\n var getRequest = store_2.get(key);\n getRequest.onsuccess = function () {\n var existingRecord = getRequest.result;\n /* istanbul ignore next */\n var existingValue = existingRecord ? existingRecord.value : 0;\n var putRequest = store_2.put({ key: key, value: existingValue + incrementValue });\n putRequest.onerror = function (event) {\n _this.logger.debug('DiagnosticsStorage: Failed to update counter', key, event);\n };\n };\n getRequest.onerror = function (event) {\n _this.logger.debug('DiagnosticsStorage: Failed to read existing counter', key, event);\n };\n });\n })];\n case 2:\n error_2 = _a.sent();\n this.logger.debug('DiagnosticsStorage: Failed to increment counters', error_2);\n return [3 /*break*/, 3];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n DiagnosticsStorage.prototype.setHistogramStats = function (histogramStats) {\n return __awaiter(this, void 0, void 0, function () {\n var db, transaction_3, store_3, error_3;\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 2, , 3]);\n if (Object.entries(histogramStats).length === 0) {\n return [2 /*return*/];\n }\n return [4 /*yield*/, this.getDB()];\n case 1:\n db = _a.sent();\n transaction_3 = db.transaction([TABLE_NAMES.HISTOGRAMS], 'readwrite');\n store_3 = transaction_3.objectStore(TABLE_NAMES.HISTOGRAMS);\n return [2 /*return*/, new Promise(function (resolve) {\n var entries = Object.entries(histogramStats);\n transaction_3.oncomplete = function () {\n resolve();\n };\n transaction_3.onabort = function (event) {\n _this.logger.debug('DiagnosticsStorage: Failed to set histogram stats', event);\n resolve();\n };\n // Read existing values and update them\n entries.forEach(function (_a) {\n var _b = __read(_a, 2), key = _b[0], newStats = _b[1];\n var getRequest = store_3.get(key);\n getRequest.onsuccess = function () {\n var existingRecord = getRequest.result;\n var updatedStats;\n /* istanbul ignore next */\n if (existingRecord) {\n // Accumulate with existing stats\n updatedStats = {\n key: key,\n count: existingRecord.count + newStats.count,\n min: Math.min(existingRecord.min, newStats.min),\n max: Math.max(existingRecord.max, newStats.max),\n sum: existingRecord.sum + newStats.sum,\n };\n }\n else {\n // Create new stats\n updatedStats = {\n key: key,\n count: newStats.count,\n min: newStats.min,\n max: newStats.max,\n sum: newStats.sum,\n };\n }\n var putRequest = store_3.put(updatedStats);\n putRequest.onerror = function (event) {\n _this.logger.debug('DiagnosticsStorage: Failed to set histogram stats', key, event);\n };\n };\n getRequest.onerror = function (event) {\n _this.logger.debug('DiagnosticsStorage: Failed to read existing histogram stats', key, event);\n };\n });\n })];\n case 2:\n error_3 = _a.sent();\n this.logger.debug('DiagnosticsStorage: Failed to set histogram stats', error_3);\n return [3 /*break*/, 3];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n DiagnosticsStorage.prototype.addEventRecords = function (events) {\n return __awaiter(this, void 0, void 0, function () {\n var db, transaction_4, store_4, error_4;\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 2, , 3]);\n if (events.length === 0) {\n return [2 /*return*/];\n }\n return [4 /*yield*/, this.getDB()];\n case 1:\n db = _a.sent();\n transaction_4 = db.transaction([TABLE_NAMES.EVENTS], 'readwrite');\n store_4 = transaction_4.objectStore(TABLE_NAMES.EVENTS);\n return [2 /*return*/, new Promise(function (resolve) {\n transaction_4.oncomplete = function () {\n resolve();\n };\n /* istanbul ignore next */\n transaction_4.onabort = function (event) {\n _this.logger.debug('DiagnosticsStorage: Failed to add event records', event);\n resolve();\n };\n // First, check how many events are currently stored\n var countRequest = store_4.count();\n countRequest.onsuccess = function () {\n var currentCount = countRequest.result;\n // Calculate how many events we can add\n var availableSlots = Math.max(0, MAX_PERSISTENT_STORAGE_EVENTS_COUNT - currentCount);\n if (availableSlots < events.length) {\n _this.logger.debug(\"DiagnosticsStorage: Only added \".concat(availableSlots, \" of \").concat(events.length, \" events due to storage limit\"));\n }\n // Only add events up to the available slots (take the least recent ones)\n events.slice(0, availableSlots).forEach(function (event) {\n var request = store_4.add(event);\n request.onerror = function (event) {\n _this.logger.debug('DiagnosticsStorage: Failed to add event record', event);\n };\n });\n };\n countRequest.onerror = function (event) {\n _this.logger.debug('DiagnosticsStorage: Failed to count existing events', event);\n };\n })];\n case 2:\n error_4 = _a.sent();\n this.logger.debug('DiagnosticsStorage: Failed to add event records', error_4);\n return [3 /*break*/, 3];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n DiagnosticsStorage.prototype.setInternal = function (key, value) {\n return __awaiter(this, void 0, void 0, function () {\n var db, transaction_5, store_5, error_5;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 2, , 3]);\n return [4 /*yield*/, this.getDB()];\n case 1:\n db = _a.sent();\n transaction_5 = db.transaction([TABLE_NAMES.INTERNAL], 'readwrite');\n store_5 = transaction_5.objectStore(TABLE_NAMES.INTERNAL);\n return [2 /*return*/, new Promise(function (resolve, reject) {\n /* istanbul ignore next */\n transaction_5.onabort = function () { return reject(new Error('Failed to set internal value')); };\n var request = store_5.put({ key: key, value: value });\n request.onsuccess = function () { return resolve(); };\n /* istanbul ignore next */\n request.onerror = function () { return reject(new Error('Failed to set internal value')); };\n })];\n case 2:\n error_5 = _a.sent();\n /* istanbul ignore next */\n this.logger.debug('DiagnosticsStorage: Failed to set internal value', error_5);\n return [3 /*break*/, 3];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n DiagnosticsStorage.prototype.getInternal = function (key) {\n return __awaiter(this, void 0, void 0, function () {\n var db, transaction_6, store_6, error_6;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 2, , 3]);\n return [4 /*yield*/, this.getDB()];\n case 1:\n db = _a.sent();\n transaction_6 = db.transaction([TABLE_NAMES.INTERNAL], 'readonly');\n store_6 = transaction_6.objectStore(TABLE_NAMES.INTERNAL);\n return [2 /*return*/, new Promise(function (resolve, reject) {\n /* istanbul ignore next */\n transaction_6.onabort = function () { return reject(new Error('Failed to get internal value')); };\n var request = store_6.get(key);\n request.onsuccess = function () { return resolve(request.result); };\n /* istanbul ignore next */\n request.onerror = function () { return reject(new Error('Failed to get internal value')); };\n })];\n case 2:\n error_6 = _a.sent();\n this.logger.debug('DiagnosticsStorage: Failed to get internal value', error_6);\n return [2 /*return*/, undefined];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n DiagnosticsStorage.prototype.getLastFlushTimestamp = function () {\n return __awaiter(this, void 0, void 0, function () {\n var record, error_7;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 2, , 3]);\n return [4 /*yield*/, this.getInternal(INTERNAL_KEYS.LAST_FLUSH_TIMESTAMP)];\n case 1:\n record = _a.sent();\n return [2 /*return*/, record ? parseInt(record.value, 10) : undefined];\n case 2:\n error_7 = _a.sent();\n /* istanbul ignore next */\n this.logger.debug('DiagnosticsStorage: Failed to get last flush timestamp', error_7);\n /* istanbul ignore next */\n return [2 /*return*/, undefined];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n DiagnosticsStorage.prototype.setLastFlushTimestamp = function (timestamp) {\n return __awaiter(this, void 0, void 0, function () {\n var error_8;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 2, , 3]);\n return [4 /*yield*/, this.setInternal(INTERNAL_KEYS.LAST_FLUSH_TIMESTAMP, timestamp.toString())];\n case 1:\n _a.sent();\n return [3 /*break*/, 3];\n case 2:\n error_8 = _a.sent();\n /* istanbul ignore next */\n this.logger.debug('DiagnosticsStorage: Failed to set last flush timestamp', error_8);\n return [3 /*break*/, 3];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n /* istanbul ignore next */\n DiagnosticsStorage.prototype.clearTable = function (transaction, tableName) {\n return new Promise(function (resolve, reject) {\n var store = transaction.objectStore(tableName);\n var request = store.clear();\n request.onsuccess = function () { return resolve(); };\n request.onerror = function () { return reject(new Error(\"Failed to clear table \".concat(tableName))); };\n });\n };\n /* istanbul ignore next */\n DiagnosticsStorage.prototype.getAllAndClear = function () {\n return __awaiter(this, void 0, void 0, function () {\n var db, transaction, _a, tags, counters, histogramStats, events, error_9;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _b.trys.push([0, 4, , 5]);\n return [4 /*yield*/, this.getDB()];\n case 1:\n db = _b.sent();\n transaction = db.transaction([TABLE_NAMES.TAGS, TABLE_NAMES.COUNTERS, TABLE_NAMES.HISTOGRAMS, TABLE_NAMES.EVENTS], 'readwrite');\n return [4 /*yield*/, Promise.all([\n this.getAllFromStore(transaction, TABLE_NAMES.TAGS),\n this.getAllFromStore(transaction, TABLE_NAMES.COUNTERS),\n this.getAllFromStore(transaction, TABLE_NAMES.HISTOGRAMS),\n this.getAllFromStore(transaction, TABLE_NAMES.EVENTS),\n ])];\n case 2:\n _a = __read.apply(void 0, [_b.sent(), 4]), tags = _a[0], counters = _a[1], histogramStats = _a[2], events = _a[3];\n // Clear all data in the same transaction\n return [4 /*yield*/, Promise.all([\n this.clearTable(transaction, TABLE_NAMES.COUNTERS),\n this.clearTable(transaction, TABLE_NAMES.HISTOGRAMS),\n this.clearTable(transaction, TABLE_NAMES.EVENTS),\n ])];\n case 3:\n // Clear all data in the same transaction\n _b.sent();\n return [2 /*return*/, { tags: tags, counters: counters, histogramStats: histogramStats, events: events }];\n case 4:\n error_9 = _b.sent();\n this.logger.debug('DiagnosticsStorage: Failed to get all and clear data', error_9);\n return [2 /*return*/, { tags: [], counters: [], histogramStats: [], events: [] }];\n case 5: return [2 /*return*/];\n }\n });\n });\n };\n /**\n * Helper method to get all records from a store within a transaction\n */\n /* istanbul ignore next */\n DiagnosticsStorage.prototype.getAllFromStore = function (transaction, tableName) {\n return new Promise(function (resolve, reject) {\n var store = transaction.objectStore(tableName);\n var request = store.getAll();\n request.onsuccess = function () { return resolve(request.result); };\n request.onerror = function () { return reject(new Error(\"Failed to get all from \".concat(tableName))); };\n });\n };\n return DiagnosticsStorage;\n}());\nexport { DiagnosticsStorage };\n//# sourceMappingURL=diagnostics-storage.js.map","import { __assign } from \"tslib\";\nimport { getGlobalScope } from '../global-scope';\nexport var GLOBAL_KEY = '__AMPLITUDE_SCRIPT_URL__';\nexport var EVENT_NAME_ERROR_UNCAUGHT = 'sdk.error.uncaught';\nvar getNormalizedScriptUrl = function () {\n var scope = getGlobalScope();\n /* istanbul ignore next */\n return scope === null || scope === void 0 ? void 0 : scope[GLOBAL_KEY];\n};\nvar setNormalizedScriptUrl = function (url) {\n var scope = getGlobalScope();\n if (scope) {\n scope[GLOBAL_KEY] = url;\n }\n};\nexport var registerSdkLoaderMetadata = function (metadata) {\n if (metadata.scriptUrl) {\n var normalized = normalizeUrl(metadata.scriptUrl);\n if (normalized) {\n setNormalizedScriptUrl(normalized);\n }\n }\n};\nexport var enableSdkErrorListeners = function (client) {\n var scope = getGlobalScope();\n if (!scope || typeof scope.addEventListener !== 'function') {\n return;\n }\n var handleError = function (event) {\n var error = event.error instanceof Error ? event.error : undefined;\n var stack = error === null || error === void 0 ? void 0 : error.stack;\n var match = detectSdkOrigin({ filename: event.filename, stack: stack });\n if (!match) {\n return;\n }\n capture({\n type: 'error',\n message: event.message,\n stack: stack,\n filename: event.filename,\n errorName: error === null || error === void 0 ? void 0 : error.name,\n metadata: {\n colno: event.colno,\n lineno: event.lineno,\n isTrusted: event.isTrusted,\n matchReason: match,\n },\n });\n };\n var handleRejection = function (event) {\n var _a;\n var error = event.reason instanceof Error ? event.reason : undefined;\n var stack = error === null || error === void 0 ? void 0 : error.stack;\n var filename = extractFilenameFromStack(stack);\n var match = detectSdkOrigin({ filename: filename, stack: stack });\n if (!match) {\n return;\n }\n /* istanbul ignore next */\n capture({\n type: 'unhandledrejection',\n message: (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : stringifyReason(event.reason),\n stack: stack,\n filename: filename,\n errorName: error === null || error === void 0 ? void 0 : error.name,\n metadata: {\n isTrusted: event.isTrusted,\n matchReason: match,\n },\n });\n };\n var capture = function (context) {\n client.recordEvent(EVENT_NAME_ERROR_UNCAUGHT, __assign({ type: context.type, message: context.message, filename: context.filename, error_name: context.errorName, stack: context.stack }, context.metadata));\n };\n scope.addEventListener('error', handleError, true);\n scope.addEventListener('unhandledrejection', handleRejection, true);\n};\nvar detectSdkOrigin = function (payload) {\n var normalizedScriptUrl = getNormalizedScriptUrl();\n if (!normalizedScriptUrl) {\n return undefined;\n }\n if (payload.filename && payload.filename.includes(normalizedScriptUrl)) {\n return 'filename';\n }\n if (payload.stack && payload.stack.includes(normalizedScriptUrl)) {\n return 'stack';\n }\n return undefined;\n};\nvar normalizeUrl = function (value) {\n var _a, _b;\n try {\n /* istanbul ignore next */\n var url = new URL(value, (_b = (_a = getGlobalScope()) === null || _a === void 0 ? void 0 : _a.location) === null || _b === void 0 ? void 0 : _b.origin);\n return url.origin + url.pathname;\n }\n catch (_c) {\n return undefined;\n }\n};\nvar extractFilenameFromStack = function (stack) {\n if (!stack) {\n return undefined;\n }\n var match = stack.match(/(https?:\\/\\/\\S+?)(?=[)\\s]|$)/);\n /* istanbul ignore next */\n return match ? match[1] : undefined;\n};\n/* istanbul ignore next */\nvar stringifyReason = function (reason) {\n if (typeof reason === 'string') {\n return reason;\n }\n try {\n return JSON.stringify(reason);\n }\n catch (_a) {\n return '[object Object]';\n }\n};\n//# sourceMappingURL=uncaught-sdk-errors.js.map","import { __assign, __awaiter, __generator, __read, __spreadArray } from \"tslib\";\nimport { DiagnosticsStorage } from './diagnostics-storage';\nimport { getGlobalScope } from '../global-scope';\nimport { isTimestampInSampleTemp } from '../utils/sampling';\nimport { enableSdkErrorListeners } from './uncaught-sdk-errors';\nexport var SAVE_INTERVAL_MS = 1000; // 1 second\nexport var FLUSH_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\nexport var DIAGNOSTICS_US_SERVER_URL = 'https://diagnostics.prod.us-west-2.amplitude.com/v1/capture';\nexport var DIAGNOSTICS_EU_SERVER_URL = 'https://diagnostics.prod.eu-central-1.amplitude.com/v1/capture';\n// In-memory storage limits\nexport var MAX_MEMORY_STORAGE_COUNT = 10000; // for tags, counters, histograms separately\nexport var MAX_MEMORY_STORAGE_EVENTS_COUNT = 10;\nvar DiagnosticsClient = /** @class */ (function () {\n function DiagnosticsClient(apiKey, logger, serverZone, options) {\n if (serverZone === void 0) { serverZone = 'US'; }\n // In-memory storages\n this.inMemoryTags = {};\n this.inMemoryCounters = {};\n this.inMemoryHistograms = {};\n this.inMemoryEvents = [];\n // Timer for 1-second persistence\n this.saveTimer = null;\n // Timer for flush interval\n this.flushTimer = null;\n this.apiKey = apiKey;\n this.logger = logger;\n this.serverUrl = serverZone === 'US' ? DIAGNOSTICS_US_SERVER_URL : DIAGNOSTICS_EU_SERVER_URL;\n this.logger.debug('DiagnosticsClient: Initializing with options', JSON.stringify(options, null, 2));\n // Diagnostics is enabled by default with sample rate of 0 (no sampling)\n this.config = __assign({ enabled: true, sampleRate: 0 }, options);\n this.startTimestamp = Date.now();\n this.shouldTrack = isTimestampInSampleTemp(this.startTimestamp, this.config.sampleRate) && this.config.enabled;\n if (DiagnosticsStorage.isSupported()) {\n this.storage = new DiagnosticsStorage(apiKey, logger);\n }\n else {\n this.logger.debug('DiagnosticsClient: IndexedDB is not supported');\n }\n void this.initializeFlushInterval();\n // Track internal diagnostics metrics for sampling\n if (this.shouldTrack) {\n this.increment('sdk.diagnostics.sampled.in.and.enabled');\n enableSdkErrorListeners(this);\n }\n }\n /**\n * Check if storage is available and tracking is enabled\n */\n DiagnosticsClient.prototype.isStorageAndTrackEnabled = function () {\n return Boolean(this.storage) && Boolean(this.shouldTrack);\n };\n DiagnosticsClient.prototype.setTag = function (name, value) {\n if (!this.isStorageAndTrackEnabled()) {\n return;\n }\n if (Object.keys(this.inMemoryTags).length >= MAX_MEMORY_STORAGE_COUNT) {\n this.logger.debug('DiagnosticsClient: Early return setTags as reaching memory limit');\n return;\n }\n this.inMemoryTags[name] = value;\n this.startTimersIfNeeded();\n };\n DiagnosticsClient.prototype.increment = function (name, size) {\n if (size === void 0) { size = 1; }\n if (!this.isStorageAndTrackEnabled()) {\n return;\n }\n if (Object.keys(this.inMemoryCounters).length >= MAX_MEMORY_STORAGE_COUNT) {\n this.logger.debug('DiagnosticsClient: Early return increment as reaching memory limit');\n return;\n }\n this.inMemoryCounters[name] = (this.inMemoryCounters[name] || 0) + size;\n this.startTimersIfNeeded();\n };\n DiagnosticsClient.prototype.recordHistogram = function (name, value) {\n if (!this.isStorageAndTrackEnabled()) {\n return;\n }\n if (Object.keys(this.inMemoryHistograms).length >= MAX_MEMORY_STORAGE_COUNT) {\n this.logger.debug('DiagnosticsClient: Early return recordHistogram as reaching memory limit');\n return;\n }\n var existing = this.inMemoryHistograms[name];\n if (existing) {\n // Update existing stats incrementally\n existing.count += 1;\n existing.min = Math.min(existing.min, value);\n existing.max = Math.max(existing.max, value);\n existing.sum += value;\n }\n else {\n // Create new stats\n this.inMemoryHistograms[name] = {\n count: 1,\n min: value,\n max: value,\n sum: value,\n };\n }\n this.startTimersIfNeeded();\n };\n DiagnosticsClient.prototype.recordEvent = function (name, properties) {\n if (!this.isStorageAndTrackEnabled()) {\n return;\n }\n if (this.inMemoryEvents.length >= MAX_MEMORY_STORAGE_EVENTS_COUNT) {\n this.logger.debug('DiagnosticsClient: Early return recordEvent as reaching memory limit');\n return;\n }\n this.inMemoryEvents.push({\n event_name: name,\n time: Date.now(),\n event_properties: properties,\n });\n this.startTimersIfNeeded();\n };\n DiagnosticsClient.prototype.startTimersIfNeeded = function () {\n var _this = this;\n if (!this.saveTimer) {\n this.saveTimer = setTimeout(function () {\n _this.saveAllDataToStorage()\n .catch(function (error) {\n _this.logger.debug('DiagnosticsClient: Failed to save all data to storage', error);\n })\n .finally(function () {\n _this.saveTimer = null;\n });\n }, SAVE_INTERVAL_MS);\n }\n if (!this.flushTimer) {\n this.flushTimer = setTimeout(function () {\n _this._flush()\n .catch(function (error) {\n _this.logger.debug('DiagnosticsClient: Failed to flush', error);\n })\n .finally(function () {\n _this.flushTimer = null;\n });\n }, FLUSH_INTERVAL_MS);\n }\n };\n DiagnosticsClient.prototype.saveAllDataToStorage = function () {\n return __awaiter(this, void 0, void 0, function () {\n var tagsToSave, countersToSave, histogramsToSave, eventsToSave;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (!this.storage) {\n return [2 /*return*/];\n }\n tagsToSave = __assign({}, this.inMemoryTags);\n countersToSave = __assign({}, this.inMemoryCounters);\n histogramsToSave = __assign({}, this.inMemoryHistograms);\n eventsToSave = __spreadArray([], __read(this.inMemoryEvents), false);\n this.inMemoryEvents = [];\n this.inMemoryTags = {};\n this.inMemoryCounters = {};\n this.inMemoryHistograms = {};\n return [4 /*yield*/, Promise.all([\n this.storage.setTags(tagsToSave),\n this.storage.incrementCounters(countersToSave),\n this.storage.setHistogramStats(histogramsToSave),\n this.storage.addEventRecords(eventsToSave),\n ])];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n DiagnosticsClient.prototype._flush = function () {\n return __awaiter(this, void 0, void 0, function () {\n var _a, tagRecords, counterRecords, histogramStatsRecords, eventRecords, tags, counters, histogram, events, payload;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n if (!this.storage) {\n return [2 /*return*/];\n }\n return [4 /*yield*/, this.saveAllDataToStorage()];\n case 1:\n _b.sent();\n this.saveTimer = null;\n this.flushTimer = null;\n return [4 /*yield*/, this.storage.getAllAndClear()];\n case 2:\n _a = _b.sent(), tagRecords = _a.tags, counterRecords = _a.counters, histogramStatsRecords = _a.histogramStats, eventRecords = _a.events;\n // Update the last flush timestamp\n void this.storage.setLastFlushTimestamp(Date.now());\n tags = {};\n tagRecords.forEach(function (record) {\n tags[record.key] = record.value;\n });\n counters = {};\n counterRecords.forEach(function (record) {\n counters[record.key] = record.value;\n });\n histogram = {};\n histogramStatsRecords.forEach(function (stats) {\n histogram[stats.key] = {\n count: stats.count,\n min: stats.min,\n max: stats.max,\n avg: Math.round((stats.sum / stats.count) * 100) / 100, // round the average to 2 decimal places.\n };\n });\n events = eventRecords.map(function (record) { return ({\n event_name: record.event_name,\n time: record.time,\n event_properties: record.event_properties,\n }); });\n // Early return if all data collections are empty\n if (Object.keys(counters).length === 0 && Object.keys(histogram).length === 0 && events.length === 0) {\n return [2 /*return*/];\n }\n payload = {\n tags: tags,\n histogram: histogram,\n counters: counters,\n events: events,\n };\n // Send payload to diagnostics server\n void this.fetch(payload);\n return [2 /*return*/];\n }\n });\n });\n };\n /**\n * Send diagnostics data to the server\n */\n DiagnosticsClient.prototype.fetch = function (payload) {\n return __awaiter(this, void 0, void 0, function () {\n var response, error_1;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 2, , 3]);\n if (!getGlobalScope()) {\n throw new Error('DiagnosticsClient: Fetch is not supported');\n }\n return [4 /*yield*/, fetch(this.serverUrl, {\n method: 'POST',\n headers: {\n 'X-ApiKey': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n })];\n case 1:\n response = _a.sent();\n if (!response.ok) {\n this.logger.debug('DiagnosticsClient: Failed to send diagnostics data.');\n return [2 /*return*/];\n }\n this.logger.debug('DiagnosticsClient: Successfully sent diagnostics data');\n return [3 /*break*/, 3];\n case 2:\n error_1 = _a.sent();\n this.logger.debug('DiagnosticsClient: Failed to send diagnostics data. ', error_1);\n return [3 /*break*/, 3];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n /**\n * Initialize flush interval logic.\n * Check if 5 minutes has passed since last flush, if so flush immediately.\n * Otherwise set a timer to flush when the interval is reached.\n */\n DiagnosticsClient.prototype.initializeFlushInterval = function () {\n return __awaiter(this, void 0, void 0, function () {\n var now, lastFlushTimestamp, timeSinceLastFlush;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (!this.storage) {\n return [2 /*return*/];\n }\n now = Date.now();\n return [4 /*yield*/, this.storage.getLastFlushTimestamp()];\n case 1:\n lastFlushTimestamp = (_a.sent()) || -1;\n // If last flush timestamp is -1, it means this is a new client\n // Save current timestamp as the initial \"last flush timestamp\"\n // and schedule the flush timer\n if (lastFlushTimestamp === -1) {\n void this.storage.setLastFlushTimestamp(now);\n this._setFlushTimer(FLUSH_INTERVAL_MS);\n return [2 /*return*/];\n }\n timeSinceLastFlush = now - lastFlushTimestamp;\n if (timeSinceLastFlush >= FLUSH_INTERVAL_MS) {\n // More than 5 minutes has passed, flush immediately\n void this._flush();\n return [2 /*return*/];\n }\n else {\n // Set timer for remaining time\n this._setFlushTimer(FLUSH_INTERVAL_MS - timeSinceLastFlush);\n }\n return [2 /*return*/];\n }\n });\n });\n };\n /**\n * Helper method to set flush timer with consistent error handling\n */\n DiagnosticsClient.prototype._setFlushTimer = function (delay) {\n var _this = this;\n this.flushTimer = setTimeout(function () {\n _this._flush()\n .catch(function (error) {\n _this.logger.debug('DiagnosticsClient: Failed to flush', error);\n })\n .finally(function () {\n _this.flushTimer = null;\n });\n }, delay);\n };\n DiagnosticsClient.prototype._setSampleRate = function (sampleRate) {\n this.logger.debug('DiagnosticsClient: Setting sample rate to', sampleRate);\n this.config.sampleRate = sampleRate;\n this.shouldTrack = isTimestampInSampleTemp(this.startTimestamp, this.config.sampleRate) && this.config.enabled;\n this.logger.debug('DiagnosticsClient: Should track is', this.shouldTrack);\n };\n return DiagnosticsClient;\n}());\nexport { DiagnosticsClient };\n//# sourceMappingURL=diagnostics-client.js.map","import { Status } from '../types/status';\nimport { isSuccessStatusCode } from '../utils/status-code';\nvar BaseTransport = /** @class */ (function () {\n function BaseTransport() {\n }\n BaseTransport.prototype.send = function (_serverUrl, _payload) {\n return Promise.resolve(null);\n };\n BaseTransport.prototype.buildResponse = function (responseJSON) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;\n if (typeof responseJSON !== 'object') {\n return null;\n }\n var statusCode = responseJSON.code || 0;\n var status = this.buildStatus(statusCode);\n switch (status) {\n case Status.Success:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n eventsIngested: (_a = responseJSON.events_ingested) !== null && _a !== void 0 ? _a : 0,\n payloadSizeBytes: (_b = responseJSON.payload_size_bytes) !== null && _b !== void 0 ? _b : 0,\n serverUploadTime: (_c = responseJSON.server_upload_time) !== null && _c !== void 0 ? _c : 0,\n },\n };\n case Status.Invalid:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_d = responseJSON.error) !== null && _d !== void 0 ? _d : '',\n missingField: (_e = responseJSON.missing_field) !== null && _e !== void 0 ? _e : '',\n eventsWithInvalidFields: (_f = responseJSON.events_with_invalid_fields) !== null && _f !== void 0 ? _f : {},\n eventsWithMissingFields: (_g = responseJSON.events_with_missing_fields) !== null && _g !== void 0 ? _g : {},\n eventsWithInvalidIdLengths: (_h = responseJSON.events_with_invalid_id_lengths) !== null && _h !== void 0 ? _h : {},\n epsThreshold: (_j = responseJSON.eps_threshold) !== null && _j !== void 0 ? _j : 0,\n exceededDailyQuotaDevices: (_k = responseJSON.exceeded_daily_quota_devices) !== null && _k !== void 0 ? _k : {},\n silencedDevices: (_l = responseJSON.silenced_devices) !== null && _l !== void 0 ? _l : [],\n silencedEvents: (_m = responseJSON.silenced_events) !== null && _m !== void 0 ? _m : [],\n throttledDevices: (_o = responseJSON.throttled_devices) !== null && _o !== void 0 ? _o : {},\n throttledEvents: (_p = responseJSON.throttled_events) !== null && _p !== void 0 ? _p : [],\n },\n };\n case Status.PayloadTooLarge:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_q = responseJSON.error) !== null && _q !== void 0 ? _q : '',\n },\n };\n case Status.RateLimit:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_r = responseJSON.error) !== null && _r !== void 0 ? _r : '',\n epsThreshold: (_s = responseJSON.eps_threshold) !== null && _s !== void 0 ? _s : 0,\n throttledDevices: (_t = responseJSON.throttled_devices) !== null && _t !== void 0 ? _t : {},\n throttledUsers: (_u = responseJSON.throttled_users) !== null && _u !== void 0 ? _u : {},\n exceededDailyQuotaDevices: (_v = responseJSON.exceeded_daily_quota_devices) !== null && _v !== void 0 ? _v : {},\n exceededDailyQuotaUsers: (_w = responseJSON.exceeded_daily_quota_users) !== null && _w !== void 0 ? _w : {},\n throttledEvents: (_x = responseJSON.throttled_events) !== null && _x !== void 0 ? _x : [],\n },\n };\n case Status.Timeout:\n default:\n return {\n status: status,\n statusCode: statusCode,\n };\n }\n };\n BaseTransport.prototype.buildStatus = function (code) {\n if (isSuccessStatusCode(code)) {\n return Status.Success;\n }\n if (code === 429) {\n return Status.RateLimit;\n }\n if (code === 413) {\n return Status.PayloadTooLarge;\n }\n if (code === 408) {\n return Status.Timeout;\n }\n if (code >= 400 && code < 500) {\n return Status.Invalid;\n }\n if (code >= 500) {\n return Status.Failed;\n }\n return Status.Unknown;\n };\n return BaseTransport;\n}());\nexport { BaseTransport };\n//# sourceMappingURL=base.js.map","import { __assign, __awaiter, __extends, __generator } from \"tslib\";\nimport { BaseTransport } from './base';\nvar FetchTransport = /** @class */ (function (_super) {\n __extends(FetchTransport, _super);\n function FetchTransport(customHeaders) {\n if (customHeaders === void 0) { customHeaders = {}; }\n var _this = _super.call(this) || this;\n _this.customHeaders = customHeaders;\n return _this;\n }\n FetchTransport.prototype.send = function (serverUrl, payload) {\n return __awaiter(this, void 0, void 0, function () {\n var options, response, responseText;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n /* istanbul ignore if */\n if (typeof fetch === 'undefined') {\n throw new Error('FetchTransport is not supported');\n }\n options = {\n headers: __assign({ 'Content-Type': 'application/json', Accept: '*/*' }, this.customHeaders),\n body: JSON.stringify(payload),\n method: 'POST',\n };\n return [4 /*yield*/, fetch(serverUrl, options)];\n case 1:\n response = _a.sent();\n return [4 /*yield*/, response.text()];\n case 2:\n responseText = _a.sent();\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return [2 /*return*/, this.buildResponse(JSON.parse(responseText))];\n }\n catch (_b) {\n return [2 /*return*/, this.buildResponse({ code: response.status })];\n }\n return [2 /*return*/];\n }\n });\n });\n };\n return FetchTransport;\n}(BaseTransport));\nexport { FetchTransport };\n//# sourceMappingURL=fetch.js.map","var RemoteConfigLocalStorage = /** @class */ (function () {\n function RemoteConfigLocalStorage(apiKey, logger) {\n this.key = \"AMP_remote_config_\".concat(apiKey.substring(0, 10));\n this.logger = logger;\n }\n RemoteConfigLocalStorage.prototype.fetchConfig = function () {\n var result = null;\n var failedRemoteConfigInfo = {\n remoteConfig: null,\n lastFetch: new Date(),\n };\n try {\n result = localStorage.getItem(this.key);\n }\n catch (error) {\n this.logger.debug('Remote config localstorage failed to access: ', error);\n return Promise.resolve(failedRemoteConfigInfo);\n }\n if (result === null) {\n this.logger.debug('Remote config localstorage gets null because the key does not exist');\n return Promise.resolve(failedRemoteConfigInfo);\n }\n try {\n var remoteConfigInfo = JSON.parse(result);\n this.logger.debug(\"Remote config localstorage parsed successfully: \".concat(JSON.stringify(remoteConfigInfo)));\n return Promise.resolve({\n remoteConfig: remoteConfigInfo.remoteConfig,\n lastFetch: new Date(remoteConfigInfo.lastFetch),\n });\n }\n catch (error) {\n this.logger.debug('Remote config localstorage failed to parse: ', error);\n localStorage.removeItem(this.key);\n return Promise.resolve(failedRemoteConfigInfo);\n }\n };\n RemoteConfigLocalStorage.prototype.setConfig = function (config) {\n try {\n localStorage.setItem(this.key, JSON.stringify(config));\n this.logger.debug('Remote config localstorage set successfully.');\n return Promise.resolve(true);\n }\n catch (error) {\n this.logger.debug('Remote config localstorage failed to set: ', error);\n }\n return Promise.resolve(false);\n };\n return RemoteConfigLocalStorage;\n}());\nexport { RemoteConfigLocalStorage };\n//# sourceMappingURL=remote-config-localstorage.js.map","import { __awaiter, __generator } from \"tslib\";\nimport { RemoteConfigLocalStorage } from './remote-config-localstorage';\nimport { UUID } from '../utils/uuid';\nexport var US_SERVER_URL = 'https://sr-client-cfg.amplitude.com/config';\nexport var EU_SERVER_URL = 'https://sr-client-cfg.eu.amplitude.com/config';\nexport var DEFAULT_MAX_RETRIES = 3;\n/**\n * The default timeout for fetch in milliseconds.\n * Linear backoff policy: timeout / retry times is the interval between fetch retry.\n */\nvar DEFAULT_TIMEOUT = 1000;\n/**\n * The minimum time between fetches in milliseconds.\n * This prevents too many requests from being sent in a short period of time.\n */\nvar DEFAULT_MIN_TIME_BETWEEN_FETCHES = 5 * 60 * 1000; // 5 minutes\nvar RemoteConfigClient = /** @class */ (function () {\n function RemoteConfigClient(apiKey, logger, serverZone, serverUrl) {\n if (serverZone === void 0) { serverZone = 'US'; }\n // Registered callbackInfos by subscribe().\n this.callbackInfos = [];\n // Track the last successful fetch time for throttling (timestamp in milliseconds).\n this.lastSuccessfulFetch = null;\n // Store the in-flight fetch promise for deduplication.\n this.fetchPromise = null;\n this.apiKey = apiKey;\n this.serverUrl = serverUrl || (serverZone === 'US' ? US_SERVER_URL : EU_SERVER_URL);\n this.logger = logger;\n this.storage = new RemoteConfigLocalStorage(apiKey, logger);\n }\n RemoteConfigClient.prototype.subscribe = function (key, deliveryMode, callback) {\n var id = UUID();\n var callbackInfo = {\n id: id,\n key: key,\n deliveryMode: deliveryMode,\n callback: callback,\n };\n this.callbackInfos.push(callbackInfo);\n if (deliveryMode === 'all') {\n void this.subscribeAll(callbackInfo);\n }\n else {\n void this.subscribeWaitForRemote(callbackInfo, deliveryMode.timeout);\n }\n return id;\n };\n RemoteConfigClient.prototype.unsubscribe = function (id) {\n var index = this.callbackInfos.findIndex(function (callbackInfo) { return callbackInfo.id === id; });\n if (index === -1) {\n this.logger.debug(\"Remote config client unsubscribe failed because callback with id \".concat(id, \" doesn't exist.\"));\n return false;\n }\n this.callbackInfos.splice(index, 1);\n this.logger.debug(\"Remote config client unsubscribe succeeded removing callback with id \".concat(id, \".\"));\n return true;\n };\n RemoteConfigClient.prototype.updateConfigs = function () {\n return __awaiter(this, void 0, void 0, function () {\n var timeSinceLastFetch, result;\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n // Check if we need to throttle based on last successful fetch time\n if (this.lastSuccessfulFetch) {\n timeSinceLastFetch = Date.now() - this.lastSuccessfulFetch;\n if (timeSinceLastFetch < DEFAULT_MIN_TIME_BETWEEN_FETCHES) {\n this.logger.debug('Remote config client skipping updateConfigs: Too recent');\n return [2 /*return*/];\n }\n }\n return [4 /*yield*/, this.getOrCreateFetchPromise()];\n case 1:\n result = _a.sent();\n void this.storage.setConfig(result);\n this.callbackInfos.forEach(function (callbackInfo) {\n _this.sendCallback(callbackInfo, result, 'remote');\n });\n return [2 /*return*/];\n }\n });\n });\n };\n /**\n * Get the in-flight fetch promise or create a new one.\n * This ensures multiple subscribe calls share the same network request.\n */\n RemoteConfigClient.prototype.getOrCreateFetchPromise = function () {\n var _this = this;\n if (this.fetchPromise) {\n return this.fetchPromise;\n }\n this.fetchPromise = this.fetch()\n .then(function (result) {\n // Update last successful fetch time if we got a valid config\n if (result.remoteConfig !== null) {\n _this.lastSuccessfulFetch = Date.now();\n }\n return result;\n })\n .finally(function () {\n // Clear the promise after it settles (success or failure)\n _this.fetchPromise = null;\n });\n return this.fetchPromise;\n };\n /**\n * Send remote first. If it's already complete, we can skip the cached response.\n * - if remote is fetched first, no cache fetch.\n * - if cache is fetched first, still fetching remote.\n */\n RemoteConfigClient.prototype.subscribeAll = function (callbackInfo) {\n return __awaiter(this, void 0, void 0, function () {\n var remotePromise, cachePromise, result;\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n remotePromise = this.getOrCreateFetchPromise().then(function (result) {\n _this.logger.debug(\"Remote config client subscription all mode fetched from remote: \".concat(JSON.stringify(result)));\n _this.sendCallback(callbackInfo, result, 'remote');\n void _this.storage.setConfig(result);\n });\n cachePromise = this.storage.fetchConfig().then(function (result) {\n return result;\n });\n return [4 /*yield*/, Promise.race([remotePromise, cachePromise])];\n case 1:\n result = _a.sent();\n // If cache is fetched first, wait for remote.\n if (result !== undefined) {\n this.logger.debug(\"Remote config client subscription all mode fetched from cache: \".concat(JSON.stringify(result)));\n // Skip sending callback if cache is empty (first time user).\n if (result.remoteConfig !== null) {\n this.sendCallback(callbackInfo, result, 'cache');\n }\n else {\n this.logger.debug('Remote config client skips sending callback because cache is empty (first time user).');\n }\n }\n return [4 /*yield*/, remotePromise];\n case 2:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n /**\n * Waits for a remote response until the given timeout, then return a cached copy, if available.\n */\n RemoteConfigClient.prototype.subscribeWaitForRemote = function (callbackInfo, timeout) {\n return __awaiter(this, void 0, void 0, function () {\n var timeoutPromise, result, error_1, result;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n timeoutPromise = new Promise(function (_, reject) {\n setTimeout(function () {\n reject('Timeout exceeded');\n }, timeout);\n });\n _a.label = 1;\n case 1:\n _a.trys.push([1, 3, , 5]);\n return [4 /*yield*/, Promise.race([\n this.getOrCreateFetchPromise(),\n timeoutPromise,\n ])];\n case 2:\n result = (_a.sent());\n this.logger.debug('Remote config client subscription wait for remote mode returns from remote.');\n this.sendCallback(callbackInfo, result, 'remote');\n void this.storage.setConfig(result);\n return [3 /*break*/, 5];\n case 3:\n error_1 = _a.sent();\n this.logger.debug('Remote config client subscription wait for remote mode exceeded timeout. Try to fetch from cache.');\n return [4 /*yield*/, this.storage.fetchConfig()];\n case 4:\n result = _a.sent();\n if (result.remoteConfig !== null) {\n this.logger.debug('Remote config client subscription wait for remote mode returns a cached copy.');\n this.sendCallback(callbackInfo, result, 'cache');\n }\n else {\n this.logger.debug('Remote config client subscription wait for remote mode failed to fetch cache.');\n this.sendCallback(callbackInfo, result, 'remote');\n }\n return [3 /*break*/, 5];\n case 5: return [2 /*return*/];\n }\n });\n });\n };\n /**\n * Call the callback with filtered remote config based on key.\n * @param remoteConfigInfo - the whole remote config object without filtering by key.\n */\n RemoteConfigClient.prototype.sendCallback = function (callbackInfo, remoteConfigInfo, source) {\n callbackInfo.lastCallback = new Date();\n var filteredConfig;\n if (callbackInfo.key) {\n // Filter remote config by key.\n // For example, if remote config is {a: {b: {c: 1}}},\n // if key = 'a', filter result is {b: {c: 1}};\n // if key = 'a.b', filter result is {c: 1}\n filteredConfig = callbackInfo.key.split('.').reduce(function (config, key) {\n if (config === null) {\n return config;\n }\n return key in config ? config[key] : null;\n }, remoteConfigInfo.remoteConfig);\n }\n else {\n filteredConfig = remoteConfigInfo.remoteConfig;\n }\n callbackInfo.callback(filteredConfig, source, remoteConfigInfo.lastFetch);\n };\n /**\n * Fetch remote config from remote.\n * @param retries - the number of retries. default is 3.\n * @param timeout - the timeout in milliseconds. Default is 1000.\n * This timeout serves two purposes:\n * 1. It determines how long to wait for each remote config fetch request before aborting it.\n * If the fetch does not complete within the specified timeout, the request is cancelled using AbortController,\n * and the attempt is considered failed (and may be retried if retries remain).\n * 2. It is also used to calculate the interval between retries. The total timeout is divided by the number of retries,\n * so each retry waits for (timeout / retries) milliseconds before the next attempt (linear backoff).\n * @returns the remote config info. null if failed to fetch or the response is not valid JSON.\n */\n RemoteConfigClient.prototype.fetch = function (retries, timeout) {\n if (retries === void 0) { retries = DEFAULT_MAX_RETRIES; }\n if (timeout === void 0) { timeout = DEFAULT_TIMEOUT; }\n return __awaiter(this, void 0, void 0, function () {\n var interval, failedRemoteConfigInfo, _loop_1, this_1, attempt, state_1;\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n interval = timeout / retries;\n failedRemoteConfigInfo = {\n remoteConfig: null,\n lastFetch: new Date(),\n };\n _loop_1 = function (attempt) {\n var abortController, timeoutId, res, body, remoteConfig, error_2;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n abortController = new AbortController();\n timeoutId = setTimeout(function () { return abortController.abort(); }, timeout);\n _b.label = 1;\n case 1:\n _b.trys.push([1, 7, 8, 9]);\n return [4 /*yield*/, fetch(this_1.getUrlParams(), {\n method: 'GET',\n headers: {\n Accept: '*/*',\n },\n signal: abortController.signal,\n })];\n case 2:\n res = _b.sent();\n if (!!res.ok) return [3 /*break*/, 4];\n return [4 /*yield*/, res.text()];\n case 3:\n body = _b.sent();\n this_1.logger.debug(\"Remote config client fetch with retry time \".concat(retries, \" failed with \").concat(res.status, \": \").concat(body));\n return [3 /*break*/, 6];\n case 4: return [4 /*yield*/, res.json()];\n case 5:\n remoteConfig = (_b.sent());\n return [2 /*return*/, { value: {\n remoteConfig: remoteConfig,\n lastFetch: new Date(),\n } }];\n case 6: return [3 /*break*/, 9];\n case 7:\n error_2 = _b.sent();\n // Handle rejects when the request fails, for example, a network error or timeout\n if (error_2 instanceof Error && error_2.name === 'AbortError') {\n this_1.logger.debug(\"Remote config client fetch with retry time \".concat(retries, \" timed out after \").concat(timeout, \"ms\"));\n }\n else {\n this_1.logger.debug(\"Remote config client fetch with retry time \".concat(retries, \" is rejected because: \"), error_2);\n }\n return [3 /*break*/, 9];\n case 8:\n // Clear the timeout since request completed or failed\n clearTimeout(timeoutId);\n return [7 /*endfinally*/];\n case 9:\n if (!(attempt < retries - 1)) return [3 /*break*/, 11];\n return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, _this.getJitterDelay(interval)); })];\n case 10:\n _b.sent();\n _b.label = 11;\n case 11: return [2 /*return*/];\n }\n });\n };\n this_1 = this;\n attempt = 0;\n _a.label = 1;\n case 1:\n if (!(attempt < retries)) return [3 /*break*/, 4];\n return [5 /*yield**/, _loop_1(attempt)];\n case 2:\n state_1 = _a.sent();\n if (typeof state_1 === \"object\")\n return [2 /*return*/, state_1.value];\n _a.label = 3;\n case 3:\n attempt++;\n return [3 /*break*/, 1];\n case 4: return [2 /*return*/, failedRemoteConfigInfo];\n }\n });\n });\n };\n /**\n * Return jitter in the bound of [0,baseDelay) and then floor round.\n */\n RemoteConfigClient.prototype.getJitterDelay = function (baseDelay) {\n return Math.floor(Math.random() * baseDelay);\n };\n RemoteConfigClient.prototype.getUrlParams = function () {\n // URL encode the API key to handle special characters\n var encodedApiKey = encodeURIComponent(this.apiKey);\n var urlParams = new URLSearchParams();\n urlParams.append('config_group', RemoteConfigClient.CONFIG_GROUP);\n return \"\".concat(this.serverUrl, \"/\").concat(encodedApiKey, \"?\").concat(urlParams.toString());\n };\n RemoteConfigClient.CONFIG_GROUP = 'browser';\n return RemoteConfigClient;\n}());\nexport { RemoteConfigClient };\n//# sourceMappingURL=remote-config.js.map","export var OfflineDisabled = null;\n//# sourceMappingURL=offline.js.map","/**\n * Default CSS selectors to define which elements on the page to track.\n * Extend this list to include additional elements to track. For example:\n * ```\n * autocapturePlugin({\n * cssSelectorAllowlist: [...DEFAULT_CSS_SELECTOR_ALLOWLIST, \".my-class\"],\n * })\n * ```\n */\nexport var DEFAULT_CSS_SELECTOR_ALLOWLIST = [\n 'a',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'label',\n 'video',\n 'audio',\n '[contenteditable=\"true\" i]',\n '[data-amp-default-track]',\n '.amp-default-track',\n];\n/**\n * Default prefix to allow the plugin to capture data attributes as an event property.\n */\nexport var DEFAULT_DATA_ATTRIBUTE_PREFIX = 'data-amp-track-';\n/**\n * Default list of elements on the page should be tracked when the page changes.\n */\nexport var DEFAULT_ACTION_CLICK_ALLOWLIST = ['div', 'span', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n//# sourceMappingURL=element-interactions.js.map","import { __read, __spreadArray } from \"tslib\";\nvar CLICKABLE_ELEMENT_SELECTORS = [\n 'a',\n 'button',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"menuitem\"]',\n '[role=\"menuitemcheckbox\"]',\n '[role=\"menuitemradio\"]',\n '[role=\"option\"]',\n '[role=\"tab\"]',\n '[role=\"treeitem\"]',\n '[contenteditable=\"true\" i]',\n];\nvar DEFAULT_ERROR_AND_DEAD_CLICK_ALLOWLIST = __spreadArray([\n 'input[type=\"button\"]',\n 'input[type=\"submit\"]',\n 'input[type=\"reset\"]',\n 'input[type=\"image\"]',\n 'input[type=\"file\"]'\n], __read(CLICKABLE_ELEMENT_SELECTORS), false);\n/**\n * Default CSS selectors for dead clicks tracking\n */\nexport var DEFAULT_DEAD_CLICK_ALLOWLIST = DEFAULT_ERROR_AND_DEAD_CLICK_ALLOWLIST;\n/**\n * Default CSS selectors for error tracking\n */\nexport var DEFAULT_ERROR_CLICK_ALLOWLIST = DEFAULT_ERROR_AND_DEAD_CLICK_ALLOWLIST;\n/**\n * Default CSS selectors for rage clicks tracking\n */\nexport var DEFAULT_RAGE_CLICK_ALLOWLIST = ['*'];\n/**\n * Default time window for dead clicks (3 seconds)\n */\nexport var DEFAULT_DEAD_CLICK_WINDOW_MS = 3000;\n/**\n * Default time window for rage clicks (1 second)\n */\nexport var DEFAULT_RAGE_CLICK_WINDOW_MS = 1000;\n/**\n * Default threshold for rage clicks (4 clicks)\n */\nexport var DEFAULT_RAGE_CLICK_THRESHOLD = 4;\n/**\n * Default threshold for rage clicks to be considered out of bounds (50 pixels)\n */\nexport var DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD = 50; // pixels\n//# sourceMappingURL=frustration-interactions.js.map","import { __read, __spreadArray, __values } from \"tslib\";\nfunction isJsonPrimitive(json) {\n return (typeof json === 'string' ||\n typeof json === 'number' ||\n typeof json === 'boolean' ||\n json === null ||\n json === undefined);\n}\n/**\n * Prune a JSON object to only include the keys in the allowlist and excludes the keys\n * in the exclude list.\n *\n * This function is a mutative function that will modify the original JSON object.\n * This is done to avoid creating a new JSON object and copying the data.\n *\n * @param json - The JSON object to prune.\n * @param allowlist - The keys to include in the pruned JSON object.\n * @param excludelist - The keys to exclude from the pruned JSON object.\n */\nexport function pruneJson(json, allowlist, excludelist) {\n if (!json)\n return;\n // tokenize the allowlist and excludelist\n var allowlistTokens = allowlist.map(tokenizeJsonPath);\n var excludelistTokens = excludelist.map(tokenizeJsonPath);\n _pruneJson({\n json: json,\n allowlist: allowlistTokens,\n excludelist: excludelistTokens,\n ancestors: [],\n });\n}\nexport function _pruneJson(_a) {\n var e_1, _b;\n var json = _a.json, targetObject = _a.targetObject, allowlist = _a.allowlist, excludelist = _a.excludelist, ancestors = _a.ancestors, parentObject = _a.parentObject, targetKey = _a.targetKey;\n if (!targetObject) {\n targetObject = json;\n }\n var keys = Object.keys(targetObject);\n try {\n for (var keys_1 = __values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {\n var key = keys_1_1.value;\n var path = __spreadArray(__spreadArray([], __read(ancestors), false), [key], false);\n if (isJsonPrimitive(targetObject[key])) {\n // if the value does not match allowlist or matches exclude list, delete it\n if (!hasPathMatchInList(path, allowlist) || hasPathMatchInList(path, excludelist)) {\n delete targetObject[key];\n }\n }\n else {\n _pruneJson({\n json: json,\n targetObject: targetObject[key],\n allowlist: allowlist,\n excludelist: excludelist,\n ancestors: path,\n parentObject: targetObject,\n targetKey: key,\n });\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (keys_1_1 && !keys_1_1.done && (_b = keys_1.return)) _b.call(keys_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n // if this object is empty now, delete the whole object\n if (Object.keys(targetObject).length === 0 && parentObject && targetKey) {\n delete parentObject[targetKey];\n }\n}\n/**\n * Tokenize a JSON path string into an array of strings.\n * Escapes ~0 and ~1 to ~ and / respectively.\n *\n * e.g.) turns string \"a/b/c\" into [\"a\", \"b\", \"c\"]\n *\n * @param path - The JSON path to tokenize.\n * @returns The tokenized JSON path.\n */\nexport function tokenizeJsonPath(path) {\n if (path.startsWith('/')) {\n path = path.slice(1);\n }\n return path.split('/').map(function (token) { return token.replace(/~0/g, '~').replace(/~1/g, '/'); });\n}\n/**\n * Check if a JSON path matches a path matcher.\n *\n * Rules:\n * 1. If a key in a path and a matcher are the same, then they match, move to the next\n * 2. If the matcher is a *, then it matches the key, move to the next\n * 3. If the matcher is a **, then it matches >=0 keys\n *\n * @param path - The path to check.\n * @param pathMatcher - The path matcher to check against.\n * @param i - The current index of the path.\n * @param j - The current index of the path matcher.\n * @returns True if the path matches the path matcher, false otherwise.\n */\nexport function isPathMatch(path, pathMatcher, i, j) {\n if (i === void 0) { i = 0; }\n if (j === void 0) { j = 0; }\n if (j === pathMatcher.length) {\n return i === path.length;\n }\n if (i === path.length) {\n while (j < pathMatcher.length && pathMatcher[j] === '**') {\n j++;\n }\n return j === pathMatcher.length;\n }\n var currentMatcher = pathMatcher[j];\n if (currentMatcher === '**') {\n if (j + 1 === pathMatcher.length) {\n return true;\n }\n for (var k = i; k <= path.length; k++) {\n if (isPathMatch(path, pathMatcher, k, j + 1)) {\n return true;\n }\n }\n return false;\n }\n else if (currentMatcher === '*' || currentMatcher === path[i]) {\n return isPathMatch(path, pathMatcher, i + 1, j + 1);\n }\n else {\n return false;\n }\n}\n/**\n * Check if a JSON path matches any of the path matchers in the allow or exclude list.\n *\n * @param path - The JSON path to check.\n * @param allowOrExcludeList - The allow or exclude list to check against.\n * @returns True if the path matches any of the path matchers in the allow or exclude list, false otherwise.\n */\nfunction hasPathMatchInList(path, allowOrExcludeList) {\n return allowOrExcludeList.some(function (l) { return isPathMatch(path, l); });\n}\n//# sourceMappingURL=json-query.js.map","import { __awaiter, __generator, __read, __spreadArray, __values } from \"tslib\";\nimport { getGlobalScope } from './global-scope';\nimport { pruneJson } from './utils/json-query';\nimport { SAFE_HEADERS, FORBIDDEN_HEADERS } from './';\nvar TEXT_READ_TIMEOUT = 500;\nexport var MAXIMUM_ENTRIES = 100;\n/**\n * This class encapsulates the RequestInit (https://developer.mozilla.org/en-US/docs/Web/API/RequestInit)\n * object so that the consumer can only get access to the headers, method and body size.\n *\n * This is to prevent consumers from directly accessing the Request object\n * and mutating it or running costly operations on it.\n *\n * IMPORTANT:\n * * Do not make changes to this class without careful consideration\n * of performance implications, memory usage and potential to mutate the customer's\n * request.\n * * NEVER .clone() the RequestInit object. This will 2x's the memory overhead of the request\n * * NEVER: call .arrayBuffer(), text(), json() or any other method on the body that\n * consumes the body's stream. This will cause the response to be consumed\n * meaning the body will be empty when the customer tries to access it.\n * (ie: if the body is an instanceof https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream\n * never call any of the methods on it)\n */\nvar RequestWrapperFetch = /** @class */ (function () {\n function RequestWrapperFetch(request) {\n this.request = request;\n }\n RequestWrapperFetch.prototype.headers = function (allow) {\n var e_1, _a;\n if (allow === void 0) { allow = []; }\n var headersUnsafe = this.request.headers;\n // copy the headers into a new object\n var headersSafeCopy = {};\n if (Array.isArray(headersUnsafe)) {\n headersUnsafe.forEach(function (_a) {\n var _b = __read(_a, 2), headerName = _b[0], headerValue = _b[1];\n headersSafeCopy[headerName] = headerValue;\n });\n }\n else if (headersUnsafe instanceof Headers) {\n headersUnsafe.forEach(function (value, key) {\n headersSafeCopy[key] = value;\n });\n }\n else if (typeof headersUnsafe === 'object' && headersUnsafe !== null) {\n try {\n for (var _b = __values(Object.entries(headersUnsafe)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var _d = __read(_c.value, 2), key = _d[0], value = _d[1];\n headersSafeCopy[key] = value;\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n return pruneHeaders(headersSafeCopy, { allow: allow });\n };\n Object.defineProperty(RequestWrapperFetch.prototype, \"bodySize\", {\n get: function () {\n if (typeof this._bodySize === 'number')\n return this._bodySize;\n var global = getGlobalScope();\n /* istanbul ignore if */\n if (!(global === null || global === void 0 ? void 0 : global.TextEncoder)) {\n return;\n }\n var body = this.request.body;\n this._bodySize = getBodySize(body, MAXIMUM_ENTRIES);\n return this._bodySize;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(RequestWrapperFetch.prototype, \"method\", {\n get: function () {\n return this.request.method;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(RequestWrapperFetch.prototype, \"body\", {\n get: function () {\n if (typeof this.request.body === 'string') {\n return this.request.body;\n }\n return null;\n },\n enumerable: false,\n configurable: true\n });\n RequestWrapperFetch.prototype.json = function (allow, exclude) {\n if (allow === void 0) { allow = []; }\n if (exclude === void 0) { exclude = []; }\n return __awaiter(this, void 0, void 0, function () {\n var text;\n return __generator(this, function (_a) {\n if (allow.length === 0) {\n return [2 /*return*/, null];\n }\n text = this.body;\n return [2 /*return*/, safeParseAndPruneBody(text, allow, exclude)];\n });\n });\n };\n return RequestWrapperFetch;\n}());\nexport { RequestWrapperFetch };\nvar RequestWrapperXhr = /** @class */ (function () {\n function RequestWrapperXhr(bodyRaw, requestHeaders) {\n this.bodyRaw = bodyRaw;\n this.requestHeaders = requestHeaders;\n }\n RequestWrapperXhr.prototype.headers = function (allow) {\n if (allow === void 0) { allow = []; }\n return pruneHeaders(this.requestHeaders, { allow: allow });\n };\n Object.defineProperty(RequestWrapperXhr.prototype, \"bodySize\", {\n get: function () {\n return getBodySize(this.bodyRaw, MAXIMUM_ENTRIES);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(RequestWrapperXhr.prototype, \"body\", {\n get: function () {\n if (typeof this.bodyRaw === 'string') {\n return this.bodyRaw;\n }\n return null;\n },\n enumerable: false,\n configurable: true\n });\n RequestWrapperXhr.prototype.json = function (allow, exclude) {\n if (allow === void 0) { allow = []; }\n if (exclude === void 0) { exclude = []; }\n return __awaiter(this, void 0, void 0, function () {\n var text;\n return __generator(this, function (_a) {\n if (allow.length === 0) {\n return [2 /*return*/, null];\n }\n text = this.body;\n return [2 /*return*/, safeParseAndPruneBody(text, allow, exclude)];\n });\n });\n };\n return RequestWrapperXhr;\n}());\nexport { RequestWrapperXhr };\nfunction getBodySize(bodyUnsafe, maxEntries) {\n var e_2, _a;\n var bodySize;\n var global = getGlobalScope();\n /* istanbul ignore next */\n var TextEncoder = global === null || global === void 0 ? void 0 : global.TextEncoder;\n /* istanbul ignore next */\n if (!TextEncoder) {\n return;\n }\n var bodySafe;\n if (typeof bodyUnsafe === 'string') {\n bodySafe = bodyUnsafe;\n bodySize = new TextEncoder().encode(bodySafe).length;\n }\n else if (bodyUnsafe instanceof Blob) {\n bodySafe = bodyUnsafe;\n bodySize = bodySafe.size;\n }\n else if (bodyUnsafe instanceof URLSearchParams) {\n bodySafe = bodyUnsafe;\n bodySize = new TextEncoder().encode(bodySafe.toString()).length;\n }\n else if (ArrayBuffer.isView(bodyUnsafe)) {\n bodySafe = bodyUnsafe;\n bodySize = bodySafe.byteLength;\n }\n else if (bodyUnsafe instanceof ArrayBuffer) {\n bodySafe = bodyUnsafe;\n bodySize = bodySafe.byteLength;\n }\n else if (bodyUnsafe instanceof FormData) {\n // Estimating only for text parts; not accurate for files\n var formData = bodyUnsafe;\n var total = 0;\n var count = 0;\n try {\n for (var _b = __values(formData.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {\n var _d = __read(_c.value, 2), key = _d[0], value = _d[1];\n total += key.length;\n if (typeof value === 'string') {\n total += new TextEncoder().encode(value).length;\n }\n else if (value instanceof Blob) {\n total += value.size;\n }\n else {\n // encountered an unknown type\n // we can't estimate the size of this entry\n return;\n }\n // terminate if we reach the maximum number of entries\n // to avoid performance issues in case of very large FormData\n if (++count >= maxEntries) {\n return;\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_2) throw e_2.error; }\n }\n bodySize = total;\n }\n else if (bodyUnsafe instanceof ReadableStream) {\n // If bodyUnsafe is an instanceof ReadableStream, we can't determine the size,\n // without consuming it, so we return undefined.\n // Never ever consume ReadableStream! DO NOT DO IT!!!\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n bodySafe = bodyUnsafe;\n return;\n }\n return bodySize;\n}\n/**\n * This class encapsulates the Fetch API Response object\n * (https://developer.mozilla.org/en-US/docs/Web/API/Response) so that the consumer can\n * only get access to the headers and body size.\n *\n * This is to prevent consumers from directly accessing the Response object\n * and mutating it or running costly operations on it.\n *\n * IMPORTANT:\n * * Do not make changes to this class without careful consideration\n * of performance implications, memory usage and potential to mutate the customer's\n * response.\n * * Do not .clone() the Response object unless you need to access the body.\n * Cloning will 2x the memory overhead of the response.\n * * NEVER consume the body's stream. This will cause the response to be consumed\n * meaning the body will be empty when the customer tries to access it.\n * (ie: if the body is an instanceof https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream\n * never call any of the methods on it)\n */\nvar ResponseWrapperFetch = /** @class */ (function () {\n function ResponseWrapperFetch(response) {\n this.response = response;\n }\n ResponseWrapperFetch.prototype.headers = function (allow) {\n var _a;\n if (allow === void 0) { allow = []; }\n if (this.response.headers instanceof Headers) {\n var headersSafe = this.response.headers;\n var headersOut_1 = {};\n /* istanbul ignore next */\n (_a = headersSafe === null || headersSafe === void 0 ? void 0 : headersSafe.forEach) === null || _a === void 0 ? void 0 : _a.call(headersSafe, function (value, key) {\n headersOut_1[key] = value;\n });\n return pruneHeaders(headersOut_1, { allow: allow });\n }\n return;\n };\n Object.defineProperty(ResponseWrapperFetch.prototype, \"bodySize\", {\n get: function () {\n var _a, _b;\n if (this._bodySize !== undefined)\n return this._bodySize;\n /* istanbul ignore next */\n var contentLength = (_b = (_a = this.response.headers) === null || _a === void 0 ? void 0 : _a.get) === null || _b === void 0 ? void 0 : _b.call(_a, 'content-length');\n var bodySize = contentLength ? parseInt(contentLength, 10) : undefined;\n this._bodySize = bodySize;\n return bodySize;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ResponseWrapperFetch.prototype, \"status\", {\n get: function () {\n return this.response.status;\n },\n enumerable: false,\n configurable: true\n });\n ResponseWrapperFetch.prototype.text = function () {\n return __awaiter(this, void 0, void 0, function () {\n var textPromise, timer, text, error_1;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n // !!!IMPORTANT: we clone the response to avoid mutating the original response\n // never call .text(), .json(), etc.. on the original response always clone it first\n if (!this.clonedResponse) {\n this.clonedResponse = this.response.clone();\n }\n _a.label = 1;\n case 1:\n _a.trys.push([1, 3, , 4]);\n textPromise = this.clonedResponse.text();\n timer = new Promise(function (resolve) {\n return setTimeout(\n /* istanbul ignore next */\n function () { return resolve(null); }, TEXT_READ_TIMEOUT);\n });\n return [4 /*yield*/, Promise.race([textPromise, timer])];\n case 2:\n text = _a.sent();\n return [2 /*return*/, text];\n case 3:\n error_1 = _a.sent();\n return [2 /*return*/, null];\n case 4: return [2 /*return*/];\n }\n });\n });\n };\n ResponseWrapperFetch.prototype.json = function (allow, exclude) {\n if (allow === void 0) { allow = []; }\n if (exclude === void 0) { exclude = []; }\n return __awaiter(this, void 0, void 0, function () {\n var text;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (allow.length === 0) {\n return [2 /*return*/, null];\n }\n return [4 /*yield*/, this.text()];\n case 1:\n text = _a.sent();\n return [2 /*return*/, safeParseAndPruneBody(text, allow, exclude)];\n }\n });\n });\n };\n return ResponseWrapperFetch;\n}());\nexport { ResponseWrapperFetch };\nvar ResponseWrapperXhr = /** @class */ (function () {\n function ResponseWrapperXhr(statusCode, headersString, size, getJson) {\n this.statusCode = statusCode;\n this.headersString = headersString;\n this.size = size;\n this.getJson = getJson;\n }\n Object.defineProperty(ResponseWrapperXhr.prototype, \"bodySize\", {\n get: function () {\n return this.size;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ResponseWrapperXhr.prototype, \"status\", {\n get: function () {\n return this.statusCode;\n },\n enumerable: false,\n configurable: true\n });\n ResponseWrapperXhr.prototype.headers = function (allow) {\n var e_3, _a;\n if (allow === void 0) { allow = []; }\n if (!this.headersString) {\n return {};\n }\n var headers = {};\n var headerLines = this.headersString.split('\\r\\n');\n try {\n for (var headerLines_1 = __values(headerLines), headerLines_1_1 = headerLines_1.next(); !headerLines_1_1.done; headerLines_1_1 = headerLines_1.next()) {\n var line = headerLines_1_1.value;\n var _b = __read(line.split(': '), 2), key = _b[0], value = _b[1];\n if (key && value) {\n headers[key] = value;\n }\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (headerLines_1_1 && !headerLines_1_1.done && (_a = headerLines_1.return)) _a.call(headerLines_1);\n }\n finally { if (e_3) throw e_3.error; }\n }\n return pruneHeaders(headers, { allow: allow });\n };\n ResponseWrapperXhr.prototype.json = function (allow, exclude) {\n if (allow === void 0) { allow = []; }\n if (exclude === void 0) { exclude = []; }\n return __awaiter(this, void 0, void 0, function () {\n var jsonBody;\n return __generator(this, function (_a) {\n if (allow.length === 0) {\n return [2 /*return*/, null];\n }\n jsonBody = this.getJson();\n if (jsonBody) {\n pruneJson(jsonBody, allow, exclude);\n return [2 /*return*/, jsonBody];\n }\n return [2 /*return*/, null];\n });\n });\n };\n return ResponseWrapperXhr;\n}());\nexport { ResponseWrapperXhr };\nfunction safeParseAndPruneBody(text, allow, exclude) {\n if (!text)\n return null;\n try {\n var json = JSON.parse(text);\n pruneJson(json, allow, exclude);\n return json;\n }\n catch (error) {\n return null;\n }\n}\nexport var PRUNE_STRATEGY;\n(function (PRUNE_STRATEGY) {\n PRUNE_STRATEGY[\"REDACT\"] = \"redact\";\n PRUNE_STRATEGY[\"REMOVE\"] = \"remove\";\n})(PRUNE_STRATEGY || (PRUNE_STRATEGY = {}));\nvar REDACTED_VALUE = '[REDACTED]';\n/**\n * Prune headers from a headers record object.\n * @param headers - The headers to prune.\n * @param options - The options to prune the headers.\n * @param options.exclude - List of headers to delete from headers\n * @param options.include - List of headers to keep in headers, if not provided, all headers are kept by default\n * @returns The pruned headers.\n */\nexport var pruneHeaders = function (headers, options) {\n var e_4, _a;\n var _b = options.allow, allow = _b === void 0 ? [] : _b, _c = options.strategy, strategy = _c === void 0 ? PRUNE_STRATEGY.REMOVE : _c;\n var exclude = __spreadArray([], __read(FORBIDDEN_HEADERS), false);\n var headersPruned = {};\n var _loop_1 = function (key) {\n var lowerKey = key.toLowerCase();\n if (exclude.find(function (e) { return e.toLowerCase() === lowerKey; })) {\n if (strategy === PRUNE_STRATEGY.REDACT) {\n headersPruned[key] = REDACTED_VALUE;\n }\n }\n else if (!allow.find(function (i) { return i.toLowerCase() === lowerKey; })) {\n if (strategy === PRUNE_STRATEGY.REDACT) {\n headersPruned[key] = REDACTED_VALUE;\n }\n }\n else {\n headersPruned[key] = headers[key];\n }\n };\n try {\n for (var _d = __values(Object.keys(headers)), _e = _d.next(); !_e.done; _e = _d.next()) {\n var key = _e.value;\n _loop_1(key);\n }\n }\n catch (e_4_1) { e_4 = { error: e_4_1 }; }\n finally {\n try {\n if (_e && !_e.done && (_a = _d.return)) _a.call(_d);\n }\n finally { if (e_4) throw e_4.error; }\n }\n return headersPruned;\n};\nvar NetworkRequestEvent = /** @class */ (function () {\n function NetworkRequestEvent(type, method, timestamp, startTime, url, requestWrapper, status, duration, responseWrapper, error, endTime) {\n if (status === void 0) { status = 0; }\n this.type = type;\n this.method = method;\n this.timestamp = timestamp;\n this.startTime = startTime;\n this.url = url;\n this.requestWrapper = requestWrapper;\n this.status = status;\n this.duration = duration;\n this.responseWrapper = responseWrapper;\n this.error = error;\n this.endTime = endTime;\n }\n NetworkRequestEvent.prototype.toSerializable = function () {\n var _a, _b, _c, _d;\n var serialized = {\n type: this.type,\n method: this.method,\n url: this.url,\n timestamp: this.timestamp,\n status: this.status,\n duration: this.duration,\n error: this.error,\n startTime: this.startTime,\n endTime: this.endTime,\n requestHeaders: (_a = this.requestWrapper) === null || _a === void 0 ? void 0 : _a.headers(__spreadArray([], __read(SAFE_HEADERS), false)),\n requestBodySize: (_b = this.requestWrapper) === null || _b === void 0 ? void 0 : _b.bodySize,\n responseHeaders: (_c = this.responseWrapper) === null || _c === void 0 ? void 0 : _c.headers(__spreadArray([], __read(SAFE_HEADERS), false)),\n responseBodySize: (_d = this.responseWrapper) === null || _d === void 0 ? void 0 : _d.bodySize,\n };\n return Object.fromEntries(Object.entries(serialized).filter(function (_a) {\n var _b = __read(_a, 2), _ = _b[0], v = _b[1];\n return v !== undefined;\n }));\n };\n return NetworkRequestEvent;\n}());\nexport { NetworkRequestEvent };\n//# sourceMappingURL=network-request-event.js.map","import { __assign, __awaiter, __generator, __read } from \"tslib\";\nimport { getGlobalScope } from '..';\nimport { UUID } from '../utils/uuid';\nimport { NetworkRequestEvent, RequestWrapperFetch, ResponseWrapperFetch, RequestWrapperXhr, ResponseWrapperXhr, } from '../network-request-event';\n/**\n * Typeguard function checks if an input is a Request object.\n */\nfunction isRequest(requestInfo) {\n return typeof requestInfo === 'object' && requestInfo !== null && 'url' in requestInfo && 'method' in requestInfo;\n}\nvar NetworkEventCallback = /** @class */ (function () {\n function NetworkEventCallback(callback, id) {\n if (id === void 0) { id = UUID(); }\n this.callback = callback;\n this.id = id;\n }\n return NetworkEventCallback;\n}());\nexport { NetworkEventCallback };\nvar NetworkObserver = /** @class */ (function () {\n function NetworkObserver(logger) {\n this.eventCallbacks = new Map();\n this.isObserving = false;\n this.logger = logger;\n var globalScope = getGlobalScope();\n if (!NetworkObserver.isSupported()) {\n /* istanbul ignore next */\n return;\n }\n this.globalScope = globalScope;\n }\n NetworkObserver.isSupported = function () {\n var globalScope = getGlobalScope();\n return !!globalScope && !!globalScope.fetch;\n };\n NetworkObserver.prototype.subscribe = function (eventCallback, logger) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n if (!this.logger) {\n this.logger = logger;\n }\n this.eventCallbacks.set(eventCallback.id, eventCallback);\n if (!this.isObserving) {\n /* istanbul ignore next */\n // eslint-disable-next-line @typescript-eslint/unbound-method\n var originalXhrOpen = (_c = (_b = (_a = this.globalScope) === null || _a === void 0 ? void 0 : _a.XMLHttpRequest) === null || _b === void 0 ? void 0 : _b.prototype) === null || _c === void 0 ? void 0 : _c.open;\n /* istanbul ignore next */\n // eslint-disable-next-line @typescript-eslint/unbound-method\n var originalXhrSend = (_f = (_e = (_d = this.globalScope) === null || _d === void 0 ? void 0 : _d.XMLHttpRequest) === null || _e === void 0 ? void 0 : _e.prototype) === null || _f === void 0 ? void 0 : _f.send;\n /* istanbul ignore next */\n // eslint-disable-next-line @typescript-eslint/unbound-method\n var originalXhrSetRequestHeader = (_j = (_h = (_g = this.globalScope) === null || _g === void 0 ? void 0 : _g.XMLHttpRequest) === null || _h === void 0 ? void 0 : _h.prototype) === null || _j === void 0 ? void 0 : _j.setRequestHeader;\n if (originalXhrOpen && originalXhrSend && originalXhrSetRequestHeader) {\n this.observeXhr(originalXhrOpen, originalXhrSend, originalXhrSetRequestHeader);\n }\n /* istanbul ignore next */\n var originalFetch = (_k = this.globalScope) === null || _k === void 0 ? void 0 : _k.fetch;\n /* istanbul ignore next */\n if (originalFetch) {\n this.observeFetch(originalFetch);\n }\n /* istanbul ignore next */\n this.isObserving = true;\n }\n };\n NetworkObserver.prototype.unsubscribe = function (eventCallback) {\n this.eventCallbacks.delete(eventCallback.id);\n };\n NetworkObserver.prototype.triggerEventCallbacks = function (event) {\n var _this = this;\n this.eventCallbacks.forEach(function (callback) {\n var _a;\n try {\n callback.callback(event);\n }\n catch (err) {\n // if the callback throws an error, we should catch it\n // to avoid breaking the fetch promise chain\n /* istanbul ignore next */\n (_a = _this.logger) === null || _a === void 0 ? void 0 : _a.debug('an unexpected error occurred while triggering event callbacks', err);\n }\n });\n };\n NetworkObserver.prototype.handleNetworkRequestEvent = function (requestType, requestInfo, requestWrapper, responseWrapper, typedError, startTime, durationStart) {\n var _a;\n /* istanbul ignore next */\n if (startTime === undefined || durationStart === undefined) {\n // if we reach this point, it means that the performance API is not supported\n // so we can't construct a NetworkRequestEvent\n return;\n }\n // parse the URL and Method\n var url;\n var method = 'GET';\n if (isRequest(requestInfo)) {\n url = requestInfo['url'];\n method = requestInfo['method'];\n }\n else {\n url = (_a = requestInfo === null || requestInfo === void 0 ? void 0 : requestInfo.toString) === null || _a === void 0 ? void 0 : _a.call(requestInfo);\n }\n // strip basic auth from the URL\n if (url) {\n try {\n var parsedUrl = new URL(url);\n // reconstruct the URL without the basic auth\n url = \"\".concat(parsedUrl.protocol, \"//\").concat(parsedUrl.host).concat(parsedUrl.pathname).concat(parsedUrl.search).concat(parsedUrl.hash);\n // eslint-disable-next-line no-empty\n }\n catch (err) { }\n }\n method = (requestWrapper === null || requestWrapper === void 0 ? void 0 : requestWrapper.method) || method;\n var status, error;\n if (responseWrapper) {\n status = responseWrapper.status;\n }\n if (typedError) {\n error = {\n name: typedError.name || 'UnknownError',\n message: typedError.message || 'An unknown error occurred',\n };\n status = 0;\n }\n var duration = Math.floor(performance.now() - durationStart);\n var endTime = Math.floor(startTime + duration);\n var requestEvent = new NetworkRequestEvent(requestType, method, startTime, // timestamp and startTime are aliases\n startTime, url, requestWrapper, status, duration, responseWrapper, error, endTime);\n this.triggerEventCallbacks(requestEvent);\n };\n NetworkObserver.prototype.getTimestamps = function () {\n var _a, _b;\n /* istanbul ignore next */\n return {\n startTime: (_a = Date.now) === null || _a === void 0 ? void 0 : _a.call(Date),\n durationStart: (_b = performance === null || performance === void 0 ? void 0 : performance.now) === null || _b === void 0 ? void 0 : _b.call(performance),\n };\n };\n NetworkObserver.prototype.observeFetch = function (originalFetch) {\n var _this = this;\n /* istanbul ignore next */\n if (!this.globalScope || !originalFetch) {\n return;\n }\n /**\n * IMPORTANT: This overrides window.fetch in browsers.\n * You probably never need to make changes to this function.\n * If you do, please be careful to preserve the original functionality of fetch\n * and make sure another developer who is an expert reviews this change throughly\n */\n this.globalScope.fetch = function (requestInfo, requestInit) { return __awaiter(_this, void 0, void 0, function () {\n var timestamps, originalResponse, originalError, err_1;\n var _a, _b;\n return __generator(this, function (_c) {\n switch (_c.label) {\n case 0:\n try {\n timestamps = this.getTimestamps();\n }\n catch (error) {\n /* istanbul ignore next */\n (_a = this.logger) === null || _a === void 0 ? void 0 : _a.debug('an unexpected error occurred while retrieving timestamps', error);\n }\n _c.label = 1;\n case 1:\n _c.trys.push([1, 3, , 4]);\n return [4 /*yield*/, originalFetch(requestInfo, requestInit)];\n case 2:\n originalResponse = _c.sent();\n return [3 /*break*/, 4];\n case 3:\n err_1 = _c.sent();\n // Capture error information\n originalError = err_1;\n return [3 /*break*/, 4];\n case 4:\n // 3. call the handler after the fetch call is done\n try {\n this.handleNetworkRequestEvent('fetch', requestInfo, requestInit ? new RequestWrapperFetch(requestInit) : undefined, originalResponse ? new ResponseWrapperFetch(originalResponse) : undefined, originalError, \n /* istanbul ignore next */\n timestamps === null || timestamps === void 0 ? void 0 : timestamps.startTime, \n /* istanbul ignore next */\n timestamps === null || timestamps === void 0 ? void 0 : timestamps.durationStart);\n }\n catch (err) {\n // this catch shouldn't be reachable, but keep it here for safety\n // because we're overriding the fetch function and better to be safe than sorry\n /* istanbul ignore next */\n (_b = this.logger) === null || _b === void 0 ? void 0 : _b.debug('an unexpected error occurred while handling fetch', err);\n }\n // 4. return the original response or throw the original error\n if (originalResponse) {\n // if the response is not undefined, return it\n return [2 /*return*/, originalResponse];\n }\n else {\n throw originalError;\n }\n return [2 /*return*/];\n }\n });\n }); };\n };\n /**\n * Creates a function that parses the response of an XMLHttpRequest as JSON.\n *\n * Returns function instead of JSON object to avoid unnecessary parsing if the\n * body is not being captured.\n *\n * @param xhrSafe - The XMLHttpRequest object.\n * @param context - The NetworkObserver instance.\n * @returns A function that parses the response of an XMLHttpRequest as JSON.\n */\n NetworkObserver.createXhrJsonParser = function (xhrUnsafe, context) {\n return function () {\n var _a, _b;\n try {\n if (xhrUnsafe.responseType === 'json') {\n // if response is a JS object, clone it so that subscribers can't mutate it\n if ((_a = context.globalScope) === null || _a === void 0 ? void 0 : _a.structuredClone) {\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-return */\n return context.globalScope.structuredClone(xhrUnsafe.response);\n }\n }\n else if (['text', ''].includes(xhrUnsafe.responseType)) {\n // if response is a string, parse it as JSON\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-return */\n return JSON.parse(xhrUnsafe.responseText);\n }\n }\n catch (err) {\n /* istanbul ignore if */\n if (err instanceof Error && err.name === 'InvalidStateError') {\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseText#exceptions\n // if we reach here, it means we don't handle responseType correctly\n (_b = context.logger) === null || _b === void 0 ? void 0 : _b.error(\"unexpected error when retrieving responseText. responseType='\".concat(xhrUnsafe.responseType, \"'\"));\n }\n // the other possible error is Json Parse error which we fail silently\n return null;\n }\n return null;\n };\n };\n NetworkObserver.prototype.observeXhr = function (originalXhrOpen, originalXhrSend, originalXhrSetRequestHeader) {\n /* istanbul ignore next */\n if (!this.globalScope || !originalXhrOpen || !originalXhrSend) {\n return;\n }\n var xhrProto = this.globalScope.XMLHttpRequest.prototype;\n var networkObserverContext = this;\n /**\n * IMPORTANT: This overrides window.XMLHttpRequest.prototype.open\n * You probably never need to make changes to this function.\n * If you do, please be careful to preserve the original functionality of xhr.open\n * and make sure another developer who is an expert reviews this change throughly\n */\n xhrProto.open = function () {\n var _a, _b;\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var xhrSafe = this;\n var _c = __read(args, 2), method = _c[0], url = _c[1];\n try {\n /* istanbul ignore next */\n xhrSafe.$$AmplitudeAnalyticsEvent = __assign({ method: method, url: (_a = url === null || url === void 0 ? void 0 : url.toString) === null || _a === void 0 ? void 0 : _a.call(url), headers: {} }, networkObserverContext.getTimestamps());\n }\n catch (err) {\n /* istanbul ignore next */\n (_b = networkObserverContext.logger) === null || _b === void 0 ? void 0 : _b.error('an unexpected error occurred while calling xhr open', err);\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return originalXhrOpen.apply(xhrSafe, args);\n };\n /**\n * IMPORTANT: This overrides window.XMLHttpRequest.prototype.send\n * You probably never need to make changes to this function.\n * If you do, please be careful to preserve the original functionality of xhr.send\n * and make sure another developer who is an expert reviews this change throughly\n */\n // allow \"any\" type for args to reflect how it's used in the browser\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */\n xhrProto.send = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n var xhrUnsafe = this;\n var xhrSafe = xhrUnsafe;\n var getJson = NetworkObserver.createXhrJsonParser(xhrUnsafe, networkObserverContext);\n var body = args[0];\n var requestEvent = xhrSafe.$$AmplitudeAnalyticsEvent;\n xhrSafe.addEventListener('loadend', function () {\n var _a;\n try {\n var responseHeaders = xhrSafe.getAllResponseHeaders();\n var responseBodySize = xhrSafe.getResponseHeader('content-length');\n var responseWrapper = new ResponseWrapperXhr(xhrSafe.status, responseHeaders, \n /* istanbul ignore next */\n responseBodySize ? parseInt(responseBodySize, 10) : undefined, getJson);\n var requestHeaders = xhrSafe.$$AmplitudeAnalyticsEvent.headers;\n var requestWrapper = new RequestWrapperXhr(body, requestHeaders);\n requestEvent.status = xhrSafe.status;\n networkObserverContext.handleNetworkRequestEvent('xhr', { url: requestEvent.url, method: requestEvent.method }, requestWrapper, responseWrapper, undefined, requestEvent.startTime, requestEvent.durationStart);\n }\n catch (err) {\n /* istanbul ignore next */\n (_a = networkObserverContext.logger) === null || _a === void 0 ? void 0 : _a.error('an unexpected error occurred while handling xhr send', err);\n }\n });\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */\n return originalXhrSend.apply(xhrSafe, args);\n };\n /**\n * IMPORTANT: This overrides window.XMLHttpRequest.prototype.setRequestHeader\n * You probably never need to make changes to this function.\n * If you do, please be careful to preserve the original functionality of xhr.setRequestHeader\n * and make sure another developer who is an expert reviews this change throughly\n */\n // allow \"any\" type for args to reflect how it's used in the browser\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */\n xhrProto.setRequestHeader = function (headerName, headerValue) {\n var _a;\n var xhrSafe = this;\n try {\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-assignment */\n xhrSafe.$$AmplitudeAnalyticsEvent.headers[headerName] = headerValue;\n }\n catch (err) {\n /* istanbul ignore next */\n (_a = networkObserverContext.logger) === null || _a === void 0 ? void 0 : _a.error('an unexpected error occurred while calling xhr setRequestHeader', err);\n }\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */\n originalXhrSetRequestHeader.apply(xhrSafe, [headerName, headerValue]);\n };\n };\n return NetworkObserver;\n}());\nexport { NetworkObserver };\n// singleton instance of NetworkObserver\nexport var networkObserver = new NetworkObserver();\n//# sourceMappingURL=network.js.map","import { __assign, __awaiter, __generator } from \"tslib\";\nimport { getQueryParams } from '../query-params';\nimport { UTM_CAMPAIGN, UTM_CONTENT, UTM_MEDIUM, UTM_SOURCE, UTM_TERM, GCLID, FBCLID, BASE_CAMPAIGN, DCLID, MSCLKID, RDT_CID, TWCLID, TTCLID, KO_CLICK_ID, LI_FAT_ID, GBRAID, WBRAID, UTM_ID, } from '../types/constants';\nvar CampaignParser = /** @class */ (function () {\n function CampaignParser() {\n }\n CampaignParser.prototype.parse = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2 /*return*/, __assign(__assign(__assign(__assign({}, BASE_CAMPAIGN), this.getUtmParam()), this.getReferrer()), this.getClickIds())];\n });\n });\n };\n CampaignParser.prototype.getUtmParam = function () {\n var params = getQueryParams();\n var utmCampaign = params[UTM_CAMPAIGN];\n var utmContent = params[UTM_CONTENT];\n var utmId = params[UTM_ID];\n var utmMedium = params[UTM_MEDIUM];\n var utmSource = params[UTM_SOURCE];\n var utmTerm = params[UTM_TERM];\n return {\n utm_campaign: utmCampaign,\n utm_content: utmContent,\n utm_id: utmId,\n utm_medium: utmMedium,\n utm_source: utmSource,\n utm_term: utmTerm,\n };\n };\n CampaignParser.prototype.getReferrer = function () {\n var _a, _b;\n var data = {\n referrer: undefined,\n referring_domain: undefined,\n };\n try {\n data.referrer = document.referrer || undefined;\n data.referring_domain = (_b = (_a = data.referrer) === null || _a === void 0 ? void 0 : _a.split('/')[2]) !== null && _b !== void 0 ? _b : undefined;\n }\n catch (_c) {\n // nothing to track\n }\n return data;\n };\n CampaignParser.prototype.getClickIds = function () {\n var _a;\n var params = getQueryParams();\n return _a = {},\n _a[DCLID] = params[DCLID],\n _a[FBCLID] = params[FBCLID],\n _a[GBRAID] = params[GBRAID],\n _a[GCLID] = params[GCLID],\n _a[KO_CLICK_ID] = params[KO_CLICK_ID],\n _a[LI_FAT_ID] = params[LI_FAT_ID],\n _a[MSCLKID] = params[MSCLKID],\n _a[RDT_CID] = params[RDT_CID],\n _a[TTCLID] = params[TTCLID],\n _a[TWCLID] = params[TWCLID],\n _a[WBRAID] = params[WBRAID],\n _a;\n };\n return CampaignParser;\n}());\nexport { CampaignParser };\n//# sourceMappingURL=campaign-parser.js.map","import { __values } from \"tslib\";\nexport var TEXT_MASK_ATTRIBUTE = 'data-amp-mask';\nexport var MASKED_TEXT_VALUE = '*****';\n// Regex patterns for sensitive data\nexport var CC_REGEX = /\\b(?:\\d[ -]*?){13,16}\\b/;\nexport var SSN_REGEX = /(\\d{3}-?\\d{2}-?\\d{4})/g;\nexport var EMAIL_REGEX = /[^\\s@]+@[^\\s@.]+\\.[^\\s@]+/g;\n/**\n * Replaces sensitive strings (credit cards, SSNs, emails) and custom patterns with masked text\n * @param text - The text to search for sensitive data\n * @param additionalMaskTextPatterns - Optional array of additional regex patterns to mask\n * @returns The text with sensitive data replaced by masked text\n */\nexport var replaceSensitiveString = function (text, additionalMaskTextPatterns) {\n var e_1, _a;\n if (additionalMaskTextPatterns === void 0) { additionalMaskTextPatterns = []; }\n if (typeof text !== 'string') {\n return '';\n }\n var result = text;\n // Check for credit card number (with or without spaces/dashes)\n result = result.replace(CC_REGEX, MASKED_TEXT_VALUE);\n // Check for social security number\n result = result.replace(SSN_REGEX, MASKED_TEXT_VALUE);\n // Check for email\n result = result.replace(EMAIL_REGEX, MASKED_TEXT_VALUE);\n try {\n // Check for additional mask text patterns\n for (var additionalMaskTextPatterns_1 = __values(additionalMaskTextPatterns), additionalMaskTextPatterns_1_1 = additionalMaskTextPatterns_1.next(); !additionalMaskTextPatterns_1_1.done; additionalMaskTextPatterns_1_1 = additionalMaskTextPatterns_1.next()) {\n var pattern = additionalMaskTextPatterns_1_1.value;\n try {\n result = result.replace(pattern, MASKED_TEXT_VALUE);\n }\n catch (_b) {\n // ignore invalid pattern\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (additionalMaskTextPatterns_1_1 && !additionalMaskTextPatterns_1_1.done && (_a = additionalMaskTextPatterns_1.return)) _a.call(additionalMaskTextPatterns_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return result;\n};\n/**\n * Gets the page title, checking if the title element has data-amp-mask attribute\n * @returns The page title, masked if the title element has data-amp-mask attribute\n */\nexport var getPageTitle = function (parseTitleFunction) {\n if (typeof document === 'undefined' || !document.title) {\n return '';\n }\n var titleElement = document.querySelector('title');\n if (titleElement && titleElement.hasAttribute(TEXT_MASK_ATTRIBUTE)) {\n return MASKED_TEXT_VALUE;\n }\n return parseTitleFunction ? parseTitleFunction(document.title) : document.title; // document.title is always synced to the first title element\n};\n//# sourceMappingURL=helpers.js.map","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n// === Symbol Support ===\nvar hasSymbols = function () {\n return typeof Symbol === 'function';\n};\n\nvar hasSymbol = function (name) {\n return hasSymbols() && Boolean(Symbol[name]);\n};\n\nvar getSymbol = function (name) {\n return hasSymbol(name) ? Symbol[name] : '@@' + name;\n};\n\nif (hasSymbols() && !hasSymbol('observable')) {\n Symbol.observable = Symbol('observable');\n}\n\nvar SymbolIterator = getSymbol('iterator');\nvar SymbolObservable = getSymbol('observable');\nvar SymbolSpecies = getSymbol('species'); // === Abstract Operations ===\n\nfunction getMethod(obj, key) {\n var value = obj[key];\n if (value == null) return undefined;\n if (typeof value !== 'function') throw new TypeError(value + ' is not a function');\n return value;\n}\n\nfunction getSpecies(obj) {\n var ctor = obj.constructor;\n\n if (ctor !== undefined) {\n ctor = ctor[SymbolSpecies];\n\n if (ctor === null) {\n ctor = undefined;\n }\n }\n\n return ctor !== undefined ? ctor : Observable;\n}\n\nfunction isObservable(x) {\n return x instanceof Observable; // SPEC: Brand check\n}\n\nfunction hostReportError(e) {\n if (hostReportError.log) {\n hostReportError.log(e);\n } else {\n setTimeout(function () {\n throw e;\n });\n }\n}\n\nfunction enqueue(fn) {\n Promise.resolve().then(function () {\n try {\n fn();\n } catch (e) {\n hostReportError(e);\n }\n });\n}\n\nfunction cleanupSubscription(subscription) {\n var cleanup = subscription._cleanup;\n if (cleanup === undefined) return;\n subscription._cleanup = undefined;\n\n if (!cleanup) {\n return;\n }\n\n try {\n if (typeof cleanup === 'function') {\n cleanup();\n } else {\n var unsubscribe = getMethod(cleanup, 'unsubscribe');\n\n if (unsubscribe) {\n unsubscribe.call(cleanup);\n }\n }\n } catch (e) {\n hostReportError(e);\n }\n}\n\nfunction closeSubscription(subscription) {\n subscription._observer = undefined;\n subscription._queue = undefined;\n subscription._state = 'closed';\n}\n\nfunction flushSubscription(subscription) {\n var queue = subscription._queue;\n\n if (!queue) {\n return;\n }\n\n subscription._queue = undefined;\n subscription._state = 'ready';\n\n for (var i = 0; i < queue.length; ++i) {\n notifySubscription(subscription, queue[i].type, queue[i].value);\n if (subscription._state === 'closed') break;\n }\n}\n\nfunction notifySubscription(subscription, type, value) {\n subscription._state = 'running';\n var observer = subscription._observer;\n\n try {\n var m = getMethod(observer, type);\n\n switch (type) {\n case 'next':\n if (m) m.call(observer, value);\n break;\n\n case 'error':\n closeSubscription(subscription);\n if (m) m.call(observer, value);else throw value;\n break;\n\n case 'complete':\n closeSubscription(subscription);\n if (m) m.call(observer);\n break;\n }\n } catch (e) {\n hostReportError(e);\n }\n\n if (subscription._state === 'closed') cleanupSubscription(subscription);else if (subscription._state === 'running') subscription._state = 'ready';\n}\n\nfunction onNotify(subscription, type, value) {\n if (subscription._state === 'closed') return;\n\n if (subscription._state === 'buffering') {\n subscription._queue.push({\n type: type,\n value: value\n });\n\n return;\n }\n\n if (subscription._state !== 'ready') {\n subscription._state = 'buffering';\n subscription._queue = [{\n type: type,\n value: value\n }];\n enqueue(function () {\n return flushSubscription(subscription);\n });\n return;\n }\n\n notifySubscription(subscription, type, value);\n}\n\nvar Subscription = /*#__PURE__*/function () {\n function Subscription(observer, subscriber) {\n // ASSERT: observer is an object\n // ASSERT: subscriber is callable\n this._cleanup = undefined;\n this._observer = observer;\n this._queue = undefined;\n this._state = 'initializing';\n var subscriptionObserver = new SubscriptionObserver(this);\n\n try {\n this._cleanup = subscriber.call(undefined, subscriptionObserver);\n } catch (e) {\n subscriptionObserver.error(e);\n }\n\n if (this._state === 'initializing') this._state = 'ready';\n }\n\n var _proto = Subscription.prototype;\n\n _proto.unsubscribe = function unsubscribe() {\n if (this._state !== 'closed') {\n closeSubscription(this);\n cleanupSubscription(this);\n }\n };\n\n _createClass(Subscription, [{\n key: \"closed\",\n get: function () {\n return this._state === 'closed';\n }\n }]);\n\n return Subscription;\n}();\n\nvar SubscriptionObserver = /*#__PURE__*/function () {\n function SubscriptionObserver(subscription) {\n this._subscription = subscription;\n }\n\n var _proto2 = SubscriptionObserver.prototype;\n\n _proto2.next = function next(value) {\n onNotify(this._subscription, 'next', value);\n };\n\n _proto2.error = function error(value) {\n onNotify(this._subscription, 'error', value);\n };\n\n _proto2.complete = function complete() {\n onNotify(this._subscription, 'complete');\n };\n\n _createClass(SubscriptionObserver, [{\n key: \"closed\",\n get: function () {\n return this._subscription._state === 'closed';\n }\n }]);\n\n return SubscriptionObserver;\n}();\n\nvar Observable = /*#__PURE__*/function () {\n function Observable(subscriber) {\n if (!(this instanceof Observable)) throw new TypeError('Observable cannot be called as a function');\n if (typeof subscriber !== 'function') throw new TypeError('Observable initializer must be a function');\n this._subscriber = subscriber;\n }\n\n var _proto3 = Observable.prototype;\n\n _proto3.subscribe = function subscribe(observer) {\n if (typeof observer !== 'object' || observer === null) {\n observer = {\n next: observer,\n error: arguments[1],\n complete: arguments[2]\n };\n }\n\n return new Subscription(observer, this._subscriber);\n };\n\n _proto3.forEach = function forEach(fn) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (typeof fn !== 'function') {\n reject(new TypeError(fn + ' is not a function'));\n return;\n }\n\n function done() {\n subscription.unsubscribe();\n resolve();\n }\n\n var subscription = _this.subscribe({\n next: function (value) {\n try {\n fn(value, done);\n } catch (e) {\n reject(e);\n subscription.unsubscribe();\n }\n },\n error: reject,\n complete: resolve\n });\n });\n };\n\n _proto3.map = function map(fn) {\n var _this2 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n return new C(function (observer) {\n return _this2.subscribe({\n next: function (value) {\n try {\n value = fn(value);\n } catch (e) {\n return observer.error(e);\n }\n\n observer.next(value);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n observer.complete();\n }\n });\n });\n };\n\n _proto3.filter = function filter(fn) {\n var _this3 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n return new C(function (observer) {\n return _this3.subscribe({\n next: function (value) {\n try {\n if (!fn(value)) return;\n } catch (e) {\n return observer.error(e);\n }\n\n observer.next(value);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n observer.complete();\n }\n });\n });\n };\n\n _proto3.reduce = function reduce(fn) {\n var _this4 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n var hasSeed = arguments.length > 1;\n var hasValue = false;\n var seed = arguments[1];\n var acc = seed;\n return new C(function (observer) {\n return _this4.subscribe({\n next: function (value) {\n var first = !hasValue;\n hasValue = true;\n\n if (!first || hasSeed) {\n try {\n acc = fn(acc, value);\n } catch (e) {\n return observer.error(e);\n }\n } else {\n acc = value;\n }\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n if (!hasValue && !hasSeed) return observer.error(new TypeError('Cannot reduce an empty sequence'));\n observer.next(acc);\n observer.complete();\n }\n });\n });\n };\n\n _proto3.concat = function concat() {\n var _this5 = this;\n\n for (var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++) {\n sources[_key] = arguments[_key];\n }\n\n var C = getSpecies(this);\n return new C(function (observer) {\n var subscription;\n var index = 0;\n\n function startNext(next) {\n subscription = next.subscribe({\n next: function (v) {\n observer.next(v);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n if (index === sources.length) {\n subscription = undefined;\n observer.complete();\n } else {\n startNext(C.from(sources[index++]));\n }\n }\n });\n }\n\n startNext(_this5);\n return function () {\n if (subscription) {\n subscription.unsubscribe();\n subscription = undefined;\n }\n };\n });\n };\n\n _proto3.flatMap = function flatMap(fn) {\n var _this6 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n return new C(function (observer) {\n var subscriptions = [];\n\n var outer = _this6.subscribe({\n next: function (value) {\n if (fn) {\n try {\n value = fn(value);\n } catch (e) {\n return observer.error(e);\n }\n }\n\n var inner = C.from(value).subscribe({\n next: function (value) {\n observer.next(value);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n var i = subscriptions.indexOf(inner);\n if (i >= 0) subscriptions.splice(i, 1);\n completeIfDone();\n }\n });\n subscriptions.push(inner);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n completeIfDone();\n }\n });\n\n function completeIfDone() {\n if (outer.closed && subscriptions.length === 0) observer.complete();\n }\n\n return function () {\n subscriptions.forEach(function (s) {\n return s.unsubscribe();\n });\n outer.unsubscribe();\n };\n });\n };\n\n _proto3[SymbolObservable] = function () {\n return this;\n };\n\n Observable.from = function from(x) {\n var C = typeof this === 'function' ? this : Observable;\n if (x == null) throw new TypeError(x + ' is not an object');\n var method = getMethod(x, SymbolObservable);\n\n if (method) {\n var observable = method.call(x);\n if (Object(observable) !== observable) throw new TypeError(observable + ' is not an object');\n if (isObservable(observable) && observable.constructor === C) return observable;\n return new C(function (observer) {\n return observable.subscribe(observer);\n });\n }\n\n if (hasSymbol('iterator')) {\n method = getMethod(x, SymbolIterator);\n\n if (method) {\n return new C(function (observer) {\n enqueue(function () {\n if (observer.closed) return;\n\n for (var _iterator = _createForOfIteratorHelperLoose(method.call(x)), _step; !(_step = _iterator()).done;) {\n var item = _step.value;\n observer.next(item);\n if (observer.closed) return;\n }\n\n observer.complete();\n });\n });\n }\n }\n\n if (Array.isArray(x)) {\n return new C(function (observer) {\n enqueue(function () {\n if (observer.closed) return;\n\n for (var i = 0; i < x.length; ++i) {\n observer.next(x[i]);\n if (observer.closed) return;\n }\n\n observer.complete();\n });\n });\n }\n\n throw new TypeError(x + ' is not observable');\n };\n\n Observable.of = function of() {\n for (var _len2 = arguments.length, items = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n items[_key2] = arguments[_key2];\n }\n\n var C = typeof this === 'function' ? this : Observable;\n return new C(function (observer) {\n enqueue(function () {\n if (observer.closed) return;\n\n for (var i = 0; i < items.length; ++i) {\n observer.next(items[i]);\n if (observer.closed) return;\n }\n\n observer.complete();\n });\n });\n };\n\n _createClass(Observable, null, [{\n key: SymbolSpecies,\n get: function () {\n return this;\n }\n }]);\n\n return Observable;\n}();\n\nif (hasSymbols()) {\n Object.defineProperty(Observable, Symbol('extensions'), {\n value: {\n symbol: SymbolObservable,\n hostReportError: hostReportError\n },\n configurable: true\n });\n}\n\nexport { Observable };\n","import { __values } from \"tslib\";\nexport { Observable } from 'zen-observable-ts';\nimport { Observable as ZenObservable } from 'zen-observable-ts';\n/**\n * asyncMap operator for Zen Observable\n *\n * Maps each value emitted by the source Observable using an async function,\n * emitting the resolved values in the same order they arrive.\n */\nfunction asyncMap(observable, fn) {\n return new ZenObservable(function (observer) {\n observable.subscribe({\n next: function (value) {\n fn(value)\n .then(function (result) {\n return observer.next(result);\n })\n .catch(function (error) { return observer.error(error); });\n },\n error: function (error) {\n observer.error(error);\n },\n complete: function () {\n observer.complete();\n },\n });\n });\n}\n/**\n * merge operator for Zen Observable\n *\n * Merges two observables into a single observable, emitting values from both sources in the order they arrive.\n * @param sourceA Observable to merge\n * @param sourceB Observable to merge\n * @returns Unsubscribable cleanup function\n */\nfunction merge(sourceA, sourceB) {\n return new ZenObservable(function (observer) {\n var closed = false;\n var subscriptions = new Set();\n var cleanup = function () {\n var e_1, _a;\n closed = true;\n try {\n for (var subscriptions_1 = __values(subscriptions), subscriptions_1_1 = subscriptions_1.next(); !subscriptions_1_1.done; subscriptions_1_1 = subscriptions_1.next()) {\n var sub = subscriptions_1_1.value;\n try {\n sub.unsubscribe();\n }\n catch (_b) {\n /* do nothing */\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (subscriptions_1_1 && !subscriptions_1_1.done && (_a = subscriptions_1.return)) _a.call(subscriptions_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n subscriptions.clear();\n };\n var subscribeTo = function (source) {\n var sub = source.subscribe({\n next: function (value) {\n if (!closed)\n observer.next(value);\n },\n error: function (err) {\n if (!closed) {\n closed = true;\n observer.error(err);\n cleanup();\n }\n },\n complete: function () {\n subscriptions.delete(sub);\n if (!closed && subscriptions.size === 0) {\n observer.complete();\n cleanup();\n closed = true;\n }\n },\n });\n subscriptions.add(sub);\n };\n subscribeTo(sourceA);\n subscribeTo(sourceB);\n return cleanup;\n });\n}\n// function share() {\nfunction multicast(source) {\n var observers = new Set();\n var subscription = null;\n function cleanup() {\n /* istanbul ignore next */\n subscription === null || subscription === void 0 ? void 0 : subscription.unsubscribe();\n subscription = null;\n observers.clear();\n }\n return new ZenObservable(function (observer) {\n observers.add(observer);\n if (subscription === null) {\n subscription = source.subscribe({\n next: function (value) {\n var e_2, _a;\n var _b;\n try {\n for (var observers_1 = __values(observers), observers_1_1 = observers_1.next(); !observers_1_1.done; observers_1_1 = observers_1.next()) {\n var obs = observers_1_1.value;\n /* istanbul ignore next */\n (_b = obs.next) === null || _b === void 0 ? void 0 : _b.call(obs, value);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (observers_1_1 && !observers_1_1.done && (_a = observers_1.return)) _a.call(observers_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n },\n error: function (err) {\n var e_3, _a;\n var _b;\n try {\n for (var observers_2 = __values(observers), observers_2_1 = observers_2.next(); !observers_2_1.done; observers_2_1 = observers_2.next()) {\n var obs = observers_2_1.value;\n /* istanbul ignore next */\n (_b = obs.error) === null || _b === void 0 ? void 0 : _b.call(obs, err);\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (observers_2_1 && !observers_2_1.done && (_a = observers_2.return)) _a.call(observers_2);\n }\n finally { if (e_3) throw e_3.error; }\n }\n cleanup();\n },\n complete: function () {\n var e_4, _a;\n var _b;\n try {\n for (var observers_3 = __values(observers), observers_3_1 = observers_3.next(); !observers_3_1.done; observers_3_1 = observers_3.next()) {\n var obs = observers_3_1.value;\n /* istanbul ignore next */\n (_b = obs.complete) === null || _b === void 0 ? void 0 : _b.call(obs);\n }\n }\n catch (e_4_1) { e_4 = { error: e_4_1 }; }\n finally {\n try {\n if (observers_3_1 && !observers_3_1.done && (_a = observers_3.return)) _a.call(observers_3);\n }\n finally { if (e_4) throw e_4.error; }\n }\n cleanup();\n },\n });\n }\n // Return unsubscribe function for this observer\n return function () {\n observers.delete(observer);\n // If no observers left, unsubscribe from the source\n if (observers.size === 0 && subscription) {\n subscription.unsubscribe();\n subscription = null;\n }\n };\n });\n}\nexport { asyncMap, multicast, merge };\n//# sourceMappingURL=observable.js.map","import {\n PageTrackingHistoryChanges,\n PageTrackingOptions,\n PageTrackingTrackOn,\n ElementInteractionsOptions,\n BrowserOptions,\n AutocaptureOptions,\n AttributionOptions,\n NetworkTrackingOptions,\n FrustrationInteractionsOptions,\n} from '@amplitude/analytics-core';\n\n/**\n * A subset of AutocaptureOptions that includes the autocapture features that\n * are made available to users by default (even if \"config.autocapture === undefined\")\n */\ntype AutocaptureOptionsDefaultAvailable = Pick<\n AutocaptureOptions,\n 'pageViews' | 'sessions' | 'fileDownloads' | 'formInteractions' | 'attribution' | 'pageUrlEnrichment'\n>;\n\n/**\n * Returns false if autocapture === false or if autocapture[event],\n * otherwise returns true (even if \"config.autocapture === undefined\")\n */\nconst isTrackingEnabled = (\n autocapture: AutocaptureOptionsDefaultAvailable | boolean | undefined,\n event: keyof AutocaptureOptionsDefaultAvailable,\n) => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (autocapture?.[event] === false) {\n return false;\n }\n\n return true;\n};\n\nexport const isAttributionTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'attribution');\n\nexport const isFileDownloadTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'fileDownloads');\n\nexport const isFormInteractionTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'formInteractions');\n\nexport const isPageViewTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'pageViews');\n\nexport const isSessionTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'sessions');\n\nexport const isPageUrlEnrichmentEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'pageUrlEnrichment');\n\n/**\n * Returns true if\n * 1. if autocapture.networkTracking === true\n * 2. if autocapture.networkTracking === object\n * otherwise returns false\n */\nexport const isNetworkTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (\n typeof autocapture === 'object' &&\n (autocapture.networkTracking === true || typeof autocapture.networkTracking === 'object')\n ) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if\n * 1. autocapture === true\n * 2. if autocapture.elementInteractions === true\n * 3. if autocapture.elementInteractions === object\n * otherwise returns false\n */\nexport const isElementInteractionsEnabled = (autocapture: AutocaptureOptions | boolean | undefined): boolean => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (\n typeof autocapture === 'object' &&\n (autocapture.elementInteractions === true || typeof autocapture.elementInteractions === 'object')\n ) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if\n * 1. autocapture === true\n * 2. if autocapture.webVitals === true\n * otherwise returns false\n */\nexport const isWebVitalsEnabled = (autocapture: AutocaptureOptions | boolean | undefined): boolean => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (typeof autocapture === 'object' && autocapture.webVitals === true) {\n return true;\n }\n\n return false;\n};\n\nexport const isFrustrationInteractionsEnabled = (autocapture: AutocaptureOptions | boolean | undefined): boolean => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (\n typeof autocapture === 'object' &&\n (autocapture.frustrationInteractions === true || typeof autocapture.frustrationInteractions === 'object')\n ) {\n return true;\n }\n\n return false;\n};\n\nexport const getElementInteractionsConfig = (config: BrowserOptions): ElementInteractionsOptions | undefined => {\n if (\n isElementInteractionsEnabled(config.autocapture) &&\n typeof config.autocapture === 'object' &&\n typeof config.autocapture.elementInteractions === 'object'\n ) {\n return config.autocapture.elementInteractions;\n }\n return undefined;\n};\n\nexport const getFrustrationInteractionsConfig = (\n config: BrowserOptions,\n): FrustrationInteractionsOptions | undefined => {\n if (\n isFrustrationInteractionsEnabled(config.autocapture) &&\n typeof config.autocapture === 'object' &&\n typeof config.autocapture.frustrationInteractions === 'object'\n ) {\n return config.autocapture.frustrationInteractions;\n }\n return undefined;\n};\n\nexport const getNetworkTrackingConfig = (config: BrowserOptions): NetworkTrackingOptions | undefined => {\n if (isNetworkTrackingEnabled(config.autocapture)) {\n let networkTrackingConfig;\n if (typeof config.autocapture === 'object' && typeof config.autocapture.networkTracking === 'object') {\n networkTrackingConfig = config.autocapture.networkTracking;\n } else if (config.networkTrackingOptions) {\n networkTrackingConfig = config.networkTrackingOptions;\n }\n return {\n ...networkTrackingConfig,\n captureRules: networkTrackingConfig?.captureRules?.map((rule) => {\n // if URLs and hosts are both set, URLs take precedence over hosts\n if (rule.urls?.length && rule.hosts?.length) {\n const hostsString = JSON.stringify(rule.hosts);\n const urlsString = JSON.stringify(rule.urls);\n /* istanbul ignore next */\n config.loggerProvider?.warn(\n `Found network capture rule with both urls='${urlsString}' and hosts='${hostsString}' set. ` +\n `Definition of urls takes precedence over hosts, so ignoring hosts.`,\n );\n return { ...rule, hosts: undefined };\n }\n return rule;\n }),\n };\n }\n return;\n};\n\nexport const getPageViewTrackingConfig = (config: BrowserOptions): PageTrackingOptions => {\n let trackOn: PageTrackingTrackOn | undefined = () => false;\n let trackHistoryChanges: PageTrackingHistoryChanges | undefined = undefined;\n let eventType: string | undefined;\n const pageCounter = config.pageCounter;\n\n const isDefaultPageViewTrackingEnabled = isPageViewTrackingEnabled(config.defaultTracking);\n if (isDefaultPageViewTrackingEnabled) {\n trackOn = undefined;\n eventType = undefined;\n\n if (\n config.defaultTracking &&\n typeof config.defaultTracking === 'object' &&\n config.defaultTracking.pageViews &&\n typeof config.defaultTracking.pageViews === 'object'\n ) {\n if ('trackOn' in config.defaultTracking.pageViews) {\n trackOn = config.defaultTracking.pageViews.trackOn;\n }\n\n if ('trackHistoryChanges' in config.defaultTracking.pageViews) {\n trackHistoryChanges = config.defaultTracking.pageViews.trackHistoryChanges;\n }\n\n if ('eventType' in config.defaultTracking.pageViews && config.defaultTracking.pageViews.eventType) {\n eventType = config.defaultTracking.pageViews.eventType;\n }\n }\n }\n\n return {\n trackOn,\n trackHistoryChanges,\n eventType,\n pageCounter,\n };\n};\n\nexport const getAttributionTrackingConfig = (config: BrowserOptions): AttributionOptions => {\n if (\n isAttributionTrackingEnabled(config.defaultTracking) &&\n config.defaultTracking &&\n typeof config.defaultTracking === 'object' &&\n config.defaultTracking.attribution &&\n typeof config.defaultTracking.attribution === 'object'\n ) {\n return {\n ...config.defaultTracking.attribution,\n };\n }\n\n return {};\n};\n","import { Result, AmplitudeReturn } from '@amplitude/analytics-core';\n\ninterface ProxyItem {\n name: string;\n args: any[];\n resolve?: (promise: Promise<Result>) => void;\n}\n\ntype QueueProxy = Array<ProxyItem>;\n\ninterface InstanceProxy {\n _q: QueueProxy;\n _iq: Record<string, InstanceProxy>;\n}\n\n/**\n * Applies the proxied functions on the proxied amplitude snippet to an instance of the real object.\n * @ignore\n */\nexport const runQueuedFunctions = (instance: object, queue: QueueProxy) => {\n convertProxyObjectToRealObject(instance, queue);\n};\n\n/**\n * Applies the proxied functions on the proxied object to an instance of the real object.\n * Used to convert proxied Identify and Revenue objects.\n */\nexport const convertProxyObjectToRealObject = <T>(instance: T, queue: QueueProxy): T => {\n for (let i = 0; i < queue.length; i++) {\n const { name, args, resolve } = queue[i];\n const fn = instance && instance[name as keyof T];\n if (typeof fn === 'function') {\n const result = fn.apply(instance, args) as AmplitudeReturn<Result>;\n if (typeof resolve === 'function') {\n resolve(result?.promise);\n }\n }\n }\n return instance;\n};\n\n/**\n * Check if the param is snippet proxy\n */\nexport const isInstanceProxy = (instance: unknown): instance is InstanceProxy => {\n const instanceProxy = instance as InstanceProxy;\n return instanceProxy && instanceProxy._q !== undefined;\n};\n","export const VERSION = '2.33.5';\n","export const LIBPREFIX = 'amplitude-ts-sdk-script';\n","import { UUID, getLanguage, Event, BeforePlugin, BrowserConfig } from '@amplitude/analytics-core';\nimport { VERSION } from '../version';\nimport { LIBPREFIX } from '../lib-prefix';\n\nconst BROWSER_PLATFORM = 'Web';\nconst IP_ADDRESS = '$remote';\nexport class Context implements BeforePlugin {\n name = '@amplitude/plugin-context-browser';\n type = 'before' as const;\n\n // this.config is defined in setup() which will always be called first\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n config: BrowserConfig;\n userAgent: string | undefined;\n library = `${LIBPREFIX}/${VERSION}`;\n\n constructor() {\n /* istanbul ignore else */\n if (typeof navigator !== 'undefined') {\n this.userAgent = navigator.userAgent;\n }\n }\n\n setup(config: BrowserConfig): Promise<undefined> {\n this.config = config;\n\n return Promise.resolve(undefined);\n }\n\n async execute(context: Event): Promise<Event> {\n const time = new Date().getTime();\n const lastEventId = this.config.lastEventId ?? -1;\n const nextEventId = context.event_id ?? lastEventId + 1;\n this.config.lastEventId = nextEventId;\n if (!context.time) {\n this.config.lastEventTime = time;\n }\n\n const event: Event = {\n user_id: this.config.userId,\n device_id: this.config.deviceId,\n session_id: this.config.sessionId,\n time,\n ...(this.config.appVersion && { app_version: this.config.appVersion }),\n ...(this.config.trackingOptions.platform && { platform: BROWSER_PLATFORM }),\n ...(this.config.trackingOptions.language && { language: getLanguage() }),\n ...(this.config.trackingOptions.ipAddress && { ip: IP_ADDRESS }),\n insert_id: UUID(),\n partner_id: this.config.partnerId,\n plan: this.config.plan,\n ...(this.config.ingestionMetadata && {\n ingestion_metadata: {\n source_name: this.config.ingestionMetadata.sourceName,\n source_version: this.config.ingestionMetadata.sourceVersion,\n },\n }),\n ...context,\n event_id: nextEventId,\n library: this.library,\n user_agent: this.userAgent,\n };\n return event;\n }\n}\n","import { getGlobalScope, ILogger, BrowserStorage } from '@amplitude/analytics-core';\n\nconst MAX_ARRAY_LENGTH = 1000;\n\ninterface LocalStorageOptions {\n loggerProvider?: ILogger;\n}\nexport class LocalStorage<T> extends BrowserStorage<T> {\n loggerProvider?: ILogger;\n\n constructor(config?: LocalStorageOptions) {\n let localStorage;\n\n try {\n localStorage = getGlobalScope()?.localStorage;\n } catch (e) {\n config?.loggerProvider?.debug(`Failed to access localStorage. error=${JSON.stringify(e)}`);\n localStorage = undefined;\n }\n super(localStorage);\n this.loggerProvider = config?.loggerProvider;\n }\n\n async set(key: string, value: T): Promise<void> {\n if (Array.isArray(value) && value.length > MAX_ARRAY_LENGTH) {\n const droppedEventsCount = value.length - MAX_ARRAY_LENGTH;\n await super.set(key, value.slice(0, MAX_ARRAY_LENGTH) as T);\n this.loggerProvider?.error(\n `Failed to save ${droppedEventsCount} events because the queue length exceeded ${MAX_ARRAY_LENGTH}.`,\n );\n } else {\n await super.set(key, value);\n }\n }\n}\n","import { getGlobalScope, BrowserStorage } from '@amplitude/analytics-core';\n\nexport class SessionStorage<T> extends BrowserStorage<T> {\n constructor() {\n super(getGlobalScope()?.sessionStorage);\n }\n}\n","import { BaseTransport, Payload, Response, Transport } from '@amplitude/analytics-core';\n\nexport class XHRTransport extends BaseTransport implements Transport {\n private state = {\n done: 4,\n };\n private customHeaders: Record<string, string>;\n\n constructor(customHeaders: Record<string, string> = {}) {\n super();\n this.customHeaders = customHeaders;\n }\n\n async send(serverUrl: string, payload: Payload): Promise<Response | null> {\n return new Promise((resolve, reject) => {\n /* istanbul ignore if */\n if (typeof XMLHttpRequest === 'undefined') {\n reject(new Error('XHRTransport is not supported.'));\n }\n\n const xhr = new XMLHttpRequest();\n xhr.open('POST', serverUrl, true);\n xhr.onreadystatechange = () => {\n if (xhr.readyState === this.state.done) {\n const responseText = xhr.responseText;\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n resolve(this.buildResponse(JSON.parse(responseText)));\n } catch {\n resolve(this.buildResponse({ code: xhr.status }));\n }\n }\n };\n // Merge headers: custom headers override defaults (consistent with FetchTransport)\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n ...this.customHeaders,\n };\n for (const [key, value] of Object.entries(headers)) {\n xhr.setRequestHeader(key, value);\n }\n xhr.send(JSON.stringify(payload));\n });\n }\n}\n","import { BaseTransport, getGlobalScope, Payload, Response, Transport } from '@amplitude/analytics-core';\n\nexport class SendBeaconTransport extends BaseTransport implements Transport {\n async send(serverUrl: string, payload: Payload): Promise<Response | null> {\n return new Promise((resolve, reject) => {\n const globalScope = getGlobalScope();\n /* istanbul ignore if */\n if (!globalScope?.navigator.sendBeacon) {\n throw new Error('SendBeaconTransport is not supported');\n }\n try {\n const data = JSON.stringify(payload);\n const success = globalScope.navigator.sendBeacon(serverUrl, JSON.stringify(payload));\n if (success) {\n return resolve(\n this.buildResponse({\n code: 200,\n events_ingested: payload.events.length,\n payload_size_bytes: data.length,\n server_upload_time: Date.now(),\n }),\n );\n }\n return resolve(this.buildResponse({ code: 500 }));\n } catch (e) {\n reject(e);\n }\n });\n }\n}\n","import { getOldCookieName, Storage, UserSession } from '@amplitude/analytics-core';\n\nexport const parseLegacyCookies = async (\n apiKey: string,\n cookieStorage: Storage<UserSession>,\n deleteLegacyCookies = true,\n): Promise<UserSession> => {\n const cookieName = getOldCookieName(apiKey);\n const cookies = await cookieStorage.getRaw(cookieName);\n if (!cookies) {\n return {\n optOut: false,\n };\n }\n if (deleteLegacyCookies) {\n await cookieStorage.remove(cookieName);\n }\n const [deviceId, userId, optOut, sessionId, lastEventTime, lastEventId] = cookies.split('.');\n return {\n deviceId,\n userId: decode(userId),\n sessionId: parseTime(sessionId),\n lastEventId: parseTime(lastEventId),\n lastEventTime: parseTime(lastEventTime),\n optOut: Boolean(optOut),\n };\n};\n\nexport const parseTime = (num: string) => {\n const integer = parseInt(num, 32);\n if (isNaN(integer)) {\n return undefined;\n }\n return integer;\n};\n\nexport const decode = (value?: string): string | undefined => {\n if (!atob || !escape || !value) {\n return undefined;\n }\n try {\n return decodeURIComponent(escape(atob(value)));\n } catch {\n return undefined;\n }\n};\n","import { IdentityStorageType, ServerZoneType } from '@amplitude/analytics-core';\n\nexport const DEFAULT_EVENT_PREFIX = '[Amplitude]';\n\nexport const DEFAULT_PAGE_VIEW_EVENT = `${DEFAULT_EVENT_PREFIX} Page Viewed`;\nexport const DEFAULT_FORM_START_EVENT = `${DEFAULT_EVENT_PREFIX} Form Started`;\nexport const DEFAULT_FORM_SUBMIT_EVENT = `${DEFAULT_EVENT_PREFIX} Form Submitted`;\nexport const DEFAULT_FILE_DOWNLOAD_EVENT = `${DEFAULT_EVENT_PREFIX} File Downloaded`;\nexport const DEFAULT_SESSION_START_EVENT = 'session_start';\nexport const DEFAULT_SESSION_END_EVENT = 'session_end';\n\nexport const FILE_EXTENSION = `${DEFAULT_EVENT_PREFIX} File Extension`;\nexport const FILE_NAME = `${DEFAULT_EVENT_PREFIX} File Name`;\nexport const LINK_ID = `${DEFAULT_EVENT_PREFIX} Link ID`;\nexport const LINK_TEXT = `${DEFAULT_EVENT_PREFIX} Link Text`;\nexport const LINK_URL = `${DEFAULT_EVENT_PREFIX} Link URL`;\n\nexport const FORM_ID = `${DEFAULT_EVENT_PREFIX} Form ID`;\nexport const FORM_NAME = `${DEFAULT_EVENT_PREFIX} Form Name`;\nexport const FORM_DESTINATION = `${DEFAULT_EVENT_PREFIX} Form Destination`;\n\nexport const DEFAULT_IDENTITY_STORAGE: IdentityStorageType = 'cookie';\nexport const DEFAULT_SERVER_ZONE: ServerZoneType = 'US';\n","import {\n Config,\n Logger,\n ILogger,\n LogLevel,\n Event,\n Storage,\n IngestionMetadata,\n ServerZoneType,\n OfflineDisabled,\n Plan,\n IdentityStorageType,\n TransportTypeOrOptions,\n MemoryStorage,\n UUID,\n CookieStorage,\n getCookieName,\n FetchTransport,\n getQueryParams,\n UserSession,\n BrowserOptions,\n BrowserConfig as IBrowserConfig,\n DefaultTrackingOptions,\n TrackingOptions,\n AutocaptureOptions,\n CookieOptions,\n RemoteConfigOptions,\n NetworkTrackingOptions,\n IIdentify,\n IDiagnosticsClient,\n isDomainEqual,\n CookieStorageConfig,\n decodeCookieValue,\n} from '@amplitude/analytics-core';\n\nimport { LocalStorage } from './storage/local-storage';\nimport { SessionStorage } from './storage/session-storage';\nimport { XHRTransport } from './transports/xhr';\nimport { SendBeaconTransport } from './transports/send-beacon';\nimport { parseLegacyCookies } from './cookie-migration';\nimport { DEFAULT_IDENTITY_STORAGE, DEFAULT_SERVER_ZONE } from './constants';\nimport { AmplitudeBrowser } from './browser-client';\nimport { VERSION } from './version';\n\n// Exported for testing purposes only. Do not expose to public interface.\nexport class BrowserConfig extends Config implements IBrowserConfig {\n public readonly version = VERSION;\n protected _cookieStorage: Storage<UserSession>;\n protected _deviceId?: string;\n protected _lastEventId?: number;\n protected _lastEventTime?: number;\n protected _optOut = false;\n protected _sessionId?: number;\n protected _userId?: string;\n protected _pageCounter?: number;\n protected _debugLogsEnabled?: boolean;\n constructor(\n public apiKey: string,\n public appVersion?: string,\n cookieStorage: Storage<UserSession> = new MemoryStorage(),\n public cookieOptions: CookieOptions = {\n domain: '',\n expiration: 365,\n sameSite: 'Lax' as const,\n secure: false,\n upgrade: true,\n },\n public defaultTracking?: boolean | DefaultTrackingOptions,\n public autocapture?: boolean | AutocaptureOptions,\n deviceId?: string,\n public flushIntervalMillis: number = 1000,\n public flushMaxRetries: number = 5,\n public flushQueueSize: number = 30,\n public identityStorage: IdentityStorageType = DEFAULT_IDENTITY_STORAGE,\n public ingestionMetadata?: IngestionMetadata,\n public instanceName?: string,\n lastEventId?: number,\n lastEventTime?: number,\n public loggerProvider: ILogger = new Logger(),\n public logLevel: LogLevel = LogLevel.Warn,\n public minIdLength?: number,\n public offline: boolean | typeof OfflineDisabled = false,\n optOut = false,\n public partnerId?: string,\n public plan?: Plan,\n public serverUrl: string = '',\n public serverZone: ServerZoneType = DEFAULT_SERVER_ZONE,\n sessionId?: number,\n public sessionTimeout: number = 30 * 60 * 1000,\n public storageProvider: Storage<Event[]> = new LocalStorage({ loggerProvider }),\n public trackingOptions: Required<TrackingOptions> = {\n ipAddress: true,\n language: true,\n platform: true,\n },\n public transport: TransportTypeOrOptions = 'fetch',\n public useBatch: boolean = false,\n public fetchRemoteConfig: boolean = true,\n userId?: string,\n pageCounter?: number,\n debugLogsEnabled?: boolean,\n public networkTrackingOptions?: NetworkTrackingOptions,\n public identify?: IIdentify,\n public enableDiagnostics: boolean = true,\n public diagnosticsSampleRate: number = 0,\n public diagnosticsClient?: IDiagnosticsClient,\n public remoteConfig?: RemoteConfigOptions,\n ) {\n super({ apiKey, storageProvider, transportProvider: createTransport(transport) });\n this._cookieStorage = cookieStorage;\n this.deviceId = deviceId;\n this.lastEventId = lastEventId;\n this.lastEventTime = lastEventTime;\n this.optOut = optOut;\n this.sessionId = sessionId;\n this.pageCounter = pageCounter;\n this.userId = userId;\n this.debugLogsEnabled = debugLogsEnabled;\n this.loggerProvider.enable(debugLogsEnabled ? LogLevel.Debug : this.logLevel);\n this.networkTrackingOptions = networkTrackingOptions;\n this.identify = identify;\n this.enableDiagnostics = enableDiagnostics;\n this.diagnosticsSampleRate = diagnosticsSampleRate;\n this.diagnosticsClient = diagnosticsClient;\n\n // Note: The canonical logic for determining fetchRemoteConfig is in shouldFetchRemoteConfig().\n // This logic is duplicated here to maintain the BrowserConfig constructor contract and ensure\n // the config object has the correct fetchRemoteConfig value set on its properties.\n // The value passed to this constructor should already be computed via shouldFetchRemoteConfig().\n const _fetchRemoteConfig = remoteConfig?.fetchRemoteConfig ?? fetchRemoteConfig;\n this.remoteConfig = this.remoteConfig || {};\n this.remoteConfig.fetchRemoteConfig = _fetchRemoteConfig;\n this.fetchRemoteConfig = _fetchRemoteConfig;\n }\n\n get cookieStorage() {\n return this._cookieStorage;\n }\n\n set cookieStorage(cookieStorage: Storage<UserSession>) {\n if (this._cookieStorage !== cookieStorage) {\n this._cookieStorage = cookieStorage;\n this.updateStorage();\n }\n }\n\n get deviceId() {\n return this._deviceId;\n }\n\n set deviceId(deviceId: string | undefined) {\n if (this._deviceId !== deviceId) {\n this._deviceId = deviceId;\n this.updateStorage();\n }\n }\n\n get userId() {\n return this._userId;\n }\n\n set userId(userId: string | undefined) {\n if (this._userId !== userId) {\n this._userId = userId;\n this.updateStorage();\n }\n }\n\n get sessionId() {\n return this._sessionId;\n }\n\n set sessionId(sessionId: number | undefined) {\n if (this._sessionId !== sessionId) {\n this._sessionId = sessionId;\n this.updateStorage();\n }\n }\n\n get optOut() {\n return this._optOut;\n }\n\n set optOut(optOut: boolean) {\n if (this._optOut !== optOut) {\n this._optOut = optOut;\n this.updateStorage();\n }\n }\n\n get lastEventTime() {\n return this._lastEventTime;\n }\n\n set lastEventTime(lastEventTime: number | undefined) {\n if (this._lastEventTime !== lastEventTime) {\n this._lastEventTime = lastEventTime;\n this.updateStorage();\n }\n }\n\n get lastEventId() {\n return this._lastEventId;\n }\n\n set lastEventId(lastEventId: number | undefined) {\n if (this._lastEventId !== lastEventId) {\n this._lastEventId = lastEventId;\n this.updateStorage();\n }\n }\n\n get pageCounter() {\n return this._pageCounter;\n }\n\n set pageCounter(pageCounter: number | undefined) {\n if (this._pageCounter !== pageCounter) {\n this._pageCounter = pageCounter;\n this.updateStorage();\n }\n }\n\n set debugLogsEnabled(debugLogsEnabled: boolean | undefined) {\n if (this._debugLogsEnabled !== debugLogsEnabled) {\n this._debugLogsEnabled = debugLogsEnabled;\n this.updateStorage();\n }\n }\n\n private updateStorage() {\n const cache = {\n deviceId: this._deviceId,\n userId: this._userId,\n sessionId: this._sessionId,\n optOut: this._optOut,\n lastEventTime: this._lastEventTime,\n lastEventId: this._lastEventId,\n pageCounter: this._pageCounter,\n debugLogsEnabled: this._debugLogsEnabled,\n cookieDomain: undefined as string | undefined,\n };\n\n if (this.cookieStorage instanceof CookieStorage) {\n cache.cookieDomain = this.cookieStorage.options.domain;\n }\n\n void this.cookieStorage.set(getCookieName(this.apiKey), cache);\n }\n}\n\n/**\n * Early-initialized configuration values that are determined before useBrowserConfig is called.\n * These are created early to support DiagnosticsClient and RemoteConfigClient initialization.\n */\nexport interface EarlyConfig {\n /** Logger instance - shared across DiagnosticsClient, RemoteConfigClient, and BrowserConfig */\n loggerProvider: ILogger;\n /** Server zone for API endpoints */\n serverZone: ServerZoneType;\n /** Whether diagnostics is enabled (may come from remote config) */\n enableDiagnostics: boolean;\n /** Diagnostics sample rate (may come from remote config) */\n diagnosticsSampleRate: number;\n}\n\nexport const useBrowserConfig = async (\n apiKey: string,\n options: BrowserOptions = {},\n amplitudeInstance: AmplitudeBrowser,\n diagnosticsClient?: IDiagnosticsClient,\n earlyConfig?: EarlyConfig,\n): Promise<IBrowserConfig> => {\n // Step 1: Create identity storage instance\n const identityStorage = options.identityStorage || DEFAULT_IDENTITY_STORAGE;\n const cookieOptions = {\n domain:\n identityStorage !== DEFAULT_IDENTITY_STORAGE ? '' : options.cookieOptions?.domain ?? (await getTopLevelDomain()),\n expiration: 365,\n sameSite: 'Lax' as const,\n secure: false,\n upgrade: true,\n ...options.cookieOptions,\n };\n\n const cookieConfig: CookieStorageConfig = {\n // if more than one cookie with the same key exists,\n // look for the cookie that has the domain attribute set to cookieOptions.domain\n duplicateResolverFn: (value: string): boolean => {\n const decodedValue = decodeCookieValue(value);\n if (!decodedValue) {\n return false;\n }\n const parsed = JSON.parse(decodedValue) as UserSession;\n return isDomainEqual(parsed.cookieDomain, cookieOptions.domain);\n },\n diagnosticsClient: diagnosticsClient,\n };\n const cookieStorage = createCookieStorage<UserSession>(options.identityStorage, cookieOptions, cookieConfig);\n\n // Step 1: Parse cookies using identity storage instance\n const legacyCookies = await parseLegacyCookies(apiKey, cookieStorage, options.cookieOptions?.upgrade ?? true);\n const previousCookies = await cookieStorage.get(getCookieName(apiKey));\n const queryParams = getQueryParams();\n\n // Check if ampTimestamp is present and valid\n const ampTimestamp = queryParams.ampTimestamp ? Number(queryParams.ampTimestamp) : undefined;\n const isWithinTimeLimit = ampTimestamp ? Date.now() < ampTimestamp : true;\n\n // Step 3: Reconcile user identity\n const deviceId =\n options.deviceId ??\n (isWithinTimeLimit ? queryParams.ampDeviceId ?? queryParams.deviceId : undefined) ??\n previousCookies?.deviceId ??\n legacyCookies.deviceId ??\n UUID();\n const lastEventId = previousCookies?.lastEventId ?? legacyCookies.lastEventId;\n const lastEventTime = previousCookies?.lastEventTime ?? legacyCookies.lastEventTime;\n const optOut = options.optOut ?? previousCookies?.optOut ?? legacyCookies.optOut;\n const sessionId = previousCookies?.sessionId ?? legacyCookies.sessionId;\n const userId = options.userId ?? previousCookies?.userId ?? legacyCookies.userId;\n amplitudeInstance.previousSessionDeviceId = previousCookies?.deviceId ?? legacyCookies.deviceId;\n amplitudeInstance.previousSessionUserId = previousCookies?.userId ?? legacyCookies.userId;\n\n const trackingOptions = {\n ipAddress: options.trackingOptions?.ipAddress ?? true,\n language: options.trackingOptions?.language ?? true,\n platform: options.trackingOptions?.platform ?? true,\n };\n const pageCounter = previousCookies?.pageCounter;\n const debugLogsEnabled = previousCookies?.debugLogsEnabled;\n\n // Override default tracking options if autocapture is set\n if (options.autocapture !== undefined) {\n options.defaultTracking = options.autocapture;\n }\n\n const browserConfig = new BrowserConfig(\n apiKey,\n options.appVersion,\n cookieStorage,\n cookieOptions,\n options.defaultTracking,\n options.autocapture,\n deviceId,\n options.flushIntervalMillis,\n options.flushMaxRetries,\n options.flushQueueSize,\n identityStorage,\n options.ingestionMetadata,\n options.instanceName,\n lastEventId,\n lastEventTime,\n // Use earlyConfig.loggerProvider to ensure consistent logger across DiagnosticsClient/RemoteConfigClient/BrowserConfig\n earlyConfig?.loggerProvider ?? options.loggerProvider,\n options.logLevel,\n options.minIdLength,\n options.offline,\n optOut,\n options.partnerId,\n options.plan,\n options.serverUrl,\n // Use earlyConfig.serverZone to ensure consistent serverZone\n earlyConfig?.serverZone ?? options.serverZone,\n sessionId,\n options.sessionTimeout,\n options.storageProvider,\n trackingOptions,\n options.transport,\n options.useBatch,\n options.fetchRemoteConfig,\n userId,\n pageCounter,\n debugLogsEnabled,\n options.networkTrackingOptions,\n options.identify,\n // Use earlyConfig values (already has remote config applied), otherwise fall back to options\n earlyConfig?.enableDiagnostics ?? options.enableDiagnostics,\n earlyConfig?.diagnosticsSampleRate ?? amplitudeInstance._diagnosticsSampleRate,\n diagnosticsClient,\n options.remoteConfig,\n );\n\n if (!(await browserConfig.storageProvider.isEnabled())) {\n browserConfig.loggerProvider.warn(\n `Storage provider ${browserConfig.storageProvider.constructor.name} is not enabled. Falling back to MemoryStorage.`,\n );\n browserConfig.storageProvider = new MemoryStorage();\n }\n\n return browserConfig;\n};\n\nexport const createCookieStorage = <T>(\n identityStorage: IdentityStorageType = DEFAULT_IDENTITY_STORAGE,\n cookieOptions: CookieOptions = {},\n cookieConfig?: CookieStorageConfig,\n) => {\n switch (identityStorage) {\n case 'localStorage':\n return new LocalStorage<T>();\n case 'sessionStorage':\n return new SessionStorage<T>();\n case 'none':\n return new MemoryStorage<T>();\n case 'cookie':\n default:\n return new CookieStorage<T>(\n {\n ...cookieOptions,\n expirationDays: cookieOptions.expiration,\n },\n cookieConfig,\n );\n }\n};\n\n/**\n * Determines whether to fetch remote config based on options.\n * Extracted to allow early determination before useBrowserConfig is called.\n */\nexport const shouldFetchRemoteConfig = (options: BrowserOptions = {}): boolean => {\n if (options.remoteConfig?.fetchRemoteConfig === true) {\n // set to true if remoteConfig explicitly set to true\n return true;\n } else if (options.remoteConfig?.fetchRemoteConfig === false || options.fetchRemoteConfig === false) {\n // set to false if either are set to false explicitly\n return false;\n } else {\n // default to true if both undefined\n return true;\n }\n};\n\nexport const createTransport = (transport?: TransportTypeOrOptions) => {\n const type = typeof transport === 'object' ? transport.type : transport;\n const headers = typeof transport === 'object' ? transport.headers : undefined;\n\n if (type === 'xhr') {\n return new XHRTransport(headers);\n }\n if (type === 'beacon') {\n // SendBeacon does not support custom headers\n return new SendBeaconTransport();\n }\n return new FetchTransport(headers);\n};\n\nexport const getTopLevelDomain = async (url?: string) => {\n if (\n !(await new CookieStorage<number>().isEnabled()) ||\n (!url && (typeof location === 'undefined' || !location.hostname))\n ) {\n return '';\n }\n\n const host = url ?? location.hostname;\n const parts = host.split('.');\n const levels = [];\n const cookieKeyUniqueId = UUID();\n const storageKey = `AMP_TLDTEST_${cookieKeyUniqueId.substring(0, 8)}`;\n\n for (let i = parts.length - 2; i >= 0; --i) {\n levels.push(parts.slice(i).join('.'));\n }\n for (let i = 0; i < levels.length; i++) {\n const domain = levels[i];\n const options = {\n domain: '.' + domain,\n expirationDays: 0.003, // expire in ~5 minutes\n };\n const storage = new CookieStorage<number>(options);\n await storage.set(storageKey, 1);\n const value = await storage.get(storageKey);\n if (value) {\n await storage.remove(storageKey);\n return '.' + domain;\n }\n }\n\n return '';\n};\n","export var omitUndefined = function (input) {\n var obj = {};\n for (var key in input) {\n var val = input[key];\n if (val) {\n obj[key] = val;\n }\n }\n return obj;\n};\n//# sourceMappingURL=utils.js.map","import { __assign, __awaiter, __generator, __read, __spreadArray } from \"tslib\";\nimport { getPageTitle, replaceSensitiveString, IdentifyOperation, CampaignParser, getGlobalScope, BASE_CAMPAIGN, } from '@amplitude/analytics-core';\nimport { omitUndefined } from './utils';\nexport var defaultPageViewEvent = '[Amplitude] Page Viewed';\nexport var pageViewTrackingPlugin = function (options) {\n if (options === void 0) { options = {}; }\n var amplitude;\n var globalScope = getGlobalScope();\n var loggerProvider = undefined;\n var isTracking = false;\n var localConfig;\n var trackOn = options.trackOn, trackHistoryChanges = options.trackHistoryChanges, _a = options.eventType, eventType = _a === void 0 ? defaultPageViewEvent : _a;\n var getDecodeURI = function (locationStr) {\n var decodedLocationStr = locationStr;\n try {\n decodedLocationStr = decodeURI(locationStr);\n }\n catch (e) {\n /* istanbul ignore next */\n loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.error('Malformed URI sequence: ', e);\n }\n return decodedLocationStr;\n };\n var createPageViewEvent = function () { return __awaiter(void 0, void 0, void 0, function () {\n var locationHREF, _a;\n var _b;\n return __generator(this, function (_c) {\n switch (_c.label) {\n case 0:\n locationHREF = getDecodeURI((typeof location !== 'undefined' && location.href) || '');\n _b = {\n event_type: eventType\n };\n _a = [{}];\n return [4 /*yield*/, getCampaignParams()];\n case 1: return [2 /*return*/, (_b.event_properties = __assign.apply(void 0, [__assign.apply(void 0, _a.concat([(_c.sent())])), { '[Amplitude] Page Domain': \n /* istanbul ignore next */ (typeof location !== 'undefined' && location.hostname) || '', '[Amplitude] Page Location': locationHREF, '[Amplitude] Page Path': \n /* istanbul ignore next */ (typeof location !== 'undefined' && getDecodeURI(location.pathname)) || '', '[Amplitude] Page Title': /* istanbul ignore next */ getPageTitle(replaceSensitiveString), '[Amplitude] Page URL': locationHREF.split('?')[0] }]),\n _b)];\n }\n });\n }); };\n var shouldTrackOnPageLoad = function () { return typeof trackOn === 'undefined' || (typeof trackOn === 'function' && trackOn()); };\n /* istanbul ignore next */\n var previousURL = typeof location !== 'undefined' ? location.href : null;\n var trackHistoryPageView = function () { return __awaiter(void 0, void 0, void 0, function () {\n var newURL, shouldTrackPageView, _a, _b, _c;\n return __generator(this, function (_d) {\n switch (_d.label) {\n case 0:\n newURL = location.href;\n shouldTrackPageView = shouldTrackHistoryPageView(trackHistoryChanges, newURL, previousURL || '') && shouldTrackOnPageLoad();\n // Note: Update `previousURL` in the same clock tick as `shouldTrackHistoryPageView()`\n // This was previously done after `amplitude?.track(await createPageViewEvent());` and\n // causes a concurrency issue where app triggers `pushState` twice with the same URL target\n // but `previousURL` is only updated after the second `pushState` producing two page viewed events\n previousURL = newURL;\n if (!shouldTrackPageView) return [3 /*break*/, 4];\n /* istanbul ignore next */\n loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.log('Tracking page view event');\n if (!(amplitude === null || amplitude === void 0)) return [3 /*break*/, 1];\n _a = void 0;\n return [3 /*break*/, 3];\n case 1:\n _c = (_b = amplitude).track;\n return [4 /*yield*/, createPageViewEvent()];\n case 2:\n _a = _c.apply(_b, [_d.sent()]);\n _d.label = 3;\n case 3:\n _a;\n _d.label = 4;\n case 4: return [2 /*return*/];\n }\n });\n }); };\n /* istanbul ignore next */\n var trackHistoryPageViewWrapper = function () {\n void trackHistoryPageView();\n };\n var plugin = {\n name: '@amplitude/plugin-page-view-tracking-browser',\n type: 'enrichment',\n setup: function (config, client) { return __awaiter(void 0, void 0, void 0, function () {\n var _a, _b;\n return __generator(this, function (_c) {\n switch (_c.label) {\n case 0:\n amplitude = client;\n localConfig = config;\n loggerProvider = config.loggerProvider;\n loggerProvider.log('Installing @amplitude/plugin-page-view-tracking-browser');\n isTracking = true;\n if (globalScope) {\n globalScope.addEventListener('popstate', trackHistoryPageViewWrapper);\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 globalScope.history.pushState = new Proxy(globalScope.history.pushState, {\n apply: function (target, thisArg, _a) {\n var _b = __read(_a, 3), state = _b[0], unused = _b[1], url = _b[2];\n target.apply(thisArg, [state, unused, url]);\n if (isTracking) {\n void trackHistoryPageView();\n }\n },\n });\n }\n if (!shouldTrackOnPageLoad()) return [3 /*break*/, 2];\n loggerProvider.log('Tracking page view event');\n _b = (_a = amplitude).track;\n return [4 /*yield*/, createPageViewEvent()];\n case 1:\n _b.apply(_a, [_c.sent()]);\n _c.label = 2;\n case 2: return [2 /*return*/];\n }\n });\n }); },\n execute: function (event) { return __awaiter(void 0, void 0, void 0, function () {\n var pageViewEvent;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (!(trackOn === 'attribution' && isCampaignEvent(event))) return [3 /*break*/, 2];\n /* istanbul ignore next */ // loggerProvider should be defined by the time execute is invoked\n loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.log('Enriching campaign event to page view event with campaign parameters');\n return [4 /*yield*/, createPageViewEvent()];\n case 1:\n pageViewEvent = _a.sent();\n event.event_type = pageViewEvent.event_type;\n event.event_properties = __assign(__assign({}, event.event_properties), pageViewEvent.event_properties);\n _a.label = 2;\n case 2:\n // Update the pageCounter for the page view event\n if (localConfig && event.event_type === eventType) {\n localConfig.pageCounter = !localConfig.pageCounter ? 1 : localConfig.pageCounter + 1;\n event.event_properties = __assign(__assign({}, event.event_properties), { '[Amplitude] Page Counter': localConfig.pageCounter });\n }\n return [2 /*return*/, event];\n }\n });\n }); },\n teardown: function () { return __awaiter(void 0, void 0, void 0, function () {\n return __generator(this, function (_a) {\n if (globalScope) {\n globalScope.removeEventListener('popstate', trackHistoryPageViewWrapper);\n isTracking = false;\n }\n return [2 /*return*/];\n });\n }); },\n };\n return plugin;\n};\nvar getCampaignParams = function () { return __awaiter(void 0, void 0, void 0, function () { var _a; return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _a = omitUndefined;\n return [4 /*yield*/, new CampaignParser().parse()];\n case 1: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];\n }\n}); }); };\nvar isCampaignEvent = function (event) {\n if (event.event_type === '$identify' && event.user_properties) {\n var properties = event.user_properties;\n var $set = properties[IdentifyOperation.SET] || {};\n var $unset = properties[IdentifyOperation.UNSET] || {};\n var userProperties_1 = __spreadArray(__spreadArray([], __read(Object.keys($set)), false), __read(Object.keys($unset)), false);\n return Object.keys(BASE_CAMPAIGN).every(function (value) { return userProperties_1.includes(value); });\n }\n return false;\n};\nexport var shouldTrackHistoryPageView = function (trackingOption, newURLStr, oldURLStr) {\n switch (trackingOption) {\n case 'pathOnly': {\n if (oldURLStr == '')\n return true;\n var newURL = new URL(newURLStr);\n var oldURL = new URL(oldURLStr);\n var newBaseStr = newURL.origin + newURL.pathname;\n var oldBaseStr = oldURL.origin + oldURL.pathname;\n return newBaseStr !== oldBaseStr;\n }\n default:\n return newURLStr !== oldURLStr;\n }\n};\n//# sourceMappingURL=page-view-tracking.js.map","import {\n DEFAULT_FORM_START_EVENT,\n DEFAULT_FORM_SUBMIT_EVENT,\n FORM_ID,\n FORM_NAME,\n FORM_DESTINATION,\n} from '../constants';\nimport { BrowserConfig } from '../config';\nimport { getGlobalScope, Event, EnrichmentPlugin, BrowserClient } from '@amplitude/analytics-core';\n\ninterface EventListener {\n element: Element;\n type: 'change' | 'submit';\n handler: () => void;\n}\n\nexport const formInteractionTracking = (): EnrichmentPlugin => {\n let observer: MutationObserver | undefined;\n let eventListeners: EventListener[] = [];\n\n const addEventListener = (element: Element, type: 'change' | 'submit', handler: () => void) => {\n element.addEventListener(type, handler);\n eventListeners.push({\n element,\n type,\n handler,\n });\n };\n\n const removeClickListeners = () => {\n eventListeners.forEach(({ element, type, handler }) => {\n /* istanbul ignore next */\n element?.removeEventListener(type, handler);\n });\n eventListeners = [];\n };\n\n const name = '@amplitude/plugin-form-interaction-tracking-browser';\n const type = 'enrichment';\n const setup = async (config: BrowserConfig, amplitude: BrowserClient) => {\n const initializeFormTracking = () => {\n /* istanbul ignore if */\n if (!amplitude) {\n // TODO: Add required minimum version of @amplitude/analytics-browser\n config.loggerProvider.warn(\n 'Form interaction tracking requires a later version of @amplitude/analytics-browser. Form interaction events are not tracked.',\n );\n return;\n }\n\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n const addFormInteractionListener = (form: HTMLFormElement) => {\n let hasFormChanged = false;\n\n addEventListener(form, 'change', () => {\n const formDestination = extractFormAction(form);\n if (!hasFormChanged) {\n amplitude.track(DEFAULT_FORM_START_EVENT, {\n [FORM_ID]: stringOrUndefined(form.id),\n [FORM_NAME]: stringOrUndefined(form.name),\n [FORM_DESTINATION]: formDestination,\n });\n }\n hasFormChanged = true;\n });\n\n addEventListener(form, 'submit', () => {\n const formDestination = extractFormAction(form);\n if (!hasFormChanged) {\n amplitude.track(DEFAULT_FORM_START_EVENT, {\n [FORM_ID]: stringOrUndefined(form.id),\n [FORM_NAME]: stringOrUndefined(form.name),\n [FORM_DESTINATION]: formDestination,\n });\n }\n\n amplitude.track(DEFAULT_FORM_SUBMIT_EVENT, {\n [FORM_ID]: stringOrUndefined(form.id),\n [FORM_NAME]: stringOrUndefined(form.name),\n [FORM_DESTINATION]: formDestination,\n });\n hasFormChanged = false;\n });\n };\n\n // Adds listener to existing anchor tags\n const forms = Array.from(document.getElementsByTagName('form'));\n forms.forEach(addFormInteractionListener);\n\n // Adds listener to anchor tags added after initial load\n /* istanbul ignore else */\n if (typeof MutationObserver !== 'undefined') {\n observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeName === 'FORM') {\n addFormInteractionListener(node as HTMLFormElement);\n }\n if ('querySelectorAll' in node && typeof node.querySelectorAll === 'function') {\n Array.from(node.querySelectorAll('form') as HTMLFormElement[]).map(addFormInteractionListener);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n subtree: true,\n childList: true,\n });\n }\n };\n\n // If the document is already loaded, initialize immediately.\n if (document.readyState === 'complete') {\n initializeFormTracking();\n } else {\n // Otherwise, wait for the load event.\n // The form interaction plugin observes changes in the dom. For this to work correctly, the observer can only be setup\n // after the body is built. When Amplitude gets initialized in a script tag, the body tag is still unavailable. So register this\n // only after the window is loaded\n const window = getGlobalScope();\n /* istanbul ignore else*/\n if (window) {\n window.addEventListener('load', initializeFormTracking);\n } else {\n config.loggerProvider.debug('Form interaction tracking is not installed because global is undefined.');\n }\n }\n };\n const execute = async (event: Event) => event;\n const teardown = async () => {\n observer?.disconnect();\n removeClickListeners();\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n\nexport const stringOrUndefined = <T>(name: T): T extends string ? string : undefined => {\n /* istanbul ignore if */\n if (typeof name !== 'string') {\n // We found instances where the value of `name` is an Element and not a string.\n // Elements may have circular references and would throw an error when passed to `JSON.stringify(...)`.\n // If a non-string value is seen, assume there is no value.\n return undefined as T extends string ? string : undefined;\n }\n\n return name as T extends string ? string : undefined;\n};\n\n// Extracts the form action attribute, and normalizes it to a valid URL to preserve the previous behavior of accessing the action property directly.\nexport const extractFormAction = (form: HTMLFormElement): string | null => {\n let formDestination = form.getAttribute('action');\n try {\n // eslint-disable-next-line no-restricted-globals\n formDestination = new URL(encodeURI(formDestination ?? ''), window.location.href).href;\n } catch {\n //\n }\n return formDestination;\n};\n","import { DEFAULT_FILE_DOWNLOAD_EVENT, FILE_EXTENSION, FILE_NAME, LINK_ID, LINK_TEXT, LINK_URL } from '../constants';\nimport { BrowserConfig } from '../config';\nimport { getGlobalScope, Event, EnrichmentPlugin, BrowserClient } from '@amplitude/analytics-core';\n\ninterface EventListener {\n element: Element;\n type: 'click';\n handler: () => void;\n}\n\nexport const fileDownloadTracking = (): EnrichmentPlugin => {\n let observer: MutationObserver | undefined;\n let eventListeners: EventListener[] = [];\n const addEventListener = (element: Element, type: 'click', handler: () => void) => {\n element.addEventListener(type, handler);\n eventListeners.push({\n element,\n type,\n handler,\n });\n };\n const removeClickListeners = () => {\n eventListeners.forEach(({ element, type, handler }) => {\n /* istanbul ignore next */\n element?.removeEventListener(type, handler);\n });\n eventListeners = [];\n };\n\n const name = '@amplitude/plugin-file-download-tracking-browser';\n const type = 'enrichment';\n\n const setup = async (config: BrowserConfig, amplitude: BrowserClient) => {\n const initializeFileDownloadTracking = () => {\n /* istanbul ignore if */\n if (!amplitude) {\n // TODO: Add required minimum version of @amplitude/analytics-browser\n config.loggerProvider.warn(\n 'File download tracking requires a later version of @amplitude/analytics-browser. File download events are not tracked.',\n );\n return;\n }\n\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n const addFileDownloadListener = (a: HTMLAnchorElement) => {\n let url: URL;\n try {\n // eslint-disable-next-line no-restricted-globals\n url = new URL(a.href, window.location.href);\n } catch {\n /* istanbul ignore next */\n return;\n }\n const result = ext.exec(url.href);\n const fileExtension = result?.[1];\n\n if (fileExtension) {\n addEventListener(a, 'click', () => {\n if (fileExtension) {\n amplitude.track(DEFAULT_FILE_DOWNLOAD_EVENT, {\n [FILE_EXTENSION]: fileExtension,\n [FILE_NAME]: url.pathname,\n [LINK_ID]: a.id,\n [LINK_TEXT]: a.text,\n [LINK_URL]: a.href,\n });\n }\n });\n }\n };\n\n const ext =\n /\\.(pdf|xlsx?|docx?|txt|rtf|csv|exe|key|pp(s|t|tx)|7z|pkg|rar|gz|zip|avi|mov|mp4|mpe?g|wmv|midi?|mp3|wav|wma)(\\?.+)?$/;\n\n // Adds listener to existing anchor tags\n const links = Array.from(document.getElementsByTagName('a'));\n links.forEach(addFileDownloadListener);\n\n // Adds listener to anchor tags added after initial load\n /* istanbul ignore else */\n if (typeof MutationObserver !== 'undefined') {\n observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeName === 'A') {\n addFileDownloadListener(node as HTMLAnchorElement);\n }\n if ('querySelectorAll' in node && typeof node.querySelectorAll === 'function') {\n Array.from(node.querySelectorAll('a') as HTMLAnchorElement[]).map(addFileDownloadListener);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n subtree: true,\n childList: true,\n });\n }\n };\n\n // If the document is already loaded, initialize immediately.\n /* istanbul ignore else*/\n if (document.readyState === 'complete') {\n initializeFileDownloadTracking();\n } else {\n // Otherwise, wait for the load event.\n const window = getGlobalScope();\n /* istanbul ignore else*/\n if (window) {\n window.addEventListener('load', initializeFileDownloadTracking);\n } else {\n config.loggerProvider.debug('File download tracking is not installed because global is undefined.');\n }\n }\n };\n\n const execute = async (event: Event) => event;\n const teardown = async () => {\n observer?.disconnect();\n removeClickListeners();\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n","import { BrowserConfig } from '@amplitude/analytics-core';\n\nlet notified = false;\n\nexport const detNotify = (config: BrowserConfig): void => {\n if (notified || config.defaultTracking !== undefined) {\n return;\n }\n\n const message = `\\`options.defaultTracking\\` is set to undefined. This implicitly configures your Amplitude instance to track Page Views, Sessions, File Downloads, and Form Interactions. You can suppress this warning by explicitly setting a value to \\`options.defaultTracking\\`. The value must either be a boolean, to enable and disable all default events, or an object, for advanced configuration. For example:\n\namplitude.init(<YOUR_API_KEY>, {\n defaultTracking: true,\n});\n\nVisit https://www.docs.developers.amplitude.com/data/sdks/browser-2/#tracking-default-events for more details.`;\n config.loggerProvider.warn(message);\n notified = true;\n};\n\n/**\n * @private\n * This function is meant for testing purposes only\n */\nexport const resetNotify = () => {\n notified = false;\n};\n","import { getGlobalScope, BeforePlugin, BrowserClient, BrowserConfig } from '@amplitude/analytics-core';\n\ninterface EventListener {\n type: 'online' | 'offline';\n handler: () => void;\n}\n\nexport const networkConnectivityCheckerPlugin = (): BeforePlugin => {\n const name = '@amplitude/plugin-network-checker-browser';\n const type = 'before' as const;\n const globalScope = getGlobalScope();\n let eventListeners: EventListener[] = [];\n\n const addNetworkListener = (type: 'online' | 'offline', handler: () => void) => {\n /* istanbul ignore next */\n if (globalScope?.addEventListener) {\n globalScope?.addEventListener(type, handler);\n eventListeners.push({\n type,\n handler,\n });\n }\n };\n\n const removeNetworkListeners = () => {\n eventListeners.forEach(({ type, handler }) => {\n /* istanbul ignore next */\n globalScope?.removeEventListener(type, handler);\n });\n eventListeners = [];\n };\n\n const setup = async (config: BrowserConfig, amplitude: BrowserClient) => {\n if (typeof navigator === 'undefined') {\n config.loggerProvider.debug(\n 'Network connectivity checker plugin is disabled because navigator is not available.',\n );\n config.offline = false;\n return;\n }\n\n config.offline = !navigator.onLine;\n\n addNetworkListener('online', () => {\n config.loggerProvider.debug('Network connectivity changed to online.');\n config.offline = false;\n // Flush immediately will cause ERR_NETWORK_CHANGED\n setTimeout(() => {\n amplitude.flush();\n }, config.flushIntervalMillis);\n });\n\n addNetworkListener('offline', () => {\n config.loggerProvider.debug('Network connectivity changed to offline.');\n config.offline = true;\n });\n };\n\n const teardown = async () => {\n removeNetworkListeners();\n };\n\n return {\n name,\n type,\n setup,\n teardown,\n };\n};\n","import {\n AutocaptureOptions,\n type ElementInteractionsOptions,\n BrowserConfig,\n RemoteConfig,\n NetworkTrackingOptions,\n NetworkCaptureRule,\n SAFE_HEADERS,\n} from '@amplitude/analytics-core';\n\nexport interface AutocaptureOptionsRemoteConfig extends AutocaptureOptions {\n elementInteractions?: boolean | ElementInteractionsOptionsRemoteConfig;\n networkTracking?: boolean | NetworkTrackingOptionsRemoteConfig;\n}\nexport interface ElementInteractionsOptionsRemoteConfig extends ElementInteractionsOptions {\n /**\n * Related to pageUrlAllowlist but holds regex strings which will be initialized and appended to pageUrlAllowlist\n */\n pageUrlAllowlistRegex?: string[];\n}\n\nexport interface NetworkCaptureRuleRemoteConfig extends NetworkCaptureRule {\n /**\n * Related to urls but holds regex strings which will be initialized and appended to urls\n */\n urlsRegex?: string[];\n}\n\nexport interface NetworkTrackingOptionsRemoteConfig extends NetworkTrackingOptions {\n /**\n * Related to pageUrlAllowlist but holds regex strings which will be initialized and appended to pageUrlAllowlist\n */\n captureRules?: NetworkCaptureRuleRemoteConfig[];\n}\n\n// Type alias for the remote config structure we expect (this is what comes from the filtered browserSDK config)\ntype RemoteConfigBrowserSDK = {\n autocapture?: AutocaptureOptionsRemoteConfig | boolean;\n};\n\n/**\n * Performs a deep transformation of a remote config object so that\n * it matches the expected schema of the local config.\n *\n * Specifically, it normalizes nested `enabled` flags into concise union types.\n *\n * ### Transformation Rules:\n * - If an object has `enabled: true`, it is replaced by the same object without the `enabled` field.\n * - If it has only `enabled: true`, it is replaced with `true`.\n * - If it has `enabled: false`, it is replaced with `false` regardless of other fields.\n *\n * ### Examples:\n * Input: { prop: { enabled: true, hello: 'world' }}\n * Output: { prop: { hello: 'world' } }\n *\n * Input: { prop: { enabled: true }}\n * Output: { prop: true }\n *\n * Input: { prop: { enabled: false, hello: 'world' }}\n * Output: { prop: false }\n *\n * Input: { prop: { hello: 'world' }}\n * Output: { prop: { hello: 'world' } } // No change\n *\n * @param config Remote config object to be transformed\n * @returns Transformed config object compatible with local schema\n */\nexport function translateRemoteConfigToLocal(config?: Record<string, any>) {\n // Disabling type checking rules because remote config comes from a remote source\n // and this function needs to handle any unexpected values\n /* eslint-disable @typescript-eslint/no-unsafe-member-access,\n @typescript-eslint/no-unsafe-assignment,\n @typescript-eslint/no-unsafe-argument\n */\n if (typeof config !== 'object' || config === null) {\n return;\n }\n\n // translations are not applied on array properties\n if (Array.isArray(config)) {\n return;\n }\n\n const propertyNames = Object.keys(config);\n for (const propertyName of propertyNames) {\n try {\n const value = config[propertyName];\n // transform objects with { enabled } property to boolean | object\n if (typeof value?.enabled === 'boolean') {\n if (value.enabled) {\n // if enabled is true, set the value to the rest of the object\n // or true if the object has no other properties\n delete value.enabled;\n if (Object.keys(value).length === 0) {\n (config as any)[propertyName] = true;\n }\n } else {\n // If enabled is false, set the value to false\n (config as any)[propertyName] = false;\n }\n }\n\n // recursively translate properties of the value\n translateRemoteConfigToLocal(value as Record<string, any>);\n } catch (e) {\n // a failure here means that an accessor threw an error\n // so don't translate it\n // TODO(diagnostics): add a diagnostic event for this\n }\n }\n\n // translate remote responseHeaders and requestHeaders to local responseHeaders and requestHeaders\n try {\n if (config.autocapture?.networkTracking?.captureRules?.length) {\n for (const rule of config.autocapture.networkTracking.captureRules) {\n for (const header of ['responseHeaders', 'requestHeaders']) {\n const { captureSafeHeaders, allowlist } = rule[header] ?? {};\n if (!captureSafeHeaders && !allowlist) {\n continue;\n }\n // if allowlist is not an array, remote config contract is violated, remove it\n if (allowlist !== undefined && !Array.isArray(allowlist)) {\n delete rule[header];\n continue;\n }\n rule[header] = [...(captureSafeHeaders ? SAFE_HEADERS : []), ...(allowlist ?? [])];\n }\n }\n }\n } catch (e) {\n /* istanbul ignore next */\n // surprise exception, so don't translate it\n }\n\n // translate frustrationInteractions pluralization\n const frustrationInteractions = config.autocapture?.frustrationInteractions;\n if (frustrationInteractions) {\n if (frustrationInteractions.rageClick) {\n frustrationInteractions.rageClicks = frustrationInteractions.rageClick;\n delete frustrationInteractions.rageClick;\n }\n if (frustrationInteractions.deadClick) {\n frustrationInteractions.deadClicks = frustrationInteractions.deadClick;\n delete frustrationInteractions.deadClick;\n }\n }\n}\n\nfunction mergeUrls(urlsExact: (string | RegExp)[], urlsRegex: string[] | undefined, browserConfig: BrowserConfig) {\n // Convert string patterns to RegExp objects, warn on invalid patterns and skip them\n const regexList = [];\n for (const pattern of urlsRegex ?? []) {\n try {\n regexList.push(new RegExp(pattern));\n } catch (regexError) {\n browserConfig.loggerProvider.warn(`Invalid regex pattern: ${pattern}`, regexError);\n }\n }\n\n return urlsExact.concat(regexList);\n}\n\n/**\n * Updates the browser config in place by applying remote configuration settings.\n * Primarily merges autocapture settings from the remote config into the browser config.\n *\n * @param remoteConfig - The remote configuration to apply, or null if none available\n * @param browserConfig - The browser config object to update (modified in place)\n */\nexport function updateBrowserConfigWithRemoteConfig(\n remoteConfig: RemoteConfig | null,\n browserConfig: BrowserConfig,\n): void {\n if (!remoteConfig) {\n return;\n }\n\n // translate remote config to local compatible format\n translateRemoteConfigToLocal(remoteConfig);\n\n try {\n browserConfig.loggerProvider.debug(\n 'Update browser config with remote configuration:',\n JSON.stringify(remoteConfig),\n );\n\n // type cast error will be thrown if remoteConfig is not a valid RemoteConfigBrowserSDK\n // and it will be caught by the try-catch block\n const typedRemoteConfig = remoteConfig as RemoteConfigBrowserSDK;\n\n // merge remoteConfig.autocapture and browserConfig.autocapture\n // if a field is in remoteConfig.autocapture, use that value\n // if a field is not in remoteConfig.autocapture, use the value from browserConfig.autocapture\n if (typedRemoteConfig && 'autocapture' in typedRemoteConfig) {\n if (typeof typedRemoteConfig.autocapture === 'boolean') {\n browserConfig.autocapture = typedRemoteConfig.autocapture;\n }\n\n if (typeof typedRemoteConfig.autocapture === 'object' && typedRemoteConfig.autocapture !== null) {\n const transformedAutocaptureRemoteConfig = { ...typedRemoteConfig.autocapture };\n\n if (browserConfig.autocapture === undefined) {\n browserConfig.autocapture = typedRemoteConfig.autocapture;\n }\n\n // Handle Element Interactions config initialization\n if (\n typeof typedRemoteConfig.autocapture.elementInteractions === 'object' &&\n typedRemoteConfig.autocapture.elementInteractions !== null &&\n typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex?.length\n ) {\n transformedAutocaptureRemoteConfig.elementInteractions = {\n ...typedRemoteConfig.autocapture.elementInteractions,\n };\n const transformedRcElementInteractions = transformedAutocaptureRemoteConfig.elementInteractions;\n\n // combine exact allow list and regex allow list into just 'pageUrlAllowlist'\n const exactAllowList = transformedRcElementInteractions.pageUrlAllowlist ?? [];\n const urlsRegex = typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex;\n transformedRcElementInteractions.pageUrlAllowlist = mergeUrls(exactAllowList, urlsRegex, browserConfig);\n\n // clean up the regex allow list\n delete transformedRcElementInteractions.pageUrlAllowlistRegex;\n }\n\n // Handle Network Tracking config initialization\n if (\n typeof typedRemoteConfig.autocapture.networkTracking === 'object' &&\n typedRemoteConfig.autocapture.networkTracking !== null &&\n typedRemoteConfig.autocapture.networkTracking.captureRules?.length\n ) {\n transformedAutocaptureRemoteConfig.networkTracking = {\n ...typedRemoteConfig.autocapture.networkTracking,\n };\n const transformedRcNetworkTracking = transformedAutocaptureRemoteConfig.networkTracking;\n /* istanbul ignore next */\n const captureRules = transformedRcNetworkTracking.captureRules ?? [];\n for (const rule of captureRules) {\n rule.urls = mergeUrls(rule.urls ?? [], rule.urlsRegex, browserConfig);\n delete rule.urlsRegex;\n }\n }\n\n if (typeof browserConfig.autocapture === 'boolean') {\n browserConfig.autocapture = {\n attribution: browserConfig.autocapture,\n fileDownloads: browserConfig.autocapture,\n formInteractions: browserConfig.autocapture,\n pageViews: browserConfig.autocapture,\n sessions: browserConfig.autocapture,\n elementInteractions: browserConfig.autocapture,\n webVitals: browserConfig.autocapture,\n frustrationInteractions: browserConfig.autocapture,\n ...transformedAutocaptureRemoteConfig,\n };\n }\n\n if (typeof browserConfig.autocapture === 'object') {\n browserConfig.autocapture = {\n ...browserConfig.autocapture,\n ...transformedAutocaptureRemoteConfig,\n };\n }\n }\n\n // Override default tracking options if autocapture is updated by remote config\n browserConfig.defaultTracking = browserConfig.autocapture;\n }\n\n browserConfig.loggerProvider.debug('Browser config after remote config update:', JSON.stringify(browserConfig));\n } catch (e) {\n browserConfig.loggerProvider.error('Failed to apply remote configuration because of error: ', e);\n }\n}\n","export var VERSION = '1.18.7';\n//# sourceMappingURL=version.js.map","export var PLUGIN_NAME = '@amplitude/plugin-autocapture-browser';\nexport var FRUSTRATION_PLUGIN_NAME = '@amplitude/plugin-frustration-browser';\nexport var AMPLITUDE_ELEMENT_CLICKED_EVENT = '[Amplitude] Element Clicked';\nexport var AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = '[Amplitude] Dead Click';\nexport var AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = '[Amplitude] Rage Click';\nexport var AMPLITUDE_ELEMENT_ERROR_CLICKED_EVENT = '[Amplitude] Error Click';\nexport var AMPLITUDE_ELEMENT_CHANGED_EVENT = '[Amplitude] Element Changed';\nexport var AMPLITUDE_EVENT_PROP_ELEMENT_ID = '[Amplitude] Element ID';\nexport var AMPLITUDE_EVENT_PROP_ELEMENT_CLASS = '[Amplitude] Element Class';\nexport var AMPLITUDE_EVENT_PROP_ELEMENT_TAG = '[Amplitude] Element Tag';\nexport var AMPLITUDE_EVENT_PROP_ELEMENT_TEXT = '[Amplitude] Element Text';\nexport var AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY = '[Amplitude] Element Hierarchy';\nexport var AMPLITUDE_EVENT_PROP_ELEMENT_HREF = '[Amplitude] Element Href';\nexport var AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT = '[Amplitude] Element Position Left';\nexport var AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP = '[Amplitude] Element Position Top';\nexport var AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL = '[Amplitude] Element Aria Label';\nexport var AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES = '[Amplitude] Element Attributes';\nexport var AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL = '[Amplitude] Element Parent Label';\nexport var AMPLITUDE_EVENT_PROP_PAGE_URL = '[Amplitude] Page URL';\nexport var AMPLITUDE_EVENT_PROP_PAGE_TITLE = '[Amplitude] Page Title';\nexport var AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT = '[Amplitude] Viewport Height';\nexport var AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH = '[Amplitude] Viewport Width';\n// Visual Tagging related constants\nexport var AMPLITUDE_ORIGIN = 'https://app.amplitude.com';\nexport var AMPLITUDE_ORIGIN_EU = 'https://app.eu.amplitude.com';\nexport var AMPLITUDE_ORIGIN_STAGING = 'https://apps.stag2.amplitude.com';\nexport var AMPLITUDE_ORIGINS_MAP = {\n US: AMPLITUDE_ORIGIN,\n EU: AMPLITUDE_ORIGIN_EU,\n STAGING: AMPLITUDE_ORIGIN_STAGING,\n};\nexport var AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL = '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 var AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS = 'amp-visual-tagging-selector-highlight';\n// Data attribute for specifying which attributes should be redacted from autocapture\nexport var DATA_AMP_MASK_ATTRIBUTES = 'data-amp-mask-attributes';\nexport var MAX_MASK_TEXT_PATTERNS = 25;\nexport var MAX_ATTRIBUTE_LENGTH = 128;\n//# sourceMappingURL=constants.js.map","import { __read } from \"tslib\";\n/* eslint-disable no-restricted-globals */\nimport { isUrlMatchAllowlist } from '@amplitude/analytics-core';\nvar SENSITIVE_TAGS = ['input', 'select', 'textarea'];\nexport var isElementPointerCursor = function (element, actionType) {\n var _a;\n /* istanbul ignore next */\n var computedStyle = (_a = window === null || window === void 0 ? void 0 : window.getComputedStyle) === null || _a === void 0 ? void 0 : _a.call(window, element);\n /* istanbul ignore next */\n return (computedStyle === null || computedStyle === void 0 ? void 0 : computedStyle.getPropertyValue('cursor')) === 'pointer' && actionType === 'click';\n};\nexport var createShouldTrackEvent = function (autocaptureOptions, allowlist, // this can be any type of css selector allow list\nisAlwaysCaptureCursorPointer) {\n if (isAlwaysCaptureCursorPointer === void 0) { isAlwaysCaptureCursorPointer = false; }\n return function (actionType, element) {\n var _a, _b;\n var pageUrlAllowlist = autocaptureOptions.pageUrlAllowlist, pageUrlExcludelist = autocaptureOptions.pageUrlExcludelist, shouldTrackEventResolver = autocaptureOptions.shouldTrackEventResolver;\n /* istanbul ignore next */\n var tag = (_b = (_a = element === null || element === void 0 ? void 0 : element.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase) === null || _b === void 0 ? void 0 : _b.call(_a);\n // window, document, and Text nodes have no tag\n if (!tag) {\n return false;\n }\n if (shouldTrackEventResolver) {\n return shouldTrackEventResolver(actionType, element);\n }\n // check if the URL is in the allow list\n if (!isUrlMatchAllowlist(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n // check if the URL is in the excludelist\n if (pageUrlExcludelist &&\n pageUrlExcludelist.length > 0 &&\n isUrlMatchAllowlist(window.location.href, pageUrlExcludelist)) {\n return false;\n }\n /* istanbul ignore next */\n var elementType = String(element === null || element === void 0 ? void 0 : 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 var isCursorPointer = isElementPointerCursor(element, actionType);\n if (isAlwaysCaptureCursorPointer && isCursorPointer) {\n return true;\n }\n /* istanbul ignore if */\n if (allowlist) {\n var hasMatchAnyAllowedSelector = allowlist.some(function (selector) { var _a; return !!((_a = element === null || element === void 0 ? void 0 : element.matches) === null || _a === void 0 ? void 0 : _a.call(element, selector)); });\n if (!hasMatchAnyAllowedSelector) {\n return false;\n }\n }\n switch (tag) {\n case 'input':\n case 'select':\n case 'textarea':\n return actionType === 'change' || actionType === 'click';\n default: {\n /* istanbul ignore next */\n /* istanbul ignore next */\n if (isCursorPointer) {\n return true;\n }\n return actionType === 'click';\n }\n }\n };\n};\nexport var isTextNode = function (node) {\n return !!node && node.nodeType === 3;\n};\nexport var isNonSensitiveElement = function (element) {\n var _a, _b, _c;\n /* istanbul ignore next */\n var tag = (_b = (_a = element === null || element === void 0 ? void 0 : element.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase) === null || _b === void 0 ? void 0 : _b.call(_a);\n var isContentEditable = element instanceof HTMLElement ? ((_c = element.getAttribute('contenteditable')) === null || _c === void 0 ? void 0 : _c.toLowerCase()) === 'true' : false;\n return !SENSITIVE_TAGS.includes(tag) && !isContentEditable;\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 var parseAttributesToMask = function (attributeString) {\n return attributeString\n ? attributeString\n .split(',')\n .map(function (attr) { return attr.trim(); })\n .filter(function (attr) { return attr.length > 0 && attr !== 'id' && attr !== 'class'; }) // Prevent 'id' and 'class' from being redacted as they're critical for element identification\n : [];\n};\nexport var extractPrefixedAttributes = function (attrs, prefix) {\n return Object.entries(attrs).reduce(function (attributes, _a) {\n var _b = __read(_a, 2), attributeName = _b[0], attributeValue = _b[1];\n if (attributeName.startsWith(prefix)) {\n var attributeKey = attributeName.replace(prefix, '');\n if (attributeKey) {\n attributes[attributeKey] = attributeValue || '';\n }\n }\n return attributes;\n }, {});\n};\nexport var isEmpty = function (value) {\n return (value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n (typeof value === 'string' && value.trim().length === 0));\n};\nexport var removeEmptyProperties = function (properties) {\n return Object.keys(properties).reduce(function (filteredProperties, key) {\n var value = properties[key];\n if (!isEmpty(value)) {\n filteredProperties[key] = value;\n }\n return filteredProperties;\n }, {});\n};\nexport var querySelectUniqueElements = function (root, selectors) {\n if (root && 'querySelectorAll' in root && typeof root.querySelectorAll === 'function') {\n var elementSet = selectors.reduce(function (elements, selector) {\n if (selector) {\n var selectedElements = Array.from(root.querySelectorAll(selector));\n selectedElements.forEach(function (element) {\n elements.add(element);\n });\n }\n return elements;\n }, new Set());\n return Array.from(elementSet);\n }\n return [];\n};\n// Similar as element.closest, but works with multiple selectors\nexport var getClosestElement = function (element, selectors) {\n if (!element) {\n return null;\n }\n /* istanbul ignore next */\n if (selectors.some(function (selector) { var _a; return (_a = element === null || element === void 0 ? void 0 : element.matches) === null || _a === void 0 ? void 0 : _a.call(element, selector); })) {\n return element;\n }\n /* istanbul ignore next */\n return getClosestElement(element === null || element === void 0 ? void 0 : element.parentElement, selectors);\n};\nexport var asyncLoadScript = function (url) {\n return new Promise(function (resolve, reject) {\n var _a;\n try {\n var scriptElement = document.createElement('script');\n scriptElement.type = 'text/javascript';\n scriptElement.async = true;\n scriptElement.src = url;\n scriptElement.addEventListener('load', function () {\n resolve({ status: true });\n }, { once: true });\n scriptElement.addEventListener('error', function () {\n reject({\n status: false,\n message: \"Failed to load the script \".concat(url),\n });\n });\n /* istanbul ignore next */\n (_a = document.head) === null || _a === void 0 ? void 0 : _a.appendChild(scriptElement);\n }\n catch (error) {\n /* istanbul ignore next */\n reject(error);\n }\n });\n};\nexport function generateUniqueId() {\n return \"\".concat(Date.now(), \"-\").concat(Math.random().toString(36).substr(2, 9));\n}\nexport var filterOutNonTrackableEvents = function (event) {\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 return true;\n};\n// Type predicate\nexport function isElementBasedEvent(event) {\n return event.type === 'click' || event.type === 'change';\n}\nexport var MouseButton;\n(function (MouseButton) {\n MouseButton[MouseButton[\"LEFT_OR_TOUCH_CONTACT\"] = 0] = \"LEFT_OR_TOUCH_CONTACT\";\n MouseButton[MouseButton[\"MIDDLE\"] = 1] = \"MIDDLE\";\n MouseButton[MouseButton[\"RIGHT\"] = 2] = \"RIGHT\";\n})(MouseButton || (MouseButton = {}));\n//# sourceMappingURL=helpers.js.map","import { __values } from \"tslib\";\nimport { isNonSensitiveElement } from './helpers';\nimport { DATA_AMP_MASK_ATTRIBUTES } from './constants';\nimport * as constants from './constants';\nimport { MASKED_TEXT_VALUE, TEXT_MASK_ATTRIBUTE } from '@amplitude/analytics-core';\nvar BLOCKED_ATTRIBUTES = new Set([\n // Already captured elsewhere in the hierarchy object\n 'id',\n 'class',\n // non-useful and potentially large attribute\n 'style',\n // sensitive as prefilled form data may populate this attribute\n 'value',\n // DOM events\n 'onclick',\n 'onchange',\n 'oninput',\n 'onblur',\n 'onsubmit',\n 'onfocus',\n 'onkeydown',\n 'onkeyup',\n 'onkeypress',\n // React specific\n 'data-reactid',\n 'data-react-checksum',\n 'data-reactroot',\n // Amplitude specific - used for redaction but should not be included in getElementProperties\n DATA_AMP_MASK_ATTRIBUTES,\n TEXT_MASK_ATTRIBUTE,\n]);\nvar SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST = ['type'];\nvar SVG_TAGS = ['svg', 'path', 'g'];\nvar HIGHLY_SENSITIVE_INPUT_TYPES = ['password', 'hidden'];\nexport var MAX_HIERARCHY_LENGTH = 1024;\nexport function getElementProperties(element, userMaskedAttributeNames) {\n var e_1, _a;\n var _b, _c, _d, _e;\n if (element === null) {\n return null;\n }\n var tagName = String(element.tagName).toLowerCase();\n var properties = {\n tag: tagName,\n };\n var siblings = Array.from((_c = (_b = element.parentElement) === null || _b === void 0 ? void 0 : _b.children) !== null && _c !== void 0 ? _c : []);\n if (siblings.length) {\n properties.index = siblings.indexOf(element);\n properties.indexOfType = siblings.filter(function (el) { return el.tagName === element.tagName; }).indexOf(element);\n }\n var prevSiblingTag = (_e = (_d = element.previousElementSibling) === null || _d === void 0 ? void 0 : _d.tagName) === null || _e === void 0 ? void 0 : _e.toLowerCase();\n if (prevSiblingTag) {\n properties.prevSib = String(prevSiblingTag);\n }\n var id = element.getAttribute('id');\n if (id) {\n properties.id = String(id);\n }\n var classes = Array.from(element.classList);\n if (classes.length) {\n properties.classes = classes;\n }\n var attributes = {};\n var attributesArray = Array.from(element.attributes);\n var filteredAttributes = attributesArray.filter(function (attr) { return !BLOCKED_ATTRIBUTES.has(attr.name); });\n var isSensitiveElement = !isNonSensitiveElement(element);\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 try {\n for (var filteredAttributes_1 = __values(filteredAttributes), filteredAttributes_1_1 = filteredAttributes_1.next(); !filteredAttributes_1_1.done; filteredAttributes_1_1 = filteredAttributes_1.next()) {\n var attr = filteredAttributes_1_1.value;\n // If sensitive element, only allow certain attributes\n if (isSensitiveElement && !SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST.includes(attr.name)) {\n continue;\n }\n if (userMaskedAttributeNames.has(attr.name)) {\n attributes[attr.name] = MASKED_TEXT_VALUE;\n continue;\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 catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (filteredAttributes_1_1 && !filteredAttributes_1_1.done && (_a = filteredAttributes_1.return)) _a.call(filteredAttributes_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n if (Object.keys(attributes).length) {\n properties.attrs = attributes;\n }\n return properties;\n}\nexport function getAncestors(targetEl) {\n var ancestors = [];\n if (!targetEl) {\n return ancestors;\n }\n // Add self to the list of ancestors\n ancestors.push(targetEl);\n var current = targetEl.parentElement;\n while (current && current.tagName !== 'HTML') {\n ancestors.push(current);\n current = current.parentElement;\n }\n return ancestors;\n}\n//# sourceMappingURL=hierarchy.js.map","// 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 var getDataSource = function (dataSource, contextElement) {\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 var scopingElement = document.documentElement;\n if (dataSource.scope && contextElement) {\n scopingElement = contextElement.closest(dataSource.scope);\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 // Return scopingElement if no selector was specified\n return scopingElement;\n }\n }\n catch (error) {\n return undefined;\n }\n // Return undefined for non-DOM_ELEMENT data sources\n return undefined;\n};\n// Execute actions for a condition and attach event properties to the event if needed\nexport var executeActions = function (actions, ev, dataExtractor) {\n actions.forEach(function (action) {\n // Skip if actions is string until action set is implemented\n if (typeof action === 'string') {\n return;\n }\n if (action.actionType === 'ATTACH_EVENT_PROPERTY') {\n var data = dataExtractor.extractDataFromDataSource(action.dataSource, ev.closestTrackedAncestor);\n // Attach data to event\n ev.targetElementProperties[action.destinationKey] = data;\n }\n });\n};\n//# sourceMappingURL=actions.js.map","import { __read, __spreadArray, __values } from \"tslib\";\n/* eslint-disable no-restricted-globals */\nimport { getDecodeURI, MASKED_TEXT_VALUE, TEXT_MASK_ATTRIBUTE, getPageTitle, replaceSensitiveString, } from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { removeEmptyProperties, extractPrefixedAttributes, isElementPointerCursor, getClosestElement, isElementBasedEvent, parseAttributesToMask, } from './helpers';\nimport { getAncestors, getElementProperties } from './hierarchy';\nimport { getDataSource } from './pageActions/actions';\nvar DataExtractor = /** @class */ (function () {\n function DataExtractor(options, context) {\n var e_1, _a;\n var _this = this;\n var _b;\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 this.replaceSensitiveString = function (text) {\n return replaceSensitiveString(text, _this.additionalMaskTextPatterns);\n };\n // Get the DOM hierarchy of the element, starting from the target element to the root element.\n this.getHierarchy = function (element) {\n var e_2, _a;\n var _b, _c;\n var startTime = performance.now();\n var hierarchy = [];\n if (!element) {\n return [];\n }\n // Get list of ancestors including itself and get properties at each level in the hierarchy\n var ancestors = getAncestors(element);\n // Build attributes to mask map\n var elementToAttributesToMaskMap = new Map();\n for (var i = ancestors.length - 1; i >= 0; i--) {\n var node = ancestors[i];\n if (node) {\n var attributesToMask = parseAttributesToMask(node.getAttribute(constants.DATA_AMP_MASK_ATTRIBUTES));\n var ancestorAttributesToMask = i === ancestors.length - 1 ? [] : (_b = elementToAttributesToMaskMap.get(ancestors[i + 1])) !== null && _b !== void 0 ? _b : new Set();\n var combinedAttributesToMask = new Set(__spreadArray(__spreadArray([], __read(ancestorAttributesToMask), false), __read(attributesToMask), false));\n elementToAttributesToMaskMap.set(node, combinedAttributesToMask);\n }\n }\n hierarchy = ancestors.map(function (el) { var _a; return getElementProperties(el, (_a = elementToAttributesToMaskMap.get(el)) !== null && _a !== void 0 ? _a : new Set()); });\n var _loop_1 = function (hierarchyNode) {\n if (hierarchyNode === null || hierarchyNode === void 0 ? void 0 : hierarchyNode.attrs) {\n Object.entries(hierarchyNode.attrs).forEach(function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n if (hierarchyNode.attrs) {\n hierarchyNode.attrs[key] = _this.replaceSensitiveString(value);\n }\n });\n }\n };\n try {\n // Search for and mask any sensitive attribute values\n for (var hierarchy_1 = __values(hierarchy), hierarchy_1_1 = hierarchy_1.next(); !hierarchy_1_1.done; hierarchy_1_1 = hierarchy_1.next()) {\n var hierarchyNode = hierarchy_1_1.value;\n _loop_1(hierarchyNode);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (hierarchy_1_1 && !hierarchy_1_1.done && (_a = hierarchy_1.return)) _a.call(hierarchy_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n var endTime = performance.now();\n (_c = _this.diagnosticsClient) === null || _c === void 0 ? void 0 : _c.recordHistogram('autocapturePlugin.getHierarchy', endTime - startTime);\n return hierarchy;\n };\n this.getNearestLabel = function (element) {\n var parent = element.parentElement;\n if (!parent) {\n return '';\n }\n var labelElement;\n try {\n labelElement = parent.querySelector(':scope>span,h1,h2,h3,h4,h5,h6');\n }\n catch (_a) {\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 // Returns the Amplitude event properties for the given element.\n this.getEventProperties = function (actionType, element, dataAttributePrefix) {\n var _a;\n var _b, _c, _d;\n /* istanbul ignore next */\n var tag = (_c = (_b = element === null || element === void 0 ? void 0 : element.tagName) === null || _b === void 0 ? void 0 : _b.toLowerCase) === null || _c === void 0 ? void 0 : _c.call(_b);\n /* istanbul ignore next */\n var rect = typeof element.getBoundingClientRect === 'function' ? element.getBoundingClientRect() : { left: null, top: null };\n var hierarchy = _this.getHierarchy(element);\n var currentElementAttributes = (_d = hierarchy[0]) === null || _d === void 0 ? void 0 : _d.attrs;\n var nearestLabel = _this.getNearestLabel(element);\n var attributes = extractPrefixedAttributes(currentElementAttributes !== null && currentElementAttributes !== void 0 ? currentElementAttributes : {}, dataAttributePrefix);\n /* istanbul ignore next */\n var properties = (_a = {},\n _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_HIERARCHY] = hierarchy,\n _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG] = tag,\n _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT] = _this.getText(element),\n _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_LEFT] = rect.left == null ? null : Math.round(rect.left),\n _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_POSITION_TOP] = rect.top == null ? null : Math.round(rect.top),\n _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ATTRIBUTES] = attributes,\n _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_PARENT_LABEL] = nearestLabel,\n _a[constants.AMPLITUDE_EVENT_PROP_PAGE_URL] = getDecodeURI(window.location.href.split('?')[0]),\n _a[constants.AMPLITUDE_EVENT_PROP_PAGE_TITLE] = getPageTitle(_this.replaceSensitiveString),\n _a[constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT] = window.innerHeight,\n _a[constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH] = window.innerWidth,\n _a);\n // id is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ID] = element.getAttribute('id') || '';\n // class is never masked, so always include it\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_CLASS] = element.getAttribute('class');\n properties[constants.AMPLITUDE_EVENT_PROP_ELEMENT_ARIA_LABEL] = currentElementAttributes === null || currentElementAttributes === void 0 ? void 0 : currentElementAttributes['aria-label'];\n if (tag === 'a' && actionType === 'click' && element instanceof HTMLAnchorElement) {\n var 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 return removeEmptyProperties(properties);\n };\n this.addTypeAndTimestamp = function (event, type) {\n return {\n event: event,\n timestamp: Date.now(),\n type: type,\n };\n };\n this.addAdditionalEventProperties = function (event, type, selectorAllowlist, dataAttributePrefix, \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) {\n if (isCapturingCursorPointer === void 0) { isCapturingCursorPointer = false; }\n var baseEvent = _this.addTypeAndTimestamp(event, type);\n if (isElementBasedEvent(baseEvent) && baseEvent.event.target !== null) {\n if (isCapturingCursorPointer) {\n var isCursorPointer = isElementPointerCursor(baseEvent.event.target, baseEvent.type);\n if (isCursorPointer) {\n baseEvent.closestTrackedAncestor = baseEvent.event.target;\n baseEvent.targetElementProperties = _this.getEventProperties(baseEvent.type, baseEvent.closestTrackedAncestor, dataAttributePrefix);\n return baseEvent;\n }\n }\n // Retrieve additional event properties from the target element\n var closestTrackedAncestor = getClosestElement(baseEvent.event.target, selectorAllowlist);\n if (closestTrackedAncestor) {\n baseEvent.closestTrackedAncestor = closestTrackedAncestor;\n baseEvent.targetElementProperties = _this.getEventProperties(baseEvent.type, closestTrackedAncestor, dataAttributePrefix);\n }\n return baseEvent;\n }\n return baseEvent;\n };\n this.extractDataFromDataSource = function (dataSource, contextElement) {\n // Extract from DOM Element\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n var sourceElement = getDataSource(dataSource, contextElement);\n if (!sourceElement) {\n return undefined;\n }\n if (dataSource.elementExtractType === 'TEXT') {\n return _this.getText(sourceElement);\n }\n else if (dataSource.elementExtractType === 'ATTRIBUTE' && dataSource.attribute) {\n return sourceElement.getAttribute(dataSource.attribute);\n }\n return undefined;\n }\n // TODO: Extract from other source types\n return undefined;\n };\n this.getText = function (element) {\n // Check if element or any parent has data-amp-mask attribute\n var hasMaskAttribute = element.closest(\"[\".concat(TEXT_MASK_ATTRIBUTE, \"]\")) !== null;\n if (hasMaskAttribute) {\n return MASKED_TEXT_VALUE;\n }\n var output = '';\n if (!element.querySelector(\"[\".concat(TEXT_MASK_ATTRIBUTE, \"], [contenteditable]\"))) {\n output = element.innerText || '';\n }\n else {\n var clonedTree = element.cloneNode(true);\n // replace all elements with TEXT_MASK_ATTRIBUTE attribute and contenteditable with the text MASKED_TEXT_VALUE\n clonedTree.querySelectorAll(\"[\".concat(TEXT_MASK_ATTRIBUTE, \"], [contenteditable]\")).forEach(function (node) {\n node.innerText = MASKED_TEXT_VALUE;\n });\n output = clonedTree.innerText || '';\n }\n return _this.replaceSensitiveString(output.substring(0, 255)).replace(/\\s+/g, ' ').trim();\n };\n // Returns the element properties for the given element in Visual Labeling.\n this.getEventTagProps = function (element) {\n var _a;\n var _b, _c;\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n var tag = (_c = (_b = element === null || element === void 0 ? void 0 : element.tagName) === null || _b === void 0 ? void 0 : _b.toLowerCase) === null || _c === void 0 ? void 0 : _c.call(_b);\n var properties = (_a = {},\n _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG] = tag,\n _a[constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT] = _this.getText(element),\n _a[constants.AMPLITUDE_EVENT_PROP_PAGE_URL] = window.location.href.split('?')[0],\n _a);\n return removeEmptyProperties(properties);\n };\n this.diagnosticsClient = context === null || context === void 0 ? void 0 : context.diagnosticsClient;\n var rawPatterns = (_b = options.maskTextRegex) !== null && _b !== void 0 ? _b : [];\n var compiled = [];\n try {\n for (var rawPatterns_1 = __values(rawPatterns), rawPatterns_1_1 = rawPatterns_1.next(); !rawPatterns_1_1.done; rawPatterns_1_1 = rawPatterns_1.next()) {\n var entry = rawPatterns_1_1.value;\n if (compiled.length >= constants.MAX_MASK_TEXT_PATTERNS) {\n break;\n }\n if (entry instanceof RegExp) {\n compiled.push(entry);\n }\n else if ('pattern' in entry && typeof entry.pattern === 'string') {\n try {\n compiled.push(new RegExp(entry.pattern, 'i'));\n }\n catch (_c) {\n // ignore invalid pattern strings\n }\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (rawPatterns_1_1 && !rawPatterns_1_1.done && (_a = rawPatterns_1.return)) _a.call(rawPatterns_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n this.additionalMaskTextPatterns = compiled;\n }\n return DataExtractor;\n}());\nexport { DataExtractor };\n//# sourceMappingURL=data-extractor.js.map","/* istanbul ignore file */\n/* eslint-disable no-restricted-globals */\nimport { AMPLITUDE_ORIGIN, AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL, AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS, } from '../constants';\nimport { asyncLoadScript, generateUniqueId } from '../helpers';\nimport { VERSION } from '../version';\nimport { DataExtractor } from '../data-extractor';\n// TODO: use MessageChannel instead of window.postMessage\nvar WindowMessenger = /** @class */ (function () {\n function WindowMessenger(_a) {\n var _b = _a === void 0 ? {} : _a, _c = _b.origin, origin = _c === void 0 ? AMPLITUDE_ORIGIN : _c;\n var _this = this;\n this.endpoint = AMPLITUDE_ORIGIN;\n this.requestCallbacks = {};\n this.onSelect = function (data) {\n _this.notify({ action: 'element-selected', data: data });\n };\n this.onTrack = function (type, properties) {\n if (type === 'selector-mode-changed') {\n _this.notify({ action: 'track-selector-mode-changed', data: properties });\n }\n else if (type === 'selector-moved') {\n _this.notify({ action: 'track-selector-moved', data: properties });\n }\n };\n this.endpoint = origin;\n }\n WindowMessenger.prototype.notify = function (message) {\n var _a, _b, _c, _d;\n (_b = (_a = this.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, 'Message sent: ', JSON.stringify(message));\n (_d = (_c = window.opener) === null || _c === void 0 ? void 0 : _c.postMessage) === null || _d === void 0 ? void 0 : _d.call(_c, message, this.endpoint);\n };\n // Send an async request to the parent window\n WindowMessenger.prototype.sendRequest = function (action, args, options) {\n var _this = this;\n if (options === void 0) { options = { timeout: 15000 }; }\n // Create Request ID\n var id = generateUniqueId();\n var request = {\n id: id,\n action: action,\n args: args,\n };\n // Create a Promise that will be resolved when the response is received\n var promise = new Promise(function (resolve, reject) {\n _this.requestCallbacks[id] = { resolve: resolve, reject: reject };\n // Send the request\n _this.notify(request);\n // Handle request timeouts\n if ((options === null || options === void 0 ? void 0 : options.timeout) > 0) {\n setTimeout(function () {\n reject(new Error(\"\".concat(action, \" timed out (id: \").concat(id, \")\")));\n delete _this.requestCallbacks[id];\n }, options.timeout);\n }\n });\n return promise;\n };\n // Handle messages from the parent window\n WindowMessenger.prototype.handleResponse = function (response) {\n var _a;\n if (!this.requestCallbacks[response.id]) {\n (_a = this.logger) === null || _a === void 0 ? void 0 : _a.warn(\"No callback found for request id: \".concat(response.id));\n return;\n }\n this.requestCallbacks[response.id].resolve(response.responseData);\n delete this.requestCallbacks[response.id];\n };\n WindowMessenger.prototype.setup = function (_a) {\n var _this = this;\n var _b = _a === void 0 ? { dataExtractor: new DataExtractor({}) } : _a, logger = _b.logger, endpoint = _b.endpoint, isElementSelectable = _b.isElementSelectable, cssSelectorAllowlist = _b.cssSelectorAllowlist, actionClickAllowlist = _b.actionClickAllowlist, dataExtractor = _b.dataExtractor;\n this.logger = logger;\n // If endpoint is customized, don't override it.\n if (endpoint && this.endpoint === AMPLITUDE_ORIGIN) {\n this.endpoint = endpoint;\n }\n var amplitudeVisualTaggingSelectorInstance = null;\n // Attach Event Listener to listen for messages from the parent window\n window.addEventListener('message', function (event) {\n var _a, _b, _c, _d, _e;\n (_b = (_a = _this.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, 'Message received: ', JSON.stringify(event));\n // Only accept messages from the specified origin\n if (_this.endpoint !== event.origin) {\n return;\n }\n var eventData = event === null || event === void 0 ? void 0 : event.data;\n var action = eventData === null || eventData === void 0 ? void 0 : eventData.action;\n // Ignore messages without action\n if (!action) {\n return;\n }\n // If id exists, handle responses to previous requests\n if ('id' in eventData) {\n (_d = (_c = _this.logger) === null || _c === void 0 ? void 0 : _c.debug) === null || _d === void 0 ? void 0 : _d.call(_c, 'Received Response to previous request: ', JSON.stringify(event));\n _this.handleResponse(eventData);\n // If action exists, handle the action using existing handlers\n }\n else {\n if (action === 'ping') {\n _this.notify({ action: 'pong' });\n }\n else if (action === 'initialize-visual-tagging-selector') {\n var actionData_1 = eventData === null || eventData === void 0 ? void 0 : eventData.data;\n asyncLoadScript(AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL)\n .then(function () {\n var _a;\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance = (_a = window === null || window === void 0 ? void 0 : window.amplitudeVisualTaggingSelector) === null || _a === void 0 ? void 0 : _a.call(window, {\n getEventTagProps: dataExtractor.getEventTagProps,\n isElementSelectable: function (element) {\n if (isElementSelectable) {\n return isElementSelectable((actionData_1 === null || actionData_1 === void 0 ? void 0 : actionData_1.actionType) || 'click', element);\n }\n return true;\n },\n onTrack: _this.onTrack,\n onSelect: _this.onSelect,\n visualHighlightClass: AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n messenger: _this,\n cssSelectorAllowlist: cssSelectorAllowlist,\n actionClickAllowlist: actionClickAllowlist,\n extractDataFromDataSource: dataExtractor.extractDataFromDataSource,\n dataExtractor: dataExtractor,\n diagnostics: {\n autocapture: {\n version: VERSION,\n },\n },\n });\n _this.notify({ action: 'selector-loaded' });\n })\n .catch(function () {\n var _a;\n (_a = _this.logger) === null || _a === void 0 ? void 0 : _a.warn('Failed to initialize visual tagging selector');\n });\n }\n else if (action === 'close-visual-tagging-selector') {\n // eslint-disable-next-line\n (_e = amplitudeVisualTaggingSelectorInstance === null || amplitudeVisualTaggingSelectorInstance === void 0 ? void 0 : amplitudeVisualTaggingSelectorInstance.close) === null || _e === void 0 ? void 0 : _e.call(amplitudeVisualTaggingSelectorInstance);\n }\n }\n });\n // Notify the parent window that the page has loaded\n this.notify({ action: 'page-loaded' });\n };\n return WindowMessenger;\n}());\nexport { WindowMessenger };\n//# sourceMappingURL=messenger.js.map","import { __assign } from \"tslib\";\nimport { Observable, consoleObserver, getGlobalScope, merge } from '@amplitude/analytics-core';\n/* eslint-disable-next-line no-restricted-globals */\nvar globalScope = getGlobalScope();\nexport var createMutationObservable = function () {\n return new Observable(function (observer) {\n var mutationObserver = new MutationObserver(function (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 function () { return mutationObserver.disconnect(); };\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 var createClickObservable = function (clickType) {\n if (clickType === void 0) { clickType = 'click'; }\n return new Observable(function (observer) {\n var handler = function (event) {\n observer.next(event);\n };\n globalScope.document.addEventListener(clickType, handler, { capture: true });\n return function () {\n globalScope.document.removeEventListener(clickType, handler, { capture: true });\n };\n });\n};\nvar createConsoleErrorObservable = function () {\n return new Observable(function (observer) {\n var handler = function (_) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n /* istanbul ignore next */\n var message = undefined;\n if (Array.isArray(args[0]) && typeof args[0][0] === 'string') {\n message = args[0][0];\n }\n observer.next({ kind: 'console', message: message });\n };\n consoleObserver.addListener('error', handler);\n return function () {\n consoleObserver.removeListener(handler);\n };\n });\n};\nvar createUnhandledErrorObservable = function () {\n return new Observable(function (observer) {\n var handler = function (event) {\n var output = {\n kind: 'error',\n };\n if (event.error instanceof Error) {\n output = __assign(__assign({}, output), { message: event.error.message, stack: event.error.stack, filename: event.filename, lineNumber: event.lineno, columnNumber: event.colno });\n }\n else if (typeof event.error === 'string') {\n output.message = event.error;\n }\n observer.next(output);\n };\n globalScope.addEventListener('error', handler);\n return function () {\n globalScope.removeEventListener('error', handler);\n };\n });\n};\nvar createUnhandledRejectionObservable = function () {\n return new Observable(function (observer) {\n var handler = function (event) {\n var output = {\n kind: 'unhandledrejection',\n };\n if (event.reason instanceof Error) {\n output.message = event.reason.message;\n output.stack = event.reason.stack;\n }\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 function () {\n globalScope.removeEventListener('unhandledrejection', handler);\n };\n });\n};\nexport var createErrorObservable = function () {\n var unhandledErrorObservable = merge(createUnhandledErrorObservable(), createUnhandledRejectionObservable());\n return merge(unhandledErrorObservable, createConsoleErrorObservable());\n};\n//# sourceMappingURL=observables.js.map","import { __assign, __awaiter, __generator, __read, __spreadArray, __values } from \"tslib\";\n/* eslint-disable no-restricted-globals */\nimport { DEFAULT_CSS_SELECTOR_ALLOWLIST, DEFAULT_ACTION_CLICK_ALLOWLIST, DEFAULT_DATA_ATTRIBUTE_PREFIX, getGlobalScope, multicast, } from '@amplitude/analytics-core';\nimport { VERSION } from './version';\nimport * as constants from './constants';\nimport { createShouldTrackEvent, } from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport { createClickObservable, createMutationObservable } from './observables';\nimport { createLabeledEventToTriggerMap, createTriggerEvaluator, groupLabeledEventIdsByEventType, } from './pageActions/triggers';\nimport { DataExtractor } from './data-extractor';\nimport { Observable } from '@amplitude/analytics-core';\nexport var ObservablesEnum;\n(function (ObservablesEnum) {\n ObservablesEnum[\"ClickObservable\"] = \"clickObservable\";\n ObservablesEnum[\"ChangeObservable\"] = \"changeObservable\";\n // ErrorObservable = 'errorObservable',\n ObservablesEnum[\"NavigateObservable\"] = \"navigateObservable\";\n ObservablesEnum[\"MutationObservable\"] = \"mutationObservable\";\n ObservablesEnum[\"BrowserErrorObservable\"] = \"browserErrorObservable\";\n ObservablesEnum[\"SelectionObservable\"] = \"selectionObservable\";\n})(ObservablesEnum || (ObservablesEnum = {}));\nexport var autocapturePlugin = function (options, context) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n if (options === void 0) { options = {}; }\n // Set the plugin version tag\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n context === null || context === void 0 ? void 0 : context.diagnosticsClient.setTag('plugin.autocapture.version', VERSION);\n var _j = options.dataAttributePrefix, dataAttributePrefix = _j === void 0 ? DEFAULT_DATA_ATTRIBUTE_PREFIX : _j, _k = options.visualTaggingOptions, visualTaggingOptions = _k === void 0 ? {\n enabled: true,\n messenger: new WindowMessenger(),\n } : _k;\n options.cssSelectorAllowlist = (_a = options.cssSelectorAllowlist) !== null && _a !== void 0 ? _a : DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = (_b = options.actionClickAllowlist) !== null && _b !== void 0 ? _b : DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = (_c = options.debounceTime) !== null && _c !== void 0 ? _c : 0;\n options.pageUrlExcludelist = (_d = options.pageUrlExcludelist) === null || _d === void 0 ? void 0 : _d.reduce(function (acc, 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 }\n catch (regexError) {\n console.warn(\"Invalid regex pattern: \".concat(excludePattern.pattern), regexError);\n return acc;\n }\n }\n return acc;\n }, []);\n var name = constants.PLUGIN_NAME;\n var type = 'enrichment';\n var subscriptions = [];\n // Create data extractor based on options\n var dataExtractor = new DataExtractor(options, context);\n // Create observables on events on the window\n var createObservables = function () {\n var _a;\n var clickObservable = multicast(createClickObservable().map(function (click) {\n return dataExtractor.addAdditionalEventProperties(click, 'click', options.cssSelectorAllowlist, dataAttributePrefix);\n }));\n var changeObservable = multicast(new Observable(function (observer) {\n var _a;\n var handler = function (changeEvent) {\n var enrichedChangeEvent = dataExtractor.addAdditionalEventProperties(changeEvent, 'change', options.cssSelectorAllowlist, dataAttributePrefix);\n observer.next(enrichedChangeEvent);\n };\n /* istanbul ignore next */\n (_a = getGlobalScope()) === null || _a === void 0 ? void 0 : _a.document.addEventListener('change', handler, { capture: true });\n /* istanbul ignore next */\n return function () { var _a; return (_a = getGlobalScope()) === null || _a === void 0 ? void 0 : _a.document.removeEventListener('change', handler); };\n }));\n // Create Observable from unhandled errors\n // const errorObservable = fromEvent<ErrorEvent>(window, 'error').pipe(\n // map((error) => addAdditionalEventProperties(error, 'error')),\n // );\n // Create observable for URL changes\n var navigateObservable;\n /* istanbul ignore next */\n if (window.navigation) {\n navigateObservable = multicast(new Observable(function (observer) {\n var handler = function (navigateEvent) {\n var enrichedNavigateEvent = dataExtractor.addAdditionalEventProperties(navigateEvent, 'navigate', options.cssSelectorAllowlist, dataAttributePrefix);\n observer.next(enrichedNavigateEvent);\n };\n window.navigation.addEventListener('navigate', handler);\n return function () {\n window.navigation.removeEventListener('navigate', handler);\n };\n }));\n }\n var mutationObservable = multicast(createMutationObservable().map(function (mutation) {\n return dataExtractor.addAdditionalEventProperties(mutation, 'mutation', options.cssSelectorAllowlist, dataAttributePrefix);\n }));\n return _a = {},\n _a[ObservablesEnum.ChangeObservable] = changeObservable,\n // [ObservablesEnum.ErrorObservable]: errorObservable,\n _a[ObservablesEnum.ClickObservable] = clickObservable,\n _a[ObservablesEnum.MutationObservable] = mutationObservable,\n _a[ObservablesEnum.NavigateObservable] = navigateObservable,\n _a;\n };\n // Group labeled events by event type (eg. click, change)\n var groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values((_f = (_e = options.pageActions) === null || _e === void 0 ? void 0 : _e.labeledEvents) !== null && _f !== void 0 ? _f : {}));\n var labeledEventToTriggerMap = createLabeledEventToTriggerMap((_h = (_g = options.pageActions) === null || _g === void 0 ? void 0 : _g.triggers) !== null && _h !== void 0 ? _h : []);\n // Evaluate triggers for the given event by running the actions associated with the matching triggers\n var evaluateTriggers = createTriggerEvaluator(groupedLabeledEvents, labeledEventToTriggerMap, dataExtractor, options);\n // Function to recalculate internal variables when remote config is updated\n var recomputePageActionsData = function (remotePageActions) {\n var _a, _b;\n if (remotePageActions) {\n // Merge remote config with local options\n options.pageActions = __assign(__assign({}, options.pageActions), remotePageActions);\n // Recalculate internal variables\n groupedLabeledEvents = groupLabeledEventIdsByEventType(Object.values((_a = options.pageActions.labeledEvents) !== null && _a !== void 0 ? _a : {}));\n labeledEventToTriggerMap = createLabeledEventToTriggerMap((_b = options.pageActions.triggers) !== null && _b !== void 0 ? _b : []);\n // Update evaluateTriggers function\n evaluateTriggers.update(groupedLabeledEvents, labeledEventToTriggerMap, options);\n }\n };\n var setup = function (config, amplitude) { return __awaiter(void 0, void 0, void 0, function () {\n var shouldTrackEvent, shouldTrackActionClick, allObservables, clickTrackingSubscription, changeSubscription, actionClickSubscription, allowlist, actionClickAllowlist;\n var _a, _b;\n return __generator(this, function (_c) {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return [2 /*return*/];\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 }\n else {\n config.remoteConfigClient.subscribe('configs.analyticsSDK.pageActions', 'all', function (remoteConfig) {\n recomputePageActionsData(remoteConfig);\n });\n }\n }\n shouldTrackEvent = createShouldTrackEvent(options, options.cssSelectorAllowlist);\n shouldTrackActionClick = createShouldTrackEvent(options, options.actionClickAllowlist);\n allObservables = createObservables();\n clickTrackingSubscription = trackClicks({\n allObservables: allObservables,\n amplitude: amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(clickTrackingSubscription);\n changeSubscription = trackChange({\n allObservables: allObservables,\n getEventProperties: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return dataExtractor.getEventProperties.apply(dataExtractor, __spreadArray(__spreadArray([], __read(args), false), [dataAttributePrefix], false));\n },\n amplitude: amplitude,\n shouldTrackEvent: shouldTrackEvent,\n evaluateTriggers: evaluateTriggers.evaluate.bind(evaluateTriggers),\n });\n subscriptions.push(changeSubscription);\n actionClickSubscription = trackActionClick({\n allObservables: allObservables,\n options: options,\n getEventProperties: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return dataExtractor.getEventProperties.apply(dataExtractor, __spreadArray(__spreadArray([], __read(args), false), [dataAttributePrefix], false));\n },\n amplitude: amplitude,\n shouldTrackEvent: shouldTrackEvent,\n shouldTrackActionClick: shouldTrackActionClick,\n });\n if (actionClickSubscription) {\n subscriptions.push(actionClickSubscription);\n }\n /* istanbul ignore next */\n (_a = config === null || config === void 0 ? void 0 : config.loggerProvider) === null || _a === void 0 ? void 0 : _a.log(\"\".concat(name, \" has been successfully added.\"));\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n allowlist = options.cssSelectorAllowlist;\n actionClickAllowlist = options.actionClickAllowlist;\n /* istanbul ignore next */\n (_b = visualTaggingOptions.messenger) === null || _b === void 0 ? void 0 : _b.setup(__assign(__assign({ dataExtractor: dataExtractor, logger: config === null || config === void 0 ? void 0 : config.loggerProvider }, ((config === null || config === void 0 ? void 0 : config.serverZone) && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] })), { isElementSelectable: createShouldTrackEvent(options, __spreadArray(__spreadArray([], __read(allowlist), false), __read(actionClickAllowlist), false)), cssSelectorAllowlist: allowlist, actionClickAllowlist: actionClickAllowlist }));\n }\n return [2 /*return*/];\n });\n }); };\n var execute = function (event) { return __awaiter(void 0, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2 /*return*/, event];\n });\n }); };\n var teardown = function () { return __awaiter(void 0, void 0, void 0, function () {\n var subscriptions_1, subscriptions_1_1, subscription;\n var e_1, _a;\n return __generator(this, function (_b) {\n try {\n for (subscriptions_1 = __values(subscriptions), subscriptions_1_1 = subscriptions_1.next(); !subscriptions_1_1.done; subscriptions_1_1 = subscriptions_1.next()) {\n subscription = subscriptions_1_1.value;\n subscription.unsubscribe();\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (subscriptions_1_1 && !subscriptions_1_1.done && (_a = subscriptions_1.return)) _a.call(subscriptions_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return [2 /*return*/];\n });\n }); };\n return {\n name: name,\n type: type,\n setup: setup,\n execute: execute,\n teardown: teardown,\n };\n};\n//# sourceMappingURL=autocapture-plugin.js.map","import { __values } from \"tslib\";\nimport { matchEventToFilter } from './matchEventToFilter';\nimport { executeActions } from './actions';\nvar eventTypeToBrowserEventMap = {\n '[Amplitude] Element Clicked': 'click',\n '[Amplitude] Element Changed': 'change',\n};\n// groups labeled events by event type\n// skips any labeled events with malformed definitions or unexpected event_type\nexport var groupLabeledEventIdsByEventType = function (labeledEvents) {\n var e_1, _a, e_2, _b;\n // Initialize all event types with empty sets\n var groupedLabeledEvents = Object.values(eventTypeToBrowserEventMap).reduce(function (acc, browserEvent) {\n acc[browserEvent] = new Set();\n return acc;\n }, {});\n // If there are no labeled events, return the initialized groupedLabeledEvents\n if (!labeledEvents) {\n return groupedLabeledEvents;\n }\n try {\n // Group labeled events by event type\n for (var labeledEvents_1 = __values(labeledEvents), labeledEvents_1_1 = labeledEvents_1.next(); !labeledEvents_1_1.done; labeledEvents_1_1 = labeledEvents_1.next()) {\n var le = labeledEvents_1_1.value;\n try {\n try {\n for (var _c = (e_2 = void 0, __values(le.definition)), _d = _c.next(); !_d.done; _d = _c.next()) {\n var def = _d.value;\n var browserEvent = eventTypeToBrowserEventMap[def.event_type];\n if (browserEvent) {\n groupedLabeledEvents[browserEvent].add(le.id);\n }\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_d && !_d.done && (_b = _c.return)) _b.call(_c);\n }\n finally { if (e_2) throw e_2.error; }\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 === null || le === void 0 ? void 0 : le.id, e);\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (labeledEvents_1_1 && !labeledEvents_1_1.done && (_a = labeledEvents_1.return)) _a.call(labeledEvents_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return groupedLabeledEvents;\n};\n// TODO: add tests\nexport var createLabeledEventToTriggerMap = function (triggers) {\n var e_3, _a, e_4, _b;\n var labeledEventToTriggerMap = new Map();\n try {\n for (var triggers_1 = __values(triggers), triggers_1_1 = triggers_1.next(); !triggers_1_1.done; triggers_1_1 = triggers_1.next()) {\n var trigger = triggers_1_1.value;\n try {\n for (var _c = (e_4 = void 0, __values(trigger.conditions)), _d = _c.next(); !_d.done; _d = _c.next()) {\n var condition = _d.value;\n if (condition.type === 'LABELED_EVENT') {\n var eventId = condition.match.eventId;\n // Get existing triggers for this event ID or initialize empty array\n var 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 catch (e_4_1) { e_4 = { error: e_4_1 }; }\n finally {\n try {\n if (_d && !_d.done && (_b = _c.return)) _b.call(_c);\n }\n finally { if (e_4) throw e_4.error; }\n }\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (triggers_1_1 && !triggers_1_1.done && (_a = triggers_1.return)) _a.call(triggers_1);\n }\n finally { if (e_3) throw e_3.error; }\n }\n return labeledEventToTriggerMap;\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 var matchEventToLabeledEvents = function (event, labeledEvents) {\n return labeledEvents.filter(function (le) {\n return le.definition.some(function (def) {\n return (eventTypeToBrowserEventMap[def.event_type] === event.type &&\n def.filters.every(function (filter) { return matchEventToFilter(event, filter); }));\n });\n });\n};\nexport var matchLabeledEventsToTriggers = function (labeledEvents, leToTriggerMap) {\n var e_5, _a, e_6, _b;\n var matchingTriggers = new Set();\n try {\n for (var labeledEvents_2 = __values(labeledEvents), labeledEvents_2_1 = labeledEvents_2.next(); !labeledEvents_2_1.done; labeledEvents_2_1 = labeledEvents_2.next()) {\n var le = labeledEvents_2_1.value;\n var triggers = leToTriggerMap.get(le.id);\n if (triggers) {\n try {\n for (var triggers_2 = (e_6 = void 0, __values(triggers)), triggers_2_1 = triggers_2.next(); !triggers_2_1.done; triggers_2_1 = triggers_2.next()) {\n var trigger = triggers_2_1.value;\n matchingTriggers.add(trigger);\n }\n }\n catch (e_6_1) { e_6 = { error: e_6_1 }; }\n finally {\n try {\n if (triggers_2_1 && !triggers_2_1.done && (_b = triggers_2.return)) _b.call(triggers_2);\n }\n finally { if (e_6) throw e_6.error; }\n }\n }\n }\n }\n catch (e_5_1) { e_5 = { error: e_5_1 }; }\n finally {\n try {\n if (labeledEvents_2_1 && !labeledEvents_2_1.done && (_a = labeledEvents_2.return)) _a.call(labeledEvents_2);\n }\n finally { if (e_5) throw e_5.error; }\n }\n return Array.from(matchingTriggers);\n};\nvar TriggerEvaluator = /** @class */ (function () {\n function TriggerEvaluator(groupedLabeledEvents, labeledEventToTriggerMap, dataExtractor, options) {\n this.groupedLabeledEvents = groupedLabeledEvents;\n this.labeledEventToTriggerMap = labeledEventToTriggerMap;\n this.dataExtractor = dataExtractor;\n this.options = options;\n }\n TriggerEvaluator.prototype.evaluate = function (event) {\n var e_7, _a;\n // If there is no pageActions, return the event as is\n var pageActions = this.options.pageActions;\n if (!pageActions) {\n return event;\n }\n // Find matching labeled events\n var matchingLabeledEvents = matchEventToLabeledEvents(event, Array.from(this.groupedLabeledEvents[event.type]).map(function (id) { return pageActions.labeledEvents[id]; }));\n // Find matching conditions\n var matchingTriggers = matchLabeledEventsToTriggers(matchingLabeledEvents, this.labeledEventToTriggerMap);\n try {\n for (var matchingTriggers_1 = __values(matchingTriggers), matchingTriggers_1_1 = matchingTriggers_1.next(); !matchingTriggers_1_1.done; matchingTriggers_1_1 = matchingTriggers_1.next()) {\n var trigger = matchingTriggers_1_1.value;\n executeActions(trigger.actions, event, this.dataExtractor);\n }\n }\n catch (e_7_1) { e_7 = { error: e_7_1 }; }\n finally {\n try {\n if (matchingTriggers_1_1 && !matchingTriggers_1_1.done && (_a = matchingTriggers_1.return)) _a.call(matchingTriggers_1);\n }\n finally { if (e_7) throw e_7.error; }\n }\n return event;\n };\n TriggerEvaluator.prototype.update = function (groupedLabeledEvents, labeledEventToTriggerMap, options) {\n this.groupedLabeledEvents = groupedLabeledEvents;\n this.labeledEventToTriggerMap = labeledEventToTriggerMap;\n this.options = options;\n };\n return TriggerEvaluator;\n}());\nexport { TriggerEvaluator };\nexport var createTriggerEvaluator = function (groupedLabeledEvents, labeledEventToTriggerMap, dataExtractor, options) {\n return new TriggerEvaluator(groupedLabeledEvents, labeledEventToTriggerMap, dataExtractor, options);\n};\n//# sourceMappingURL=triggers.js.map","/**\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 var matchEventToFilter = function (event, filter) {\n try {\n if (filter.subprop_key === '[Amplitude] Element Text') {\n // TODO: add support for the other operators\n return (filter.subprop_op === 'is' &&\n filter.subprop_value.includes(event.targetElementProperties['[Amplitude] Element Text']));\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 (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//# sourceMappingURL=matchEventToFilter.js.map","import { filterOutNonTrackableEvents } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\nexport function trackClicks(_a) {\n var amplitude = _a.amplitude, allObservables = _a.allObservables, shouldTrackEvent = _a.shouldTrackEvent, evaluateTriggers = _a.evaluateTriggers;\n var clickObservable = allObservables.clickObservable;\n var clickObservableFiltered = clickObservable\n .filter(filterOutNonTrackableEvents)\n .filter(function (click) {\n // Only track clicks on elements that should be tracked,\n return shouldTrackEvent('click', click.closestTrackedAncestor);\n })\n .map(function (click) { return evaluateTriggers(click); });\n var clicks = clickObservableFiltered;\n return clicks.subscribe(function (click) {\n /* istanbul ignore next */\n amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(AMPLITUDE_ELEMENT_CLICKED_EVENT, click.targetElementProperties);\n });\n}\n//# sourceMappingURL=track-click.js.map","import { filterOutNonTrackableEvents, } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CHANGED_EVENT } from '../constants';\nexport function trackChange(_a) {\n var amplitude = _a.amplitude, allObservables = _a.allObservables, getEventProperties = _a.getEventProperties, shouldTrackEvent = _a.shouldTrackEvent, evaluateTriggers = _a.evaluateTriggers;\n var changeObservable = allObservables.changeObservable;\n var filteredChangeObservable = changeObservable\n .filter(filterOutNonTrackableEvents)\n .filter(function (changeEvent) {\n // Only track change on elements that should be tracked,\n return shouldTrackEvent('change', changeEvent.closestTrackedAncestor);\n })\n .map(function (changeEvent) { return evaluateTriggers(changeEvent); });\n return filteredChangeObservable.subscribe(function (changeEvent) {\n /* istanbul ignore next */\n amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(AMPLITUDE_ELEMENT_CHANGED_EVENT, getEventProperties('change', changeEvent.closestTrackedAncestor));\n });\n}\n//# sourceMappingURL=track-change.js.map","import { merge, asyncMap } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, getClosestElement, } from '../helpers';\nimport { AMPLITUDE_ELEMENT_CLICKED_EVENT } from '../constants';\nexport function trackActionClick(_a) {\n var amplitude = _a.amplitude, allObservables = _a.allObservables, options = _a.options, getEventProperties = _a.getEventProperties, shouldTrackEvent = _a.shouldTrackEvent, shouldTrackActionClick = _a.shouldTrackActionClick;\n var clickObservable = allObservables.clickObservable, mutationObservable = allObservables.mutationObservable, navigateObservable = allObservables.navigateObservable;\n var filteredClickObservable = clickObservable\n .filter(function (click) {\n return !shouldTrackEvent('click', click.closestTrackedAncestor);\n })\n .map(function (click) {\n // overwrite the closestTrackedAncestor with the closest element that is on the actionClickAllowlist\n var closestActionClickEl = getClosestElement(click.event.target, options.actionClickAllowlist);\n click.closestTrackedAncestor = closestActionClickEl;\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(function (clickEvent) {\n // Only track change on elements that should be tracked\n return shouldTrackActionClick('click', clickEvent.closestTrackedAncestor);\n });\n var mutationOrNavigate = navigateObservable ? merge(mutationObservable, navigateObservable) : mutationObservable;\n var clickMutationNavigateObservable = merge(filteredClickObservable, mutationOrNavigate);\n var actionClickTimer = null;\n var lastClickEvent = null;\n var actionClickObservable = asyncMap(clickMutationNavigateObservable, function (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 // set a timer to clear last click event if no mutation event between now and 500ms\n actionClickTimer = setTimeout(function () {\n actionClickTimer = null;\n lastClickEvent = null;\n }, 500);\n return Promise.resolve(null);\n }\n else {\n // if mutation/navigation + last click event, then it's an action click\n if (lastClickEvent) {\n var event_1 = lastClickEvent;\n lastClickEvent = null;\n return Promise.resolve(event_1);\n }\n }\n return Promise.resolve(null);\n });\n return actionClickObservable.subscribe(function (actionClick) {\n if (!actionClick)\n return;\n /* istanbul ignore next */\n amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(AMPLITUDE_ELEMENT_CLICKED_EVENT, getEventProperties('click', actionClick.closestTrackedAncestor));\n });\n}\n//# sourceMappingURL=track-action-click.js.map","import { __assign } from \"tslib\";\nimport { merge, asyncMap } from '@amplitude/analytics-core';\nimport { filterOutNonTrackableEvents, MouseButton } from '../helpers';\nimport { AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT } from '../constants';\nvar DEAD_CLICK_TIMEOUT = 3000; // 3 seconds to wait for an activity to happen\nvar CHANGE_EVENTS = ['mutation', 'navigate'];\nexport function trackDeadClick(_a) {\n var amplitude = _a.amplitude, allObservables = _a.allObservables, getEventProperties = _a.getEventProperties, shouldTrackDeadClick = _a.shouldTrackDeadClick;\n var clickObservable = allObservables.clickObservable, mutationObservable = allObservables.mutationObservable, navigateObservable = allObservables.navigateObservable;\n var filteredClickObservable = clickObservable.filter(function (click) {\n return (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 /* istanbul ignore next */\n var changeObservables = navigateObservable ? merge(mutationObservable, navigateObservable) : mutationObservable;\n var clicksAndChangeObservable = merge(filteredClickObservable, changeObservables);\n var deadClickTimer = null;\n var deadClickObservable = asyncMap(clicksAndChangeObservable, function (event) {\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 }\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(function (resolve) {\n deadClickTimer = setTimeout(function () {\n resolve(event);\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 return deadClickObservable.subscribe(function (actionClick) {\n if (!actionClick)\n return;\n var deadClickEvent = {\n '[Amplitude] X': actionClick.event.clientX,\n '[Amplitude] Y': actionClick.event.clientY,\n };\n amplitude.track(AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT, __assign(__assign({}, getEventProperties('click', actionClick.closestTrackedAncestor)), deadClickEvent), { time: actionClick.timestamp });\n });\n}\n//# sourceMappingURL=track-dead-click.js.map","import { __assign, __awaiter, __generator } from \"tslib\";\nimport { asyncMap, DEFAULT_RAGE_CLICK_THRESHOLD, DEFAULT_RAGE_CLICK_WINDOW_MS, DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD, } from '@amplitude/analytics-core';\nimport { AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT } from '../constants';\nvar RAGE_CLICK_THRESHOLD = DEFAULT_RAGE_CLICK_THRESHOLD;\nvar RAGE_CLICK_WINDOW_MS = DEFAULT_RAGE_CLICK_WINDOW_MS;\nvar RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD = DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD;\nfunction addCoordinates(regionBox, click) {\n var _a, _b, _c, _d;\n var _e = click.event, pageX = _e.pageX, pageY = _e.pageY;\n regionBox.yMin = Math.min((_a = regionBox.yMin) !== null && _a !== void 0 ? _a : pageY, pageY);\n regionBox.yMax = Math.max((_b = regionBox.yMax) !== null && _b !== void 0 ? _b : pageY, pageY);\n regionBox.xMin = Math.min((_c = regionBox.xMin) !== null && _c !== void 0 ? _c : pageX, pageX);\n regionBox.xMax = Math.max((_d = regionBox.xMax) !== null && _d !== void 0 ? _d : 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}\nfunction getRageClickAnalyticsEvent(clickWindow) {\n /* istanbul ignore if */\n if (clickWindow.length === 0) {\n return null;\n }\n var firstClick = clickWindow[0];\n var lastClick = clickWindow[clickWindow.length - 1];\n var rageClickEvent = __assign({ '[Amplitude] Begin Time': new Date(firstClick.timestamp).toISOString(), '[Amplitude] End Time': new Date(lastClick.timestamp).toISOString(), '[Amplitude] Duration': lastClick.timestamp - firstClick.timestamp, '[Amplitude] Clicks': clickWindow.map(function (click) { return ({\n X: click.event.pageX,\n Y: click.event.pageY,\n Time: click.timestamp,\n }); }), '[Amplitude] Click Count': clickWindow.length }, firstClick.targetElementProperties);\n return { rageClickEvent: rageClickEvent, time: firstClick.timestamp };\n}\nfunction isClickOutsideRageClickWindow(clickWindow, click) {\n var firstIndex = Math.max(0, clickWindow.length - RAGE_CLICK_THRESHOLD + 1);\n var firstClick = clickWindow[firstIndex];\n return click.timestamp - firstClick.timestamp >= RAGE_CLICK_WINDOW_MS;\n}\nfunction isNewElement(clickWindow, click) {\n return (clickWindow.length > 0 &&\n clickWindow[clickWindow.length - 1].closestTrackedAncestor !== click.closestTrackedAncestor);\n}\nexport function trackRageClicks(_a) {\n var _this = this;\n var amplitude = _a.amplitude, allObservables = _a.allObservables, shouldTrackRageClick = _a.shouldTrackRageClick;\n var clickObservable = allObservables.clickObservable, selectionObservable = allObservables.selectionObservable;\n // Keep track of all clicks within the sliding window\n var clickWindow = [];\n // Keep track of the region box for all clicks, to determine when a rage click is out of bounds\n var clickBoundingBox = {};\n var pendingRageClick = null;\n // helper function to reset the click window and region box\n function resetClickWindow(click) {\n clickWindow = [];\n clickBoundingBox = {};\n if (click) {\n addCoordinates(clickBoundingBox, click);\n clickWindow.push(click);\n }\n }\n var rageClickObservable = asyncMap(clickObservable.filter(function (click) { return shouldTrackRageClick('click', click.closestTrackedAncestor); }), function (click) { return __awaiter(_this, void 0, void 0, function () {\n var resolutionValue;\n return __generator(this, function (_a) {\n // add this click's coordinates to the bounding box\n addCoordinates(clickBoundingBox, click);\n resolutionValue = null;\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 (clickWindow.length === 0 ||\n isNewElement(clickWindow, click) ||\n isClickOutsideRageClickWindow(clickWindow, click) ||\n clickBoundingBox.isOutOfBounds) {\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 }\n else {\n clickWindow.push(click);\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 // 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 [2 /*return*/, new Promise(function (resolve) {\n pendingRageClick = {\n resolve: resolve,\n timerId: setTimeout(function () {\n resolve(getRageClickAnalyticsEvent(clickWindow));\n }, RAGE_CLICK_WINDOW_MS),\n };\n })];\n }\n return [2 /*return*/, null];\n });\n }); });\n // reset the click window when a selection change occurs\n /* istanbul ignore next */\n var selectionSubscription = selectionObservable === null || selectionObservable === void 0 ? void 0 : selectionObservable.subscribe(function () {\n resetClickWindow();\n });\n var rageClickSubscription = rageClickObservable.subscribe(function (data) {\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 return {\n unsubscribe: function () {\n rageClickSubscription.unsubscribe();\n /* istanbul ignore next */\n selectionSubscription === null || selectionSubscription === void 0 ? void 0 : selectionSubscription.unsubscribe();\n },\n };\n}\n//# sourceMappingURL=track-rage-click.js.map","import { __assign, __awaiter, __generator, __read, __spreadArray, __values } from \"tslib\";\n/* eslint-disable no-restricted-globals */\nimport { DEFAULT_DATA_ATTRIBUTE_PREFIX, multicast, Observable, DEFAULT_RAGE_CLICK_ALLOWLIST, DEFAULT_DEAD_CLICK_ALLOWLIST, } from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { createShouldTrackEvent } from './helpers';\nimport { trackDeadClick } from './autocapture/track-dead-click';\nimport { trackRageClicks } from './autocapture/track-rage-click';\nimport { ObservablesEnum } from './autocapture-plugin';\nimport { createClickObservable, createMutationObservable } from './observables';\nimport { DataExtractor } from './data-extractor';\n/**\n * Helper function to extract the css selector allowlist\n * from the frustration interactions options for a specific\n * autocapture feature.\n */\nfunction getCssSelectorAllowlist(options, attribute, defaultAllowlist, enabled) {\n if (!enabled) {\n return [];\n }\n var config = options[attribute];\n if (typeof config === 'object' &&\n config !== null &&\n 'cssSelectorAllowlist' in config &&\n Array.isArray(config.cssSelectorAllowlist)) {\n return config.cssSelectorAllowlist;\n }\n return defaultAllowlist;\n}\nexport var frustrationPlugin = function (options) {\n var _a;\n if (options === void 0) { options = {}; }\n var name = constants.FRUSTRATION_PLUGIN_NAME;\n var type = 'enrichment';\n var subscriptions = [];\n // Check if each feature is enabled\n var deadClicksEnabled = options.deadClicks !== false && options.deadClicks !== null;\n var rageClicksEnabled = options.rageClicks !== false && options.rageClicks !== null;\n // Get CSS selectors for enabled features\n var rageCssSelectors = getCssSelectorAllowlist(options, 'rageClicks', DEFAULT_RAGE_CLICK_ALLOWLIST, rageClicksEnabled);\n var deadCssSelectors = getCssSelectorAllowlist(options, 'deadClicks', DEFAULT_DEAD_CLICK_ALLOWLIST, deadClicksEnabled);\n var dataAttributePrefix = (_a = options.dataAttributePrefix) !== null && _a !== void 0 ? _a : DEFAULT_DATA_ATTRIBUTE_PREFIX;\n var dataExtractor = new DataExtractor(options);\n // combine the selector lists from enabled features to determine which clicked elements should be filtered\n var combinedCssSelectors = __spreadArray([], __read(new Set(__spreadArray(__spreadArray([], __read(rageCssSelectors), false), __read(deadCssSelectors), false))), false);\n // Create observables on events on the window\n var createObservables = function () {\n var _a;\n var clickObservable = multicast(createClickObservable('pointerdown').map(function (click) {\n return dataExtractor.addAdditionalEventProperties(click, 'click', combinedCssSelectors, dataAttributePrefix, true);\n }));\n var enrichedMutationObservable = multicast(createMutationObservable().map(function (mutation) {\n return dataExtractor.addAdditionalEventProperties(mutation, 'mutation', combinedCssSelectors, dataAttributePrefix);\n }));\n var enrichedNavigateObservable;\n if (window.navigation) {\n var navigateObservable = new Observable(function (observer) {\n var handler = function (event) {\n observer.next(__assign(__assign({}, event), { type: 'navigate' }));\n };\n window.navigation.addEventListener('navigate', handler);\n return function () {\n window.navigation.removeEventListener('navigate', handler);\n };\n });\n enrichedNavigateObservable = multicast(navigateObservable.map(function (navigate) {\n return dataExtractor.addAdditionalEventProperties(navigate, 'navigate', combinedCssSelectors, dataAttributePrefix);\n }));\n }\n var selectionObservable = multicast(new Observable(function (observer) {\n var handler = function () {\n var el = document.activeElement;\n // handle input and textarea\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 var start = void 0;\n var end = void 0;\n try {\n start = el.selectionStart;\n end = el.selectionEnd;\n if (start === end)\n return; // collapsed\n }\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 // handle non-input elements\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 var selection = window.getSelection();\n if (!selection || selection.isCollapsed)\n return;\n return observer.next();\n };\n window.document.addEventListener('selectionchange', handler);\n return function () {\n window.document.removeEventListener('selectionchange', handler);\n };\n }));\n return _a = {},\n _a[ObservablesEnum.ClickObservable] = clickObservable,\n _a[ObservablesEnum.MutationObservable] = enrichedMutationObservable,\n _a[ObservablesEnum.NavigateObservable] = enrichedNavigateObservable,\n _a[ObservablesEnum.SelectionObservable] = selectionObservable,\n _a;\n };\n var setup = function (config, amplitude) { return __awaiter(void 0, void 0, void 0, function () {\n var allObservables, shouldTrackRageClick, rageClickSubscription, shouldTrackDeadClick, deadClickSubscription;\n var _a;\n return __generator(this, function (_b) {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return [2 /*return*/];\n }\n allObservables = createObservables();\n // Create subscriptions only for enabled features\n if (rageClicksEnabled) {\n shouldTrackRageClick = createShouldTrackEvent(options, rageCssSelectors);\n rageClickSubscription = trackRageClicks({\n allObservables: allObservables,\n amplitude: amplitude,\n shouldTrackRageClick: shouldTrackRageClick,\n });\n subscriptions.push(rageClickSubscription);\n }\n if (deadClicksEnabled) {\n shouldTrackDeadClick = createShouldTrackEvent(options, deadCssSelectors);\n deadClickSubscription = trackDeadClick({\n amplitude: amplitude,\n allObservables: allObservables,\n getEventProperties: function (actionType, element) {\n return dataExtractor.getEventProperties(actionType, element, dataAttributePrefix);\n },\n shouldTrackDeadClick: shouldTrackDeadClick,\n });\n subscriptions.push(deadClickSubscription);\n }\n /* istanbul ignore next */\n (_a = config === null || config === void 0 ? void 0 : config.loggerProvider) === null || _a === void 0 ? void 0 : _a.log(\"\".concat(name, \" has been successfully added.\"));\n return [2 /*return*/];\n });\n }); };\n var execute = function (event) { return __awaiter(void 0, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2 /*return*/, event];\n });\n }); };\n var teardown = function () { return __awaiter(void 0, void 0, void 0, function () {\n var subscriptions_1, subscriptions_1_1, subscription;\n var e_1, _a;\n return __generator(this, function (_b) {\n try {\n for (subscriptions_1 = __values(subscriptions), subscriptions_1_1 = subscriptions_1.next(); !subscriptions_1_1.done; subscriptions_1_1 = subscriptions_1.next()) {\n subscription = subscriptions_1_1.value;\n subscription.unsubscribe();\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (subscriptions_1_1 && !subscriptions_1_1.done && (_a = subscriptions_1.return)) _a.call(subscriptions_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return [2 /*return*/];\n });\n }); };\n return {\n name: name,\n type: type,\n setup: setup,\n execute: execute,\n teardown: teardown,\n };\n};\n//# sourceMappingURL=frustration-plugin.js.map","import { __awaiter, __generator } from \"tslib\";\n/* eslint-disable no-restricted-globals */\nimport { networkObserver, NetworkEventCallback, } from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { Observable } from '@amplitude/analytics-core';\nimport { trackNetworkEvents } from './track-network-event';\nexport var ObservablesEnum;\n(function (ObservablesEnum) {\n ObservablesEnum[\"NetworkObservable\"] = \"networkObservable\";\n})(ObservablesEnum || (ObservablesEnum = {}));\nvar subscription;\nexport var networkCapturePlugin = function (options) {\n if (options === void 0) { options = {}; }\n var name = constants.PLUGIN_NAME;\n var type = 'enrichment';\n var logger;\n var addAdditionalEventProperties = function (event, type) {\n var baseEvent = {\n event: event,\n timestamp: Date.now(),\n type: type,\n };\n return baseEvent;\n };\n // Create observables on events on the window\n var createObservables = function () {\n var _a;\n var networkObservable = new Observable(function (observer) {\n var callback = new NetworkEventCallback(function (event) {\n var eventWithProperties = addAdditionalEventProperties(event, 'network');\n observer.next(eventWithProperties);\n });\n networkObserver.subscribe(callback, logger);\n return function () {\n networkObserver.unsubscribe(callback);\n };\n });\n return _a = {},\n _a[ObservablesEnum.NetworkObservable] = networkObservable,\n _a;\n };\n var setup = function (config, amplitude) { return __awaiter(void 0, void 0, void 0, function () {\n var allObservables;\n return __generator(this, function (_a) {\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return [2 /*return*/];\n }\n allObservables = createObservables();\n /* istanbul ignore next */\n logger = config === null || config === void 0 ? void 0 : config.loggerProvider;\n subscription = trackNetworkEvents({\n allObservables: allObservables,\n networkTrackingOptions: options,\n amplitude: amplitude,\n loggerProvider: logger,\n });\n /* istanbul ignore next */\n logger === null || logger === void 0 ? void 0 : logger.log(\"\".concat(name, \" has been successfully added.\"));\n return [2 /*return*/];\n });\n }); };\n /* istanbul ignore next */\n var execute = function (event) { return __awaiter(void 0, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2 /*return*/, event];\n });\n }); };\n var teardown = function () { return __awaiter(void 0, void 0, void 0, function () {\n return __generator(this, function (_a) {\n subscription.unsubscribe();\n return [2 /*return*/];\n });\n }); };\n return {\n name: name,\n type: type,\n setup: setup,\n execute: execute,\n teardown: teardown,\n };\n};\n//# sourceMappingURL=network-capture-plugin.js.map","export var PLUGIN_NAME = '@amplitude/plugin-network-capture-browser';\nexport var AMPLITUDE_NETWORK_REQUEST_EVENT = '[Amplitude] Network Request';\n// TODO: when @experimental is removed from responseHeaders and requestHeaders,\n// remove this constant or set it to false\nexport var IS_HEADER_CAPTURE_EXPERIMENTAL = true;\n//# sourceMappingURL=constants.js.map","import { __awaiter, __generator, __read, __spreadArray, __values } from \"tslib\";\nimport { getGlobalScope, isUrlMatchAllowlist, SAFE_HEADERS, } from '@amplitude/analytics-core';\nimport { AMPLITUDE_NETWORK_REQUEST_EVENT, IS_HEADER_CAPTURE_EXPERIMENTAL } from './constants';\nvar DEFAULT_STATUS_CODE_RANGE = '500-599';\nfunction wildcardMatch(str, pattern) {\n // Escape all regex special characters except for *\n var escapedPattern = pattern.replace(/[-[\\]{}()+?.,\\\\^$|#\\s]/g, '\\\\$&');\n // Replace * with .*\n var regexPattern = '^' + escapedPattern.replace(/\\*/g, '.*') + '$';\n var regex = new RegExp(regexPattern);\n return regex.test(str);\n}\nfunction isStatusCodeInRange(statusCode, range) {\n var e_1, _a;\n var ranges = range.split(',');\n try {\n for (var ranges_1 = __values(ranges), ranges_1_1 = ranges_1.next(); !ranges_1_1.done; ranges_1_1 = ranges_1.next()) {\n var r = ranges_1_1.value;\n var _b = __read(r.split('-').map(Number), 2), start = _b[0], end = _b[1];\n if (statusCode === start && end === undefined) {\n return true;\n }\n if (statusCode >= start && statusCode <= end) {\n return true;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (ranges_1_1 && !ranges_1_1.done && (_a = ranges_1.return)) _a.call(ranges_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return false;\n}\nfunction isCaptureRuleMatch(rule, hostname, status, url, method) {\n // check if the host is in the allowed hosts\n if (rule.hosts && !rule.hosts.find(function (host) { return wildcardMatch(hostname, host); })) {\n return;\n }\n // check if the URL is in the allowed URL patterns\n if (url && rule.urls && !isUrlMatchAllowlist(url, rule.urls)) {\n return;\n }\n // check if the method is in the allowed methods\n if (method &&\n rule.methods &&\n !rule.methods.find(function (allowedMethod) { return method.toLowerCase() === allowedMethod.toLowerCase() || allowedMethod === '*'; })) {\n return;\n }\n // check if the status code is in the allowed range\n if (status || status === 0) {\n var statusCodeRange = rule.statusCodeRange || DEFAULT_STATUS_CODE_RANGE;\n if (!isStatusCodeInRange(status, statusCodeRange)) {\n return false;\n }\n }\n return true;\n}\nfunction parseUrl(url) {\n var _a;\n if (!url) {\n return;\n }\n try {\n /* istanbul ignore next */\n var currentHref = (_a = getGlobalScope()) === null || _a === void 0 ? void 0 : _a.location.href;\n var urlObj = new URL(url, currentHref);\n var query = urlObj.searchParams.toString();\n var fragment = urlObj.hash.replace('#', '');\n var href = urlObj.href;\n var host = urlObj.host;\n urlObj.hash = '';\n urlObj.search = '';\n var hrefWithoutQueryOrHash = urlObj.href;\n return { query: query, fragment: fragment, href: href, hrefWithoutQueryOrHash: hrefWithoutQueryOrHash, host: host };\n }\n catch (e) {\n /* istanbul ignore next */\n return;\n }\n}\nfunction isAmplitudeNetworkRequestEvent(host, requestWrapper) {\n if (host.includes('amplitude.com')) {\n try {\n var body = requestWrapper.body;\n if (typeof body !== 'string') {\n return false;\n }\n var bodyObj = JSON.parse(body);\n var events = bodyObj.events;\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n if (events.find(function (event) { return event.event_type === AMPLITUDE_NETWORK_REQUEST_EVENT; })) {\n return true;\n }\n }\n catch (e) {\n // do nothing\n }\n }\n return false;\n}\n/**\n * Takes a user provided header capture rule and returns a\n * HeaderCaptureRule object that sets proper default values.\n *\n * @param rule - The header capture rule to parse.\n * @returns A HeaderCaptureRule object.\n */\nexport function parseHeaderCaptureRule(rule) {\n if (typeof rule !== 'object' || rule === null) {\n // if rule is truthy or undefined, return SAFE_HEADERS\n if (rule) {\n return __spreadArray([], __read(SAFE_HEADERS), false);\n }\n else if (rule === undefined) {\n /* istanbul ignore next */\n var res = IS_HEADER_CAPTURE_EXPERIMENTAL ? undefined : __spreadArray([], __read(SAFE_HEADERS), false);\n return res;\n }\n return;\n }\n // if the rule is defined but empty, return undefined\n if (rule.length === 0) {\n return;\n }\n return rule;\n}\nfunction isBodyCaptureRuleEmpty(rule) {\n var _a, _b;\n /* istanbul ignore next */\n return !((_a = rule === null || rule === void 0 ? void 0 : rule.allowlist) === null || _a === void 0 ? void 0 : _a.length) && !((_b = rule === null || rule === void 0 ? void 0 : rule.blocklist) === null || _b === void 0 ? void 0 : _b.length);\n}\nexport function shouldTrackNetworkEvent(networkEvent, options) {\n var _a;\n if (options === void 0) { options = {}; }\n var urlObj = parseUrl(networkEvent.url);\n /* istanbul ignore if */\n if (!urlObj) {\n // if the URL failed to parse, do not track the event\n // this is a probably impossible case that would only happen if the URL is malformed\n /* istanbul ignore next */\n return false;\n }\n var host = urlObj.host;\n // false if is amplitude request and not configured to track amplitude requests\n if (options.ignoreAmplitudeRequests !== false &&\n (wildcardMatch(host, '*.amplitude.com') || wildcardMatch(host, 'amplitude.com'))) {\n return false;\n }\n // false if the host is in the ignore list\n if ((_a = options.ignoreHosts) === null || _a === void 0 ? void 0 : _a.find(function (ignoreHost) { return wildcardMatch(host, ignoreHost); })) {\n return false;\n }\n // false if the status code is not 500-599 and there are no captureRules\n if (!options.captureRules &&\n networkEvent.status !== undefined &&\n !isStatusCodeInRange(networkEvent.status, DEFAULT_STATUS_CODE_RANGE)) {\n return false;\n }\n if (options.captureRules) {\n // find the first capture rule, in reverse-order,\n // that is a match (true) or a miss (false)\n var isMatch_1;\n __spreadArray([], __read(options.captureRules), false).reverse().find(function (rule) {\n isMatch_1 = isCaptureRuleMatch(rule, host, networkEvent.status, networkEvent.url, networkEvent.method);\n if (isMatch_1) {\n var responseHeadersRule = parseHeaderCaptureRule(rule.responseHeaders);\n if (networkEvent.responseWrapper && responseHeadersRule) {\n var responseHeaders = networkEvent.responseWrapper.headers(responseHeadersRule);\n if (responseHeaders) {\n networkEvent.responseHeaders = responseHeaders;\n }\n }\n // if requestHeaders rule is specified, enrich the event with the request headers\n var requestHeadersRule = parseHeaderCaptureRule(rule.requestHeaders);\n if (networkEvent.requestWrapper && requestHeadersRule) {\n var requestHeaders = networkEvent.requestWrapper.headers(requestHeadersRule);\n if (requestHeaders) {\n networkEvent.requestHeaders = requestHeaders;\n }\n }\n // if responseBody rule is specified, enrich the event with the response body\n if (networkEvent.responseWrapper && rule.responseBody && !isBodyCaptureRuleEmpty(rule.responseBody)) {\n networkEvent.responseBodyJson = networkEvent.responseWrapper.json(rule.responseBody.allowlist, rule.responseBody.blocklist);\n }\n // if requestBody rule is specified, enrich the event with the request body\n if (networkEvent.requestWrapper && rule.requestBody && !isBodyCaptureRuleEmpty(rule.requestBody)) {\n networkEvent.requestBodyJson = networkEvent.requestWrapper.json(rule.requestBody.allowlist, rule.requestBody.blocklist);\n }\n }\n return isMatch_1 !== undefined;\n });\n // if we found a miss (false) or no match (undefined),\n // then do not track the event\n if (!isMatch_1) {\n return false;\n }\n }\n // skip Amplitude network requests to \"[Amplitude] Network Request\" to avoid infinite loop\n if (networkEvent.requestWrapper && isAmplitudeNetworkRequestEvent(host, networkEvent.requestWrapper)) {\n return false;\n }\n return true;\n}\nexport function logNetworkAnalyticsEvent(networkAnalyticsEvent, request, amplitude, loggerProvider) {\n return __awaiter(this, void 0, void 0, function () {\n var _a, requestBody, responseBody;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n if (!(request.requestBodyJson || request.responseBodyJson)) return [3 /*break*/, 2];\n return [4 /*yield*/, Promise.all([request.requestBodyJson, request.responseBodyJson])];\n case 1:\n _a = __read.apply(void 0, [_b.sent(), 2]), requestBody = _a[0], responseBody = _a[1];\n if (requestBody) {\n try {\n networkAnalyticsEvent['[Amplitude] Request Body'] = JSON.stringify(requestBody);\n }\n catch (e) {\n /* istanbul ignore next */\n loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.debug('Failed to stringify request body', e);\n }\n }\n if (responseBody) {\n try {\n networkAnalyticsEvent['[Amplitude] Response Body'] = JSON.stringify(responseBody);\n }\n catch (e) {\n /* istanbul ignore next */\n loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.debug('Failed to stringify response body');\n }\n }\n _b.label = 2;\n case 2:\n /* istanbul ignore next */\n amplitude === null || amplitude === void 0 ? void 0 : amplitude.track(AMPLITUDE_NETWORK_REQUEST_EVENT, networkAnalyticsEvent);\n return [2 /*return*/];\n }\n });\n });\n}\nexport function trackNetworkEvents(_a) {\n var allObservables = _a.allObservables, networkTrackingOptions = _a.networkTrackingOptions, amplitude = _a.amplitude, loggerProvider = _a.loggerProvider;\n var networkObservable = allObservables.networkObservable;\n var filteredNetworkObservable = networkObservable.filter(function (event) {\n // Only track network events that should be tracked\n return shouldTrackNetworkEvent(event.event, networkTrackingOptions);\n });\n return filteredNetworkObservable.subscribe(function (networkEvent) {\n var _a;\n var _b, _c;\n var request = networkEvent.event;\n // convert to NetworkAnalyticsEvent\n var urlObj = parseUrl(request.url);\n /* istanbul ignore if */\n if (!urlObj) {\n // if the URL failed to parse, do not track the event\n // this is a very unlikely case, because URL() shouldn't throw an exception\n // when the URL is a valid URL\n /* istanbul ignore next */\n return;\n }\n var responseBodySize = (_b = request.responseWrapper) === null || _b === void 0 ? void 0 : _b.bodySize;\n /* istanbul ignore next */\n var requestBodySize = (_c = request.requestWrapper) === null || _c === void 0 ? void 0 : _c.bodySize;\n var networkAnalyticsEvent = (_a = {},\n _a['[Amplitude] URL'] = urlObj.hrefWithoutQueryOrHash,\n _a['[Amplitude] URL Query'] = urlObj.query,\n _a['[Amplitude] URL Fragment'] = urlObj.fragment,\n _a['[Amplitude] Request Method'] = request.method,\n _a['[Amplitude] Status Code'] = request.status,\n _a['[Amplitude] Start Time'] = request.startTime,\n _a['[Amplitude] Completion Time'] = request.endTime,\n _a['[Amplitude] Duration'] = request.duration,\n _a['[Amplitude] Request Body Size'] = requestBodySize,\n _a['[Amplitude] Response Body Size'] = responseBodySize,\n _a['[Amplitude] Request Type'] = request.type,\n _a['[Amplitude] Request Headers'] = request.requestHeaders,\n _a['[Amplitude] Response Headers'] = request.responseHeaders,\n _a);\n // fire-and-forget promise that tracks the event\n void logNetworkAnalyticsEvent(networkAnalyticsEvent, request, amplitude, loggerProvider);\n });\n}\n//# sourceMappingURL=track-network-event.js.map","let e=-1;const t=t=>{addEventListener(\"pageshow\",(n=>{n.persisted&&(e=n.timeStamp,t(n))}),!0)},n=(e,t,n,i)=>{let s,o;return r=>{t.value>=0&&(r||i)&&(o=t.value-(s??0),(o||void 0===s)&&(s=t.value,t.delta=o,t.rating=((e,t)=>e>t[1]?\"poor\":e>t[0]?\"needs-improvement\":\"good\")(t.value,n),e(t)))}},i=e=>{requestAnimationFrame((()=>requestAnimationFrame((()=>e()))))},s=()=>{const e=performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},o=()=>{const e=s();return e?.activationStart??0},r=(t,n=-1)=>{const i=s();let r=\"navigate\";e>=0?r=\"back-forward-cache\":i&&(document.prerendering||o()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":i.type&&(r=i.type.replace(/_/g,\"-\")));return{name:t,value:n,rating:\"good\",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},c=new WeakMap;function a(e,t){return c.get(e)||c.set(e,new t),c.get(e)}class d{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],n=this.o.at(-1);this.i&&t&&n&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e)}}const h=(e,t,n={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const i=new PerformanceObserver((e=>{Promise.resolve().then((()=>{t(e.getEntries())}))}));return i.observe({type:e,buffered:!0,...n}),i}}catch{}},f=e=>{let t=!1;return()=>{t||(e(),t=!0)}};let u=-1;const l=new Set,m=()=>\"hidden\"!==document.visibilityState||document.prerendering?1/0:0,p=e=>{if(\"hidden\"===document.visibilityState){if(\"visibilitychange\"===e.type)for(const e of l)e();isFinite(u)||(u=\"visibilitychange\"===e.type?e.timeStamp:0,removeEventListener(\"prerenderingchange\",p,!0))}},v=()=>{if(u<0){const e=o(),n=document.prerendering?void 0:globalThis.performance.getEntriesByType(\"visibility-state\").filter((t=>\"hidden\"===t.name&&t.startTime>e))[0]?.startTime;u=n??m(),addEventListener(\"visibilitychange\",p,!0),addEventListener(\"prerenderingchange\",p,!0),t((()=>{setTimeout((()=>{u=m()}))}))}return{get firstHiddenTime(){return u},onHidden(e){l.add(e)}}},g=e=>{document.prerendering?addEventListener(\"prerenderingchange\",(()=>e()),!0):e()},y=[1800,3e3],E=(e,s={})=>{g((()=>{const c=v();let a,d=r(\"FCP\");const f=h(\"paint\",(e=>{for(const t of e)\"first-contentful-paint\"===t.name&&(f.disconnect(),t.startTime<c.firstHiddenTime&&(d.value=Math.max(t.startTime-o(),0),d.entries.push(t),a(!0)))}));f&&(a=n(e,d,y,s.reportAllChanges),t((t=>{d=r(\"FCP\"),a=n(e,d,y,s.reportAllChanges),i((()=>{d.value=performance.now()-t.timeStamp,a(!0)}))})))}))},b=[.1,.25],L=(e,s={})=>{const o=v();E(f((()=>{let c,f=r(\"CLS\",0);const u=a(s,d),l=e=>{for(const t of e)u.h(t);u.i>f.value&&(f.value=u.i,f.entries=u.o,c())},m=h(\"layout-shift\",l);m&&(c=n(e,f,b,s.reportAllChanges),o.onHidden((()=>{l(m.takeRecords()),c(!0)})),t((()=>{u.i=0,f=r(\"CLS\",0),c=n(e,f,b,s.reportAllChanges),i((()=>c()))})),setTimeout(c))})))};let P=0,T=1/0,_=0;const M=e=>{for(const t of e)t.interactionId&&(T=Math.min(T,t.interactionId),_=Math.max(_,t.interactionId),P=_?(_-T)/7+1:0)};let w;const C=()=>w?P:performance.interactionCount??0,I=()=>{\"interactionCount\"in performance||w||(w=h(\"event\",M,{type:\"event\",buffered:!0,durationThreshold:0}))};let F=0;class k{u=[];l=new Map;m;p;v(){F=C(),this.u.length=0,this.l.clear()}L(){const e=Math.min(this.u.length-1,Math.floor((C()-F)/50));return this.u[e]}h(e){if(this.m?.(e),!e.interactionId&&\"first-input\"!==e.entryType)return;const t=this.u.at(-1);let n=this.l.get(e.interactionId);if(n||this.u.length<10||e.duration>t.P){if(n?e.duration>n.P?(n.entries=[e],n.P=e.duration):e.duration===n.P&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],P:e.duration},this.l.set(n.id,n),this.u.push(n)),this.u.sort(((e,t)=>t.P-e.P)),this.u.length>10){const e=this.u.splice(10);for(const t of e)this.l.delete(t.id)}this.p?.(n)}}}const A=e=>{const t=globalThis.requestIdleCallback||setTimeout;\"hidden\"===document.visibilityState?e():(e=f(e),addEventListener(\"visibilitychange\",e,{once:!0,capture:!0}),t((()=>{e(),removeEventListener(\"visibilitychange\",e,{capture:!0})})))},B=[200,500],S=(e,i={})=>{if(!globalThis.PerformanceEventTiming||!(\"interactionId\"in PerformanceEventTiming.prototype))return;const s=v();g((()=>{I();let o,c=r(\"INP\");const d=a(i,k),f=e=>{A((()=>{for(const t of e)d.h(t);const t=d.L();t&&t.P!==c.value&&(c.value=t.P,c.entries=t.entries,o())}))},u=h(\"event\",f,{durationThreshold:i.durationThreshold??40});o=n(e,c,B,i.reportAllChanges),u&&(u.observe({type:\"first-input\",buffered:!0}),s.onHidden((()=>{f(u.takeRecords()),o(!0)})),t((()=>{d.v(),c=r(\"INP\"),o=n(e,c,B,i.reportAllChanges)})))}))};class N{m;h(e){this.m?.(e)}}const q=[2500,4e3],x=(e,s={})=>{g((()=>{const c=v();let d,u=r(\"LCP\");const l=a(s,N),m=e=>{s.reportAllChanges||(e=e.slice(-1));for(const t of e)l.h(t),t.startTime<c.firstHiddenTime&&(u.value=Math.max(t.startTime-o(),0),u.entries=[t],d())},p=h(\"largest-contentful-paint\",m);if(p){d=n(e,u,q,s.reportAllChanges);const o=f((()=>{m(p.takeRecords()),p.disconnect(),d(!0)})),c=e=>{e.isTrusted&&(A(o),removeEventListener(e.type,c,{capture:!0}))};for(const e of[\"keydown\",\"click\",\"visibilitychange\"])addEventListener(e,c,{capture:!0});t((t=>{u=r(\"LCP\"),d=n(e,u,q,s.reportAllChanges),i((()=>{u.value=performance.now()-t.timeStamp,d(!0)}))}))}}))},H=[800,1800],O=e=>{document.prerendering?g((()=>O(e))):\"complete\"!==document.readyState?addEventListener(\"load\",(()=>O(e)),!0):setTimeout(e)},$=(e,i={})=>{let c=r(\"TTFB\"),a=n(e,c,H,i.reportAllChanges);O((()=>{const d=s();d&&(c.value=Math.max(d.responseStart-o(),0),c.entries=[d],a(!0),t((()=>{c=r(\"TTFB\",0),a=n(e,c,H,i.reportAllChanges),a(!0)})))}))};export{b as CLSThresholds,y as FCPThresholds,B as INPThresholds,q as LCPThresholds,H as TTFBThresholds,L as onCLS,E as onFCP,S as onINP,x as onLCP,$ as onTTFB};\n","import { __awaiter, __generator } from \"tslib\";\n/* eslint-disable no-restricted-globals */\nimport { getGlobalScope, getDecodeURI, } from '@amplitude/analytics-core';\nimport { PLUGIN_NAME, WEB_VITALS_EVENT_NAME } from './constants';\nimport { onLCP, onINP, onCLS, onFCP, onTTFB } from 'web-vitals';\nfunction getMetricStartTime(metric) {\n var _a;\n /* istanbul ignore next */\n var startTime = ((_a = metric.entries[0]) === null || _a === void 0 ? void 0 : _a.startTime) || 0;\n return performance.timeOrigin + startTime;\n}\nfunction processMetric(metric) {\n return {\n value: metric.value,\n rating: metric.rating,\n delta: metric.delta,\n navigationType: metric.navigationType,\n id: metric.id,\n timestamp: Math.floor(getMetricStartTime(metric)),\n navigationStart: Math.floor(performance.timeOrigin),\n };\n}\nexport var webVitalsPlugin = function () {\n var visibilityListener = null;\n var globalScope = getGlobalScope();\n var doc = globalScope === null || globalScope === void 0 ? void 0 : globalScope.document;\n var location = globalScope === null || globalScope === void 0 ? void 0 : globalScope.location;\n var setup = function (config, amplitude) { return __awaiter(void 0, void 0, void 0, function () {\n var locationHref, webVitalsPayload;\n return __generator(this, function (_a) {\n if (doc === undefined) {\n return [2 /*return*/];\n }\n locationHref = getDecodeURI(/* istanbul ignore next */ (location === null || location === void 0 ? void 0 : location.href) || '', config.loggerProvider);\n webVitalsPayload = {\n '[Amplitude] Page Domain': /* istanbul ignore next */ (location === null || location === void 0 ? void 0 : location.hostname) || '',\n '[Amplitude] Page Location': locationHref,\n '[Amplitude] Page Path': getDecodeURI(/* istanbul ignore next */ (location === null || location === void 0 ? void 0 : location.pathname) || '', config.loggerProvider),\n '[Amplitude] Page Title': /* istanbul ignore next */ (typeof document !== 'undefined' && document.title) || '',\n '[Amplitude] Page URL': getDecodeURI(locationHref.split('?')[0], config.loggerProvider),\n };\n onLCP(function (metric) {\n webVitalsPayload['[Amplitude] LCP'] = processMetric(metric);\n });\n onFCP(function (metric) {\n webVitalsPayload['[Amplitude] FCP'] = processMetric(metric);\n });\n onINP(function (metric) {\n webVitalsPayload['[Amplitude] INP'] = processMetric(metric);\n });\n onCLS(function (metric) {\n webVitalsPayload['[Amplitude] CLS'] = processMetric(metric);\n });\n onTTFB(function (metric) {\n webVitalsPayload['[Amplitude] TTFB'] = processMetric(metric);\n });\n visibilityListener = function () {\n if (doc.visibilityState === 'hidden' && visibilityListener) {\n amplitude.track(WEB_VITALS_EVENT_NAME, webVitalsPayload);\n doc.removeEventListener('visibilitychange', visibilityListener);\n visibilityListener = null;\n }\n };\n doc.addEventListener('visibilitychange', visibilityListener);\n return [2 /*return*/];\n });\n }); };\n var execute = function (event) { return __awaiter(void 0, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2 /*return*/, event];\n });\n }); };\n var teardown = function () { return __awaiter(void 0, void 0, void 0, function () {\n return __generator(this, function (_a) {\n if (visibilityListener) {\n /* istanbul ignore next */\n doc === null || doc === void 0 ? void 0 : doc.removeEventListener('visibilitychange', visibilityListener);\n }\n return [2 /*return*/];\n });\n }); };\n return {\n name: PLUGIN_NAME,\n type: 'enrichment',\n setup: setup,\n execute: execute,\n teardown: teardown,\n };\n};\n//# sourceMappingURL=web-vitals-plugin.js.map","import { __assign, __awaiter, __generator, __read } from \"tslib\";\nimport { BrowserStorage, getDecodeURI, getGlobalScope, getPageTitle, replaceSensitiveString, SpecialEventType, } from '@amplitude/analytics-core';\nexport var CURRENT_PAGE_STORAGE_KEY = 'AMP_CURRENT_PAGE';\nexport var PREVIOUS_PAGE_STORAGE_KEY = 'AMP_PREVIOUS_PAGE';\nexport var URL_INFO_STORAGE_KEY = 'AMP_URL_INFO';\nvar PreviousPageType;\n(function (PreviousPageType) {\n PreviousPageType[\"Direct\"] = \"direct\";\n PreviousPageType[\"Internal\"] = \"internal\";\n PreviousPageType[\"External\"] = \"external\";\n})(PreviousPageType || (PreviousPageType = {}));\nexport var EXCLUDED_DEFAULT_EVENT_TYPES = new Set([\n SpecialEventType.IDENTIFY,\n SpecialEventType.GROUP_IDENTIFY,\n SpecialEventType.REVENUE,\n]);\nexport var isPageUrlEnrichmentEnabled = function (option) {\n if (typeof option === 'boolean') {\n return option;\n }\n if (typeof option === 'object' && option !== null && 'pageUrlEnrichment' in option) {\n return Boolean(option.pageUrlEnrichment);\n }\n return false;\n};\nexport var pageUrlEnrichmentPlugin = function (_a) {\n var _b = _a === void 0 ? {} : _a, _c = _b.internalDomains, internalDomains = _c === void 0 ? [] : _c;\n var globalScope = getGlobalScope();\n var sessionStorage = undefined;\n var isStorageEnabled = false;\n var loggerProvider = undefined;\n var isProxied = false;\n var isTracking = false;\n var getHostname = function (url) {\n var hostname;\n try {\n var decodedUrl = getDecodeURI(url, loggerProvider);\n hostname = new URL(decodedUrl).hostname;\n }\n catch (e) {\n /* istanbul ignore next */\n loggerProvider === null || loggerProvider === void 0 ? void 0 : loggerProvider.error('Could not parse URL: ', e);\n }\n return hostname;\n };\n var getPrevPageType = function (previousPage) {\n var currentDomain = (typeof location !== 'undefined' && location.hostname) || '';\n var previousPageDomain = previousPage ? getHostname(previousPage) : undefined;\n if (!previousPageDomain) {\n return PreviousPageType.Direct;\n }\n var isCurrentInternal = internalDomains.some(function (domain) { return currentDomain.indexOf(domain) !== -1; });\n var isPrevInternal = internalDomains.some(function (domain) { return previousPageDomain.indexOf(domain) !== -1; });\n if (currentDomain === previousPageDomain || (isPrevInternal && isCurrentInternal)) {\n return PreviousPageType.Internal;\n }\n return PreviousPageType.External;\n };\n var saveURLInfo = function () { return __awaiter(void 0, void 0, void 0, function () {\n var URLInfo, currentURL, storedCurrentURL, previousURL;\n var _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n if (!(sessionStorage && isStorageEnabled)) return [3 /*break*/, 3];\n return [4 /*yield*/, sessionStorage.get(URL_INFO_STORAGE_KEY)];\n case 1:\n URLInfo = _b.sent();\n currentURL = getDecodeURI((typeof location !== 'undefined' && location.href) || '');\n storedCurrentURL = (URLInfo === null || URLInfo === void 0 ? void 0 : URLInfo[CURRENT_PAGE_STORAGE_KEY]) || '';\n previousURL = void 0;\n if (currentURL === storedCurrentURL) {\n previousURL = (URLInfo === null || URLInfo === void 0 ? void 0 : URLInfo[PREVIOUS_PAGE_STORAGE_KEY]) || '';\n }\n else if (storedCurrentURL) {\n previousURL = storedCurrentURL;\n }\n else {\n previousURL = document.referrer || '';\n }\n return [4 /*yield*/, sessionStorage.set(URL_INFO_STORAGE_KEY, (_a = {},\n _a[CURRENT_PAGE_STORAGE_KEY] = currentURL,\n _a[PREVIOUS_PAGE_STORAGE_KEY] = previousURL,\n _a))];\n case 2:\n _b.sent();\n _b.label = 3;\n case 3: return [2 /*return*/];\n }\n });\n }); };\n var saveUrlInfoWrapper = function () {\n void saveURLInfo();\n };\n var plugin = {\n name: '@amplitude/plugin-page-url-enrichment-browser',\n type: 'enrichment',\n setup: function (config, _) { return __awaiter(void 0, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n loggerProvider = config.loggerProvider;\n loggerProvider.log('Installing @amplitude/plugin-page-url-enrichment-browser');\n isTracking = true;\n if (!globalScope) return [3 /*break*/, 2];\n sessionStorage = new BrowserStorage(globalScope.sessionStorage);\n return [4 /*yield*/, sessionStorage.isEnabled()];\n case 1:\n isStorageEnabled = _a.sent();\n globalScope.addEventListener('popstate', saveUrlInfoWrapper);\n if (!isProxied) {\n /* istanbul ignore next */\n // There is no global browser listener for changes to history, so we have\n // to modify pushState and replaceState directly.\n // https://stackoverflow.com/a/64927639\n // eslint-disable-next-line @typescript-eslint/unbound-method\n globalScope.history.pushState = new Proxy(globalScope.history.pushState, {\n apply: function (target, thisArg, _a) {\n var _b = __read(_a, 3), state = _b[0], unused = _b[1], url = _b[2];\n target.apply(thisArg, [state, unused, url]);\n if (isTracking) {\n saveUrlInfoWrapper();\n }\n },\n });\n // eslint-disable-next-line @typescript-eslint/unbound-method\n globalScope.history.replaceState = new Proxy(globalScope.history.replaceState, {\n apply: function (target, thisArg, _a) {\n var _b = __read(_a, 3), state = _b[0], unused = _b[1], url = _b[2];\n target.apply(thisArg, [state, unused, url]);\n if (isTracking) {\n saveUrlInfoWrapper();\n }\n },\n });\n isProxied = true;\n }\n _a.label = 2;\n case 2: return [2 /*return*/];\n }\n });\n }); },\n execute: function (event) { return __awaiter(void 0, void 0, void 0, function () {\n var locationHREF, URLInfo, updatedURLInfo, previousPage;\n var _a;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n locationHREF = getDecodeURI((typeof location !== 'undefined' && location.href) || '');\n if (!(sessionStorage && isStorageEnabled)) return [3 /*break*/, 5];\n return [4 /*yield*/, sessionStorage.get(URL_INFO_STORAGE_KEY)];\n case 1:\n URLInfo = _b.sent();\n if (!!(URLInfo === null || URLInfo === void 0 ? void 0 : URLInfo[CURRENT_PAGE_STORAGE_KEY])) return [3 /*break*/, 3];\n return [4 /*yield*/, sessionStorage.set(URL_INFO_STORAGE_KEY, (_a = {},\n _a[CURRENT_PAGE_STORAGE_KEY] = locationHREF,\n _a[PREVIOUS_PAGE_STORAGE_KEY] = document.referrer || '',\n _a))];\n case 2:\n _b.sent();\n _b.label = 3;\n case 3: return [4 /*yield*/, sessionStorage.get(URL_INFO_STORAGE_KEY)];\n case 4:\n updatedURLInfo = _b.sent();\n previousPage = '';\n if (updatedURLInfo) {\n previousPage = updatedURLInfo[PREVIOUS_PAGE_STORAGE_KEY] || '';\n }\n // no need to proceed to add additional properties if the event is one of the default event types to be excluded\n if (EXCLUDED_DEFAULT_EVENT_TYPES.has(event.event_type)) {\n return [2 /*return*/, event];\n }\n event.event_properties = __assign(__assign({}, (event.event_properties || {})), { '[Amplitude] Page Domain': addIfNotExist(event, '[Amplitude] Page Domain', (typeof location !== 'undefined' && location.hostname) || ''), '[Amplitude] Page Location': addIfNotExist(event, '[Amplitude] Page Location', locationHREF), '[Amplitude] Page Path': addIfNotExist(event, '[Amplitude] Page Path', (typeof location !== 'undefined' && getDecodeURI(location.pathname)) || ''), '[Amplitude] Page Title': addIfNotExist(event, '[Amplitude] Page Title', getPageTitle(replaceSensitiveString)), '[Amplitude] Page URL': addIfNotExist(event, '[Amplitude] Page URL', locationHREF.split('?')[0]), '[Amplitude] Previous Page Location': previousPage, '[Amplitude] Previous Page Type': getPrevPageType(previousPage) });\n _b.label = 5;\n case 5: return [2 /*return*/, event];\n }\n });\n }); },\n teardown: function () { return __awaiter(void 0, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (globalScope) {\n globalScope.removeEventListener('popstate', saveUrlInfoWrapper);\n isTracking = false;\n }\n if (!(sessionStorage && isStorageEnabled)) return [3 /*break*/, 2];\n return [4 /*yield*/, sessionStorage.set(URL_INFO_STORAGE_KEY, {})];\n case 1:\n _a.sent();\n _a.label = 2;\n case 2: return [2 /*return*/];\n }\n });\n }); },\n };\n return plugin;\n};\nfunction addIfNotExist(event, key, value) {\n if (!event.event_properties) {\n event.event_properties = {};\n }\n if (event.event_properties[key] === undefined) {\n return value;\n }\n return event.event_properties[key];\n}\n//# sourceMappingURL=page-url-enrichment.js.map","export var PLUGIN_NAME = 'web-vitals-browser';\nexport var WEB_VITALS_EVENT_NAME = '[Amplitude] Web Vitals';\n//# sourceMappingURL=constants.js.map","import { createIdentifyEvent, Identify, ILogger, Campaign, BASE_CAMPAIGN } from '@amplitude/analytics-core';\n\nexport interface Options {\n excludeReferrers?: (string | RegExp)[];\n initialEmptyValue?: string;\n resetSessionOnNewCampaign?: boolean;\n}\n\nconst domainWithoutSubdomain = (domain: string) => {\n const parts = domain.split('.');\n\n if (parts.length <= 2) {\n return domain;\n }\n\n return parts.slice(parts.length - 2, parts.length).join('.');\n};\n\n//Direct traffic mean no external referral, no UTMs, no click-ids, and no other customer identified marketing campaign url params.\nconst isDirectTraffic = (current: Campaign) => {\n return Object.values(current).every((value) => !value);\n};\n\nexport const isNewCampaign = (\n current: Campaign,\n previous: Campaign | undefined,\n options: Options,\n logger: ILogger,\n isNewSession = true,\n) => {\n const { referrer, referring_domain, ...currentCampaign } = current;\n const { referrer: _previous_referrer, referring_domain: prevReferringDomain, ...previousCampaign } = previous || {};\n\n if (isExcludedReferrer(options.excludeReferrers, current.referring_domain)) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n logger.debug(`This is not a new campaign because ${current.referring_domain} is in the exclude referrer list.`);\n return false;\n }\n\n //In the same session, direct traffic should not override or unset any persisting query params\n if (!isNewSession && isDirectTraffic(current) && previous) {\n logger.debug('This is not a new campaign because this is a direct traffic in the same session.');\n return false;\n }\n\n const hasNewCampaign = JSON.stringify(currentCampaign) !== JSON.stringify(previousCampaign);\n const hasNewDomain =\n domainWithoutSubdomain(referring_domain || '') !== domainWithoutSubdomain(prevReferringDomain || '');\n\n const result = !previous || hasNewCampaign || hasNewDomain;\n\n if (!result) {\n logger.debug(\"This is not a new campaign because it's the same as the previous one.\");\n } else {\n logger.debug(`This is a new campaign. An $identify event will be sent.`);\n }\n\n return result;\n};\n\nexport const isExcludedReferrer = (excludeReferrers: (string | RegExp)[] = [], referringDomain = '') => {\n return excludeReferrers.some((value) =>\n value instanceof RegExp ? value.test(referringDomain) : value === referringDomain,\n );\n};\n\nexport const createCampaignEvent = (campaign: Campaign, options: Options) => {\n const campaignParameters: Campaign = {\n // This object definition allows undefined keys to be iterated on\n // in .reduce() to build indentify object\n ...BASE_CAMPAIGN,\n ...campaign,\n };\n const identifyEvent = Object.entries(campaignParameters).reduce((identify, [key, value]) => {\n identify.setOnce(`initial_${key}`, value ?? options.initialEmptyValue ?? 'EMPTY');\n if (value) {\n return identify.set(key, value);\n }\n return identify.unset(key);\n }, new Identify());\n\n return createIdentifyEvent(identifyEvent);\n};\n\nexport const getDefaultExcludedReferrers = (cookieDomain: string | undefined) => {\n let domain = cookieDomain;\n if (domain) {\n if (domain.startsWith('.')) {\n domain = domain.substring(1);\n }\n return [new RegExp(`${domain.replace('.', '\\\\.')}$`)];\n }\n return [];\n};\n","import {\n BrowserConfig,\n ILogger,\n Storage,\n getStorageKey,\n isNewSession,\n Campaign,\n BASE_CAMPAIGN,\n CampaignParser,\n} from '@amplitude/analytics-core';\nimport { Options, getDefaultExcludedReferrers, createCampaignEvent, isNewCampaign } from './helpers';\n\nexport class WebAttribution {\n options: Options;\n storage: Storage<Campaign>;\n storageKey: string;\n webExpStorageKey: string;\n previousCampaign?: Campaign;\n currentCampaign: Campaign;\n shouldTrackNewCampaign = false;\n sessionTimeout: number;\n lastEventTime?: number;\n logger: ILogger;\n\n constructor(options: Options, config: BrowserConfig) {\n this.options = {\n initialEmptyValue: 'EMPTY',\n resetSessionOnNewCampaign: false,\n excludeReferrers: getDefaultExcludedReferrers(config.cookieOptions?.domain),\n ...options,\n };\n this.storage = config.cookieStorage as unknown as Storage<Campaign>;\n this.storageKey = getStorageKey(config.apiKey, 'MKTG');\n this.webExpStorageKey = getStorageKey(config.apiKey, 'MKTG_ORIGINAL');\n this.currentCampaign = BASE_CAMPAIGN;\n this.sessionTimeout = config.sessionTimeout;\n this.lastEventTime = config.lastEventTime;\n this.logger = config.loggerProvider;\n config.loggerProvider.log('Installing web attribution tracking.');\n }\n\n async init() {\n [this.currentCampaign, this.previousCampaign] = await this.fetchCampaign();\n const isEventInNewSession = !this.lastEventTime ? true : isNewSession(this.sessionTimeout, this.lastEventTime);\n\n if (isNewCampaign(this.currentCampaign, this.previousCampaign, this.options, this.logger, isEventInNewSession)) {\n this.shouldTrackNewCampaign = true;\n await this.storage.set(this.storageKey, this.currentCampaign);\n }\n }\n\n async fetchCampaign() {\n const originalCampaign = await this.storage.get(this.webExpStorageKey);\n if (originalCampaign) {\n await this.storage.remove(this.webExpStorageKey);\n }\n return await Promise.all([originalCampaign || new CampaignParser().parse(), this.storage.get(this.storageKey)]);\n }\n\n /**\n * This can be called when enable web attribution and either\n * 1. set a new session\n * 2. has new campaign and enable resetSessionOnNewCampaign\n */\n generateCampaignEvent(event_id?: number) {\n // Mark this campaign has been tracked\n this.shouldTrackNewCampaign = false;\n const campaignEvent = createCampaignEvent(this.currentCampaign, this.options);\n if (event_id) {\n campaignEvent.event_id = event_id;\n }\n return campaignEvent;\n }\n\n shouldSetSessionIdOnNewCampaign() {\n return this.shouldTrackNewCampaign && !!this.options.resetSessionOnNewCampaign;\n }\n}\n","import {\n AmplitudeCore,\n Destination,\n Identify,\n returnWrapper,\n Revenue,\n UUID,\n getAnalyticsConnector,\n setConnectorDeviceId,\n setConnectorUserId,\n isNewSession,\n IdentityEventSender,\n getQueryParams,\n Event,\n EventOptions,\n IIdentify,\n IRevenue,\n TransportTypeOrOptions,\n OfflineDisabled,\n Result,\n BrowserOptions,\n BrowserConfig,\n BrowserClient,\n SpecialEventType,\n AnalyticsClient,\n IRemoteConfigClient,\n RemoteConfigClient,\n RemoteConfig,\n Source,\n DiagnosticsClient,\n createIdentifyEvent,\n Logger,\n} from '@amplitude/analytics-core';\nimport {\n getAttributionTrackingConfig,\n getPageViewTrackingConfig,\n getElementInteractionsConfig,\n getNetworkTrackingConfig,\n isAttributionTrackingEnabled,\n isSessionTrackingEnabled,\n isFileDownloadTrackingEnabled,\n isFormInteractionTrackingEnabled,\n isElementInteractionsEnabled,\n isPageViewTrackingEnabled,\n isNetworkTrackingEnabled,\n isWebVitalsEnabled,\n isFrustrationInteractionsEnabled,\n getFrustrationInteractionsConfig,\n isPageUrlEnrichmentEnabled,\n} from './default-tracking';\nimport { convertProxyObjectToRealObject, isInstanceProxy } from './utils/snippet-helper';\nimport { Context } from './plugins/context';\nimport { useBrowserConfig, createTransport, shouldFetchRemoteConfig } from './config';\nimport { pageViewTrackingPlugin } from '@amplitude/plugin-page-view-tracking-browser';\nimport { formInteractionTracking } from './plugins/form-interaction-tracking';\nimport { fileDownloadTracking } from './plugins/file-download-tracking';\nimport { DEFAULT_SESSION_END_EVENT, DEFAULT_SESSION_START_EVENT, DEFAULT_SERVER_ZONE } from './constants';\nimport { detNotify } from './det-notification';\nimport { networkConnectivityCheckerPlugin } from './plugins/network-connectivity-checker';\nimport { updateBrowserConfigWithRemoteConfig } from './config/joined-config';\nimport { autocapturePlugin, frustrationPlugin } from '@amplitude/plugin-autocapture-browser';\nimport { plugin as networkCapturePlugin } from '@amplitude/plugin-network-capture-browser';\nimport { webVitalsPlugin } from '@amplitude/plugin-web-vitals-browser';\nimport { WebAttribution } from './attribution/web-attribution';\nimport { LIBPREFIX } from './lib-prefix';\nimport { VERSION } from './version';\nimport { pageUrlEnrichmentPlugin } from '@amplitude/plugin-page-url-enrichment-browser';\n\n/**\n * Exported for `@amplitude/unified` or integration with blade plugins.\n * If you only use `@amplitude/analytics-browser`, use `amplitude.init()` or `amplitude.createInstance()` instead.\n */\nexport class AmplitudeBrowser extends AmplitudeCore implements BrowserClient, AnalyticsClient {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n config: BrowserConfig;\n previousSessionDeviceId: string | undefined;\n previousSessionUserId: string | undefined;\n webAttribution: WebAttribution | undefined;\n userProperties: { [key: string]: any } | undefined;\n\n // Backdoor to set diagnostics sample rate\n // by calling amplitude._setDiagnosticsSampleRate(1); before amplitude.init()\n _diagnosticsSampleRate = 0;\n\n init(apiKey = '', userIdOrOptions?: string | BrowserOptions, maybeOptions?: BrowserOptions) {\n let userId: string | undefined;\n let options: BrowserOptions | undefined;\n if (arguments.length > 2) {\n userId = userIdOrOptions as string | undefined;\n options = maybeOptions;\n } else {\n if (typeof userIdOrOptions === 'string') {\n userId = userIdOrOptions;\n options = undefined;\n } else {\n userId = userIdOrOptions?.userId;\n options = userIdOrOptions;\n }\n }\n return returnWrapper(this._init({ ...options, userId, apiKey }));\n }\n protected async _init(options: BrowserOptions & { apiKey: string }) {\n // Step 1: Block concurrent initialization\n if (this.initializing) {\n return;\n }\n this.initializing = true;\n\n // Step 2: Create browser config\n // Step 2.1: Determine if we should fetch remote config BEFORE creating browser config\n // This allows us to get diagnostics settings before creating the DiagnosticsClient\n const fetchRemoteConfig = shouldFetchRemoteConfig(options);\n\n // Set up early dependencies needed for remote config client\n // These use options directly or fall back to defaults\n const loggerProvider = options.loggerProvider ?? new Logger();\n const serverZone = options.serverZone ?? DEFAULT_SERVER_ZONE;\n\n let remoteConfigClient: IRemoteConfigClient | undefined;\n let diagnosticsSampleRate = this._diagnosticsSampleRate;\n let enableDiagnostics = options.enableDiagnostics ?? true;\n\n // Step 2.2: Fetch diagnostics config FIRST to get sample rate for DiagnosticsClient\n // We want to create DiagnosticsClient as early as possible so it can track more data\n /* istanbul ignore next */\n if (fetchRemoteConfig) {\n remoteConfigClient = new RemoteConfigClient(\n options.apiKey,\n loggerProvider,\n serverZone,\n /* istanbul ignore next */ options.remoteConfig?.serverUrl,\n );\n\n // Fetch diagnostics config first to get sample rate\n await new Promise<void>((resolve) => {\n // Disable coverage for this line because remote config client will always be defined in this case.\n // istanbul ignore next\n remoteConfigClient?.subscribe(\n 'configs.diagnostics.browserSDK',\n 'all',\n (remoteConfig: RemoteConfig | null, source: Source, lastFetch: Date) => {\n loggerProvider.debug(\n 'Diagnostics remote configuration received:',\n JSON.stringify(\n {\n remoteConfig,\n source,\n lastFetch,\n },\n null,\n 2,\n ),\n );\n if (remoteConfig) {\n // Validate and set sampleRate (must be a valid number)\n const sampleRate = remoteConfig.sampleRate as number;\n if (typeof sampleRate === 'number' && !isNaN(sampleRate)) {\n diagnosticsSampleRate = sampleRate;\n }\n\n // Validate and set enabled (must be a boolean)\n const enabled = remoteConfig.enabled as boolean;\n if (typeof enabled === 'boolean') {\n enableDiagnostics = enabled;\n }\n }\n resolve();\n },\n );\n });\n }\n\n // Step 2.3: Initialize diagnostics client as early as possible\n // Now we have the sample rate from remote config (if fetched)\n const diagnosticsClient = new DiagnosticsClient(options.apiKey, loggerProvider, serverZone, {\n enabled: enableDiagnostics,\n sampleRate: diagnosticsSampleRate,\n });\n diagnosticsClient.setTag('library', `${LIBPREFIX}/${VERSION}`);\n if (typeof navigator !== 'undefined') {\n diagnosticsClient.setTag('user_agent', navigator.userAgent);\n }\n\n // Step 2.4: Create browser config with diagnosticsClient and earlyConfig\n // earlyConfig ensures consistent logger/serverZone/diagnostics settings across all components\n const browserOptions = await useBrowserConfig(options.apiKey, options, this, diagnosticsClient, {\n loggerProvider,\n serverZone,\n enableDiagnostics,\n diagnosticsSampleRate,\n });\n\n // Step 2.5: Fetch analytics SDK remote config\n // This is fetched after DiagnosticsClient is created so diagnostics can track any issues\n /* istanbul ignore next */\n if (fetchRemoteConfig && remoteConfigClient) {\n await new Promise<void>((resolve) => {\n // Disable coverage for this line because remote config client will always be defined in this case.\n // istanbul ignore next\n remoteConfigClient?.subscribe(\n 'configs.analyticsSDK.browserSDK',\n 'all',\n (remoteConfig: RemoteConfig | null, source: Source, lastFetch: Date) => {\n browserOptions.loggerProvider.debug(\n 'Remote configuration received:',\n JSON.stringify(\n {\n remoteConfig,\n source,\n lastFetch,\n },\n null,\n 2,\n ),\n );\n if (remoteConfig) {\n updateBrowserConfigWithRemoteConfig(remoteConfig, browserOptions);\n }\n // Resolve the promise on first callback (initial config)\n resolve();\n },\n );\n });\n }\n\n await super._init(browserOptions);\n this.logBrowserOptions(browserOptions);\n\n this.config.remoteConfigClient = remoteConfigClient;\n\n // Add web attribution plugin\n if (isAttributionTrackingEnabled(this.config.defaultTracking)) {\n const attributionTrackingOptions = getAttributionTrackingConfig(this.config);\n this.webAttribution = new WebAttribution(attributionTrackingOptions, this.config);\n // Fetch the current campaign, check if need to track web attribution later\n await this.webAttribution.init();\n }\n\n // Step 3: Set session ID\n // Priority 1: `options.sessionId`\n // Priority 2: sessionId from url if it's Number and ampTimestamp is valid\n // Priority 3: last known sessionId from user identity storage\n // Default: `Date.now()`\n // Session ID is handled differently than device ID and user ID due to session events\n const queryParams = getQueryParams();\n\n // Check if ampTimestamp is present and valid\n const ampTimestamp = queryParams.ampTimestamp ? Number(queryParams.ampTimestamp) : undefined;\n const isWithinTimeLimit = ampTimestamp ? Date.now() < ampTimestamp : true;\n\n // check if we need to set the sessionId\n const querySessionId =\n isWithinTimeLimit && !Number.isNaN(Number(queryParams.ampSessionId))\n ? Number(queryParams.ampSessionId)\n : undefined;\n this.setSessionId(options.sessionId ?? querySessionId ?? this.config.sessionId ?? Date.now());\n\n // Set up the analytics connector to integrate with the experiment SDK.\n // Send events from the experiment SDK and forward identifies to the\n // identity store.\n const connector = getAnalyticsConnector(options.instanceName);\n connector.identityStore.setIdentity({\n userId: this.config.userId,\n deviceId: this.config.deviceId,\n });\n\n // Step 4: Install plugins\n // Do not track any events before this\n if (this.config.offline !== OfflineDisabled) {\n await this.add(networkConnectivityCheckerPlugin()).promise;\n }\n await this.add(new Destination({ diagnosticsClient })).promise;\n await this.add(new Context()).promise;\n await this.add(new IdentityEventSender()).promise;\n\n // Notify if DET is enabled\n detNotify(this.config);\n\n if (isFileDownloadTrackingEnabled(this.config.defaultTracking)) {\n this.config.loggerProvider.debug('Adding file download tracking plugin');\n await this.add(fileDownloadTracking()).promise;\n }\n\n if (isFormInteractionTrackingEnabled(this.config.defaultTracking)) {\n this.config.loggerProvider.debug('Adding form interaction plugin');\n await this.add(formInteractionTracking()).promise;\n }\n\n // Add page view plugin\n if (isPageViewTrackingEnabled(this.config.defaultTracking)) {\n this.config.loggerProvider.debug('Adding page view tracking plugin');\n await this.add(pageViewTrackingPlugin(getPageViewTrackingConfig(this.config))).promise;\n }\n\n if (isElementInteractionsEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding user interactions plugin (autocapture plugin)');\n await this.add(autocapturePlugin(getElementInteractionsConfig(this.config), { diagnosticsClient })).promise;\n }\n\n if (isFrustrationInteractionsEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding frustration interactions plugin');\n await this.add(frustrationPlugin(getFrustrationInteractionsConfig(this.config))).promise;\n }\n\n if (isNetworkTrackingEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding network tracking plugin');\n await this.add(networkCapturePlugin(getNetworkTrackingConfig(this.config))).promise;\n }\n\n if (isWebVitalsEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding web vitals plugin');\n await this.add(webVitalsPlugin()).promise;\n }\n\n if (isPageUrlEnrichmentEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding referrer page url plugin');\n await this.add(pageUrlEnrichmentPlugin()).promise;\n }\n\n this.initializing = false;\n\n // Step 6: Run queued dispatch functions\n await this.runQueuedFunctions('dispatchQ');\n\n // Step 7: Add the event receiver after running remaining queued functions.\n connector.eventBridge.setEventReceiver((event) => {\n const { time, ...cleanEventProperties } = event.eventProperties || {};\n const eventOptions = typeof time === 'number' ? { time } : undefined;\n void this.track(event.eventType, cleanEventProperties, eventOptions);\n });\n }\n\n getUserId() {\n return this.config?.userId;\n }\n\n setUserId(userId: string | undefined) {\n if (!this.config) {\n this.q.push(this.setUserId.bind(this, userId));\n return;\n }\n this.config.loggerProvider.debug('function setUserId: ', userId);\n if (userId !== this.config.userId || userId === undefined) {\n this.config.userId = userId;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.timeline.onIdentityChanged({ userId: userId });\n setConnectorUserId(userId, this.config.instanceName);\n }\n }\n\n getDeviceId() {\n return this.config?.deviceId;\n }\n\n setDeviceId(deviceId: string) {\n if (!this.config) {\n this.q.push(this.setDeviceId.bind(this, deviceId));\n return;\n }\n this.config.loggerProvider.debug('function setDeviceId: ', deviceId);\n if (deviceId !== this.config.deviceId) {\n this.config.deviceId = deviceId;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.timeline.onIdentityChanged({ deviceId: deviceId });\n setConnectorDeviceId(deviceId, this.config.instanceName);\n }\n }\n\n reset() {\n this.setDeviceId(UUID());\n this.setUserId(undefined);\n this.timeline.onReset();\n }\n\n getIdentity() {\n return {\n deviceId: this.config?.deviceId,\n userId: this.config?.userId,\n userProperties: this.userProperties,\n };\n }\n\n getOptOut(): boolean | undefined {\n return this.config?.optOut;\n }\n\n getSessionId() {\n return this.config?.sessionId;\n }\n\n setSessionId(sessionId: number) {\n const promises: Promise<Result>[] = [];\n if (!this.config) {\n this.q.push(this.setSessionId.bind(this, sessionId));\n return returnWrapper(Promise.resolve());\n }\n // Prevents starting a new session with the same session ID\n if (sessionId === this.config.sessionId) {\n return returnWrapper(Promise.resolve());\n }\n\n this.config.loggerProvider.debug('function setSessionId: ', sessionId);\n\n const previousSessionId = this.getSessionId();\n if (previousSessionId !== sessionId) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.timeline.onSessionIdChanged(sessionId);\n }\n\n const lastEventTime = this.config.lastEventTime;\n let lastEventId = this.config.lastEventId ?? -1;\n\n this.config.sessionId = sessionId;\n this.config.lastEventTime = undefined;\n this.config.pageCounter = 0;\n\n if (isSessionTrackingEnabled(this.config.defaultTracking)) {\n if (previousSessionId && lastEventTime) {\n promises.push(\n this.track(DEFAULT_SESSION_END_EVENT, undefined, {\n device_id: this.previousSessionDeviceId,\n event_id: ++lastEventId,\n session_id: previousSessionId,\n time: lastEventTime + 1,\n user_id: this.previousSessionUserId,\n }).promise,\n );\n }\n this.config.lastEventTime = this.config.sessionId;\n }\n\n // Fire web attribution event when enable webAttribution tracking\n // 1. has new campaign (call setSessionId from init function)\n // 2. or shouldTrackNewCampaign (call setSessionId from async process(event) when there has new campaign and resetSessionOnNewCampaign = true )\n const isCampaignEventTracked = this.trackCampaignEventIfNeeded(++lastEventId, promises);\n\n // track the identify event if an Identify object is provided in the config\n if (this.config.identify) {\n promises.push(this.track(createIdentifyEvent(this.config.identify)).promise);\n }\n\n if (isSessionTrackingEnabled(this.config.defaultTracking)) {\n promises.push(\n this.track(DEFAULT_SESSION_START_EVENT, undefined, {\n event_id: isCampaignEventTracked ? ++lastEventId : lastEventId,\n session_id: this.config.sessionId,\n time: this.config.lastEventTime,\n }).promise,\n );\n }\n\n this.previousSessionDeviceId = this.config.deviceId;\n this.previousSessionUserId = this.config.userId;\n return returnWrapper(Promise.all(promises));\n }\n\n extendSession() {\n if (!this.config) {\n this.q.push(this.extendSession.bind(this));\n return;\n }\n this.config.lastEventTime = Date.now();\n }\n\n setTransport(transport: TransportTypeOrOptions) {\n if (!this.config) {\n this.q.push(this.setTransport.bind(this, transport));\n return;\n }\n this.config.transportProvider = createTransport(transport);\n }\n\n identify(identify: IIdentify, eventOptions?: EventOptions) {\n if (isInstanceProxy(identify)) {\n const queue = identify._q;\n identify._q = [];\n identify = convertProxyObjectToRealObject(new Identify(), queue);\n }\n if (eventOptions?.user_id) {\n this.setUserId(eventOptions.user_id);\n }\n if (eventOptions?.device_id) {\n this.setDeviceId(eventOptions.device_id);\n }\n return super.identify(identify, eventOptions);\n }\n\n groupIdentify(groupType: string, groupName: string | string[], identify: IIdentify, eventOptions?: EventOptions) {\n if (isInstanceProxy(identify)) {\n const queue = identify._q;\n identify._q = [];\n identify = convertProxyObjectToRealObject(new Identify(), queue);\n }\n return super.groupIdentify(groupType, groupName, identify, eventOptions);\n }\n\n revenue(revenue: IRevenue, eventOptions?: EventOptions) {\n if (isInstanceProxy(revenue)) {\n const queue = revenue._q;\n revenue._q = [];\n revenue = convertProxyObjectToRealObject(new Revenue(), queue);\n }\n return super.revenue(revenue, eventOptions);\n }\n\n private trackCampaignEventIfNeeded(lastEventId?: number, promises?: Promise<Result>[]) {\n if (!this.webAttribution || !this.webAttribution.shouldTrackNewCampaign) {\n return false;\n }\n\n const campaignEvent = this.webAttribution.generateCampaignEvent(lastEventId);\n if (promises) {\n promises.push(this.track(campaignEvent).promise);\n } else {\n this.track(campaignEvent);\n }\n this.config.loggerProvider.log('Tracking attribution.');\n return true;\n }\n\n async process(event: Event) {\n const currentTime = Date.now();\n const isEventInNewSession = isNewSession(this.config.sessionTimeout, this.config.lastEventTime);\n const shouldSetSessionIdOnNewCampaign =\n this.webAttribution && this.webAttribution.shouldSetSessionIdOnNewCampaign();\n\n if (\n event.event_type !== DEFAULT_SESSION_START_EVENT &&\n event.event_type !== DEFAULT_SESSION_END_EVENT &&\n (!event.session_id || event.session_id === this.getSessionId())\n ) {\n if (isEventInNewSession || shouldSetSessionIdOnNewCampaign) {\n this.setSessionId(currentTime);\n if (shouldSetSessionIdOnNewCampaign) {\n this.config.loggerProvider.log('Created a new session for new campaign.');\n }\n } else if (!isEventInNewSession) {\n // Web attribution should be tracked during the middle of a session\n // if there has been a chance in the campaign information.\n this.trackCampaignEventIfNeeded();\n }\n }\n\n // Set user properties\n if (event.event_type === SpecialEventType.IDENTIFY && event.user_properties) {\n this.userProperties = this.getOperationAppliedUserProperties(event.user_properties);\n }\n\n return super.process(event);\n }\n\n private logBrowserOptions(browserConfig: BrowserOptions & { apiKey: string }) {\n try {\n const browserConfigCopy = {\n ...browserConfig,\n apiKey: browserConfig.apiKey.substring(0, 10) + '********',\n };\n this.config.loggerProvider.debug('Initialized Amplitude with BrowserConfig:', JSON.stringify(browserConfigCopy));\n } catch (e) {\n /* istanbul ignore next */\n this.config.loggerProvider.error('Error logging browser config', e);\n }\n }\n\n /**\n * @experimental\n * WARNING: This method is for internal testing only and is not part of the public API.\n * It may be changed or removed at any time without notice.\n *\n * Sets the diagnostics sample rate before amplitude.init()\n * @param sampleRate - The sample rate to set\n */\n _setDiagnosticsSampleRate(sampleRate: number): void {\n if (sampleRate > 1 || sampleRate < 0) {\n return;\n }\n // Set diagnostics sample rate before initializing the config\n if (!this.config) {\n this._diagnosticsSampleRate = sampleRate;\n return;\n }\n }\n}\n","import { debugWrapper, getClientLogConfig, getClientStates, BrowserClient } from '@amplitude/analytics-core';\nimport { AmplitudeBrowser } from './browser-client';\n\nexport const createInstance = (): BrowserClient => {\n const client = new AmplitudeBrowser();\n return {\n init: debugWrapper(\n client.init.bind(client),\n 'init',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n add: debugWrapper(\n client.add.bind(client),\n 'add',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.plugins']),\n ),\n remove: debugWrapper(\n client.remove.bind(client),\n 'remove',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.plugins']),\n ),\n track: debugWrapper(\n client.track.bind(client),\n 'track',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n logEvent: debugWrapper(\n client.logEvent.bind(client),\n 'logEvent',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n identify: debugWrapper(\n client.identify.bind(client),\n 'identify',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n groupIdentify: debugWrapper(\n client.groupIdentify.bind(client),\n 'groupIdentify',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n setGroup: debugWrapper(\n client.setGroup.bind(client),\n 'setGroup',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n revenue: debugWrapper(\n client.revenue.bind(client),\n 'revenue',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n flush: debugWrapper(\n client.flush.bind(client),\n 'flush',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n getUserId: debugWrapper(\n client.getUserId.bind(client),\n 'getUserId',\n getClientLogConfig(client),\n getClientStates(client, ['config', 'config.userId']),\n ),\n setUserId: debugWrapper(\n client.setUserId.bind(client),\n 'setUserId',\n getClientLogConfig(client),\n getClientStates(client, ['config', 'config.userId']),\n ),\n getDeviceId: debugWrapper(\n client.getDeviceId.bind(client),\n 'getDeviceId',\n getClientLogConfig(client),\n getClientStates(client, ['config', 'config.deviceId']),\n ),\n setDeviceId: debugWrapper(\n client.setDeviceId.bind(client),\n 'setDeviceId',\n getClientLogConfig(client),\n getClientStates(client, ['config', 'config.deviceId']),\n ),\n reset: debugWrapper(\n client.reset.bind(client),\n 'reset',\n getClientLogConfig(client),\n getClientStates(client, ['config', 'config.userId', 'config.deviceId']),\n ),\n getSessionId: debugWrapper(\n client.getSessionId.bind(client),\n 'getSessionId',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n setSessionId: debugWrapper(\n client.setSessionId.bind(client),\n 'setSessionId',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n extendSession: debugWrapper(\n client.extendSession.bind(client),\n 'extendSession',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n setOptOut: debugWrapper(\n client.setOptOut.bind(client),\n 'setOptOut',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n setTransport: debugWrapper(\n client.setTransport.bind(client),\n 'setTransport',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n getIdentity: debugWrapper(\n client.getIdentity.bind(client),\n 'getIdentity',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n getOptOut: debugWrapper(\n client.getOptOut.bind(client),\n 'getOptOut',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n _setDiagnosticsSampleRate: debugWrapper(\n client._setDiagnosticsSampleRate.bind(client),\n '_setDiagnosticsSampleRate',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n };\n};\n\nexport default createInstance();\n","/* eslint-disable @typescript-eslint/unbound-method */\nimport client from './browser-client-factory';\nexport { createInstance } from './browser-client-factory';\nexport const {\n add,\n extendSession,\n flush,\n getDeviceId,\n getIdentity,\n getOptOut,\n getSessionId,\n getUserId,\n groupIdentify,\n identify,\n init,\n logEvent,\n remove,\n reset,\n revenue,\n setDeviceId,\n setGroup,\n setOptOut,\n setSessionId,\n setTransport,\n setUserId,\n track,\n _setDiagnosticsSampleRate,\n} = client;\nexport { AmplitudeBrowser } from './browser-client';\nexport { runQueuedFunctions } from './utils/snippet-helper';\nexport { Revenue, Identify } from '@amplitude/analytics-core';\n\n// Export types to maintain backward compatibility with `analytics-types`.\n// In the next major version, only export customer-facing types to reduce the public API surface.\nexport * as Types from './types';\n","import { getGlobalScope, registerSdkLoaderMetadata } from '@amplitude/analytics-core';\nimport * as amplitude from './index';\nimport { createInstance } from './browser-client-factory';\nimport { runQueuedFunctions } from './utils/snippet-helper';\n\nregisterSdkLoaderMetadata({\n scriptUrl: resolveCurrentScriptUrl(),\n});\n\nfunction resolveCurrentScriptUrl(): string | undefined {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n const currentScript = document.currentScript as HTMLScriptElement | null;\n if (currentScript?.src) {\n return currentScript.src;\n }\n\n return undefined;\n}\n\n// https://developer.mozilla.org/en-US/docs/Glossary/IIFE\n(function () {\n const GlobalScope = getGlobalScope();\n\n if (!GlobalScope) {\n console.error('[Amplitude] Error: GlobalScope is not defined');\n return;\n }\n\n const createNamedInstance = (instanceName?: string) => {\n const instance = createInstance();\n const GlobalScope = getGlobalScope();\n if (GlobalScope && GlobalScope.amplitude && GlobalScope.amplitude._iq && instanceName) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n GlobalScope.amplitude._iq[instanceName] = instance;\n }\n return instance;\n };\n\n GlobalScope.amplitude = Object.assign(GlobalScope.amplitude || {}, amplitude, {\n createInstance: createNamedInstance,\n });\n\n if (GlobalScope.amplitude.invoked) {\n const queue = GlobalScope.amplitude._q;\n GlobalScope.amplitude._q = [];\n runQueuedFunctions(amplitude, queue);\n\n const instanceNames = Object.keys(GlobalScope.amplitude._iq) || [];\n for (let i = 0; i < instanceNames.length; i++) {\n const instanceName = instanceNames[i];\n const instance = Object.assign(GlobalScope.amplitude._iq[instanceName], createNamedInstance(instanceName));\n const queue = instance._q;\n instance._q = [];\n runQueuedFunctions(instance, queue);\n }\n }\n})();\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","IdentifyOperation","SpecialEventType","__assign","assign","t","s","i","n","arguments","length","apply","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","Iterator","verb","Symbol","iterator","v","op","pop","push","__values","o","m","__read","r","ar","error","__spreadArray","to","from","pack","l","slice","concat","SuppressedError","AMPLITUDE_PREFIX","STORAGE_PREFIX","DEFAULT_INSTANCE_NAME","AMPLITUDE_SERVER_URL","DCLID","FBCLID","GBRAID","GCLID","KO_CLICK_ID","LI_FAT_ID","MSCLKID","RDT_CID","TTCLID","TWCLID","WBRAID","BASE_CAMPAIGN","utm_campaign","undefined","utm_content","utm_id","utm_medium","utm_source","utm_term","referrer","referring_domain","dclid","gbraid","gclid","fbclid","ko_click_id","li_fat_id","msclkid","rdt_cid","ttclid","twclid","wbraid","SAFE_HEADERS","FORBIDDEN_HEADERS","isValidObject","properties","keys","key","isValidProperties","property","e_1","_a","isArray","isValid","value_1","value_1_1","valueElement","includes","e_1_1","return","Identify","_propertySet","Set","_properties","getUserProperties","set","_safeSet","SET","setOnce","SET_ONCE","append","APPEND","prepend","PREPEND","postInsert","POSTINSERT","preInsert","PREINSERT","remove","REMOVE","add","ADD","unset","UNSET","clearAll","CLEAR_ALL","operation","_validate","userPropertyMap","has","Status","OrderedIdentifyOperations","RevenueProperty","buildResult","event","code","message","Unknown","getGlobalScope","ampIntegrationContextName","globalThis","window","self","global","hex","map","index","toString","padStart","UUID","a","globalScope","crypto","getRandomValues","Math","random","replace","legacyUUID","Uint8Array","entries","_b","int","join","Timeline","client","queue","applying","plugins","register","plugin","config","_c","some","existingPlugin","name","loggerProvider","warn","type","setup","deregister","pluginName","findIndex","splice","teardown","reset","_this","scheduleApply","timeout","setTimeout","shift","item","before","before_1","before_1_1","enrichment","enrichment_1","enrichment_1_1","e_2_1","destination","executeDestinations","e_2","_d","_e","log","filter","execute","JSON","stringify","eventClone","catch","all","resolveResult","flush","onIdentityChanged","identity","forEach","onSessionIdChanged","sessionId","onOptOutChanged","optOut","onReset","createIdentifyEvent","identify","eventOptions","event_type","IDENTIFY","user_properties","returnWrapper","awaitable","promise","AmplitudeCore","initializing","isReady","q","dispatchQ","logEvent","track","bind","timeline","_init","runQueuedFunctions","queueName","queuedFunctions","queuedFunctions_1","queuedFunctions_1_1","queuedFunction","val","eventInput","eventProperties","event_properties","createTrackEvent","dispatch","groupIdentify","groupType","groupName","GROUP_IDENTIFY","group_properties","groups","createGroupIdentifyEvent","setGroup","createGroupEvent","revenue","REVENUE","getEventProperties","createRevenueEvent","_addPlugin","_removePlugin","dispatchWithCallback","callback","process","getOperationAppliedUserProperties","userProperties","updatedProperties","nonOpProperties","values","opProperties","prop","setOptOut","_setOptOut","Boolean","find","debug","pluginClass","Revenue","productId","quantity","price","setProductId","setQuantity","setPrice","setRevenueType","revenueType","setCurrency","currency","setRevenue","setReceipt","receipt","setReceiptSig","receiptSig","setEventProperties","REVENUE_PRODUCT_ID","REVENUE_QUANTITY","REVENUE_PRICE","REVENUE_TYPE","REVENUE_CURRENCY","RECEIPT","RECEIPT_SIG","LogLevel","PREFIX","Logger","logLevel","None","disable","enable","Warn","args","_i","Verbose","console","Error","Debug","getDefaultConfig","flushMaxRetries","flushQueueSize","flushIntervalMillis","instanceName","offline","serverUrl","serverZone","useBatch","Config","options","_optOut","defaultConfig","apiKey","minIdLength","plan","ingestionMetadata","storageProvider","transportProvider","serverConfig","createServerConfig","defineProperty","get","enumerable","configurable","getServerUrl","_serverZone","RequestMetadata","sdk","metrics","histogram","recordHistogram","isSuccessStatusCode","getStacktrace","ignoreDepth","stack","split","text","trim","getClientLogConfig","logger","getValueByStringPath","obj","path","attr","getClientStates","paths","res","paths_1","paths_1_1","debugWrapper","fn","fnName","getLogConfig","getStates","fnContext","debugContext","stacktrace","time","start","Date","toISOString","states","after","end","getResponseBodyString","responseBodyString","Destination","context","retryTimeout","throttleTimeout","storageKey","scheduleId","scheduledTimeout","flushId","diagnosticsClient","unsent","substring","insert_id","attempts","schedule","saveEvents","removeEventsExceedFlushMaxRetries","list","fulfillRequest","scheduleEvents","clearTimeout","resetSchedule","useRetry","later","arr","size","chunkSize","max","reduce","chunks","element","chunkIndex","floor","batch","send","payload","errorMessage","api_key","events","extra","min_id_length","client_upload_time","request_metadata","requestMetadata","handleResponse","statusCode","status","recordEvent","stack_trace","Failed","Success","handleSuccessResponse","Invalid","handleInvalidResponse","PayloadTooLarge","handlePayloadTooLargeResponse","RateLimit","handleRateLimitResponse","handleOtherResponse","missingField","startsWith","dropIndex","eventsWithInvalidFields","eventsWithMissingFields","eventsWithInvalidIdLengths","silencedEvents","flat","dropIndexSet","retry","tryable","dropUserIds","exceededDailyQuotaUsers","dropDeviceIds","exceededDailyQuotaDevices","throttledIndex","throttledEvents","dropUserIdsSet","dropDeviceIdsSet","throttledIndexSet","user_id","device_id","increment","removeEvents","updatedEvents","eventsToRemove","queuedContext","ApplicationContextProviderImpl","getApplicationContext","versionName","language","getLanguage","platform","os","deviceModel","navigator","languages","EventBridgeImpl","receiver","setEventReceiver","isEqual","obj1","obj2","typeA","primitive_1","primitive_1_1","isArrayA","isArrayB","sorted1","sort","sorted2","result_1","ownProps","resArray","ServerZone","IdentityStoreImpl","listeners","editIdentity","actingUserProperties","actingIdentity","setUserId","userId","setDeviceId","deviceId","setUserProperties","updateUserProperties","actions","e_3","actingProperties","_f","action","_g","_h","_j","_k","_l","e_3_1","commit","setIdentity","getIdentity","originalIdentity","listener","addIdentityListener","removeIdentityListener","delete","safeGlobal","AnalyticsConnector","identityStore","eventBridge","applicationContextProvider","getInstance","getAnalyticsConnector","IdentityEventSender","isNewSession","sessionTimeout","lastEventTime","now","getCookieName","postKey","limit","userLanguage","getQueryParams","location","search","acc","curr","query","tryDecodeURIComponent","decodeURIComponent","isUrlMatchAllowlist","url","allowlist","allowedUrl","match","getDecodeURI","locationStr","decodedLocationStr","decodeURI","isTimestampInSampleTemp","timestamp","sampleRate","hashNumber","str","hash","charCodeAt","generateHashCode","abs","MemoryStorage","memoryStorage","Map","isEnabled","getRaw","clear","CookieStorage","testCookieOptions","testStorage","testKey","testValue","expirationDays","decodedValue","decodeCookieValue","parse","globalScopeWithCookiesStore","cookieStore","cookies_2","cookies_1","cookies_1_1","cookie","cookies","duplicateResolverFn","getAll","domain","isDomainEqual","document","c","ignoreError","expires","expireDate","date","setTime","getTime","btoa","encodeURIComponent","toUTCString","secure","sameSite","atob","decodeCookiesAsDefault","decodeCookiesWithDoubleUrlEncoding","domain1","domain2","normalized1","normalized2","toLowerCase","getStorageKey","BrowserStorage","storage","getItem","setItem","removeItem","TABLE_NAMES","INTERNAL_KEYS","DiagnosticsStorage","dbPromise","dbName","isSupported","indexedDB","getDB","openDB","request","open","onerror","onsuccess","db","onclose","close","onupgradeneeded","target","createTables","objectStoreNames","contains","createObjectStore","keyPath","autoIncrement","createIndex","unique","setTags","tags","transaction_1","store_1","error_1","transaction","objectStore","oncomplete","onabort","put","incrementCounters","counters","transaction_2","store_2","error_2","incrementValue","getRequest","existingRecord","existingValue","setHistogramStats","histogramStats","transaction_3","store_3","error_3","newStats","updatedStats","count","min","sum","addEventRecords","transaction_4","store_4","error_4","countRequest","currentCount","availableSlots","setInternal","transaction_5","store_5","error_5","getInternal","transaction_6","store_6","error_6","getLastFlushTimestamp","record","error_7","parseInt","setLastFlushTimestamp","error_8","clearTable","tableName","getAllAndClear","error_9","getAllFromStore","GLOBAL_KEY","detectSdkOrigin","scope","normalizedScriptUrl","filename","normalizeUrl","URL","origin","pathname","extractFilenameFromStack","stringifyReason","reason","FLUSH_INTERVAL_MS","MAX_MEMORY_STORAGE_COUNT","DiagnosticsClient","inMemoryTags","inMemoryCounters","inMemoryHistograms","inMemoryEvents","saveTimer","flushTimer","enabled","startTimestamp","shouldTrack","initializeFlushInterval","addEventListener","capture","error_name","errorName","metadata","colno","lineno","isTrusted","matchReason","enableSdkErrorListeners","isStorageAndTrackEnabled","setTag","startTimersIfNeeded","existing","event_name","saveAllDataToStorage","finally","_flush","tagsToSave","countersToSave","histogramsToSave","eventsToSave","tagRecords","counterRecords","histogramStatsRecords","eventRecords","stats","avg","round","fetch","method","headers","ok","lastFlushTimestamp","timeSinceLastFlush","_setFlushTimer","delay","_setSampleRate","BaseTransport","_serverUrl","_payload","buildResponse","responseJSON","_m","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","buildStatus","eventsIngested","events_ingested","payloadSizeBytes","payload_size_bytes","serverUploadTime","server_upload_time","missing_field","events_with_invalid_fields","events_with_missing_fields","events_with_invalid_id_lengths","epsThreshold","eps_threshold","exceeded_daily_quota_devices","silencedDevices","silenced_devices","silenced_events","throttledDevices","throttled_devices","throttled_events","throttledUsers","throttled_users","exceeded_daily_quota_users","Timeout","FetchTransport","_super","customHeaders","response","responseText","Accept","RemoteConfigLocalStorage","fetchConfig","failedRemoteConfigInfo","remoteConfig","lastFetch","localStorage","remoteConfigInfo","setConfig","RemoteConfigClient","callbackInfos","lastSuccessfulFetch","fetchPromise","subscribe","deliveryMode","id","callbackInfo","subscribeAll","subscribeWaitForRemote","unsubscribe","updateConfigs","getOrCreateFetchPromise","sendCallback","remotePromise","cachePromise","race","timeoutPromise","source","filteredConfig","lastCallback","retries","interval","_loop_1","this_1","attempt","state_1","abortController","timeoutId","AbortController","abort","getUrlParams","signal","json","getJitterDelay","baseDelay","encodedApiKey","urlParams","URLSearchParams","CONFIG_GROUP","DEFAULT_CSS_SELECTOR_ALLOWLIST","DEFAULT_DATA_ATTRIBUTE_PREFIX","DEFAULT_ACTION_CLICK_ALLOWLIST","DEFAULT_DEAD_CLICK_ALLOWLIST","DEFAULT_RAGE_CLICK_ALLOWLIST","isJsonPrimitive","pruneJson","excludelist","_pruneJson","tokenizeJsonPath","ancestors","targetObject","parentObject","targetKey","keys_1","keys_1_1","hasPathMatchInList","token","isPathMatch","pathMatcher","j","currentMatcher","k","allowOrExcludeList","RequestWrapperFetch","allow","headersUnsafe","headersSafeCopy","headerName","headerValue","Headers","pruneHeaders","_bodySize","TextEncoder","getBodySize","exclude","safeParseAndPruneBody","RequestWrapperXhr","bodyRaw","requestHeaders","bodyUnsafe","maxEntries","bodySize","bodySafe","encode","Blob","ArrayBuffer","isView","byteLength","FormData","formData","total","ReadableStream","PRUNE_STRATEGY","ResponseWrapperFetch","headersSafe","headersOut_1","contentLength","textPromise","timer","clonedResponse","clone","ResponseWrapperXhr","headersString","getJson","headerLines","headerLines_1","headerLines_1_1","jsonBody","REDACTED_VALUE","e_4","strategy","headersPruned","lowerKey","REDACT","e_4_1","NetworkRequestEvent","startTime","requestWrapper","duration","responseWrapper","endTime","toSerializable","serialized","requestBodySize","responseHeaders","responseBodySize","fromEntries","NetworkEventCallback","NetworkObserver","eventCallbacks","isObserving","eventCallback","originalXhrOpen","XMLHttpRequest","originalXhrSend","originalXhrSetRequestHeader","setRequestHeader","observeXhr","originalFetch","observeFetch","triggerEventCallbacks","err","handleNetworkRequestEvent","requestType","requestInfo","typedError","durationStart","isRequest","parsedUrl","protocol","host","performance","requestEvent","getTimestamps","requestInit","timestamps","originalResponse","originalError","err_1","createXhrJsonParser","xhrUnsafe","responseType","structuredClone","xhrProto","networkObserverContext","$$AmplitudeAnalyticsEvent","xhrSafe","getAllResponseHeaders","getResponseHeader","networkObserver","CampaignParser","getUtmParam","getReferrer","getClickIds","params","data","TEXT_MASK_ATTRIBUTE","MASKED_TEXT_VALUE","CC_REGEX","SSN_REGEX","EMAIL_REGEX","replaceSensitiveString","additionalMaskTextPatterns","additionalMaskTextPatterns_1","additionalMaskTextPatterns_1_1","pattern","getPageTitle","parseTitleFunction","title","titleElement","querySelector","hasAttribute","_createForOfIteratorHelperLoose","allowArrayLike","it","minLen","_arrayLikeToArray","test","_unsupportedIterableToArray","len","arr2","_defineProperties","props","descriptor","writable","_createClass","Constructor","protoProps","staticProps","hasSymbols","hasSymbol","getSymbol","observable","SymbolIterator","SymbolObservable","SymbolSpecies","getMethod","getSpecies","ctor","Observable","isObservable","x","hostReportError","enqueue","cleanupSubscription","subscription","cleanup","_cleanup","closeSubscription","_observer","_queue","_state","notifySubscription","observer","onNotify","flushSubscription","Subscription","subscriber","subscriptionObserver","SubscriptionObserver","_subscription","_proto2","complete","_subscriber","_proto3","_this2","_this3","_this4","C","hasSeed","hasValue","first","_this5","_len","sources","_key","startNext","flatMap","_this6","subscriptions","outer","inner","completeIfDone","closed","_step","_iterator","of","_len2","items","_key2","asyncMap","ZenObservable","merge","sourceA","sourceB","subscriptions_1","subscriptions_1_1","sub","subscribeTo","multicast","observers","observers_1","observers_1_1","obs","observers_2","observers_2_1","observers_3","observers_3_1","symbol","isTrackingEnabled","autocapture","isAttributionTrackingEnabled","isPageViewTrackingEnabled","isSessionTrackingEnabled","isNetworkTrackingEnabled","networkTracking","isElementInteractionsEnabled","elementInteractions","isFrustrationInteractionsEnabled","frustrationInteractions","getElementInteractionsConfig","getFrustrationInteractionsConfig","getNetworkTrackingConfig","networkTrackingConfig","networkTrackingOptions","captureRules","rule","urls","hosts","hostsString","urlsString","getPageViewTrackingConfig","eventType","trackOn","trackHistoryChanges","pageCounter","defaultTracking","pageViews","instance","convertProxyObjectToRealObject","name_1","isInstanceProxy","VERSION","LIBPREFIX","Context","library","userAgent","lastEventId","nextEventId","event_id","session_id","appVersion","app_version","trackingOptions","ipAddress","ip","partner_id","partnerId","ingestion_metadata","source_name","sourceName","source_version","sourceVersion","user_agent","MAX_ARRAY_LENGTH","LocalStorage","droppedEventsCount","SessionStorage","sessionStorage","XHRTransport","state","xhr","onreadystatechange","readyState","SendBeaconTransport","sendBeacon","parseLegacyCookies","apiKey_1","cookieStorage_1","cookieStorage","deleteLegacyCookies","cookieName","getOldCookieName","decode","parseTime","num","integer","isNaN","escape","DEFAULT_EVENT_PREFIX","DEFAULT_FORM_START_EVENT","DEFAULT_FORM_SUBMIT_EVENT","DEFAULT_FILE_DOWNLOAD_EVENT","DEFAULT_SESSION_START_EVENT","DEFAULT_SESSION_END_EVENT","FILE_EXTENSION","FILE_NAME","LINK_ID","LINK_TEXT","LINK_URL","FORM_ID","FORM_NAME","FORM_DESTINATION","DEFAULT_IDENTITY_STORAGE","BrowserConfig","cookieOptions","identityStorage","transport","fetchRemoteConfig","debugLogsEnabled","enableDiagnostics","diagnosticsSampleRate","expiration","upgrade","createTransport","version","_cookieStorage","_fetchRemoteConfig","updateStorage","_deviceId","_userId","_sessionId","_lastEventTime","_lastEventId","_pageCounter","_debugLogsEnabled","cache","cookieDomain","useBrowserConfig","args_1","amplitudeInstance","earlyConfig","getTopLevelDomain","_7","cookieConfig","parsed","createCookieStorage","legacyCookies","previousCookies","queryParams","ampTimestamp","Number","isWithinTimeLimit","ampDeviceId","previousSessionDeviceId","previousSessionUserId","_y","_z","_0","_1","_2","browserConfig","_3","_4","_5","_6","_diagnosticsSampleRate","hostname","parts","levels","cookieKeyUniqueId","omitUndefined","input","pageViewTrackingPlugin","amplitude","localConfig","isTracking","createPageViewEvent","locationHREF","href","getCampaignParams","shouldTrackOnPageLoad","previousURL","trackHistoryPageView","newURL","shouldTrackPageView","shouldTrackHistoryPageView","trackHistoryPageViewWrapper","history","pushState","Proxy","unused","pageViewEvent","isCampaignEvent","removeEventListener","$set","$unset","userProperties_1","every","trackingOption","newURLStr","oldURLStr","oldURL","formInteractionTracking","eventListeners","handler","initializeFormTracking","addFormInteractionListener","form","hasFormChanged","formDestination","extractFormAction","stringOrUndefined","getElementsByTagName","MutationObserver","mutations","mutation","addedNodes","node","nodeName","querySelectorAll","observe","subtree","childList","window_1","disconnect","getAttribute","encodeURI","fileDownloadTracking","initializeFileDownloadTracking","addFileDownloadListener","ext","exec","fileExtension","notified","networkConnectivityCheckerPlugin","addNetworkListener","onLine","translateRemoteConfigToLocal","propertyNames","propertyNames_1","propertyNames_1_1","propertyName","header","captureSafeHeaders","rageClick","rageClicks","deadClick","deadClicks","mergeUrls","urlsExact","urlsRegex","regexList","RegExp","regexError","updateBrowserConfigWithRemoteConfig","typedRemoteConfig","transformedAutocaptureRemoteConfig","pageUrlAllowlistRegex","transformedRcElementInteractions","exactAllowList","pageUrlAllowlist","captureRules_1","captureRules_1_1","attribution","fileDownloads","formInteractions","sessions","webVitals","AMPLITUDE_ELEMENT_CLICKED_EVENT","AMPLITUDE_EVENT_PROP_ELEMENT_TAG","AMPLITUDE_EVENT_PROP_ELEMENT_TEXT","AMPLITUDE_EVENT_PROP_PAGE_URL","AMPLITUDE_ORIGIN","AMPLITUDE_ORIGINS_MAP","US","EU","STAGING","DATA_AMP_MASK_ATTRIBUTES","SENSITIVE_TAGS","isElementPointerCursor","actionType","computedStyle","getComputedStyle","getPropertyValue","createShouldTrackEvent","autocaptureOptions","isAlwaysCaptureCursorPointer","pageUrlExcludelist","shouldTrackEventResolver","tag","tagName","elementType","isCursorPointer","hasMatchAnyAllowedSelector","selector","matches","parseAttributesToMask","attributeString","removeEmptyProperties","filteredProperties","isEmpty","getClosestElement","selectors","parentElement","MouseButton","filterOutNonTrackableEvents","closestTrackedAncestor","BLOCKED_ATTRIBUTES","SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST","SVG_TAGS","HIGHLY_SENSITIVE_INPUT_TYPES","getElementProperties","userMaskedAttributeNames","siblings","children","indexOfType","el","prevSiblingTag","previousElementSibling","prevSib","classes","classList","attributes","filteredAttributes","isSensitiveElement","isContentEditable","HTMLElement","isNonSensitiveElement","filteredAttributes_1","filteredAttributes_1_1","attrs","executeActions","ev","dataExtractor","extractDataFromDataSource","dataSource","targetElementProperties","destinationKey","DataExtractor","getHierarchy","hierarchy","targetEl","current","getAncestors","elementToAttributesToMaskMap","attributesToMask","constants.DATA_AMP_MASK_ATTRIBUTES","ancestorAttributesToMask","combinedAttributesToMask","hierarchyNode","hierarchy_1","hierarchy_1_1","getNearestLabel","labelElement","parent","getText","dataAttributePrefix","prefix","rect","getBoundingClientRect","left","top","currentElementAttributes","nearestLabel","attributeName","attributeValue","attributeKey","constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG","constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT","constants.AMPLITUDE_EVENT_PROP_PAGE_URL","innerHeight","innerWidth","HTMLAnchorElement","addTypeAndTimestamp","addAdditionalEventProperties","selectorAllowlist","isCapturingCursorPointer","baseEvent","isElementBasedEvent","contextElement","sourceType","sourceElement","scopingElement","documentElement","closest","getDataSource","elementExtractType","attribute","output","clonedTree","cloneNode","innerText","getEventTagProps","rawPatterns","maskTextRegex","compiled","rawPatterns_1","rawPatterns_1_1","entry","WindowMessenger","endpoint","requestCallbacks","onSelect","notify","onTrack","opener","postMessage","sendRequest","substr","responseData","isElementSelectable","cssSelectorAllowlist","actionClickAllowlist","amplitudeVisualTaggingSelectorInstance","eventData","actionData_1","scriptElement","createElement","async","src","once","head","appendChild","amplitudeVisualTaggingSelector","visualHighlightClass","messenger","diagnostics","ObservablesEnum","createMutationObservable","mutationObserver","characterData","createClickObservable","clickType","eventTypeToBrowserEventMap","groupLabeledEventIdsByEventType","labeledEvents","groupedLabeledEvents","browserEvent","labeledEvents_1","labeledEvents_1_1","le","definition","def","createLabeledEventToTriggerMap","triggers","labeledEventToTriggerMap","triggers_1","triggers_1_1","trigger","conditions","condition","eventId","existingTriggers","matchEventToLabeledEvents","filters","subprop_key","subprop_op","subprop_value","matchEventToFilter","TriggerEvaluator","evaluate","e_7","pageActions","matchingTriggers","leToTriggerMap","e_5","e_6","labeledEvents_2","labeledEvents_2_1","triggers_2","triggers_2_1","e_6_1","e_5_1","matchLabeledEventsToTriggers","matchingTriggers_1","matchingTriggers_1_1","e_7_1","update","autocapturePlugin","visualTaggingOptions","debounceTime","excludePattern","evaluateTriggers","createTriggerEvaluator","shouldTrackEvent","shouldTrackActionClick","allObservables","clickTrackingSubscription","changeSubscription","actionClickSubscription","remoteConfigClient","remotePageActions","recomputePageActionsData","navigateObservable","clickObservable","click","changeObservable","changeEvent","enrichedChangeEvent","navigation","navigateEvent","enrichedNavigateEvent","mutationObservable","ChangeObservable","ClickObservable","MutationObservable","NavigateObservable","createObservables","trackClicks","trackChange","filteredClickObservable","closestActionClickEl","clickEvent","mutationOrNavigate","clickMutationNavigateObservable","actionClickTimer","lastClickEvent","event_1","actionClick","trackActionClick","constants.AMPLITUDE_ORIGINS_MAP","CHANGE_EVENTS","addCoordinates","regionBox","pageX","pageY","yMin","yMax","xMin","xMax","isOutOfBounds","getRageClickAnalyticsEvent","clickWindow","firstClick","lastClick","rageClickEvent","X","Y","Time","trackRageClicks","shouldTrackRageClick","selectionObservable","clickBoundingBox","pendingRageClick","resetClickWindow","rageClickObservable","resolutionValue","isNewElement","isClickOutsideRageClickWindow","timerId","selectionSubscription","rageClickSubscription","getCssSelectorAllowlist","defaultAllowlist","frustrationPlugin","deadClicksEnabled","rageClicksEnabled","rageCssSelectors","deadCssSelectors","combinedCssSelectors","shouldTrackDeadClick","deadClickSubscription","enrichedNavigateObservable","enrichedMutationObservable","navigate","activeElement","selectionStart","selectionEnd","selection","getSelection","isCollapsed","SelectionObservable","Element","button","LEFT_OR_TOUCH_CONTACT","changeObservables","clicksAndChangeObservable","deadClickTimer","deadClickEvent","clientX","clientY","trackDeadClick","AMPLITUDE_NETWORK_REQUEST_EVENT","DEFAULT_STATUS_CODE_RANGE","wildcardMatch","regexPattern","isStatusCodeInRange","range","ranges","ranges_1","ranges_1_1","parseUrl","currentHref","urlObj","searchParams","fragment","hrefWithoutQueryOrHash","parseHeaderCaptureRule","isBodyCaptureRuleEmpty","blocklist","shouldTrackNetworkEvent","networkEvent","isMatch_1","ignoreAmplitudeRequests","ignoreHosts","ignoreHost","reverse","methods","allowedMethod","statusCodeRange","isCaptureRuleMatch","responseHeadersRule","requestHeadersRule","responseBody","responseBodyJson","requestBody","requestBodyJson","isAmplitudeNetworkRequestEvent","trackNetworkEvents","networkObservable","networkAnalyticsEvent","logNetworkAnalyticsEvent","networkCapturePlugin","eventWithProperties","NetworkObservable","persisted","timeStamp","delta","rating","requestAnimationFrame","getEntriesByType","responseStart","activationStart","prerendering","wasDiscarded","navigationType","WeakMap","h","hadRecentInput","at","PerformanceObserver","supportedEntryTypes","getEntries","buffered","u","visibilityState","isFinite","firstHiddenTime","onHidden","E","reportAllChanges","T","M","interactionId","w","interactionCount","F","L","entryType","A","requestIdleCallback","B","S","PerformanceEventTiming","durationThreshold","takeRecords","N","H","O","getMetricStartTime","metric","timeOrigin","processMetric","navigationStart","PreviousPageType","webVitalsPlugin","visibilityListener","doc","locationHref","webVitalsPayload","onLCP","onFCP","onINP","onCLS","onTTFB","domainWithoutSubdomain","isNewCampaign","previous","currentCampaign","prevReferringDomain","previousCampaign","isExcludedReferrer","excludeReferrers","isDirectTraffic","hasNewCampaign","hasNewDomain","referringDomain","WebAttribution","shouldTrackNewCampaign","initialEmptyValue","resetSessionOnNewCampaign","webExpStorageKey","init","fetchCampaign","isEventInNewSession","originalCampaign","generateCampaignEvent","campaign","campaignParameters","identifyEvent","campaignEvent","shouldSetSessionIdOnNewCampaign","CURRENT_PAGE_STORAGE_KEY","PREVIOUS_PAGE_STORAGE_KEY","URL_INFO_STORAGE_KEY","EXCLUDED_DEFAULT_EVENT_TYPES","pageUrlEnrichmentPlugin","internalDomains","isStorageEnabled","isProxied","getPrevPageType","previousPage","currentDomain","previousPageDomain","decodedUrl","getHostname","Direct","isCurrentInternal","isPrevInternal","Internal","External","saveUrlInfoWrapper","URLInfo","currentURL","storedCurrentURL","replaceState","updatedURLInfo","addIfNotExist","AmplitudeBrowser","userIdOrOptions","maybeOptions","shouldFetchRemoteConfig","browserOptions","logBrowserOptions","attributionTrackingOptions","webAttribution","querySessionId","ampSessionId","setSessionId","connector","detNotify","isFormInteractionTrackingEnabled","isWebVitalsEnabled","isPageUrlEnrichmentEnabled","cleanEventProperties","getUserId","setConnectorUserId","getDeviceId","setConnectorDeviceId","getOptOut","getSessionId","promises","previousSessionId","isCampaignEventTracked","trackCampaignEventIfNeeded","extendSession","setTransport","currentTime","browserConfigCopy","_setDiagnosticsSampleRate","createInstance","scriptUrl","normalized","registerSdkLoaderMetadata","currentScript","resolveCurrentScriptUrl","GlobalScope","createNamedInstance","_iq","invoked","instanceNames","queue_1"],"mappings":"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"}
1
+ {"version":3,"file":"amplitude-min.js","sources":["../../../../node_modules/.pnpm/@rollup+plugin-typescript@10.0.1_rollup@2.79.2_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js","../../../analytics-core/src/types/event/event.ts","../../../analytics-core/src/types/constants.ts","../../../analytics-core/src/identify.ts","../../../analytics-core/src/utils/valid-properties.ts","../../../analytics-core/src/types/status.ts","../../../analytics-core/src/utils/result-builder.ts","../../../analytics-core/src/revenue.ts","../../../analytics-core/src/global-scope.ts","../../../analytics-core/src/utils/uuid.ts","../../../analytics-core/src/timeline.ts","../../../analytics-core/src/utils/event-builder.ts","../../../analytics-core/src/utils/return-wrapper.ts","../../../analytics-core/src/core-client.ts","../../../analytics-core/src/types/messages.ts","../../../analytics-core/src/utils/chunk.ts","../../../analytics-core/src/types/loglevel.ts","../../../analytics-core/src/logger.ts","../../../analytics-core/src/config.ts","../../../analytics-core/src/utils/status-code.ts","../../../analytics-core/src/utils/debug.ts","../../../analytics-core/src/plugins/destination.ts","../../../../node_modules/.pnpm/@amplitude+analytics-connector@1.6.4/node_modules/@amplitude/analytics-connector/dist/analytics-connector.esm.js","../../../analytics-core/src/analytics-connector.ts","../../../analytics-core/src/plugins/identity.ts","../../../analytics-core/src/session.ts","../../../analytics-core/src/cookie-name.ts","../../../analytics-core/src/language.ts","../../../analytics-core/src/query-params.ts","../../../analytics-core/src/utils/url-utils.ts","../../../analytics-core/src/utils/sampling.ts","../../../analytics-core/src/storage/memory.ts","../../../analytics-core/src/storage/cookie.ts","../../../analytics-core/src/storage/helpers.ts","../../../analytics-core/src/storage/browser-storage.ts","../../../analytics-core/src/diagnostics/diagnostics-storage.ts","../../../analytics-core/src/diagnostics/uncaught-sdk-errors.ts","../../../analytics-core/src/diagnostics/diagnostics-client.ts","../../../analytics-core/src/transports/base.ts","../../../analytics-core/src/transports/fetch.ts","../../../analytics-core/src/remote-config/remote-config-localstorage.ts","../../../analytics-core/src/remote-config/remote-config.ts","../../../analytics-core/src/observers/console.ts","../../../analytics-core/src/types/server-zone.ts","../../../analytics-core/src/types/offline.ts","../../../analytics-core/src/types/element-interactions.ts","../../../analytics-core/src/types/frustration-interactions.ts","../../../analytics-core/src/utils/json-query.ts","../../../analytics-core/src/network-request-event.ts","../../../analytics-core/src/observers/network.ts","../../../analytics-core/src/campaign/campaign-parser.ts","../../../analytics-core/src/plugins/helpers.ts","../../../../node_modules/.pnpm/zen-observable-ts@1.1.0/node_modules/zen-observable-ts/module.js","../../../analytics-core/src/utils/observable.ts","../../../src/default-tracking.ts","../../../src/utils/snippet-helper.ts","../../../src/version.ts","../../../src/lib-prefix.ts","../../../src/plugins/context.ts","../../../src/storage/local-storage.ts","../../../src/storage/session-storage.ts","../../../src/transports/xhr.ts","../../../src/transports/send-beacon.ts","../../../src/cookie-migration/index.ts","../../../src/constants.ts","../../../src/config.ts","../../../plugin-page-view-tracking-browser/src/utils.ts","../../../plugin-page-view-tracking-browser/src/page-view-tracking.ts","../../../src/plugins/form-interaction-tracking.ts","../../../src/plugins/file-download-tracking.ts","../../../src/det-notification.ts","../../../src/plugins/network-connectivity-checker.ts","../../../src/config/joined-config.ts","../../../plugin-autocapture-browser/src/version.ts","../../../plugin-autocapture-browser/src/constants.ts","../../../plugin-autocapture-browser/src/helpers.ts","../../../plugin-autocapture-browser/src/hierarchy.ts","../../../plugin-autocapture-browser/src/pageActions/actions.ts","../../../plugin-autocapture-browser/src/libs/element-path.ts","../../../plugin-autocapture-browser/src/data-extractor.ts","../../../plugin-autocapture-browser/src/libs/messenger.ts","../../../plugin-autocapture-browser/src/observables.ts","../../../plugin-autocapture-browser/src/autocapture-plugin.ts","../../../plugin-autocapture-browser/src/pageActions/triggers.ts","../../../plugin-autocapture-browser/src/pageActions/matchEventToFilter.ts","../../../plugin-autocapture-browser/src/autocapture/track-click.ts","../../../plugin-autocapture-browser/src/autocapture/track-change.ts","../../../plugin-autocapture-browser/src/autocapture/track-action-click.ts","../../../plugin-autocapture-browser/src/autocapture/track-scroll.ts","../../../plugin-autocapture-browser/src/autocapture/track-viewport-content-updated.ts","../../../plugin-autocapture-browser/src/autocapture/track-exposure.ts","../../../plugin-autocapture-browser/src/autocapture/track-dead-click.ts","../../../plugin-autocapture-browser/src/autocapture/track-rage-click.ts","../../../plugin-autocapture-browser/src/frustration-plugin.ts","../../../plugin-network-capture-browser/src/network-capture-plugin.ts","../../../plugin-autocapture-browser/src/autocapture/track-error-click.ts","../../../plugin-network-capture-browser/src/constants.ts","../../../plugin-network-capture-browser/src/track-network-event.ts","../../../../node_modules/.pnpm/web-vitals@5.1.0/node_modules/web-vitals/dist/web-vitals.js","../../../plugin-web-vitals-browser/src/web-vitals-plugin.ts","../../../plugin-page-url-enrichment-browser/src/page-url-enrichment.ts","../../../plugin-web-vitals-browser/src/constants.ts","../../../src/attribution/helpers.ts","../../../src/attribution/web-attribution.ts","../../../src/browser-client.ts","../../../src/browser-client-factory.ts","../../../src/index.ts","../../../src/snippet-index.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","import { BaseEvent } from './base-event';\nimport { RevenueEventProperties } from '../../revenue';\n\nexport enum IdentifyOperation {\n // Base Operations to set values\n SET = '$set',\n SET_ONCE = '$setOnce',\n\n // Operations around modifying existing values\n ADD = '$add',\n APPEND = '$append',\n PREPEND = '$prepend',\n REMOVE = '$remove',\n\n // Operations around appending values *if* they aren't present\n PREINSERT = '$preInsert',\n POSTINSERT = '$postInsert',\n\n // Operations around removing properties/values\n UNSET = '$unset',\n CLEAR_ALL = '$clearAll',\n}\n\nexport type ValidPropertyType =\n | number\n | string\n | boolean\n | Array<string | number>\n | { [key: string]: ValidPropertyType }\n | Array<{ [key: string]: ValidPropertyType }>;\n\ninterface BaseOperationConfig {\n [key: string]: ValidPropertyType;\n}\n\nexport interface IdentifyUserProperties {\n // Add operations can only take numbers\n [IdentifyOperation.ADD]?: { [key: string]: number };\n\n // This reads the keys of the passed object, but the values are not used\n [IdentifyOperation.UNSET]?: BaseOperationConfig;\n // This option does not read the key as it unsets all user properties\n [IdentifyOperation.CLEAR_ALL]?: any;\n\n // These operations can take numbers, strings, or arrays of both.\n [IdentifyOperation.SET]?: BaseOperationConfig;\n [IdentifyOperation.SET_ONCE]?: BaseOperationConfig;\n [IdentifyOperation.APPEND]?: BaseOperationConfig;\n [IdentifyOperation.PREPEND]?: BaseOperationConfig;\n [IdentifyOperation.POSTINSERT]?: BaseOperationConfig;\n [IdentifyOperation.PREINSERT]?: BaseOperationConfig;\n [IdentifyOperation.REMOVE]?: BaseOperationConfig;\n}\n\n/**\n * Represents the structure of user properties that can be sent with an Identify or GroupIdentify event.\n *\n * This type supports both:\n *\n * 1. Reserved Amplitude identify operations via `IdentifyUserProperties`:\n * These operations enable structured updates to user properties.\n *\n * Example:\n * ```ts\n * {\n * $set: { plan: 'premium', login_count: 1 },\n * $add: { login_count: 1 },\n * $unset: { plan: '-' },\n * $clearAll: '-'\n * }\n * ```\n *\n * 2. Custom user-defined properties (excluding reserved operation keys):\n * Useful for assigning static properties without using Identify operations.\n *\n * Example:\n * ```ts\n * {\n * custom_flag: true,\n * experiment_group: 'B',\n * favorite_color: 'blue'\n * }\n * ```\n *\n * This union ensures compatibility with Amplitude's identify semantics\n * while allowing flexibility to define arbitrary non-reserved properties.\n */\nexport type UserProperties =\n | IdentifyUserProperties\n | {\n [key in Exclude<string, IdentifyOperation>]: any;\n };\n\n/**\n * Strings that have special meaning when used as an event's type\n * and have different specifications.\n */\nexport enum SpecialEventType {\n IDENTIFY = '$identify',\n GROUP_IDENTIFY = '$groupidentify',\n REVENUE = 'revenue_amount',\n}\n\nexport interface TrackEvent extends BaseEvent {\n event_type: Exclude<string, SpecialEventType>;\n}\n\nexport interface IdentifyEvent extends BaseEvent {\n event_type: SpecialEventType.IDENTIFY;\n user_properties: UserProperties;\n}\n\nexport interface GroupIdentifyEvent extends BaseEvent {\n event_type: SpecialEventType.GROUP_IDENTIFY;\n group_properties: UserProperties;\n}\n\nexport interface RevenueEvent extends BaseEvent {\n event_type: SpecialEventType.REVENUE;\n event_properties:\n | RevenueEventProperties\n | {\n [key: string]: any;\n };\n}\n\nexport type Event = TrackEvent | IdentifyEvent | GroupIdentifyEvent | RevenueEvent;\n","import { Campaign } from './campaign';\n\nexport const UNSET_VALUE = '-';\nexport const AMPLITUDE_PREFIX = 'AMP';\nexport const STORAGE_PREFIX = `${AMPLITUDE_PREFIX}_unsent`;\nexport const DEFAULT_INSTANCE_NAME = '$default_instance';\nexport const AMPLITUDE_SERVER_URL = 'https://api2.amplitude.com/2/httpapi';\nexport const EU_AMPLITUDE_SERVER_URL = 'https://api.eu.amplitude.com/2/httpapi';\nexport const AMPLITUDE_BATCH_SERVER_URL = 'https://api2.amplitude.com/batch';\nexport const EU_AMPLITUDE_BATCH_SERVER_URL = 'https://api.eu.amplitude.com/batch';\n\n// Campaign constants\nexport const UTM_CAMPAIGN = 'utm_campaign';\nexport const UTM_CONTENT = 'utm_content';\nexport const UTM_ID = 'utm_id';\nexport const UTM_MEDIUM = 'utm_medium';\nexport const UTM_SOURCE = 'utm_source';\nexport const UTM_TERM = 'utm_term';\n\nexport const DCLID = 'dclid';\nexport const FBCLID = 'fbclid';\nexport const GBRAID = 'gbraid';\nexport const GCLID = 'gclid';\nexport const KO_CLICK_ID = 'ko_click_id';\nexport const LI_FAT_ID = 'li_fat_id';\nexport const MSCLKID = 'msclkid';\nexport const RDT_CID = 'rdt_cid';\nexport const TTCLID = 'ttclid';\nexport const TWCLID = 'twclid';\nexport const WBRAID = 'wbraid';\n\nexport const EMPTY_VALUE = 'EMPTY';\n\nexport const BASE_CAMPAIGN: Campaign = {\n utm_campaign: undefined,\n utm_content: undefined,\n utm_id: undefined,\n utm_medium: undefined,\n utm_source: undefined,\n utm_term: undefined,\n referrer: undefined,\n referring_domain: undefined,\n dclid: undefined,\n gbraid: undefined,\n gclid: undefined,\n fbclid: undefined,\n ko_click_id: undefined,\n li_fat_id: undefined,\n msclkid: undefined,\n rdt_cid: undefined,\n ttclid: undefined,\n twclid: undefined,\n wbraid: undefined,\n};\n\nexport const MKTG = 'MKTG';\n\n// list of Network headers that are safe to capture\nexport const SAFE_HEADERS = [\n 'access-control-allow-origin',\n 'access-control-allow-credentials',\n 'access-control-expose-headers',\n 'access-control-max-age',\n 'access-control-allow-methods',\n 'access-control-allow-headers',\n 'accept-patch',\n 'accept-ranges',\n 'age',\n 'allow',\n 'alt-svc',\n 'cache-control',\n 'connection',\n 'content-disposition',\n 'content-encoding',\n 'content-language',\n 'content-length',\n 'content-location',\n 'content-md5',\n 'content-range',\n 'content-type',\n 'date',\n 'delta-base',\n 'etag',\n 'expires',\n 'im',\n 'last-modified',\n 'link',\n 'location',\n 'permanent',\n 'p3p',\n 'pragma',\n 'proxy-authenticate',\n 'public-key-pins',\n 'retry-after',\n 'server',\n 'status',\n 'strict-transport-security',\n 'trailer',\n 'transfer-encoding',\n 'tk',\n 'upgrade',\n 'vary',\n 'via',\n 'warning',\n 'www-authenticate',\n 'x-b3-traceid',\n 'x-frame-options',\n];\n\n// list of Network headers to never capture\nexport const FORBIDDEN_HEADERS = ['authorization', 'cookie', 'set-cookie'];\n","import { UNSET_VALUE } from './types/constants';\nimport { isValidProperties } from './utils/valid-properties';\n\nexport interface IIdentify {\n getUserProperties(): IdentifyUserProperties;\n set(property: string, value: ValidPropertyType): IIdentify;\n setOnce(property: string, value: ValidPropertyType): IIdentify;\n append(property: string, value: ValidPropertyType): IIdentify;\n prepend(property: string, value: ValidPropertyType): IIdentify;\n postInsert(property: string, value: ValidPropertyType): IIdentify;\n preInsert(property: string, value: ValidPropertyType): IIdentify;\n remove(property: string, value: ValidPropertyType): IIdentify;\n add(property: string, value: number): IIdentify;\n unset(property: string): IIdentify;\n clearAll(): IIdentify;\n}\n\nexport class Identify implements IIdentify {\n protected readonly _propertySet: Set<string> = new Set<string>();\n protected _properties: IdentifyUserProperties = {};\n\n public getUserProperties(): IdentifyUserProperties {\n return { ...this._properties };\n }\n\n public set(property: string, value: ValidPropertyType): Identify {\n this._safeSet(IdentifyOperation.SET, property, value);\n return this;\n }\n\n public setOnce(property: string, value: ValidPropertyType): Identify {\n this._safeSet(IdentifyOperation.SET_ONCE, property, value);\n return this;\n }\n\n public append(property: string, value: ValidPropertyType): Identify {\n this._safeSet(IdentifyOperation.APPEND, property, value);\n return this;\n }\n\n public prepend(property: string, value: ValidPropertyType): Identify {\n this._safeSet(IdentifyOperation.PREPEND, property, value);\n return this;\n }\n\n public postInsert(property: string, value: ValidPropertyType): Identify {\n this._safeSet(IdentifyOperation.POSTINSERT, property, value);\n return this;\n }\n\n public preInsert(property: string, value: ValidPropertyType): Identify {\n this._safeSet(IdentifyOperation.PREINSERT, property, value);\n return this;\n }\n\n public remove(property: string, value: ValidPropertyType): Identify {\n this._safeSet(IdentifyOperation.REMOVE, property, value);\n return this;\n }\n\n public add(property: string, value: number): Identify {\n this._safeSet(IdentifyOperation.ADD, property, value);\n return this;\n }\n\n public unset(property: string): Identify {\n this._safeSet(IdentifyOperation.UNSET, property, UNSET_VALUE);\n return this;\n }\n\n public clearAll(): Identify {\n // When clear all happens, all properties are unset. Reset the entire object.\n this._properties = {};\n this._properties[IdentifyOperation.CLEAR_ALL] = UNSET_VALUE;\n\n return this;\n }\n\n // Returns whether or not this set actually worked.\n private _safeSet(operation: IdentifyOperation, property: string, value: ValidPropertyType): boolean {\n if (this._validate(operation, property, value)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n let userPropertyMap: any = this._properties[operation];\n if (userPropertyMap === undefined) {\n userPropertyMap = {};\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n this._properties[operation] = userPropertyMap;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n userPropertyMap[property] = value;\n this._propertySet.add(property);\n return true;\n }\n\n return false;\n }\n\n private _validate(operation: IdentifyOperation, property: string, value: ValidPropertyType): boolean {\n if (this._properties[IdentifyOperation.CLEAR_ALL] !== undefined) {\n // clear all already set. Skipping operation;\n return false;\n }\n\n if (this._propertySet.has(property)) {\n // Property already used. Skipping operation\n return false;\n }\n\n if (operation === IdentifyOperation.ADD) {\n return typeof value === 'number';\n }\n\n if (operation !== IdentifyOperation.UNSET && operation !== IdentifyOperation.REMOVE) {\n return isValidProperties(property, value);\n }\n return true;\n }\n}\n\nexport type ValidPropertyType =\n | number\n | string\n | boolean\n | Array<string | number>\n | { [key: string]: ValidPropertyType }\n | Array<{ [key: string]: ValidPropertyType }>;\n\ninterface BaseOperationConfig {\n [key: string]: ValidPropertyType;\n}\n\nexport interface IdentifyUserProperties {\n // Add operations can only take numbers\n [IdentifyOperation.ADD]?: { [key: string]: number };\n\n // This reads the keys of the passed object, but the values are not used\n [IdentifyOperation.UNSET]?: BaseOperationConfig;\n // This option does not read the key as it unsets all user properties\n [IdentifyOperation.CLEAR_ALL]?: any;\n\n // These operations can take numbers, strings, or arrays of both.\n [IdentifyOperation.SET]?: BaseOperationConfig;\n [IdentifyOperation.SET_ONCE]?: BaseOperationConfig;\n [IdentifyOperation.APPEND]?: BaseOperationConfig;\n [IdentifyOperation.PREPEND]?: BaseOperationConfig;\n [IdentifyOperation.POSTINSERT]?: BaseOperationConfig;\n [IdentifyOperation.PREINSERT]?: BaseOperationConfig;\n [IdentifyOperation.REMOVE]?: BaseOperationConfig;\n}\n\nexport enum IdentifyOperation {\n // Base Operations to set values\n SET = '$set',\n SET_ONCE = '$setOnce',\n\n // Operations around modifying existing values\n ADD = '$add',\n APPEND = '$append',\n PREPEND = '$prepend',\n REMOVE = '$remove',\n\n // Operations around appending values *if* they aren't present\n PREINSERT = '$preInsert',\n POSTINSERT = '$postInsert',\n\n // Operations around removing properties/values\n UNSET = '$unset',\n CLEAR_ALL = '$clearAll',\n}\n\n/**\n * Note that the order of operations should align with https://github.com/amplitude/nova/blob/7701b5986b565d4b2fb53b99a9f2175df055dea8/src/main/java/com/amplitude/ingestion/core/UserPropertyUtils.java#L210\n */\nexport const OrderedIdentifyOperations = [\n IdentifyOperation.CLEAR_ALL,\n IdentifyOperation.UNSET,\n IdentifyOperation.SET,\n IdentifyOperation.SET_ONCE,\n IdentifyOperation.ADD,\n IdentifyOperation.APPEND,\n IdentifyOperation.PREPEND,\n IdentifyOperation.PREINSERT,\n IdentifyOperation.POSTINSERT,\n IdentifyOperation.REMOVE,\n];\n","const MAX_PROPERTY_KEYS = 1000;\n\nexport const isValidObject = (properties: { [key: string]: any }): boolean => {\n if (Object.keys(properties).length > MAX_PROPERTY_KEYS) {\n return false;\n }\n for (const key in properties) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const value = properties[key];\n if (!isValidProperties(key, value)) return false;\n }\n return true;\n};\n\nexport const isValidProperties = (property: string, value: any): boolean => {\n if (typeof property !== 'string') return false;\n if (Array.isArray(value)) {\n let isValid = true;\n for (const valueElement of value) {\n if (Array.isArray(valueElement)) {\n return false;\n } else if (typeof valueElement === 'object') {\n isValid = isValid && isValidObject(valueElement as object);\n } else if (!['number', 'string'].includes(typeof valueElement)) {\n return false;\n }\n if (!isValid) {\n return false;\n }\n }\n } else if (value === null || value === undefined) {\n return false;\n } else if (typeof value === 'object') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return isValidObject(value);\n } else if (!['number', 'string', 'boolean'].includes(typeof value)) {\n return false;\n }\n return true;\n};\n","/** The status of an event. */\nexport enum Status {\n /** The status could not be determined. */\n Unknown = 'unknown',\n /** The event was skipped due to configuration or callbacks. */\n Skipped = 'skipped',\n /** The event was sent successfully. */\n Success = 'success',\n /** A user or device in the payload is currently rate limited and should try again later. */\n RateLimit = 'rate_limit',\n /** The sent payload was too large to be processed. */\n PayloadTooLarge = 'payload_too_large',\n /** The event could not be processed. */\n Invalid = 'invalid',\n /** A server-side error ocurred during submission. */\n Failed = 'failed',\n /** a server or client side error occuring when a request takes too long and is cancelled */\n Timeout = 'Timeout',\n /** NodeJS runtime environment error.. E.g. disconnected from network */\n SystemError = 'SystemError',\n}\n","import { Event } from '../types/event/event';\nimport { Result } from '../types/result';\nimport { Status } from '../types/status';\n\nexport const buildResult = (event: Event, code = 0, message: string = Status.Unknown): Result => {\n return { event, code, message };\n};\n","import { isValidObject } from './utils/valid-properties';\n\nexport interface IRevenue {\n getEventProperties(): RevenueEventProperties;\n setProductId(productId: string): IRevenue;\n setQuantity(quantity: number): IRevenue;\n setPrice(price: number): IRevenue;\n setRevenueType(revenueType: string): IRevenue;\n setCurrency(currency: string): IRevenue;\n setEventProperties(properties: { [key: string]: any }): IRevenue;\n setRevenue(revenue: number): IRevenue;\n setReceipt(receipt: string): IRevenue;\n setReceiptSig(receiptSig: string): IRevenue;\n}\n\nexport class Revenue implements IRevenue {\n private productId: string;\n private quantity: number;\n private price: number;\n private revenueType?: string;\n private currency?: string;\n private properties?: { [key: string]: any };\n private revenue?: number;\n private receipt?: string;\n private receiptSig?: string;\n\n constructor() {\n this.productId = '';\n this.quantity = 1;\n this.price = 0.0;\n }\n\n setProductId(productId: string) {\n this.productId = productId;\n return this;\n }\n\n setQuantity(quantity: number) {\n if (quantity > 0) {\n this.quantity = quantity;\n }\n return this;\n }\n\n setPrice(price: number) {\n this.price = price;\n return this;\n }\n\n setRevenueType(revenueType: string) {\n this.revenueType = revenueType;\n return this;\n }\n\n setCurrency(currency: string) {\n this.currency = currency;\n return this;\n }\n\n setRevenue(revenue: number) {\n this.revenue = revenue;\n return this;\n }\n\n setReceipt(receipt: string) {\n this.receipt = receipt;\n return this;\n }\n\n setReceiptSig(receiptSig: string) {\n this.receiptSig = receiptSig;\n return this;\n }\n\n setEventProperties(properties: { [key: string]: ValidPropertyType }) {\n if (isValidObject(properties)) {\n this.properties = properties;\n }\n return this;\n }\n\n getEventProperties(): RevenueEventProperties {\n const eventProperties: RevenueEventProperties = this.properties ? { ...this.properties } : {};\n eventProperties[RevenueProperty.REVENUE_PRODUCT_ID] = this.productId;\n eventProperties[RevenueProperty.REVENUE_QUANTITY] = this.quantity;\n eventProperties[RevenueProperty.REVENUE_PRICE] = this.price;\n eventProperties[RevenueProperty.REVENUE_TYPE] = this.revenueType;\n eventProperties[RevenueProperty.REVENUE_CURRENCY] = this.currency;\n eventProperties[RevenueProperty.REVENUE] = this.revenue;\n eventProperties[RevenueProperty.RECEIPT] = this.receipt;\n eventProperties[RevenueProperty.RECEIPT_SIG] = this.receiptSig;\n return eventProperties;\n }\n}\n\nexport interface RevenueEventProperties {\n [RevenueProperty.REVENUE_PRODUCT_ID]?: string;\n [RevenueProperty.REVENUE_QUANTITY]?: number;\n [RevenueProperty.REVENUE_PRICE]?: number;\n [RevenueProperty.REVENUE_TYPE]?: string;\n [RevenueProperty.REVENUE_CURRENCY]?: string;\n [RevenueProperty.REVENUE]?: number;\n [RevenueProperty.RECEIPT]?: string;\n [RevenueProperty.RECEIPT_SIG]?: string;\n}\n\nexport enum RevenueProperty {\n REVENUE_PRODUCT_ID = '$productId',\n REVENUE_QUANTITY = '$quantity',\n REVENUE_PRICE = '$price',\n REVENUE_TYPE = '$revenueType',\n REVENUE_CURRENCY = '$currency',\n REVENUE = '$revenue',\n RECEIPT = '$receipt',\n RECEIPT_SIG = '$receiptSig',\n}\n\nexport type ValidPropertyType =\n | number\n | string\n | boolean\n | Array<string | number>\n | { [key: string]: ValidPropertyType }\n | Array<{ [key: string]: ValidPropertyType }>;\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","/**\n * Source: [jed's gist's comment]{@link https://gist.github.com/jed/982883?permalink_comment_id=3223002#gistcomment-3223002}.\n * Returns a random v4 UUID of the form xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx,\n * where each x is replaced with a random hexadecimal digit from 0 to f, and\n * y is replaced with a random hexadecimal digit from 8 to b.\n * Used to generate UUIDs for deviceIds.\n * @private\n */\n\nimport { getGlobalScope } from '../global-scope';\n\nconst legacyUUID = function (a?: any): string {\n return a // if the placeholder was passed, return\n ? // a random number from 0 to 15\n (\n a ^ // unless b is 8,\n ((Math.random() * // in which case\n 16) >> // a random number from\n (a / 4))\n ) // 8 to 11\n .toString(16) // in hexadecimal\n : // or otherwise a concatenated string:\n (\n String(1e7) + // 10000000 +\n String(-1e3) + // -1000 +\n String(-4e3) + // -4000 +\n String(-8e3) + // -80000000 +\n String(-1e11)\n ) // -100000000000,\n .replace(\n // replacing\n /[018]/g, // zeroes, ones, and eights with\n UUID, // random hex digits\n );\n};\n\nconst hex: string[] = [...Array(256).keys()].map((index) => index.toString(16).padStart(2, '0'));\n\nexport const UUID = (a?: any): string => {\n const globalScope = getGlobalScope();\n\n /* istanbul ignore next */\n if (!globalScope?.crypto?.getRandomValues) {\n // Fallback to legacy UUID generation if crypto is not available\n return legacyUUID(a);\n }\n\n const r = globalScope.crypto.getRandomValues(new Uint8Array(16));\n\n r[6] = (r[6] & 0x0f) | 0x40;\n r[8] = (r[8] & 0x3f) | 0x80;\n\n return [...r.entries()].map(([index, int]) => ([4, 6, 8, 10].includes(index) ? `-${hex[int]}` : hex[int])).join('');\n};\n","import { AnalyticsIdentity, BeforePlugin, DestinationPlugin, EnrichmentPlugin, Plugin } from './types/plugin';\nimport { CoreClient } from './types/client/core-client';\nimport { IConfig } from './types/config/core-config';\nimport { ILogger } from './logger';\nimport { EventCallback } from './types/event-callback';\nimport { Event } from './types/event/event';\nimport { Result } from './types/result';\nimport { buildResult } from './utils/result-builder';\nimport { UUID } from './utils/uuid';\n\nexport class Timeline {\n queue: [Event, EventCallback][] = [];\n // Flag to guarantee one schedule apply is running\n applying = false;\n // Flag indicates whether timeline is ready to process event\n // Events collected before timeline is ready will stay in the queue to be processed later\n plugins: Plugin[] = [];\n // loggerProvider is set by the client at _init()\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n loggerProvider: ILogger;\n\n constructor(private client: CoreClient) {}\n\n async register(plugin: Plugin, config: IConfig) {\n if (this.plugins.some((existingPlugin) => existingPlugin.name === plugin.name)) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n this.loggerProvider.warn(`Plugin with name ${plugin.name} already exists, skipping registration`);\n return;\n }\n\n if (plugin.name === undefined) {\n plugin.name = UUID();\n this.loggerProvider.warn(`Plugin name is undefined. \n Generating a random UUID for plugin name: ${plugin.name}. \n Set a name for the plugin to prevent it from being added multiple times.`);\n }\n\n plugin.type = plugin.type ?? 'enrichment';\n await plugin.setup?.(config, this.client);\n this.plugins.push(plugin);\n }\n\n async deregister(pluginName: string, config: IConfig) {\n const index = this.plugins.findIndex((plugin) => plugin.name === pluginName);\n if (index === -1) {\n config.loggerProvider.warn(`Plugin with name ${pluginName} does not exist, skipping deregistration`);\n return;\n }\n const plugin = this.plugins[index];\n this.plugins.splice(index, 1);\n await plugin.teardown?.();\n }\n\n reset(client: CoreClient) {\n this.applying = false;\n const plugins = this.plugins;\n plugins.map((plugin) => plugin.teardown?.());\n this.plugins = [];\n this.client = client;\n }\n\n push(event: Event) {\n return new Promise<Result>((resolve) => {\n this.queue.push([event, resolve]);\n this.scheduleApply(0);\n });\n }\n\n scheduleApply(timeout: number) {\n if (this.applying) return;\n this.applying = true;\n setTimeout(() => {\n void this.apply(this.queue.shift()).then(() => {\n this.applying = false;\n if (this.queue.length > 0) {\n this.scheduleApply(0);\n }\n });\n }, timeout);\n }\n\n async apply(item: [Event, EventCallback] | undefined) {\n if (!item) {\n return;\n }\n\n let [event] = item;\n const [, resolve] = item;\n\n // Log initial event\n this.loggerProvider.log('Timeline.apply: Initial event', event);\n\n const before = this.plugins.filter<BeforePlugin>(\n (plugin: Plugin): plugin is BeforePlugin => plugin.type === 'before',\n );\n\n for (const plugin of before) {\n /* istanbul ignore if */\n if (!plugin.execute) {\n // do nothing\n continue;\n }\n const e = await plugin.execute({ ...event });\n if (e === null) {\n this.loggerProvider.log(\n `Timeline.apply: Event filtered out by before plugin '${String(plugin.name)}', event: ${JSON.stringify(\n event,\n )}`,\n );\n resolve({ event, code: 0, message: '' });\n return;\n } else {\n event = e;\n this.loggerProvider.log(\n `Timeline.apply: Event after before plugin '${String(plugin.name)}', event: ${JSON.stringify(event)}`,\n );\n }\n }\n\n const enrichment = this.plugins.filter<EnrichmentPlugin>(\n (plugin: Plugin): plugin is EnrichmentPlugin => plugin.type === 'enrichment' || plugin.type === undefined,\n );\n\n for (const plugin of enrichment) {\n /* istanbul ignore if */\n if (!plugin.execute) {\n // do nothing\n continue;\n }\n const e = await plugin.execute({ ...event });\n if (e === null) {\n this.loggerProvider.log(\n `Timeline.apply: Event filtered out by enrichment plugin '${String(plugin.name)}', event: ${JSON.stringify(\n event,\n )}`,\n );\n resolve({ event, code: 0, message: '' });\n return;\n } else {\n event = e;\n this.loggerProvider.log(\n `Timeline.apply: Event after enrichment plugin '${String(plugin.name)}', event: ${JSON.stringify(event)}`,\n );\n }\n }\n\n const destination = this.plugins.filter<DestinationPlugin>(\n (plugin: Plugin): plugin is DestinationPlugin => plugin.type === 'destination',\n );\n\n // Log final event before sending to destinations\n this.loggerProvider.log(`Timeline.apply: Final event before destinations, event: ${JSON.stringify(event)}`);\n\n const executeDestinations = destination.map((plugin) => {\n const eventClone = { ...event };\n return plugin.execute(eventClone).catch((e) => buildResult(eventClone, 0, String(e)));\n });\n\n void Promise.all(executeDestinations).then(([result]) => {\n const resolveResult =\n result || buildResult(event, 100, 'Event not tracked, no destination plugins on the instance');\n resolve(resolveResult);\n });\n\n return;\n }\n\n async flush() {\n const queue = this.queue;\n this.queue = [];\n\n await Promise.all(queue.map((item) => this.apply(item)));\n\n const destination = this.plugins.filter<DestinationPlugin>(\n (plugin: Plugin): plugin is DestinationPlugin => plugin.type === 'destination',\n );\n\n const executeDestinations = destination.map((plugin) => {\n return plugin.flush && plugin.flush();\n });\n\n await Promise.all(executeDestinations);\n }\n\n onIdentityChanged(identity: AnalyticsIdentity) {\n this.plugins.forEach((plugin) => {\n // Intentionally to not await plugin.onIdentityChanged() for non-blocking.\n // Ignore optional channing next line for test coverage.\n // If the plugin doesn't implement it, it won't be called.\n /* istanbul ignore next */\n void plugin.onIdentityChanged?.(identity);\n });\n }\n\n onSessionIdChanged(sessionId: number) {\n this.plugins.forEach((plugin) => {\n // Intentionally to not await plugin.onSessionIdChanged() for non-blocking.\n // Ignore optional channing next line for test coverage.\n // If the plugin doesn't implement it, it won't be called.\n /* istanbul ignore next */\n void plugin.onSessionIdChanged?.(sessionId);\n });\n }\n\n onOptOutChanged(optOut: boolean) {\n this.plugins.forEach((plugin) => {\n // Intentionally to not await plugin.onOptOutChanged() for non-blocking.\n // Ignore optional channing next line for test coverage.\n // If the plugin doesn't implement it, it won't be called.\n /* istanbul ignore next */\n void plugin.onOptOutChanged?.(optOut);\n });\n }\n\n onReset() {\n this.plugins.forEach((plugin) => {\n // Intentionally to not await plugin.onReset() for non-blocking.\n // Ignore optional channing next line for test coverage.\n // If the plugin doesn't implement it, it won't be called.\n /* istanbul ignore next */\n void plugin.onReset?.();\n });\n }\n}\n","import { Identify, IIdentify } from '../identify';\nimport { IRevenue } from '../revenue';\nimport { BaseEvent, EventOptions } from '../types/event/base-event';\nimport { TrackEvent, IdentifyEvent, GroupIdentifyEvent, SpecialEventType, RevenueEvent } from '../types/event/event';\n\nexport const createTrackEvent = (\n eventInput: BaseEvent | string,\n eventProperties?: Record<string, any>,\n eventOptions?: EventOptions,\n): TrackEvent => {\n const baseEvent: BaseEvent = typeof eventInput === 'string' ? { event_type: eventInput } : eventInput;\n return {\n ...baseEvent,\n ...eventOptions,\n ...(eventProperties && { event_properties: eventProperties }),\n };\n};\n\nexport const createIdentifyEvent = (identify: IIdentify, eventOptions?: EventOptions): IdentifyEvent => {\n const identifyEvent: IdentifyEvent = {\n ...eventOptions,\n event_type: SpecialEventType.IDENTIFY,\n user_properties: identify.getUserProperties(),\n };\n\n return identifyEvent;\n};\n\nexport const createGroupIdentifyEvent = (\n groupType: string,\n groupName: string | string[],\n identify: IIdentify,\n eventOptions?: EventOptions,\n): GroupIdentifyEvent => {\n const groupIdentify: GroupIdentifyEvent = {\n ...eventOptions,\n event_type: SpecialEventType.GROUP_IDENTIFY,\n group_properties: identify.getUserProperties(),\n groups: {\n [groupType]: groupName,\n },\n };\n\n return groupIdentify;\n};\n\nexport const createGroupEvent = (groupType: string, groupName: string | string[], eventOptions?: EventOptions) => {\n const identify = new Identify();\n identify.set(groupType, groupName);\n\n const groupEvent: IdentifyEvent = {\n ...eventOptions,\n event_type: SpecialEventType.IDENTIFY,\n user_properties: identify.getUserProperties(),\n groups: {\n [groupType]: groupName,\n },\n };\n return groupEvent;\n};\n\nexport const createRevenueEvent = (revenue: IRevenue, eventOptions?: EventOptions): RevenueEvent => {\n return {\n ...eventOptions,\n event_type: SpecialEventType.REVENUE,\n event_properties: revenue.getEventProperties(),\n };\n};\n","export interface AmplitudeReturn<T> {\n promise: Promise<T>;\n}\n\nexport const returnWrapper: {\n (): AmplitudeReturn<void>;\n <T>(awaitable: Promise<T>): AmplitudeReturn<T>;\n} = <T>(awaitable?: Promise<T>) => ({\n promise: awaitable || Promise.resolve(),\n});\n","import { Plugin } from './types/plugin';\nimport { IConfig } from './types/config/core-config';\nimport { BaseEvent, EventOptions } from './types/event/base-event';\nimport { Result } from './types/result';\nimport {\n Event,\n IdentifyOperation,\n IdentifyUserProperties,\n SpecialEventType,\n UserProperties,\n} from './types/event/event';\nimport { IIdentify, OrderedIdentifyOperations } from './identify';\nimport { IRevenue } from './revenue';\nimport { CLIENT_NOT_INITIALIZED, OPT_OUT_MESSAGE } from './types/messages';\nimport { Timeline } from './timeline';\nimport {\n createGroupEvent,\n createGroupIdentifyEvent,\n createIdentifyEvent,\n createRevenueEvent,\n createTrackEvent,\n} from './utils/event-builder';\nimport { buildResult } from './utils/result-builder';\nimport { returnWrapper } from './utils/return-wrapper';\nimport { CoreClient, PluginHost } from './types/client/core-client';\nexport class AmplitudeCore implements CoreClient, PluginHost {\n protected initializing = false;\n protected name: string;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n config: IConfig;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n timeline: Timeline;\n isReady = false;\n protected q: Array<CallableFunction | typeof returnWrapper> = [];\n protected dispatchQ: Array<CallableFunction> = [];\n\n constructor(name = '$default') {\n this.timeline = new Timeline(this);\n this.name = name;\n }\n\n protected async _init(config: IConfig) {\n this.config = config;\n this.timeline.reset(this);\n this.timeline.loggerProvider = this.config.loggerProvider;\n await this.runQueuedFunctions('q');\n this.isReady = true;\n }\n\n async runQueuedFunctions(queueName: 'q' | 'dispatchQ') {\n const queuedFunctions = this[queueName];\n this[queueName] = [];\n for (const queuedFunction of queuedFunctions) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const val: ReturnType<typeof returnWrapper> | Promise<any> = queuedFunction();\n if (val && 'promise' in val) {\n await val.promise;\n } else {\n await val;\n }\n }\n // Rerun queued functions if the queue has accrued more while awaiting promises\n if (this[queueName].length) {\n await this.runQueuedFunctions(queueName);\n }\n }\n\n track(eventInput: BaseEvent | string, eventProperties?: Record<string, any>, eventOptions?: EventOptions) {\n const event = createTrackEvent(eventInput, eventProperties, eventOptions);\n return returnWrapper(this.dispatch(event));\n }\n\n logEvent = this.track.bind(this);\n\n identify(identify: IIdentify, eventOptions?: EventOptions) {\n const event = createIdentifyEvent(identify, eventOptions);\n return returnWrapper(this.dispatch(event));\n }\n\n groupIdentify(groupType: string, groupName: string | string[], identify: IIdentify, eventOptions?: EventOptions) {\n const event = createGroupIdentifyEvent(groupType, groupName, identify, eventOptions);\n return returnWrapper(this.dispatch(event));\n }\n\n setGroup(groupType: string, groupName: string | string[], eventOptions?: EventOptions) {\n const event = createGroupEvent(groupType, groupName, eventOptions);\n return returnWrapper(this.dispatch(event));\n }\n\n revenue(revenue: IRevenue, eventOptions?: EventOptions) {\n const event = createRevenueEvent(revenue, eventOptions);\n return returnWrapper(this.dispatch(event));\n }\n\n add(plugin: Plugin) {\n if (!this.isReady) {\n this.q.push(this._addPlugin.bind(this, plugin));\n return returnWrapper();\n }\n return this._addPlugin(plugin);\n }\n\n _addPlugin(plugin: Plugin) {\n return returnWrapper(this.timeline.register(plugin, this.config));\n }\n\n remove(pluginName: string) {\n if (!this.isReady) {\n this.q.push(this._removePlugin.bind(this, pluginName));\n return returnWrapper();\n }\n return this._removePlugin(pluginName);\n }\n\n _removePlugin(pluginName: string) {\n return returnWrapper(this.timeline.deregister(pluginName, this.config));\n }\n\n dispatchWithCallback(event: Event, callback: (result: Result) => void): void {\n if (!this.isReady) {\n return callback(buildResult(event, 0, CLIENT_NOT_INITIALIZED));\n }\n void this.process(event).then(callback);\n }\n\n async dispatch(event: Event): Promise<Result> {\n if (!this.isReady) {\n return new Promise<Result>((resolve) => {\n this.dispatchQ.push(this.dispatchWithCallback.bind(this, event, resolve));\n });\n }\n\n return this.process(event);\n }\n\n /**\n *\n * This method applies identify operations to user properties and\n * returns a single object representing the final user property state.\n *\n * This is a best-effort api that only supports $set, $clearAll, and $unset.\n * Other operations are not supported and are ignored.\n *\n *\n * @param userProperties The `event.userProperties` object from an Identify event.\n * @returns A key-value object user properties without operations.\n *\n * @example\n * Input:\n * {\n * $set: { plan: 'premium' },\n * custom_flag: true\n * }\n *\n * Output:\n * {\n * plan: 'premium',\n * custom_flag: true\n * }\n */\n getOperationAppliedUserProperties(userProperties: UserProperties | undefined): { [key: string]: any } {\n const updatedProperties: { [key: string]: any } = {};\n\n if (userProperties === undefined) {\n return updatedProperties;\n }\n\n // Keep non-operation keys for later merge\n const nonOpProperties: {\n [key in Exclude<string, IdentifyOperation>]: any;\n } = {};\n Object.keys(userProperties).forEach((key) => {\n if (!Object.values(IdentifyOperation).includes(key as IdentifyOperation)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n nonOpProperties[key] = userProperties[key];\n }\n });\n\n OrderedIdentifyOperations.forEach((operation) => {\n // Skip when key is an operation.\n if (!Object.keys(userProperties).includes(operation)) return;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const opProperties: IdentifyUserProperties = userProperties[operation];\n\n switch (operation) {\n case IdentifyOperation.CLEAR_ALL:\n // Due to operation order, the following line will never execute.\n /* istanbul ignore next */\n Object.keys(updatedProperties).forEach((prop) => {\n delete updatedProperties[prop];\n });\n break;\n case IdentifyOperation.UNSET:\n Object.keys(opProperties).forEach((prop) => {\n delete updatedProperties[prop];\n });\n break;\n case IdentifyOperation.SET:\n Object.assign(updatedProperties, opProperties);\n break;\n }\n });\n\n // Merge non-operation properties.\n // Custom properties should not be affected by operations.\n // https://github.com/amplitude/nova/blob/343f678ded83c032e83b189796b3c2be161b48f5/src/main/java/com/amplitude/userproperty/model/ModifyUserPropertiesIdent.java#L79-L83\n Object.assign(updatedProperties, nonOpProperties);\n\n return updatedProperties;\n }\n\n async process(event: Event): Promise<Result> {\n try {\n // skip event processing if opt out\n if (this.config.optOut) {\n return buildResult(event, 0, OPT_OUT_MESSAGE);\n }\n\n if (event.event_type === SpecialEventType.IDENTIFY) {\n const userProperties = this.getOperationAppliedUserProperties(event.user_properties);\n this.timeline.onIdentityChanged({ userProperties: userProperties });\n }\n\n const result = await this.timeline.push(event);\n\n result.code === 200\n ? this.config.loggerProvider.log(result.message)\n : result.code === 100\n ? this.config.loggerProvider.warn(result.message)\n : this.config.loggerProvider.error(result.message);\n\n return result;\n } catch (e) {\n const message = String(e);\n this.config.loggerProvider.error(message);\n const result = buildResult(event, 0, message);\n\n return result;\n }\n }\n\n setOptOut(optOut: boolean) {\n if (!this.isReady) {\n this.q.push(this._setOptOut.bind(this, Boolean(optOut)));\n return;\n }\n this._setOptOut(optOut);\n }\n\n _setOptOut(optOut: boolean) {\n if (this.config.optOut !== optOut) {\n this.timeline.onOptOutChanged(optOut);\n this.config.optOut = Boolean(optOut);\n }\n }\n\n flush() {\n return returnWrapper(this.timeline.flush());\n }\n\n plugin(name: string): Plugin | undefined {\n const plugin = this.timeline.plugins.find((plugin) => plugin.name === name);\n if (plugin === undefined) {\n this.config.loggerProvider.debug(`Cannot find plugin with name ${name}`);\n return undefined;\n }\n\n return plugin;\n }\n\n plugins<T extends Plugin>(pluginClass: { new (...args: any[]): T }): T[] {\n return this.timeline.plugins.filter((plugin) => plugin instanceof pluginClass) as T[];\n }\n}\n","export const SUCCESS_MESSAGE = 'Event tracked successfully';\nexport const UNEXPECTED_ERROR_MESSAGE = 'Unexpected error occurred';\nexport const MAX_RETRIES_EXCEEDED_MESSAGE = 'Event rejected due to exceeded retry count';\nexport const OPT_OUT_MESSAGE = 'Event skipped due to optOut config';\nexport const MISSING_API_KEY_MESSAGE = 'Event rejected due to missing API key';\nexport const INVALID_API_KEY = 'Invalid API key';\nexport const CLIENT_NOT_INITIALIZED = 'Client not initialized';\n","// Creates an array of elements split into groups the length of size.\n// If array can't be split evenly, the final chunk will be the remaining elements.\n// Works similary as https://lodash.com/docs/4.17.15#chunk\n\nexport const chunk = <T>(arr: T[], size: number) => {\n const chunkSize = Math.max(size, 1);\n return arr.reduce<T[][]>((chunks, element, index) => {\n const chunkIndex = Math.floor(index / chunkSize);\n if (!chunks[chunkIndex]) {\n chunks[chunkIndex] = [];\n }\n chunks[chunkIndex].push(element);\n return chunks;\n }, []);\n};\n","export enum LogLevel {\n None = 0,\n Error = 1,\n Warn = 2,\n Verbose = 3,\n Debug = 4,\n}\n","import { LogLevel } from './types/loglevel';\n\nconst PREFIX = 'Amplitude Logger ';\n\nexport interface ILogger {\n disable(): void;\n enable(logLevel: LogLevel): void;\n log(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n debug(...args: any[]): void;\n}\n\nexport interface LogConfig {\n logger: ILogger;\n logLevel: LogLevel;\n}\n\ntype TimeKey = 'start' | 'end';\n\nexport interface DebugContext {\n type: string;\n name: string;\n args: string[] | string;\n stacktrace?: string[] | string;\n time?: { [key in TimeKey]?: string };\n states?: { [key: string]: any };\n}\n\nexport class Logger implements ILogger {\n logLevel: LogLevel;\n\n constructor() {\n this.logLevel = LogLevel.None;\n }\n\n disable(): void {\n this.logLevel = LogLevel.None;\n }\n\n enable(logLevel: LogLevel = LogLevel.Warn): void {\n this.logLevel = logLevel;\n }\n\n log(...args: any[]): void {\n if (this.logLevel < LogLevel.Verbose) {\n return;\n }\n console.log(`${PREFIX}[Log]: ${args.join(' ')}`);\n }\n\n warn(...args: any[]): void {\n if (this.logLevel < LogLevel.Warn) {\n return;\n }\n console.warn(`${PREFIX}[Warn]: ${args.join(' ')}`);\n }\n\n error(...args: any[]): void {\n if (this.logLevel < LogLevel.Error) {\n return;\n }\n console.error(`${PREFIX}[Error]: ${args.join(' ')}`);\n }\n\n debug(...args: any[]): void {\n if (this.logLevel < LogLevel.Debug) {\n return;\n }\n // console.debug output is hidden by default in chrome\n console.log(`${PREFIX}[Debug]: ${args.join(' ')}`);\n }\n}\n","import { OfflineDisabled } from './types/offline';\nimport { ServerZoneType } from './types/server-zone';\nimport { Transport } from './types/transport';\nimport { Event } from './types/event/event';\nimport { Plan } from './types/event/plan';\nimport { IngestionMetadata } from './types/event/ingestion-metadata';\nimport { Storage } from './types/storage';\nimport {\n AMPLITUDE_SERVER_URL,\n AMPLITUDE_BATCH_SERVER_URL,\n EU_AMPLITUDE_SERVER_URL,\n EU_AMPLITUDE_BATCH_SERVER_URL,\n DEFAULT_INSTANCE_NAME,\n} from './types/constants';\n\nimport { Logger, ILogger } from './logger';\nimport { LogLevel } from './types/loglevel';\nimport { ConfigOptions, IRequestMetadata, IHistogramOptions, HistogramKey, IConfig } from './types/config/core-config';\n\nexport const getDefaultConfig = () => ({\n flushMaxRetries: 12,\n flushQueueSize: 200,\n flushIntervalMillis: 10000,\n instanceName: DEFAULT_INSTANCE_NAME,\n logLevel: LogLevel.Warn,\n loggerProvider: new Logger(),\n offline: false,\n optOut: false,\n serverUrl: AMPLITUDE_SERVER_URL,\n serverZone: 'US' as ServerZoneType,\n useBatch: false,\n});\nexport class Config implements IConfig {\n apiKey: string;\n flushIntervalMillis: number;\n flushMaxRetries: number;\n flushQueueSize: number;\n instanceName?: string;\n loggerProvider: ILogger;\n logLevel: LogLevel;\n minIdLength?: number;\n offline?: boolean | typeof OfflineDisabled;\n plan?: Plan;\n ingestionMetadata?: IngestionMetadata;\n serverUrl: string | undefined;\n serverZone?: ServerZoneType;\n transportProvider: Transport;\n storageProvider?: Storage<Event[]>;\n useBatch: boolean;\n requestMetadata?: RequestMetadata;\n\n protected _optOut = false;\n get optOut() {\n return this._optOut;\n }\n set optOut(optOut: boolean) {\n this._optOut = optOut;\n }\n\n constructor(options: ConfigOptions) {\n const defaultConfig = getDefaultConfig();\n this.apiKey = options.apiKey;\n this.flushIntervalMillis = options.flushIntervalMillis ?? defaultConfig.flushIntervalMillis;\n this.flushMaxRetries = options.flushMaxRetries || defaultConfig.flushMaxRetries;\n this.flushQueueSize = options.flushQueueSize || defaultConfig.flushQueueSize;\n this.instanceName = options.instanceName || defaultConfig.instanceName;\n this.loggerProvider = options.loggerProvider || defaultConfig.loggerProvider;\n this.logLevel = options.logLevel ?? defaultConfig.logLevel;\n this.minIdLength = options.minIdLength;\n this.plan = options.plan;\n this.ingestionMetadata = options.ingestionMetadata;\n this.offline = options.offline !== undefined ? options.offline : defaultConfig.offline;\n this.optOut = options.optOut ?? defaultConfig.optOut;\n this.serverUrl = options.serverUrl;\n this.serverZone = options.serverZone || defaultConfig.serverZone;\n this.storageProvider = options.storageProvider;\n this.transportProvider = options.transportProvider;\n this.useBatch = options.useBatch ?? defaultConfig.useBatch;\n this.loggerProvider.enable(this.logLevel);\n\n const serverConfig = createServerConfig(options.serverUrl, options.serverZone, options.useBatch);\n this.serverZone = serverConfig.serverZone;\n this.serverUrl = serverConfig.serverUrl;\n }\n}\n\nexport const getServerUrl = (serverZone: ServerZoneType, useBatch: boolean) => {\n if (serverZone === 'EU') {\n return useBatch ? EU_AMPLITUDE_BATCH_SERVER_URL : EU_AMPLITUDE_SERVER_URL;\n }\n return useBatch ? AMPLITUDE_BATCH_SERVER_URL : AMPLITUDE_SERVER_URL;\n};\n\nexport const createServerConfig = (\n serverUrl = '',\n serverZone: ServerZoneType = getDefaultConfig().serverZone,\n useBatch: boolean = getDefaultConfig().useBatch,\n) => {\n if (serverUrl) {\n return { serverUrl, serverZone: undefined };\n }\n const _serverZone = ['US', 'EU'].includes(serverZone) ? serverZone : getDefaultConfig().serverZone;\n return {\n serverZone: _serverZone,\n serverUrl: getServerUrl(_serverZone, useBatch),\n };\n};\n\nexport class RequestMetadata implements IRequestMetadata {\n sdk: {\n metrics: {\n histogram: HistogramOptions;\n };\n };\n\n constructor() {\n this.sdk = {\n metrics: {\n histogram: {},\n },\n };\n }\n\n recordHistogram<T extends HistogramKey>(key: T, value: HistogramOptions[T]) {\n this.sdk.metrics.histogram[key] = value;\n }\n}\n\nclass HistogramOptions implements IHistogramOptions {\n remote_config_fetch_time_IDB?: number;\n remote_config_fetch_time_API_success?: number;\n remote_config_fetch_time_API_fail?: number;\n}\n","/**\n * Checks if an HTTP status code indicates success (2xx range)\n * @param code - The HTTP status code to check\n * @returns true if the status code is in the 2xx range, false otherwise\n */\nexport function isSuccessStatusCode(code: number): boolean {\n return code >= 200 && code < 300;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { AmplitudeCore } from '../core-client';\nimport { LogConfig, DebugContext } from '../logger';\nimport { LogLevel } from '../types/loglevel';\n\nexport const getStacktrace = (ignoreDepth = 0): string[] => {\n const trace = new Error().stack || '';\n return trace\n .split('\\n')\n .slice(2 + ignoreDepth)\n .map((text) => text.trim());\n};\n\n// This hook makes sure we always get the latest logger and logLevel.\nexport const getClientLogConfig = (client: AmplitudeCore) => (): LogConfig => {\n const { loggerProvider: logger, logLevel } = { ...client.config };\n return {\n logger,\n logLevel,\n };\n};\n\n// This is a convenient function to get the attribute from object with string path, similar to lodash '#get'.\nexport const getValueByStringPath = (obj: any, path: string): any => {\n path = path.replace(/\\[(\\w+)\\]/g, '.$1'); // convert indexes to properties\n path = path.replace(/^\\./, ''); // strip a leading dot\n for (const attr of path.split('.')) {\n if (attr in obj) {\n obj = obj[attr];\n } else {\n return;\n }\n }\n return obj;\n};\n\nexport const getClientStates = (client: AmplitudeCore, paths: Array<string>) => (): { [key: string]: any } => {\n const res: { [key: string]: any } = {};\n for (const path of paths) {\n res[path] = getValueByStringPath(client, path);\n }\n return res;\n};\n\nexport const debugWrapper =\n <T extends Array<any>, R>(\n fn: (...args: T) => R,\n fnName: string,\n getLogConfig: () => LogConfig,\n getStates?: () => { [key: string]: any },\n fnContext: any = null,\n ) =>\n (...args: T): R => {\n const { logger, logLevel } = getLogConfig();\n // return early if possible to reduce overhead\n if ((logLevel && logLevel < LogLevel.Debug) || !logLevel || !logger) {\n return fn.apply(fnContext, args);\n }\n const debugContext: DebugContext = {\n type: 'invoke public method',\n name: fnName,\n args,\n stacktrace: getStacktrace(1),\n time: {\n start: new Date().toISOString(),\n },\n states: {},\n };\n if (getStates && debugContext.states) {\n debugContext.states.before = getStates();\n }\n const result = fn.apply(fnContext, args);\n if (result && (result as any).promise) {\n // if result is a promise, add the callback\n (result as any).promise.then(() => {\n if (getStates && debugContext.states) {\n debugContext.states.after = getStates();\n }\n if (debugContext.time) {\n debugContext.time.end = new Date().toISOString();\n }\n logger.debug(JSON.stringify(debugContext, null, 2));\n });\n } else {\n if (getStates && debugContext.states) {\n debugContext.states.after = getStates();\n }\n if (debugContext.time) {\n debugContext.time.end = new Date().toISOString();\n }\n logger.debug(JSON.stringify(debugContext, null, 2));\n }\n return result;\n };\n","import { DestinationPlugin } from '../types/plugin';\nimport { Event } from '../types/event/event';\nimport { Result } from '../types/result';\nimport { Status } from '../types/status';\nimport {\n Response,\n InvalidResponse,\n PayloadTooLargeResponse,\n RateLimitResponse,\n SuccessResponse,\n} from '../types/response';\nimport {\n INVALID_API_KEY,\n MAX_RETRIES_EXCEEDED_MESSAGE,\n MISSING_API_KEY_MESSAGE,\n SUCCESS_MESSAGE,\n UNEXPECTED_ERROR_MESSAGE,\n} from '../types/messages';\nimport { STORAGE_PREFIX } from '../types/constants';\nimport { chunk } from '../utils/chunk';\nimport { buildResult } from '../utils/result-builder';\nimport { createServerConfig, RequestMetadata } from '../config';\nimport { UUID } from '../utils/uuid';\nimport { IConfig } from '../types/config/core-config';\nimport { EventCallback } from '../types/event-callback';\nimport { IDiagnosticsClient } from '../diagnostics/diagnostics-client';\nimport { isSuccessStatusCode } from '../utils/status-code';\nimport { getStacktrace } from '../utils/debug';\n\nexport interface Context {\n event: Event;\n attempts: number;\n callback: EventCallback;\n timeout: number;\n}\n\nfunction getErrorMessage(error: unknown) {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\nexport function getResponseBodyString(res: Response) {\n let responseBodyString = '';\n try {\n if ('body' in res) {\n responseBodyString = JSON.stringify(res.body, null, 2);\n }\n } catch {\n // to avoid crash, but don't care about the error, add comment to avoid empty block lint error\n }\n return responseBodyString;\n}\n\nexport class Destination implements DestinationPlugin {\n name = 'amplitude';\n type = 'destination' as const;\n\n retryTimeout = 1000;\n throttleTimeout = 30000;\n storageKey = '';\n // this.config is defined in setup() which will always be called first\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n config: IConfig;\n // Indicator of whether events that are scheduled (but not flushed yet).\n // When flush:\n // 1. assign `scheduleId` to `flushId`\n // 2. set `scheduleId` to null\n scheduleId: ReturnType<typeof setTimeout> | null = null;\n // Timeout in milliseconds of current schedule\n scheduledTimeout = 0;\n // Indicator of whether current flush resolves.\n // When flush resolves, set `flushId` to null\n flushId: ReturnType<typeof setTimeout> | null = null;\n queue: Context[] = [];\n diagnosticsClient: IDiagnosticsClient | undefined;\n\n constructor(context?: { diagnosticsClient: IDiagnosticsClient }) {\n this.diagnosticsClient = context?.diagnosticsClient;\n }\n\n async setup(config: IConfig): Promise<undefined> {\n this.config = config;\n\n this.storageKey = `${STORAGE_PREFIX}_${this.config.apiKey.substring(0, 10)}`;\n const unsent = await this.config.storageProvider?.get(this.storageKey);\n if (unsent && unsent.length > 0) {\n void Promise.all(unsent.map((event: Event) => this.execute(event))).catch();\n }\n\n return Promise.resolve(undefined);\n }\n\n execute(event: Event): Promise<Result> {\n // Assign insert_id for dropping invalid event later\n if (!event.insert_id) {\n event.insert_id = UUID();\n }\n\n return new Promise((resolve) => {\n const context = {\n event,\n attempts: 0,\n callback: (result: Result) => resolve(result),\n timeout: 0,\n };\n this.queue.push(context);\n this.schedule(this.config.flushIntervalMillis);\n this.saveEvents();\n });\n }\n\n removeEventsExceedFlushMaxRetries(list: Context[]) {\n return list.filter((context) => {\n context.attempts += 1;\n if (context.attempts < this.config.flushMaxRetries) {\n return true;\n }\n void this.fulfillRequest([context], 500, MAX_RETRIES_EXCEEDED_MESSAGE);\n return false;\n });\n }\n\n scheduleEvents(list: Context[]) {\n list.forEach((context) => {\n this.schedule(context.timeout === 0 ? this.config.flushIntervalMillis : context.timeout);\n });\n }\n\n // Schedule a flush in timeout when\n // 1. No schedule\n // 2. Timeout greater than existing timeout.\n // This makes sure that when throttled, no flush when throttle timeout expires.\n schedule(timeout: number) {\n if (this.config.offline) {\n return;\n }\n\n if (this.scheduleId === null || (this.scheduleId && timeout > this.scheduledTimeout)) {\n if (this.scheduleId) {\n clearTimeout(this.scheduleId);\n }\n this.scheduledTimeout = timeout;\n this.scheduleId = setTimeout(() => {\n this.queue = this.queue.map((context) => {\n context.timeout = 0;\n return context;\n });\n void this.flush(true);\n }, timeout);\n return;\n }\n }\n\n // Mark current schedule is flushed.\n resetSchedule() {\n this.scheduleId = null;\n this.scheduledTimeout = 0;\n }\n\n // Flush all events regardless of their timeout\n async flush(useRetry = false) {\n // Skip flush if offline\n if (this.config.offline) {\n this.resetSchedule();\n this.config.loggerProvider.debug('Skipping flush while offline.');\n return;\n }\n\n if (this.flushId) {\n this.resetSchedule();\n this.config.loggerProvider.debug('Skipping flush because previous flush has not resolved.');\n return;\n }\n\n this.flushId = this.scheduleId;\n this.resetSchedule();\n\n const list: Context[] = [];\n const later: Context[] = [];\n this.queue.forEach((context) => (context.timeout === 0 ? list.push(context) : later.push(context)));\n\n const batches = chunk(list, this.config.flushQueueSize);\n\n // Promise.all() doesn't guarantee resolve order.\n // Sequentially resolve to make sure backend receives events in order\n await batches.reduce(async (promise, batch) => {\n await promise;\n return await this.send(batch, useRetry);\n }, Promise.resolve());\n\n // Mark current flush is done\n this.flushId = null;\n\n this.scheduleEvents(this.queue);\n }\n\n async send(list: Context[], useRetry = true) {\n if (!this.config.apiKey) {\n return this.fulfillRequest(list, 400, MISSING_API_KEY_MESSAGE);\n }\n\n const payload = {\n api_key: this.config.apiKey,\n events: list.map((context) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { extra, ...eventWithoutExtra } = context.event;\n return eventWithoutExtra;\n }),\n options: {\n min_id_length: this.config.minIdLength,\n },\n client_upload_time: new Date().toISOString(),\n request_metadata: this.config.requestMetadata,\n };\n this.config.requestMetadata = new RequestMetadata();\n\n try {\n const { serverUrl } = createServerConfig(this.config.serverUrl, this.config.serverZone, this.config.useBatch);\n const res = await this.config.transportProvider.send(serverUrl, payload);\n if (res === null) {\n this.fulfillRequest(list, 0, UNEXPECTED_ERROR_MESSAGE);\n return;\n }\n if (!useRetry) {\n if ('body' in res) {\n this.fulfillRequest(list, res.statusCode, `${res.status}: ${getResponseBodyString(res)}`);\n } else {\n this.fulfillRequest(list, res.statusCode, res.status);\n }\n return;\n }\n this.handleResponse(res, list);\n } catch (e) {\n const errorMessage = getErrorMessage(e);\n this.config.loggerProvider.error(errorMessage);\n\n this.diagnosticsClient?.recordEvent('analytics.events.unsuccessful.from.catch.error', {\n events: list.map((context) => context.event.event_type),\n message: errorMessage,\n stack_trace: getStacktrace(),\n });\n\n this.handleResponse({ status: Status.Failed, statusCode: 0 }, list);\n }\n }\n\n handleResponse(res: Response, list: Context[]) {\n if (!isSuccessStatusCode(res.statusCode)) {\n this.diagnosticsClient?.recordEvent('analytics.events.unsuccessful', {\n events: list.map((context) => context.event.event_type),\n code: res.statusCode,\n status: res.status,\n body: getResponseBodyString(res),\n stack_trace: getStacktrace(),\n });\n }\n\n const { status } = res;\n\n switch (status) {\n case Status.Success: {\n this.handleSuccessResponse(res, list);\n break;\n }\n case Status.Invalid: {\n this.handleInvalidResponse(res, list);\n break;\n }\n case Status.PayloadTooLarge: {\n this.handlePayloadTooLargeResponse(res, list);\n break;\n }\n case Status.RateLimit: {\n this.handleRateLimitResponse(res, list);\n break;\n }\n default: {\n // log intermediate event status before retry\n this.config.loggerProvider.warn(`{code: 0, error: \"Status '${status}' provided for ${list.length} events\"}`);\n this.handleOtherResponse(list);\n break;\n }\n }\n }\n\n handleSuccessResponse(res: SuccessResponse, list: Context[]) {\n this.fulfillRequest(list, res.statusCode, SUCCESS_MESSAGE);\n }\n\n handleInvalidResponse(res: InvalidResponse, list: Context[]) {\n if (res.body.missingField || res.body.error.startsWith(INVALID_API_KEY)) {\n this.fulfillRequest(list, res.statusCode, res.body.error);\n return;\n }\n\n const dropIndex = [\n ...Object.values(res.body.eventsWithInvalidFields),\n ...Object.values(res.body.eventsWithMissingFields),\n ...Object.values(res.body.eventsWithInvalidIdLengths),\n ...res.body.silencedEvents,\n ].flat();\n const dropIndexSet = new Set(dropIndex);\n\n const retry = list.filter((context, index) => {\n if (dropIndexSet.has(index)) {\n this.fulfillRequest([context], res.statusCode, res.body.error);\n return;\n }\n return true;\n });\n\n if (retry.length > 0) {\n // log intermediate event status before retry\n this.config.loggerProvider.warn(getResponseBodyString(res));\n }\n\n const tryable = this.removeEventsExceedFlushMaxRetries(retry);\n this.scheduleEvents(tryable);\n }\n\n handlePayloadTooLargeResponse(res: PayloadTooLargeResponse, list: Context[]) {\n if (list.length === 1) {\n this.fulfillRequest(list, res.statusCode, res.body.error);\n return;\n }\n\n // log intermediate event status before retry\n this.config.loggerProvider.warn(getResponseBodyString(res));\n\n this.config.flushQueueSize /= 2;\n\n const tryable = this.removeEventsExceedFlushMaxRetries(list);\n this.scheduleEvents(tryable);\n }\n\n handleRateLimitResponse(res: RateLimitResponse, list: Context[]) {\n const dropUserIds = Object.keys(res.body.exceededDailyQuotaUsers);\n const dropDeviceIds = Object.keys(res.body.exceededDailyQuotaDevices);\n const throttledIndex = res.body.throttledEvents;\n const dropUserIdsSet = new Set(dropUserIds);\n const dropDeviceIdsSet = new Set(dropDeviceIds);\n const throttledIndexSet = new Set(throttledIndex);\n\n const retry = list.filter((context, index) => {\n if (\n (context.event.user_id && dropUserIdsSet.has(context.event.user_id)) ||\n (context.event.device_id && dropDeviceIdsSet.has(context.event.device_id))\n ) {\n this.fulfillRequest([context], res.statusCode, res.body.error);\n return;\n }\n if (throttledIndexSet.has(index)) {\n context.timeout = this.throttleTimeout;\n }\n return true;\n });\n\n if (retry.length > 0) {\n // log intermediate event status before retry\n this.config.loggerProvider.warn(getResponseBodyString(res));\n }\n\n const tryable = this.removeEventsExceedFlushMaxRetries(retry);\n this.scheduleEvents(tryable);\n }\n\n handleOtherResponse(list: Context[]) {\n const later = list.map((context) => {\n context.timeout = context.attempts * this.retryTimeout;\n return context;\n });\n\n const tryable = this.removeEventsExceedFlushMaxRetries(later);\n this.scheduleEvents(tryable);\n }\n\n fulfillRequest(list: Context[], code: number, message: string) {\n // Record diagnostics for dropped events (non-success status codes)\n if (!isSuccessStatusCode(code)) {\n this.diagnosticsClient?.increment('analytics.events.dropped', list.length);\n this.diagnosticsClient?.recordEvent('analytics.events.dropped', {\n events: list.map((context) => context.event.event_type),\n code: code,\n message: message,\n stack_trace: getStacktrace(),\n });\n } else {\n this.diagnosticsClient?.increment('analytics.events.sent', list.length);\n }\n this.removeEvents(list);\n list.forEach((context) => context.callback(buildResult(context.event, code, message)));\n }\n\n /**\n * This is called on\n * 1) new events are added to queue; or\n * 2) response comes back for a request\n *\n * Update the event storage based on the queue\n */\n saveEvents() {\n if (!this.config.storageProvider) {\n return;\n }\n\n const updatedEvents = this.queue.map((context) => context.event);\n void this.config.storageProvider.set(this.storageKey, updatedEvents);\n }\n\n /**\n * This is called on response comes back for a request\n */\n removeEvents(eventsToRemove: Context[]) {\n this.queue = this.queue.filter(\n (queuedContext) => !eventsToRemove.some((context) => context.event.insert_id === queuedContext.event.insert_id),\n );\n\n this.saveEvents();\n }\n}\n","var ApplicationContextProviderImpl = /** @class */ (function () {\n function ApplicationContextProviderImpl() {\n }\n ApplicationContextProviderImpl.prototype.getApplicationContext = function () {\n return {\n versionName: this.versionName,\n language: getLanguage(),\n platform: 'Web',\n os: undefined,\n deviceModel: undefined,\n };\n };\n return ApplicationContextProviderImpl;\n}());\nvar getLanguage = function () {\n return ((typeof navigator !== 'undefined' &&\n ((navigator.languages && navigator.languages[0]) ||\n navigator.language)) ||\n '');\n};\n\nvar EventBridgeImpl = /** @class */ (function () {\n function EventBridgeImpl() {\n this.queue = [];\n }\n EventBridgeImpl.prototype.logEvent = function (event) {\n if (!this.receiver) {\n if (this.queue.length < 512) {\n this.queue.push(event);\n }\n }\n else {\n this.receiver(event);\n }\n };\n EventBridgeImpl.prototype.setEventReceiver = function (receiver) {\n this.receiver = receiver;\n if (this.queue.length > 0) {\n this.queue.forEach(function (event) {\n receiver(event);\n });\n this.queue = [];\n }\n };\n return EventBridgeImpl;\n}());\n\n/******************************************************************************\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***************************************************************************** */\nvar __assign = function () {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nfunction __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\nfunction __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n return ar;\n}\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nvar isEqual = function (obj1, obj2) {\n var e_1, _a;\n var primitive = ['string', 'number', 'boolean', 'undefined'];\n var typeA = typeof obj1;\n var typeB = typeof obj2;\n if (typeA !== typeB) {\n return false;\n }\n try {\n for (var primitive_1 = __values(primitive), primitive_1_1 = primitive_1.next(); !primitive_1_1.done; primitive_1_1 = primitive_1.next()) {\n var p = primitive_1_1.value;\n if (p === typeA) {\n return obj1 === obj2;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (primitive_1_1 && !primitive_1_1.done && (_a = primitive_1.return)) _a.call(primitive_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n // check null\n if (obj1 == null && obj2 == null) {\n return true;\n }\n else if (obj1 == null || obj2 == null) {\n return false;\n }\n // if got here - objects\n if (obj1.length !== obj2.length) {\n return false;\n }\n //check if arrays\n var isArrayA = Array.isArray(obj1);\n var isArrayB = Array.isArray(obj2);\n if (isArrayA !== isArrayB) {\n return false;\n }\n if (isArrayA && isArrayB) {\n //arrays\n for (var i = 0; i < obj1.length; i++) {\n if (!isEqual(obj1[i], obj2[i])) {\n return false;\n }\n }\n }\n else {\n //objects\n var sorted1 = Object.keys(obj1).sort();\n var sorted2 = Object.keys(obj2).sort();\n if (!isEqual(sorted1, sorted2)) {\n return false;\n }\n //compare object values\n var result_1 = true;\n Object.keys(obj1).forEach(function (key) {\n if (!isEqual(obj1[key], obj2[key])) {\n result_1 = false;\n }\n });\n return result_1;\n }\n return true;\n};\n\nvar ID_OP_SET = '$set';\nvar ID_OP_UNSET = '$unset';\nvar ID_OP_CLEAR_ALL = '$clearAll';\n// Polyfill for Object.entries\nif (!Object.entries) {\n Object.entries = function (obj) {\n var ownProps = Object.keys(obj);\n var i = ownProps.length;\n var resArray = new Array(i);\n while (i--) {\n resArray[i] = [ownProps[i], obj[ownProps[i]]];\n }\n return resArray;\n };\n}\nvar IdentityStoreImpl = /** @class */ (function () {\n function IdentityStoreImpl() {\n this.identity = { userProperties: {} };\n this.listeners = new Set();\n }\n IdentityStoreImpl.prototype.editIdentity = function () {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n var self = this;\n var actingUserProperties = __assign({}, this.identity.userProperties);\n var actingIdentity = __assign(__assign({}, this.identity), { userProperties: actingUserProperties });\n return {\n setUserId: function (userId) {\n actingIdentity.userId = userId;\n return this;\n },\n setDeviceId: function (deviceId) {\n actingIdentity.deviceId = deviceId;\n return this;\n },\n setUserProperties: function (userProperties) {\n actingIdentity.userProperties = userProperties;\n return this;\n },\n setOptOut: function (optOut) {\n actingIdentity.optOut = optOut;\n return this;\n },\n updateUserProperties: function (actions) {\n var e_1, _a, e_2, _b, e_3, _c;\n var actingProperties = actingIdentity.userProperties || {};\n try {\n for (var _d = __values(Object.entries(actions)), _e = _d.next(); !_e.done; _e = _d.next()) {\n var _f = __read(_e.value, 2), action = _f[0], properties = _f[1];\n switch (action) {\n case ID_OP_SET:\n try {\n for (var _g = (e_2 = void 0, __values(Object.entries(properties))), _h = _g.next(); !_h.done; _h = _g.next()) {\n var _j = __read(_h.value, 2), key = _j[0], value = _j[1];\n actingProperties[key] = value;\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_h && !_h.done && (_b = _g.return)) _b.call(_g);\n }\n finally { if (e_2) throw e_2.error; }\n }\n break;\n case ID_OP_UNSET:\n try {\n for (var _k = (e_3 = void 0, __values(Object.keys(properties))), _l = _k.next(); !_l.done; _l = _k.next()) {\n var key = _l.value;\n delete actingProperties[key];\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (_l && !_l.done && (_c = _k.return)) _c.call(_k);\n }\n finally { if (e_3) throw e_3.error; }\n }\n break;\n case ID_OP_CLEAR_ALL:\n actingProperties = {};\n break;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_e && !_e.done && (_a = _d.return)) _a.call(_d);\n }\n finally { if (e_1) throw e_1.error; }\n }\n actingIdentity.userProperties = actingProperties;\n return this;\n },\n commit: function () {\n self.setIdentity(actingIdentity);\n return this;\n },\n };\n };\n IdentityStoreImpl.prototype.getIdentity = function () {\n return __assign({}, this.identity);\n };\n IdentityStoreImpl.prototype.setIdentity = function (identity) {\n var originalIdentity = __assign({}, this.identity);\n this.identity = __assign({}, identity);\n if (!isEqual(originalIdentity, this.identity)) {\n this.listeners.forEach(function (listener) {\n listener(identity);\n });\n }\n };\n IdentityStoreImpl.prototype.addIdentityListener = function (listener) {\n this.listeners.add(listener);\n };\n IdentityStoreImpl.prototype.removeIdentityListener = function (listener) {\n this.listeners.delete(listener);\n };\n return IdentityStoreImpl;\n}());\n\nvar safeGlobal = typeof globalThis !== 'undefined'\n ? globalThis\n : typeof global !== 'undefined'\n ? global\n : self;\n\nvar AnalyticsConnector = /** @class */ (function () {\n function AnalyticsConnector() {\n this.identityStore = new IdentityStoreImpl();\n this.eventBridge = new EventBridgeImpl();\n this.applicationContextProvider = new ApplicationContextProviderImpl();\n }\n AnalyticsConnector.getInstance = function (instanceName) {\n if (!safeGlobal['analyticsConnectorInstances']) {\n safeGlobal['analyticsConnectorInstances'] = {};\n }\n if (!safeGlobal['analyticsConnectorInstances'][instanceName]) {\n safeGlobal['analyticsConnectorInstances'][instanceName] =\n new AnalyticsConnector();\n }\n return safeGlobal['analyticsConnectorInstances'][instanceName];\n };\n return AnalyticsConnector;\n}());\n\nexport { AnalyticsConnector };\n","import { AnalyticsConnector } from '@amplitude/analytics-connector';\nimport { DEFAULT_INSTANCE_NAME } from './types/constants';\n\nexport const getAnalyticsConnector = (instanceName = DEFAULT_INSTANCE_NAME): AnalyticsConnector => {\n return AnalyticsConnector.getInstance(instanceName);\n};\n\nexport const setConnectorUserId = (userId: string | undefined, instanceName?: string): void => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n getAnalyticsConnector(instanceName).identityStore.editIdentity().setUserId(userId).commit();\n};\n\nexport const setConnectorDeviceId = (deviceId: string, instanceName?: string): void => {\n getAnalyticsConnector(instanceName).identityStore.editIdentity().setDeviceId(deviceId).commit();\n};\n","import { BeforePlugin } from '../types/plugin';\nimport { IConfig } from '../types/config/core-config';\nimport { Event } from '../types/event/event';\nimport { getAnalyticsConnector } from '../analytics-connector';\n\nexport class IdentityEventSender implements BeforePlugin {\n name = 'identity';\n type = 'before' as const;\n\n identityStore = getAnalyticsConnector().identityStore;\n\n async execute(context: Event): Promise<Event> {\n const userProperties = context.user_properties as Record<string, any>;\n if (userProperties) {\n this.identityStore.editIdentity().updateUserProperties(userProperties).commit();\n }\n return context;\n }\n\n async setup(config: IConfig) {\n if (config.instanceName) {\n this.identityStore = getAnalyticsConnector(config.instanceName).identityStore;\n }\n }\n}\n","export const isNewSession = (sessionTimeout: number, lastEventTime: number = Date.now()): boolean => {\n const currentTime = Date.now();\n const timeSinceLastEvent = currentTime - lastEventTime;\n\n return timeSinceLastEvent > sessionTimeout;\n};\n","import { AMPLITUDE_PREFIX } from './types/constants';\n\nexport const getCookieName = (apiKey: string, postKey = '', limit = 10) => {\n return [AMPLITUDE_PREFIX, postKey, apiKey.substring(0, limit)].filter(Boolean).join('_');\n};\n\nexport const getOldCookieName = (apiKey: string) => {\n return `${AMPLITUDE_PREFIX.toLowerCase()}_${apiKey.substring(0, 6)}`;\n};\n","export const getLanguage = (): string => {\n if (typeof navigator === 'undefined') return '';\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const userLanguage = (navigator as any).userLanguage as string | undefined;\n\n return navigator.languages?.[0] ?? navigator.language ?? userLanguage ?? '';\n};\n","import { getGlobalScope } from './global-scope';\n\nexport const getQueryParams = (): Record<string, string | undefined> => {\n const globalScope = getGlobalScope();\n /* istanbul ignore if */\n if (!globalScope?.location?.search) {\n return {};\n }\n const pairs = globalScope.location.search.substring(1).split('&').filter(Boolean);\n const params = pairs.reduce<Record<string, string | undefined>>((acc, curr) => {\n const query = curr.split('=', 2);\n const key = tryDecodeURIComponent(query[0]);\n const value = tryDecodeURIComponent(query[1]);\n if (!value) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n return params;\n};\n\nexport const tryDecodeURIComponent = (value = '') => {\n try {\n return decodeURIComponent(value);\n } catch {\n return '';\n }\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","export const generateHashCode = function (str: string) {\n let hash = 0;\n if (str.length === 0) return hash;\n for (let i = 0; i < str.length; i++) {\n const chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0;\n }\n return hash;\n};\n\nexport const isTimestampInSample = function (timestamp: string | number, sampleRate: number) {\n const hashNumber = generateHashCode(timestamp.toString());\n const absHash = Math.abs(hashNumber);\n const absHashMultiply = absHash * 31;\n const mod = absHashMultiply % 1000000;\n return mod / 1000000 < sampleRate;\n};\n\n// TODO(xinyi): replace the temp one in diagnostics client after the fix\n// istanbul ignore next\nexport const isTimestampInSampleTemp = function (timestamp: string | number, sampleRate: number) {\n const hashNumber = generateHashCode(timestamp.toString());\n const absHash = Math.abs(hashNumber);\n const absHashMultiply = absHash * 31;\n const mod = absHashMultiply % 100000;\n return mod / 100000 < sampleRate;\n};\n","import { Storage } from '../types/storage';\n\nexport class MemoryStorage<T> implements Storage<T> {\n memoryStorage: Map<string, T> = new Map();\n\n async isEnabled(): Promise<boolean> {\n return true;\n }\n\n async get(key: string): Promise<T | undefined> {\n return this.memoryStorage.get(key);\n }\n\n async getRaw(key: string): Promise<string | undefined> {\n const value = await this.get(key);\n return value ? JSON.stringify(value) : undefined;\n }\n\n async set(key: string, value: T): Promise<void> {\n this.memoryStorage.set(key, value);\n }\n\n async remove(key: string): Promise<void> {\n this.memoryStorage.delete(key);\n }\n\n async reset(): Promise<void> {\n this.memoryStorage.clear();\n }\n}\n","import { Storage, CookieStorageOptions, CookieStorageConfig } from '../types/storage';\nimport { getGlobalScope } from '../global-scope';\nimport { UUID } from '../utils/uuid';\n\n// CookieStore is a Web API not included in standard TypeScript lib types\n// https://developer.mozilla.org/en-US/docs/Web/API/CookieStore\ninterface CookieStoreSetOptions {\n name: string;\n value: string;\n expires?: number;\n domain?: string;\n sameSite?: 'strict' | 'lax' | 'none';\n}\n\ninterface CookieStore {\n getAll(key: string): Promise<CookieStoreSetOptions[] | undefined>;\n}\n\ntype GlobalScopeWithCookieStore = {\n cookieStore?: CookieStore;\n} & typeof global;\n\nexport class CookieStorage<T> implements Storage<T> {\n options: CookieStorageOptions;\n config: CookieStorageConfig;\n private static testValue: undefined | string;\n\n constructor(options?: CookieStorageOptions, config: CookieStorageConfig = {}) {\n this.options = { ...options };\n this.config = config;\n }\n\n async isEnabled(): Promise<boolean> {\n /* istanbul ignore if */\n if (!getGlobalScope()) {\n return false;\n }\n\n CookieStorage.testValue = String(Date.now());\n const testCookieOptions = {\n ...this.options,\n expirationDays: 0.003, // expire in ~5 minutes\n };\n const testStorage = new CookieStorage<string>(testCookieOptions);\n const testKey = `AMP_TEST_${UUID().substring(0, 8)}`;\n try {\n await testStorage.set(testKey, CookieStorage.testValue);\n const value = await testStorage.get(testKey);\n return value === CookieStorage.testValue;\n } catch {\n /* istanbul ignore next */\n return false;\n } finally {\n await testStorage.remove(testKey);\n }\n }\n\n async get(key: string): Promise<T | undefined> {\n const value = await this.getRaw(key);\n if (!value) {\n return undefined;\n }\n try {\n const decodedValue = decodeCookieValue(value);\n if (decodedValue === undefined) {\n console.error(`Amplitude Logger [Error]: Failed to decode cookie value for key: ${key}, value: ${value}`);\n return undefined;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(decodedValue);\n } catch {\n console.error(`Amplitude Logger [Error]: Failed to parse cookie value for key: ${key}, value: ${value}`);\n return undefined;\n }\n }\n\n async getRaw(key: string): Promise<string | undefined> {\n const globalScope = getGlobalScope();\n\n // use CookieStore if available and enabled\n const globalScopeWithCookiesStore = globalScope as GlobalScopeWithCookieStore;\n try {\n const cookieStore = globalScopeWithCookiesStore?.cookieStore;\n if (cookieStore) {\n const cookies = await cookieStore.getAll(key);\n if (cookies) {\n /* istanbul ignore if */\n if (cookies.length > 1) {\n this.config.diagnosticsClient?.recordEvent('cookies.duplicate', {\n cookies: cookies.map((cookie) => cookie.domain),\n });\n this.config.diagnosticsClient?.increment('cookies.duplicate.occurrence.cookieStore');\n }\n\n for (const cookie of cookies) {\n if (isDomainEqual(cookie.domain, this.options.domain)) {\n return cookie.value;\n }\n }\n }\n }\n } catch (ignoreError) {\n /* istanbul ignore next */\n // if cookieStore had a surprise failure, fallback to document.cookie\n }\n\n const cookies = (globalScope?.document?.cookie.split('; ') ?? []).filter((c) => c.indexOf(key + '=') === 0);\n let match: string | undefined = undefined;\n\n // if matcher function is provided, use it to de-duplicate when there's more than one cookie\n /* istanbul ignore if */\n const duplicateResolverFn = this.config.duplicateResolverFn;\n if (typeof duplicateResolverFn === 'function' && cookies.length > 1) {\n match = cookies.find((c) => {\n try {\n const res = duplicateResolverFn(c.substring(key.length + 1));\n if (!res) {\n this.config.diagnosticsClient?.increment('cookies.duplicate.occurrence.document.cookie');\n }\n return res;\n } catch (ignoreError) {\n /* istanbul ignore next */\n return false;\n }\n });\n }\n\n // if match was not found, just get the first one that matches the key\n if (!match) {\n match = cookies[0];\n }\n if (!match) {\n return undefined;\n }\n return match.substring(key.length + 1);\n }\n\n async set(key: string, value: T | null): Promise<void> {\n try {\n const expirationDays = this.options.expirationDays ?? 0;\n const expires = value !== null ? expirationDays : -1;\n let expireDate: Date | undefined = undefined;\n if (expires) {\n const date = new Date();\n date.setTime(date.getTime() + expires * 24 * 60 * 60 * 1000);\n expireDate = date;\n }\n let str = `${key}=${btoa(encodeURIComponent(JSON.stringify(value)))}`;\n if (expireDate) {\n str += `; expires=${expireDate.toUTCString()}`;\n }\n str += '; path=/';\n if (this.options.domain) {\n str += `; domain=${this.options.domain}`;\n }\n if (this.options.secure) {\n str += '; Secure';\n }\n if (this.options.sameSite) {\n str += `; SameSite=${this.options.sameSite}`;\n }\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.document.cookie = str;\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`Amplitude Logger [Error]: Failed to set cookie for key: ${key}. Error: ${errorMessage}`);\n }\n }\n\n async remove(key: string): Promise<void> {\n await this.set(key, null);\n }\n\n async reset(): Promise<void> {\n return;\n }\n}\n\nconst decodeCookiesAsDefault = (value: string): string | undefined => {\n try {\n return decodeURIComponent(atob(value));\n } catch {\n return undefined;\n }\n};\n\nconst decodeCookiesWithDoubleUrlEncoding = (value: string): string | undefined => {\n // Modern Ruby (v7+) automatically encodes cookies with URL encoding by\n // https://api.rubyonrails.org/classes/ActionDispatch/Cookies.html\n try {\n return decodeURIComponent(atob(decodeURIComponent(value)));\n } catch {\n return undefined;\n }\n};\n\n/**\n * Decodes a cookie value that was encoded with btoa(encodeURIComponent(...)).\n * Handles both standard encoding and double URL encoding (used by Ruby Rails v7+).\n */\nexport const decodeCookieValue = (value: string): string | undefined => {\n return decodeCookiesAsDefault(value) ?? decodeCookiesWithDoubleUrlEncoding(value);\n};\n\n/**\n * Compares two domain strings for equality, ignoring leading dots.\n * This is useful for comparing cookie domains since \".example.com\" and \"example.com\"\n * are effectively equivalent for cookie scoping.\n */\nexport const isDomainEqual = (domain1: string | undefined, domain2: string | undefined): boolean => {\n if (!domain1 || !domain2) {\n return false;\n }\n const normalized1 = domain1.startsWith('.') ? domain1.substring(1) : domain1;\n const normalized2 = domain2.startsWith('.') ? domain2.substring(1) : domain2;\n return normalized1.toLowerCase() === normalized2.toLowerCase();\n};\n","import { AMPLITUDE_PREFIX } from '../types/constants';\n\nexport const getStorageKey = (apiKey: string, postKey = '', limit = 10) => {\n return [AMPLITUDE_PREFIX, postKey, apiKey.substring(0, limit)].filter(Boolean).join('_');\n};\n","import { Storage as AmplitudeStorage } from '../types/storage';\n\nexport class BrowserStorage<T> implements AmplitudeStorage<T> {\n constructor(private storage?: Storage) {}\n\n async isEnabled(): Promise<boolean> {\n /* istanbul ignore if */\n if (!this.storage) {\n return false;\n }\n\n const random = String(Date.now());\n const testStorage = new BrowserStorage<string>(this.storage);\n const testKey = 'AMP_TEST';\n try {\n await testStorage.set(testKey, random);\n const value = await testStorage.get(testKey);\n return value === random;\n } catch {\n /* istanbul ignore next */\n return false;\n } finally {\n await testStorage.remove(testKey);\n }\n }\n\n async get(key: string): Promise<T | undefined> {\n try {\n const value = await this.getRaw(key);\n if (!value) {\n return undefined;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(value);\n } catch {\n console.error(`[Amplitude] Error: Could not get value from storage`);\n return undefined;\n }\n }\n\n async getRaw(key: string): Promise<string | undefined> {\n return this.storage?.getItem(key) || undefined;\n }\n\n async set(key: string, value: T): Promise<void> {\n try {\n this.storage?.setItem(key, JSON.stringify(value));\n } catch {\n //\n }\n }\n\n async remove(key: string): Promise<void> {\n try {\n this.storage?.removeItem(key);\n } catch {\n //\n }\n }\n\n async reset(): Promise<void> {\n try {\n this.storage?.clear();\n } catch {\n //\n }\n }\n}\n","import { getGlobalScope } from '../global-scope';\nimport { ILogger } from '../logger';\nimport { HistogramStats } from './diagnostics-client';\n\nconst MAX_PERSISTENT_STORAGE_EVENTS_COUNT = 10;\n\n// Database configuration\nconst DB_VERSION = 1;\n\n// Table names for different diagnostics types\nexport const TABLE_NAMES = {\n TAGS: 'tags',\n COUNTERS: 'counters',\n HISTOGRAMS: 'histograms',\n EVENTS: 'events',\n INTERNAL: 'internal', // New table for internal storage like flush timestamps\n} as const;\n\n// Keys for internal storage table\nexport const INTERNAL_KEYS = {\n LAST_FLUSH_TIMESTAMP: 'last_flush_timestamp',\n} as const;\n\n// Record interfaces for each table\nexport interface TagRecord {\n key: string;\n value: string;\n}\n\nexport interface CounterRecord {\n key: string;\n value: number;\n}\n\nexport interface HistogramRecord {\n key: string;\n count: number;\n min: number;\n max: number;\n sum: number;\n}\n\nexport interface EventRecord {\n id?: number; // Auto-increment primary key\n event_name: string;\n time: number;\n event_properties: Record<string, any>;\n}\n\nexport interface InternalRecord {\n key: string;\n value: string;\n}\n\nexport interface IDiagnosticsStorage {\n /**\n * Set multiple tags in a single transaction (batch operation)\n * Promise never rejects - errors are logged and operation continues gracefully\n */\n setTags(tags: Record<string, string>): Promise<void>;\n /**\n * Increment multiple counters in a single transaction (batch operation)\n * Uses read-modify-write pattern to accumulate with existing values\n * Promise never rejects - errors are logged and operation continues gracefully\n */\n incrementCounters(counters: Record<string, number>): Promise<void>;\n /**\n * Set multiple histogram stats in a single transaction (batch operation)\n * Uses read-modify-write pattern to accumulate count/sum and update min/max with existing values\n * Promise never rejects - errors are logged and operation continues gracefully\n */\n setHistogramStats(\n histogramStats: Record<string, { count: number; min: number; max: number; sum: number }>,\n ): Promise<void>;\n /**\n * Add multiple event records in a single transaction (batch operation)\n * Promise never rejects - errors are logged and operation continues gracefully\n */\n addEventRecords(\n events: Array<{ event_name: string; time: number; event_properties: Record<string, any> }>,\n ): Promise<void>;\n\n setLastFlushTimestamp(timestamp: number): Promise<void>;\n\n getLastFlushTimestamp(): Promise<number | undefined>;\n\n /**\n * Get all data except internal data from storage and clear it\n */\n getAllAndClear(): Promise<{\n tags: TagRecord[];\n counters: CounterRecord[];\n histogramStats: HistogramRecord[];\n events: EventRecord[];\n }>;\n}\n\n/**\n * Purpose-specific IndexedDB storage for diagnostics data\n * Provides optimized methods for each type of diagnostics data\n */\nexport class DiagnosticsStorage implements IDiagnosticsStorage {\n dbPromise: Promise<IDBDatabase> | null = null;\n dbName: string;\n logger: ILogger;\n\n constructor(apiKey: string, logger: ILogger) {\n this.logger = logger;\n this.dbName = `AMP_diagnostics_${apiKey.substring(0, 10)}`;\n }\n\n /**\n * Check if IndexedDB is supported in the current environment\n * @returns true if IndexedDB is available, false otherwise\n */\n static isSupported(): boolean {\n return getGlobalScope()?.indexedDB !== undefined;\n }\n\n async getDB(): Promise<IDBDatabase> {\n if (!this.dbPromise) {\n this.dbPromise = this.openDB();\n }\n return this.dbPromise;\n }\n\n openDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, DB_VERSION);\n\n request.onerror = () => {\n // Clear dbPromise when it rejects for the first time\n this.dbPromise = null;\n reject(new Error('Failed to open IndexedDB'));\n };\n\n request.onsuccess = () => {\n const db = request.result;\n // Clear dbPromise when connection was on but went off later\n db.onclose = () => {\n this.dbPromise = null;\n this.logger.debug('DiagnosticsStorage: DB connection closed.');\n };\n\n db.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: A global database error occurred.', event);\n db.close();\n };\n resolve(db);\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n this.createTables(db);\n };\n });\n }\n\n createTables(db: IDBDatabase): void {\n // Create tags table\n if (!db.objectStoreNames.contains(TABLE_NAMES.TAGS)) {\n db.createObjectStore(TABLE_NAMES.TAGS, { keyPath: 'key' });\n }\n\n // Create counters table\n if (!db.objectStoreNames.contains(TABLE_NAMES.COUNTERS)) {\n db.createObjectStore(TABLE_NAMES.COUNTERS, { keyPath: 'key' });\n }\n\n // Create histograms table for storing histogram stats (count, min, max, sum)\n if (!db.objectStoreNames.contains(TABLE_NAMES.HISTOGRAMS)) {\n db.createObjectStore(TABLE_NAMES.HISTOGRAMS, {\n keyPath: 'key',\n });\n }\n\n // Create events table\n if (!db.objectStoreNames.contains(TABLE_NAMES.EVENTS)) {\n const eventsStore = db.createObjectStore(TABLE_NAMES.EVENTS, {\n keyPath: 'id',\n autoIncrement: true,\n });\n\n // Create index on time for chronological queries\n eventsStore.createIndex('time_idx', 'time', { unique: false });\n }\n\n // Create internal table for storing internal data like flush timestamps\n if (!db.objectStoreNames.contains(TABLE_NAMES.INTERNAL)) {\n db.createObjectStore(TABLE_NAMES.INTERNAL, { keyPath: 'key' });\n }\n }\n\n async setTags(tags: Record<string, string>): Promise<void> {\n try {\n if (Object.entries(tags).length === 0) {\n return;\n }\n\n const db = await this.getDB();\n const transaction = db.transaction([TABLE_NAMES.TAGS], 'readwrite');\n const store = transaction.objectStore(TABLE_NAMES.TAGS);\n\n return new Promise((resolve) => {\n const entries = Object.entries(tags);\n\n transaction.oncomplete = () => {\n resolve();\n };\n\n transaction.onabort = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to set tags', event);\n resolve();\n };\n\n entries.forEach(([key, value]) => {\n const putRequest = store.put({ key, value });\n\n putRequest.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to set tag', key, value, event);\n };\n });\n });\n } catch (error) {\n this.logger.debug('DiagnosticsStorage: Failed to set tags', error);\n }\n }\n\n async incrementCounters(counters: Record<string, number>): Promise<void> {\n try {\n if (Object.entries(counters).length === 0) {\n return;\n }\n\n const db = await this.getDB();\n const transaction = db.transaction([TABLE_NAMES.COUNTERS], 'readwrite');\n const store = transaction.objectStore(TABLE_NAMES.COUNTERS);\n\n return new Promise((resolve) => {\n const entries = Object.entries(counters);\n\n transaction.oncomplete = () => {\n resolve();\n };\n\n transaction.onabort = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to increment counters', event);\n resolve();\n };\n\n // Read existing values and update them\n entries.forEach(([key, incrementValue]) => {\n const getRequest = store.get(key);\n\n getRequest.onsuccess = () => {\n const existingRecord = getRequest.result as CounterRecord | undefined;\n /* istanbul ignore next */\n const existingValue = existingRecord ? existingRecord.value : 0;\n const putRequest = store.put({ key, value: existingValue + incrementValue });\n\n putRequest.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to update counter', key, event);\n };\n };\n\n getRequest.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to read existing counter', key, event);\n };\n });\n });\n } catch (error) {\n this.logger.debug('DiagnosticsStorage: Failed to increment counters', error);\n }\n }\n\n async setHistogramStats(histogramStats: Record<string, HistogramStats>): Promise<void> {\n try {\n if (Object.entries(histogramStats).length === 0) {\n return;\n }\n\n const db = await this.getDB();\n const transaction = db.transaction([TABLE_NAMES.HISTOGRAMS], 'readwrite');\n const store = transaction.objectStore(TABLE_NAMES.HISTOGRAMS);\n\n return new Promise((resolve) => {\n const entries = Object.entries(histogramStats);\n\n transaction.oncomplete = () => {\n resolve();\n };\n\n transaction.onabort = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to set histogram stats', event);\n resolve();\n };\n\n // Read existing values and update them\n entries.forEach(([key, newStats]) => {\n const getRequest = store.get(key);\n\n getRequest.onsuccess = () => {\n const existingRecord = getRequest.result as HistogramRecord | undefined;\n let updatedStats: HistogramRecord;\n\n /* istanbul ignore next */\n if (existingRecord) {\n // Accumulate with existing stats\n updatedStats = {\n key,\n count: existingRecord.count + newStats.count,\n min: Math.min(existingRecord.min, newStats.min),\n max: Math.max(existingRecord.max, newStats.max),\n sum: existingRecord.sum + newStats.sum,\n };\n } else {\n // Create new stats\n updatedStats = {\n key,\n count: newStats.count,\n min: newStats.min,\n max: newStats.max,\n sum: newStats.sum,\n };\n }\n\n const putRequest = store.put(updatedStats);\n\n putRequest.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to set histogram stats', key, event);\n };\n };\n\n getRequest.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to read existing histogram stats', key, event);\n };\n });\n });\n } catch (error) {\n this.logger.debug('DiagnosticsStorage: Failed to set histogram stats', error);\n }\n }\n\n async addEventRecords(\n events: Array<{ event_name: string; time: number; event_properties: Record<string, any> }>,\n ): Promise<void> {\n try {\n if (events.length === 0) {\n return;\n }\n\n const db = await this.getDB();\n const transaction = db.transaction([TABLE_NAMES.EVENTS], 'readwrite');\n const store = transaction.objectStore(TABLE_NAMES.EVENTS);\n\n return new Promise((resolve) => {\n transaction.oncomplete = () => {\n resolve();\n };\n\n /* istanbul ignore next */\n transaction.onabort = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to add event records', event);\n resolve();\n };\n\n // First, check how many events are currently stored\n const countRequest = store.count();\n\n countRequest.onsuccess = () => {\n const currentCount = countRequest.result;\n\n // Calculate how many events we can add\n const availableSlots = Math.max(0, MAX_PERSISTENT_STORAGE_EVENTS_COUNT - currentCount);\n\n if (availableSlots < events.length) {\n this.logger.debug(\n `DiagnosticsStorage: Only added ${availableSlots} of ${events.length} events due to storage limit`,\n );\n }\n\n // Only add events up to the available slots (take the least recent ones)\n events.slice(0, availableSlots).forEach((event) => {\n const request = store.add(event);\n\n request.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to add event record', event);\n };\n });\n };\n\n countRequest.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to count existing events', event);\n };\n });\n } catch (error) {\n this.logger.debug('DiagnosticsStorage: Failed to add event records', error);\n }\n }\n\n async setInternal(key: string, value: string): Promise<void> {\n try {\n const db = await this.getDB();\n const transaction = db.transaction([TABLE_NAMES.INTERNAL], 'readwrite');\n const store = transaction.objectStore(TABLE_NAMES.INTERNAL);\n\n return new Promise((resolve, reject) => {\n /* istanbul ignore next */\n transaction.onabort = () => reject(new Error('Failed to set internal value'));\n\n const request = store.put({ key, value });\n\n request.onsuccess = () => resolve();\n\n /* istanbul ignore next */\n request.onerror = () => reject(new Error('Failed to set internal value'));\n });\n } catch (error) {\n /* istanbul ignore next */\n this.logger.debug('DiagnosticsStorage: Failed to set internal value', error);\n }\n }\n\n async getInternal(key: string): Promise<InternalRecord | undefined> {\n try {\n const db = await this.getDB();\n const transaction = db.transaction([TABLE_NAMES.INTERNAL], 'readonly');\n const store = transaction.objectStore(TABLE_NAMES.INTERNAL);\n\n return new Promise((resolve, reject) => {\n /* istanbul ignore next */\n transaction.onabort = () => reject(new Error('Failed to get internal value'));\n\n const request = store.get(key);\n\n request.onsuccess = () => resolve(request.result as InternalRecord | undefined);\n\n /* istanbul ignore next */\n request.onerror = () => reject(new Error('Failed to get internal value'));\n });\n } catch (error) {\n this.logger.debug('DiagnosticsStorage: Failed to get internal value', error);\n return undefined;\n }\n }\n\n async getLastFlushTimestamp(): Promise<number | undefined> {\n try {\n const record = await this.getInternal(INTERNAL_KEYS.LAST_FLUSH_TIMESTAMP);\n return record ? parseInt(record.value, 10) : undefined;\n } catch (error) {\n /* istanbul ignore next */\n this.logger.debug('DiagnosticsStorage: Failed to get last flush timestamp', error);\n /* istanbul ignore next */\n return undefined;\n }\n }\n\n async setLastFlushTimestamp(timestamp: number): Promise<void> {\n try {\n await this.setInternal(INTERNAL_KEYS.LAST_FLUSH_TIMESTAMP, timestamp.toString());\n } catch (error) {\n /* istanbul ignore next */\n this.logger.debug('DiagnosticsStorage: Failed to set last flush timestamp', error);\n }\n }\n\n /* istanbul ignore next */\n clearTable(transaction: IDBTransaction, tableName: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const store = transaction.objectStore(tableName);\n const request = store.clear();\n\n request.onsuccess = () => resolve();\n request.onerror = () => reject(new Error(`Failed to clear table ${tableName}`));\n });\n }\n\n /* istanbul ignore next */\n async getAllAndClear(): Promise<{\n tags: TagRecord[];\n counters: CounterRecord[];\n histogramStats: HistogramRecord[];\n events: EventRecord[];\n }> {\n try {\n const db = await this.getDB();\n const transaction = db.transaction(\n [TABLE_NAMES.TAGS, TABLE_NAMES.COUNTERS, TABLE_NAMES.HISTOGRAMS, TABLE_NAMES.EVENTS],\n 'readwrite',\n );\n\n // Get all data first\n const [tags, counters, histogramStats, events] = await Promise.all([\n this.getAllFromStore<TagRecord>(transaction, TABLE_NAMES.TAGS),\n this.getAllFromStore<CounterRecord>(transaction, TABLE_NAMES.COUNTERS),\n this.getAllFromStore<HistogramRecord>(transaction, TABLE_NAMES.HISTOGRAMS),\n this.getAllFromStore<EventRecord>(transaction, TABLE_NAMES.EVENTS),\n ]);\n\n // Clear all data in the same transaction\n await Promise.all([\n this.clearTable(transaction, TABLE_NAMES.COUNTERS),\n this.clearTable(transaction, TABLE_NAMES.HISTOGRAMS),\n this.clearTable(transaction, TABLE_NAMES.EVENTS),\n ]);\n\n return { tags, counters, histogramStats, events };\n } catch (error) {\n this.logger.debug('DiagnosticsStorage: Failed to get all and clear data', error);\n return { tags: [], counters: [], histogramStats: [], events: [] };\n }\n }\n\n /**\n * Helper method to get all records from a store within a transaction\n */\n /* istanbul ignore next */\n private getAllFromStore<T>(transaction: IDBTransaction, tableName: string): Promise<T[]> {\n return new Promise((resolve, reject) => {\n const store = transaction.objectStore(tableName);\n const request = store.getAll();\n\n request.onsuccess = () => resolve(request.result as T[]);\n request.onerror = () => reject(new Error(`Failed to get all from ${tableName}`));\n });\n }\n}\n","import { getGlobalScope } from '../global-scope';\nimport { IDiagnosticsClient } from './diagnostics-client';\n\ntype ErrorEventType = 'error' | 'unhandledrejection';\n\ninterface CapturedErrorContext {\n readonly type: ErrorEventType;\n readonly message: string;\n readonly stack?: string;\n readonly filename?: string;\n readonly errorName?: string;\n readonly metadata?: Record<string, unknown>;\n}\n\nexport const GLOBAL_KEY = '__AMPLITUDE_SCRIPT_URL__';\nexport const EVENT_NAME_ERROR_UNCAUGHT = 'sdk.error.uncaught';\n\nconst getNormalizedScriptUrl = (): string | undefined => {\n const scope = getGlobalScope() as Record<string, unknown> | null;\n /* istanbul ignore next */\n return scope?.[GLOBAL_KEY] as string | undefined;\n};\n\nconst setNormalizedScriptUrl = (url: string) => {\n const scope = getGlobalScope() as Record<string, unknown> | null;\n if (scope) {\n scope[GLOBAL_KEY] = url;\n }\n};\n\nexport const registerSdkLoaderMetadata = (metadata: { scriptUrl?: string }) => {\n if (metadata.scriptUrl) {\n const normalized = normalizeUrl(metadata.scriptUrl);\n if (normalized) {\n setNormalizedScriptUrl(normalized);\n }\n }\n};\n\nexport const enableSdkErrorListeners = (client: IDiagnosticsClient) => {\n const scope = getGlobalScope();\n\n if (!scope || typeof scope.addEventListener !== 'function') {\n return;\n }\n\n const handleError = (event: ErrorEvent) => {\n const error = event.error instanceof Error ? event.error : undefined;\n const stack = error?.stack;\n const match = detectSdkOrigin({ filename: event.filename, stack });\n if (!match) {\n return;\n }\n\n capture({\n type: 'error',\n message: event.message,\n stack,\n filename: event.filename,\n errorName: error?.name,\n metadata: {\n colno: event.colno,\n lineno: event.lineno,\n isTrusted: event.isTrusted,\n matchReason: match,\n },\n });\n };\n\n const handleRejection = (event: PromiseRejectionEvent) => {\n const error = event.reason instanceof Error ? event.reason : undefined;\n const stack = error?.stack;\n const filename = extractFilenameFromStack(stack);\n const match = detectSdkOrigin({ filename, stack });\n\n if (!match) {\n return;\n }\n\n /* istanbul ignore next */\n capture({\n type: 'unhandledrejection',\n message: error?.message ?? stringifyReason(event.reason),\n stack,\n filename,\n errorName: error?.name,\n metadata: {\n isTrusted: event.isTrusted,\n matchReason: match,\n },\n });\n };\n\n const capture = (context: CapturedErrorContext) => {\n client.recordEvent(EVENT_NAME_ERROR_UNCAUGHT, {\n type: context.type,\n message: context.message,\n filename: context.filename,\n error_name: context.errorName,\n stack: context.stack,\n ...context.metadata,\n });\n };\n\n scope.addEventListener('error', handleError, true);\n scope.addEventListener('unhandledrejection', handleRejection, true);\n};\n\nconst detectSdkOrigin = (payload: { filename?: string; stack?: string }): 'filename' | 'stack' | undefined => {\n const normalizedScriptUrl = getNormalizedScriptUrl();\n if (!normalizedScriptUrl) {\n return undefined;\n }\n\n if (payload.filename && payload.filename.includes(normalizedScriptUrl)) {\n return 'filename';\n }\n\n if (payload.stack && payload.stack.includes(normalizedScriptUrl)) {\n return 'stack';\n }\n\n return undefined;\n};\n\nconst normalizeUrl = (value: string) => {\n try {\n /* istanbul ignore next */\n const url = new URL(value, getGlobalScope()?.location?.origin);\n return url.origin + url.pathname;\n } catch {\n return undefined;\n }\n};\n\nconst extractFilenameFromStack = (stack?: string) => {\n if (!stack) {\n return undefined;\n }\n\n const match = stack.match(/(https?:\\/\\/\\S+?)(?=[)\\s]|$)/);\n /* istanbul ignore next */\n return match ? match[1] : undefined;\n};\n\n/* istanbul ignore next */\nconst stringifyReason = (reason: unknown) => {\n if (typeof reason === 'string') {\n return reason;\n }\n\n try {\n return JSON.stringify(reason);\n } catch {\n return '[object Object]';\n }\n};\n","import { ILogger } from '../logger';\nimport { DiagnosticsStorage, IDiagnosticsStorage } from './diagnostics-storage';\nimport { ServerZoneType } from '../types/server-zone';\nimport { getGlobalScope } from '../global-scope';\nimport { isTimestampInSampleTemp } from '../utils/sampling';\nimport { enableSdkErrorListeners } from './uncaught-sdk-errors';\n\nexport const SAVE_INTERVAL_MS = 1000; // 1 second\nexport const FLUSH_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes\nexport const DIAGNOSTICS_US_SERVER_URL = 'https://diagnostics.prod.us-west-2.amplitude.com/v1/capture';\nexport const DIAGNOSTICS_EU_SERVER_URL = 'https://diagnostics.prod.eu-central-1.amplitude.com/v1/capture';\n\n// In-memory storage limits\nexport const MAX_MEMORY_STORAGE_COUNT = 10000; // for tags, counters, histograms separately\nexport const MAX_MEMORY_STORAGE_EVENTS_COUNT = 10;\n\n// === Core Data Types ===\n\n/**\n * Key-value pairs for environment/context information\n */\ntype DiagnosticsTags = Record<string, string>;\n\n/**\n * Numeric counters that can be incremented\n */\ntype DiagnosticsCounters = Record<string, number>;\n\n/**\n * Properties for diagnostic events\n */\ntype EventProperties = Record<string, any>;\n\n/**\n * Individual diagnostic event\n */\ninterface DiagnosticsEvent {\n readonly event_name: string;\n readonly time: number;\n readonly event_properties: EventProperties;\n}\n\n/**\n * Computed histogram statistics for final payload\n */\ninterface HistogramResult {\n readonly count: number;\n readonly min: number;\n readonly max: number;\n readonly avg: number;\n}\n\n/**\n * Internal histogram statistics with sum for efficient incremental updates\n */\nexport interface HistogramStats {\n count: number;\n min: number;\n max: number;\n sum: number; // Used for avg calculation\n}\n\n/**\n * Collection of histogram results keyed by histogram name\n */\ntype DiagnosticsHistograms = Record<string, HistogramResult>;\n\n/**\n * Collection of histogram stats keyed by histogram name (internal use for memory + persistence storage)\n */\ntype DiagnosticsHistogramStats = Record<string, HistogramStats>;\n\n// === Payload Types ===\n\n/**\n * Complete diagnostics payload sent to backend\n */\ninterface FlushPayload {\n readonly tags: DiagnosticsTags;\n readonly histogram: DiagnosticsHistograms;\n readonly counters: DiagnosticsCounters;\n readonly events: readonly DiagnosticsEvent[];\n}\n\n/**\n * Amplitude Diagnostics Client\n *\n * A client for collecting and managing diagnostics data including tags, counters,\n * histograms, and events. Data is stored persistently using IndexedDB to survive browser restarts and offline scenarios.\n *\n * Key Features:\n * - IndexedDB storage\n * - Time-based persistent storage flush interval (5 minutes since last flush)\n * - 1 second time-based memory storage flush to persistent storage\n * - Histogram statistics calculation (min, max, avg)\n */\nexport interface IDiagnosticsClient {\n /**\n * Set or update a tag\n *\n * @example\n * ```typescript\n * // Set environment tags\n * diagnostics.setTag('library', 'amplitude-typescript/2.0.0');\n * diagnostics.setTag('user_agent', navigator.userAgent);\n * ```\n */\n setTag(name: string, value: string): void;\n\n /**\n * Increment a counter. If doesn't exist, create a counter and set value to 1\n *\n * @example\n * ```typescript\n * // Track counters\n * diagnostics.increment('analytics.fileNotFound');\n * diagnostics.increment('network.retry', 3);\n * ```\n */\n increment(name: string, size?: number): void;\n\n /**\n * Record a histogram value\n *\n * @example\n * ```typescript\n * // Record performance metrics\n * diagnostics.recordHistogram('sr.time', 5.2);\n * diagnostics.recordHistogram('network.latency', 150);\n * ```\n */\n recordHistogram(name: string, value: number): void;\n\n /**\n * Record an event\n *\n * @example\n * ```typescript\n * // Record diagnostic events\n * diagnostics.recordEvent('error', {\n * stack_trace: '...',\n * });\n * ```\n */\n recordEvent(name: string, properties: EventProperties): void;\n\n // Flush storage\n _flush(): void;\n\n /**\n * Sets the sample rate for diagnostics.\n *\n * @example\n * ```typescript\n * diagnostics.setSampleRate(0.5);\n * ```\n */\n _setSampleRate(sampleRate: number): void;\n}\n\nexport class DiagnosticsClient implements IDiagnosticsClient {\n storage?: IDiagnosticsStorage;\n logger: ILogger;\n serverUrl: string;\n apiKey: string;\n // Whether to track diagnostics data based on sample rate and enabled flag\n shouldTrack: boolean;\n config: {\n enabled: boolean;\n sampleRate: number;\n };\n /**\n * The timestamp when the diagnostics client was initialized.\n * Save in memory to keep lifecycle sample rate calculation consistency.\n */\n startTimestamp: number;\n\n // In-memory storages\n inMemoryTags: DiagnosticsTags = {};\n inMemoryCounters: DiagnosticsCounters = {};\n inMemoryHistograms: DiagnosticsHistogramStats = {};\n inMemoryEvents: DiagnosticsEvent[] = [];\n\n // Timer for 1-second persistence\n saveTimer: ReturnType<typeof setTimeout> | null = null;\n // Timer for flush interval\n flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n apiKey: string,\n logger: ILogger,\n serverZone: ServerZoneType = 'US',\n options?: {\n enabled?: boolean;\n sampleRate?: number;\n },\n ) {\n this.apiKey = apiKey;\n this.logger = logger;\n this.serverUrl = serverZone === 'US' ? DIAGNOSTICS_US_SERVER_URL : DIAGNOSTICS_EU_SERVER_URL;\n\n this.logger.debug('DiagnosticsClient: Initializing with options', JSON.stringify(options, null, 2));\n // Diagnostics is enabled by default with sample rate of 0 (no sampling)\n this.config = { enabled: true, sampleRate: 0, ...options };\n this.startTimestamp = Date.now();\n this.shouldTrack = isTimestampInSampleTemp(this.startTimestamp, this.config.sampleRate) && this.config.enabled;\n\n if (DiagnosticsStorage.isSupported()) {\n this.storage = new DiagnosticsStorage(apiKey, logger);\n } else {\n this.logger.debug('DiagnosticsClient: IndexedDB is not supported');\n }\n\n void this.initializeFlushInterval();\n\n // Track internal diagnostics metrics for sampling\n if (this.shouldTrack) {\n this.increment('sdk.diagnostics.sampled.in.and.enabled');\n enableSdkErrorListeners(this);\n }\n }\n\n /**\n * Check if storage is available and tracking is enabled\n */\n isStorageAndTrackEnabled(): boolean {\n return Boolean(this.storage) && Boolean(this.shouldTrack);\n }\n\n setTag(name: string, value: string) {\n if (!this.isStorageAndTrackEnabled()) {\n return;\n }\n\n if (Object.keys(this.inMemoryTags).length >= MAX_MEMORY_STORAGE_COUNT) {\n this.logger.debug('DiagnosticsClient: Early return setTags as reaching memory limit');\n return;\n }\n\n this.inMemoryTags[name] = value;\n this.startTimersIfNeeded();\n }\n\n increment(name: string, size = 1) {\n if (!this.isStorageAndTrackEnabled()) {\n return;\n }\n\n if (Object.keys(this.inMemoryCounters).length >= MAX_MEMORY_STORAGE_COUNT) {\n this.logger.debug('DiagnosticsClient: Early return increment as reaching memory limit');\n return;\n }\n\n this.inMemoryCounters[name] = (this.inMemoryCounters[name] || 0) + size;\n this.startTimersIfNeeded();\n }\n\n recordHistogram(name: string, value: number) {\n if (!this.isStorageAndTrackEnabled()) {\n return;\n }\n\n if (Object.keys(this.inMemoryHistograms).length >= MAX_MEMORY_STORAGE_COUNT) {\n this.logger.debug('DiagnosticsClient: Early return recordHistogram as reaching memory limit');\n return;\n }\n\n const existing = this.inMemoryHistograms[name];\n if (existing) {\n // Update existing stats incrementally\n existing.count += 1;\n existing.min = Math.min(existing.min, value);\n existing.max = Math.max(existing.max, value);\n existing.sum += value;\n } else {\n // Create new stats\n this.inMemoryHistograms[name] = {\n count: 1,\n min: value,\n max: value,\n sum: value,\n };\n }\n this.startTimersIfNeeded();\n }\n\n recordEvent(name: string, properties: EventProperties) {\n if (!this.isStorageAndTrackEnabled()) {\n return;\n }\n\n if (this.inMemoryEvents.length >= MAX_MEMORY_STORAGE_EVENTS_COUNT) {\n this.logger.debug('DiagnosticsClient: Early return recordEvent as reaching memory limit');\n return;\n }\n\n this.inMemoryEvents.push({\n event_name: name,\n time: Date.now(),\n event_properties: properties,\n });\n this.startTimersIfNeeded();\n }\n\n startTimersIfNeeded() {\n if (!this.saveTimer) {\n this.saveTimer = setTimeout(() => {\n this.saveAllDataToStorage()\n .catch((error) => {\n this.logger.debug('DiagnosticsClient: Failed to save all data to storage', error);\n })\n .finally(() => {\n this.saveTimer = null;\n });\n }, SAVE_INTERVAL_MS);\n }\n\n if (!this.flushTimer) {\n this.flushTimer = setTimeout(() => {\n this._flush()\n .catch((error) => {\n this.logger.debug('DiagnosticsClient: Failed to flush', error);\n })\n .finally(() => {\n this.flushTimer = null;\n });\n }, FLUSH_INTERVAL_MS);\n }\n }\n\n async saveAllDataToStorage() {\n if (!this.storage) {\n return;\n }\n const tagsToSave = { ...this.inMemoryTags };\n const countersToSave = { ...this.inMemoryCounters };\n const histogramsToSave = { ...this.inMemoryHistograms };\n const eventsToSave = [...this.inMemoryEvents];\n\n this.inMemoryEvents = [];\n this.inMemoryTags = {};\n this.inMemoryCounters = {};\n this.inMemoryHistograms = {};\n\n await Promise.all([\n this.storage.setTags(tagsToSave),\n this.storage.incrementCounters(countersToSave),\n this.storage.setHistogramStats(histogramsToSave),\n this.storage.addEventRecords(eventsToSave),\n ]);\n }\n\n async _flush() {\n if (!this.storage) {\n return;\n }\n\n await this.saveAllDataToStorage();\n this.saveTimer = null;\n this.flushTimer = null;\n\n // Get all data from storage and clear it\n const {\n tags: tagRecords,\n counters: counterRecords,\n histogramStats: histogramStatsRecords,\n events: eventRecords,\n } = await this.storage.getAllAndClear();\n\n // Update the last flush timestamp\n void this.storage.setLastFlushTimestamp(Date.now());\n\n // Convert metrics to the expected format\n const tags: DiagnosticsTags = {};\n tagRecords.forEach((record) => {\n tags[record.key] = record.value;\n });\n\n const counters: DiagnosticsCounters = {};\n counterRecords.forEach((record) => {\n counters[record.key] = record.value;\n });\n\n const histogram: DiagnosticsHistograms = {};\n histogramStatsRecords.forEach((stats) => {\n histogram[stats.key] = {\n count: stats.count,\n min: stats.min,\n max: stats.max,\n avg: Math.round((stats.sum / stats.count) * 100) / 100, // round the average to 2 decimal places.\n };\n });\n\n const events: DiagnosticsEvent[] = eventRecords.map((record) => ({\n event_name: record.event_name,\n time: record.time,\n event_properties: record.event_properties,\n }));\n\n // Early return if all data collections are empty\n if (Object.keys(counters).length === 0 && Object.keys(histogram).length === 0 && events.length === 0) {\n return;\n }\n\n // Create flush payload\n const payload: FlushPayload = {\n tags,\n histogram,\n counters,\n events,\n };\n\n // Send payload to diagnostics server\n void this.fetch(payload);\n }\n\n /**\n * Send diagnostics data to the server\n */\n async fetch(payload: FlushPayload) {\n try {\n if (!getGlobalScope()) {\n throw new Error('DiagnosticsClient: Fetch is not supported');\n }\n\n const response = await fetch(this.serverUrl, {\n method: 'POST',\n headers: {\n 'X-ApiKey': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n this.logger.debug('DiagnosticsClient: Failed to send diagnostics data.');\n return;\n }\n\n this.logger.debug('DiagnosticsClient: Successfully sent diagnostics data');\n } catch (error) {\n this.logger.debug('DiagnosticsClient: Failed to send diagnostics data. ', error);\n }\n }\n\n /**\n * Initialize flush interval logic.\n * Check if 5 minutes has passed since last flush, if so flush immediately.\n * Otherwise set a timer to flush when the interval is reached.\n */\n async initializeFlushInterval() {\n if (!this.storage) {\n return;\n }\n const now = Date.now();\n const lastFlushTimestamp = (await this.storage.getLastFlushTimestamp()) || -1;\n\n // If last flush timestamp is -1, it means this is a new client\n // Save current timestamp as the initial \"last flush timestamp\"\n // and schedule the flush timer\n if (lastFlushTimestamp === -1) {\n void this.storage.setLastFlushTimestamp(now);\n this._setFlushTimer(FLUSH_INTERVAL_MS);\n return;\n }\n\n const timeSinceLastFlush = now - lastFlushTimestamp;\n if (timeSinceLastFlush >= FLUSH_INTERVAL_MS) {\n // More than 5 minutes has passed, flush immediately\n void this._flush();\n return;\n } else {\n // Set timer for remaining time\n this._setFlushTimer(FLUSH_INTERVAL_MS - timeSinceLastFlush);\n }\n }\n\n /**\n * Helper method to set flush timer with consistent error handling\n */\n private _setFlushTimer(delay: number) {\n this.flushTimer = setTimeout(() => {\n this._flush()\n .catch((error) => {\n this.logger.debug('DiagnosticsClient: Failed to flush', error);\n })\n .finally(() => {\n this.flushTimer = null;\n });\n }, delay);\n }\n\n _setSampleRate(sampleRate: number): void {\n this.logger.debug('DiagnosticsClient: Setting sample rate to', sampleRate);\n this.config.sampleRate = sampleRate;\n this.shouldTrack = isTimestampInSampleTemp(this.startTimestamp, this.config.sampleRate) && this.config.enabled;\n this.logger.debug('DiagnosticsClient: Should track is', this.shouldTrack);\n }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\nimport { Transport } from '../types/transport';\nimport { Status } from '../types/status';\nimport { Payload } from '../types/payload';\nimport { Response } from '../types/response';\nimport { isSuccessStatusCode } from '../utils/status-code';\n\nexport class BaseTransport implements Transport {\n send(_serverUrl: string, _payload: Payload): Promise<Response | null> {\n return Promise.resolve(null);\n }\n\n buildResponse(responseJSON: Record<string, any>): Response | null {\n if (typeof responseJSON !== 'object') {\n return null;\n }\n\n const statusCode = responseJSON.code || 0;\n const status = this.buildStatus(statusCode);\n\n switch (status) {\n case Status.Success:\n return {\n status,\n statusCode,\n body: {\n eventsIngested: responseJSON.events_ingested ?? 0,\n payloadSizeBytes: responseJSON.payload_size_bytes ?? 0,\n serverUploadTime: responseJSON.server_upload_time ?? 0,\n },\n };\n\n case Status.Invalid:\n return {\n status,\n statusCode,\n body: {\n error: responseJSON.error ?? '',\n missingField: responseJSON.missing_field ?? '',\n eventsWithInvalidFields: responseJSON.events_with_invalid_fields ?? {},\n eventsWithMissingFields: responseJSON.events_with_missing_fields ?? {},\n eventsWithInvalidIdLengths: responseJSON.events_with_invalid_id_lengths ?? {},\n epsThreshold: responseJSON.eps_threshold ?? 0,\n exceededDailyQuotaDevices: responseJSON.exceeded_daily_quota_devices ?? {},\n silencedDevices: responseJSON.silenced_devices ?? [],\n silencedEvents: responseJSON.silenced_events ?? [],\n throttledDevices: responseJSON.throttled_devices ?? {},\n throttledEvents: responseJSON.throttled_events ?? [],\n },\n };\n case Status.PayloadTooLarge:\n return {\n status,\n statusCode,\n body: {\n error: responseJSON.error ?? '',\n },\n };\n case Status.RateLimit:\n return {\n status,\n statusCode,\n body: {\n error: responseJSON.error ?? '',\n epsThreshold: responseJSON.eps_threshold ?? 0,\n throttledDevices: responseJSON.throttled_devices ?? {},\n throttledUsers: responseJSON.throttled_users ?? {},\n exceededDailyQuotaDevices: responseJSON.exceeded_daily_quota_devices ?? {},\n exceededDailyQuotaUsers: responseJSON.exceeded_daily_quota_users ?? {},\n throttledEvents: responseJSON.throttled_events ?? [],\n },\n };\n case Status.Timeout:\n default:\n return {\n status,\n statusCode,\n };\n }\n }\n\n buildStatus(code: number): Status {\n if (isSuccessStatusCode(code)) {\n return Status.Success;\n }\n\n if (code === 429) {\n return Status.RateLimit;\n }\n\n if (code === 413) {\n return Status.PayloadTooLarge;\n }\n\n if (code === 408) {\n return Status.Timeout;\n }\n\n if (code >= 400 && code < 500) {\n return Status.Invalid;\n }\n\n if (code >= 500) {\n return Status.Failed;\n }\n\n return Status.Unknown;\n }\n}\n","import { BaseTransport } from './base';\nimport { Transport } from '../types/transport';\nimport { Payload } from '../types/payload';\nimport { Response } from '../types/response';\n\nexport class FetchTransport extends BaseTransport implements Transport {\n private customHeaders: Record<string, string>;\n\n constructor(customHeaders: Record<string, string> = {}) {\n super();\n this.customHeaders = customHeaders;\n }\n\n async send(serverUrl: string, payload: Payload): Promise<Response | null> {\n /* istanbul ignore if */\n if (typeof fetch === 'undefined') {\n throw new Error('FetchTransport is not supported');\n }\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n ...this.customHeaders,\n },\n body: JSON.stringify(payload),\n method: 'POST',\n };\n const response = await fetch(serverUrl, options);\n const responseText = await response.text();\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return this.buildResponse(JSON.parse(responseText));\n } catch {\n return this.buildResponse({ code: response.status });\n }\n }\n}\n","import { RemoteConfigStorage, RemoteConfigInfo } from './remote-config';\nimport { ILogger } from '../logger';\n\nexport class RemoteConfigLocalStorage implements RemoteConfigStorage {\n private readonly key: string;\n private readonly logger: ILogger;\n\n constructor(apiKey: string, logger: ILogger) {\n this.key = `AMP_remote_config_${apiKey.substring(0, 10)}`;\n this.logger = logger;\n }\n\n fetchConfig(): Promise<RemoteConfigInfo> {\n let result: string | null = null;\n const failedRemoteConfigInfo = {\n remoteConfig: null,\n lastFetch: new Date(),\n };\n\n try {\n result = localStorage.getItem(this.key);\n } catch (error) {\n this.logger.debug('Remote config localstorage failed to access: ', error);\n return Promise.resolve(failedRemoteConfigInfo);\n }\n\n if (result === null) {\n this.logger.debug('Remote config localstorage gets null because the key does not exist');\n return Promise.resolve(failedRemoteConfigInfo);\n }\n\n try {\n const remoteConfigInfo: RemoteConfigInfo = JSON.parse(result) as RemoteConfigInfo;\n this.logger.debug(`Remote config localstorage parsed successfully: ${JSON.stringify(remoteConfigInfo)}`);\n return Promise.resolve({\n remoteConfig: remoteConfigInfo.remoteConfig,\n lastFetch: new Date(remoteConfigInfo.lastFetch),\n });\n } catch (error) {\n this.logger.debug('Remote config localstorage failed to parse: ', error);\n localStorage.removeItem(this.key);\n return Promise.resolve(failedRemoteConfigInfo);\n }\n }\n\n setConfig(config: RemoteConfigInfo): Promise<boolean> {\n try {\n localStorage.setItem(this.key, JSON.stringify(config));\n this.logger.debug('Remote config localstorage set successfully.');\n return Promise.resolve(true);\n } catch (error) {\n this.logger.debug('Remote config localstorage failed to set: ', error);\n }\n return Promise.resolve(false);\n }\n}\n","import { ServerZoneType } from '../types/server-zone';\nimport { ILogger } from '../logger';\nimport { RemoteConfigLocalStorage } from './remote-config-localstorage';\nimport { UUID } from '../utils/uuid';\n\n/**\n * Modes for receiving remote config updates:\n * - `'all'` – Optimized for both speed and freshness. Returns the fastest response first\n * (cache or remote), then always waits for and returns the remote response to ensure\n * the most up-to-date config. Callback may be called once (if remote wins) or twice\n * (cache first, then remote).\n * - `{ timeout: number }` – Prefers remote data but with a fallback strategy. Waits for\n * a remote response until the specified timeout (in milliseconds), then falls back to\n * cached data if available. Callback is called exactly once.\n */\nexport type DeliveryMode = 'all' | { timeout: number };\n\n/**\n * Sources of returned remote config:\n * - `cache` - Fetched from local storage.\n * - `remote` - Fetched from remote.\n */\nexport type Source = 'cache' | 'remote';\n\nexport const US_SERVER_URL = 'https://sr-client-cfg.amplitude.com/config';\nexport const EU_SERVER_URL = 'https://sr-client-cfg.eu.amplitude.com/config';\nexport const DEFAULT_MAX_RETRIES = 3;\n\n/**\n * The default timeout for fetch in milliseconds.\n * Linear backoff policy: timeout / retry times is the interval between fetch retry.\n */\nconst DEFAULT_TIMEOUT = 1000;\n\n/**\n * The minimum time between fetches in milliseconds.\n * This prevents too many requests from being sent in a short period of time.\n */\nconst DEFAULT_MIN_TIME_BETWEEN_FETCHES = 5 * 60 * 1000; // 5 minutes\n\nexport interface RemoteConfig {\n [key: string]: any;\n}\n\nexport interface RemoteConfigInfo {\n remoteConfig: RemoteConfig | null;\n // Timestamp of when the remote config was fetched.\n lastFetch: Date;\n}\n\nexport interface RemoteConfigStorage {\n /**\n * Fetch remote config from storage asynchronously.\n */\n fetchConfig(): Promise<RemoteConfigInfo>;\n\n /**\n * Set remote config to storage asynchronously.\n */\n setConfig(config: RemoteConfigInfo): Promise<boolean>;\n}\n\n/**\n * Information about each callback registered by `RemoteConfigClient.subscribe()`,\n * managed internally by `RemoteConfigClient`.\n */\nexport interface CallbackInfo {\n id: string;\n key?: string;\n deliveryMode: DeliveryMode;\n callback: RemoteConfigCallback;\n lastCallback?: Date;\n}\n\n/**\n * Callback used in `RemoteConfigClient.subscribe()`.\n * This function is called when the remote config is fetched.\n */\ntype RemoteConfigCallback = (remoteConfig: RemoteConfig | null, source: Source, lastFetch: Date) => void;\n\nexport interface IRemoteConfigClient {\n /**\n * Subscribe for updates to remote config.\n * Callback is guaranteed to be called at least once,\n * Whether we are able to fetch a config or not.\n *\n * @param key - a string containing a series of period delimited keys to filter the returned config.\n * Ie, {a: {b: {c: ...}}} would return {b: {c: ...}} for \"a\" or {c: ...} for \"a.b\".\n * Set to `undefined` to subscribe all keys.\n * @param deliveryMode - how the initial callback is sent.\n * @param callback - a block that will be called when remote config is fetched.\n * @return id - identification of the subscribe and can be used to unsubscribe from updates.\n */\n subscribe(key: string | undefined, deliveryMode: DeliveryMode, callback: RemoteConfigCallback): string;\n\n /**\n * Unsubscribe a callback from receiving future updates.\n *\n * @param id - identification of the callback that you want to unsubscribe.\n * It's the return value of subscribe().\n * @return boolean - whether the callback is removed.\n */\n unsubscribe(id: string): boolean;\n\n /**\n * Request the remote config client to fetch from remote, update cache, and callback.\n */\n updateConfigs(): void;\n}\n\nexport class RemoteConfigClient implements IRemoteConfigClient {\n static readonly CONFIG_GROUP = 'browser';\n\n readonly apiKey: string;\n readonly serverUrl: string;\n readonly logger: ILogger;\n readonly storage: RemoteConfigStorage;\n // Registered callbackInfos by subscribe().\n callbackInfos: CallbackInfo[] = [];\n // Track the last successful fetch time for throttling (timestamp in milliseconds).\n lastSuccessfulFetch: number | null = null;\n // Store the in-flight fetch promise for deduplication.\n fetchPromise: Promise<RemoteConfigInfo> | null = null;\n\n constructor(apiKey: string, logger: ILogger, serverZone: ServerZoneType = 'US', serverUrl?: string) {\n this.apiKey = apiKey;\n this.serverUrl = serverUrl || (serverZone === 'US' ? US_SERVER_URL : EU_SERVER_URL);\n this.logger = logger;\n this.storage = new RemoteConfigLocalStorage(apiKey, logger);\n }\n\n subscribe(key: string | undefined, deliveryMode: DeliveryMode, callback: RemoteConfigCallback): string {\n const id = UUID();\n const callbackInfo = {\n id: id,\n key: key,\n deliveryMode: deliveryMode,\n callback: callback,\n };\n this.callbackInfos.push(callbackInfo);\n\n if (deliveryMode === 'all') {\n void this.subscribeAll(callbackInfo);\n } else {\n void this.subscribeWaitForRemote(callbackInfo, deliveryMode.timeout);\n }\n\n return id;\n }\n\n unsubscribe(id: string): boolean {\n const index = this.callbackInfos.findIndex((callbackInfo) => callbackInfo.id === id);\n if (index === -1) {\n this.logger.debug(`Remote config client unsubscribe failed because callback with id ${id} doesn't exist.`);\n return false;\n }\n\n this.callbackInfos.splice(index, 1);\n this.logger.debug(`Remote config client unsubscribe succeeded removing callback with id ${id}.`);\n return true;\n }\n\n async updateConfigs() {\n // Check if we need to throttle based on last successful fetch time\n if (this.lastSuccessfulFetch) {\n const timeSinceLastFetch = Date.now() - this.lastSuccessfulFetch;\n if (timeSinceLastFetch < DEFAULT_MIN_TIME_BETWEEN_FETCHES) {\n this.logger.debug('Remote config client skipping updateConfigs: Too recent');\n return;\n }\n }\n\n const result = await this.getOrCreateFetchPromise();\n void this.storage.setConfig(result);\n this.callbackInfos.forEach((callbackInfo) => {\n this.sendCallback(callbackInfo, result, 'remote');\n });\n }\n\n /**\n * Get the in-flight fetch promise or create a new one.\n * This ensures multiple subscribe calls share the same network request.\n */\n getOrCreateFetchPromise(): Promise<RemoteConfigInfo> {\n if (this.fetchPromise) {\n return this.fetchPromise;\n }\n\n this.fetchPromise = this.fetch()\n .then((result) => {\n // Update last successful fetch time if we got a valid config\n if (result.remoteConfig !== null) {\n this.lastSuccessfulFetch = Date.now();\n }\n return result;\n })\n .finally(() => {\n // Clear the promise after it settles (success or failure)\n this.fetchPromise = null;\n });\n\n return this.fetchPromise;\n }\n\n /**\n * Send remote first. If it's already complete, we can skip the cached response.\n * - if remote is fetched first, no cache fetch.\n * - if cache is fetched first, still fetching remote.\n */\n async subscribeAll(callbackInfo: CallbackInfo) {\n const remotePromise = this.getOrCreateFetchPromise().then((result) => {\n this.logger.debug(`Remote config client subscription all mode fetched from remote: ${JSON.stringify(result)}`);\n this.sendCallback(callbackInfo, result, 'remote');\n void this.storage.setConfig(result);\n });\n\n const cachePromise = this.storage.fetchConfig().then((result) => {\n return result;\n });\n\n // Wait for the first result to resolve\n const result = await Promise.race([remotePromise, cachePromise]);\n\n // If cache is fetched first, wait for remote.\n if (result !== undefined) {\n this.logger.debug(`Remote config client subscription all mode fetched from cache: ${JSON.stringify(result)}`);\n // Skip sending callback if cache is empty (first time user).\n if (result.remoteConfig !== null) {\n this.sendCallback(callbackInfo, result, 'cache');\n } else {\n this.logger.debug('Remote config client skips sending callback because cache is empty (first time user).');\n }\n }\n await remotePromise;\n }\n\n /**\n * Waits for a remote response until the given timeout, then return a cached copy, if available.\n */\n async subscribeWaitForRemote(callbackInfo: CallbackInfo, timeout: number) {\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => {\n reject('Timeout exceeded');\n }, timeout);\n });\n\n try {\n const result: RemoteConfigInfo = (await Promise.race([\n this.getOrCreateFetchPromise(),\n timeoutPromise,\n ])) as RemoteConfigInfo;\n\n this.logger.debug('Remote config client subscription wait for remote mode returns from remote.');\n this.sendCallback(callbackInfo, result, 'remote');\n void this.storage.setConfig(result);\n } catch (error) {\n this.logger.debug(\n 'Remote config client subscription wait for remote mode exceeded timeout. Try to fetch from cache.',\n );\n const result = await this.storage.fetchConfig();\n if (result.remoteConfig !== null) {\n this.logger.debug('Remote config client subscription wait for remote mode returns a cached copy.');\n this.sendCallback(callbackInfo, result, 'cache');\n } else {\n this.logger.debug('Remote config client subscription wait for remote mode failed to fetch cache.');\n this.sendCallback(callbackInfo, result, 'remote');\n }\n }\n }\n\n /**\n * Call the callback with filtered remote config based on key.\n * @param remoteConfigInfo - the whole remote config object without filtering by key.\n */\n sendCallback(callbackInfo: CallbackInfo, remoteConfigInfo: RemoteConfigInfo, source: Source) {\n callbackInfo.lastCallback = new Date();\n\n let filteredConfig: RemoteConfig | null;\n if (callbackInfo.key) {\n // Filter remote config by key.\n // For example, if remote config is {a: {b: {c: 1}}},\n // if key = 'a', filter result is {b: {c: 1}};\n // if key = 'a.b', filter result is {c: 1}\n filteredConfig = callbackInfo.key.split('.').reduce((config, key) => {\n if (config === null) {\n return config;\n }\n\n return key in config ? (config[key] as RemoteConfig) : null;\n }, remoteConfigInfo.remoteConfig);\n } else {\n filteredConfig = remoteConfigInfo.remoteConfig;\n }\n\n callbackInfo.callback(filteredConfig, source, remoteConfigInfo.lastFetch);\n }\n\n /**\n * Fetch remote config from remote.\n * @param retries - the number of retries. default is 3.\n * @param timeout - the timeout in milliseconds. Default is 1000.\n * This timeout serves two purposes:\n * 1. It determines how long to wait for each remote config fetch request before aborting it.\n * If the fetch does not complete within the specified timeout, the request is cancelled using AbortController,\n * and the attempt is considered failed (and may be retried if retries remain).\n * 2. It is also used to calculate the interval between retries. The total timeout is divided by the number of retries,\n * so each retry waits for (timeout / retries) milliseconds before the next attempt (linear backoff).\n * @returns the remote config info. null if failed to fetch or the response is not valid JSON.\n */\n async fetch(retries: number = DEFAULT_MAX_RETRIES, timeout: number = DEFAULT_TIMEOUT): Promise<RemoteConfigInfo> {\n const interval = timeout / retries;\n const failedRemoteConfigInfo: RemoteConfigInfo = {\n remoteConfig: null,\n lastFetch: new Date(),\n };\n\n for (let attempt = 0; attempt < retries; attempt++) {\n // Create AbortController for request timeout\n const abortController = new AbortController();\n const timeoutId = setTimeout(() => abortController.abort(), timeout);\n\n try {\n const res = await fetch(this.getUrlParams(), {\n method: 'GET',\n headers: {\n Accept: '*/*',\n },\n signal: abortController.signal,\n });\n\n // Handle unsuccessful fetch\n if (!res.ok) {\n const body = await res.text();\n this.logger.debug(`Remote config client fetch with retry time ${retries} failed with ${res.status}: ${body}`);\n } else {\n // Handle successful fetch\n const remoteConfig: RemoteConfig = (await res.json()) as RemoteConfig;\n return {\n remoteConfig: remoteConfig,\n lastFetch: new Date(),\n };\n }\n } catch (error) {\n // Handle rejects when the request fails, for example, a network error or timeout\n if (error instanceof Error && error.name === 'AbortError') {\n this.logger.debug(`Remote config client fetch with retry time ${retries} timed out after ${timeout}ms`);\n } else {\n this.logger.debug(`Remote config client fetch with retry time ${retries} is rejected because: `, error);\n }\n } finally {\n // Clear the timeout since request completed or failed\n clearTimeout(timeoutId);\n }\n\n // Linear backoff:\n // wait for the specified interval before the next attempt\n // except after the last attempt.\n if (attempt < retries - 1) {\n await new Promise((resolve) => setTimeout(resolve, this.getJitterDelay(interval)));\n }\n }\n\n return failedRemoteConfigInfo;\n }\n\n /**\n * Return jitter in the bound of [0,baseDelay) and then floor round.\n */\n getJitterDelay(baseDelay: number): number {\n return Math.floor(Math.random() * baseDelay);\n }\n\n getUrlParams(): string {\n // URL encode the API key to handle special characters\n const encodedApiKey = encodeURIComponent(this.apiKey);\n\n const urlParams = new URLSearchParams();\n urlParams.append('config_group', RemoteConfigClient.CONFIG_GROUP);\n\n return `${this.serverUrl}/${encodedApiKey}?${urlParams.toString()}`;\n }\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","/**\n * @deprecated use ServerZoneType instead\n */\nexport enum ServerZone {\n US = 'US',\n EU = 'EU',\n /**\n * Add for session-replay-browser migration from analytics-type v1.x.\n */\n STAGING = 'STAGING',\n}\n\nexport type ServerZoneType = 'US' | 'EU';\n","export const OfflineDisabled = null;\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 messenger?: Messenger;\n };\n\n /**\n * Options for integrating background capture features that rely on a Messenger\n * to communicate with an external parent window.\n */\n backgroundCaptureOptions?: {\n enabled?: boolean;\n messenger?: Messenger;\n };\n\n /**\n * This has been deprecated in favor of rage clicks tracking\n * via frustrationInteractions.\n *\n * Setting this will have no effect.\n *\n * @deprecated\n */\n debounceTime?: number;\n\n /**\n * CSS selector allowlist for tracking clicks that result in a DOM change/navigation on elements not already allowed by the cssSelectorAllowlist\n */\n actionClickAllowlist?: string[];\n\n /**\n * Remote config for page actions\n */\n pageActions?: {\n triggers: Trigger[];\n labeledEvents: Record<string, LabeledEvent>;\n };\n\n /**\n * RegExp pattern list to allow custom patterns for text masking\n */\n maskTextRegex?: (RegExp | { pattern: string; description: string })[];\n\n /**\n * Duration in milliseconds an element must be visible before it is considered exposed.\n * Default is 150ms.\n */\n exposureDuration?: number;\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 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 */\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 or custom settings.\n */\n rageClicks?: boolean | RageClickOptions;\n\n /**\n * Configuration for error clicks tracking\n * @experimental this feature is experimental and may not be stable\n */\n errorClicks?: boolean | ErrorClickOptions;\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","type Json = Record<string, any>;\n\nfunction isJsonPrimitive(json?: Json): boolean {\n return (\n typeof json === 'string' ||\n typeof json === 'number' ||\n typeof json === 'boolean' ||\n json === null ||\n json === undefined\n );\n}\n\n/**\n * Prune a JSON object to only include the keys in the allowlist and excludes the keys\n * in the exclude list.\n *\n * This function is a mutative function that will modify the original JSON object.\n * This is done to avoid creating a new JSON object and copying the data.\n *\n * @param json - The JSON object to prune.\n * @param allowlist - The keys to include in the pruned JSON object.\n * @param excludelist - The keys to exclude from the pruned JSON object.\n */\nexport function pruneJson(json: Json | null | undefined, allowlist: string[], excludelist: string[]) {\n if (!json) return;\n // tokenize the allowlist and excludelist\n const allowlistTokens = allowlist.map(tokenizeJsonPath);\n const excludelistTokens = excludelist.map(tokenizeJsonPath);\n\n _pruneJson({\n json,\n allowlist: allowlistTokens,\n excludelist: excludelistTokens,\n ancestors: [],\n });\n}\n\nexport function _pruneJson({\n json,\n targetObject,\n allowlist,\n excludelist,\n ancestors,\n parentObject,\n targetKey,\n}: {\n json: Json;\n targetObject?: Json;\n allowlist: string[][];\n excludelist: string[][];\n ancestors: string[];\n parentObject?: Json;\n targetKey?: string;\n}) {\n if (!targetObject) {\n targetObject = json;\n }\n\n const keys = Object.keys(targetObject);\n for (const key of keys) {\n const path = [...ancestors, key];\n if (isJsonPrimitive(targetObject[key] as Json)) {\n // if the value does not match allowlist or matches exclude list, delete it\n if (!hasPathMatchInList(path, allowlist) || hasPathMatchInList(path, excludelist)) {\n delete targetObject[key];\n }\n } else {\n _pruneJson({\n json,\n targetObject: targetObject[key] as Json,\n allowlist,\n excludelist,\n ancestors: path,\n parentObject: targetObject,\n targetKey: key,\n });\n }\n }\n\n // if this object is empty now, delete the whole object\n if (Object.keys(targetObject).length === 0 && parentObject && targetKey) {\n delete parentObject[targetKey];\n }\n}\n\n/**\n * Tokenize a JSON path string into an array of strings.\n * Escapes ~0 and ~1 to ~ and / respectively.\n *\n * e.g.) turns string \"a/b/c\" into [\"a\", \"b\", \"c\"]\n *\n * @param path - The JSON path to tokenize.\n * @returns The tokenized JSON path.\n */\nexport function tokenizeJsonPath(path: string): string[] {\n if (path.startsWith('/')) {\n path = path.slice(1);\n }\n return path.split('/').map((token) => token.replace(/~0/g, '~').replace(/~1/g, '/'));\n}\n\n/**\n * Check if a JSON path matches a path matcher.\n *\n * Rules:\n * 1. If a key in a path and a matcher are the same, then they match, move to the next\n * 2. If the matcher is a *, then it matches the key, move to the next\n * 3. If the matcher is a **, then it matches >=0 keys\n *\n * @param path - The path to check.\n * @param pathMatcher - The path matcher to check against.\n * @param i - The current index of the path.\n * @param j - The current index of the path matcher.\n * @returns True if the path matches the path matcher, false otherwise.\n */\nexport function isPathMatch(path: string[], pathMatcher: string[], i = 0, j = 0): boolean {\n if (j === pathMatcher.length) {\n return i === path.length;\n }\n\n if (i === path.length) {\n while (j < pathMatcher.length && pathMatcher[j] === '**') {\n j++;\n }\n return j === pathMatcher.length;\n }\n\n const currentMatcher = pathMatcher[j];\n\n if (currentMatcher === '**') {\n if (j + 1 === pathMatcher.length) {\n return true;\n }\n for (let k = i; k <= path.length; k++) {\n if (isPathMatch(path, pathMatcher, k, j + 1)) {\n return true;\n }\n }\n return false;\n } else if (currentMatcher === '*' || currentMatcher === path[i]) {\n return isPathMatch(path, pathMatcher, i + 1, j + 1);\n } else {\n return false;\n }\n}\n\n/**\n * Check if a JSON path matches any of the path matchers in the allow or exclude list.\n *\n * @param path - The JSON path to check.\n * @param allowOrExcludeList - The allow or exclude list to check against.\n * @returns True if the path matches any of the path matchers in the allow or exclude list, false otherwise.\n */\nfunction hasPathMatchInList(path: string[], allowOrExcludeList: string[][]): boolean {\n return allowOrExcludeList.some((l) => isPathMatch(path, l));\n}\n","import { getGlobalScope } from './global-scope';\nimport { pruneJson } from './utils/json-query';\nimport { SAFE_HEADERS, FORBIDDEN_HEADERS } from './';\n\n/* SAFE TYPE DEFINITIONS\n These type definitions expose limited properties of the original types\n to prevent the consumer from mutating them or consuming them.\n*/\ntype BlobSafe = {\n size: number;\n};\n\ntype ArrayBufferSafe = {\n byteLength: number;\n};\n\ntype ArrayBufferViewSafe = {\n byteLength: number;\n};\n\ntype URLSearchParamsSafe = {\n toString(): string;\n};\n\n// no method on readablestream is safe to call\ntype ReadableStreamSafe = Record<string, never>;\n\ntype FormDataEntryValueSafe = string | BlobSafe | null;\n\ntype BodyInitSafe =\n | string\n | Blob\n | ArrayBufferSafe\n | FormDataSafe\n | URLSearchParamsSafe\n | ArrayBufferViewSafe\n | null\n | undefined;\n\ntype HeadersRequestSafe = {\n entries(): IterableIterator<[string, string]>;\n forEach(callbackfn: (value: string, key: string) => void): void;\n};\n\ntype HeadersResponseSafe = {\n get(name: string): string | null;\n forEach(callbackfn: (value: string, key: string) => void): void;\n};\n\ntype HeadersInitSafe = HeadersRequestSafe | Record<string, string> | string[][];\n\ntype ResponseSafe = {\n status: number;\n headers: HeadersResponseSafe | undefined;\n clone(): ResponseCloneSafe;\n};\n\ntype ResponseCloneSafe = {\n text(): Promise<string>;\n};\n\nconst TEXT_READ_TIMEOUT = 500;\n\nexport type RequestInitSafe = {\n method?: string;\n headers?: HeadersInitSafe;\n body?: BodyInitSafe;\n};\nexport interface FormDataSafe {\n entries(): IterableIterator<[string, FormDataEntryValueSafe]>;\n}\nexport type XMLHttpRequestBodyInitSafe = BlobSafe | FormDataSafe | URLSearchParamsSafe | string;\n\nexport type FetchRequestBody =\n | string\n | BlobSafe\n | ArrayBufferSafe\n | FormDataSafe\n | URLSearchParamsSafe\n | ArrayBufferViewSafe\n | null\n | undefined;\n\nexport interface IRequestWrapper {\n /**\n * Get the headers of the request.\n * @param allow - The headers to allow.\n * @returns The pruned headers\n */\n headers(allow?: string[]): Record<string, string> | undefined;\n bodySize?: number;\n method?: string;\n body?: FetchRequestBody | XMLHttpRequestBodyInitSafe | null;\n json: (allow?: string[], exclude?: string[]) => Promise<JsonObject | null>;\n}\n\nexport const MAXIMUM_ENTRIES = 100;\n\n/**\n * This class encapsulates the RequestInit (https://developer.mozilla.org/en-US/docs/Web/API/RequestInit)\n * object so that the consumer can only get access to the headers, method and body size.\n *\n * This is to prevent consumers from directly accessing the Request object\n * and mutating it or running costly operations on it.\n *\n * IMPORTANT:\n * * Do not make changes to this class without careful consideration\n * of performance implications, memory usage and potential to mutate the customer's\n * request.\n * * NEVER .clone() the RequestInit object. This will 2x's the memory overhead of the request\n * * NEVER: call .arrayBuffer(), text(), json() or any other method on the body that\n * consumes the body's stream. This will cause the response to be consumed\n * meaning the body will be empty when the customer tries to access it.\n * (ie: if the body is an instanceof https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream\n * never call any of the methods on it)\n */\nexport class RequestWrapperFetch implements IRequestWrapper {\n private _bodySize: number | undefined;\n constructor(private request: RequestInitSafe) {}\n\n headers(allow: string[] = []): Record<string, string> | undefined {\n const headersUnsafe = this.request.headers;\n\n // copy the headers into a new object\n const headersSafeCopy: Record<string, string> = {};\n if (Array.isArray(headersUnsafe)) {\n headersUnsafe.forEach(([headerName, headerValue]) => {\n headersSafeCopy[headerName] = headerValue;\n });\n } else if (headersUnsafe instanceof Headers) {\n headersUnsafe.forEach((value: string, key: string) => {\n headersSafeCopy[key] = value;\n });\n } else if (typeof headersUnsafe === 'object' && headersUnsafe !== null) {\n for (const [key, value] of Object.entries(headersUnsafe as Record<string, string>)) {\n headersSafeCopy[key] = value;\n }\n }\n\n return pruneHeaders(headersSafeCopy, { allow });\n }\n\n get bodySize(): number | undefined {\n if (typeof this._bodySize === 'number') return this._bodySize;\n const global = getGlobalScope();\n\n /* istanbul ignore if */\n if (!global?.TextEncoder) {\n return;\n }\n const body = this.request.body as FetchRequestBody;\n this._bodySize = getBodySize(body, MAXIMUM_ENTRIES);\n return this._bodySize;\n }\n\n get method(): string | undefined {\n return this.request.method;\n }\n\n get body(): string | null {\n if (typeof this.request.body === 'string') {\n return this.request.body;\n }\n return null;\n }\n\n async json(allow: string[] = [], exclude: string[] = []): Promise<JsonObject | null> {\n if (allow.length === 0) {\n return null;\n }\n const text = this.body;\n return safeParseAndPruneBody(text, allow, exclude);\n }\n}\n\nexport class RequestWrapperXhr implements IRequestWrapper {\n constructor(readonly bodyRaw: XMLHttpRequestBodyInitSafe | null, readonly requestHeaders: Record<string, string>) {}\n\n headers(allow: string[] = []): Record<string, string> | undefined {\n return pruneHeaders(this.requestHeaders, { allow });\n }\n\n get bodySize(): number | undefined {\n return getBodySize(this.bodyRaw as FetchRequestBody, MAXIMUM_ENTRIES);\n }\n\n get body(): string | null {\n if (typeof this.bodyRaw === 'string') {\n return this.bodyRaw;\n }\n return null;\n }\n\n async json(allow: string[] = [], exclude: string[] = []): Promise<JsonObject | null> {\n if (allow.length === 0) {\n return null;\n }\n const text = this.body;\n return safeParseAndPruneBody(text, allow, exclude);\n }\n}\n\nfunction getBodySize(bodyUnsafe: FetchRequestBody, maxEntries: number): number | undefined {\n let bodySize: number | undefined;\n const global = getGlobalScope();\n /* istanbul ignore next */\n const TextEncoder = global?.TextEncoder;\n /* istanbul ignore next */\n if (!TextEncoder) {\n return;\n }\n let bodySafe;\n if (typeof bodyUnsafe === 'string') {\n bodySafe = bodyUnsafe;\n bodySize = new TextEncoder().encode(bodySafe).length;\n } else if (bodyUnsafe instanceof Blob) {\n bodySafe = bodyUnsafe as BlobSafe;\n bodySize = bodySafe.size;\n } else if (bodyUnsafe instanceof URLSearchParams) {\n bodySafe = bodyUnsafe as URLSearchParamsSafe;\n bodySize = new TextEncoder().encode(bodySafe.toString()).length;\n } else if (ArrayBuffer.isView(bodyUnsafe)) {\n bodySafe = bodyUnsafe as ArrayBufferViewSafe;\n bodySize = bodySafe.byteLength;\n } else if (bodyUnsafe instanceof ArrayBuffer) {\n bodySafe = bodyUnsafe as ArrayBufferSafe;\n bodySize = bodySafe.byteLength;\n } else if (bodyUnsafe instanceof FormData) {\n // Estimating only for text parts; not accurate for files\n const formData = bodyUnsafe as unknown as FormDataSafe;\n\n let total = 0;\n let count = 0;\n for (const [key, value] of formData.entries()) {\n total += key.length;\n if (typeof value === 'string') {\n total += new TextEncoder().encode(value).length;\n } else if (value instanceof Blob) {\n total += value.size;\n } else {\n // encountered an unknown type\n // we can't estimate the size of this entry\n return;\n }\n // terminate if we reach the maximum number of entries\n // to avoid performance issues in case of very large FormData\n if (++count >= maxEntries) {\n return;\n }\n }\n bodySize = total;\n } else if (bodyUnsafe instanceof ReadableStream) {\n // If bodyUnsafe is an instanceof ReadableStream, we can't determine the size,\n // without consuming it, so we return undefined.\n // Never ever consume ReadableStream! DO NOT DO IT!!!\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n bodySafe = bodyUnsafe as unknown as ReadableStreamSafe;\n return;\n }\n return bodySize;\n}\n\nexport type JsonObject = {\n [key: string]: JsonValue;\n};\n\nexport type JsonValue = string | number | boolean | null | JsonObject | JsonArray;\n\nexport type JsonArray = Array<JsonValue>;\n\nexport interface IResponseWrapper {\n /**\n * Get the headers of the response.\n * @param allow - The headers to allow.\n * @returns The pruned headers\n */\n headers(allow?: string[]): Record<string, string> | undefined;\n bodySize?: number;\n status?: number;\n body?: string | Blob | ReadableStream | ArrayBuffer | FormDataSafe | URLSearchParams | ArrayBufferView | null;\n json: (allow?: string[], exclude?: string[]) => Promise<JsonObject | null>;\n}\n\n/**\n * This class encapsulates the Fetch API Response object\n * (https://developer.mozilla.org/en-US/docs/Web/API/Response) so that the consumer can\n * only get access to the headers and body size.\n *\n * This is to prevent consumers from directly accessing the Response object\n * and mutating it or running costly operations on it.\n *\n * IMPORTANT:\n * * Do not make changes to this class without careful consideration\n * of performance implications, memory usage and potential to mutate the customer's\n * response.\n * * Do not .clone() the Response object unless you need to access the body.\n * Cloning will 2x the memory overhead of the response.\n * * NEVER consume the body's stream. This will cause the response to be consumed\n * meaning the body will be empty when the customer tries to access it.\n * (ie: if the body is an instanceof https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream\n * never call any of the methods on it)\n */\nexport class ResponseWrapperFetch implements IResponseWrapper {\n private _bodySize: number | undefined;\n private clonedResponse?: ResponseCloneSafe;\n constructor(private response: ResponseSafe) {}\n\n headers(allow: string[] = []): Record<string, string> | undefined {\n if (this.response.headers instanceof Headers) {\n const headersSafe = this.response.headers as HeadersResponseSafe;\n const headersOut: Record<string, string> = {};\n /* istanbul ignore next */\n headersSafe?.forEach?.((value, key) => {\n headersOut[key] = value;\n });\n return pruneHeaders(headersOut, { allow });\n }\n\n return;\n }\n\n get bodySize(): number | undefined {\n if (this._bodySize !== undefined) return this._bodySize;\n /* istanbul ignore next */\n const contentLength = this.response.headers?.get?.('content-length');\n const bodySize = contentLength ? parseInt(contentLength, 10) : undefined;\n this._bodySize = bodySize;\n return bodySize;\n }\n\n get status(): number {\n return this.response.status;\n }\n\n async text(): Promise<string | null> {\n // !!!IMPORTANT: we clone the response to avoid mutating the original response\n // never call .text(), .json(), etc.. on the original response always clone it first\n if (!this.clonedResponse) {\n this.clonedResponse = this.response.clone();\n }\n try {\n const textPromise = this.clonedResponse.text();\n const timer = new Promise<null>((resolve) =>\n setTimeout(\n /* istanbul ignore next */\n () => resolve(null),\n TEXT_READ_TIMEOUT,\n ),\n );\n const text = await Promise.race<string | null>([textPromise, timer]);\n return text;\n } catch (error) {\n return null;\n }\n }\n\n async json(allow: string[] = [], exclude: string[] = []): Promise<JsonObject | null> {\n if (allow.length === 0) {\n return null;\n }\n const text = await this.text();\n return safeParseAndPruneBody(text, allow, exclude);\n }\n}\n\nexport class ResponseWrapperXhr implements IResponseWrapper {\n constructor(\n readonly statusCode: number,\n readonly headersString: string,\n readonly size: number | undefined,\n readonly getJson: () => any | null,\n ) {}\n\n get bodySize(): number | undefined {\n return this.size;\n }\n\n get status(): number {\n return this.statusCode;\n }\n\n headers(allow: string[] = []): Record<string, string> | undefined {\n if (!this.headersString) {\n return {};\n }\n const headers: Record<string, string> = {};\n const headerLines = this.headersString.split('\\r\\n');\n for (const line of headerLines) {\n const [key, value] = line.split(': ');\n if (key && value) {\n headers[key] = value;\n }\n }\n return pruneHeaders(headers, { allow });\n }\n\n async json(allow: string[] = [], exclude: string[] = []): Promise<JsonObject | null> {\n if (allow.length === 0) {\n return null;\n }\n const jsonBody = this.getJson() as JsonObject | null;\n if (jsonBody) {\n pruneJson(jsonBody, allow, exclude);\n return jsonBody;\n }\n return null;\n }\n}\n\nfunction safeParseAndPruneBody(text: string | null, allow: string[], exclude: string[]): JsonObject | null {\n if (!text) return null;\n try {\n const json = JSON.parse(text) as JsonObject;\n pruneJson(json, allow, exclude);\n return json;\n } catch (error) {\n return null;\n }\n}\n\nexport enum PRUNE_STRATEGY {\n REDACT = 'redact',\n REMOVE = 'remove',\n}\n\nconst REDACTED_VALUE = '[REDACTED]';\n\n/**\n * Prune headers from a headers record object.\n * @param headers - The headers to prune.\n * @param options - The options to prune the headers.\n * @param options.exclude - List of headers to delete from headers\n * @param options.include - List of headers to keep in headers, if not provided, all headers are kept by default\n * @returns The pruned headers.\n */\nexport const pruneHeaders = (\n headers: Record<string, string>,\n options: {\n allow?: string[];\n strategy?: PRUNE_STRATEGY;\n },\n): Record<string, string> => {\n const { allow = [], strategy = PRUNE_STRATEGY.REMOVE } = options;\n const exclude = [...FORBIDDEN_HEADERS];\n const headersPruned: Record<string, string> = {};\n\n for (const key of Object.keys(headers)) {\n const lowerKey = key.toLowerCase();\n\n if (exclude.find((e) => e.toLowerCase() === lowerKey)) {\n if (strategy === PRUNE_STRATEGY.REDACT) {\n headersPruned[key] = REDACTED_VALUE;\n }\n } else if (!allow.find((i) => i.toLowerCase() === lowerKey)) {\n if (strategy === PRUNE_STRATEGY.REDACT) {\n headersPruned[key] = REDACTED_VALUE;\n }\n } else {\n headersPruned[key] = headers[key];\n }\n }\n return headersPruned;\n};\nexport class NetworkRequestEvent {\n public requestHeaders?: Record<string, string>;\n public responseHeaders?: Record<string, string>;\n public requestBodyJson?: Promise<JsonObject | null>;\n public responseBodyJson?: Promise<JsonObject | null>;\n constructor(\n public readonly type: 'xhr' | 'fetch',\n public readonly method: string,\n public readonly timestamp: number,\n public readonly startTime: number,\n public readonly url?: string,\n public readonly requestWrapper?: IRequestWrapper,\n public readonly status: number = 0,\n public readonly duration?: number,\n public readonly responseWrapper?: IResponseWrapper,\n public readonly error?: {\n name: string;\n message: string;\n },\n public readonly endTime?: number,\n ) {}\n\n toSerializable(): Record<string, any> {\n const serialized: Record<string, any> = {\n type: this.type,\n method: this.method,\n url: this.url,\n timestamp: this.timestamp,\n status: this.status,\n duration: this.duration,\n error: this.error,\n startTime: this.startTime,\n endTime: this.endTime,\n requestHeaders: this.requestWrapper?.headers([...SAFE_HEADERS]),\n requestBodySize: this.requestWrapper?.bodySize,\n responseHeaders: this.responseWrapper?.headers([...SAFE_HEADERS]),\n responseBodySize: this.responseWrapper?.bodySize,\n };\n\n return Object.fromEntries(Object.entries(serialized).filter(([_, v]) => v !== undefined));\n }\n}\n","import { getGlobalScope } from '..';\nimport { UUID } from '../utils/uuid';\nimport { ILogger } from '../logger';\nimport {\n IRequestWrapper,\n NetworkRequestEvent,\n RequestWrapperFetch,\n ResponseWrapperFetch,\n RequestWrapperXhr,\n ResponseWrapperXhr,\n IResponseWrapper,\n RequestInitSafe,\n XMLHttpRequestBodyInitSafe,\n} from '../network-request-event';\n\n// object that is added to each XHR instance so\n// that info can be set in xhr.open and retrieved in xhr.send\ntype AmplitudeAnalyticsEvent = {\n method: string;\n url: string | URL;\n startTime: number;\n durationStart: number;\n status?: number;\n headers: Record<string, string>;\n};\n\n/**\n * Typeguard function checks if an input is a Request object.\n */\nfunction isRequest(requestInfo: any): requestInfo is Request {\n return typeof requestInfo === 'object' && requestInfo !== null && 'url' in requestInfo && 'method' in requestInfo;\n}\n\nexport type NetworkEventCallbackFn = (event: NetworkRequestEvent) => void;\n\nexport class NetworkEventCallback {\n constructor(public readonly callback: (event: NetworkRequestEvent) => void, public readonly id: string = UUID()) {}\n}\n\ntype RequestUrlAndMethod = {\n url: string | URL | undefined;\n method: string | undefined;\n};\n\n// A narrowed down [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) type\n// that only includes the properties we need to access and adds the $$AmplitudeAnalyticsEvent property\n// Use great care when modifying this type, make sure you only use read-only properties and only add\n// what you need to access, nothing more.\ntype AmplitudeXMLHttpRequestSafe = {\n $$AmplitudeAnalyticsEvent: AmplitudeAnalyticsEvent;\n status: number;\n responseText: string;\n responseType: XMLHttpRequestResponseType;\n getAllResponseHeaders: typeof XMLHttpRequest.prototype.getAllResponseHeaders;\n getResponseHeader: typeof XMLHttpRequest.prototype.getResponseHeader;\n addEventListener: (type: 'loadend', listener: () => void) => void;\n};\n\nexport class NetworkObserver {\n private eventCallbacks: Map<string, NetworkEventCallback> = new Map();\n // eslint-disable-next-line no-restricted-globals\n private globalScope?: typeof globalThis;\n private logger?: ILogger;\n private isObserving = false;\n constructor(logger?: ILogger) {\n this.logger = logger;\n const globalScope = getGlobalScope();\n if (!NetworkObserver.isSupported()) {\n /* istanbul ignore next */\n return;\n }\n this.globalScope = globalScope;\n }\n\n static isSupported(): boolean {\n const globalScope = getGlobalScope();\n return !!globalScope && !!globalScope.fetch;\n }\n\n subscribe(eventCallback: NetworkEventCallback, logger?: ILogger) {\n if (!this.logger) {\n this.logger = logger;\n }\n this.eventCallbacks.set(eventCallback.id, eventCallback);\n if (!this.isObserving) {\n /* istanbul ignore next */\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalXhrOpen = this.globalScope?.XMLHttpRequest?.prototype?.open;\n /* istanbul ignore next */\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalXhrSend = this.globalScope?.XMLHttpRequest?.prototype?.send;\n /* istanbul ignore next */\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalXhrSetRequestHeader = this.globalScope?.XMLHttpRequest?.prototype?.setRequestHeader;\n if (originalXhrOpen && originalXhrSend && originalXhrSetRequestHeader) {\n this.observeXhr(originalXhrOpen, originalXhrSend, originalXhrSetRequestHeader);\n }\n\n /* istanbul ignore next */\n const originalFetch = this.globalScope?.fetch;\n /* istanbul ignore next */\n if (originalFetch) {\n this.observeFetch(originalFetch);\n }\n\n /* istanbul ignore next */\n this.isObserving = true;\n }\n }\n\n unsubscribe(eventCallback: NetworkEventCallback) {\n this.eventCallbacks.delete(eventCallback.id);\n }\n\n protected triggerEventCallbacks(event: NetworkRequestEvent) {\n this.eventCallbacks.forEach((callback) => {\n try {\n callback.callback(event);\n } catch (err) {\n // if the callback throws an error, we should catch it\n // to avoid breaking the fetch promise chain\n /* istanbul ignore next */\n this.logger?.debug('an unexpected error occurred while triggering event callbacks', err);\n }\n });\n }\n\n handleNetworkRequestEvent(\n requestType: 'fetch' | 'xhr',\n requestInfo: RequestInfo | URL | RequestUrlAndMethod | undefined,\n requestWrapper: IRequestWrapper | undefined,\n responseWrapper: IResponseWrapper | undefined,\n typedError: Error | undefined,\n startTime?: number,\n durationStart?: number,\n ) {\n /* istanbul ignore next */\n if (startTime === undefined || durationStart === undefined) {\n // if we reach this point, it means that the performance API is not supported\n // so we can't construct a NetworkRequestEvent\n return;\n }\n\n // parse the URL and Method\n let url: string | undefined;\n let method = 'GET';\n if (isRequest(requestInfo)) {\n url = requestInfo['url'];\n method = requestInfo['method'];\n } else {\n url = requestInfo?.toString?.();\n }\n\n // strip basic auth from the URL\n if (url) {\n try {\n const parsedUrl = new URL(url);\n // reconstruct the URL without the basic auth\n url = `${parsedUrl.protocol}//${parsedUrl.host}${parsedUrl.pathname}${parsedUrl.search}${parsedUrl.hash}`;\n // eslint-disable-next-line no-empty\n } catch (err) {}\n }\n method = requestWrapper?.method || method;\n\n let status, error;\n if (responseWrapper) {\n status = responseWrapper.status;\n }\n\n if (typedError) {\n error = {\n name: typedError.name || 'UnknownError',\n message: typedError.message || 'An unknown error occurred',\n };\n status = 0;\n }\n\n const duration = Math.floor(performance.now() - durationStart);\n const endTime = Math.floor(startTime + duration);\n\n const requestEvent = new NetworkRequestEvent(\n requestType,\n method,\n startTime, // timestamp and startTime are aliases\n startTime,\n url,\n requestWrapper,\n status,\n duration,\n responseWrapper,\n error,\n endTime,\n );\n\n this.triggerEventCallbacks(requestEvent);\n }\n\n private getTimestamps() {\n /* istanbul ignore next */\n return {\n startTime: Date.now?.(),\n durationStart: performance?.now?.(),\n };\n }\n\n private observeFetch(\n originalFetch: (requestInfo: RequestInfo | URL, requestInit?: RequestInit) => Promise<Response>,\n ) {\n /* istanbul ignore next */\n if (!this.globalScope || !originalFetch) {\n return;\n }\n /**\n * IMPORTANT: This overrides window.fetch in browsers.\n * You probably never need to make changes to this function.\n * If you do, please be careful to preserve the original functionality of fetch\n * and make sure another developer who is an expert reviews this change throughly\n */\n this.globalScope.fetch = async (requestInfo?: RequestInfo | URL, requestInit?: RequestInit) => {\n // 1: capture the start time and duration start time before the fetch call\n let timestamps;\n try {\n timestamps = this.getTimestamps();\n } catch (error) {\n /* istanbul ignore next */\n this.logger?.debug('an unexpected error occurred while retrieving timestamps', error);\n }\n\n // 2. make the call to the original fetch and preserve the response or error\n let originalResponse, originalError;\n try {\n originalResponse = await originalFetch(requestInfo as RequestInfo | URL, requestInit);\n } catch (err) {\n // Capture error information\n originalError = err;\n }\n\n // 3. call the handler after the fetch call is done\n try {\n this.handleNetworkRequestEvent(\n 'fetch',\n requestInfo,\n requestInit ? new RequestWrapperFetch(requestInit as RequestInitSafe) : undefined,\n originalResponse ? new ResponseWrapperFetch(originalResponse) : undefined,\n originalError as Error,\n /* istanbul ignore next */\n timestamps?.startTime,\n /* istanbul ignore next */\n timestamps?.durationStart,\n );\n } catch (err) {\n // this catch shouldn't be reachable, but keep it here for safety\n // because we're overriding the fetch function and better to be safe than sorry\n /* istanbul ignore next */\n this.logger?.debug('an unexpected error occurred while handling fetch', err);\n }\n\n // 4. return the original response or throw the original error\n if (originalResponse) {\n // if the response is not undefined, return it\n return originalResponse;\n } else {\n throw originalError;\n }\n };\n }\n\n /**\n * Creates a function that parses the response of an XMLHttpRequest as JSON.\n *\n * Returns function instead of JSON object to avoid unnecessary parsing if the\n * body is not being captured.\n *\n * @param xhrSafe - The XMLHttpRequest object.\n * @param context - The NetworkObserver instance.\n * @returns A function that parses the response of an XMLHttpRequest as JSON.\n */\n static createXhrJsonParser(xhrUnsafe: XMLHttpRequest, context: NetworkObserver) {\n return () => {\n try {\n if (xhrUnsafe.responseType === 'json') {\n // if response is a JS object, clone it so that subscribers can't mutate it\n if (context.globalScope?.structuredClone) {\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-return */\n return context.globalScope.structuredClone(xhrUnsafe.response);\n }\n } else if (['text', ''].includes(xhrUnsafe.responseType)) {\n // if response is a string, parse it as JSON\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-return */\n return JSON.parse(xhrUnsafe.responseText);\n }\n } catch (err) {\n /* istanbul ignore if */\n if (err instanceof Error && err.name === 'InvalidStateError') {\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseText#exceptions\n // if we reach here, it means we don't handle responseType correctly\n context.logger?.error(\n `unexpected error when retrieving responseText. responseType='${xhrUnsafe.responseType}'`,\n );\n }\n // the other possible error is Json Parse error which we fail silently\n return null;\n }\n return null;\n };\n }\n\n private observeXhr(\n originalXhrOpen:\n | ((\n method: string,\n url: string | URL,\n async?: boolean,\n username?: string | null,\n password?: string | null,\n ) => void)\n | undefined,\n originalXhrSend: ((body?: Document | XMLHttpRequestBodyInit | null) => void) | undefined,\n originalXhrSetRequestHeader: (headerName: string, headerValue: string) => void,\n ) {\n /* istanbul ignore next */\n if (!this.globalScope || !originalXhrOpen || !originalXhrSend) {\n return;\n }\n\n const xhrProto = this.globalScope.XMLHttpRequest.prototype;\n\n const networkObserverContext = this as NetworkObserver;\n\n /**\n * IMPORTANT: This overrides window.XMLHttpRequest.prototype.open\n * You probably never need to make changes to this function.\n * If you do, please be careful to preserve the original functionality of xhr.open\n * and make sure another developer who is an expert reviews this change throughly\n */\n xhrProto.open = function (...args: any[]) {\n const xhrSafe = this as unknown as AmplitudeXMLHttpRequestSafe;\n const [method, url] = args as [string, string | URL];\n try {\n /* istanbul ignore next */\n xhrSafe.$$AmplitudeAnalyticsEvent = {\n method,\n url: url?.toString?.(),\n headers: {},\n ...networkObserverContext.getTimestamps(),\n } as AmplitudeAnalyticsEvent;\n } catch (err) {\n /* istanbul ignore next */\n networkObserverContext.logger?.error('an unexpected error occurred while calling xhr open', err);\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return originalXhrOpen.apply(xhrSafe, args as any);\n };\n\n /**\n * IMPORTANT: This overrides window.XMLHttpRequest.prototype.send\n * You probably never need to make changes to this function.\n * If you do, please be careful to preserve the original functionality of xhr.send\n * and make sure another developer who is an expert reviews this change throughly\n */\n // allow \"any\" type for args to reflect how it's used in the browser\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */\n xhrProto.send = function (...args: any[]) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhrUnsafe = this;\n const xhrSafe = xhrUnsafe as unknown as AmplitudeXMLHttpRequestSafe;\n const getJson = NetworkObserver.createXhrJsonParser(xhrUnsafe, networkObserverContext);\n const body = args[0] as XMLHttpRequestBodyInitSafe;\n const requestEvent = xhrSafe.$$AmplitudeAnalyticsEvent;\n\n xhrSafe.addEventListener('loadend', function () {\n try {\n const responseHeaders = xhrSafe.getAllResponseHeaders();\n const responseBodySize = xhrSafe.getResponseHeader('content-length');\n\n const responseWrapper = new ResponseWrapperXhr(\n xhrSafe.status,\n responseHeaders,\n /* istanbul ignore next */\n responseBodySize ? parseInt(responseBodySize, 10) : undefined,\n getJson,\n );\n const requestHeaders = xhrSafe.$$AmplitudeAnalyticsEvent.headers;\n const requestWrapper = new RequestWrapperXhr(body, requestHeaders);\n requestEvent.status = xhrSafe.status;\n networkObserverContext.handleNetworkRequestEvent(\n 'xhr',\n { url: requestEvent.url, method: requestEvent.method },\n requestWrapper,\n responseWrapper,\n undefined,\n requestEvent.startTime,\n requestEvent.durationStart,\n );\n } catch (err) {\n /* istanbul ignore next */\n networkObserverContext.logger?.error('an unexpected error occurred while handling xhr send', err);\n }\n });\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */\n return originalXhrSend.apply(xhrSafe, args as any);\n };\n\n /**\n * IMPORTANT: This overrides window.XMLHttpRequest.prototype.setRequestHeader\n * You probably never need to make changes to this function.\n * If you do, please be careful to preserve the original functionality of xhr.setRequestHeader\n * and make sure another developer who is an expert reviews this change throughly\n */\n // allow \"any\" type for args to reflect how it's used in the browser\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */\n xhrProto.setRequestHeader = function (headerName: any, headerValue: any) {\n const xhrSafe = this as unknown as AmplitudeXMLHttpRequestSafe;\n try {\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-assignment */\n xhrSafe.$$AmplitudeAnalyticsEvent.headers[headerName as string] = headerValue as string;\n } catch (err) {\n /* istanbul ignore next */\n networkObserverContext.logger?.error('an unexpected error occurred while calling xhr setRequestHeader', err);\n }\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */\n originalXhrSetRequestHeader.apply(xhrSafe, [headerName, headerValue]);\n };\n }\n}\n\n// singleton instance of NetworkObserver\nexport const networkObserver = new NetworkObserver();\n","import { getQueryParams } from '../query-params';\nimport {\n UTM_CAMPAIGN,\n UTM_CONTENT,\n UTM_MEDIUM,\n UTM_SOURCE,\n UTM_TERM,\n GCLID,\n FBCLID,\n BASE_CAMPAIGN,\n DCLID,\n MSCLKID,\n RDT_CID,\n TWCLID,\n TTCLID,\n KO_CLICK_ID,\n LI_FAT_ID,\n GBRAID,\n WBRAID,\n UTM_ID,\n} from '../types/constants';\nimport { Campaign, ICampaignParser, ClickIdParameters, ReferrerParameters, UTMParameters } from '../types/campaign';\n\nexport class CampaignParser implements ICampaignParser {\n async parse(): Promise<Campaign> {\n return {\n ...BASE_CAMPAIGN,\n ...this.getUtmParam(),\n ...this.getReferrer(),\n ...this.getClickIds(),\n } as Campaign;\n }\n\n getUtmParam(): UTMParameters {\n const params = getQueryParams();\n\n const utmCampaign = params[UTM_CAMPAIGN];\n const utmContent = params[UTM_CONTENT];\n const utmId = params[UTM_ID];\n const utmMedium = params[UTM_MEDIUM];\n const utmSource = params[UTM_SOURCE];\n const utmTerm = params[UTM_TERM];\n\n return {\n utm_campaign: utmCampaign,\n utm_content: utmContent,\n utm_id: utmId,\n utm_medium: utmMedium,\n utm_source: utmSource,\n utm_term: utmTerm,\n };\n }\n\n getReferrer(): ReferrerParameters {\n const data: ReferrerParameters = {\n referrer: undefined,\n referring_domain: undefined,\n };\n try {\n data.referrer = document.referrer || undefined;\n data.referring_domain = data.referrer?.split('/')[2] ?? undefined;\n } catch {\n // nothing to track\n }\n return data;\n }\n\n getClickIds(): ClickIdParameters {\n const params = getQueryParams();\n return {\n [DCLID]: params[DCLID],\n [FBCLID]: params[FBCLID],\n [GBRAID]: params[GBRAID],\n [GCLID]: params[GCLID],\n [KO_CLICK_ID]: params[KO_CLICK_ID],\n [LI_FAT_ID]: params[LI_FAT_ID],\n [MSCLKID]: params[MSCLKID],\n [RDT_CID]: params[RDT_CID],\n [TTCLID]: params[TTCLID],\n [TWCLID]: params[TWCLID],\n [WBRAID]: params[WBRAID],\n };\n }\n}\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","function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n// === Symbol Support ===\nvar hasSymbols = function () {\n return typeof Symbol === 'function';\n};\n\nvar hasSymbol = function (name) {\n return hasSymbols() && Boolean(Symbol[name]);\n};\n\nvar getSymbol = function (name) {\n return hasSymbol(name) ? Symbol[name] : '@@' + name;\n};\n\nif (hasSymbols() && !hasSymbol('observable')) {\n Symbol.observable = Symbol('observable');\n}\n\nvar SymbolIterator = getSymbol('iterator');\nvar SymbolObservable = getSymbol('observable');\nvar SymbolSpecies = getSymbol('species'); // === Abstract Operations ===\n\nfunction getMethod(obj, key) {\n var value = obj[key];\n if (value == null) return undefined;\n if (typeof value !== 'function') throw new TypeError(value + ' is not a function');\n return value;\n}\n\nfunction getSpecies(obj) {\n var ctor = obj.constructor;\n\n if (ctor !== undefined) {\n ctor = ctor[SymbolSpecies];\n\n if (ctor === null) {\n ctor = undefined;\n }\n }\n\n return ctor !== undefined ? ctor : Observable;\n}\n\nfunction isObservable(x) {\n return x instanceof Observable; // SPEC: Brand check\n}\n\nfunction hostReportError(e) {\n if (hostReportError.log) {\n hostReportError.log(e);\n } else {\n setTimeout(function () {\n throw e;\n });\n }\n}\n\nfunction enqueue(fn) {\n Promise.resolve().then(function () {\n try {\n fn();\n } catch (e) {\n hostReportError(e);\n }\n });\n}\n\nfunction cleanupSubscription(subscription) {\n var cleanup = subscription._cleanup;\n if (cleanup === undefined) return;\n subscription._cleanup = undefined;\n\n if (!cleanup) {\n return;\n }\n\n try {\n if (typeof cleanup === 'function') {\n cleanup();\n } else {\n var unsubscribe = getMethod(cleanup, 'unsubscribe');\n\n if (unsubscribe) {\n unsubscribe.call(cleanup);\n }\n }\n } catch (e) {\n hostReportError(e);\n }\n}\n\nfunction closeSubscription(subscription) {\n subscription._observer = undefined;\n subscription._queue = undefined;\n subscription._state = 'closed';\n}\n\nfunction flushSubscription(subscription) {\n var queue = subscription._queue;\n\n if (!queue) {\n return;\n }\n\n subscription._queue = undefined;\n subscription._state = 'ready';\n\n for (var i = 0; i < queue.length; ++i) {\n notifySubscription(subscription, queue[i].type, queue[i].value);\n if (subscription._state === 'closed') break;\n }\n}\n\nfunction notifySubscription(subscription, type, value) {\n subscription._state = 'running';\n var observer = subscription._observer;\n\n try {\n var m = getMethod(observer, type);\n\n switch (type) {\n case 'next':\n if (m) m.call(observer, value);\n break;\n\n case 'error':\n closeSubscription(subscription);\n if (m) m.call(observer, value);else throw value;\n break;\n\n case 'complete':\n closeSubscription(subscription);\n if (m) m.call(observer);\n break;\n }\n } catch (e) {\n hostReportError(e);\n }\n\n if (subscription._state === 'closed') cleanupSubscription(subscription);else if (subscription._state === 'running') subscription._state = 'ready';\n}\n\nfunction onNotify(subscription, type, value) {\n if (subscription._state === 'closed') return;\n\n if (subscription._state === 'buffering') {\n subscription._queue.push({\n type: type,\n value: value\n });\n\n return;\n }\n\n if (subscription._state !== 'ready') {\n subscription._state = 'buffering';\n subscription._queue = [{\n type: type,\n value: value\n }];\n enqueue(function () {\n return flushSubscription(subscription);\n });\n return;\n }\n\n notifySubscription(subscription, type, value);\n}\n\nvar Subscription = /*#__PURE__*/function () {\n function Subscription(observer, subscriber) {\n // ASSERT: observer is an object\n // ASSERT: subscriber is callable\n this._cleanup = undefined;\n this._observer = observer;\n this._queue = undefined;\n this._state = 'initializing';\n var subscriptionObserver = new SubscriptionObserver(this);\n\n try {\n this._cleanup = subscriber.call(undefined, subscriptionObserver);\n } catch (e) {\n subscriptionObserver.error(e);\n }\n\n if (this._state === 'initializing') this._state = 'ready';\n }\n\n var _proto = Subscription.prototype;\n\n _proto.unsubscribe = function unsubscribe() {\n if (this._state !== 'closed') {\n closeSubscription(this);\n cleanupSubscription(this);\n }\n };\n\n _createClass(Subscription, [{\n key: \"closed\",\n get: function () {\n return this._state === 'closed';\n }\n }]);\n\n return Subscription;\n}();\n\nvar SubscriptionObserver = /*#__PURE__*/function () {\n function SubscriptionObserver(subscription) {\n this._subscription = subscription;\n }\n\n var _proto2 = SubscriptionObserver.prototype;\n\n _proto2.next = function next(value) {\n onNotify(this._subscription, 'next', value);\n };\n\n _proto2.error = function error(value) {\n onNotify(this._subscription, 'error', value);\n };\n\n _proto2.complete = function complete() {\n onNotify(this._subscription, 'complete');\n };\n\n _createClass(SubscriptionObserver, [{\n key: \"closed\",\n get: function () {\n return this._subscription._state === 'closed';\n }\n }]);\n\n return SubscriptionObserver;\n}();\n\nvar Observable = /*#__PURE__*/function () {\n function Observable(subscriber) {\n if (!(this instanceof Observable)) throw new TypeError('Observable cannot be called as a function');\n if (typeof subscriber !== 'function') throw new TypeError('Observable initializer must be a function');\n this._subscriber = subscriber;\n }\n\n var _proto3 = Observable.prototype;\n\n _proto3.subscribe = function subscribe(observer) {\n if (typeof observer !== 'object' || observer === null) {\n observer = {\n next: observer,\n error: arguments[1],\n complete: arguments[2]\n };\n }\n\n return new Subscription(observer, this._subscriber);\n };\n\n _proto3.forEach = function forEach(fn) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (typeof fn !== 'function') {\n reject(new TypeError(fn + ' is not a function'));\n return;\n }\n\n function done() {\n subscription.unsubscribe();\n resolve();\n }\n\n var subscription = _this.subscribe({\n next: function (value) {\n try {\n fn(value, done);\n } catch (e) {\n reject(e);\n subscription.unsubscribe();\n }\n },\n error: reject,\n complete: resolve\n });\n });\n };\n\n _proto3.map = function map(fn) {\n var _this2 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n return new C(function (observer) {\n return _this2.subscribe({\n next: function (value) {\n try {\n value = fn(value);\n } catch (e) {\n return observer.error(e);\n }\n\n observer.next(value);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n observer.complete();\n }\n });\n });\n };\n\n _proto3.filter = function filter(fn) {\n var _this3 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n return new C(function (observer) {\n return _this3.subscribe({\n next: function (value) {\n try {\n if (!fn(value)) return;\n } catch (e) {\n return observer.error(e);\n }\n\n observer.next(value);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n observer.complete();\n }\n });\n });\n };\n\n _proto3.reduce = function reduce(fn) {\n var _this4 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n var hasSeed = arguments.length > 1;\n var hasValue = false;\n var seed = arguments[1];\n var acc = seed;\n return new C(function (observer) {\n return _this4.subscribe({\n next: function (value) {\n var first = !hasValue;\n hasValue = true;\n\n if (!first || hasSeed) {\n try {\n acc = fn(acc, value);\n } catch (e) {\n return observer.error(e);\n }\n } else {\n acc = value;\n }\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n if (!hasValue && !hasSeed) return observer.error(new TypeError('Cannot reduce an empty sequence'));\n observer.next(acc);\n observer.complete();\n }\n });\n });\n };\n\n _proto3.concat = function concat() {\n var _this5 = this;\n\n for (var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++) {\n sources[_key] = arguments[_key];\n }\n\n var C = getSpecies(this);\n return new C(function (observer) {\n var subscription;\n var index = 0;\n\n function startNext(next) {\n subscription = next.subscribe({\n next: function (v) {\n observer.next(v);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n if (index === sources.length) {\n subscription = undefined;\n observer.complete();\n } else {\n startNext(C.from(sources[index++]));\n }\n }\n });\n }\n\n startNext(_this5);\n return function () {\n if (subscription) {\n subscription.unsubscribe();\n subscription = undefined;\n }\n };\n });\n };\n\n _proto3.flatMap = function flatMap(fn) {\n var _this6 = this;\n\n if (typeof fn !== 'function') throw new TypeError(fn + ' is not a function');\n var C = getSpecies(this);\n return new C(function (observer) {\n var subscriptions = [];\n\n var outer = _this6.subscribe({\n next: function (value) {\n if (fn) {\n try {\n value = fn(value);\n } catch (e) {\n return observer.error(e);\n }\n }\n\n var inner = C.from(value).subscribe({\n next: function (value) {\n observer.next(value);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n var i = subscriptions.indexOf(inner);\n if (i >= 0) subscriptions.splice(i, 1);\n completeIfDone();\n }\n });\n subscriptions.push(inner);\n },\n error: function (e) {\n observer.error(e);\n },\n complete: function () {\n completeIfDone();\n }\n });\n\n function completeIfDone() {\n if (outer.closed && subscriptions.length === 0) observer.complete();\n }\n\n return function () {\n subscriptions.forEach(function (s) {\n return s.unsubscribe();\n });\n outer.unsubscribe();\n };\n });\n };\n\n _proto3[SymbolObservable] = function () {\n return this;\n };\n\n Observable.from = function from(x) {\n var C = typeof this === 'function' ? this : Observable;\n if (x == null) throw new TypeError(x + ' is not an object');\n var method = getMethod(x, SymbolObservable);\n\n if (method) {\n var observable = method.call(x);\n if (Object(observable) !== observable) throw new TypeError(observable + ' is not an object');\n if (isObservable(observable) && observable.constructor === C) return observable;\n return new C(function (observer) {\n return observable.subscribe(observer);\n });\n }\n\n if (hasSymbol('iterator')) {\n method = getMethod(x, SymbolIterator);\n\n if (method) {\n return new C(function (observer) {\n enqueue(function () {\n if (observer.closed) return;\n\n for (var _iterator = _createForOfIteratorHelperLoose(method.call(x)), _step; !(_step = _iterator()).done;) {\n var item = _step.value;\n observer.next(item);\n if (observer.closed) return;\n }\n\n observer.complete();\n });\n });\n }\n }\n\n if (Array.isArray(x)) {\n return new C(function (observer) {\n enqueue(function () {\n if (observer.closed) return;\n\n for (var i = 0; i < x.length; ++i) {\n observer.next(x[i]);\n if (observer.closed) return;\n }\n\n observer.complete();\n });\n });\n }\n\n throw new TypeError(x + ' is not observable');\n };\n\n Observable.of = function of() {\n for (var _len2 = arguments.length, items = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n items[_key2] = arguments[_key2];\n }\n\n var C = typeof this === 'function' ? this : Observable;\n return new C(function (observer) {\n enqueue(function () {\n if (observer.closed) return;\n\n for (var i = 0; i < items.length; ++i) {\n observer.next(items[i]);\n if (observer.closed) return;\n }\n\n observer.complete();\n });\n });\n };\n\n _createClass(Observable, null, [{\n key: SymbolSpecies,\n get: function () {\n return this;\n }\n }]);\n\n return Observable;\n}();\n\nif (hasSymbols()) {\n Object.defineProperty(Observable, Symbol('extensions'), {\n value: {\n symbol: SymbolObservable,\n hostReportError: hostReportError\n },\n configurable: true\n });\n}\n\nexport { Observable };\n","export { Observable } from 'zen-observable-ts';\n\nimport { Observable as ZenObservable, Observer, Subscription } from 'zen-observable-ts';\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\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) => {\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) {\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) => {\n observers.add(observer);\n\n if (subscription === null) {\n subscription = source.subscribe({\n next(value) {\n for (const obs of observers) {\n /* istanbul ignore next */\n obs.next?.(value);\n }\n },\n error(err) {\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","import {\n PageTrackingHistoryChanges,\n PageTrackingOptions,\n PageTrackingTrackOn,\n ElementInteractionsOptions,\n FormInteractionsOptions,\n BrowserOptions,\n AutocaptureOptions,\n AttributionOptions,\n NetworkTrackingOptions,\n FrustrationInteractionsOptions,\n} from '@amplitude/analytics-core';\n\n/**\n * A subset of AutocaptureOptions that includes the autocapture features that\n * are made available to users by default (even if \"config.autocapture === undefined\")\n */\ntype AutocaptureOptionsDefaultAvailable = Pick<\n AutocaptureOptions,\n 'pageViews' | 'sessions' | 'fileDownloads' | 'formInteractions' | 'attribution' | 'pageUrlEnrichment'\n>;\n\n/**\n * Returns false if autocapture === false or if autocapture[event],\n * otherwise returns true (even if \"config.autocapture === undefined\")\n */\nconst isTrackingEnabled = (\n autocapture: AutocaptureOptionsDefaultAvailable | boolean | undefined,\n event: keyof AutocaptureOptionsDefaultAvailable,\n) => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (autocapture?.[event] === false) {\n return false;\n }\n\n return true;\n};\n\nexport const isAttributionTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'attribution');\n\nexport const isFileDownloadTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'fileDownloads');\n\nexport const isFormInteractionTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'formInteractions');\n\nexport const isPageViewTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'pageViews');\n\nexport const isSessionTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'sessions');\n\nexport const isPageUrlEnrichmentEnabled = (autocapture: AutocaptureOptions | boolean | undefined) =>\n isTrackingEnabled(autocapture, 'pageUrlEnrichment');\n\n/**\n * Returns true if\n * 1. if autocapture.networkTracking === true\n * 2. if autocapture.networkTracking === object\n * otherwise returns false\n */\nexport const isNetworkTrackingEnabled = (autocapture: AutocaptureOptions | boolean | undefined) => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (\n typeof autocapture === 'object' &&\n (autocapture.networkTracking === true || typeof autocapture.networkTracking === 'object')\n ) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if\n * 1. autocapture === true\n * 2. if autocapture.elementInteractions === true\n * 3. if autocapture.elementInteractions === object\n * otherwise returns false\n */\nexport const isElementInteractionsEnabled = (autocapture: AutocaptureOptions | boolean | undefined): boolean => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (\n typeof autocapture === 'object' &&\n (autocapture.elementInteractions === true || typeof autocapture.elementInteractions === 'object')\n ) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if\n * 1. autocapture === true\n * 2. if autocapture.webVitals === true\n * otherwise returns false\n */\nexport const isWebVitalsEnabled = (autocapture: AutocaptureOptions | boolean | undefined): boolean => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (typeof autocapture === 'object' && autocapture.webVitals === true) {\n return true;\n }\n\n return false;\n};\n\nexport const isFrustrationInteractionsEnabled = (autocapture: AutocaptureOptions | boolean | undefined): boolean => {\n if (typeof autocapture === 'boolean') {\n return autocapture;\n }\n\n if (\n typeof autocapture === 'object' &&\n (autocapture.frustrationInteractions === true || typeof autocapture.frustrationInteractions === 'object')\n ) {\n return true;\n }\n\n return false;\n};\n\nexport const getElementInteractionsConfig = (config: BrowserOptions): ElementInteractionsOptions | undefined => {\n if (\n isElementInteractionsEnabled(config.autocapture) &&\n typeof config.autocapture === 'object' &&\n typeof config.autocapture.elementInteractions === 'object'\n ) {\n return config.autocapture.elementInteractions;\n }\n return undefined;\n};\n\nexport const getFrustrationInteractionsConfig = (\n config: BrowserOptions,\n): FrustrationInteractionsOptions | undefined => {\n if (\n isFrustrationInteractionsEnabled(config.autocapture) &&\n typeof config.autocapture === 'object' &&\n typeof config.autocapture.frustrationInteractions === 'object'\n ) {\n return config.autocapture.frustrationInteractions;\n }\n return undefined;\n};\n\nexport const getNetworkTrackingConfig = (config: BrowserOptions): NetworkTrackingOptions | undefined => {\n if (isNetworkTrackingEnabled(config.autocapture)) {\n let networkTrackingConfig;\n if (typeof config.autocapture === 'object' && typeof config.autocapture.networkTracking === 'object') {\n networkTrackingConfig = config.autocapture.networkTracking;\n } else if (config.networkTrackingOptions) {\n networkTrackingConfig = config.networkTrackingOptions;\n }\n return {\n ...networkTrackingConfig,\n captureRules: networkTrackingConfig?.captureRules?.map((rule) => {\n // if URLs and hosts are both set, URLs take precedence over hosts\n if (rule.urls?.length && rule.hosts?.length) {\n const hostsString = JSON.stringify(rule.hosts);\n const urlsString = JSON.stringify(rule.urls);\n /* istanbul ignore next */\n config.loggerProvider?.warn(\n `Found network capture rule with both urls='${urlsString}' and hosts='${hostsString}' set. ` +\n `Definition of urls takes precedence over hosts, so ignoring hosts.`,\n );\n return { ...rule, hosts: undefined };\n }\n return rule;\n }),\n };\n }\n return;\n};\n\nexport const getPageViewTrackingConfig = (config: BrowserOptions): PageTrackingOptions => {\n let trackOn: PageTrackingTrackOn | undefined = () => false;\n let trackHistoryChanges: PageTrackingHistoryChanges | undefined = undefined;\n let eventType: string | undefined;\n const pageCounter = config.pageCounter;\n\n const isDefaultPageViewTrackingEnabled = isPageViewTrackingEnabled(config.defaultTracking);\n if (isDefaultPageViewTrackingEnabled) {\n trackOn = undefined;\n eventType = undefined;\n\n if (\n config.defaultTracking &&\n typeof config.defaultTracking === 'object' &&\n config.defaultTracking.pageViews &&\n typeof config.defaultTracking.pageViews === 'object'\n ) {\n if ('trackOn' in config.defaultTracking.pageViews) {\n trackOn = config.defaultTracking.pageViews.trackOn;\n }\n\n if ('trackHistoryChanges' in config.defaultTracking.pageViews) {\n trackHistoryChanges = config.defaultTracking.pageViews.trackHistoryChanges;\n }\n\n if ('eventType' in config.defaultTracking.pageViews && config.defaultTracking.pageViews.eventType) {\n eventType = config.defaultTracking.pageViews.eventType;\n }\n }\n }\n\n return {\n trackOn,\n trackHistoryChanges,\n eventType,\n pageCounter,\n };\n};\n\nexport const getAttributionTrackingConfig = (config: BrowserOptions): AttributionOptions => {\n if (\n isAttributionTrackingEnabled(config.defaultTracking) &&\n config.defaultTracking &&\n typeof config.defaultTracking === 'object' &&\n config.defaultTracking.attribution &&\n typeof config.defaultTracking.attribution === 'object'\n ) {\n return {\n ...config.defaultTracking.attribution,\n };\n }\n\n return {};\n};\n\nexport const getFormInteractionsConfig = (config: BrowserOptions): FormInteractionsOptions | undefined => {\n if (\n isFormInteractionTrackingEnabled(config.defaultTracking) &&\n config.defaultTracking &&\n typeof config.defaultTracking === 'object' &&\n typeof config.defaultTracking.formInteractions === 'object'\n ) {\n return config.defaultTracking.formInteractions;\n }\n return undefined;\n};\n","import { Result, AmplitudeReturn } from '@amplitude/analytics-core';\n\ninterface ProxyItem {\n name: string;\n args: any[];\n resolve?: (promise: Promise<Result>) => void;\n}\n\ntype QueueProxy = Array<ProxyItem>;\n\ninterface InstanceProxy {\n _q: QueueProxy;\n _iq: Record<string, InstanceProxy>;\n}\n\n/**\n * Applies the proxied functions on the proxied amplitude snippet to an instance of the real object.\n * @ignore\n */\nexport const runQueuedFunctions = (instance: object, queue: QueueProxy) => {\n convertProxyObjectToRealObject(instance, queue);\n};\n\n/**\n * Applies the proxied functions on the proxied object to an instance of the real object.\n * Used to convert proxied Identify and Revenue objects.\n */\nexport const convertProxyObjectToRealObject = <T>(instance: T, queue: QueueProxy): T => {\n for (let i = 0; i < queue.length; i++) {\n const { name, args, resolve } = queue[i];\n const fn = instance && instance[name as keyof T];\n if (typeof fn === 'function') {\n const result = fn.apply(instance, args) as AmplitudeReturn<Result>;\n if (typeof resolve === 'function') {\n resolve(result?.promise);\n }\n }\n }\n return instance;\n};\n\n/**\n * Check if the param is snippet proxy\n */\nexport const isInstanceProxy = (instance: unknown): instance is InstanceProxy => {\n const instanceProxy = instance as InstanceProxy;\n return instanceProxy && instanceProxy._q !== undefined;\n};\n","export const VERSION = '2.34.1-feat-zoning-alpha.0';\n","export const LIBPREFIX = 'amplitude-ts-sdk-script';\n","import { UUID, getLanguage, Event, BeforePlugin, BrowserConfig } from '@amplitude/analytics-core';\nimport { VERSION } from '../version';\nimport { LIBPREFIX } from '../lib-prefix';\n\nconst BROWSER_PLATFORM = 'Web';\nconst IP_ADDRESS = '$remote';\nexport class Context implements BeforePlugin {\n name = '@amplitude/plugin-context-browser';\n type = 'before' as const;\n\n // this.config is defined in setup() which will always be called first\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n config: BrowserConfig;\n userAgent: string | undefined;\n library = `${LIBPREFIX}/${VERSION}`;\n\n constructor() {\n /* istanbul ignore else */\n if (typeof navigator !== 'undefined') {\n this.userAgent = navigator.userAgent;\n }\n }\n\n setup(config: BrowserConfig): Promise<undefined> {\n this.config = config;\n\n return Promise.resolve(undefined);\n }\n\n async execute(context: Event): Promise<Event> {\n const time = new Date().getTime();\n const lastEventId = this.config.lastEventId ?? -1;\n const nextEventId = context.event_id ?? lastEventId + 1;\n this.config.lastEventId = nextEventId;\n if (!context.time) {\n this.config.lastEventTime = time;\n }\n\n const event: Event = {\n user_id: this.config.userId,\n device_id: this.config.deviceId,\n session_id: this.config.sessionId,\n time,\n ...(this.config.appVersion && { app_version: this.config.appVersion }),\n ...(this.config.trackingOptions.platform && { platform: BROWSER_PLATFORM }),\n ...(this.config.trackingOptions.language && { language: getLanguage() }),\n ...(this.config.trackingOptions.ipAddress && { ip: IP_ADDRESS }),\n insert_id: UUID(),\n partner_id: this.config.partnerId,\n plan: this.config.plan,\n ...(this.config.ingestionMetadata && {\n ingestion_metadata: {\n source_name: this.config.ingestionMetadata.sourceName,\n source_version: this.config.ingestionMetadata.sourceVersion,\n },\n }),\n ...context,\n event_id: nextEventId,\n library: this.library,\n user_agent: this.userAgent,\n };\n return event;\n }\n}\n","import { getGlobalScope, ILogger, BrowserStorage } from '@amplitude/analytics-core';\n\nconst MAX_ARRAY_LENGTH = 1000;\n\ninterface LocalStorageOptions {\n loggerProvider?: ILogger;\n}\nexport class LocalStorage<T> extends BrowserStorage<T> {\n loggerProvider?: ILogger;\n\n constructor(config?: LocalStorageOptions) {\n let localStorage;\n\n try {\n localStorage = getGlobalScope()?.localStorage;\n } catch (e) {\n config?.loggerProvider?.debug(`Failed to access localStorage. error=${JSON.stringify(e)}`);\n localStorage = undefined;\n }\n super(localStorage);\n this.loggerProvider = config?.loggerProvider;\n }\n\n async set(key: string, value: T): Promise<void> {\n if (Array.isArray(value) && value.length > MAX_ARRAY_LENGTH) {\n const droppedEventsCount = value.length - MAX_ARRAY_LENGTH;\n await super.set(key, value.slice(0, MAX_ARRAY_LENGTH) as T);\n this.loggerProvider?.error(\n `Failed to save ${droppedEventsCount} events because the queue length exceeded ${MAX_ARRAY_LENGTH}.`,\n );\n } else {\n await super.set(key, value);\n }\n }\n}\n","import { getGlobalScope, BrowserStorage } from '@amplitude/analytics-core';\n\nexport class SessionStorage<T> extends BrowserStorage<T> {\n constructor() {\n super(getGlobalScope()?.sessionStorage);\n }\n}\n","import { BaseTransport, Payload, Response, Transport } from '@amplitude/analytics-core';\n\nexport class XHRTransport extends BaseTransport implements Transport {\n private state = {\n done: 4,\n };\n private customHeaders: Record<string, string>;\n\n constructor(customHeaders: Record<string, string> = {}) {\n super();\n this.customHeaders = customHeaders;\n }\n\n async send(serverUrl: string, payload: Payload): Promise<Response | null> {\n return new Promise((resolve, reject) => {\n /* istanbul ignore if */\n if (typeof XMLHttpRequest === 'undefined') {\n reject(new Error('XHRTransport is not supported.'));\n }\n\n const xhr = new XMLHttpRequest();\n xhr.open('POST', serverUrl, true);\n xhr.onreadystatechange = () => {\n if (xhr.readyState === this.state.done) {\n const responseText = xhr.responseText;\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n resolve(this.buildResponse(JSON.parse(responseText)));\n } catch {\n resolve(this.buildResponse({ code: xhr.status }));\n }\n }\n };\n // Merge headers: custom headers override defaults (consistent with FetchTransport)\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n ...this.customHeaders,\n };\n for (const [key, value] of Object.entries(headers)) {\n xhr.setRequestHeader(key, value);\n }\n xhr.send(JSON.stringify(payload));\n });\n }\n}\n","import { BaseTransport, getGlobalScope, Payload, Response, Transport } from '@amplitude/analytics-core';\n\nexport class SendBeaconTransport extends BaseTransport implements Transport {\n async send(serverUrl: string, payload: Payload): Promise<Response | null> {\n return new Promise((resolve, reject) => {\n const globalScope = getGlobalScope();\n /* istanbul ignore if */\n if (!globalScope?.navigator.sendBeacon) {\n throw new Error('SendBeaconTransport is not supported');\n }\n try {\n const data = JSON.stringify(payload);\n const success = globalScope.navigator.sendBeacon(serverUrl, JSON.stringify(payload));\n if (success) {\n return resolve(\n this.buildResponse({\n code: 200,\n events_ingested: payload.events.length,\n payload_size_bytes: data.length,\n server_upload_time: Date.now(),\n }),\n );\n }\n return resolve(this.buildResponse({ code: 500 }));\n } catch (e) {\n reject(e);\n }\n });\n }\n}\n","import { getOldCookieName, Storage, UserSession } from '@amplitude/analytics-core';\n\nexport const parseLegacyCookies = async (\n apiKey: string,\n cookieStorage: Storage<UserSession>,\n deleteLegacyCookies = true,\n): Promise<UserSession> => {\n const cookieName = getOldCookieName(apiKey);\n const cookies = await cookieStorage.getRaw(cookieName);\n if (!cookies) {\n return {\n optOut: false,\n };\n }\n if (deleteLegacyCookies) {\n await cookieStorage.remove(cookieName);\n }\n const [deviceId, userId, optOut, sessionId, lastEventTime, lastEventId] = cookies.split('.');\n return {\n deviceId,\n userId: decode(userId),\n sessionId: parseTime(sessionId),\n lastEventId: parseTime(lastEventId),\n lastEventTime: parseTime(lastEventTime),\n optOut: Boolean(optOut),\n };\n};\n\nexport const parseTime = (num: string) => {\n const integer = parseInt(num, 32);\n if (isNaN(integer)) {\n return undefined;\n }\n return integer;\n};\n\nexport const decode = (value?: string): string | undefined => {\n if (!atob || !escape || !value) {\n return undefined;\n }\n try {\n return decodeURIComponent(escape(atob(value)));\n } catch {\n return undefined;\n }\n};\n","import { IdentityStorageType, ServerZoneType } from '@amplitude/analytics-core';\n\nexport const DEFAULT_EVENT_PREFIX = '[Amplitude]';\n\nexport const DEFAULT_PAGE_VIEW_EVENT = `${DEFAULT_EVENT_PREFIX} Page Viewed`;\nexport const DEFAULT_FORM_START_EVENT = `${DEFAULT_EVENT_PREFIX} Form Started`;\nexport const DEFAULT_FORM_SUBMIT_EVENT = `${DEFAULT_EVENT_PREFIX} Form Submitted`;\nexport const DEFAULT_FILE_DOWNLOAD_EVENT = `${DEFAULT_EVENT_PREFIX} File Downloaded`;\nexport const DEFAULT_SESSION_START_EVENT = 'session_start';\nexport const DEFAULT_SESSION_END_EVENT = 'session_end';\n\nexport const FILE_EXTENSION = `${DEFAULT_EVENT_PREFIX} File Extension`;\nexport const FILE_NAME = `${DEFAULT_EVENT_PREFIX} File Name`;\nexport const LINK_ID = `${DEFAULT_EVENT_PREFIX} Link ID`;\nexport const LINK_TEXT = `${DEFAULT_EVENT_PREFIX} Link Text`;\nexport const LINK_URL = `${DEFAULT_EVENT_PREFIX} Link URL`;\n\nexport const FORM_ID = `${DEFAULT_EVENT_PREFIX} Form ID`;\nexport const FORM_NAME = `${DEFAULT_EVENT_PREFIX} Form Name`;\nexport const FORM_DESTINATION = `${DEFAULT_EVENT_PREFIX} Form Destination`;\n\nexport const DEFAULT_IDENTITY_STORAGE: IdentityStorageType = 'cookie';\nexport const DEFAULT_SERVER_ZONE: ServerZoneType = 'US';\n","import {\n Config,\n Logger,\n ILogger,\n LogLevel,\n Event,\n Storage,\n IngestionMetadata,\n ServerZoneType,\n OfflineDisabled,\n Plan,\n IdentityStorageType,\n TransportTypeOrOptions,\n MemoryStorage,\n UUID,\n CookieStorage,\n getCookieName,\n FetchTransport,\n getQueryParams,\n UserSession,\n BrowserOptions,\n BrowserConfig as IBrowserConfig,\n DefaultTrackingOptions,\n TrackingOptions,\n AutocaptureOptions,\n CookieOptions,\n RemoteConfigOptions,\n NetworkTrackingOptions,\n IIdentify,\n IDiagnosticsClient,\n isDomainEqual,\n CookieStorageConfig,\n decodeCookieValue,\n} from '@amplitude/analytics-core';\n\nimport { LocalStorage } from './storage/local-storage';\nimport { SessionStorage } from './storage/session-storage';\nimport { XHRTransport } from './transports/xhr';\nimport { SendBeaconTransport } from './transports/send-beacon';\nimport { parseLegacyCookies } from './cookie-migration';\nimport { DEFAULT_IDENTITY_STORAGE, DEFAULT_SERVER_ZONE } from './constants';\nimport { AmplitudeBrowser } from './browser-client';\nimport { VERSION } from './version';\n\n// Exported for testing purposes only. Do not expose to public interface.\nexport class BrowserConfig extends Config implements IBrowserConfig {\n public readonly version = VERSION;\n protected _cookieStorage: Storage<UserSession>;\n protected _deviceId?: string;\n protected _lastEventId?: number;\n protected _lastEventTime?: number;\n protected _optOut = false;\n protected _sessionId?: number;\n protected _userId?: string;\n protected _pageCounter?: number;\n protected _debugLogsEnabled?: boolean;\n constructor(\n public apiKey: string,\n public appVersion?: string,\n cookieStorage: Storage<UserSession> = new MemoryStorage(),\n public cookieOptions: CookieOptions = {\n domain: '',\n expiration: 365,\n sameSite: 'Lax' as const,\n secure: false,\n upgrade: true,\n },\n public defaultTracking?: boolean | DefaultTrackingOptions,\n public autocapture?: boolean | AutocaptureOptions,\n deviceId?: string,\n public flushIntervalMillis: number = 1000,\n public flushMaxRetries: number = 5,\n public flushQueueSize: number = 30,\n public identityStorage: IdentityStorageType = DEFAULT_IDENTITY_STORAGE,\n public ingestionMetadata?: IngestionMetadata,\n public instanceName?: string,\n lastEventId?: number,\n lastEventTime?: number,\n public loggerProvider: ILogger = new Logger(),\n public logLevel: LogLevel = LogLevel.Warn,\n public minIdLength?: number,\n public offline: boolean | typeof OfflineDisabled = false,\n optOut = false,\n public partnerId?: string,\n public plan?: Plan,\n public serverUrl: string = '',\n public serverZone: ServerZoneType = DEFAULT_SERVER_ZONE,\n sessionId?: number,\n public sessionTimeout: number = 30 * 60 * 1000,\n public storageProvider: Storage<Event[]> = new LocalStorage({ loggerProvider }),\n public trackingOptions: Required<TrackingOptions> = {\n ipAddress: true,\n language: true,\n platform: true,\n },\n public transport: TransportTypeOrOptions = 'fetch',\n public useBatch: boolean = false,\n public fetchRemoteConfig: boolean = true,\n userId?: string,\n pageCounter?: number,\n debugLogsEnabled?: boolean,\n public networkTrackingOptions?: NetworkTrackingOptions,\n public identify?: IIdentify,\n public enableDiagnostics: boolean = true,\n public diagnosticsSampleRate: number = 0,\n public diagnosticsClient?: IDiagnosticsClient,\n public remoteConfig?: RemoteConfigOptions,\n ) {\n super({ apiKey, storageProvider, transportProvider: createTransport(transport) });\n this._cookieStorage = cookieStorage;\n this.deviceId = deviceId;\n this.lastEventId = lastEventId;\n this.lastEventTime = lastEventTime;\n this.optOut = optOut;\n this.sessionId = sessionId;\n this.pageCounter = pageCounter;\n this.userId = userId;\n this.debugLogsEnabled = debugLogsEnabled;\n this.loggerProvider.enable(debugLogsEnabled ? LogLevel.Debug : this.logLevel);\n this.networkTrackingOptions = networkTrackingOptions;\n this.identify = identify;\n this.enableDiagnostics = enableDiagnostics;\n this.diagnosticsSampleRate = diagnosticsSampleRate;\n this.diagnosticsClient = diagnosticsClient;\n\n // Note: The canonical logic for determining fetchRemoteConfig is in shouldFetchRemoteConfig().\n // This logic is duplicated here to maintain the BrowserConfig constructor contract and ensure\n // the config object has the correct fetchRemoteConfig value set on its properties.\n // The value passed to this constructor should already be computed via shouldFetchRemoteConfig().\n const _fetchRemoteConfig = remoteConfig?.fetchRemoteConfig ?? fetchRemoteConfig;\n this.remoteConfig = this.remoteConfig || {};\n this.remoteConfig.fetchRemoteConfig = _fetchRemoteConfig;\n this.fetchRemoteConfig = _fetchRemoteConfig;\n }\n\n get cookieStorage() {\n return this._cookieStorage;\n }\n\n set cookieStorage(cookieStorage: Storage<UserSession>) {\n if (this._cookieStorage !== cookieStorage) {\n this._cookieStorage = cookieStorage;\n this.updateStorage();\n }\n }\n\n get deviceId() {\n return this._deviceId;\n }\n\n set deviceId(deviceId: string | undefined) {\n if (this._deviceId !== deviceId) {\n this._deviceId = deviceId;\n this.updateStorage();\n }\n }\n\n get userId() {\n return this._userId;\n }\n\n set userId(userId: string | undefined) {\n if (this._userId !== userId) {\n this._userId = userId;\n this.updateStorage();\n }\n }\n\n get sessionId() {\n return this._sessionId;\n }\n\n set sessionId(sessionId: number | undefined) {\n if (this._sessionId !== sessionId) {\n this._sessionId = sessionId;\n this.updateStorage();\n }\n }\n\n get optOut() {\n return this._optOut;\n }\n\n set optOut(optOut: boolean) {\n if (this._optOut !== optOut) {\n this._optOut = optOut;\n this.updateStorage();\n }\n }\n\n get lastEventTime() {\n return this._lastEventTime;\n }\n\n set lastEventTime(lastEventTime: number | undefined) {\n if (this._lastEventTime !== lastEventTime) {\n this._lastEventTime = lastEventTime;\n this.updateStorage();\n }\n }\n\n get lastEventId() {\n return this._lastEventId;\n }\n\n set lastEventId(lastEventId: number | undefined) {\n if (this._lastEventId !== lastEventId) {\n this._lastEventId = lastEventId;\n this.updateStorage();\n }\n }\n\n get pageCounter() {\n return this._pageCounter;\n }\n\n set pageCounter(pageCounter: number | undefined) {\n if (this._pageCounter !== pageCounter) {\n this._pageCounter = pageCounter;\n this.updateStorage();\n }\n }\n\n set debugLogsEnabled(debugLogsEnabled: boolean | undefined) {\n if (this._debugLogsEnabled !== debugLogsEnabled) {\n this._debugLogsEnabled = debugLogsEnabled;\n this.updateStorage();\n }\n }\n\n private updateStorage() {\n const cache = {\n deviceId: this._deviceId,\n userId: this._userId,\n sessionId: this._sessionId,\n optOut: this._optOut,\n lastEventTime: this._lastEventTime,\n lastEventId: this._lastEventId,\n pageCounter: this._pageCounter,\n debugLogsEnabled: this._debugLogsEnabled,\n cookieDomain: undefined as string | undefined,\n };\n\n if (this.cookieStorage instanceof CookieStorage) {\n cache.cookieDomain = this.cookieStorage.options.domain;\n }\n\n void this.cookieStorage.set(getCookieName(this.apiKey), cache);\n }\n}\n\n/**\n * Early-initialized configuration values that are determined before useBrowserConfig is called.\n * These are created early to support DiagnosticsClient and RemoteConfigClient initialization.\n */\nexport interface EarlyConfig {\n /** Logger instance - shared across DiagnosticsClient, RemoteConfigClient, and BrowserConfig */\n loggerProvider: ILogger;\n /** Server zone for API endpoints */\n serverZone: ServerZoneType;\n /** Whether diagnostics is enabled (may come from remote config) */\n enableDiagnostics: boolean;\n /** Diagnostics sample rate (may come from remote config) */\n diagnosticsSampleRate: number;\n}\n\nexport const useBrowserConfig = async (\n apiKey: string,\n options: BrowserOptions = {},\n amplitudeInstance: AmplitudeBrowser,\n diagnosticsClient?: IDiagnosticsClient,\n earlyConfig?: EarlyConfig,\n): Promise<IBrowserConfig> => {\n // Step 1: Create identity storage instance\n const identityStorage = options.identityStorage || DEFAULT_IDENTITY_STORAGE;\n const cookieOptions = {\n domain:\n identityStorage !== DEFAULT_IDENTITY_STORAGE ? '' : options.cookieOptions?.domain ?? (await getTopLevelDomain()),\n expiration: 365,\n sameSite: 'Lax' as const,\n secure: false,\n upgrade: true,\n ...options.cookieOptions,\n };\n\n const cookieConfig: CookieStorageConfig = {\n // if more than one cookie with the same key exists,\n // look for the cookie that has the domain attribute set to cookieOptions.domain\n duplicateResolverFn: (value: string): boolean => {\n const decodedValue = decodeCookieValue(value);\n if (!decodedValue) {\n return false;\n }\n const parsed = JSON.parse(decodedValue) as UserSession;\n return isDomainEqual(parsed.cookieDomain, cookieOptions.domain);\n },\n diagnosticsClient: diagnosticsClient,\n };\n const cookieStorage = createCookieStorage<UserSession>(options.identityStorage, cookieOptions, cookieConfig);\n\n // Step 1: Parse cookies using identity storage instance\n const legacyCookies = await parseLegacyCookies(apiKey, cookieStorage, options.cookieOptions?.upgrade ?? true);\n const previousCookies = await cookieStorage.get(getCookieName(apiKey));\n const queryParams = getQueryParams();\n\n // Check if ampTimestamp is present and valid\n const ampTimestamp = queryParams.ampTimestamp ? Number(queryParams.ampTimestamp) : undefined;\n const isWithinTimeLimit = ampTimestamp ? Date.now() < ampTimestamp : true;\n\n // Step 3: Reconcile user identity\n const deviceId =\n options.deviceId ??\n (isWithinTimeLimit ? queryParams.ampDeviceId ?? queryParams.deviceId : undefined) ??\n previousCookies?.deviceId ??\n legacyCookies.deviceId ??\n UUID();\n const lastEventId = previousCookies?.lastEventId ?? legacyCookies.lastEventId;\n const lastEventTime = previousCookies?.lastEventTime ?? legacyCookies.lastEventTime;\n const optOut = options.optOut ?? previousCookies?.optOut ?? legacyCookies.optOut;\n const sessionId = previousCookies?.sessionId ?? legacyCookies.sessionId;\n const userId = options.userId ?? previousCookies?.userId ?? legacyCookies.userId;\n amplitudeInstance.previousSessionDeviceId = previousCookies?.deviceId ?? legacyCookies.deviceId;\n amplitudeInstance.previousSessionUserId = previousCookies?.userId ?? legacyCookies.userId;\n\n const trackingOptions = {\n ipAddress: options.trackingOptions?.ipAddress ?? true,\n language: options.trackingOptions?.language ?? true,\n platform: options.trackingOptions?.platform ?? true,\n };\n const pageCounter = previousCookies?.pageCounter;\n const debugLogsEnabled = previousCookies?.debugLogsEnabled;\n\n // Override default tracking options if autocapture is set\n if (options.autocapture !== undefined) {\n options.defaultTracking = options.autocapture;\n }\n\n const browserConfig = new BrowserConfig(\n apiKey,\n options.appVersion,\n cookieStorage,\n cookieOptions,\n options.defaultTracking,\n options.autocapture,\n deviceId,\n options.flushIntervalMillis,\n options.flushMaxRetries,\n options.flushQueueSize,\n identityStorage,\n options.ingestionMetadata,\n options.instanceName,\n lastEventId,\n lastEventTime,\n // Use earlyConfig.loggerProvider to ensure consistent logger across DiagnosticsClient/RemoteConfigClient/BrowserConfig\n earlyConfig?.loggerProvider ?? options.loggerProvider,\n options.logLevel,\n options.minIdLength,\n options.offline,\n optOut,\n options.partnerId,\n options.plan,\n options.serverUrl,\n // Use earlyConfig.serverZone to ensure consistent serverZone\n earlyConfig?.serverZone ?? options.serverZone,\n sessionId,\n options.sessionTimeout,\n options.storageProvider,\n trackingOptions,\n options.transport,\n options.useBatch,\n options.fetchRemoteConfig,\n userId,\n pageCounter,\n debugLogsEnabled,\n options.networkTrackingOptions,\n options.identify,\n // Use earlyConfig values (already has remote config applied), otherwise fall back to options\n earlyConfig?.enableDiagnostics ?? options.enableDiagnostics,\n earlyConfig?.diagnosticsSampleRate ?? amplitudeInstance._diagnosticsSampleRate,\n diagnosticsClient,\n options.remoteConfig,\n );\n\n if (!(await browserConfig.storageProvider.isEnabled())) {\n browserConfig.loggerProvider.warn(\n `Storage provider ${browserConfig.storageProvider.constructor.name} is not enabled. Falling back to MemoryStorage.`,\n );\n browserConfig.storageProvider = new MemoryStorage();\n }\n\n return browserConfig;\n};\n\nexport const createCookieStorage = <T>(\n identityStorage: IdentityStorageType = DEFAULT_IDENTITY_STORAGE,\n cookieOptions: CookieOptions = {},\n cookieConfig?: CookieStorageConfig,\n) => {\n switch (identityStorage) {\n case 'localStorage':\n return new LocalStorage<T>();\n case 'sessionStorage':\n return new SessionStorage<T>();\n case 'none':\n return new MemoryStorage<T>();\n case 'cookie':\n default:\n return new CookieStorage<T>(\n {\n ...cookieOptions,\n expirationDays: cookieOptions.expiration,\n },\n cookieConfig,\n );\n }\n};\n\n/**\n * Determines whether to fetch remote config based on options.\n * Extracted to allow early determination before useBrowserConfig is called.\n */\nexport const shouldFetchRemoteConfig = (options: BrowserOptions = {}): boolean => {\n if (options.remoteConfig?.fetchRemoteConfig === true) {\n // set to true if remoteConfig explicitly set to true\n return true;\n } else if (options.remoteConfig?.fetchRemoteConfig === false || options.fetchRemoteConfig === false) {\n // set to false if either are set to false explicitly\n return false;\n } else {\n // default to true if both undefined\n return true;\n }\n};\n\nexport const createTransport = (transport?: TransportTypeOrOptions) => {\n const type = typeof transport === 'object' ? transport.type : transport;\n const headers = typeof transport === 'object' ? transport.headers : undefined;\n\n if (type === 'xhr') {\n return new XHRTransport(headers);\n }\n if (type === 'beacon') {\n // SendBeacon does not support custom headers\n return new SendBeaconTransport();\n }\n return new FetchTransport(headers);\n};\n\nexport const getTopLevelDomain = async (url?: string) => {\n if (\n !(await new CookieStorage<number>().isEnabled()) ||\n (!url && (typeof location === 'undefined' || !location.hostname))\n ) {\n return '';\n }\n\n const host = url ?? location.hostname;\n const parts = host.split('.');\n const levels = [];\n const cookieKeyUniqueId = UUID();\n const storageKey = `AMP_TLDTEST_${cookieKeyUniqueId.substring(0, 8)}`;\n\n for (let i = parts.length - 2; i >= 0; --i) {\n levels.push(parts.slice(i).join('.'));\n }\n for (let i = 0; i < levels.length; i++) {\n const domain = levels[i];\n const options = {\n domain: '.' + domain,\n expirationDays: 0.003, // expire in ~5 minutes\n };\n const storage = new CookieStorage<number>(options);\n await storage.set(storageKey, 1);\n const value = await storage.get(storageKey);\n if (value) {\n await storage.remove(storageKey);\n return '.' + domain;\n }\n }\n\n return '';\n};\n","export const omitUndefined = (input: Record<string, string | undefined>) => {\n const obj: Record<string, string> = {};\n for (const key in input) {\n const val = input[key];\n if (val) {\n obj[key] = val;\n }\n }\n return obj;\n};\n","import {\n getPageTitle,\n replaceSensitiveString,\n BrowserConfig,\n BrowserClient,\n EnrichmentPlugin,\n Event,\n IdentifyOperation,\n IdentifyUserProperties,\n ILogger,\n CampaignParser,\n getGlobalScope,\n BASE_CAMPAIGN,\n BrowserStorage,\n UUID,\n} from '@amplitude/analytics-core';\nimport { CreatePageViewTrackingPlugin, Options } from './typings/page-view-tracking';\nimport { omitUndefined } from './utils';\n\nexport const defaultPageViewEvent = '[Amplitude] Page Viewed';\nexport const PAGE_VIEW_SESSION_STORAGE_KEY = 'AMP_PAGE_VIEW';\n\ntype PageViewSessionStorage = {\n pageViewId: string;\n};\n\nexport const pageViewTrackingPlugin: CreatePageViewTrackingPlugin = (options: Options = {}) => {\n let amplitude: BrowserClient | undefined;\n const globalScope = getGlobalScope();\n let loggerProvider: ILogger | undefined = undefined;\n let isTracking = false;\n let localConfig: BrowserConfig;\n let sessionStorage: BrowserStorage<PageViewSessionStorage> | undefined;\n const { trackOn, trackHistoryChanges, eventType = defaultPageViewEvent } = options;\n\n const getDecodeURI = (locationStr: string): 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\n const createPageViewEvent = async (pageViewId: string | undefined): Promise<Event> => {\n /* istanbul ignore next */\n const locationHREF = getDecodeURI((typeof location !== 'undefined' && location.href) || '');\n return {\n event_type: eventType,\n event_properties: {\n ...(await getCampaignParams()),\n '[Amplitude] Page Domain':\n /* istanbul ignore next */ (typeof location !== 'undefined' && location.hostname) || '',\n '[Amplitude] Page Location': locationHREF,\n '[Amplitude] Page Path':\n /* istanbul ignore next */ (typeof location !== 'undefined' && getDecodeURI(location.pathname)) || '',\n '[Amplitude] Page Title': /* istanbul ignore next */ getPageTitle(replaceSensitiveString),\n '[Amplitude] Page URL': locationHREF.split('?')[0],\n '[Amplitude] Page View ID': pageViewId,\n },\n };\n };\n\n const shouldTrackOnPageLoad = () => typeof trackOn === 'undefined' || (typeof trackOn === 'function' && trackOn());\n\n /* istanbul ignore next */\n let previousURL: string | null = typeof location !== 'undefined' ? location.href : null;\n\n const trackHistoryPageView = async (): Promise<void> => {\n const newURL = location.href;\n const shouldTrackPageView =\n shouldTrackHistoryPageView(trackHistoryChanges, newURL, previousURL || '') && shouldTrackOnPageLoad();\n // Note: Update `previousURL` in the same clock tick as `shouldTrackHistoryPageView()`\n // This was previously done after `amplitude?.track(await createPageViewEvent());` and\n // causes a concurrency issue where app triggers `pushState` twice with the same URL target\n // but `previousURL` is only updated after the second `pushState` producing two page viewed events\n previousURL = newURL;\n\n if (shouldTrackPageView) {\n // Generate new page view id and set it in session storage\n let pageViewId: string | undefined;\n if (sessionStorage) {\n pageViewId = UUID();\n void sessionStorage.set(PAGE_VIEW_SESSION_STORAGE_KEY, { pageViewId });\n }\n\n /* istanbul ignore next */\n loggerProvider?.log('Tracking page view event');\n amplitude?.track(await createPageViewEvent(pageViewId));\n }\n };\n\n /* istanbul ignore next */\n const handlePageChange = () => {\n void trackHistoryPageView();\n };\n\n const plugin: EnrichmentPlugin = {\n name: '@amplitude/plugin-page-view-tracking-browser',\n type: 'enrichment',\n\n setup: async (config: BrowserConfig, client: BrowserClient) => {\n amplitude = client;\n localConfig = config;\n\n loggerProvider = config.loggerProvider;\n loggerProvider.log('Installing @amplitude/plugin-page-view-tracking-browser');\n\n isTracking = true;\n if (globalScope) {\n // init session storage\n sessionStorage = new BrowserStorage<PageViewSessionStorage>(globalScope.sessionStorage);\n\n globalScope.addEventListener('popstate', handlePageChange);\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 globalScope.history.pushState = new Proxy(globalScope.history.pushState, {\n apply: (target, thisArg, [state, unused, url]) => {\n target.apply(thisArg, [state, unused, url]);\n if (isTracking) {\n handlePageChange();\n }\n },\n });\n }\n\n if (shouldTrackOnPageLoad()) {\n loggerProvider.log('Tracking page view event');\n // Generate new page view id and set it in session storage\n let pageViewId: string | undefined;\n\n if (sessionStorage) {\n pageViewId = UUID();\n void sessionStorage.set(PAGE_VIEW_SESSION_STORAGE_KEY, { pageViewId });\n }\n\n amplitude.track(await createPageViewEvent(pageViewId));\n }\n },\n\n execute: async (event: Event) => {\n if (trackOn === 'attribution' && isCampaignEvent(event)) {\n /* istanbul ignore next */ // loggerProvider should be defined by the time execute is invoked\n loggerProvider?.log('Enriching campaign event to page view event with campaign parameters');\n // Retrieve current page view id from session storage\n let pageViewId: string | undefined;\n if (sessionStorage) {\n const pageViewSession = await sessionStorage.get(PAGE_VIEW_SESSION_STORAGE_KEY);\n pageViewId = pageViewSession?.pageViewId;\n }\n\n const pageViewEvent = await createPageViewEvent(pageViewId);\n event.event_type = pageViewEvent.event_type;\n event.event_properties = {\n ...event.event_properties,\n ...pageViewEvent.event_properties,\n };\n }\n\n // Update the pageCounter for the page view event\n if (localConfig && event.event_type === eventType) {\n localConfig.pageCounter = !localConfig.pageCounter ? 1 : localConfig.pageCounter + 1;\n event.event_properties = {\n ...event.event_properties,\n '[Amplitude] Page Counter': localConfig.pageCounter,\n };\n }\n return event;\n },\n\n teardown: async () => {\n if (globalScope) {\n globalScope.removeEventListener('popstate', handlePageChange);\n isTracking = false;\n }\n },\n };\n return plugin;\n};\n\nconst getCampaignParams = async () => omitUndefined(await new CampaignParser().parse());\n\nconst isCampaignEvent = (event: Event) => {\n if (event.event_type === '$identify' && event.user_properties) {\n const properties = event.user_properties as IdentifyUserProperties;\n const $set = properties[IdentifyOperation.SET] || {};\n const $unset = properties[IdentifyOperation.UNSET] || {};\n const userProperties = [...Object.keys($set), ...Object.keys($unset)];\n return Object.keys(BASE_CAMPAIGN).every((value) => userProperties.includes(value));\n }\n return false;\n};\n\nexport const shouldTrackHistoryPageView = (\n trackingOption: Options['trackHistoryChanges'],\n newURLStr: string,\n oldURLStr: string,\n): boolean => {\n switch (trackingOption) {\n case 'pathOnly': {\n if (oldURLStr == '') return true;\n const newURL = new URL(newURLStr);\n const oldURL = new URL(oldURLStr);\n const newBaseStr = newURL.origin + newURL.pathname;\n const oldBaseStr = oldURL.origin + oldURL.pathname;\n return newBaseStr !== oldBaseStr;\n }\n default:\n return newURLStr !== oldURLStr;\n }\n};\n","import {\n DEFAULT_FORM_START_EVENT,\n DEFAULT_FORM_SUBMIT_EVENT,\n FORM_ID,\n FORM_NAME,\n FORM_DESTINATION,\n} from '../constants';\nimport { BrowserConfig } from '../config';\nimport {\n getGlobalScope,\n Event as AmplitudeEvent,\n EnrichmentPlugin,\n BrowserClient,\n FormInteractionsOptions,\n} from '@amplitude/analytics-core';\nimport { getFormInteractionsConfig } from '../default-tracking';\n\ninterface EventListener {\n element: Element;\n type: 'change' | 'submit';\n handler: (event: Event) => void;\n}\n\nexport const formInteractionTracking = (): EnrichmentPlugin => {\n let observer: MutationObserver | undefined;\n let eventListeners: EventListener[] = [];\n\n const addEventListener = (element: Element, type: 'change' | 'submit', handler: (event: Event) => void) => {\n element.addEventListener(type, handler);\n eventListeners.push({\n element,\n type,\n handler,\n });\n };\n\n const removeClickListeners = () => {\n eventListeners.forEach(({ element, type, handler }) => {\n /* istanbul ignore next */\n element?.removeEventListener(type, handler);\n });\n eventListeners = [];\n };\n\n let formInteractionsConfig: FormInteractionsOptions | undefined;\n\n const name = '@amplitude/plugin-form-interaction-tracking-browser';\n const type = 'enrichment';\n const setup = async (config: BrowserConfig, amplitude: BrowserClient) => {\n formInteractionsConfig = getFormInteractionsConfig(config);\n\n const initializeFormTracking = () => {\n /* istanbul ignore if */\n if (!amplitude) {\n // TODO: Add required minimum version of @amplitude/analytics-browser\n config.loggerProvider.warn(\n 'Form interaction tracking requires a later version of @amplitude/analytics-browser. Form interaction events are not tracked.',\n );\n return;\n }\n\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n const addFormInteractionListener = (form: HTMLFormElement) => {\n let hasFormChanged = false;\n\n addEventListener(form, 'change', () => {\n const formDestination = extractFormAction(form);\n if (!hasFormChanged) {\n amplitude.track(DEFAULT_FORM_START_EVENT, {\n [FORM_ID]: stringOrUndefined(form.id),\n [FORM_NAME]: stringOrUndefined(form.name),\n [FORM_DESTINATION]: formDestination,\n });\n }\n hasFormChanged = true;\n });\n\n addEventListener(form, 'submit', (event: Event) => {\n const formDestination = extractFormAction(form);\n if (!hasFormChanged) {\n amplitude.track(DEFAULT_FORM_START_EVENT, {\n [FORM_ID]: stringOrUndefined(form.id),\n [FORM_NAME]: stringOrUndefined(form.name),\n [FORM_DESTINATION]: formDestination,\n });\n }\n hasFormChanged = true;\n\n // Check if shouldTrackSubmit callback is provided and use it to determine whether to track form_submit\n if (formInteractionsConfig?.shouldTrackSubmit !== undefined) {\n if (\n typeof formInteractionsConfig.shouldTrackSubmit === 'function' &&\n typeof SubmitEvent !== 'undefined' &&\n event instanceof SubmitEvent\n ) {\n try {\n const shouldTrack = formInteractionsConfig.shouldTrackSubmit(event);\n if (!shouldTrack) {\n return;\n }\n } catch (e) {\n config.loggerProvider.warn('shouldTrackSubmit callback threw an error, proceeding with tracking.');\n }\n } else {\n config.loggerProvider.warn(\n 'shouldTrackSubmit is ignored because it is not a function or event is not a SubmitEvent.',\n );\n }\n }\n\n amplitude.track(DEFAULT_FORM_SUBMIT_EVENT, {\n [FORM_ID]: stringOrUndefined(form.id),\n [FORM_NAME]: stringOrUndefined(form.name),\n [FORM_DESTINATION]: formDestination,\n });\n hasFormChanged = false;\n });\n };\n\n // Adds listener to existing anchor tags\n const forms = Array.from(document.getElementsByTagName('form'));\n forms.forEach(addFormInteractionListener);\n\n // Adds listener to anchor tags added after initial load\n /* istanbul ignore else */\n if (typeof MutationObserver !== 'undefined') {\n observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeName === 'FORM') {\n addFormInteractionListener(node as HTMLFormElement);\n }\n if ('querySelectorAll' in node && typeof node.querySelectorAll === 'function') {\n Array.from(node.querySelectorAll('form') as HTMLFormElement[]).map(addFormInteractionListener);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n subtree: true,\n childList: true,\n });\n }\n };\n\n // If the document is already loaded, initialize immediately.\n if (document.readyState === 'complete') {\n initializeFormTracking();\n } else {\n // Otherwise, wait for the load event.\n // The form interaction plugin observes changes in the dom. For this to work correctly, the observer can only be setup\n // after the body is built. When Amplitude gets initialized in a script tag, the body tag is still unavailable. So register this\n // only after the window is loaded\n const window = getGlobalScope();\n /* istanbul ignore else*/\n if (window) {\n window.addEventListener('load', initializeFormTracking);\n } else {\n config.loggerProvider.debug('Form interaction tracking is not installed because global is undefined.');\n }\n }\n };\n const execute = async (event: AmplitudeEvent) => event;\n const teardown = async () => {\n observer?.disconnect();\n removeClickListeners();\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n\nexport const stringOrUndefined = <T>(name: T): T extends string ? string : undefined => {\n /* istanbul ignore if */\n if (typeof name !== 'string') {\n // We found instances where the value of `name` is an Element and not a string.\n // Elements may have circular references and would throw an error when passed to `JSON.stringify(...)`.\n // If a non-string value is seen, assume there is no value.\n return undefined as T extends string ? string : undefined;\n }\n\n return name as T extends string ? string : undefined;\n};\n\n// Extracts the form action attribute, and normalizes it to a valid URL to preserve the previous behavior of accessing the action property directly.\nexport const extractFormAction = (form: HTMLFormElement): string | null => {\n let formDestination = form.getAttribute('action');\n try {\n // eslint-disable-next-line no-restricted-globals\n formDestination = new URL(encodeURI(formDestination ?? ''), window.location.href).href;\n } catch {\n //\n }\n return formDestination;\n};\n","import { DEFAULT_FILE_DOWNLOAD_EVENT, FILE_EXTENSION, FILE_NAME, LINK_ID, LINK_TEXT, LINK_URL } from '../constants';\nimport { BrowserConfig } from '../config';\nimport { getGlobalScope, Event, EnrichmentPlugin, BrowserClient } from '@amplitude/analytics-core';\n\ninterface EventListener {\n element: Element;\n type: 'click';\n handler: () => void;\n}\n\nexport const fileDownloadTracking = (): EnrichmentPlugin => {\n let observer: MutationObserver | undefined;\n let eventListeners: EventListener[] = [];\n const addEventListener = (element: Element, type: 'click', handler: () => void) => {\n element.addEventListener(type, handler);\n eventListeners.push({\n element,\n type,\n handler,\n });\n };\n const removeClickListeners = () => {\n eventListeners.forEach(({ element, type, handler }) => {\n /* istanbul ignore next */\n element?.removeEventListener(type, handler);\n });\n eventListeners = [];\n };\n\n const name = '@amplitude/plugin-file-download-tracking-browser';\n const type = 'enrichment';\n\n const setup = async (config: BrowserConfig, amplitude: BrowserClient) => {\n const initializeFileDownloadTracking = () => {\n /* istanbul ignore if */\n if (!amplitude) {\n // TODO: Add required minimum version of @amplitude/analytics-browser\n config.loggerProvider.warn(\n 'File download tracking requires a later version of @amplitude/analytics-browser. File download events are not tracked.',\n );\n return;\n }\n\n /* istanbul ignore if */\n if (typeof document === 'undefined') {\n return;\n }\n\n const addFileDownloadListener = (a: HTMLAnchorElement) => {\n let url: URL;\n try {\n // eslint-disable-next-line no-restricted-globals\n url = new URL(a.href, window.location.href);\n } catch {\n /* istanbul ignore next */\n return;\n }\n const result = ext.exec(url.href);\n const fileExtension = result?.[1];\n\n if (fileExtension) {\n addEventListener(a, 'click', () => {\n if (fileExtension) {\n amplitude.track(DEFAULT_FILE_DOWNLOAD_EVENT, {\n [FILE_EXTENSION]: fileExtension,\n [FILE_NAME]: url.pathname,\n [LINK_ID]: a.id,\n [LINK_TEXT]: a.text,\n [LINK_URL]: a.href,\n });\n }\n });\n }\n };\n\n const ext =\n /\\.(pdf|xlsx?|docx?|txt|rtf|csv|exe|key|pp(s|t|tx)|7z|pkg|rar|gz|zip|avi|mov|mp4|mpe?g|wmv|midi?|mp3|wav|wma)(\\?.+)?$/;\n\n // Adds listener to existing anchor tags\n const links = Array.from(document.getElementsByTagName('a'));\n links.forEach(addFileDownloadListener);\n\n // Adds listener to anchor tags added after initial load\n /* istanbul ignore else */\n if (typeof MutationObserver !== 'undefined') {\n observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeName === 'A') {\n addFileDownloadListener(node as HTMLAnchorElement);\n }\n if ('querySelectorAll' in node && typeof node.querySelectorAll === 'function') {\n Array.from(node.querySelectorAll('a') as HTMLAnchorElement[]).map(addFileDownloadListener);\n }\n });\n });\n });\n\n observer.observe(document.body, {\n subtree: true,\n childList: true,\n });\n }\n };\n\n // If the document is already loaded, initialize immediately.\n /* istanbul ignore else*/\n if (document.readyState === 'complete') {\n initializeFileDownloadTracking();\n } else {\n // Otherwise, wait for the load event.\n const window = getGlobalScope();\n /* istanbul ignore else*/\n if (window) {\n window.addEventListener('load', initializeFileDownloadTracking);\n } else {\n config.loggerProvider.debug('File download tracking is not installed because global is undefined.');\n }\n }\n };\n\n const execute = async (event: Event) => event;\n const teardown = async () => {\n observer?.disconnect();\n removeClickListeners();\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n","import { BrowserConfig } from '@amplitude/analytics-core';\n\nlet notified = false;\n\nexport const detNotify = (config: BrowserConfig): void => {\n if (notified || config.defaultTracking !== undefined) {\n return;\n }\n\n const message = `\\`options.defaultTracking\\` is set to undefined. This implicitly configures your Amplitude instance to track Page Views, Sessions, File Downloads, and Form Interactions. You can suppress this warning by explicitly setting a value to \\`options.defaultTracking\\`. The value must either be a boolean, to enable and disable all default events, or an object, for advanced configuration. For example:\n\namplitude.init(<YOUR_API_KEY>, {\n defaultTracking: true,\n});\n\nVisit https://www.docs.developers.amplitude.com/data/sdks/browser-2/#tracking-default-events for more details.`;\n config.loggerProvider.warn(message);\n notified = true;\n};\n\n/**\n * @private\n * This function is meant for testing purposes only\n */\nexport const resetNotify = () => {\n notified = false;\n};\n","import { getGlobalScope, BeforePlugin, BrowserClient, BrowserConfig } from '@amplitude/analytics-core';\n\ninterface EventListener {\n type: 'online' | 'offline';\n handler: () => void;\n}\n\nexport const networkConnectivityCheckerPlugin = (): BeforePlugin => {\n const name = '@amplitude/plugin-network-checker-browser';\n const type = 'before' as const;\n const globalScope = getGlobalScope();\n let eventListeners: EventListener[] = [];\n\n const addNetworkListener = (type: 'online' | 'offline', handler: () => void) => {\n /* istanbul ignore next */\n if (globalScope?.addEventListener) {\n globalScope?.addEventListener(type, handler);\n eventListeners.push({\n type,\n handler,\n });\n }\n };\n\n const removeNetworkListeners = () => {\n eventListeners.forEach(({ type, handler }) => {\n /* istanbul ignore next */\n globalScope?.removeEventListener(type, handler);\n });\n eventListeners = [];\n };\n\n const setup = async (config: BrowserConfig, amplitude: BrowserClient) => {\n if (typeof navigator === 'undefined') {\n config.loggerProvider.debug(\n 'Network connectivity checker plugin is disabled because navigator is not available.',\n );\n config.offline = false;\n return;\n }\n\n config.offline = !navigator.onLine;\n\n addNetworkListener('online', () => {\n config.loggerProvider.debug('Network connectivity changed to online.');\n config.offline = false;\n // Flush immediately will cause ERR_NETWORK_CHANGED\n setTimeout(() => {\n amplitude.flush();\n }, config.flushIntervalMillis);\n });\n\n addNetworkListener('offline', () => {\n config.loggerProvider.debug('Network connectivity changed to offline.');\n config.offline = true;\n });\n };\n\n const teardown = async () => {\n removeNetworkListeners();\n };\n\n return {\n name,\n type,\n setup,\n teardown,\n };\n};\n","import {\n AutocaptureOptions,\n type ElementInteractionsOptions,\n BrowserConfig,\n RemoteConfig,\n NetworkTrackingOptions,\n NetworkCaptureRule,\n SAFE_HEADERS,\n} from '@amplitude/analytics-core';\n\nexport interface AutocaptureOptionsRemoteConfig extends AutocaptureOptions {\n elementInteractions?: boolean | ElementInteractionsOptionsRemoteConfig;\n networkTracking?: boolean | NetworkTrackingOptionsRemoteConfig;\n}\nexport interface ElementInteractionsOptionsRemoteConfig extends ElementInteractionsOptions {\n /**\n * Related to pageUrlAllowlist but holds regex strings which will be initialized and appended to pageUrlAllowlist\n */\n pageUrlAllowlistRegex?: string[];\n}\n\nexport interface NetworkCaptureRuleRemoteConfig extends NetworkCaptureRule {\n /**\n * Related to urls but holds regex strings which will be initialized and appended to urls\n */\n urlsRegex?: string[];\n}\n\nexport interface NetworkTrackingOptionsRemoteConfig extends NetworkTrackingOptions {\n /**\n * Related to pageUrlAllowlist but holds regex strings which will be initialized and appended to pageUrlAllowlist\n */\n captureRules?: NetworkCaptureRuleRemoteConfig[];\n}\n\n// Type alias for the remote config structure we expect (this is what comes from the filtered browserSDK config)\ntype RemoteConfigBrowserSDK = {\n autocapture?: AutocaptureOptionsRemoteConfig | boolean;\n};\n\n/**\n * Performs a deep transformation of a remote config object so that\n * it matches the expected schema of the local config.\n *\n * Specifically, it normalizes nested `enabled` flags into concise union types.\n *\n * ### Transformation Rules:\n * - If an object has `enabled: true`, it is replaced by the same object without the `enabled` field.\n * - If it has only `enabled: true`, it is replaced with `true`.\n * - If it has `enabled: false`, it is replaced with `false` regardless of other fields.\n *\n * ### Examples:\n * Input: { prop: { enabled: true, hello: 'world' }}\n * Output: { prop: { hello: 'world' } }\n *\n * Input: { prop: { enabled: true }}\n * Output: { prop: true }\n *\n * Input: { prop: { enabled: false, hello: 'world' }}\n * Output: { prop: false }\n *\n * Input: { prop: { hello: 'world' }}\n * Output: { prop: { hello: 'world' } } // No change\n *\n * @param config Remote config object to be transformed\n * @returns Transformed config object compatible with local schema\n */\nexport function translateRemoteConfigToLocal(config?: Record<string, any>) {\n // Disabling type checking rules because remote config comes from a remote source\n // and this function needs to handle any unexpected values\n /* eslint-disable @typescript-eslint/no-unsafe-member-access,\n @typescript-eslint/no-unsafe-assignment,\n @typescript-eslint/no-unsafe-argument\n */\n if (typeof config !== 'object' || config === null) {\n return;\n }\n\n // translations are not applied on array properties\n if (Array.isArray(config)) {\n return;\n }\n\n const propertyNames = Object.keys(config);\n for (const propertyName of propertyNames) {\n try {\n const value = config[propertyName];\n // transform objects with { enabled } property to boolean | object\n if (typeof value?.enabled === 'boolean') {\n if (value.enabled) {\n // if enabled is true, set the value to the rest of the object\n // or true if the object has no other properties\n delete value.enabled;\n if (Object.keys(value).length === 0) {\n (config as any)[propertyName] = true;\n }\n } else {\n // If enabled is false, set the value to false\n (config as any)[propertyName] = false;\n }\n }\n\n // recursively translate properties of the value\n translateRemoteConfigToLocal(value as Record<string, any>);\n } catch (e) {\n // a failure here means that an accessor threw an error\n // so don't translate it\n // TODO(diagnostics): add a diagnostic event for this\n }\n }\n\n // translate remote responseHeaders and requestHeaders to local responseHeaders and requestHeaders\n try {\n if (config.autocapture?.networkTracking?.captureRules?.length) {\n for (const rule of config.autocapture.networkTracking.captureRules) {\n for (const header of ['responseHeaders', 'requestHeaders']) {\n const { captureSafeHeaders, allowlist } = rule[header] ?? {};\n if (!captureSafeHeaders && !allowlist) {\n continue;\n }\n // if allowlist is not an array, remote config contract is violated, remove it\n if (allowlist !== undefined && !Array.isArray(allowlist)) {\n delete rule[header];\n continue;\n }\n rule[header] = [...(captureSafeHeaders ? SAFE_HEADERS : []), ...(allowlist ?? [])];\n }\n }\n }\n } catch (e) {\n /* istanbul ignore next */\n // surprise exception, so don't translate it\n }\n\n // translate frustrationInteractions pluralization\n const frustrationInteractions = config.autocapture?.frustrationInteractions;\n if (frustrationInteractions) {\n if (frustrationInteractions.rageClick) {\n frustrationInteractions.rageClicks = frustrationInteractions.rageClick;\n delete frustrationInteractions.rageClick;\n }\n if (frustrationInteractions.deadClick) {\n frustrationInteractions.deadClicks = frustrationInteractions.deadClick;\n delete frustrationInteractions.deadClick;\n }\n }\n}\n\nfunction mergeUrls(urlsExact: (string | RegExp)[], urlsRegex: string[] | undefined, browserConfig: BrowserConfig) {\n // Convert string patterns to RegExp objects, warn on invalid patterns and skip them\n const regexList = [];\n for (const pattern of urlsRegex ?? []) {\n try {\n regexList.push(new RegExp(pattern));\n } catch (regexError) {\n browserConfig.loggerProvider.warn(`Invalid regex pattern: ${pattern}`, regexError);\n }\n }\n\n return urlsExact.concat(regexList);\n}\n\n/**\n * Updates the browser config in place by applying remote configuration settings.\n * Primarily merges autocapture settings from the remote config into the browser config.\n *\n * @param remoteConfig - The remote configuration to apply, or null if none available\n * @param browserConfig - The browser config object to update (modified in place)\n */\nexport function updateBrowserConfigWithRemoteConfig(\n remoteConfig: RemoteConfig | null,\n browserConfig: BrowserConfig,\n): void {\n if (!remoteConfig) {\n return;\n }\n\n // translate remote config to local compatible format\n translateRemoteConfigToLocal(remoteConfig);\n\n try {\n browserConfig.loggerProvider.debug(\n 'Update browser config with remote configuration:',\n JSON.stringify(remoteConfig),\n );\n\n // type cast error will be thrown if remoteConfig is not a valid RemoteConfigBrowserSDK\n // and it will be caught by the try-catch block\n const typedRemoteConfig = remoteConfig as RemoteConfigBrowserSDK;\n\n // merge remoteConfig.autocapture and browserConfig.autocapture\n // if a field is in remoteConfig.autocapture, use that value\n // if a field is not in remoteConfig.autocapture, use the value from browserConfig.autocapture\n if (typedRemoteConfig && 'autocapture' in typedRemoteConfig) {\n if (typeof typedRemoteConfig.autocapture === 'boolean') {\n browserConfig.autocapture = typedRemoteConfig.autocapture;\n }\n\n if (typeof typedRemoteConfig.autocapture === 'object' && typedRemoteConfig.autocapture !== null) {\n const transformedAutocaptureRemoteConfig = { ...typedRemoteConfig.autocapture };\n\n if (browserConfig.autocapture === undefined) {\n browserConfig.autocapture = typedRemoteConfig.autocapture;\n }\n\n // Handle Element Interactions config initialization\n if (\n typeof typedRemoteConfig.autocapture.elementInteractions === 'object' &&\n typedRemoteConfig.autocapture.elementInteractions !== null &&\n typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex?.length\n ) {\n transformedAutocaptureRemoteConfig.elementInteractions = {\n ...typedRemoteConfig.autocapture.elementInteractions,\n };\n const transformedRcElementInteractions = transformedAutocaptureRemoteConfig.elementInteractions;\n\n // combine exact allow list and regex allow list into just 'pageUrlAllowlist'\n const exactAllowList = transformedRcElementInteractions.pageUrlAllowlist ?? [];\n const urlsRegex = typedRemoteConfig.autocapture.elementInteractions.pageUrlAllowlistRegex;\n transformedRcElementInteractions.pageUrlAllowlist = mergeUrls(exactAllowList, urlsRegex, browserConfig);\n\n // clean up the regex allow list\n delete transformedRcElementInteractions.pageUrlAllowlistRegex;\n }\n\n // Handle Network Tracking config initialization\n if (\n typeof typedRemoteConfig.autocapture.networkTracking === 'object' &&\n typedRemoteConfig.autocapture.networkTracking !== null &&\n typedRemoteConfig.autocapture.networkTracking.captureRules?.length\n ) {\n transformedAutocaptureRemoteConfig.networkTracking = {\n ...typedRemoteConfig.autocapture.networkTracking,\n };\n const transformedRcNetworkTracking = transformedAutocaptureRemoteConfig.networkTracking;\n /* istanbul ignore next */\n const captureRules = transformedRcNetworkTracking.captureRules ?? [];\n for (const rule of captureRules) {\n rule.urls = mergeUrls(rule.urls ?? [], rule.urlsRegex, browserConfig);\n delete rule.urlsRegex;\n }\n }\n\n if (typeof browserConfig.autocapture === 'boolean') {\n browserConfig.autocapture = {\n attribution: browserConfig.autocapture,\n fileDownloads: browserConfig.autocapture,\n formInteractions: browserConfig.autocapture,\n pageViews: browserConfig.autocapture,\n sessions: browserConfig.autocapture,\n elementInteractions: browserConfig.autocapture,\n webVitals: browserConfig.autocapture,\n frustrationInteractions: browserConfig.autocapture,\n ...transformedAutocaptureRemoteConfig,\n };\n }\n\n if (typeof browserConfig.autocapture === 'object') {\n browserConfig.autocapture = {\n ...browserConfig.autocapture,\n ...transformedAutocaptureRemoteConfig,\n };\n }\n }\n\n // Override default tracking options if autocapture is updated by remote config\n browserConfig.defaultTracking = browserConfig.autocapture;\n }\n\n browserConfig.loggerProvider.debug('Browser config after remote config update:', JSON.stringify(browserConfig));\n } catch (e) {\n browserConfig.loggerProvider.error('Failed to apply remote configuration because of error: ', e);\n }\n}\n","export const VERSION = '1.20.0-feat-zoning-alpha.0';\n","export const PLUGIN_NAME = '@amplitude/plugin-autocapture-browser';\nexport const FRUSTRATION_PLUGIN_NAME = '@amplitude/plugin-frustration-browser';\n\nexport const AMPLITUDE_ELEMENT_CLICKED_EVENT = '[Amplitude] Element Clicked';\nexport const AMPLITUDE_ELEMENT_DEAD_CLICKED_EVENT = '[Amplitude] Dead Click';\nexport const AMPLITUDE_ELEMENT_RAGE_CLICKED_EVENT = '[Amplitude] Rage Click';\nexport const AMPLITUDE_ELEMENT_ERROR_CLICKED_EVENT = '[Amplitude] Error Click';\nexport const AMPLITUDE_ELEMENT_CHANGED_EVENT = '[Amplitude] Element Changed';\nexport const AMPLITUDE_PAGE_SCROLLED_EVENT = '[Amplitude] Page Scrolled';\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// Visual Tagging related constants\nexport const AMPLITUDE_ORIGIN = 'https://app.amplitude.com';\nexport const AMPLITUDE_ORIGIN_EU = 'https://app.eu.amplitude.com';\nexport const AMPLITUDE_ORIGIN_STAGING = 'https://apps.stag2.amplitude.com';\nexport const AMPLITUDE_ORIGINS_MAP = {\n US: AMPLITUDE_ORIGIN,\n EU: AMPLITUDE_ORIGIN_EU,\n STAGING: AMPLITUDE_ORIGIN_STAGING,\n};\n\nexport const AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL =\n 'https://cdn.amplitude.com/libs/visual-tagging-selector-1.0.0-alpha.js.gz';\nexport const AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL =\n 'https://cdn.amplitude.com/libs/background-capture-1.0.0-alpha.1.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","/* 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 createShouldTrackEvent = (\n autocaptureOptions: ElementInteractionsOptions,\n allowlist: string[], // this can be any type of css selector allow list\n isAlwaysCaptureCursorPointer = false,\n): shouldTrackEvent => {\n return (actionType: ActionType, element: Element) => {\n const { pageUrlAllowlist, pageUrlExcludelist, shouldTrackEventResolver } = autocaptureOptions;\n\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n // window, document, and Text nodes have no tag\n if (!tag) {\n return false;\n }\n\n if (shouldTrackEventResolver) {\n return shouldTrackEventResolver(actionType, element);\n }\n\n // check if the URL is in the allow list\n if (!isUrlMatchAllowlist(window.location.href, pageUrlAllowlist)) {\n return false;\n }\n\n // check if the URL is in the excludelist\n if (\n pageUrlExcludelist &&\n pageUrlExcludelist.length > 0 &&\n isUrlMatchAllowlist(window.location.href, pageUrlExcludelist as (string | RegExp)[])\n ) {\n return false;\n }\n\n /* istanbul ignore next */\n const elementType = String(element?.getAttribute('type')) || '';\n if (typeof elementType === 'string') {\n switch (elementType.toLowerCase()) {\n case 'hidden':\n return false;\n case 'password':\n return false;\n }\n }\n\n const isCursorPointer = isElementPointerCursor(element, actionType);\n\n if (isAlwaysCaptureCursorPointer && isCursorPointer) {\n return true;\n }\n\n /* istanbul ignore if */\n if (allowlist) {\n const hasMatchAnyAllowedSelector = allowlist.some((selector) => !!element?.matches?.(selector));\n if (!hasMatchAnyAllowedSelector) {\n return false;\n }\n }\n\n switch (tag) {\n case 'input':\n case 'select':\n case 'textarea':\n return actionType === 'change' || actionType === 'click';\n default: {\n /* istanbul ignore next */\n /* istanbul ignore next */\n if (isCursorPointer) {\n return true;\n }\n return actionType === 'click';\n }\n }\n };\n};\n\nexport const isTextNode = (node: Node) => {\n return !!node && node.nodeType === 3;\n};\n\nexport const isNonSensitiveElement = (element: Element) => {\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n const isContentEditable =\n element instanceof HTMLElement ? element.getAttribute('contenteditable')?.toLowerCase() === 'true' : false;\n\n return !SENSITIVE_TAGS.includes(tag) && !isContentEditable;\n};\n\n/**\n * Collects redacted attribute names from element and ancestor elements with data-amp-mask-attributes\n * The 'id' and 'class' attributes cannot be redacted as they're critical for element identification\n * @param element - The target element to check for redaction attributes\n * @returns Set of attribute names that should be redacted\n */\n/**\n * Parses a comma-separated string of attribute names and filters out protected attributes\n * @param attributeString - Comma-separated string of attribute names\n * @returns Array of valid attribute names, excluding 'id' and 'class'\n */\nexport const parseAttributesToMask = (attributeString: string | null): string[] => {\n return attributeString\n ? attributeString\n .split(',')\n .map((attr) => attr.trim())\n .filter((attr) => attr.length > 0 && attr !== 'id' && attr !== 'class') // Prevent 'id' and 'class' from being redacted as they're critical for element identification\n : [];\n};\n\nexport const extractPrefixedAttributes = (\n attrs: { [key: string]: string },\n prefix: string,\n): { [key: string]: string } => {\n return Object.entries(attrs).reduce((attributes: { [key: string]: string }, [attributeName, attributeValue]) => {\n if (attributeName.startsWith(prefix)) {\n const attributeKey = attributeName.replace(prefix, '');\n\n if (attributeKey) {\n attributes[attributeKey] = attributeValue || '';\n }\n }\n return attributes;\n }, {});\n};\n\nexport const isEmpty = (value: unknown) => {\n return (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n (typeof value === 'string' && value.trim().length === 0)\n );\n};\n\nexport const removeEmptyProperties = (properties: { [key: string]: unknown }): { [key: string]: unknown } => {\n return Object.keys(properties).reduce((filteredProperties: { [key: string]: unknown }, key) => {\n const value = properties[key];\n if (!isEmpty(value)) {\n filteredProperties[key] = value;\n }\n return filteredProperties;\n }, {});\n};\n\nexport const 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","import { isNonSensitiveElement } from './helpers';\nimport { DATA_AMP_MASK_ATTRIBUTES } from './constants';\nimport type { HierarchyNode } from './typings/autocapture';\nimport * as constants from './constants';\nimport { MASKED_TEXT_VALUE, TEXT_MASK_ATTRIBUTE } from '@amplitude/analytics-core';\n\nconst BLOCKED_ATTRIBUTES = new Set([\n // Already captured elsewhere in the hierarchy object\n 'id',\n 'class',\n\n // non-useful and potentially large attribute\n 'style',\n\n // sensitive as prefilled form data may populate this attribute\n 'value',\n\n // DOM events\n 'onclick',\n 'onchange',\n 'oninput',\n 'onblur',\n 'onsubmit',\n 'onfocus',\n 'onkeydown',\n 'onkeyup',\n 'onkeypress',\n\n // React specific\n 'data-reactid',\n 'data-react-checksum',\n 'data-reactroot',\n\n // Amplitude specific - used for redaction but should not be included in getElementProperties\n DATA_AMP_MASK_ATTRIBUTES,\n TEXT_MASK_ATTRIBUTE,\n]);\nconst SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST = ['type'];\n\nconst SVG_TAGS = ['svg', 'path', 'g'];\nconst HIGHLY_SENSITIVE_INPUT_TYPES = ['password', 'hidden'];\nexport const MAX_HIERARCHY_LENGTH = 1024;\n\nexport function getElementProperties(\n element: Element | null,\n userMaskedAttributeNames: Set<string>,\n): HierarchyNode | null {\n if (element === null) {\n return null;\n }\n\n const tagName = String(element.tagName).toLowerCase();\n const properties: HierarchyNode = {\n tag: tagName,\n };\n\n const siblings = Array.from(element.parentElement?.children ?? []);\n if (siblings.length) {\n properties.index = siblings.indexOf(element);\n properties.indexOfType = siblings.filter((el) => el.tagName === element.tagName).indexOf(element);\n }\n\n const prevSiblingTag = element.previousElementSibling?.tagName?.toLowerCase();\n if (prevSiblingTag) {\n properties.prevSib = String(prevSiblingTag);\n }\n\n const id = element.getAttribute('id');\n if (id) {\n properties.id = String(id);\n }\n\n const classes = Array.from(element.classList);\n if (classes.length) {\n properties.classes = classes;\n }\n\n const attributes: Record<string, string> = {};\n const attributesArray = Array.from(element.attributes);\n const filteredAttributes = attributesArray.filter((attr) => !BLOCKED_ATTRIBUTES.has(attr.name));\n const isSensitiveElement = !isNonSensitiveElement(element);\n\n // if input is hidden or password or for SVGs, skip attribute collection entirely\n if (!HIGHLY_SENSITIVE_INPUT_TYPES.includes(String(element.getAttribute('type'))) && !SVG_TAGS.includes(tagName)) {\n for (const attr of filteredAttributes) {\n // If sensitive element, only allow certain attributes\n if (isSensitiveElement && !SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST.includes(attr.name)) {\n continue;\n }\n\n if (userMaskedAttributeNames.has(attr.name)) {\n attributes[attr.name] = MASKED_TEXT_VALUE;\n continue;\n }\n\n // Finally cast attribute value to string and limit attribute value length\n attributes[attr.name] = String(attr.value).substring(0, constants.MAX_ATTRIBUTE_LENGTH);\n }\n }\n\n if (Object.keys(attributes).length) {\n properties.attrs = attributes;\n }\n\n return properties;\n}\n\nexport function getAncestors(targetEl: Element | null): Element[] {\n const ancestors: Element[] = [];\n\n if (!targetEl) {\n return ancestors;\n }\n\n // Add self to the list of ancestors\n ancestors.push(targetEl);\n let current = targetEl.parentElement;\n while (current && current.tagName !== 'HTML') {\n ancestors.push(current);\n current = current.parentElement;\n }\n return ancestors;\n}\n","import type { DataSource, PageAction } from '@amplitude/analytics-core/lib/esm/types/element-interactions';\nimport type { DataExtractor } from '../data-extractor';\nimport type { ElementBasedTimestampedEvent, ElementBasedEvent } from '../helpers';\n\n// Get DataSource\n/**\n * Gets the DOM element specified by the data source configuration\n * @param dataSource - Configuration for finding the target element\n * @param contextElement - The element to start searching from\n * @returns The matching DOM element or undefined if not found\n */\nexport const getDataSource = (dataSource: DataSource, contextElement: HTMLElement) => {\n // Only process DOM_ELEMENT type data sources\n try {\n if (dataSource.sourceType === 'DOM_ELEMENT') {\n // If scope is specified, find the closest ancestor matching the scope rather than using documentElement (html) as the scope\n let scopingElement: HTMLElement | null = document.documentElement;\n if (dataSource.scope && contextElement) {\n scopingElement = contextElement.closest(dataSource.scope);\n }\n\n // If we have both a scope and selector, find the matching element\n if (scopingElement && dataSource.selector) {\n return scopingElement.querySelector(dataSource.selector);\n }\n\n // Return scopingElement if no selector was specified\n return scopingElement;\n }\n } catch (error) {\n return undefined;\n }\n\n // Return undefined for non-DOM_ELEMENT data sources\n return undefined;\n};\n\n// Execute actions for a condition and attach event properties to the event if needed\nexport const executeActions = (\n actions: (string | PageAction)[],\n ev: ElementBasedTimestampedEvent<ElementBasedEvent>,\n dataExtractor: DataExtractor,\n) => {\n actions.forEach((action) => {\n // Skip if actions is string until action set is implemented\n if (typeof action === 'string') {\n return;\n }\n\n if (action.actionType === 'ATTACH_EVENT_PROPERTY') {\n const data = dataExtractor.extractDataFromDataSource(action.dataSource, ev.closestTrackedAncestor as HTMLElement);\n\n // Attach data to event\n ev.targetElementProperties[action.destinationKey] = data;\n }\n });\n};\n","/* 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 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 getText = (element: Element): string => {\n // Check if element or any parent has data-amp-mask attribute\n const hasMaskAttribute = element.closest(`[${TEXT_MASK_ATTRIBUTE}]`) !== null;\n if (hasMaskAttribute) {\n return MASKED_TEXT_VALUE;\n }\n let output = '';\n if (!element.querySelector(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`)) {\n output = (element as HTMLElement).innerText || '';\n } else {\n const clonedTree = element.cloneNode(true) as HTMLElement;\n // replace all elements with TEXT_MASK_ATTRIBUTE attribute and contenteditable with the text MASKED_TEXT_VALUE\n clonedTree.querySelectorAll(`[${TEXT_MASK_ATTRIBUTE}], [contenteditable]`).forEach((node) => {\n (node as HTMLElement).innerText = MASKED_TEXT_VALUE;\n });\n output = clonedTree.innerText || '';\n }\n return this.replaceSensitiveString(output.substring(0, 255)).replace(/\\s+/g, ' ').trim();\n };\n\n // Returns the element properties for the given element in Visual Labeling.\n getEventTagProps = (element: Element): Record<string, JSONValue> => {\n if (!element) {\n return {};\n }\n /* istanbul ignore next */\n const tag = element?.tagName?.toLowerCase?.();\n\n const properties = {\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG]: tag,\n [constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT]: this.getText(element),\n [constants.AMPLITUDE_EVENT_PROP_PAGE_URL]: window.location.href.split('?')[0],\n };\n return removeEmptyProperties(properties) as Record<string, JSONValue>;\n };\n}\n","/* istanbul ignore file */\n/* eslint-disable no-restricted-globals */\nimport {\n AMPLITUDE_ORIGIN,\n AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL,\n AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL,\n} from '../constants';\nimport { asyncLoadScript, generateUniqueId } from '../helpers';\nimport { ILogger, Messenger, ActionType } from '@amplitude/analytics-core';\n// Inline background-capture implementation (disabled) uses rrweb snapshot.\n// eslint-disable-next-line import/no-extraneous-dependencies\n// import { snapshot } from '@amplitude/rrweb-snapshot';\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\ntype MessageRequest = {\n id: string;\n action: string;\n args: Record<string, any>;\n};\n\ntype MessageResponse = {\n id: string;\n action: string;\n responseData: any;\n};\n\n// TODO: use MessageChannel instead of window.postMessage\nexport class WindowMessenger implements Messenger {\n endpoint = AMPLITUDE_ORIGIN;\n logger?: ILogger;\n requestCallbacks: {\n [id: string]: {\n resolve: (data: any) => void;\n reject: (data: any) => void;\n };\n } = {};\n\n constructor({ origin = AMPLITUDE_ORIGIN }: { origin?: string } = {}) {\n this.endpoint = origin;\n }\n\n private notify(message: Message<Action> | MessageRequest) {\n this.logger?.debug?.('Message sent: ', JSON.stringify(message));\n (window.opener as WindowProxy)?.postMessage?.(message, this.endpoint);\n }\n\n // Send an async request to the parent window\n public sendRequest(action: string, args: Record<string, any>, options = { timeout: 15_000 }): Promise<any> {\n // Create Request ID\n const id = generateUniqueId();\n const request = {\n id,\n action,\n args,\n };\n\n // Create a Promise that will be resolved when the response is received\n const promise = new Promise((resolve, reject) => {\n this.requestCallbacks[id] = { resolve, reject };\n\n // Send the request\n this.notify(request);\n\n // Handle request timeouts\n if (options?.timeout > 0) {\n setTimeout(() => {\n reject(new Error(`${action} timed out (id: ${id})`));\n delete this.requestCallbacks[id];\n }, options.timeout);\n }\n });\n\n return promise;\n }\n\n // Handle messages from the parent window\n private handleResponse(response: MessageResponse) {\n if (!this.requestCallbacks[response.id]) {\n this.logger?.warn(`No callback found for request id: ${response.id}`);\n return;\n }\n\n this.requestCallbacks[response.id].resolve(response.responseData);\n delete this.requestCallbacks[response.id];\n }\n\n setup(\n {\n logger,\n endpoint,\n isElementSelectable,\n cssSelectorAllowlist,\n actionClickAllowlist,\n dataExtractor,\n }: {\n logger?: ILogger;\n endpoint?: string;\n isElementSelectable?: (action: InitializeVisualTaggingSelectorData['actionType'], element: Element) => boolean;\n cssSelectorAllowlist?: string[];\n actionClickAllowlist?: string[];\n dataExtractor: DataExtractor;\n } = { dataExtractor: new DataExtractor({}) },\n ) {\n this.logger = logger;\n // If endpoint is customized, don't override it.\n if (endpoint && this.endpoint === AMPLITUDE_ORIGIN) {\n this.endpoint = endpoint;\n }\n let amplitudeVisualTaggingSelectorInstance: any = null;\n let amplitudeBackgroundCaptureInstance: any = null;\n this.logger?.debug?.('Setting up messenger');\n // Attach Event Listener to listen for messages from the parent window\n window.addEventListener('message', (event) => {\n this.logger?.debug?.('Message received: ', JSON.stringify(event));\n\n // Only accept messages from the specified origin\n if (this.endpoint !== event.origin) {\n return;\n }\n\n const eventData = event?.data as Message<Action> | MessageResponse;\n const action = eventData?.action;\n\n // Ignore messages without action\n if (!action) {\n return;\n }\n\n // If id exists, handle responses to previous requests\n if ('id' in eventData) {\n this.logger?.debug?.('Received Response to previous request: ', JSON.stringify(event));\n this.handleResponse(eventData);\n\n // If action exists, handle the action using existing handlers\n } else {\n if (action === 'ping') {\n this.notify({ action: 'pong' });\n } else if (action === 'initialize-visual-tagging-selector') {\n const actionData = eventData?.data as InitializeVisualTaggingSelectorData;\n asyncLoadScript(AMPLITUDE_VISUAL_TAGGING_SELECTOR_SCRIPT_URL)\n .then(() => {\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance = (window as any)?.amplitudeVisualTaggingSelector?.({\n getEventTagProps: dataExtractor.getEventTagProps,\n isElementSelectable: (element: Element) => {\n if (isElementSelectable) {\n return isElementSelectable(actionData?.actionType || 'click', element);\n }\n return true;\n },\n onTrack: this.onTrack,\n onSelect: this.onSelect,\n visualHighlightClass: AMPLITUDE_VISUAL_TAGGING_HIGHLIGHT_CLASS,\n messenger: this,\n cssSelectorAllowlist,\n actionClickAllowlist,\n extractDataFromDataSource: dataExtractor.extractDataFromDataSource,\n dataExtractor,\n diagnostics: {\n autocapture: {\n version: VERSION,\n },\n },\n });\n this.notify({ action: 'selector-loaded' });\n })\n .catch(() => {\n this.logger?.warn('Failed to initialize visual tagging selector');\n });\n } else if (action === 'initialize-background-capture') {\n this.logger?.debug?.('Initializing background capture (external script)');\n asyncLoadScript(new URL(AMPLITUDE_BACKGROUND_CAPTURE_SCRIPT_URL, this.endpoint).toString())\n .then(() => {\n this.logger?.debug?.('Background capture script loaded (external)');\n // eslint-disable-next-line\n amplitudeBackgroundCaptureInstance = (window as any)?.amplitudeBackgroundCapture?.({\n messenger: this,\n onBackgroundCapture: this.onBackgroundCapture,\n });\n this.notify({ action: 'background-capture-loaded' });\n })\n .catch(() => {\n this.logger?.warn('Failed to initialize background capture');\n });\n } else if (action === 'close-visual-tagging-selector') {\n // eslint-disable-next-line\n amplitudeVisualTaggingSelectorInstance?.close?.();\n } else if (action === 'close-background-capture') {\n // eslint-disable-next-line\n amplitudeBackgroundCaptureInstance?.close?.();\n }\n }\n });\n\n // Notify the parent window that the page has loaded\n this.notify({ action: 'page-loaded' });\n }\n\n private onSelect = (data: ElementSelectedData) => {\n this.notify({ action: 'element-selected', data });\n };\n\n private onTrack = (type: string, properties: { [key: string]: string | null }) => {\n if (type === 'selector-mode-changed') {\n this.notify({ action: 'track-selector-mode-changed', data: properties });\n } else if (type === 'selector-moved') {\n this.notify({ action: 'track-selector-moved', data: properties });\n }\n };\n\n private onBackgroundCapture = (type: string, backgroundCaptureData: { [key: string]: string | number | null }) => {\n if (type === 'background-capture-complete') {\n this.logger?.debug?.('Background capture complete');\n this.notify({ action: 'background-capture-complete', data: backgroundCaptureData });\n }\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()?.window.addEventListener('scroll', handler);\n return () => {\n getGlobalScope()?.window.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 console.log('IntersectionObserver not supported');\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\n mutationObservable.subscribe(({ event }) =>\n event.forEach(({ addedNodes }) =>\n addedNodes.forEach((node) => node instanceof Element && intersectionObserver.observe(node)),\n ),\n );\n\n return () => {\n intersectionObserver.disconnect();\n };\n });\n};\nconst createUnhandledErrorObservable = (): Observable<BrowserErrorEvent> => {\n return new Observable<BrowserErrorEvent>((observer) => {\n const handler = (event: ErrorEvent) => {\n let output: BrowserErrorEvent = {\n kind: 'error',\n };\n\n if (event.error instanceof Error) {\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) {\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","/* 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 multicast,\n} from '@amplitude/analytics-core';\nimport { VERSION } from './version';\nimport * as constants from './constants';\nimport {\n createShouldTrackEvent,\n type ElementBasedTimestampedEvent,\n type TimestampedEvent,\n type NavigateEvent,\n} from './helpers';\nimport { WindowMessenger } from './libs/messenger';\nimport { trackClicks } from './autocapture/track-click';\nimport { trackChange } from './autocapture/track-change';\nimport { trackActionClick } from './autocapture/track-action-click';\nimport { 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}\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 messenger: new WindowMessenger(),\n },\n /* istanbul ignore next */\n backgroundCaptureOptions = {\n enabled: true,\n messenger: new WindowMessenger(),\n },\n } = options;\n\n options.cssSelectorAllowlist = options.cssSelectorAllowlist ?? DEFAULT_CSS_SELECTOR_ALLOWLIST;\n options.actionClickAllowlist = options.actionClickAllowlist ?? DEFAULT_ACTION_CLICK_ALLOWLIST;\n options.debounceTime = options.debounceTime ?? 0;\n options.exposureDuration = options.exposureDuration ?? DEFAULT_EXPOSURE_DURATION;\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 trackers.exposure = trackExposure({\n allObservables,\n onExposure: handleExposure,\n dataExtractor,\n exposureDuration: options.exposureDuration,\n });\n if (trackers.exposure) {\n subscriptions.push(trackers.exposure);\n }\n\n const beforeUnloadHandler = () => {\n console.log('amp: beforeUnload');\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 console.log('amp: navigate');\n handleViewportContentUpdated(true);\n }),\n );\n } else if (globalScope) {\n const popstateHandler = () => {\n console.log('amp: popstate');\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 console.log('amp: pushState');\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 /* istanbul ignore next */\n config?.loggerProvider?.log(`${name} has been successfully added.`);\n // Setup visual tagging selector\n if (window.opener && visualTaggingOptions.enabled) {\n const allowlist = (options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist;\n const actionClickAllowlist = (options as AutoCaptureOptionsWithDefaults).actionClickAllowlist;\n\n /* istanbul ignore next */\n visualTaggingOptions.messenger?.setup({\n dataExtractor: dataExtractor,\n logger: config?.loggerProvider,\n ...(config?.serverZone && { endpoint: constants.AMPLITUDE_ORIGINS_MAP[config.serverZone] }),\n isElementSelectable: createShouldTrackEvent(options, [...allowlist, ...actionClickAllowlist]),\n cssSelectorAllowlist: allowlist,\n actionClickAllowlist: actionClickAllowlist,\n });\n }\n\n // Setup background capture messenger if it is not already setup for visual tagging selector\n /* istanbul ignore next */\n if (window.opener && backgroundCaptureOptions.enabled && !visualTaggingOptions.messenger) {\n /* istanbul ignore next */\n backgroundCaptureOptions.messenger?.setup({\n dataExtractor: dataExtractor,\n logger: config?.loggerProvider,\n });\n }\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\n };\n};\n","import type { ElementInteractionsOptions, LabeledEvent, Trigger } from '@amplitude/analytics-core';\nimport type { ElementBasedTimestampedEvent, ElementBasedEvent } from '../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 { 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, 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]:\n /* istanbul ignore next */\n globalScope?.location?.href,\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 return;\n }\n\n /* istanbul ignore next */\n amplitude?.track('[Amplitude] Viewport Content Updated', eventProperties);\n lastScroll = { maxX: pageScrollMaxState.maxX, 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 { AllWindowObservables } from '../autocapture-plugin';\nimport { DataExtractor } from '../data-extractor';\n\n// Default duration an element must be visible to count as \"exposed\"\nexport const DEFAULT_EXPOSURE_DURATION = 150;\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","/* 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} from './observables';\nimport { DataExtractor } from './data-extractor';\nimport { trackErrorClicks } from './autocapture/track-error-click';\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}\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\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 // Get CSS selectors for enabled features\n const rageCssSelectors = getCssSelectorAllowlist(\n options,\n 'rageClicks',\n DEFAULT_RAGE_CLICK_ALLOWLIST,\n rageClicksEnabled,\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 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 };\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 /* 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","/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n NetworkRequestEvent,\n networkObserver,\n NetworkEventCallback,\n NetworkTrackingOptions,\n ILogger,\n} from '@amplitude/analytics-core';\nimport * as constants from './constants';\nimport { Observable, Unsubscribable } from '@amplitude/analytics-core';\nimport { trackNetworkEvents } from './track-network-event';\n\nexport type BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\nexport enum ObservablesEnum {\n NetworkObservable = 'networkObservable',\n}\n\n// Base TimestampedEvent type\ntype BaseTimestampedEvent<T> = {\n event: T;\n timestamp: number;\n type: 'rage' | 'click' | 'change' | 'error' | 'navigate' | 'mutation' | 'network';\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\n// Union type for all possible TimestampedEvents\nexport type TimestampedEvent<T> = BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T>;\n\nexport interface AllWindowObservables {\n [ObservablesEnum.NetworkObservable]: Observable<TimestampedEvent<NetworkRequestEvent>>;\n}\n\nlet subscription: Unsubscribable;\n\nexport const networkCapturePlugin = (options: NetworkTrackingOptions = {}): BrowserEnrichmentPlugin => {\n const name = constants.PLUGIN_NAME;\n const type = 'enrichment';\n let logger: ILogger;\n\n const addAdditionalEventProperties = <T>(\n event: T,\n type: TimestampedEvent<T>['type'],\n ): TimestampedEvent<T> | ElementBasedTimestampedEvent<T> => {\n const baseEvent: BaseTimestampedEvent<T> | ElementBasedTimestampedEvent<T> = {\n event,\n timestamp: Date.now(),\n type,\n };\n\n return baseEvent;\n };\n\n // Create observables on events on the window\n const createObservables = (): AllWindowObservables => {\n const networkObservable = new Observable<TimestampedEvent<NetworkRequestEvent>>((observer) => {\n const callback = new NetworkEventCallback((event) => {\n const eventWithProperties = addAdditionalEventProperties(event, 'network');\n observer.next(eventWithProperties);\n });\n networkObserver.subscribe(callback, logger);\n return () => {\n networkObserver.unsubscribe(callback);\n };\n });\n\n return {\n [ObservablesEnum.NetworkObservable]: networkObservable,\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 /* istanbul ignore next */\n logger = config?.loggerProvider;\n\n subscription = trackNetworkEvents({\n allObservables,\n networkTrackingOptions: options,\n amplitude,\n loggerProvider: logger,\n });\n\n /* istanbul ignore next */\n logger?.log(`${name} has been successfully added.`);\n };\n\n /* istanbul ignore next */\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n subscription.unsubscribe();\n };\n\n return {\n name,\n type,\n setup,\n execute,\n teardown,\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","export const PLUGIN_NAME = '@amplitude/plugin-network-capture-browser';\n\nexport const AMPLITUDE_NETWORK_REQUEST_EVENT = '[Amplitude] Network Request';\n\n// TODO: when @experimental is removed from responseHeaders and requestHeaders,\n// remove this constant or set it to false\nexport const IS_HEADER_CAPTURE_EXPERIMENTAL = true;\n","import {\n BrowserClient,\n NetworkRequestEvent,\n NetworkCaptureRule,\n NetworkTrackingOptions,\n getGlobalScope,\n isUrlMatchAllowlist,\n SAFE_HEADERS,\n ILogger,\n IRequestWrapper,\n Unsubscribable,\n} from '@amplitude/analytics-core';\nimport { AllWindowObservables, TimestampedEvent } from './network-capture-plugin';\nimport { AMPLITUDE_NETWORK_REQUEST_EVENT, IS_HEADER_CAPTURE_EXPERIMENTAL } from './constants';\nimport { BodyCaptureRule } from '@amplitude/analytics-core/lib/esm/types/network-tracking';\n\nconst DEFAULT_STATUS_CODE_RANGE = '500-599';\n\nfunction wildcardMatch(str: string, pattern: string) {\n // Escape all regex special characters except for *\n const escapedPattern = pattern.replace(/[-[\\]{}()+?.,\\\\^$|#\\s]/g, '\\\\$&');\n // Replace * with .*\n const regexPattern = '^' + escapedPattern.replace(/\\*/g, '.*') + '$';\n const regex = new RegExp(regexPattern);\n return regex.test(str);\n}\n\nfunction isStatusCodeInRange(statusCode: number, range: string) {\n const ranges = range.split(',');\n for (const r of ranges) {\n const [start, end] = r.split('-').map(Number);\n if (statusCode === start && end === undefined) {\n return true;\n }\n if (statusCode >= start && statusCode <= end) {\n return true;\n }\n }\n return false;\n}\n\nfunction isCaptureRuleMatch(\n rule: NetworkCaptureRule,\n hostname: string,\n status?: number,\n url?: string,\n method?: string,\n) {\n // check if the host is in the allowed hosts\n if (rule.hosts && !rule.hosts.find((host: string) => wildcardMatch(hostname, host))) {\n return;\n }\n\n // check if the URL is in the allowed URL patterns\n if (url && rule.urls && !isUrlMatchAllowlist(url, rule.urls)) {\n return;\n }\n\n // check if the method is in the allowed methods\n if (\n method &&\n rule.methods &&\n !rule.methods.find(\n (allowedMethod: string) => method.toLowerCase() === allowedMethod.toLowerCase() || allowedMethod === '*',\n )\n ) {\n return;\n }\n\n // check if the status code is in the allowed range\n if (status || status === 0) {\n const statusCodeRange = rule.statusCodeRange || DEFAULT_STATUS_CODE_RANGE;\n if (!isStatusCodeInRange(status, statusCodeRange)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction parseUrl(url: string | undefined) {\n if (!url) {\n return;\n }\n try {\n /* istanbul ignore next */\n const currentHref = getGlobalScope()?.location.href;\n const urlObj = new URL(url, currentHref);\n const query = urlObj.searchParams.toString();\n const fragment = urlObj.hash.replace('#', '');\n const href = urlObj.href;\n const host = urlObj.host;\n urlObj.hash = '';\n urlObj.search = '';\n const hrefWithoutQueryOrHash = urlObj.href;\n return { query, fragment, href, hrefWithoutQueryOrHash, host };\n } catch (e) {\n /* istanbul ignore next */\n return;\n }\n}\n\nfunction isAmplitudeNetworkRequestEvent(host: string, requestWrapper: IRequestWrapper): boolean {\n if (host.includes('amplitude.com')) {\n try {\n const body = requestWrapper.body;\n if (typeof body !== 'string') {\n return false;\n }\n const bodyObj = JSON.parse(body) as { events: any[] };\n const { events } = bodyObj;\n /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */\n if (events.find((event: any) => event.event_type === AMPLITUDE_NETWORK_REQUEST_EVENT)) {\n return true;\n }\n } catch (e) {\n // do nothing\n }\n }\n return false;\n}\n\n/**\n * Takes a user provided header capture rule and returns a\n * HeaderCaptureRule object that sets proper default values.\n *\n * @param rule - The header capture rule to parse.\n * @returns A HeaderCaptureRule object.\n */\nexport function parseHeaderCaptureRule(rule: string[] | boolean | undefined | null): string[] | undefined {\n if (typeof rule !== 'object' || rule === null) {\n // if rule is truthy or undefined, return SAFE_HEADERS\n if (rule) {\n return [...SAFE_HEADERS];\n } else if (rule === undefined) {\n /* istanbul ignore next */\n const res = IS_HEADER_CAPTURE_EXPERIMENTAL ? undefined : [...SAFE_HEADERS];\n return res;\n }\n return;\n }\n\n // if the rule is defined but empty, return undefined\n if (rule.length === 0) {\n return;\n }\n\n return rule;\n}\n\nfunction isBodyCaptureRuleEmpty(rule: BodyCaptureRule) {\n /* istanbul ignore next */\n return !rule?.allowlist?.length && !rule?.blocklist?.length;\n}\n\nexport function shouldTrackNetworkEvent(networkEvent: NetworkRequestEvent, options: NetworkTrackingOptions = {}) {\n const urlObj = parseUrl(networkEvent.url);\n /* istanbul ignore if */\n if (!urlObj) {\n // if the URL failed to parse, do not track the event\n // this is a probably impossible case that would only happen if the URL is malformed\n /* istanbul ignore next */\n return false;\n }\n const { host } = urlObj;\n\n // false if is amplitude request and not configured to track amplitude requests\n if (\n options.ignoreAmplitudeRequests !== false &&\n (wildcardMatch(host, '*.amplitude.com') || wildcardMatch(host, 'amplitude.com'))\n ) {\n return false;\n }\n\n // false if the host is in the ignore list\n if (options.ignoreHosts?.find((ignoreHost: string) => wildcardMatch(host, ignoreHost))) {\n return false;\n }\n\n // false if the status code is not 500-599 and there are no captureRules\n if (\n !options.captureRules &&\n networkEvent.status !== undefined &&\n !isStatusCodeInRange(networkEvent.status, DEFAULT_STATUS_CODE_RANGE)\n ) {\n return false;\n }\n\n if (options.captureRules) {\n // find the first capture rule, in reverse-order,\n // that is a match (true) or a miss (false)\n let isMatch: boolean | undefined;\n [...options.captureRules].reverse().find((rule) => {\n isMatch = isCaptureRuleMatch(rule, host, networkEvent.status, networkEvent.url, networkEvent.method);\n\n if (isMatch) {\n const responseHeadersRule = parseHeaderCaptureRule(rule.responseHeaders);\n if (networkEvent.responseWrapper && responseHeadersRule) {\n const responseHeaders = networkEvent.responseWrapper.headers(responseHeadersRule);\n if (responseHeaders) {\n networkEvent.responseHeaders = responseHeaders;\n }\n }\n\n // if requestHeaders rule is specified, enrich the event with the request headers\n const requestHeadersRule = parseHeaderCaptureRule(rule.requestHeaders);\n if (networkEvent.requestWrapper && requestHeadersRule) {\n const requestHeaders = networkEvent.requestWrapper.headers(requestHeadersRule);\n if (requestHeaders) {\n networkEvent.requestHeaders = requestHeaders;\n }\n }\n\n // if responseBody rule is specified, enrich the event with the response body\n if (networkEvent.responseWrapper && rule.responseBody && !isBodyCaptureRuleEmpty(rule.responseBody)) {\n networkEvent.responseBodyJson = networkEvent.responseWrapper.json(\n rule.responseBody.allowlist,\n rule.responseBody.blocklist,\n );\n }\n\n // if requestBody rule is specified, enrich the event with the request body\n if (networkEvent.requestWrapper && rule.requestBody && !isBodyCaptureRuleEmpty(rule.requestBody)) {\n networkEvent.requestBodyJson = networkEvent.requestWrapper.json(\n rule.requestBody.allowlist,\n rule.requestBody.blocklist,\n );\n }\n }\n\n return isMatch !== undefined;\n });\n\n // if we found a miss (false) or no match (undefined),\n // then do not track the event\n if (!isMatch) {\n return false;\n }\n }\n\n // skip Amplitude network requests to \"[Amplitude] Network Request\" to avoid infinite loop\n if (networkEvent.requestWrapper && isAmplitudeNetworkRequestEvent(host, networkEvent.requestWrapper)) {\n return false;\n }\n\n return true;\n}\n\nexport type NetworkAnalyticsEvent = {\n ['[Amplitude] URL']: string;\n ['[Amplitude] URL Query']?: string;\n ['[Amplitude] URL Fragment']?: string;\n ['[Amplitude] Request Method']: string;\n ['[Amplitude] Status Code']?: number;\n ['[Amplitude] Start Time']?: number; // unix timestamp\n ['[Amplitude] Completion Time']?: number; // unix timestamp\n ['[Amplitude] Duration']?: number; // completionTime - startTime (millis)\n ['[Amplitude] Request Body Size']?: number;\n ['[Amplitude] Request Headers']?: Record<string, string>;\n ['[Amplitude] Request Body']?: string;\n ['[Amplitude] Response Body Size']?: number;\n ['[Amplitude] Response Headers']?: Record<string, string>;\n ['[Amplitude] Response Body']?: string;\n ['[Amplitude] Request Type']?: 'xhr' | 'fetch';\n};\n\nexport async function logNetworkAnalyticsEvent(\n networkAnalyticsEvent: NetworkAnalyticsEvent,\n request: NetworkRequestEvent,\n amplitude: BrowserClient,\n loggerProvider?: ILogger,\n) {\n if (request.requestBodyJson || request.responseBodyJson) {\n const [requestBody, responseBody] = await Promise.all([request.requestBodyJson, request.responseBodyJson]);\n if (requestBody) {\n try {\n networkAnalyticsEvent['[Amplitude] Request Body'] = JSON.stringify(requestBody);\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.debug('Failed to stringify request body', e);\n }\n }\n if (responseBody) {\n try {\n networkAnalyticsEvent['[Amplitude] Response Body'] = JSON.stringify(responseBody);\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.debug('Failed to stringify response body');\n }\n }\n }\n /* istanbul ignore next */\n amplitude?.track(AMPLITUDE_NETWORK_REQUEST_EVENT, networkAnalyticsEvent);\n}\n\nexport function trackNetworkEvents({\n allObservables,\n networkTrackingOptions,\n amplitude,\n loggerProvider,\n}: {\n allObservables: AllWindowObservables;\n networkTrackingOptions: NetworkTrackingOptions;\n amplitude: BrowserClient;\n loggerProvider?: ILogger;\n}): Unsubscribable {\n const { networkObservable } = allObservables;\n\n const filteredNetworkObservable = networkObservable.filter((event: TimestampedEvent<NetworkRequestEvent>) => {\n // Only track network events that should be tracked\n return shouldTrackNetworkEvent(event.event as NetworkRequestEvent, networkTrackingOptions);\n });\n\n return filteredNetworkObservable.subscribe((networkEvent) => {\n const request = networkEvent.event;\n\n // convert to NetworkAnalyticsEvent\n const urlObj = parseUrl(request.url);\n /* istanbul ignore if */\n if (!urlObj) {\n // if the URL failed to parse, do not track the event\n // this is a very unlikely case, because URL() shouldn't throw an exception\n // when the URL is a valid URL\n /* istanbul ignore next */\n return;\n }\n\n const responseBodySize = request.responseWrapper?.bodySize;\n /* istanbul ignore next */\n const requestBodySize = request.requestWrapper?.bodySize;\n\n const networkAnalyticsEvent: NetworkAnalyticsEvent = {\n ['[Amplitude] URL']: urlObj.hrefWithoutQueryOrHash,\n ['[Amplitude] URL Query']: urlObj.query,\n ['[Amplitude] URL Fragment']: urlObj.fragment,\n ['[Amplitude] Request Method']: request.method,\n ['[Amplitude] Status Code']: request.status,\n ['[Amplitude] Start Time']: request.startTime,\n ['[Amplitude] Completion Time']: request.endTime,\n ['[Amplitude] Duration']: request.duration,\n ['[Amplitude] Request Body Size']: requestBodySize,\n ['[Amplitude] Response Body Size']: responseBodySize,\n ['[Amplitude] Request Type']: request.type,\n ['[Amplitude] Request Headers']: request.requestHeaders,\n ['[Amplitude] Response Headers']: request.responseHeaders,\n };\n\n // fire-and-forget promise that tracks the event\n void logNetworkAnalyticsEvent(networkAnalyticsEvent, request, amplitude, loggerProvider);\n });\n}\n","let e=-1;const t=t=>{addEventListener(\"pageshow\",(n=>{n.persisted&&(e=n.timeStamp,t(n))}),!0)},n=(e,t,n,i)=>{let s,o;return r=>{t.value>=0&&(r||i)&&(o=t.value-(s??0),(o||void 0===s)&&(s=t.value,t.delta=o,t.rating=((e,t)=>e>t[1]?\"poor\":e>t[0]?\"needs-improvement\":\"good\")(t.value,n),e(t)))}},i=e=>{requestAnimationFrame((()=>requestAnimationFrame((()=>e()))))},s=()=>{const e=performance.getEntriesByType(\"navigation\")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},o=()=>{const e=s();return e?.activationStart??0},r=(t,n=-1)=>{const i=s();let r=\"navigate\";e>=0?r=\"back-forward-cache\":i&&(document.prerendering||o()>0?r=\"prerender\":document.wasDiscarded?r=\"restore\":i.type&&(r=i.type.replace(/_/g,\"-\")));return{name:t,value:n,rating:\"good\",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},c=new WeakMap;function a(e,t){return c.get(e)||c.set(e,new t),c.get(e)}class d{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],n=this.o.at(-1);this.i&&t&&n&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e)}}const h=(e,t,n={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const i=new PerformanceObserver((e=>{Promise.resolve().then((()=>{t(e.getEntries())}))}));return i.observe({type:e,buffered:!0,...n}),i}}catch{}},f=e=>{let t=!1;return()=>{t||(e(),t=!0)}};let u=-1;const l=new Set,m=()=>\"hidden\"!==document.visibilityState||document.prerendering?1/0:0,p=e=>{if(\"hidden\"===document.visibilityState){if(\"visibilitychange\"===e.type)for(const e of l)e();isFinite(u)||(u=\"visibilitychange\"===e.type?e.timeStamp:0,removeEventListener(\"prerenderingchange\",p,!0))}},v=()=>{if(u<0){const e=o(),n=document.prerendering?void 0:globalThis.performance.getEntriesByType(\"visibility-state\").filter((t=>\"hidden\"===t.name&&t.startTime>e))[0]?.startTime;u=n??m(),addEventListener(\"visibilitychange\",p,!0),addEventListener(\"prerenderingchange\",p,!0),t((()=>{setTimeout((()=>{u=m()}))}))}return{get firstHiddenTime(){return u},onHidden(e){l.add(e)}}},g=e=>{document.prerendering?addEventListener(\"prerenderingchange\",(()=>e()),!0):e()},y=[1800,3e3],E=(e,s={})=>{g((()=>{const c=v();let a,d=r(\"FCP\");const f=h(\"paint\",(e=>{for(const t of e)\"first-contentful-paint\"===t.name&&(f.disconnect(),t.startTime<c.firstHiddenTime&&(d.value=Math.max(t.startTime-o(),0),d.entries.push(t),a(!0)))}));f&&(a=n(e,d,y,s.reportAllChanges),t((t=>{d=r(\"FCP\"),a=n(e,d,y,s.reportAllChanges),i((()=>{d.value=performance.now()-t.timeStamp,a(!0)}))})))}))},b=[.1,.25],L=(e,s={})=>{const o=v();E(f((()=>{let c,f=r(\"CLS\",0);const u=a(s,d),l=e=>{for(const t of e)u.h(t);u.i>f.value&&(f.value=u.i,f.entries=u.o,c())},m=h(\"layout-shift\",l);m&&(c=n(e,f,b,s.reportAllChanges),o.onHidden((()=>{l(m.takeRecords()),c(!0)})),t((()=>{u.i=0,f=r(\"CLS\",0),c=n(e,f,b,s.reportAllChanges),i((()=>c()))})),setTimeout(c))})))};let P=0,T=1/0,_=0;const M=e=>{for(const t of e)t.interactionId&&(T=Math.min(T,t.interactionId),_=Math.max(_,t.interactionId),P=_?(_-T)/7+1:0)};let w;const C=()=>w?P:performance.interactionCount??0,I=()=>{\"interactionCount\"in performance||w||(w=h(\"event\",M,{type:\"event\",buffered:!0,durationThreshold:0}))};let F=0;class k{u=[];l=new Map;m;p;v(){F=C(),this.u.length=0,this.l.clear()}L(){const e=Math.min(this.u.length-1,Math.floor((C()-F)/50));return this.u[e]}h(e){if(this.m?.(e),!e.interactionId&&\"first-input\"!==e.entryType)return;const t=this.u.at(-1);let n=this.l.get(e.interactionId);if(n||this.u.length<10||e.duration>t.P){if(n?e.duration>n.P?(n.entries=[e],n.P=e.duration):e.duration===n.P&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],P:e.duration},this.l.set(n.id,n),this.u.push(n)),this.u.sort(((e,t)=>t.P-e.P)),this.u.length>10){const e=this.u.splice(10);for(const t of e)this.l.delete(t.id)}this.p?.(n)}}}const A=e=>{const t=globalThis.requestIdleCallback||setTimeout;\"hidden\"===document.visibilityState?e():(e=f(e),addEventListener(\"visibilitychange\",e,{once:!0,capture:!0}),t((()=>{e(),removeEventListener(\"visibilitychange\",e,{capture:!0})})))},B=[200,500],S=(e,i={})=>{if(!globalThis.PerformanceEventTiming||!(\"interactionId\"in PerformanceEventTiming.prototype))return;const s=v();g((()=>{I();let o,c=r(\"INP\");const d=a(i,k),f=e=>{A((()=>{for(const t of e)d.h(t);const t=d.L();t&&t.P!==c.value&&(c.value=t.P,c.entries=t.entries,o())}))},u=h(\"event\",f,{durationThreshold:i.durationThreshold??40});o=n(e,c,B,i.reportAllChanges),u&&(u.observe({type:\"first-input\",buffered:!0}),s.onHidden((()=>{f(u.takeRecords()),o(!0)})),t((()=>{d.v(),c=r(\"INP\"),o=n(e,c,B,i.reportAllChanges)})))}))};class N{m;h(e){this.m?.(e)}}const q=[2500,4e3],x=(e,s={})=>{g((()=>{const c=v();let d,u=r(\"LCP\");const l=a(s,N),m=e=>{s.reportAllChanges||(e=e.slice(-1));for(const t of e)l.h(t),t.startTime<c.firstHiddenTime&&(u.value=Math.max(t.startTime-o(),0),u.entries=[t],d())},p=h(\"largest-contentful-paint\",m);if(p){d=n(e,u,q,s.reportAllChanges);const o=f((()=>{m(p.takeRecords()),p.disconnect(),d(!0)})),c=e=>{e.isTrusted&&(A(o),removeEventListener(e.type,c,{capture:!0}))};for(const e of[\"keydown\",\"click\",\"visibilitychange\"])addEventListener(e,c,{capture:!0});t((t=>{u=r(\"LCP\"),d=n(e,u,q,s.reportAllChanges),i((()=>{u.value=performance.now()-t.timeStamp,d(!0)}))}))}}))},H=[800,1800],O=e=>{document.prerendering?g((()=>O(e))):\"complete\"!==document.readyState?addEventListener(\"load\",(()=>O(e)),!0):setTimeout(e)},$=(e,i={})=>{let c=r(\"TTFB\"),a=n(e,c,H,i.reportAllChanges);O((()=>{const d=s();d&&(c.value=Math.max(d.responseStart-o(),0),c.entries=[d],a(!0),t((()=>{c=r(\"TTFB\",0),a=n(e,c,H,i.reportAllChanges),a(!0)})))}))};export{b as CLSThresholds,y as FCPThresholds,B as INPThresholds,q as LCPThresholds,H as TTFBThresholds,L as onCLS,E as onFCP,S as onINP,x as onLCP,$ as onTTFB};\n","/* eslint-disable no-restricted-globals */\nimport {\n BrowserClient,\n BrowserConfig,\n EnrichmentPlugin,\n getGlobalScope,\n getDecodeURI,\n} from '@amplitude/analytics-core';\nimport { PLUGIN_NAME, WEB_VITALS_EVENT_NAME } from './constants';\nimport { onLCP, onINP, onCLS, onFCP, onTTFB, Metric } from 'web-vitals';\n\nexport type BrowserEnrichmentPlugin = EnrichmentPlugin<BrowserClient, BrowserConfig>;\n\ntype WebVitalsMetricPayload = {\n value: number;\n rating: Metric['rating'];\n delta: number;\n navigationType: Metric['navigationType'];\n id: string;\n timestamp: number;\n navigationStart: number;\n};\n\ntype WebVitalsEventPayload = {\n '[Amplitude] LCP'?: WebVitalsMetricPayload;\n '[Amplitude] FCP'?: WebVitalsMetricPayload;\n '[Amplitude] INP'?: WebVitalsMetricPayload;\n '[Amplitude] CLS'?: WebVitalsMetricPayload;\n '[Amplitude] TTFB'?: WebVitalsMetricPayload;\n '[Amplitude] Page Domain'?: string;\n '[Amplitude] Page Location'?: string;\n '[Amplitude] Page Path'?: string;\n '[Amplitude] Page Title'?: string;\n '[Amplitude] Page URL'?: string;\n};\n\nfunction getMetricStartTime(metric: Metric) {\n /* istanbul ignore next */\n const startTime = metric.entries[0]?.startTime || 0;\n return performance.timeOrigin + startTime;\n}\n\nfunction processMetric(metric: Metric) {\n return {\n value: metric.value,\n rating: metric.rating,\n delta: metric.delta,\n navigationType: metric.navigationType,\n id: metric.id,\n timestamp: Math.floor(getMetricStartTime(metric)),\n navigationStart: Math.floor(performance.timeOrigin),\n };\n}\n\nexport const webVitalsPlugin = (): BrowserEnrichmentPlugin => {\n let visibilityListener: ((this: Document, ev: Event) => void) | null = null;\n const globalScope = getGlobalScope();\n const doc = globalScope?.document;\n const location = globalScope?.location;\n const setup: BrowserEnrichmentPlugin['setup'] = async (config, amplitude) => {\n if (doc === undefined) {\n return;\n }\n const locationHref = getDecodeURI(/* istanbul ignore next */ location?.href || '', config.loggerProvider);\n const webVitalsPayload: WebVitalsEventPayload = {\n '[Amplitude] Page Domain': /* istanbul ignore next */ location?.hostname || '',\n '[Amplitude] Page Location': locationHref,\n '[Amplitude] Page Path': getDecodeURI(/* istanbul ignore next */ location?.pathname || '', config.loggerProvider),\n '[Amplitude] Page Title': /* istanbul ignore next */ (typeof document !== 'undefined' && document.title) || '',\n '[Amplitude] Page URL': getDecodeURI(locationHref.split('?')[0], config.loggerProvider),\n };\n\n onLCP((metric) => {\n webVitalsPayload['[Amplitude] LCP'] = processMetric(metric);\n });\n\n onFCP((metric) => {\n webVitalsPayload['[Amplitude] FCP'] = processMetric(metric);\n });\n\n onINP((metric) => {\n webVitalsPayload['[Amplitude] INP'] = processMetric(metric);\n });\n\n onCLS((metric) => {\n webVitalsPayload['[Amplitude] CLS'] = processMetric(metric);\n });\n\n onTTFB((metric) => {\n webVitalsPayload['[Amplitude] TTFB'] = processMetric(metric);\n });\n\n visibilityListener = () => {\n if (doc.visibilityState === 'hidden' && visibilityListener) {\n amplitude.track(WEB_VITALS_EVENT_NAME, webVitalsPayload);\n doc.removeEventListener('visibilitychange', visibilityListener);\n visibilityListener = null;\n }\n };\n doc.addEventListener('visibilitychange', visibilityListener);\n };\n\n const execute: BrowserEnrichmentPlugin['execute'] = async (event) => {\n return event;\n };\n\n const teardown = async () => {\n if (visibilityListener) {\n /* istanbul ignore next */\n doc?.removeEventListener('visibilitychange', visibilityListener);\n }\n };\n\n return {\n name: PLUGIN_NAME,\n type: 'enrichment',\n setup,\n execute,\n teardown,\n };\n};\n","import {\n type BrowserClient,\n type BrowserConfig,\n BrowserStorage,\n type EnrichmentPlugin,\n type Event,\n getDecodeURI,\n getGlobalScope,\n getPageTitle,\n type ILogger,\n PageUrlEnrichmentOptions,\n replaceSensitiveString,\n SpecialEventType,\n} from '@amplitude/analytics-core';\n\nexport const CURRENT_PAGE_STORAGE_KEY = 'AMP_CURRENT_PAGE';\nexport const PREVIOUS_PAGE_STORAGE_KEY = 'AMP_PREVIOUS_PAGE';\nexport const URL_INFO_STORAGE_KEY = 'AMP_URL_INFO';\n\nexport type URLInfo = {\n [CURRENT_PAGE_STORAGE_KEY]?: string;\n [PREVIOUS_PAGE_STORAGE_KEY]?: string;\n};\n\nenum PreviousPageType {\n Direct = 'direct', // for no prev page or referrer\n Internal = 'internal', // for internal domains - exact domain matches or when current and previous page are both internal domains\n External = 'external', // for different domains\n}\n\nexport const EXCLUDED_DEFAULT_EVENT_TYPES = new Set<string>([\n SpecialEventType.IDENTIFY,\n SpecialEventType.GROUP_IDENTIFY,\n SpecialEventType.REVENUE,\n]);\n\nexport const isPageUrlEnrichmentEnabled = (option: unknown): boolean => {\n if (typeof option === 'boolean') {\n return option;\n }\n if (typeof option === 'object' && option !== null && 'pageUrlEnrichment' in option) {\n return Boolean((option as { pageUrlEnrichment?: boolean }).pageUrlEnrichment);\n }\n return false;\n};\n\nexport const pageUrlEnrichmentPlugin = ({ internalDomains = [] }: PageUrlEnrichmentOptions = {}): EnrichmentPlugin => {\n const globalScope = getGlobalScope();\n let sessionStorage: BrowserStorage<URLInfo> | undefined = undefined;\n let isStorageEnabled = false;\n let loggerProvider: ILogger | undefined = undefined;\n\n let isProxied = false;\n let isTracking = false;\n\n const getHostname = (url: string): string | undefined => {\n let hostname: string | undefined;\n\n try {\n const decodedUrl = getDecodeURI(url, loggerProvider);\n hostname = new URL(decodedUrl).hostname;\n } catch (e) {\n /* istanbul ignore next */\n loggerProvider?.error('Could not parse URL: ', e);\n }\n\n return hostname;\n };\n\n const getPrevPageType = (previousPage: string) => {\n const currentDomain = (typeof location !== 'undefined' && location.hostname) || '';\n const previousPageDomain = previousPage ? getHostname(previousPage) : undefined;\n\n if (!previousPageDomain) {\n return PreviousPageType.Direct;\n }\n\n const isCurrentInternal = internalDomains.some((domain) => currentDomain.indexOf(domain) !== -1);\n const isPrevInternal = internalDomains.some((domain) => previousPageDomain.indexOf(domain) !== -1);\n\n if (currentDomain === previousPageDomain || (isPrevInternal && isCurrentInternal)) {\n return PreviousPageType.Internal;\n }\n\n return PreviousPageType.External;\n };\n\n const saveURLInfo = async () => {\n if (sessionStorage && isStorageEnabled) {\n const URLInfo = await sessionStorage.get(URL_INFO_STORAGE_KEY);\n const currentURL = getDecodeURI((typeof location !== 'undefined' && location.href) || '');\n const storedCurrentURL = URLInfo?.[CURRENT_PAGE_STORAGE_KEY] || '';\n\n let previousURL: string | undefined;\n if (currentURL === storedCurrentURL) {\n previousURL = URLInfo?.[PREVIOUS_PAGE_STORAGE_KEY] || '';\n } else if (storedCurrentURL) {\n previousURL = storedCurrentURL;\n } else {\n previousURL = document.referrer || '';\n }\n\n await sessionStorage.set(URL_INFO_STORAGE_KEY, {\n [CURRENT_PAGE_STORAGE_KEY]: currentURL,\n [PREVIOUS_PAGE_STORAGE_KEY]: previousURL,\n });\n }\n };\n\n const saveUrlInfoWrapper = () => {\n void saveURLInfo();\n };\n\n const plugin: EnrichmentPlugin = {\n name: '@amplitude/plugin-page-url-enrichment-browser',\n type: 'enrichment',\n\n setup: async (config: BrowserConfig, _: BrowserClient) => {\n loggerProvider = config.loggerProvider;\n loggerProvider.log('Installing @amplitude/plugin-page-url-enrichment-browser');\n\n isTracking = true;\n\n if (globalScope) {\n sessionStorage = new BrowserStorage<URLInfo>(globalScope.sessionStorage);\n isStorageEnabled = await sessionStorage.isEnabled();\n\n globalScope.addEventListener('popstate', saveUrlInfoWrapper);\n\n if (!isProxied) {\n /* istanbul ignore next */\n // There is no global browser listener for changes to history, so we have\n // to modify pushState and replaceState directly.\n // https://stackoverflow.com/a/64927639\n // eslint-disable-next-line @typescript-eslint/unbound-method\n globalScope.history.pushState = new Proxy(globalScope.history.pushState, {\n apply: (target, thisArg, [state, unused, url]) => {\n target.apply(thisArg, [state, unused, url]);\n if (isTracking) {\n saveUrlInfoWrapper();\n }\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n globalScope.history.replaceState = new Proxy(globalScope.history.replaceState, {\n apply: (target, thisArg, [state, unused, url]) => {\n target.apply(thisArg, [state, unused, url]);\n if (isTracking) {\n saveUrlInfoWrapper();\n }\n },\n });\n\n isProxied = true;\n }\n }\n },\n execute: async (event: Event) => {\n const locationHREF = getDecodeURI((typeof location !== 'undefined' && location.href) || '');\n\n if (sessionStorage && isStorageEnabled) {\n const URLInfo = await sessionStorage.get(URL_INFO_STORAGE_KEY);\n if (!URLInfo?.[CURRENT_PAGE_STORAGE_KEY]) {\n await sessionStorage.set(URL_INFO_STORAGE_KEY, {\n [CURRENT_PAGE_STORAGE_KEY]: locationHREF,\n [PREVIOUS_PAGE_STORAGE_KEY]: document.referrer || '',\n });\n }\n\n const updatedURLInfo = await sessionStorage.get(URL_INFO_STORAGE_KEY);\n let previousPage = '';\n if (updatedURLInfo) {\n previousPage = updatedURLInfo[PREVIOUS_PAGE_STORAGE_KEY] || '';\n }\n\n // no need to proceed to add additional properties if the event is one of the default event types to be excluded\n if (EXCLUDED_DEFAULT_EVENT_TYPES.has(event.event_type)) {\n return event;\n }\n\n event.event_properties = {\n ...(event.event_properties || {}),\n '[Amplitude] Page Domain': addIfNotExist(\n event,\n '[Amplitude] Page Domain',\n (typeof location !== 'undefined' && location.hostname) || '',\n ),\n '[Amplitude] Page Location': addIfNotExist(event, '[Amplitude] Page Location', locationHREF),\n '[Amplitude] Page Path': addIfNotExist(\n event,\n '[Amplitude] Page Path',\n (typeof location !== 'undefined' && getDecodeURI(location.pathname)) || '',\n ),\n '[Amplitude] Page Title': addIfNotExist(\n event,\n '[Amplitude] Page Title',\n getPageTitle(replaceSensitiveString),\n ),\n '[Amplitude] Page URL': addIfNotExist(event, '[Amplitude] Page URL', locationHREF.split('?')[0]),\n '[Amplitude] Previous Page Location': previousPage,\n '[Amplitude] Previous Page Type': getPrevPageType(previousPage),\n };\n }\n\n return event;\n },\n teardown: async () => {\n if (globalScope) {\n globalScope.removeEventListener('popstate', saveUrlInfoWrapper);\n\n isTracking = false;\n }\n\n if (sessionStorage && isStorageEnabled) {\n await sessionStorage.set(URL_INFO_STORAGE_KEY, {});\n }\n },\n };\n\n return plugin;\n};\n\nfunction addIfNotExist(event: Event, key: string, value: string): string {\n if (!event.event_properties) {\n event.event_properties = {};\n }\n\n if ((event.event_properties as { [key: string]: any })[key] === undefined) {\n return value;\n }\n\n return (event.event_properties as { [key: string]: any })[key] as string;\n}\n","export const PLUGIN_NAME = 'web-vitals-browser';\nexport const WEB_VITALS_EVENT_NAME = '[Amplitude] Web Vitals';\n","import { createIdentifyEvent, Identify, ILogger, Campaign, BASE_CAMPAIGN } from '@amplitude/analytics-core';\n\nexport interface Options {\n excludeReferrers?: (string | RegExp)[];\n initialEmptyValue?: string;\n resetSessionOnNewCampaign?: boolean;\n}\n\nconst domainWithoutSubdomain = (domain: string) => {\n const parts = domain.split('.');\n\n if (parts.length <= 2) {\n return domain;\n }\n\n return parts.slice(parts.length - 2, parts.length).join('.');\n};\n\n//Direct traffic mean no external referral, no UTMs, no click-ids, and no other customer identified marketing campaign url params.\nconst isDirectTraffic = (current: Campaign) => {\n return Object.values(current).every((value) => !value);\n};\n\nexport const isNewCampaign = (\n current: Campaign,\n previous: Campaign | undefined,\n options: Options,\n logger: ILogger,\n isNewSession = true,\n) => {\n const { referrer, referring_domain, ...currentCampaign } = current;\n const { referrer: _previous_referrer, referring_domain: prevReferringDomain, ...previousCampaign } = previous || {};\n\n if (isExcludedReferrer(options.excludeReferrers, current.referring_domain)) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n logger.debug(`This is not a new campaign because ${current.referring_domain} is in the exclude referrer list.`);\n return false;\n }\n\n //In the same session, direct traffic should not override or unset any persisting query params\n if (!isNewSession && isDirectTraffic(current) && previous) {\n logger.debug('This is not a new campaign because this is a direct traffic in the same session.');\n return false;\n }\n\n const hasNewCampaign = JSON.stringify(currentCampaign) !== JSON.stringify(previousCampaign);\n const hasNewDomain =\n domainWithoutSubdomain(referring_domain || '') !== domainWithoutSubdomain(prevReferringDomain || '');\n\n const result = !previous || hasNewCampaign || hasNewDomain;\n\n if (!result) {\n logger.debug(\"This is not a new campaign because it's the same as the previous one.\");\n } else {\n logger.debug(`This is a new campaign. An $identify event will be sent.`);\n }\n\n return result;\n};\n\nexport const isExcludedReferrer = (excludeReferrers: (string | RegExp)[] = [], referringDomain = '') => {\n return excludeReferrers.some((value) =>\n value instanceof RegExp ? value.test(referringDomain) : value === referringDomain,\n );\n};\n\nexport const createCampaignEvent = (campaign: Campaign, options: Options) => {\n const campaignParameters: Campaign = {\n // This object definition allows undefined keys to be iterated on\n // in .reduce() to build indentify object\n ...BASE_CAMPAIGN,\n ...campaign,\n };\n const identifyEvent = Object.entries(campaignParameters).reduce((identify, [key, value]) => {\n identify.setOnce(`initial_${key}`, value ?? options.initialEmptyValue ?? 'EMPTY');\n if (value) {\n return identify.set(key, value);\n }\n return identify.unset(key);\n }, new Identify());\n\n return createIdentifyEvent(identifyEvent);\n};\n\nexport const getDefaultExcludedReferrers = (cookieDomain: string | undefined) => {\n let domain = cookieDomain;\n if (domain) {\n if (domain.startsWith('.')) {\n domain = domain.substring(1);\n }\n return [new RegExp(`${domain.replace('.', '\\\\.')}$`)];\n }\n return [];\n};\n","import {\n BrowserConfig,\n ILogger,\n Storage,\n getStorageKey,\n isNewSession,\n Campaign,\n BASE_CAMPAIGN,\n CampaignParser,\n} from '@amplitude/analytics-core';\nimport { Options, getDefaultExcludedReferrers, createCampaignEvent, isNewCampaign } from './helpers';\n\nexport class WebAttribution {\n options: Options;\n storage: Storage<Campaign>;\n storageKey: string;\n webExpStorageKey: string;\n previousCampaign?: Campaign;\n currentCampaign: Campaign;\n shouldTrackNewCampaign = false;\n sessionTimeout: number;\n lastEventTime?: number;\n logger: ILogger;\n\n constructor(options: Options, config: BrowserConfig) {\n this.options = {\n initialEmptyValue: 'EMPTY',\n resetSessionOnNewCampaign: false,\n excludeReferrers: getDefaultExcludedReferrers(config.cookieOptions?.domain),\n ...options,\n };\n this.storage = config.cookieStorage as unknown as Storage<Campaign>;\n this.storageKey = getStorageKey(config.apiKey, 'MKTG');\n this.webExpStorageKey = getStorageKey(config.apiKey, 'MKTG_ORIGINAL');\n this.currentCampaign = BASE_CAMPAIGN;\n this.sessionTimeout = config.sessionTimeout;\n this.lastEventTime = config.lastEventTime;\n this.logger = config.loggerProvider;\n config.loggerProvider.log('Installing web attribution tracking.');\n }\n\n async init() {\n [this.currentCampaign, this.previousCampaign] = await this.fetchCampaign();\n const isEventInNewSession = !this.lastEventTime ? true : isNewSession(this.sessionTimeout, this.lastEventTime);\n\n if (isNewCampaign(this.currentCampaign, this.previousCampaign, this.options, this.logger, isEventInNewSession)) {\n this.shouldTrackNewCampaign = true;\n await this.storage.set(this.storageKey, this.currentCampaign);\n }\n }\n\n async fetchCampaign() {\n const originalCampaign = await this.storage.get(this.webExpStorageKey);\n if (originalCampaign) {\n await this.storage.remove(this.webExpStorageKey);\n }\n return await Promise.all([originalCampaign || new CampaignParser().parse(), this.storage.get(this.storageKey)]);\n }\n\n /**\n * This can be called when enable web attribution and either\n * 1. set a new session\n * 2. has new campaign and enable resetSessionOnNewCampaign\n */\n generateCampaignEvent(event_id?: number) {\n // Mark this campaign has been tracked\n this.shouldTrackNewCampaign = false;\n const campaignEvent = createCampaignEvent(this.currentCampaign, this.options);\n if (event_id) {\n campaignEvent.event_id = event_id;\n }\n return campaignEvent;\n }\n\n shouldSetSessionIdOnNewCampaign() {\n return this.shouldTrackNewCampaign && !!this.options.resetSessionOnNewCampaign;\n }\n}\n","import {\n AmplitudeCore,\n Destination,\n Identify,\n returnWrapper,\n Revenue,\n UUID,\n getAnalyticsConnector,\n setConnectorDeviceId,\n setConnectorUserId,\n isNewSession,\n IdentityEventSender,\n getQueryParams,\n Event,\n EventOptions,\n IIdentify,\n IRevenue,\n TransportTypeOrOptions,\n OfflineDisabled,\n Result,\n BrowserOptions,\n BrowserConfig,\n BrowserClient,\n SpecialEventType,\n AnalyticsClient,\n IRemoteConfigClient,\n RemoteConfigClient,\n RemoteConfig,\n Source,\n DiagnosticsClient,\n createIdentifyEvent,\n Logger,\n} from '@amplitude/analytics-core';\nimport {\n getAttributionTrackingConfig,\n getPageViewTrackingConfig,\n getElementInteractionsConfig,\n getNetworkTrackingConfig,\n isAttributionTrackingEnabled,\n isSessionTrackingEnabled,\n isFileDownloadTrackingEnabled,\n isFormInteractionTrackingEnabled,\n isElementInteractionsEnabled,\n isPageViewTrackingEnabled,\n isNetworkTrackingEnabled,\n isWebVitalsEnabled,\n isFrustrationInteractionsEnabled,\n getFrustrationInteractionsConfig,\n isPageUrlEnrichmentEnabled,\n} from './default-tracking';\nimport { convertProxyObjectToRealObject, isInstanceProxy } from './utils/snippet-helper';\nimport { Context } from './plugins/context';\nimport { useBrowserConfig, createTransport, shouldFetchRemoteConfig } from './config';\nimport { pageViewTrackingPlugin } from '@amplitude/plugin-page-view-tracking-browser';\nimport { formInteractionTracking } from './plugins/form-interaction-tracking';\nimport { fileDownloadTracking } from './plugins/file-download-tracking';\nimport { DEFAULT_SESSION_END_EVENT, DEFAULT_SESSION_START_EVENT, DEFAULT_SERVER_ZONE } from './constants';\nimport { detNotify } from './det-notification';\nimport { networkConnectivityCheckerPlugin } from './plugins/network-connectivity-checker';\nimport { updateBrowserConfigWithRemoteConfig } from './config/joined-config';\nimport { autocapturePlugin, frustrationPlugin } from '@amplitude/plugin-autocapture-browser';\nimport { plugin as networkCapturePlugin } from '@amplitude/plugin-network-capture-browser';\nimport { webVitalsPlugin } from '@amplitude/plugin-web-vitals-browser';\nimport { WebAttribution } from './attribution/web-attribution';\nimport { LIBPREFIX } from './lib-prefix';\nimport { VERSION } from './version';\nimport { pageUrlEnrichmentPlugin } from '@amplitude/plugin-page-url-enrichment-browser';\n\n/**\n * Exported for `@amplitude/unified` or integration with blade plugins.\n * If you only use `@amplitude/analytics-browser`, use `amplitude.init()` or `amplitude.createInstance()` instead.\n */\nexport class AmplitudeBrowser extends AmplitudeCore implements BrowserClient, AnalyticsClient {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n config: BrowserConfig;\n previousSessionDeviceId: string | undefined;\n previousSessionUserId: string | undefined;\n webAttribution: WebAttribution | undefined;\n userProperties: { [key: string]: any } | undefined;\n\n // Backdoor to set diagnostics sample rate\n // by calling amplitude._setDiagnosticsSampleRate(1); before amplitude.init()\n _diagnosticsSampleRate = 0;\n\n init(apiKey = '', userIdOrOptions?: string | BrowserOptions, maybeOptions?: BrowserOptions) {\n let userId: string | undefined;\n let options: BrowserOptions | undefined;\n if (arguments.length > 2) {\n userId = userIdOrOptions as string | undefined;\n options = maybeOptions;\n } else {\n if (typeof userIdOrOptions === 'string') {\n userId = userIdOrOptions;\n options = undefined;\n } else {\n userId = userIdOrOptions?.userId;\n options = userIdOrOptions;\n }\n }\n return returnWrapper(this._init({ ...options, userId, apiKey }));\n }\n protected async _init(options: BrowserOptions & { apiKey: string }) {\n // Step 1: Block concurrent initialization\n if (this.initializing) {\n return;\n }\n this.initializing = true;\n\n // Step 2: Create browser config\n // Step 2.1: Determine if we should fetch remote config BEFORE creating browser config\n // This allows us to get diagnostics settings before creating the DiagnosticsClient\n const fetchRemoteConfig = shouldFetchRemoteConfig(options);\n\n // Set up early dependencies needed for remote config client\n // These use options directly or fall back to defaults\n const loggerProvider = options.loggerProvider ?? new Logger();\n const serverZone = options.serverZone ?? DEFAULT_SERVER_ZONE;\n\n let remoteConfigClient: IRemoteConfigClient | undefined;\n let diagnosticsSampleRate = this._diagnosticsSampleRate;\n let enableDiagnostics = options.enableDiagnostics ?? true;\n\n // Step 2.2: Fetch diagnostics config FIRST to get sample rate for DiagnosticsClient\n // We want to create DiagnosticsClient as early as possible so it can track more data\n /* istanbul ignore next */\n if (fetchRemoteConfig) {\n remoteConfigClient = new RemoteConfigClient(\n options.apiKey,\n loggerProvider,\n serverZone,\n /* istanbul ignore next */ options.remoteConfig?.serverUrl,\n );\n\n // Fetch diagnostics config first to get sample rate\n await new Promise<void>((resolve) => {\n // Disable coverage for this line because remote config client will always be defined in this case.\n // istanbul ignore next\n remoteConfigClient?.subscribe(\n 'configs.diagnostics.browserSDK',\n 'all',\n (remoteConfig: RemoteConfig | null, source: Source, lastFetch: Date) => {\n loggerProvider.debug(\n 'Diagnostics remote configuration received:',\n JSON.stringify(\n {\n remoteConfig,\n source,\n lastFetch,\n },\n null,\n 2,\n ),\n );\n if (remoteConfig) {\n // Validate and set sampleRate (must be a valid number)\n const sampleRate = remoteConfig.sampleRate as number;\n if (typeof sampleRate === 'number' && !isNaN(sampleRate)) {\n diagnosticsSampleRate = sampleRate;\n }\n\n // Validate and set enabled (must be a boolean)\n const enabled = remoteConfig.enabled as boolean;\n if (typeof enabled === 'boolean') {\n enableDiagnostics = enabled;\n }\n }\n resolve();\n },\n );\n });\n }\n\n // Step 2.3: Initialize diagnostics client as early as possible\n // Now we have the sample rate from remote config (if fetched)\n const diagnosticsClient = new DiagnosticsClient(options.apiKey, loggerProvider, serverZone, {\n enabled: enableDiagnostics,\n sampleRate: diagnosticsSampleRate,\n });\n diagnosticsClient.setTag('library', `${LIBPREFIX}/${VERSION}`);\n if (typeof navigator !== 'undefined') {\n diagnosticsClient.setTag('user_agent', navigator.userAgent);\n }\n\n // Step 2.4: Create browser config with diagnosticsClient and earlyConfig\n // earlyConfig ensures consistent logger/serverZone/diagnostics settings across all components\n const browserOptions = await useBrowserConfig(options.apiKey, options, this, diagnosticsClient, {\n loggerProvider,\n serverZone,\n enableDiagnostics,\n diagnosticsSampleRate,\n });\n\n // Step 2.5: Fetch analytics SDK remote config\n // This is fetched after DiagnosticsClient is created so diagnostics can track any issues\n /* istanbul ignore next */\n if (fetchRemoteConfig && remoteConfigClient) {\n await new Promise<void>((resolve) => {\n // Disable coverage for this line because remote config client will always be defined in this case.\n // istanbul ignore next\n remoteConfigClient?.subscribe(\n 'configs.analyticsSDK.browserSDK',\n 'all',\n (remoteConfig: RemoteConfig | null, source: Source, lastFetch: Date) => {\n browserOptions.loggerProvider.debug(\n 'Remote configuration received:',\n JSON.stringify(\n {\n remoteConfig,\n source,\n lastFetch,\n },\n null,\n 2,\n ),\n );\n if (remoteConfig) {\n updateBrowserConfigWithRemoteConfig(remoteConfig, browserOptions);\n }\n // Resolve the promise on first callback (initial config)\n resolve();\n },\n );\n });\n }\n\n await super._init(browserOptions);\n this.logBrowserOptions(browserOptions);\n\n this.config.remoteConfigClient = remoteConfigClient;\n\n // Add web attribution plugin\n if (isAttributionTrackingEnabled(this.config.defaultTracking)) {\n const attributionTrackingOptions = getAttributionTrackingConfig(this.config);\n this.webAttribution = new WebAttribution(attributionTrackingOptions, this.config);\n // Fetch the current campaign, check if need to track web attribution later\n await this.webAttribution.init();\n }\n\n // Step 3: Set session ID\n // Priority 1: `options.sessionId`\n // Priority 2: sessionId from url if it's Number and ampTimestamp is valid\n // Priority 3: last known sessionId from user identity storage\n // Default: `Date.now()`\n // Session ID is handled differently than device ID and user ID due to session events\n const queryParams = getQueryParams();\n\n // Check if ampTimestamp is present and valid\n const ampTimestamp = queryParams.ampTimestamp ? Number(queryParams.ampTimestamp) : undefined;\n const isWithinTimeLimit = ampTimestamp ? Date.now() < ampTimestamp : true;\n\n // check if we need to set the sessionId\n const querySessionId =\n isWithinTimeLimit && !Number.isNaN(Number(queryParams.ampSessionId))\n ? Number(queryParams.ampSessionId)\n : undefined;\n this.setSessionId(options.sessionId ?? querySessionId ?? this.config.sessionId ?? Date.now());\n\n // Set up the analytics connector to integrate with the experiment SDK.\n // Send events from the experiment SDK and forward identifies to the\n // identity store.\n const connector = getAnalyticsConnector(options.instanceName);\n connector.identityStore.setIdentity({\n userId: this.config.userId,\n deviceId: this.config.deviceId,\n });\n\n // Step 4: Install plugins\n // Do not track any events before this\n if (this.config.offline !== OfflineDisabled) {\n await this.add(networkConnectivityCheckerPlugin()).promise;\n }\n await this.add(new Destination({ diagnosticsClient })).promise;\n await this.add(new Context()).promise;\n await this.add(new IdentityEventSender()).promise;\n\n // Notify if DET is enabled\n detNotify(this.config);\n\n if (isFileDownloadTrackingEnabled(this.config.defaultTracking)) {\n this.config.loggerProvider.debug('Adding file download tracking plugin');\n await this.add(fileDownloadTracking()).promise;\n }\n\n if (isFormInteractionTrackingEnabled(this.config.defaultTracking)) {\n this.config.loggerProvider.debug('Adding form interaction plugin');\n await this.add(formInteractionTracking()).promise;\n }\n\n // Add page view plugin\n if (isPageViewTrackingEnabled(this.config.defaultTracking)) {\n this.config.loggerProvider.debug('Adding page view tracking plugin');\n await this.add(pageViewTrackingPlugin(getPageViewTrackingConfig(this.config))).promise;\n }\n\n if (isElementInteractionsEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding user interactions plugin (autocapture plugin)');\n await this.add(autocapturePlugin(getElementInteractionsConfig(this.config), { diagnosticsClient })).promise;\n }\n\n if (isFrustrationInteractionsEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding frustration interactions plugin');\n await this.add(frustrationPlugin(getFrustrationInteractionsConfig(this.config))).promise;\n }\n\n if (isNetworkTrackingEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding network tracking plugin');\n await this.add(networkCapturePlugin(getNetworkTrackingConfig(this.config))).promise;\n }\n\n if (isWebVitalsEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding web vitals plugin');\n await this.add(webVitalsPlugin()).promise;\n }\n\n if (isPageUrlEnrichmentEnabled(this.config.autocapture)) {\n this.config.loggerProvider.debug('Adding referrer page url plugin');\n await this.add(pageUrlEnrichmentPlugin()).promise;\n }\n\n this.initializing = false;\n\n // Step 6: Run queued dispatch functions\n await this.runQueuedFunctions('dispatchQ');\n\n // Step 7: Add the event receiver after running remaining queued functions.\n connector.eventBridge.setEventReceiver((event) => {\n const { time, ...cleanEventProperties } = event.eventProperties || {};\n const eventOptions = typeof time === 'number' ? { time } : undefined;\n void this.track(event.eventType, cleanEventProperties, eventOptions);\n });\n }\n\n getUserId() {\n return this.config?.userId;\n }\n\n setUserId(userId: string | undefined) {\n if (!this.config) {\n this.q.push(this.setUserId.bind(this, userId));\n return;\n }\n this.config.loggerProvider.debug('function setUserId: ', userId);\n if (userId !== this.config.userId || userId === undefined) {\n this.config.userId = userId;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.timeline.onIdentityChanged({ userId: userId });\n setConnectorUserId(userId, this.config.instanceName);\n }\n }\n\n getDeviceId() {\n return this.config?.deviceId;\n }\n\n setDeviceId(deviceId: string) {\n if (!this.config) {\n this.q.push(this.setDeviceId.bind(this, deviceId));\n return;\n }\n this.config.loggerProvider.debug('function setDeviceId: ', deviceId);\n if (deviceId !== this.config.deviceId) {\n this.config.deviceId = deviceId;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.timeline.onIdentityChanged({ deviceId: deviceId });\n setConnectorDeviceId(deviceId, this.config.instanceName);\n }\n }\n\n reset() {\n this.setDeviceId(UUID());\n this.setUserId(undefined);\n this.timeline.onReset();\n }\n\n getIdentity() {\n return {\n deviceId: this.config?.deviceId,\n userId: this.config?.userId,\n userProperties: this.userProperties,\n };\n }\n\n getOptOut(): boolean | undefined {\n return this.config?.optOut;\n }\n\n getSessionId() {\n return this.config?.sessionId;\n }\n\n setSessionId(sessionId: number) {\n const promises: Promise<Result>[] = [];\n if (!this.config) {\n this.q.push(this.setSessionId.bind(this, sessionId));\n return returnWrapper(Promise.resolve());\n }\n // Prevents starting a new session with the same session ID\n if (sessionId === this.config.sessionId) {\n return returnWrapper(Promise.resolve());\n }\n\n this.config.loggerProvider.debug('function setSessionId: ', sessionId);\n\n const previousSessionId = this.getSessionId();\n if (previousSessionId !== sessionId) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n this.timeline.onSessionIdChanged(sessionId);\n }\n\n const lastEventTime = this.config.lastEventTime;\n let lastEventId = this.config.lastEventId ?? -1;\n\n this.config.sessionId = sessionId;\n this.config.lastEventTime = undefined;\n this.config.pageCounter = 0;\n\n if (isSessionTrackingEnabled(this.config.defaultTracking)) {\n if (previousSessionId && lastEventTime) {\n promises.push(\n this.track(DEFAULT_SESSION_END_EVENT, undefined, {\n device_id: this.previousSessionDeviceId,\n event_id: ++lastEventId,\n session_id: previousSessionId,\n time: lastEventTime + 1,\n user_id: this.previousSessionUserId,\n }).promise,\n );\n }\n this.config.lastEventTime = this.config.sessionId;\n }\n\n // Fire web attribution event when enable webAttribution tracking\n // 1. has new campaign (call setSessionId from init function)\n // 2. or shouldTrackNewCampaign (call setSessionId from async process(event) when there has new campaign and resetSessionOnNewCampaign = true )\n const isCampaignEventTracked = this.trackCampaignEventIfNeeded(++lastEventId, promises);\n\n // track the identify event if an Identify object is provided in the config\n if (this.config.identify) {\n promises.push(this.track(createIdentifyEvent(this.config.identify)).promise);\n }\n\n if (isSessionTrackingEnabled(this.config.defaultTracking)) {\n promises.push(\n this.track(DEFAULT_SESSION_START_EVENT, undefined, {\n event_id: isCampaignEventTracked ? ++lastEventId : lastEventId,\n session_id: this.config.sessionId,\n time: this.config.lastEventTime,\n }).promise,\n );\n }\n\n this.previousSessionDeviceId = this.config.deviceId;\n this.previousSessionUserId = this.config.userId;\n return returnWrapper(Promise.all(promises));\n }\n\n extendSession() {\n if (!this.config) {\n this.q.push(this.extendSession.bind(this));\n return;\n }\n this.config.lastEventTime = Date.now();\n }\n\n setTransport(transport: TransportTypeOrOptions) {\n if (!this.config) {\n this.q.push(this.setTransport.bind(this, transport));\n return;\n }\n this.config.transportProvider = createTransport(transport);\n }\n\n identify(identify: IIdentify, eventOptions?: EventOptions) {\n if (isInstanceProxy(identify)) {\n const queue = identify._q;\n identify._q = [];\n identify = convertProxyObjectToRealObject(new Identify(), queue);\n }\n if (eventOptions?.user_id) {\n this.setUserId(eventOptions.user_id);\n }\n if (eventOptions?.device_id) {\n this.setDeviceId(eventOptions.device_id);\n }\n return super.identify(identify, eventOptions);\n }\n\n groupIdentify(groupType: string, groupName: string | string[], identify: IIdentify, eventOptions?: EventOptions) {\n if (isInstanceProxy(identify)) {\n const queue = identify._q;\n identify._q = [];\n identify = convertProxyObjectToRealObject(new Identify(), queue);\n }\n return super.groupIdentify(groupType, groupName, identify, eventOptions);\n }\n\n revenue(revenue: IRevenue, eventOptions?: EventOptions) {\n if (isInstanceProxy(revenue)) {\n const queue = revenue._q;\n revenue._q = [];\n revenue = convertProxyObjectToRealObject(new Revenue(), queue);\n }\n return super.revenue(revenue, eventOptions);\n }\n\n private trackCampaignEventIfNeeded(lastEventId?: number, promises?: Promise<Result>[]) {\n if (!this.webAttribution || !this.webAttribution.shouldTrackNewCampaign) {\n return false;\n }\n\n const campaignEvent = this.webAttribution.generateCampaignEvent(lastEventId);\n if (promises) {\n promises.push(this.track(campaignEvent).promise);\n } else {\n this.track(campaignEvent);\n }\n this.config.loggerProvider.log('Tracking attribution.');\n return true;\n }\n\n async process(event: Event) {\n const currentTime = Date.now();\n const isEventInNewSession = isNewSession(this.config.sessionTimeout, this.config.lastEventTime);\n const shouldSetSessionIdOnNewCampaign =\n this.webAttribution && this.webAttribution.shouldSetSessionIdOnNewCampaign();\n\n if (\n event.event_type !== DEFAULT_SESSION_START_EVENT &&\n event.event_type !== DEFAULT_SESSION_END_EVENT &&\n (!event.session_id || event.session_id === this.getSessionId())\n ) {\n if (isEventInNewSession || shouldSetSessionIdOnNewCampaign) {\n this.setSessionId(currentTime);\n if (shouldSetSessionIdOnNewCampaign) {\n this.config.loggerProvider.log('Created a new session for new campaign.');\n }\n } else if (!isEventInNewSession) {\n // Web attribution should be tracked during the middle of a session\n // if there has been a chance in the campaign information.\n this.trackCampaignEventIfNeeded();\n }\n }\n\n // Set user properties\n if (event.event_type === SpecialEventType.IDENTIFY && event.user_properties) {\n this.userProperties = this.getOperationAppliedUserProperties(event.user_properties);\n }\n\n return super.process(event);\n }\n\n private logBrowserOptions(browserConfig: BrowserOptions & { apiKey: string }) {\n try {\n const browserConfigCopy = {\n ...browserConfig,\n apiKey: browserConfig.apiKey.substring(0, 10) + '********',\n };\n this.config.loggerProvider.debug('Initialized Amplitude with BrowserConfig:', JSON.stringify(browserConfigCopy));\n } catch (e) {\n /* istanbul ignore next */\n this.config.loggerProvider.error('Error logging browser config', e);\n }\n }\n\n /**\n * @experimental\n * WARNING: This method is for internal testing only and is not part of the public API.\n * It may be changed or removed at any time without notice.\n *\n * Sets the diagnostics sample rate before amplitude.init()\n * @param sampleRate - The sample rate to set\n */\n _setDiagnosticsSampleRate(sampleRate: number): void {\n if (sampleRate > 1 || sampleRate < 0) {\n return;\n }\n // Set diagnostics sample rate before initializing the config\n if (!this.config) {\n this._diagnosticsSampleRate = sampleRate;\n return;\n }\n }\n}\n","import { debugWrapper, getClientLogConfig, getClientStates, BrowserClient } from '@amplitude/analytics-core';\nimport { AmplitudeBrowser } from './browser-client';\n\nexport const createInstance = (): BrowserClient => {\n const client = new AmplitudeBrowser();\n return {\n init: debugWrapper(\n client.init.bind(client),\n 'init',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n add: debugWrapper(\n client.add.bind(client),\n 'add',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.plugins']),\n ),\n remove: debugWrapper(\n client.remove.bind(client),\n 'remove',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.plugins']),\n ),\n track: debugWrapper(\n client.track.bind(client),\n 'track',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n logEvent: debugWrapper(\n client.logEvent.bind(client),\n 'logEvent',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n identify: debugWrapper(\n client.identify.bind(client),\n 'identify',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n groupIdentify: debugWrapper(\n client.groupIdentify.bind(client),\n 'groupIdentify',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n setGroup: debugWrapper(\n client.setGroup.bind(client),\n 'setGroup',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n revenue: debugWrapper(\n client.revenue.bind(client),\n 'revenue',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n flush: debugWrapper(\n client.flush.bind(client),\n 'flush',\n getClientLogConfig(client),\n getClientStates(client, ['config.apiKey', 'timeline.queue.length']),\n ),\n getUserId: debugWrapper(\n client.getUserId.bind(client),\n 'getUserId',\n getClientLogConfig(client),\n getClientStates(client, ['config', 'config.userId']),\n ),\n setUserId: debugWrapper(\n client.setUserId.bind(client),\n 'setUserId',\n getClientLogConfig(client),\n getClientStates(client, ['config', 'config.userId']),\n ),\n getDeviceId: debugWrapper(\n client.getDeviceId.bind(client),\n 'getDeviceId',\n getClientLogConfig(client),\n getClientStates(client, ['config', 'config.deviceId']),\n ),\n setDeviceId: debugWrapper(\n client.setDeviceId.bind(client),\n 'setDeviceId',\n getClientLogConfig(client),\n getClientStates(client, ['config', 'config.deviceId']),\n ),\n reset: debugWrapper(\n client.reset.bind(client),\n 'reset',\n getClientLogConfig(client),\n getClientStates(client, ['config', 'config.userId', 'config.deviceId']),\n ),\n getSessionId: debugWrapper(\n client.getSessionId.bind(client),\n 'getSessionId',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n setSessionId: debugWrapper(\n client.setSessionId.bind(client),\n 'setSessionId',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n extendSession: debugWrapper(\n client.extendSession.bind(client),\n 'extendSession',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n setOptOut: debugWrapper(\n client.setOptOut.bind(client),\n 'setOptOut',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n setTransport: debugWrapper(\n client.setTransport.bind(client),\n 'setTransport',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n getIdentity: debugWrapper(\n client.getIdentity.bind(client),\n 'getIdentity',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n getOptOut: debugWrapper(\n client.getOptOut.bind(client),\n 'getOptOut',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n _setDiagnosticsSampleRate: debugWrapper(\n client._setDiagnosticsSampleRate.bind(client),\n '_setDiagnosticsSampleRate',\n getClientLogConfig(client),\n getClientStates(client, ['config']),\n ),\n };\n};\n\nexport default createInstance();\n","/* eslint-disable @typescript-eslint/unbound-method */\nimport client from './browser-client-factory';\nexport { createInstance } from './browser-client-factory';\nexport const {\n add,\n extendSession,\n flush,\n getDeviceId,\n getIdentity,\n getOptOut,\n getSessionId,\n getUserId,\n groupIdentify,\n identify,\n init,\n logEvent,\n remove,\n reset,\n revenue,\n setDeviceId,\n setGroup,\n setOptOut,\n setSessionId,\n setTransport,\n setUserId,\n track,\n _setDiagnosticsSampleRate,\n} = client;\nexport { AmplitudeBrowser } from './browser-client';\nexport { runQueuedFunctions } from './utils/snippet-helper';\nexport { Revenue, Identify } from '@amplitude/analytics-core';\n\n// Export types to maintain backward compatibility with `analytics-types`.\n// In the next major version, only export customer-facing types to reduce the public API surface.\nexport * as Types from './types';\n","import { getGlobalScope, registerSdkLoaderMetadata } from '@amplitude/analytics-core';\nimport * as amplitude from './index';\nimport { createInstance } from './browser-client-factory';\nimport { runQueuedFunctions } from './utils/snippet-helper';\n\nregisterSdkLoaderMetadata({\n scriptUrl: resolveCurrentScriptUrl(),\n});\n\nfunction resolveCurrentScriptUrl(): string | undefined {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n const currentScript = document.currentScript as HTMLScriptElement | null;\n if (currentScript?.src) {\n return currentScript.src;\n }\n\n return undefined;\n}\n\n// https://developer.mozilla.org/en-US/docs/Glossary/IIFE\n(function () {\n const GlobalScope = getGlobalScope();\n\n if (!GlobalScope) {\n console.error('[Amplitude] Error: GlobalScope is not defined');\n return;\n }\n\n const createNamedInstance = (instanceName?: string) => {\n const instance = createInstance();\n const GlobalScope = getGlobalScope();\n if (GlobalScope && GlobalScope.amplitude && GlobalScope.amplitude._iq && instanceName) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n GlobalScope.amplitude._iq[instanceName] = instance;\n }\n return instance;\n };\n\n GlobalScope.amplitude = Object.assign(GlobalScope.amplitude || {}, amplitude, {\n createInstance: createNamedInstance,\n });\n\n if (GlobalScope.amplitude.invoked) {\n const queue = GlobalScope.amplitude._q;\n GlobalScope.amplitude._q = [];\n runQueuedFunctions(amplitude, queue);\n\n const instanceNames = Object.keys(GlobalScope.amplitude._iq) || [];\n for (let i = 0; i < instanceNames.length; i++) {\n const instanceName = instanceNames[i];\n const instance = Object.assign(GlobalScope.amplitude._iq[instanceName], createNamedInstance(instanceName));\n const queue = instance._q;\n instance._q = [];\n runQueuedFunctions(instance, queue);\n }\n }\n})();\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","IdentifyOperation","SpecialEventType","__assign","assign","t","s","i","n","arguments","length","apply","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","Iterator","verb","Symbol","iterator","v","op","pop","push","__values","o","m","__read","r","ar","error","__spreadArray","to","from","pack","l","slice","concat","SuppressedError","AMPLITUDE_PREFIX","STORAGE_PREFIX","DEFAULT_INSTANCE_NAME","AMPLITUDE_SERVER_URL","DCLID","FBCLID","GBRAID","GCLID","KO_CLICK_ID","LI_FAT_ID","MSCLKID","RDT_CID","TTCLID","TWCLID","WBRAID","BASE_CAMPAIGN","utm_campaign","undefined","utm_content","utm_id","utm_medium","utm_source","utm_term","referrer","referring_domain","dclid","gbraid","gclid","fbclid","ko_click_id","li_fat_id","msclkid","rdt_cid","ttclid","twclid","wbraid","SAFE_HEADERS","FORBIDDEN_HEADERS","isValidObject","properties","keys","key","isValidProperties","property","isArray","isValid","value_1","value_1_1","valueElement","includes","Identify","_propertySet","Set","_properties","getUserProperties","set","_safeSet","SET","setOnce","SET_ONCE","append","APPEND","prepend","PREPEND","postInsert","POSTINSERT","preInsert","PREINSERT","remove","REMOVE","add","ADD","unset","UNSET","clearAll","CLEAR_ALL","operation","_validate","userPropertyMap","has","Status","OrderedIdentifyOperations","RevenueProperty","buildResult","event","code","message","Unknown","getGlobalScope","ampIntegrationContextName","globalThis","window","self","global","hex","map","index","toString","padStart","UUID","a","globalScope","_a","crypto","getRandomValues","Math","random","replace","legacyUUID","Uint8Array","entries","_b","int","join","Timeline","client","queue","applying","plugins","register","plugin","config","some","existingPlugin","name","loggerProvider","warn","type","setup","_c","deregister","pluginName","findIndex","splice","teardown","reset","_this","scheduleApply","timeout","setTimeout","shift","item","log","before","filter","before_1","before_1_1","execute","_e","JSON","stringify","enrichment","enrichment_1","enrichment_1_1","destination","executeDestinations","eventClone","catch","all","resolveResult","flush","onIdentityChanged","identity","forEach","onSessionIdChanged","sessionId","onOptOutChanged","optOut","onReset","createIdentifyEvent","identify","eventOptions","event_type","IDENTIFY","user_properties","returnWrapper","awaitable","promise","AmplitudeCore","initializing","isReady","q","dispatchQ","logEvent","track","bind","timeline","_init","runQueuedFunctions","queueName","queuedFunctions","queuedFunctions_1","queuedFunctions_1_1","queuedFunction","val","eventInput","eventProperties","event_properties","createTrackEvent","dispatch","groupIdentify","groupType","groupName","GROUP_IDENTIFY","group_properties","groups","createGroupIdentifyEvent","setGroup","createGroupEvent","revenue","REVENUE","getEventProperties","createRevenueEvent","_addPlugin","_removePlugin","dispatchWithCallback","callback","process","getOperationAppliedUserProperties","userProperties","updatedProperties","nonOpProperties","values","opProperties","prop","e_2","setOptOut","_setOptOut","Boolean","find","debug","pluginClass","Revenue","productId","quantity","price","setProductId","setQuantity","setPrice","setRevenueType","revenueType","setCurrency","currency","setRevenue","setReceipt","receipt","setReceiptSig","receiptSig","setEventProperties","REVENUE_PRODUCT_ID","REVENUE_QUANTITY","REVENUE_PRICE","REVENUE_TYPE","REVENUE_CURRENCY","RECEIPT","RECEIPT_SIG","LogLevel","PREFIX","Logger","logLevel","None","disable","enable","Warn","args","_i","Verbose","console","Error","Debug","getDefaultConfig","flushMaxRetries","flushQueueSize","flushIntervalMillis","instanceName","offline","serverUrl","serverZone","useBatch","Config","options","_optOut","defaultConfig","apiKey","minIdLength","plan","ingestionMetadata","storageProvider","transportProvider","_d","serverConfig","createServerConfig","defineProperty","get","getServerUrl","_serverZone","RequestMetadata","sdk","metrics","histogram","recordHistogram","isSuccessStatusCode","getStacktrace","ignoreDepth","stack","split","text","trim","getClientLogConfig","logger","getValueByStringPath","obj","path","attr","getClientStates","paths","res","paths_1","paths_1_1","debugWrapper","fn","fnName","getLogConfig","getStates","fnContext","debugContext","stacktrace","time","start","Date","toISOString","states","after","end","getResponseBodyString","responseBodyString","Destination","context","retryTimeout","throttleTimeout","storageKey","scheduleId","scheduledTimeout","flushId","diagnosticsClient","substring","unsent","insert_id","attempts","schedule","saveEvents","removeEventsExceedFlushMaxRetries","list","fulfillRequest","scheduleEvents","clearTimeout","resetSchedule","useRetry","later","arr","size","chunkSize","max","reduce","chunks","element","chunkIndex","floor","batch","send","payload","api_key","events","extra","min_id_length","client_upload_time","request_metadata","requestMetadata","handleResponse","statusCode","status","errorMessage","e_1","recordEvent","stack_trace","Failed","Success","handleSuccessResponse","Invalid","handleInvalidResponse","PayloadTooLarge","handlePayloadTooLargeResponse","RateLimit","handleRateLimitResponse","handleOtherResponse","missingField","startsWith","dropIndex","eventsWithInvalidFields","eventsWithMissingFields","eventsWithInvalidIdLengths","silencedEvents","flat","dropIndexSet","retry","tryable","dropUserIds","exceededDailyQuotaUsers","dropDeviceIds","exceededDailyQuotaDevices","throttledIndex","throttledEvents","dropUserIdsSet","dropDeviceIdsSet","throttledIndexSet","user_id","device_id","increment","removeEvents","updatedEvents","eventsToRemove","queuedContext","ApplicationContextProviderImpl","getApplicationContext","versionName","language","getLanguage","platform","os","deviceModel","navigator","languages","EventBridgeImpl","receiver","setEventReceiver","isEqual","obj1","obj2","typeA","primitive_1","primitive_1_1","e_1_1","return","isArrayA","isArrayB","sorted1","sort","sorted2","result_1","ownProps","resArray","IdentityStoreImpl","listeners","editIdentity","actingUserProperties","actingIdentity","setUserId","userId","setDeviceId","deviceId","setUserProperties","updateUserProperties","actions","e_3","actingProperties","_f","action","_g","_h","_j","e_2_1","_k","_l","e_3_1","commit","setIdentity","getIdentity","originalIdentity","listener","addIdentityListener","removeIdentityListener","delete","safeGlobal","AnalyticsConnector","identityStore","eventBridge","applicationContextProvider","getInstance","getAnalyticsConnector","IdentityEventSender","isNewSession","sessionTimeout","lastEventTime","now","getCookieName","postKey","limit","userLanguage","getQueryParams","location","search","acc","curr","query","tryDecodeURIComponent","decodeURIComponent","isUrlMatchAllowlist","url","allowlist","allowedUrl","match","getDecodeURI","locationStr","decodedLocationStr","decodeURI","isTimestampInSampleTemp","timestamp","sampleRate","hashNumber","str","hash","charCodeAt","generateHashCode","abs","MemoryStorage","memoryStorage","Map","isEnabled","getRaw","clear","CookieStorage","testValue","testCookieOptions","expirationDays","testStorage","testKey","decodedValue","decodeCookieValue","parse","globalScopeWithCookiesStore","cookieStore","getAll","cookies_2","cookies","cookie","domain","cookies_1","cookies_1_1","isDomainEqual","document","c","duplicateResolverFn","ignoreError","expireDate","expires","date","setTime","getTime","btoa","encodeURIComponent","toUTCString","secure","sameSite","atob","decodeCookiesAsDefault","decodeCookiesWithDoubleUrlEncoding","domain1","domain2","normalized1","normalized2","toLowerCase","getStorageKey","BrowserStorage","storage","getItem","setItem","removeItem","TABLE_NAMES","INTERNAL_KEYS","DiagnosticsStorage","dbPromise","dbName","isSupported","indexedDB","getDB","openDB","request","open","onerror","onsuccess","db","onclose","close","onupgradeneeded","target","createTables","objectStoreNames","contains","createObjectStore","keyPath","autoIncrement","createIndex","unique","setTags","tags","transaction_1","transaction","store_1","objectStore","oncomplete","onabort","put","error_1","incrementCounters","counters","transaction_2","store_2","incrementValue","getRequest","existingRecord","existingValue","error_2","setHistogramStats","histogramStats","transaction_3","store_3","newStats","updatedStats","count","min","sum","error_3","addEventRecords","transaction_4","store_4","countRequest","currentCount","availableSlots","error_4","setInternal","transaction_5","store_5","error_5","getInternal","transaction_6","store_6","error_6","getLastFlushTimestamp","record","parseInt","error_7","setLastFlushTimestamp","error_8","clearTable","tableName","getAllAndClear","getAllFromStore","error_9","GLOBAL_KEY","detectSdkOrigin","scope","normalizedScriptUrl","filename","normalizeUrl","URL","origin","pathname","extractFilenameFromStack","stringifyReason","reason","FLUSH_INTERVAL_MS","MAX_MEMORY_STORAGE_COUNT","DiagnosticsClient","inMemoryTags","inMemoryCounters","inMemoryHistograms","inMemoryEvents","saveTimer","flushTimer","enabled","startTimestamp","shouldTrack","initializeFlushInterval","addEventListener","capture","error_name","errorName","metadata","colno","lineno","isTrusted","matchReason","enableSdkErrorListeners","isStorageAndTrackEnabled","setTag","startTimersIfNeeded","existing","event_name","saveAllDataToStorage","finally","_flush","tagsToSave","countersToSave","histogramsToSave","eventsToSave","tagRecords","counterRecords","histogramStatsRecords","eventRecords","stats","avg","round","fetch","method","headers","ok","lastFlushTimestamp","_setFlushTimer","timeSinceLastFlush","delay","_setSampleRate","BaseTransport","_serverUrl","_payload","buildResponse","responseJSON","buildStatus","eventsIngested","events_ingested","payloadSizeBytes","payload_size_bytes","serverUploadTime","server_upload_time","missing_field","events_with_invalid_fields","events_with_missing_fields","events_with_invalid_id_lengths","epsThreshold","eps_threshold","exceeded_daily_quota_devices","silencedDevices","silenced_devices","_m","silenced_events","throttledDevices","_o","throttled_devices","_p","throttled_events","_q","_r","_s","_t","throttledUsers","_u","throttled_users","_v","_w","exceeded_daily_quota_users","_x","Timeout","FetchTransport","_super","customHeaders","Accept","response","responseText","RemoteConfigLocalStorage","fetchConfig","failedRemoteConfigInfo","remoteConfig","lastFetch","localStorage","remoteConfigInfo","setConfig","RemoteConfigClient","callbackInfos","lastSuccessfulFetch","fetchPromise","subscribe","deliveryMode","id","callbackInfo","subscribeAll","subscribeWaitForRemote","unsubscribe","updateConfigs","getOrCreateFetchPromise","sendCallback","remotePromise","cachePromise","race","timeoutPromise","source","filteredConfig","lastCallback","retries","interval","attempt","abortController","AbortController","timeoutId","abort","this_1","getUrlParams","signal","json","getJitterDelay","baseDelay","encodedApiKey","urlParams","URLSearchParams","CONFIG_GROUP","originalConsole","handlers","originalFn","inConsoleOverride","ServerZone","consoleObserver","addListener","level","callbacks","removeListener","_restoreConsole","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","isJsonPrimitive","pruneJson","excludelist","_pruneJson","tokenizeJsonPath","ancestors","targetObject","parentObject","targetKey","keys_1","keys_1_1","hasPathMatchInList","token","isPathMatch","pathMatcher","j","currentMatcher","k","allowOrExcludeList","RequestWrapperFetch","allow","headersUnsafe","headersSafeCopy","headerName","headerValue","Headers","pruneHeaders","_bodySize","TextEncoder","getBodySize","exclude","safeParseAndPruneBody","RequestWrapperXhr","bodyRaw","requestHeaders","bodyUnsafe","maxEntries","bodySize","bodySafe","encode","Blob","ArrayBuffer","isView","byteLength","FormData","formData","total","ReadableStream","PRUNE_STRATEGY","ResponseWrapperFetch","headersSafe","headersOut_1","contentLength","clonedResponse","clone","textPromise","timer","ResponseWrapperXhr","headersString","getJson","headerLines","headerLines_1","headerLines_1_1","jsonBody","REDACTED_VALUE","strategy","headersPruned","lowerKey","REDACT","NetworkRequestEvent","startTime","requestWrapper","duration","responseWrapper","endTime","toSerializable","serialized","requestBodySize","responseHeaders","responseBodySize","fromEntries","NetworkEventCallback","NetworkObserver","eventCallbacks","isObserving","eventCallback","originalXhrOpen","XMLHttpRequest","originalXhrSend","originalXhrSetRequestHeader","setRequestHeader","observeXhr","originalFetch","observeFetch","triggerEventCallbacks","err","handleNetworkRequestEvent","requestType","requestInfo","typedError","durationStart","isRequest","parsedUrl","protocol","host","performance","requestEvent","getTimestamps","requestInit","timestamps","originalResponse","originalError","err_1","createXhrJsonParser","xhrUnsafe","responseType","structuredClone","xhrProto","networkObserverContext","$$AmplitudeAnalyticsEvent","xhrSafe","getAllResponseHeaders","getResponseHeader","networkObserver","CampaignParser","getUtmParam","getReferrer","getClickIds","params","data","TEXT_MASK_ATTRIBUTE","MASKED_TEXT_VALUE","CC_REGEX","SSN_REGEX","EMAIL_REGEX","replaceSensitiveString","additionalMaskTextPatterns","additionalMaskTextPatterns_1","additionalMaskTextPatterns_1_1","pattern","getPageTitle","parseTitleFunction","title","titleElement","querySelector","hasAttribute","_createForOfIteratorHelperLoose","allowArrayLike","it","minLen","_arrayLikeToArray","test","_unsupportedIterableToArray","len","arr2","_defineProperties","props","descriptor","enumerable","configurable","writable","_createClass","Constructor","protoProps","staticProps","hasSymbols","hasSymbol","getSymbol","observable","SymbolIterator","SymbolObservable","SymbolSpecies","getMethod","getSpecies","ctor","Observable","isObservable","x","hostReportError","enqueue","cleanupSubscription","subscription","cleanup","_cleanup","closeSubscription","_observer","_queue","_state","notifySubscription","observer","onNotify","flushSubscription","Subscription","subscriber","subscriptionObserver","SubscriptionObserver","_subscription","_proto2","complete","_subscriber","_proto3","_this2","_this3","_this4","C","hasSeed","hasValue","first","_this5","_len","sources","_key","startNext","flatMap","_this6","subscriptions","outer","inner","completeIfDone","closed","_step","_iterator","of","_len2","items","_key2","asyncMap","ZenObservable","merge","sourceA","sourceB","subscriptions_1","subscriptions_1_1","sub","subscribeTo","multicast","observers","observers_1","observers_1_1","obs","observers_2","observers_2_1","observers_3","observers_3_1","symbol","isTrackingEnabled","autocapture","isAttributionTrackingEnabled","isFormInteractionTrackingEnabled","isPageViewTrackingEnabled","isSessionTrackingEnabled","isNetworkTrackingEnabled","networkTracking","isElementInteractionsEnabled","elementInteractions","isFrustrationInteractionsEnabled","frustrationInteractions","getElementInteractionsConfig","getFrustrationInteractionsConfig","getNetworkTrackingConfig","networkTrackingConfig","networkTrackingOptions","captureRules","rule","urls","hosts","hostsString","urlsString","getPageViewTrackingConfig","eventType","trackOn","trackHistoryChanges","pageCounter","defaultTracking","pageViews","instance","convertProxyObjectToRealObject","name_1","isInstanceProxy","VERSION","LIBPREFIX","Context","library","userAgent","lastEventId","nextEventId","event_id","session_id","appVersion","app_version","trackingOptions","ipAddress","ip","partner_id","partnerId","ingestion_metadata","source_name","sourceName","source_version","sourceVersion","user_agent","MAX_ARRAY_LENGTH","LocalStorage","droppedEventsCount","SessionStorage","sessionStorage","XHRTransport","state","xhr","onreadystatechange","readyState","SendBeaconTransport","sendBeacon","parseLegacyCookies","apiKey_1","cookieStorage_1","cookieStorage","deleteLegacyCookies","cookieName","getOldCookieName","decode","parseTime","num","integer","isNaN","escape","DEFAULT_EVENT_PREFIX","DEFAULT_FORM_START_EVENT","DEFAULT_FORM_SUBMIT_EVENT","DEFAULT_FILE_DOWNLOAD_EVENT","DEFAULT_SESSION_START_EVENT","DEFAULT_SESSION_END_EVENT","FILE_EXTENSION","FILE_NAME","LINK_ID","LINK_TEXT","LINK_URL","FORM_ID","FORM_NAME","FORM_DESTINATION","DEFAULT_IDENTITY_STORAGE","BrowserConfig","cookieOptions","identityStorage","transport","fetchRemoteConfig","debugLogsEnabled","enableDiagnostics","diagnosticsSampleRate","expiration","upgrade","createTransport","version","_cookieStorage","_fetchRemoteConfig","updateStorage","_deviceId","_userId","_sessionId","_lastEventTime","_lastEventId","_pageCounter","_debugLogsEnabled","cache","cookieDomain","useBrowserConfig","args_1","amplitudeInstance","earlyConfig","getTopLevelDomain","_7","cookieConfig","parsed","createCookieStorage","legacyCookies","previousCookies","queryParams","ampTimestamp","Number","isWithinTimeLimit","ampDeviceId","previousSessionDeviceId","previousSessionUserId","_y","_z","_0","_1","_2","browserConfig","_3","_4","_5","_6","_diagnosticsSampleRate","hostname","parts","levels","cookieKeyUniqueId","omitUndefined","input","PAGE_VIEW_SESSION_STORAGE_KEY","pageViewTrackingPlugin","amplitude","localConfig","isTracking","createPageViewEvent","pageViewId","locationHREF","href","getCampaignParams","shouldTrackOnPageLoad","previousURL","handlePageChange","newURL","shouldTrackPageView","shouldTrackHistoryPageView","history","pushState","Proxy","unused","isCampaignEvent","pageViewSession","pageViewEvent","removeEventListener","$set","$unset","userProperties_1","every","trackingOption","newURLStr","oldURLStr","oldURL","formInteractionTracking","formInteractionsConfig","eventListeners","handler","formInteractions","getFormInteractionsConfig","initializeFormTracking","addFormInteractionListener","form","hasFormChanged","formDestination","extractFormAction","stringOrUndefined","shouldTrackSubmit","SubmitEvent","getElementsByTagName","MutationObserver","mutations","mutation","addedNodes","node","nodeName","querySelectorAll","observe","subtree","childList","window_1","disconnect","getAttribute","encodeURI","fileDownloadTracking","initializeFileDownloadTracking","addFileDownloadListener","ext","exec","fileExtension","notified","networkConnectivityCheckerPlugin","addNetworkListener","onLine","translateRemoteConfigToLocal","propertyNames","propertyNames_1","propertyNames_1_1","propertyName","header","captureSafeHeaders","rageClick","rageClicks","deadClick","deadClicks","mergeUrls","urlsExact","urlsRegex","regexList","RegExp","regexError","updateBrowserConfigWithRemoteConfig","typedRemoteConfig","transformedAutocaptureRemoteConfig","pageUrlAllowlistRegex","transformedRcElementInteractions","exactAllowList","pageUrlAllowlist","captureRules_1","captureRules_1_1","attribution","fileDownloads","sessions","webVitals","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","AMPLITUDE_ORIGIN","AMPLITUDE_ORIGINS_MAP","US","EU","STAGING","DATA_AMP_MASK_ATTRIBUTES","SENSITIVE_TAGS","isElementPointerCursor","actionType","computedStyle","getComputedStyle","getPropertyValue","createShouldTrackEvent","autocaptureOptions","isAlwaysCaptureCursorPointer","pageUrlExcludelist","shouldTrackEventResolver","tag","tagName","elementType","isCursorPointer","hasMatchAnyAllowedSelector","selector","matches","parseAttributesToMask","attributeString","removeEmptyProperties","filteredProperties","isEmpty","getCurrentPageViewId","raw","getClosestElement","selectors","parentElement","asyncLoadScript","scriptElement","createElement","async","src","once","head","appendChild","MouseButton","filterOutNonTrackableEvents","closestTrackedAncestor","BLOCKED_ATTRIBUTES","SENSITIVE_ELEMENT_ATTRIBUTE_ALLOWLIST","SVG_TAGS","HIGHLY_SENSITIVE_INPUT_TYPES","getElementProperties","userMaskedAttributeNames","siblings","children","indexOfType","el","prevSiblingTag","previousElementSibling","prevSib","classes","classList","attributes","filteredAttributes","isSensitiveElement","isContentEditable","HTMLElement","isNonSensitiveElement","filteredAttributes_1","filteredAttributes_1_1","attrs","executeActions","ev","dataExtractor","extractDataFromDataSource","dataSource","targetElementProperties","destinationKey","Step","optimized","cssPathStep","isTargetNode","nodeType","Node","ELEMENT_NODE","idSelector","nodeNameLower","parent","parentNode","DOCUMENT_NODE","prefixedElementClassNames","classAttribute","CSS","prefixedOwnClassNamesArray","needsClassNames","needsNthChild","ownIndex","elementIndex","sibling","ownClassNames","siblingClassNamesArray","siblingClass","prefixedOwnClassNamesArray_1","prefixedOwnClassNamesArray_1_1","prefixedName","DataExtractor","getHierarchy","hierarchy","targetEl","current","getAncestors","elementToAttributesToMaskMap","attributesToMask","constants.DATA_AMP_MASK_ATTRIBUTES","ancestorAttributesToMask","combinedAttributesToMask","hierarchyNode","hierarchy_1","hierarchy_1_1","getNearestLabel","labelElement","getText","getElementPath","elementPath","steps","contextNode","reverse","cssPath","dataAttributePrefix","prefix","rect","getBoundingClientRect","left","top","currentElementAttributes","nearestLabel","attributeName","attributeValue","attributeKey","constants.AMPLITUDE_EVENT_PROP_ELEMENT_TAG","constants.AMPLITUDE_EVENT_PROP_ELEMENT_TEXT","constants.AMPLITUDE_EVENT_PROP_PAGE_URL","constants.AMPLITUDE_EVENT_PROP_VIEWPORT_HEIGHT","innerHeight","constants.AMPLITUDE_EVENT_PROP_VIEWPORT_WIDTH","innerWidth","constants.AMPLITUDE_EVENT_PROP_PAGE_VIEW_ID","HTMLAnchorElement","addTypeAndTimestamp","addAdditionalEventProperties","selectorAllowlist","isCapturingCursorPointer","baseEvent","isElementBasedEvent","contextElement","sourceType","sourceElement","scopingElement","documentElement","closest","getDataSource","elementExtractType","attribute","output","clonedTree","cloneNode","innerText","getEventTagProps","rawPatterns","maskTextRegex","compiled","rawPatterns_1","rawPatterns_1_1","entry","WindowMessenger","endpoint","requestCallbacks","onSelect","notify","onTrack","onBackgroundCapture","backgroundCaptureData","opener","postMessage","sendRequest","substr","responseData","isElementSelectable","cssSelectorAllowlist","actionClickAllowlist","amplitudeVisualTaggingSelectorInstance","amplitudeBackgroundCaptureInstance","eventData","actionData_1","amplitudeVisualTaggingSelector","visualHighlightClass","messenger","diagnostics","amplitudeBackgroundCapture","ObservablesEnum","createMutationObservable","mutationObserver","characterData","createClickObservable","clickType","createErrorObservable","unhandledErrorObservable","kind","lineNumber","columnNumber","eventTypeToBrowserEventMap","groupLabeledEventIdsByEventType","labeledEvents","groupedLabeledEvents","browserEvent","labeledEvents_1","labeledEvents_1_1","le","definition","def","createLabeledEventToTriggerMap","triggers","labeledEventToTriggerMap","triggers_1","triggers_1_1","trigger","conditions","condition","eventId","existingTriggers","matchEventToLabeledEvents","filters","subprop_key","subprop_op","subprop_value","matchEventToFilter","TriggerEvaluator","evaluate","pageActions","matchingTriggers","leToTriggerMap","labeledEvents_2","labeledEvents_2_1","triggers_2","e_6","triggers_2_1","matchLabeledEventsToTriggers","matchingTriggers_1","matchingTriggers_1_1","update","autocapturePlugin","visualTaggingOptions","backgroundCaptureOptions","debounceTime","exposureDuration","excludePattern","beforeUnloadCleanup","elementExposedForPage","currentElementExposed","createObservables","navigateObservable","clickObservable","click","changeObservable","changeEvent","enrichedChangeEvent","navigation","navigateEvent","enrichedNavigateEvent","mutationObservable","scrollObservable","exposureObservable","IntersectionObserver","intersectionObserver","root","rootMargin","threshold","selectorString","Element","createExposureObservable","ChangeObservable","ClickObservable","MutationObservable","NavigateObservable","ScrollObservable","ExposureObservable","evaluateTriggers","createTriggerEvaluator","pageViewEndFired","lastScroll","maxX","maxY","remoteConfigClient","remotePageActions","recomputePageActionsData","shouldTrackEvent","shouldTrackActionClick","allObservables","clickTrackingSubscription","trackClicks","changeSubscription","trackChange","actionClickSubscription","filteredClickObservable","closestActionClickEl","clickEvent","mutationOrNavigate","clickMutationNavigateObservable","actionClickTimer","lastClickEvent","event_1","actionClick","trackActionClick","scrollTracker","scrollSubscription","currentX","scrollX","pageXOffset","currentY","scrollY","pageYOffset","getState","trackScroll","trackers","handleViewportContentUpdated","isPageEnd","exposureTracker","pageScrollMaxState","viewportWidth","viewportHeight","fireViewportContentUpdated","exposure","handleExposure","fireViewportContentUpdatedCallback","exposedArray","onExposure","exposureMap","exposureTimerMap","exposureSubscription","isIntersecting","intersectionRatio","trackExposure","beforeUnloadHandler","popstateHandler_1","originalPushState_1","constants.AMPLITUDE_ORIGINS_MAP","CHANGE_EVENTS","addCoordinates","regionBox","pageX","pageY","yMin","yMax","xMin","xMax","isOutOfBounds","getRageClickAnalyticsEvent","clickWindow","firstClick","lastClick","rageClickEvent","X","Y","Time","trackRageClicks","shouldTrackRageClick","selectionObservable","clickBoundingBox","pendingRageClick","resetClickWindow","rageClickObservable","resolutionValue","isNewElement","isClickOutsideRageClickWindow","timerId","selectionSubscription","rageClickSubscription","getCssSelectorAllowlist","defaultAllowlist","frustrationPlugin","isErrorClicksEnabled","errorClicks","deadClicksEnabled","rageClicksEnabled","rageCssSelectors","deadCssSelectors","errorCssSelectors","combinedCssSelectors","enrichedNavigateObservable","browserErrorObservables","enrichedMutationObservable","navigate","activeElement","selectionStart","selectionEnd","selection","getSelection","isCollapsed","BrowserErrorObservable","SelectionObservable","shouldTrackDeadClick","deadClickSubscription","button","LEFT_OR_TOUCH_CONTACT","changeObservables","clicksAndChangeObservable","deadClickTimer","deadClickEvent","clientX","clientY","trackDeadClick","shouldTrackErrorClick","errorClickSubscription","browserErrorObservable","errorClickTimer","latestClickEvent","clearClickTimer","trackErrorClicks","AMPLITUDE_NETWORK_REQUEST_EVENT","DEFAULT_STATUS_CODE_RANGE","wildcardMatch","regexPattern","isStatusCodeInRange","range","ranges","ranges_1","ranges_1_1","parseUrl","currentHref","urlObj","searchParams","fragment","hrefWithoutQueryOrHash","parseHeaderCaptureRule","isBodyCaptureRuleEmpty","blocklist","shouldTrackNetworkEvent","networkEvent","isMatch_1","ignoreAmplitudeRequests","ignoreHosts","ignoreHost","methods","allowedMethod","statusCodeRange","isCaptureRuleMatch","responseHeadersRule","requestHeadersRule","responseBody","responseBodyJson","requestBody","requestBodyJson","isAmplitudeNetworkRequestEvent","trackNetworkEvents","networkObservable","networkAnalyticsEvent","logNetworkAnalyticsEvent","networkCapturePlugin","eventWithProperties","NetworkObservable","persisted","timeStamp","delta","rating","requestAnimationFrame","getEntriesByType","responseStart","activationStart","prerendering","wasDiscarded","navigationType","WeakMap","h","hadRecentInput","at","PerformanceObserver","supportedEntryTypes","getEntries","buffered","u","visibilityState","isFinite","firstHiddenTime","onHidden","E","reportAllChanges","T","M","interactionId","w","interactionCount","F","L","entryType","A","requestIdleCallback","B","S","PerformanceEventTiming","durationThreshold","takeRecords","N","H","O","getMetricStartTime","metric","timeOrigin","processMetric","navigationStart","PreviousPageType","webVitalsPlugin","visibilityListener","doc","locationHref","webVitalsPayload","onLCP","onFCP","onINP","onCLS","onTTFB","domainWithoutSubdomain","isNewCampaign","previous","currentCampaign","prevReferringDomain","previousCampaign","isExcludedReferrer","excludeReferrers","isDirectTraffic","hasNewCampaign","hasNewDomain","referringDomain","WebAttribution","shouldTrackNewCampaign","initialEmptyValue","resetSessionOnNewCampaign","webExpStorageKey","init","fetchCampaign","isEventInNewSession","originalCampaign","generateCampaignEvent","campaign","campaignParameters","identifyEvent","campaignEvent","shouldSetSessionIdOnNewCampaign","CURRENT_PAGE_STORAGE_KEY","PREVIOUS_PAGE_STORAGE_KEY","URL_INFO_STORAGE_KEY","EXCLUDED_DEFAULT_EVENT_TYPES","pageUrlEnrichmentPlugin","internalDomains","isStorageEnabled","isProxied","getPrevPageType","previousPage","currentDomain","previousPageDomain","decodedUrl","getHostname","Direct","isCurrentInternal","isPrevInternal","Internal","External","saveUrlInfoWrapper","URLInfo","currentURL","storedCurrentURL","replaceState","updatedURLInfo","addIfNotExist","AmplitudeBrowser","userIdOrOptions","maybeOptions","shouldFetchRemoteConfig","browserOptions","logBrowserOptions","attributionTrackingOptions","webAttribution","querySessionId","ampSessionId","setSessionId","connector","detNotify","isWebVitalsEnabled","isPageUrlEnrichmentEnabled","cleanEventProperties","getUserId","setConnectorUserId","getDeviceId","setConnectorDeviceId","getOptOut","getSessionId","promises","previousSessionId","isCampaignEventTracked","trackCampaignEventIfNeeded","extendSession","setTransport","currentTime","browserConfigCopy","_setDiagnosticsSampleRate","createInstance","scriptUrl","normalized","registerSdkLoaderMetadata","currentScript","resolveCurrentScriptUrl","GlobalScope","createNamedInstance","_iq","invoked","instanceNames","queue_1"],"mappings":"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"}